Année universitaire 2002-2003 |
Licence d'informatique
|
L'instruction :
for (expr1;expr2;expr3) action;
est équivalente à :
Les quatre instructions suivantes produisent le même résultat après leur exécution :
if (condition) action1; /* Parenthèses et point-virgule obligatoires. */
else action2;
action2 n'est exécutée que si condition a la valeur 0. Pour toute valeur non nulle de condition, c'est action1 qui sera exécutée.
a=(condition)?valeur1:valeur2; /* Parenthèses facultatives. */
est équivalente à :
if (condition) a=valeur1; /* Parenthèses obligatoires. */
else a=valeur2;
Il existe une zone mémoire, appelée "buffer d'entrée", prévue pour contenir les caractères tapés par l'utilisateur lors d'une opération de lecture de caractères tapés au clavier, et qui fonctionne selon le principe d'une "file" (premier arrivé = premier sorti). Si le buffer d'entrée n'est pas vide, l'instruction car=getchar(); affecte à la variable car le caractère le plus ancien se trouvant dans le buffer d'entrée, et enlève ce caractère du buffer d'entrée. Si le buffer d'entrée est vide, l'instruction car=getchar(); stoppe le déroulement du programme jusqu'à ce que le buffer d'entrée reçoive un ou plusieurs caractères. L'ajout de caractères dans le buffer d'entrée ne se fait qu'au moment où l'utilisateur tape un retour-chariot. Par exemple, si l'utilisateur tape les caractères texTe TApé<retour-chariot>, alors le contenu du buffer d'entrée ne sera modifié qu'au moment de la frappe du caractère retour-chariot et, à ce moment-là, le buffer d'entrée recevra onze caractères (neuf caractères alphabétiques, plus un espace, plus le retour-chariot).
La fonction printf permet d'afficher à l'écran du texte et des valeurs d'expressions (une variable est une expression particulière). La syntaxe de l'appel à cette fonction est :
printf("chaîne_de_caractères",expr1,expr2,expr3,...);
Cet appel est interprété de la manière suivante :
La séquence :
i=5;
car='a';
printf("Nombre : %d ; caractère : %c\n",i,car);
provoque à l'écran l'affichage suivant :
Nombre : 5 ; caractère : a
En fait, la fonction printf envoie la chaîne de caractères interprétée, non pas directement à l'écran, mais sur le "buffer de sortie". Pour forcer l'affichage du contenu du buffer de sortie à l'écran, il existe deux possibilités :
Après chaque appel à la fonction printf, on placera donc systématiquement l'instruction fflush(stdout); dans le cas où la chaîne de caractères affichée par la fonction printf ne se termine pas par un caractère \n. La raison de cette systématique est d'éviter les confusions éventuelles dues à une mauvaise synchronisation entre les entrées au clavier et les affichages à l'écran, en particulier lors du "débogage" d'un programme.
Contrairement à ce que nous préconisions les années précédentes, l'instruction fflush(stdin); (permettant la "vidange du buffer d'entrée") n'est pas autorisée par la norme ANSI, même si cette instruction est acceptée par certains compilateurs. Il est donc demandé de ne plus utiliser cette instruction. Les opérations de lecture dans le buffer d'entrée se feront donc généralement sans l'avoir préalablement vidé, sauf dans certains cas de figure, comme celui que nous allons détailler dans l'exemple ci-dessous.
Dans la mesure où cette écriture de la vidange du buffer d'entrée répond bien à la norme ANSI, mais s'avère nettement plus compliquée que l'instruction fflush(stdin); on n'y aura recours que dans les cas de nécessité absolue, que l'on peut résumer par la règle suivante : "il ne faut procéder à la vidange préalable du buffer d'entrée que lors de la lecture d'un caractère, à un moment où le buffer d'entrée risque de ne pas être vide".
Le programme suivant sera brièvement commenté en séance de travaux dirigés :
#include <stdio.h> int lire(void) { int i=0; char car; car=getchar(); while (car!='#') { if ((car=='a')|| (car=='e')|| (car=='i')|| (car=='o')|| (car=='u')|| (car=='y')) i++; car=getchar(); } return(i); } int main(void) { int a; printf("Entrez votre texte (non accentué, terminé par un #) :\n"); a=lire(); if (a!=0) printf("Ce texte contient %d voyelles.\n",a); else printf("Ce texte ne contient aucune voyelle.\n"); return(0); } |
Écrire un programme C qui lit un texte contenant au plus 100 caractères, se terminant par un caractère $, le stocke dans un tableau puis le réaffiche. Ce programme ne devra pas comporter d'autre fonction que la fonction main.
Écrire un programme C qui calcule le nombre de consonnes ou de voyelles (au choix de l'utilisateur) dans un texte non accentué et terminé par un caractère #. On utilisera pour cela une fonction qui teste si une lettre est une consonne ou une voyelle. On suppose que le texte n'est composé que de lettres minuscules non accentuées, que les mots ne sont séparés que par des espaces, qu'il n'y a aucune ponctuation et qu'il n'y a pas de caractère retour-chariot.
Réaliser un programme en langage C permettant de rechercher dans une suite de caractères donnée, le nombre de fois qu'apparaît une séquence particulière. La suite de caractères à tester est entrée la première, dans un tableau de taille égale à 100, et se termine par le caractère $. Le texte de la séquence à rechercher se termine par un caractère $, contient au plus 10 caractères et n'est pas vide.