[C] colonne de lettre

Fermé
johan - 27 nov. 2005 à 20:11
emmanuelP Messages postés 137 Date d'inscription vendredi 8 février 2002 Statut Contributeur Dernière intervention 7 mai 2006 - 28 nov. 2005 à 00:21
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...
A voir également:

14 réponses

emmanuelP Messages postés 137 Date d'inscription vendredi 8 février 2002 Statut Contributeur Dernière intervention 7 mai 2006 161
27 nov. 2005 à 21:03
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
0
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: _________
0
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;
}

0
j'ai une erreur de compilation avec ce code :

ligne 15-17 warning : multi character constant , error syntax before < , ...
0

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

Posez votre question
emmanuelP Messages postés 137 Date d'inscription vendredi 8 février 2002 Statut Contributeur Dernière intervention 7 mai 2006 161
27 nov. 2005 à 21:38
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éclares
 int 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
0
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?
0
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...
0
emmanuelP Messages postés 137 Date d'inscription vendredi 8 février 2002 Statut Contributeur Dernière intervention 7 mai 2006 161
27 nov. 2005 à 22:09
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
0
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?
0
emmanuelP Messages postés 137 Date d'inscription vendredi 8 février 2002 Statut Contributeur Dernière intervention 7 mai 2006 161
27 nov. 2005 à 22:29
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
0
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]...
0
emmanuelP Messages postés 137 Date d'inscription vendredi 8 février 2002 Statut Contributeur Dernière intervention 7 mai 2006 161
27 nov. 2005 à 23:12
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
0
merci pour ton aide .
0
emmanuelP Messages postés 137 Date d'inscription vendredi 8 février 2002 Statut Contributeur Dernière intervention 7 mai 2006 161
28 nov. 2005 à 00:21
de rien...
0