[C] colonne de lettre

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...

14 réponses

  1. Contributeur
    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
    1. 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
      1. 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
        1. j'ai une erreur de compilation avec ce code :

          ligne 15-17 warning : multi character constant , error syntax before < , ...
          0
          1. Contributeur
            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
            1. 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
              1. 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
                1. Contributeur
                  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
                  1. 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
                    1. Contributeur
                      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
                      1. 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
                        1. Contributeur
                          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