|
|
|
|
Bonsoir , je viens de commencer les tableaux , et je dois dire que là mon livre ( le langage C norme ANSI de K&R ) est mal fait car ce n'est pas clair du tout comparé aux pages d'avant . Je copie mot pour mot ce qu'ils disent :
Ecrivons un programme qui compte les occurences des 10 chiffres , des caractères d'espacement et de tous les autres caractères . Cet exemple est artificiel , mais il permet d'illustrer plusieurs aspects du C dans un seul programme .
Nous avons défini douze catégories de caractères en entrée , il est donc pratique de se servir d'un tableau pour stocker le nombre d'occurences de chaque chiffre, plutot que 10 variables distinctes . voici une version de ce programme :
#include <stdio.h>
/*compte les chiffres , les caracteres d'espacement et les autres caractères en entrée */
int main()
{
int c, i, nespace, nautre;
int nchiffre[10];
nespace = nautre = 0;
for ( i = 0; i <10; ++i )
nchiffre[i] = 0;
while (( c = getchar()) != EOF)
if ( c >= '0' && c <= '9' )
++nchiffre[c-'0'];
else if ( c == ' ' || c == '\n' || c == '\t')
++nespace;
else
++nautre;
printf("chiffres=);
for (i = 0; i < 10; ++i)
printf(" %d", nchiffre[i]);
printf(", espacement = %d, autres = %d\n", nespace, nautre);
}
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); |
Oui mais ce nchiffre[i] il sert à quoi dans le programme , je saisi pas exactement ce que c'est ce tableau , pourquoi il est là et ce qu'il fait . Je sais meme pas à quoi sert le programme dans l'ensemble car si tu appliques ce programme à lui meme , tu obtiens comme résultat :
|
Tu as raison Jeff, K&R n'explique pas clairement ce que fait ce programme. Eh bien, ce programme prend une chaîne de caractères en entrée, par exemple la phrase suivante
|
Oui je me suis peut être un peu mal expliqué....
|
Bonjour à tous,
|