Mettre des lettres dans un tableau en C

Fermé
sabine - 24 déc. 2009 à 01:23
 lami20j - 24 déc. 2009 à 18:22
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

9 réponses

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
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
Re,

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

  free (alphabet);
  return EXIT_SUCCESS;
0
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
sabine > sabine
24 déc. 2009 à 15:12
tu as écrit une réponse lamij je crois mais je ne la vois pas :-(
0
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
ah maintenant je la vois merci, je vais encore réfléchir un peu sur cette fonction
0
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

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

Posez votre question
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
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
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
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
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
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
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
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
lami20j > sabine
24 déc. 2009 à 17:37
Re,

Colle ici ton code.
0
sabine > lami20j
24 déc. 2009 à 17:40
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
Re,

Alors bonne continuation.
0