Les tableaux en C

Fermé
jeff - 11 nov. 2005 à 22:03
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
- 13 nov. 2005 à 16:28
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);
}


Alors là je demande quelqu'un qui connaissent bien les tableaux et qui pourrait commenter ce code car le livre ne le fait pas et j'ai un mal fou à comprendre ce code , je n'y comprends rien pour etre franc , on déclare 5 variables dont la moitié je sais pas à quoi elles servent , je ne sais meme pas ce que fait vraiment le programme malgré le commentaire bref là je nage à pleins tubes , et jamais je comprendrai les tableaux si on m'explique pas chaque ligne de ce prog , je vous remercie .

5 réponses

kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
12 nov. 2005 à 03:05
  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);
1
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]...
1
calaceite
Messages postés
159
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
10
13 nov. 2005 à 02:29
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
0
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 523
13 nov. 2005 à 06:30
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
0
calaceite
Messages postés
159
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
10
13 nov. 2005 à 12:00
Non, kilian, ton explication était bonne et détaillée, c'est l'exemple qui est mauvais.

Pour ce qui est de la référence que tu donnes, c'est sûr qu'il y a pire mais pour quelqu'un qui veut devenir un connaisseur du C (je dis même pas un pro), c'est une illusion de penser qu'il va y arriver avec ce cours. Et par exemple si je regarde le lien que tu donnes, on s'étend sur des choses évidentes alors que deux exemples bien choisis permettraient de comprendre immédiatement. Par ailleurs, tu remarqueras qu'il n'y a pas de code complet directement compilable alors que c'est de ça que le débutant a besoin. Alors, je donne un exemple complet pour le PO :

/*Programme qui donne le nombre d'entiers plus grands que 10  d'un tableau d'entiers donné en entrée*/

#include <stdio.h>

int 
main (void)

{
	/* Déclaration et initialisation d'un tableau  T de 10 entiers */
	int T[8]={4,12,14,5,8,3,11,5};
	
	int c=0; /* Compteur */
	int i;
	
	/* Attention à l'indexation des elements du tableau : */
	printf("Premier element du tableau T : %d\n",T[0]); /* affichera 4 */
	printf("Dernier element du tableau T : %d\n",T[7]); /* affichera 5 */ 
	
	/*  On compte les éléments du tableau plus grands que 10  */
		
	for(i=0;i<=7;i++) 
		{
  		 	if (T[i]>=10) 
			   c++;
		}
		   

    printf("\nLe tableau contient %d entiers valant au moins 10\n",c);		
return 0;
}
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566
13 nov. 2005 à 11:34
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/
0
calaceite
Messages postés
159
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
10
13 nov. 2005 à 12:36
Je ne connais pas le premier, je connais bien sûr le lien sur developpez, mais malgré le nombre impressionnant de références, il n'y a aucun cours qui donne une formation avancée et rapidement assimilable à un débutant complet. On trouve certes des bribes d'informations de-ci de-là mais il n'y a aucun cours complet vraiment cohérent et soigné (le cours de Garetta est soigné mais absolument pas destiné à un débutant).

Il faut se tourner vers des ouvrages mais là encore pour en avoir testé un paquet, je vois que le sens pédagogique des auteurs laisse bien souvent à désirer, à croire qu'ils ont oublié quand ils débutaient. Attention, que je me fasse bien comprendre : je parle de passer en un temps raisonnable (quelques mois seulement) du niveau débutant absolu à celui de connaisseur du langage.

Le K&R est une abomination totale pour acquérir le C quand on ne le connait pas du tout. Attention, je ne dis pas que le livre est inintéressant en soi.

Je déconseille totalement les deux livres de Delannoy qui sont remplis d'explications ambiguës et confuses, qui ne vont pas au fond des choses et qui en plus ne donnent aucun code source (faut tout recopier soi-même et en plus, il n'y a même pas
les en-tête et déclarations, il faut tout écrire soi-même y compris les printf).
Récemment est sorti un bouquin (en français) de Léry sur le C, il est bien au début mais rapidement l'ouvrage se montre peu précis avec des explications confuses ou abruptes. L'avantage c'est qu'il y a beaucoup de code source directement compilable, voir sur le site de l'ouvrage.

Un ouvrage acceptable est celui de Kochan (2004, 3ème édition, traduit en français). Il souffre de nombreuses lacunes mais il possède beaucoup de code source complet et commenté (assez verbeusement il est vrai mais vaut mieux ça que le contraire). Il est correct pour les choses de base (boucles, conditions, tableaux, structures, chaînes de caractères). Au moment d'aborder les pointeurs, il est calamiteux et par la suite, il se montre très insuffisant pour toutes les questions difficiles (allocations dynamiques, etc) bien qu'il soit un des rares ouvrages à parler en détail, par exemple, de l'utilisation d'un débogueur.

