TD2 - Les entrées/sorties

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
  1. Traduisez cet algorithme en C
  2. À votre avis, cet algorithme est-il correcte ?
  3. Corrigez votre programme C, pour obtenir le comportement suivant :

Exercice 2 : Les affichages

  1. É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.
  1. 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.

  1. É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.
  1. 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

  1. 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;
}
  1. É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.

Comment calculer la puissance en C ?

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;
}
  1. É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 π.

Comment faire de l’aléatoire en C ?

  • 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.*/