Mettre des lettres dans un tableau en C

sabine -  
 lami20j -
Bonjour,
je souhaite écrire une fonction qui parcourt un tableau de 26 cases, qui prend une lettre en paramètre, et si le code ascii de cette lettre correspond à un indice d'une case du tableau, on met cette lettre dans la case. Par exemple si je veux mettre la lettre z dans la case 25 je fais 'z'-'a' vous voyez? DOnc j'ai écrit un code, le voilà:

int ajout(int alphat[], char lettre){
int i=0;
int var=0;
char a='a';
while(alpha[i] < 26){
if(i==(lettre-a)){
alpha[i]=lettre;
var=1;
}
i++;
}
return var;
}

Et rien ne marche, j'ai réussi à écrire bien des fonctions aujourd'hui mais sur celle ci je sèche totalement, quelqu'un aurait il une idée?
merci
Configuration: Linux
Mozilla 1.9.0.16

9 réponses

  1. lami20j
     
    Re,

    Un exemple
    lami20j@debian:~$ cat alpha.c
    #include<stdio.h>
    #include<stdlib.h>
    
    void ajout(int *alphabet,char lettre);
    
    int main()
    {
      int i;
      char lettre='m';
      int *alphabet=calloc(26,sizeof(int));
      ajout(alphabet,lettre);
      for(i=0;i<26;++i)
        printf("indice %d - lettre %c\n",i,alphabet[i]);
      return EXIT_SUCCESS;
    }
    
    void ajout(int *alphabet,char lettre){
      alphabet[lettre-97]=lettre;
    }
    lami20j@debian:~$ gcc -Wall alpha.c
    lami20j@debian:~$ ./a.out
    indice 0 - lettre
    indice 1 - lettre
    indice 2 - lettre
    indice 3 - lettre
    indice 4 - lettre
    indice 5 - lettre
    indice 6 - lettre
    indice 7 - lettre
    indice 8 - lettre
    indice 9 - lettre
    indice 10 - lettre
    indice 11 - lettre
    indice 12 - lettre m
    indice 13 - lettre
    indice 14 - lettre
    indice 15 - lettre
    indice 16 - lettre
    indice 17 - lettre
    indice 18 - lettre
    indice 19 - lettre
    indice 20 - lettre
    indice 21 - lettre
    indice 22 - lettre
    indice 23 - lettre
    indice 24 - lettre
    indice 25 - lettre
    
    1
  2. lami20j
     
    Salut,

    Essaie ce code pour comprendre un peu comment ça se passe avec les indices de tableau
    Les deux boucles for for la même chose.
    lami20j@debian:~$ cat alphabet.c
    #include<stdio.h>
    #include<stdlib.h>
    
    
    int main()
    {
      int i;
      i='a';
      printf("%d - %c\n",i,i);
      for(i = 'a'-97;i <= 'z' - 97;++i)
        printf("index tableau commence à %d - on mets %c\n",i,i+97);
    
      printf("****************************************\n");
      for(i=0;i<26;++i)
        printf("index tableau commence à %d - on mets %c\n",i,i+97);
      return EXIT_SUCCESS;
    }


    Dans ta fonction vu que tu passe une seule lettre en arguments, c'est inutile d'utiliser une boucle pour insérer la lettre dans le tableau.
    Il suffit d'utiliser son code ascii pour trouver l'indice et l'insérer dans le tableau.

    La fonction n'écrira qu'une seule lettre à la fois, ce qui supposera de faire une boucle dans main par exemple de 0 à 25 ou de ('A'-65 à 'Z'-65 pour majuscules ou 'a'-97 à 'z'-97 pour minuscules) pour insérer tous les lettres.

    Si tu veux que ta fonction insère toutes le lettres soit tu passes en argument un tableau de char qui contiendra tous les lettres soit tu le fais à l'intérieur de la fonction en bouclant de 0 à 25 sur les codes ascii de 65 à 90 pour les majuscules ou de 97 à 122 pour les minuscules
    0
  3. lami20j
     
    Re,

    Avant la ligne return EXIT_SUCCESS; mets aussi free (alphabet);

      free (alphabet);
      return EXIT_SUCCESS;
    0
    1. sabine
       
      salut lamij, il suffirait d'après toi d'écrire dans ma fonction donc si je me trompe pas:

      alphabet['lettre'-97]=lettre?

      malheureusement ma fonction doit renvoyer 1 si la lettre figure déjà dans le tableau et 0 sinon, donc c'est pas si évident...

      Tu utilises des fonctions ( free...) que je n'ai pas encore vu lol.
      0
      1. sabine > sabine
         
        tu as écrit une réponse lamij je crois mais je ne la vois pas :-(
        0
  4. lami20j
     
    Re,

    malheureusement ma fonction doit renvoyer 1 si la lettre figure déjà dans le tableau et 0 sinon, donc c'est pas si évident...

    Toute à fait, ce n'est pas évident, mais ce n'était qu'un exemple pour te faire avancer et pas une solution.
    Ton message de début n'était pas évident non plus, puisque je ne savais pas que tu dois aussi vérifier que la lettre existe déjà.

    Tu utilises des fonctions ( free...) que je n'ai pas encore vu lol.
    Si je comprends bien alors on fait sans aucune allocation dynamique de mémoire.

    Si jamais, il n'y a personne pour t'aider je te répondrai un peu plus tard.

    P.S.
    Je sens que loupius va passser par là, mais peut être que je me trompe ;-)
    0
    1. sabine
       
      ah maintenant je la vois merci, je vais encore réfléchir un peu sur cette fonction
      0
    2. sabine
       
      alors j'ai tenté d'écrire une correction, la voici:

      int ajout(int alpha[], char lettre){
      int i;
      int var;
      for(i=0;i<26;i++){
      if(alpha[i]=='lettre'-97){
      var=0;
      }else{
      alpha[i]='lettre'-97;
      var=1;
      }
      }
      return var;
      }

      mais à la compilation j'ai sans arrêt cette erreur que je ne comprends pas:

      error: character constant too long for its type
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j
     
    Salut,

    Ce n'est qu'un exemple. La boucle for est inutile puisqu'on accède directement au indice de tableau grâce au code ascii de la lettre

    Un exemple
    lami20j@debian:~$ cat alpha.c
    #include<stdio.h>
    #include<stdlib.h>
    
    int ajout(int *alphabet,char lettre);
    
    int main()
    {
      int i,var;
      char lettre;
      int alphabet[26];
      for(i=0;i<26;++i)
        alphabet[i]=0;
      do{
        printf("Entrez une lettre minuscule sans accent [A pour quitter]: ");
        scanf("%c",&lettre);
        while(getchar()!='\n');
      var=ajout(alphabet,lettre);
      }while(lettre!='A');
      for(i=0;i<26;++i)
        printf("indice %d - lettre %c\n",i,alphabet[i]);
      return EXIT_SUCCESS;
    }
    
    int ajout(int *alphabet,char lettre){
      int var;
      if(alphabet[lettre-97] == lettre)
        var=0;
      else{
        var=1;
        alphabet[lettre-97]=lettre;
      }
      return var;
    }
    
    lami20j@debian:~$ gcc -Wall alpha.c
    lami20j@debian:~$ ./a.out
    Entrez une lettre minuscule sans accent [A pour quitter]: a
    Entrez une lettre minuscule sans accent [A pour quitter]: b
    Entrez une lettre minuscule sans accent [A pour quitter]: d
    Entrez une lettre minuscule sans accent [A pour quitter]: e
    Entrez une lettre minuscule sans accent [A pour quitter]: m
    Entrez une lettre minuscule sans accent [A pour quitter]: l
    Entrez une lettre minuscule sans accent [A pour quitter]: z
    Entrez une lettre minuscule sans accent [A pour quitter]: a
    Entrez une lettre minuscule sans accent [A pour quitter]: b
    Entrez une lettre minuscule sans accent [A pour quitter]: A
    indice 0 - lettre a
    indice 1 - lettre b
    indice 2 - lettre
    indice 3 - lettre d
    indice 4 - lettre e
    indice 5 - lettre
    indice 6 - lettre
    indice 7 - lettre
    indice 8 - lettre
    indice 9 - lettre
    indice 10 - lettre
    indice 11 - lettre l
    indice 12 - lettre m
    indice 13 - lettre
    indice 14 - lettre
    indice 15 - lettre
    indice 16 - lettre
    indice 17 - lettre
    indice 18 - lettre
    indice 19 - lettre
    indice 20 - lettre
    indice 21 - lettre
    indice 22 - lettre
    indice 23 - lettre
    indice 24 - lettre
    indice 25 - lettre z
    
    0
    1. sabine
       
      merci lamij bcp pour ton aide je commence à mieux saisir, mais une chose quand meme, si j'écris:

      char c = a, a représente la lettre a à l'état brut?

      si j'écris char c = 'a', 'a' représente une constante numérique?
      0
  7. lami20j
     
    Salut,

    char c = a tu peux écrire si et seulement a est aussi une variable de type char.

    En faite la variable char est représentés sur 8 bits alors
    si c'est un unsigned char la variable peut contenir des valeurs de 0 à 255
    et si elle est signed char elle peut contenir des valeurs de -128 à 127

    Pour initialiser un char soit tu mets un caractère entre apostrophes (char c='z') soit tu utilise le code ascii correspondant au caractère (char c=65 pour A par exemple)

    Il y a aussi les caractères spécieux (séquences d'échappement= :
    \a - caractère d'alerte
    \b - retour arrière
    \n - saut de ligne
    \f - saut de page
    \r - retour chariot
    \t - tabulation
    \v - tabulation verticale
    \\ - backslash
    \? - point interrogation
    \' - apostrophe
    \'' - guillemets
    \ooo - nombre octal (o de 0 à 7)
    \xhh nombre hexadécimal

    Voici un exemple
    lami20j@debian:~$ cat char.c
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
      char a;
      a='M';
      char c=a; /* initialiser avec une autre variable */
      printf("a=%c et c=%c\n",a,c);
    
      c=65;/* code ascii */
      a='z';/* le caractère */
      printf("a=%c et c=%c\n",a,c);
    
      c='\110';/* octal */
      a='\x4B';/* hexadécimal*/
      printf("a=%c et c=%c\n",a,c);
      return EXIT_SUCCESS;
    }
    
    lami20j@debian:~$ gcc -Wall char.c
    lami20j@debian:~$ ./a.out
    a=M et c=M
    a=z et c=A
    a=K et c=H
    
    0
    1. sabine
       
      ah ben là ça va bcp mieux :-), dans la fonction ajout qu'on a écrit, on rempli bien un tableau de caractères, ça aucun soucis, mais est possible d'écrire une petite fonction genre void affiche(int alpha[]) qui m'affiche justement chaque caractère du tableau alphabet qu'on a utilisé dans la fonction ajout?
      0
  8. lami20j
     
    Re,
    Dans mon exemple il reste beaucoup des cases vides.
    Tu ne veux plutôt afficher que les cases remplie de tableau, par hasard?
    0
    1. sabine
       
      si lamij exactement et j'avais écrit une fonction qui fait ça, avec simplement une boucle for qui s'incrémente et un alphabet[i], mais le problème dans mon programme ça m'affichait les lettres donc du tableau alphabet mais également de ssignes incompréhensibles qui ressemblaient à une langues extraterrestres :-)
      0
  9. lami20j
     
    Re,

    mais également de ssignes incompréhensibles qui ressemblaient à une langues extraterrestres
    Comme ça? ;-)
    lami20j@debian:~$ perl -e 'print chr($_) for 20..49,128..180 ;print "\n"'
    &#9618;&#9618;!"#$%&'()*+,-./01 ¡¢£€¥Š§š©ª«¬­®¯°±²³Ž


    Essaie alors sans les extraterrestres
    lami20j@debian:~$ cat alpha.c
    #include<stdio.h>
    #include<stdlib.h>
    
    int ajout(int *alphabet,char lettre);
    void affiche(int *alphabet);
    
    int main()
    {
      int i,var;
      char lettre;
      int alphabet[26];
      for(i=0;i<26;++i)
        alphabet[i]=0;
      do{
        printf("Entrez une lettre minuscule sans accent [A pour quitter]: ");
        scanf("%c",&lettre);
        while(getchar()!='\n');
      var=ajout(alphabet,lettre);
      }while(lettre!='A');
      /*for(i=0;i<26;++i)
        printf("indice %d - lettre %c\n",i,alphabet[i]);*/
      affiche(alphabet);
      return EXIT_SUCCESS;
    }
    
    int ajout(int *alphabet,char lettre){
      int var;
      if(alphabet[lettre-97] == lettre)
        var=0;
      else{
        var=1;
        alphabet[lettre-97]=lettre;
      }
      return var;
    }
    
    void affiche(int *alphabet){
      int i;
      for(i=0;i<26;++i)
        if(alphabet[i]!=0)
          printf("alphabet[%d] = %c\n",i,alphabet[i]);
    }
    
    
    lami20j@debian:~$ gcc -Wall alpha.c
    lami20j@debian:~$ ./a.out
    Entrez une lettre minuscule sans accent [A pour quitter]: a
    Entrez une lettre minuscule sans accent [A pour quitter]: b
    Entrez une lettre minuscule sans accent [A pour quitter]: c
    Entrez une lettre minuscule sans accent [A pour quitter]: e
    Entrez une lettre minuscule sans accent [A pour quitter]: f
    Entrez une lettre minuscule sans accent [A pour quitter]: g
    Entrez une lettre minuscule sans accent [A pour quitter]: m
    Entrez une lettre minuscule sans accent [A pour quitter]: n
    Entrez une lettre minuscule sans accent [A pour quitter]: o
    Entrez une lettre minuscule sans accent [A pour quitter]: u
    Entrez une lettre minuscule sans accent [A pour quitter]: z
    Entrez une lettre minuscule sans accent [A pour quitter]: a
    Entrez une lettre minuscule sans accent [A pour quitter]: A
    alphabet[0] = a
    alphabet[1] = b
    alphabet[2] = c
    alphabet[4] = e
    alphabet[5] = f
    alphabet[6] = g
    alphabet[12] = m
    alphabet[13] = n
    alphabet[14] = o
    alphabet[20] = u
    alphabet[25] = z
    0
    1. sabine
       
      lamij c'est exactement le programme que j'avais écrit et ça m'affiche des signes incroyables, les lettres bien sur mais les signes remplacent les cases du tableau alphabet qui valent 0 c'est pourça, tant pis j'ai déjà un programme qui fonctionne c'est pas dramatique si je ne sais pas écrire cette fonction j'aurais essayé c'est déjà ça!
      Je te remercie pour ton aide très très précieuse, mais tu en fais trop ne te donne pas la peine de tester tes programmes :-)
      0
      1. lami20j > sabine
         
        Re,

        Colle ici ton code.
        0
      2. sabine > lami20j
         
        j'aurais bien aimé lamij mais je ne peux pas et il est assez "long", tu m'as déjà bcp aidé pour cette fonction, j'ai déjà abusé, je suis satisfaite de mon travail, je ne peux pas réussir à écrire toutes mes fonctions je débute, donc encore merci à toi.
        0