[C] colonne de lettre
johan
-
emmanuelP Messages postés 137 Statut Contributeur -
emmanuelP Messages postés 137 Statut Contributeur -
Bonsoir , sans vous donner tout le code de mon programme , si j'ai ceci :
for ( j = 0; j < 26; j++ )
{
printf("%c :", j+1);
}
printf("\n");
çà va bien m'afficher çà à l'écran :
a:
b:
c:
d:
e:
f:
g:
........
j parcourt un tableau de 26 lettres où chaque case contient le nombre de lettres , case 0 contient le nombre de a , case 1 le nombre de b ...donc j'aimerais savoir si le bout de code que j'ai mis là va m'afficher a
b
c
ou
1
2
3
merci de votre aide...
for ( j = 0; j < 26; j++ )
{
printf("%c :", j+1);
}
printf("\n");
çà va bien m'afficher çà à l'écran :
a:
b:
c:
d:
e:
f:
g:
........
j parcourt un tableau de 26 lettres où chaque case contient le nombre de lettres , case 0 contient le nombre de a , case 1 le nombre de b ...donc j'aimerais savoir si le bout de code que j'ai mis là va m'afficher a
b
c
ou
1
2
3
merci de votre aide...
14 réponses
-
Slt,
Il y a fort à parier que ça ne t'affichera pas grand chose de cohérent...
en effet:for ( j = 0; j < 26; j++ ) { printf("%c :", j+1);<= là tu ne commencera qu'à b (voir *) } printf("\n"); <= tu ne passera à la ligne qu'à la toute fin...
*)dans ton printf, tu affichera des caractères commençant à 1 jusqu'à 25 or l'oridinateur utilise la table de codage ascii (http://www.commentcamarche.net/base/ascii.php3), ce qui fait qu'il faut rajouter une constante à j (65 pour le A et 97 pour le a).
La structure de ton programme est bonne dans l'ensemble avec le prog suivant ca devrait marcher:for ( j = 97; j < 123; j++ ) { printf("%c :\n", j); }
Good luck -
mais non , je me suis mal exprimé , mon code entier est celui ci :
#include <stdio.h> int main(void) { int a, i, j; int tab[26]; for ( i = 0; i <1000; i++) tab[i] = 0; while ( ( a = getchar() ) != EOF ) { if ( a >= '97' && a =< '122' ) tab[a-'a']++; } for ( j = 0; j < 26; j++ ) { printf("%c :", j+1); } printf("\n");
ce code m'affiche un histogramme de la fréquence des lettres rencontrées en entrée , mais cet histogramme moi je veux qu'il affiche ( c'est un exemple ) :
a: __
b: ____
c: _
d: _________
donc avec mon code çà m'affichera çà , ou alors çà tu crois :
1: __
2: ___
3: _
4: _________ -
pardon , le bon code c'est :
#include <stdio.h> int main(void) { int a, i, j; int tab[26]; for ( i = 0; i <1000; i++) tab[i] = 0; while ( ( a = getchar() ) != EOF ) { if ( a >= '97' && a =< '122' ) tab[a-'a']++; } for ( j = 0; j < 26; j++ ) { printf("%c :", j+1); for ( i = 0; i < tab[j]; i++ ) { printf("_"); } printf("\n"); } return0; } -
j'ai une erreur de compilation avec ce code :
ligne 15-17 warning : multi character constant , error syntax before < , ... -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Ah, je vois un peu mieux ce que tu veux faire...
Ca ne change pas mes observations pour ta 2ème boucle for!
Ensuite prends garde car tu déclaresint tab[26]
soit un tableau d'entiers de 26 cases et tu initialises:for ( i = 0; i <1000; i++) tab[i] = 0;
un tableau de 1000 cases!! (attention le C le permet!)
compte tenu de tout ca:#include <stdio.h> int main(void) { int a, i, j; int tab[26]; for ( i = 0; i <25; i++) tab[i] = 0; /*initialisation du tableau dans ses limites*/ while ( ( a = getchar() ) != EOF ) { if (( a >= 97) && (a =< 122) ) tab[a-'a']++; /*code numerique donc pas de cote sinon utiliser : if (( a >= 'a') && (a =< 'z') )*/ } for ( j = 0; j < 26; j++ ) { printf("%c :", j+97);/* on commence à 'a'*/ for ( i = 0; i < tab[j]; i++ ) { printf("_"); } printf("\n"); } return 0; }
Good luck -
int tab[26];
for ( i = 0; i <1000; i++)
tab[i] = 0;
donc ce code veut dire : j'initialise un tableau de 26 cases contenant des données de types int . tant que la i èeme case est infénieure à 1000 , je mets les cases à la valeur 0 , c'est bien ceci? -
2 autres petites question :
if (( a >= 'a') && (a =< 'z') )*
pourquoi mettre a>='a' entre paranthèses?
printf("%c :", j+97);/* on commence à 'a'*/
la fonction printf considère 97 comme le code ascii de a ? je ne savais pas... -
Négatif!
En fait tu fais:
tab[0]=0
tab[1]=0
...
tab[59]=0
...
tab[999]=0
dans:for ( i = 0; i <1000; i++) tab[i] = 0;
c'est i que tu incrémente de 0 à 999 alors que tu n'as déclaré qu'un tableau de 26 cases...
Good luck -
mon compilateur m'affiche une erreur de syntaxe à la compilation , ligne 15 :
if ((a >= 'a') && (a =< 'z'))
error syntax before '<' token , ce qui veut dire? -
Pour répondre à tes 2 derniers posts:
- les parenthèses ont la même utilité qu'en maths en assurant le respect des règles d'associativité car en fait, ce que tu mets dans le if est une opération de calcul (&& est une fonction) qui a pour résultat un booléen.
- ce n'est pas seulement le printf qui "considère" le caractère 'a' égal à 97, en fait, tous les caractères sont manipulés par toutes les fonctions sous forme codée (cf + haut). La fonction printf permet de retranscrire ce code sous forme d'un 'a' à l'écran...
- l'erreur qui s'affiche est un pb de syntaxe avant le jeton (token) '<' qui correspond à la fraction de code que le compilateur examine(analyse syntaxique). En fait c'est une erreur qui m'a échappé: il faut mettre le égal après < soit:if ((a >= 'a') && (a <= 'z'))
Good luck -
c'est bon , le programme marche parfaitement , mais j'ai une dernière interrogation sur la variable i :
for ( i = 0; i <25; i++) tab[i] = 0;
ici le "i" représente toutes les cases tu tableau on est bien d'accord .
mais ici regarde :
for ( i = 0; i < tab[j]; i++ ) , le i représente la valeur contenu la case j n'est ce pas?
donc notre variable i dans notre programme représente non seulement les cases 0 à 25 , mais également la valeur de leur contenu ?
ce qui est étrange c'est que au départ i représente toutes les cases , et que par la suite on utilise j pour représenter les cases avec tab[j]... -
Encore une fois non...
i est un entier, quand tu le fais varier de 0 à 25, cela te permet d'accéder à la ième case de ton tableau en faisant tab[i].
Si tu reprends ton code:for ( i = 0; i < tab[j]; i++ ) { printf("_"); }
tu constates qu'il signifie que:
for ( i = 0; ====>pour i initialisé à 0,
i < tab[j]; ====>tant que i est inférieur à la valeur de la case j de tab
i++) ========> je rajoute 1 à i
{ printf("_");} ==>j'affiche un "_"
autrement dit : admettons que j=5 et tab[5]=2 (tu as donc 2 fois la lettre 'e' dans ta saisie),
la boucle va donc commencer à 0 qui est inférieur à tab[5] augmenter i de 1 et afficher "_"
puis i étant égal à 1 on recommence encore une fois: i+1=2 et on affiche "_"
cette fois i est égal à tab[5] donc on sort (et on repart dans la boucle de niveau supérieur qui correspond à j=6 donc la lettre 'f' ... jusqu'à
'z').
Il faut voir les variables i et j comme des index que tu fais varier pour ouvrir un tiroir (tab[]) correspondant à leur numéro...
Good luck -
-