1 Partie 2 ENTRÉE-SORTIE ET STRUCTURES DE CONTRÔLE 2AP-S3 Prof Asmaa El Hannani

1 Partie 2 ENTRÉE-SORTIE ET STRUCTURES DE CONTRÔLE 2AP-S3 Prof Asmaa El Hannani 77 Les Entrées-Sorties 2 Les Entrées-Sorties Conversationnelles C dispose d’une multitude de fonctions pour afficher des informations à l’écran ou pour en lire au clavier. C’est ce que nous avons appelé les « entrées-sorties conversationnelles ». Plus tard, nous verrons que ces mêmes fonctions (moyennant la présence d’un argument supplémentaire) permettent également d’échanger des informations avec des fichiers. 2AP-S3 79 Prof Asmaa El Hannani Les Entrées-Sorties Conversationnelles Fonctions pour l’affichage des données: Fonctions pour la lecture des données printf("Format" , expr [ , expr,…]) ; /*affiche des données selon un format */ puts(Chaine); /* affiche une chaîne de caractère */ putchar(caractere); /* affiche un caractère */ scanf("Format" ,adres_var [ ,adresse_var,…]) ; /*Lit des donnée selon un format */ gets(Var_Chaine); /* Lit une chaîne de caractère */ var_caratere = getchar(); /* Lit un caractère */ var_caratere = getch() ; /* Lit un caratère sur le clavier */ 2AP-S3 80 Prof Asmaa El Hannani 3 La fonction printf se présente ainsi: printf ( format[, liste_d’expressions] ) format une chaîne de caractères qui spécifie:  Des caractères à afficher tels quels;  Des code de format repérés par % (c, d, f..) qui précise le type de l’information à afficher. liste_d’expressions : suite d’expressions séparées par des virgules d’un type en accord avec le code format correspondant. Exemple: printf("leur somme est : %d", n1+n2); Un code de format peut contenir des informations complémentaires agissant sur le cadrage, le gabarit ou la précision. Les possibilités de la fonction printf 2AP-S3 81 Prof Asmaa El Hannani printf: Les principaux codes de conversion c : char: caractère affiché ''en clair" (convient aussi à short ou à int compte tenu des conversions systématiques) d : int (convient aussi à char, compte tenu des conversions systématiques) u : unsigned int (convient aussi à unsigned char ou à unsigned short, compte tenu des conversions systématiques) ld : long lu : unsigned long 2AP-S3 82 Prof Asmaa El Hannani 4 printf: Les principaux codes de conversion f : double ou float écrit en notation "décimale" avec six chiffres après le point e : double ou float écrit en notation ''exponentielle'' (mantisse entre 1 et 9) avec six chiffres après le point décimal, sous la forme x.xxxxxxe+yyy ou x.xxxxxxe-yyy pour les nombres positifs et -x.xxxxxxe+yyy ou -x.xxxxxxe-yyy pour les nombres négatifs s : chaîne de caractères dont on fournit l'adresse (notion qui sera étudiée ultérieurement) 2AP-S3 83 Prof Asmaa El Hannani printf: Action sur le gabarit d’affichage:  Les entiers sont affichés par défaut sans espaces avant ou après.  Les flottants avec six chiffres après le point.  Pour agir sur l’affichage un nombre est placé après % et précise le nombre de caractère minimum à utiliser. Exemples: printf("%3d" , n ); n = 20 ^20 // ^ désigne un espace n = 3 ^^3 n = 2358 2358 n = -5200 -5200 2AP-S3 84 Prof Asmaa El Hannani 5 printf: Action sur le gabarit d’affichage: Exemples: printf("%f" , x ); x = 1.2345 1.234500 x = 12.3456789 12.345678 printf("%10f" , x ); x = 1.2345 ^^1.234500 x = 1.2345E5 123450.000000 printf("%e" , x ); x = 1.2345 1.234500e+000 x = 123.45 1.234500e+002 2AP-S3 85 Prof Asmaa El Hannani printf: Actions sur la précision pour les flottants, on peut préciser un nombre de chiffres après le point décimal Exemples: printf("%10.3f" , x ); x = 1.2346 ^^^^^1.235 x = 1.2345E3 ^^1234.500 x = 1.2345E7 12345000.000 Remarques:  Cadrage de l’affichage à gauche : printf("%-10.3f" , x ); x = 1.2345 1.235^^^^^  Le caractère * figurants à la place d’un gabarit ou une précision signifie que la valeur effective est fournie dans la liste des arguments de printf: printf("%8.*f" , n, x ); n=1; x=1.2345 ^^^^^1.2  La fonction printf fournit une valeur de retour (nombre de caractère affichés) 2AP-S3 86 Prof Asmaa El Hannani 6 printf: Les erreurs de programmation Erreur1: Code de format en désaccord avec le type de l’expression à afficher: Conséquence : mauvaise interprétation si même taille (int en %u), sinon, conséquences plus désastreuses. Erreur2: Nombre de code de format différents du nombre d’expressions de la liste Conséquence 1: si des expressions de la liste n’ont pas de format, elles ne seront pas affichées ( printf("%d" , n, p ); // valeur de p ne sera pas affiché ) Conséquence 2 : s’il y a trop de code de format, printf cherchera à afficher n’importe quoi ( printf("%d %d" , n ); n=8 8 2 ) 2AP-S3 87 Prof Asmaa El Hannani Les possibilités de la fonction scanf La fonction scanf se présente ainsi: scanf ( format, liste_d_adresse ) format une chaîne de caractères qui spécifie:  Des code de format repérés par %, précisant le type de l’information à lire. liste_d_adresses : liste d’adresse, séparées par des virgules, d’un type en accord avec le code de format correspondant. Exemple: scanf ("%d", &p) ; Il faut noter la nécessité de recourir à l’opérateur & pour désigner l’adresse de la variable pour laquelle on souhaite lire une valeur. 2AP-S3 88 Prof Asmaa El Hannani 7 scanf : Les principaux codes de conversion :  c : char  d : int  u : unsigned int  hd : short int  hu : unsigned short  ld : long  lu : unsigned long  f ou e : float écrit en notation "décimale" ou ‘'exponentielle''  Lf ou le : double écrit en notation "décimale" ou ‘'exponentielle''  s : chaîne de caractères dont on fournit l'adresse (notion qui sera étudiée ultérieurement) 2AP-S3 89 Prof Asmaa El Hannani scanf : Notion de tampon et de séparateurs Lorsque scanf attend des données, l’information frappée au clavier est rangée temporairement dans l’emplacement mémoire nommé « tampon ». Le tampon est exploré caractère par caractère au fur et à mesure des besoins. Certains caractères jouent un rôle particulier: les séparateurs (l’espace et la fin de ligne \n) 2AP-S3 90 Prof Asmaa El Hannani 8 scanf : Les règles utilisées par scanf Les codes de format correspondant à un nombre entraînent l’avancement du pointeur jusqu’au 1er caractère différent d’un séparateur, puis scanf prend en compte tous les caractères suivants jusqu’à la rencontre d’un séparateur. Quand au code de format %c, il entraîne la prise en compte du caractère désigné par le pointeur (même un séparateur) et il est avancé sur le caractère suivant. 2AP-S3 91 Prof Asmaa El Hannani scanf : Les règles utilisées par scanf Exemples : (n et p sont de type int, c char, @ désigne une fin de ligne) scanf("%d%d" , &n, &p ); 12^25@ n = 12 p=25 ^12^^25^^@ n = 12 p=25 scanf("%d%d" , &n, &p ); 12@ @ ^25 n = 12 p=25 scanf("%d%c" , &n, &c ); 12^a@ n = 12 c=‘ ‘ 2AP-S3 92 Prof Asmaa El Hannani Sans espace entre deux codes de format, le code de format %c entraîne la prise en compte du séparateur ! 9 scanf : On peut imposer un gabarit maximal Le traitement d’un code de format s’interrompe soit à la rencontre d’un séparateur, soit lorsque le nombre de caractère indiqué a été atteint !! Exemples : (n et p sont de type int, @ désigne une fin de ligne) scanf("%3d%3d" , &n, &p ); 12^25@ n = 12 p=25 ^^^^^12345@ n = 123 p=45 12@ 25@ n = 12 p=25 2AP-S3 93 Prof Asmaa El Hannani scanf : Rôle d’un espace dans le format Un espace entre deux codes de format demande à scanf de faire avancer le pointeur au prochain caractère différent d’un séparateur !! Exemples : (n et p de type int, c char, @ désigne la fin de ligne) scanf("%d %c" , &n, &c ); 12^a@ n = 12 c=‘a‘ 12^^^@ a@ n = 12 c=‘a‘ 2AP-S3 94 Prof Asmaa El Hannani espace 10 scanf : Arrêt prématuré de scanf Un arrêt prématuré de scanf a lieu dans le cas où scanf n’est pas en mesure de fabriquer une valeur adéquate !! Exemples : (n et p de type int, c char, @ désigne la fin de ligne) compte = scanf("%d %d %c" , &n, &p, &c ); 12^25^b@ n = 12 p = 25 c=‘b‘ compte = 3 12b@ n = 12 p indéfini c indéfini compte = 1 b@ n indéfini p indéfini c indéfini compte = 0 La valeur de retour fournie par scanf indique le nombre de valeurs convenablement lues. 2AP-S3 95 Prof Asmaa El Hannani scanf : Problème de synchronisation entre l’écran et le clavier Le tampon n’est pas vide à chaque nouvel appel de scanf Pour vider le buffer d'entrée il faut utiliser: fflush ( stdin ); Exemple: Résultat à l’exécution: donner une valeur pour n : 233 122 Merci pour 233 donner une valeur pour p : Merci pour 122 233^122@ 2AP-S3 96 Prof Asmaa El Hannani 11 scanf : Les erreurs de programmation Erreur1: Code de format en désaccord avec le type de l’expression: Conséquence: Si même taille introduction uploads/Litterature/ c2-entree-sortie-et-structures-de-controle-pdf.pdf

  • 17
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager