Les
entrées/sorties
Durée : 1h30
Objectifs :
- Lire le manuel C proposé dans le terminal
- Comprendre le formatage des E/S
- Lever une erreur sur une entrée clavier
- Connaître les opérateurs algébriques et booléens en C
Attention :
À chaque étape de programmation, vous devez vérifier si le programme
:
- Compile sans warning
- Obtient les résultats attendus
- Avant de coder, il faut écrire un algo avec un papier et un stylo !

Rappels
Pour compiler un programme, on utilise l’instruction suivante :
gcc -Wall exo.c -o nomExecutable
Pour executer un programme, on utilise l’instruction suivante :
./nomExecutable
Exercice 1 : La division
Nous considérons l’algorithme suivant :
PROGRAMME Division
VARIABLES :
n,d: entier
res: reel
DEBUT
ECRIRE ("Veuillez saisir le numérateur et le dénominateur : ")
LIRE(n)
LIRE(d)
res ← n/d
ECRIRE ("La division est : " +res)
FIN
- Traduisez cet algorithme en C
- À votre avis, cet algorithme est-il correcte ?
- Corrigez votre programme C, pour obtenir le comportement suivant
:
Exercice 2 : Les affichages
- Écrire un programme qui demande à l’utilisateur :
- le modèle de la voiture (%s),
- l’année de fabrication (%d),
- la consommation moyenne en litres / 100 km (%f),
- la catégorie de la voiture sous forme de caractère (%c) :
- E pour électrique
- D pour diesel
- S pour essence
- H pour hybride Le programme doit ensuite afficher un résumé formaté
des informations saisies.
- Vérifier les entrées des différents scanf (et verifier si le buffer
est bien vidé !)
Exercice 3 : Les commandes
unix
Écrire un programme qui permet d’afficher de :
- demander à l’utilisateur un nom de répertoire
- créer le répertoire à l’endroit où a été exécuté le programme
- afficher les droits du dossier
- créer un fichier appelé “bonjour” dans ce répertoire contenant la
chaîne de caractères donnée par l’utilisateur du programme. La chaine de
caractères saisie par l’utilisateur ne contiendra pas d’espace !
TIPS
Concaténer l’entrée de l’utilisateur avec la commande afin de
l’utiliser directement dans le programme
char nomDuFichier[100];
char laCommande[120]="touch ";
printf("Entrez un nom de fichier \n");
scanf("%s",nomDuFichier");
strcat(commande,nomDuFichier);
system(commande);
Attention Il ne faut pas oublier d’inclure la
bibliotheque “<string.h>”
Exercice 4 : L’horloge
Créer un programme qui affiche l’heure dans le terminal.
TIPS
- Utiliser la commande DATE de UNIX (voir les options pour afficher
l’heure)
- Attendre une seconde et effacer le terminal avant de ré-afficher
l’heure
- Faire une boucle infinie
Exercice 5 : Dans le cercle
On veut déterminer si un point d’un plan est situé dans un cercle. On
considère un cercle donc les coordonnées du centre sont (0,0) et son
rayon r.
- Écrire un algorithme qui :
- Demande à l’utilisateur de choisir un réel r.
- Demande à l’utilisateur de rentrer les coordonnés d’un point x et
y.
- Affiche si ce point appartient au cercle, et en dehors du cercle ou
est sur le cercle.
- Modifier l’algorithme précédent pour que l’utilisateur puisse
également choisir les coordonnées du centre du cercle
TIPS
Calculer la distance entre le centre du cercle et un point dont les
coordonnées sont (x,y) \[ \sqrt{(x^2+y^2)}
\]
Exercice 6 : Approximation de
Pi
- Créer un répertoire exo6 dans lequel on ajoutera le fichier
exo6.c contenant le code suivant :
#include <stdio.h>
#include <stdlib.h>
/* exo 6 : Approximation de PI */
int main(){
return 0;
}
- Écrire une fonction permettant de calculer l’aproximation de \(\pi\) selon la méthode de Leibniz en
utilisant le critére d’arrêt par nombre d’étapes.
/* Auteur : ... */
/* Date : ... */
/* Résumé : fonction permettant de calculer l'aproximation de pi selon la méthode de Leibniz en utilisant le critére d'arrêt par nombre d'étape */
/* Entrée(s) : Le nombre d'étape que l'on souhaite réaliser */
/* Sortie(s) : Le réel de l'approximation de pi */
double approximationPiNbEtape(int nbEtape);
Leibniz
\(\pi\) = 4 \(\times\) (\(\frac{1}{1}\) - \(\frac{1}{3}\) + \(\frac{1}{5}\) - \(\frac{1}{7}\) + …)
Astuce pour
alterner entre positif et négatif
On peut utiliser la puissance de (-1) sur l’itérateur i.
- pour les valeurs de i paire la puissance \(-1^i\) donnera un 1
- pour les valeurs de i impaire la puissance \(-1^i\) donnera un -1
On pourra donc alterner et respecter la formule d’approximation.
Attention
- Il faut importer la bibliothèque math.h
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* exo 6 : Approximation de PI */
int main(){
return 0;
}
- À la compilation, il faut rajouter l’extension lm
gcc -Wall exo6.c -o exo6 -lm
- Dans le code, il faut utiliser l’instruction
pow(leNombre,àLaPuissance)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* exo 6 : Approximation de PI */
int main(){
int nb;
nb= pow(4,2); /* 4 à la puissance 2 */
return 0;
}
- Écrire une fonction permettant de calculer l’aproximation de \(\pi\) selon la méthode de statistique.
/* Auteur : ... */
/* Date : ... */
/* Résumé : fonction permettant de calculer l'aproximation de pi selon la méthode de statistique en utilisant */
/* Entrée(s) : Le nombre de points que l'on souhaite utiliser */
/* Sortie(s) : Le réel de l'approximation de pi */
double approximationPiMethodeStat(int nbPoints);
Explication de la méthode
statistique
Traçons un carré dont le demi-côté mesure une unité et inscrivons y
un cercle de rayon unitaire. La surface du carré est de 4 et celle du
cercle est de π. Si on choisi au hasard un point dans le carré, la
probabilité qu’il se trouve dans le cercle est de \(\frac{\pi}{4}\) . Et par conséquent, en
recommençant de plus en plus souvent le choix aléatoire d’un point du
carré, le rapport entre le nombre de points se trouvant dans le cercle
(dont la distance à l’origine est inférieure à 1) et le nombre de points
choisis doit s’approcher de π.
- Il faut importer la bibliothèque time.h
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
- Il faut initialiser la “GRAINE” et le faire UNE SEULE ET UNIQUE FOIS
dans le programme principal. L’instruction est la suivante :
srand(time(NULL));. Si on ne met pas cette instruction, une
fois, alors le nombre aléatoire généré sera toujours le même.
/* exo 6 : Approximation de PI */
int main(){
srand(time(NULL));
return 0;
}
- Pour générer un nombre aléatoire, l’instruction est la suivante
:
int a = rand() % 5; /* génération d'un entier aléatoire entre 0 et 5 */
double x = (rand()/(double) RAND_MAX * 2.0 - 1.0); /* génération d'un réél aléatoire entre -1 et 1.*/