|
|
|
|
#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 :
chiffres = 9 3 0 0 0 0 0 0 0 1, espacement = 159, autres = 403 je ne comprends pas ce résultat , ni le rapport qu'il a avec le nchiffre[i]... |
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
Nous sommes le 13 novembre 2005, il est 2h 09min27s !! et la sortie est digits= 3 1 3 1 0 1 0 1 0 1, white space =12, other =33 (j'ai la version anglaise de K&R) ce qui veut dire que le nombre d'occurrences dans la phrase du chiffre 0 est 3 (dans 2005 il y a deux zéros et dans 2h 09 il y a un zéro), le nombre d'occurrences du chiffre 1 est 1, etc, (en fait, ce serait plus clair déjà si la sortie était plutôt avec des séparateurs : digits= 3-1-3-1-0-1-0-1-0-1) qu'il y a 12 "espaces" au sens large et en dehors des chiffres et des espaces, il y a 33 caractères. Dans le cas de mon exemple, nchiffre[0]=3, etc. Alors, Jeff, je veux pas te décourager mais lâche le K&R c'est un des pires bouquins qui soient pour commencer le C. Il est complètement absurde de donner un exemple d'une telle complexité et aussi peu concret pour présenter la notion de tableau alors qu'il s'agit d' une notion très simple et très naturelle. Et le bouquet c'est de tester le programme sur lui-même, pourquoi faire simple quand on peut faire compliqué ?!! Et tu verras que la pédagogie de l'exposé ne va pas s'améliorer au cours des chapitres qui suivent. Il existe un nombre incroyable de livres et de tutos sur le C, hélas, il existe très très peu de bonnes références capables de l'enseigner rapidement et avec clarté. Le choix pour le débutant doit être guidé par le fait que plus le livre contient de code-source complet et commenté, mieux c'est. Je peux te donner quelques références si tu le souhaites. Calaz |
Oui je me suis peut être un peu mal expliqué....
Faut dire que ce code est un peu dense pour un débutant sur les tableaux.... Comme le dis calaceite, le tableau en c est une notion qui mériterait un exemple plus simple... Le cours ici est plutôt bien fait: http://www.commentcamarche.net/c/ctab.php3
|
Bonjour à tous,
jeff voilà un petit cours pour les débutants http://membres.lycos.fr/tonysoueid/cour_c/ et encore http://c.developpez.com/cours/
|
| 27/03 16h03 | [PHP] Méthodes de débogage | PHP |
| 07/09 15h05 | [Firefox][GreaseMonkey] Personnaliser les pages web | Mozilla Firefox |
| 15/03 20h06 | Import / export de données Ingres | Ingres |
| 25/10 17h04 | [mythes] MD5 a été cassé | Mythes et légendes |
| 29/10 12h46 | Trier un tableau sans utiliser la fonction sort | Perl |
| 08/08 22h54 | Retourner valeurs tableau classe en java | 7 |
| 28/07 19h03 | Tableau croisé dynamique aide | 4 |
| 18/06 19h12 | Tableaux croisés dynamiques excel 2007 | 1 |
| 14/06 21h41 | Excel : tableau croisé dynamique | 8 |
| 12/06 16h54 | Problème avec tableau croisé dynamique | 2 |
![]() | MOREFUNC (Macro complémentaire EXCEL) - Morefunc est une macro complémentaire proposant 67 nouvelles fonctions de feuille de calcul pour Excel. Ces fonctions sont... | Catégorie: Tableur Licence: Freeware/gratuit |
![]() | Tab Catalog - Cette extension de Firefox apporte un petit confort visuel agréable: Les différents onglet apparaissent sous forme de... | Catégorie: Extensions Firefox Licence: Freeware/gratuit |
![]() | CCleaner - CCleaner (Crap Cleaner) est un utilitaire de nettoyage gratuit permettant de garantir un respect de la vie privée en... | Catégorie: Anonymat/Confidentialité Licence: Freeware/gratuit |
![]() | PDF Creator - PDF Creator est un outil gratuit permettant de créer des PDF à partir de presque n'importe quelle application capable... | Catégorie: PDF Licence: Open Source |
![]() | Lenovo ThinkPad X60 Tablet | Catégorie: Tablet PC | |
![]() | Toshiba Portege M400-11C Intel | Catégorie: Tablet PC | |
![]() | Lenovo X60Tablet Intel Core | Catégorie: Tablet PC | |
![]() | Samsung Q1b HSDPA VIA | Catégorie: Tablet PC | 1,145.50 € MicroChoix |