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 527
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 527
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 567
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
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:54
Concernant ton premier lien, ça illustre bien ce que je disais. Ce n'est pas mauvais, c'est même assez soigné dans la présentation (au début en tous cas) mais il n'y a que des bribes, c'est à peine une initiation, ça manque cruellement de code-source complet cad un truc prêt à être compilé avec des printf à droite à gauche pour comprendre ce que fait le programme. En plus la présentation est hyper-traditionnelle, on dirait un cours de grammaire. Une langue s'apprend avec une grammaire, un dictionnaire mais surtout avec un corpus de textes d'ailleurs, en lisant des textes on est souvent capable de comprendre le lexique et les règles de grammaire donc je dis que c'est le texte qui explique la grammaire plus que la grammaire qui explique le texte ... voilà pourquoi les cours de programmation sont si souvent mal faits et occasionnent des pertes de temps énormes. Je trouve hallucinant qu'il faille se taper un bouquin de plusieurs centaines de pages sur le C pour seulement n'être capable que d'écrire des programmes modestes, étant entendu que pour s'améliorer il faut encore se taper un autre bouquin de plusieurs centaines de pages. Au demeurant, il est intéressant de noter que les ouvrages sur java sont en général beaucoup plus didactiques (bien que souvent verbeux) que ceux pour le langage C. Question de génération je pense.


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 567 > 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
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 567 > calaceite Messages postés 159 Date d'inscription vendredi 1 novembre 2002 Statut Membre Dernière intervention 23 avril 2007
13 nov. 2005 à 13:04
Je suis d'accord avec ta façon de voir les choses.

Personnellement j'ai trouvé que les ouvrages du Perl sont assez proches de cette façon de voir les choses.

Je parle de

Introduction à Perl par Schwartz & Phoenix
Programmation en Perl par Wall, Christiansen & Orwant
Programmation avancée en Perl par Srinivasan
Perl en action par Christiansen & Torkington

La dernière contient que du code source avec 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