les tableaux en C
kilian, le sam. 12 nov. 2005 à 03:05:00
int c, i, nespace, nautre;
Ici, c représente un des caractères qui composent ce que l'utilisateur a tapé à l'ecran.
nespace, c'est le nombre d'espace dans ce que l'utilisateur a tapé (dedans il y a aussi les tabulations et sauts de ligne). Et nautre c'est tout ce qui n'est ni chiffre, ni espace.
i c'est juste un compteur.
int nchiffre[10];
nespace = nautre = 0;
for ( i = 0; i <10; ++i )
nchiffre[i] = 0;
On déclare un tableau nchiffre de 10 entiers. Donc nchiffre va de nchiffre[0] à nchiffre[9].
On initialise le nombre d'espaces et les autres caractères à 0 pour les compter plus tard.
while (( c = getchar()) != EOF)
if ( c >= '0' && c <= '9' )
++nchiffre[c-'0'];
else if ( c == ' ' || c == '\n' || c == '\t')
++nespace;
else
++nautre;
C'est peut être la partie la plus compliquée.
Lorsqu'on appele getchar(),, le programme attend que l'utilisateur tape des trucs à l'écran. Mais il les récupère un par un, donc il faut appeler plusieurs fois getchar() pour récupérer une suite de caractères, c'est pourquoi on utilise une boucle jusqu'à ce que getchar() renvoie EOF (ce qui signifie qu'il n'y a plus de caractère à récupérer).
Dans le if, on teste si le caractère qu'on vient de récupérer est un chiffre.
En passant: getchar() renvoie un caractère! Ca signifie que si tu tapes 1 à l'ecran, getchar() renverra '1' et non pas 1
Quelle est la différence entre '1' et 1 ? Eh bien 1 vaut 1, et '1' vaut 49
car '1' est un caractère ascii, sa valeur est donc sa correspondance ascii:
http://www.commentcamarche.net/base/ascii.php3
Donc si c est un chiffre ascii, voici ce que signifie ++nchiffre[c-'0']:
nchiffre est un tableau de 0 à 9 pour determiner le nombre de 0 trouvés, de 1 trouvés etc....
Si tu fais c-'0', tu auras la correspondance en vrai nombre d'un nombre ascii. Testons pour '1': '1' - '0', ça donne 49 - 48=1
Les ++ devant le tableau, ça signifie qu'on incrémente la valeur contenue dans un emplacement du tableau.
Donc faisons le cheminement:
Si on a tapé 1 à l'ecran, getchar donnera la valeur de '1' à c
Donc à l'emplacement nchiffre[c-'0'] (soit nchiffre[1]), on incrémente de 1, soit nchiffre[1]=nchiffre[1] + 1
Et voilà, chaque fois qu'un 1 sera saisi par l'utilisateur, nchiffre[1] augmentera de 1, donc tu auras le nombre de 1 que tu as mis dans ce que tu as tapé.
Donc finalement, dans nchiffre[i] tu auras le nombre de i saisis...
Le reste c'est plus simple:
else if ( c == ' ' || c == '\n' || c == '\t')
++nespace;
else
++nautre;
'\n' c'est le saut de ligne, et '\t' c'est la tabulation, donc si c est un espace ou un saut de ligne ou tabulation, on incrémente nespace de 1 (tu auras donc à la fin le nombre d'espaces saisis).
Sinon on incrémente nautre (c'est un autre caractère qu'un chiffre ou un espace)...
La fin c'est juste l'affichage de ces nombres qui comptabilisent les caractères....
Si tu veux un meilleur bilan pour te rendre compte, change la fin comme ceci:
printf("chiffres=\n");
for (i = 0; i < 10; ++i)
printf("Nombre de %d: %d\n", i, nchiffre[i]);
printf(", espacement = %d, autres = %d\n", nespace, nautre);
REPONSES