Jusqu'à présent, les deux ouvrages que j'ai trouvé corrects du point de vue de la clarté et de la cohérence d'exposition sont les suivants :

S. Prata, C Primer Plus, Fifth Edition, Sams, 2004.

K.N. King, C programming, 1996 (2ème édition prévue en 2006).

Le premier serait plutôt plus clair que le second.


Calaz
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566 > calaceite
Messages postés
159
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007

13 nov. 2005 à 12:55
Salut,

Je suis d'accord avec toi. Mais on peut toujours apprendre.
Il n'y a pas de language qu'on ne peut pas apprendre.
En ce qui concerne les auteurs, rien ne garanti qu'ils sont des "programmeurs" en C ou n'importe quel language.

Les auteurs(pas tous je pense) des livres ont besoin de l'argent et de la publicité. Ils s'en fichent si c'est bon ou pas.

Quand les auteurs programmeurs vont écrire les livres de point de vue d'un débutant c'est à ce moment que les débutants auront des bons cours.

S'il y a des gens qu'ont reussi apprendre alors celui qui veut apprendre peut aussi.

Quand j'était petit mon père voulais que j'apprenne français.
Je n'ai pas toute à fait reussi malgrè les prof, les livres, les manuels, ma volonté...

Ben, je suis arrivé en France et j'ai appris (j'ai encore des chose à apprendre mais je fait des progrés) sans livre, sans professeurs mais avec la volonté et le besoin.

C'est seulement une analogie. Pour un language de programmation il faut des cours quand même.

En fait c'est plus important d'analyser la situation et ensuite de créer un algorithme (quelque soit la langue : français, chinois,sanscrite...)

Il ne reste qu'à traduire dans un language de programmation.


En ce qui concerne les livres pour la programmation en C
Récemment est sorti un bouquin (en français) de Léry sur le C
sortie en 2002 et assez bien et assez clair pour un débutant
Titre : Le langage C
contient aussi un CD avec la solution des exercices

lami20j

P.S. Et c'est vrai un débutant cherche du code source aved des explications.
0
calaceite
Messages postés
159
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
10 > lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019

13 nov. 2005 à 13:52
Lami20j, ton français est très bon, aucune inquiétude à ce sujet.

Il est exact que le besoin et la necessité sont des bons vecteurs d'apprentissage. La motivation aussi.


Pour un francophone, il sera sans doute plus facile d'apprendre l'espagnol voire l'anglais (à cause de l'alphabet, du lexique, de la grammaire) que le persan ou le chinois.

Je pense qu'il ne faut pas confondre apprentissage d'un langage de programmation et apprentissage de l'algorithmique. C'est une confusion fréquente chez les auteurs voire chez les enseignants d'informatique.
Je suis convaincu que, lors de l'apprentissage d'un langage de programmation, un choix judicieux des exemples des codes-sources permet d'éviter tout recours à une algorithmique complexe tout en explorant toutes les fonctionnalités du langage.

A la fin de ton post, tu parles d'un ouvrage sur le langage C avec un CD. Quel en est l'auteur (le livre de Léry lui est sans CD) ?


Calaz

P.S. - Comme un débutant, même un programmeur avancé pourra souhaiter lui aussi avoir du code-source plutôt que des explications confuses ou laborieuses.
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566 > calaceite
Messages postés
159
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007

13 nov. 2005 à 14:00
Re,

(le livre de Léry lui est sans CD)

J'ai le livre

Le language C par Jean-Michel Léry avec un CD offert

publié par CampusPress

2002


J'ai le fichier en PDF ou .txt avec les exercices corrigés.
Je te l'enverrai volontairement par e-mail si tu veux.

Le CD contient aussi les codes sources du livre.
0
calaceite
Messages postés
159
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
23 avril 2007
10 > lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019

13 nov. 2005 à 14:11
OK mais il y a une version plus récente :

J.M. LERY, Le langage C, Collection Synthex, Pearson éducation France, 2005, sans CD, code source à télécharger sur le site de l'éditeur.

Le livre n'a pas que des défauts : le texte colle assez bien au code-source et traite plutôt honnêtement les questions basiques.
Mais il est vraiment trop léger sur bien des points plus avancés en particulier sur tout ce qui concerne les pointeurs.
0