[c++] compter les voyelles dans une chaine de caractere

compter les voyelles dans une chaine de caractere [c++] - C++ - Programmation

Marsh Posté le 27-03-2003 à 14:14:47    

je doit compter des voyelles, avec une fonction qui accpete un tableau de char et qui ressort un tableau pour pouvoir imprimer dans le main :  

a: 8
e: 9


par exemple, j'ai deja ca :
 

Code :
  1. int* voyelle(char *toto[]){
  2. int *tata=0;
  3. int i=0,j=0;
  4. for (i=0;i<=25;i++)
  5.  tata[i]= 0;
  6. i=0;
  7. while (*(*(toto+i)) != '\0'){
  8. while (*(*(toto+i)+j) != '\0'){
  9.  // toupper : met tout en majuscule
  10.  if (toupper(*(*(toto+i)+j)) >= 64 && toupper (*(*(toto+i)+j))<=90)
  11.   tata[(*(*(toto+i)+j)) - 64]++;
  12.  i++;
  13.  j++;
  14. }
  15. }
  16. return tata;
  17. }


 
pour la fonction
 

Code :
  1. char *ch[]={"sdjfgjdgfdsj","edfdeesgjsdg","uyuereyj",""};
  2. int alfa[26];
  3. voyelle(ch);
  4. cout << "a:"<<alfa[0]<<endl;
  5. cout << "e:"<<alfa[4]<<endl;
  6. cout << "i:"<<alfa[8]<<endl;
  7. cout << "o:"<<alfa[14]<<endl;
  8. cout << "u:"<<alfa[20]<<endl;
  9. cout << "y:"<<alfa[24]<<endl;


pour l'appel et l'affichage du tableau
 
et

Code :
  1. int* voyelle(char*[]);

comme declaration
 
 
mais ca merde, comment je doit faire ?


Message édité par didier1809 le 27-03-2003 à 14:15:32

---------------
.
Reply

Marsh Posté le 27-03-2003 à 14:14:47   

Reply

Marsh Posté le 27-03-2003 à 14:25:07    

Didier1809 a écrit :

[cpp]
   int *tata=0;
   for (i=0;i<=25;i++)
      tata[i]= 0;


:ouch:
 
t'as pas l'impression d'écrire n'importe ou en RAM là ?
 
et dire que j'ai pas lu le reste.... ça doit etre beau !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-03-2003 à 14:28:31    

Harkonnen a écrit :


:ouch:
 
t'as pas l'impression d'écrire n'importe ou en RAM là ?
 
et dire que j'ai pas lu le reste.... ça doit etre beau !


 
 [:zoutte]  pkoi j'ecrirai n'importe ou ? si tu poste ici juste pour critiquer les prog de noob, c'est pas la peine hein  :sarcastic:


---------------
.
Reply

Marsh Posté le 27-03-2003 à 14:32:39    

Didier1809 a écrit :


 
 [:zoutte]  pkoi j'ecrirai n'importe ou ? si tu poste ici juste pour critiquer les prog de noob, c'est pas la peine hein  :sarcastic:  


Un pointeur ca s'alloue  [:spamafote]


---------------
get amaroK plugin
Reply

Marsh Posté le 27-03-2003 à 14:32:47    

:heink:  
Je critique pas ton programme !!!! Je dis juste que tu écris dans une zone mémoire que tu n'as pas allouée !  
 
Cette ligne :
 
int *tata=0;  
 
Ne fait qu'initialiser un pointeur vers un int (et en plus tu l'initialises mal !), mais n'alloue pas l'espace nécessaire à tes 26 int !
 
Si tu veux allouer correctement, tu écris :
 
int tata[26];
 
et basta !!! :fou:
 
Avant de gueuler, réflechis donc la prochaine fois !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-03-2003 à 14:44:32    

bizarement ca me rapelle un labo que j'ai du faire il y a deux ans..
 
 
EDIT : mais a mon avis ca marcherait deja un peu mieux si tu faisais alpha = voyelle(ch);
 
sinon comment veux tu que ton resultat se retrouve dans alpha?????
Ne montres surtout pas ca a M...


Message édité par polo021 le 27-03-2003 à 14:50:22
Reply

Marsh Posté le 27-03-2003 à 14:46:07    

Harkonnen> merci, mais ca me resort des valeur n'imp, excuse moi  ;)  
 
polo021> quelle ecole ?
 
edit : jemelle ?  :ange:


Message édité par didier1809 le 27-03-2003 à 14:46:23

---------------
.
Reply

Marsh Posté le 27-03-2003 à 14:46:57    

Harkonnen a écrit :


Si tu veux allouer correctement, tu écris :
 
int tata[26];
 
et basta !!! :fou:
 
Avant de gueuler, réflechis donc la prochaine fois !


 
Le super conseil  :sarcastic:  :sarcastic:  :sarcastic:  
Alors que tata doit être retourné en dehors de la fonction...  :sarcastic:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 27-03-2003 à 14:50:01    

Didier1809 a écrit :


 
 [:zoutte]  pkoi j'ecrirai n'importe ou ? si tu poste ici juste pour critiquer les prog de noob, c'est pas la peine hein  :sarcastic:  


 
1) Pourquoi files-tu un tableau de chaine alors qu'un tableau de char suffit ?
 
2) Ce n'est pas forcément une bonne idée d'allouer un tableau dans une fonction puisqu'il va falloir le désallouer en dehors.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 27-03-2003 à 14:50:10    

les * capuduku

Reply

Marsh Posté le 27-03-2003 à 14:50:10   

Reply

Marsh Posté le 27-03-2003 à 14:51:48    

Tetragrammaton IHVH a écrit :


 
1) Pourquoi files-tu un tableau de chaine alors qu'un tableau de char suffit ?
 
2) Ce n'est pas forcément une bonne idée d'allouer un tableau dans une fonction puisqu'il va falloir le désallouer en dehors.


 
je sais pas, je debute vraiment la dedan, je fait comme je pense, mais c'est pas genial. pourquoi un tableau de char est mieux ?  :??:  
 
2) c'eswt le seul truc que j'ai trouvé pour faire un return de plusieurs valeurs


---------------
.
Reply

Marsh Posté le 27-03-2003 à 14:53:25    

Tetragrammaton IHVH a écrit :


 
Le super conseil  :sarcastic:  :sarcastic:  :sarcastic:  
Alors que tata doit être retourné en dehors de la fonction...  :sarcastic:  

j'ai dit que j'avais pas tout lu !
j'ai parcouru son code, et quand je suis tombé sur l'allocation foireuse, je lui ai répondu sans lire le reste ! une telle énormité, ça se voit tellement que tout le reste est secondaire :d


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-03-2003 à 15:08:02    

Didier1809 a écrit :


 
je sais pas, je debute vraiment la dedan, je fait comme je pense, mais c'est pas genial. pourquoi un tableau de char est mieux ?  :??:  
 
2) c'eswt le seul truc que j'ai trouvé pour faire un return de plusieurs valeurs


 
 
Il est plus correct de filer un tableau déjà aloué en paramètre :
 

Code :
  1. // toto contient la chaine
  2. // cmpt est un compteur pour chaque lettre (26 cases)
  3. // compte les occurences de chaque lettre de la chaine toto
  4. // dans le tableau cmpt
  5. void voyelle(char* toto, int* cmpt) {
  6.   char* ptr = toto;
  7.   while (*ptr != 0) {
  8.     char c = toupper(*ptr);
  9.     if ((c>='A') && (c<='Z'))
  10.        cmpt[c - 65]++;
  11.     ptr++;
  12.   }
  13. }
  14. main() {
  15. char str[] = "coucou";
  16. int cmpt[26];
  17. voyelle(str, cmpt);
  18. // affichage  
  19. etc...
  20. }


 
Pas besoin de se compliquer la vie.


Message édité par Tetragrammaton IHVH le 27-03-2003 à 15:12:06

---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 27-03-2003 à 15:09:35    

apparement tous tes labos vont ou sont passes par ici.
Le tri de 3 nombres, la saisie d'un entier, les conversions de bases, ...
 
je te conseille de quand meme y reflechir par toi meme un maximum et de ne demander de l'aide qu'en dernier recours (si c'est ce que tu fais tant mieux) parce que le but de ces exercices est de fouiller les langages C et Pascal et non pas de demander une solution toute faite.  :hello:

Reply

Marsh Posté le 27-03-2003 à 15:10:40    

benou a écrit :

les * capuduku


 


*      *      *
                      *          *
 
 
 
                      *           *

 


---------------
get amaroK plugin
Reply

Marsh Posté le 27-03-2003 à 15:36:46    

polo021 a écrit :

apparement tous tes labos vont ou sont passes par ici.
Le tri de 3 nombres, la saisie d'un entier, les conversions de bases, ...
 
je te conseille de quand meme y reflechir par toi meme un maximum et de ne demander de l'aide qu'en dernier recours (si c'est ce que tu fais tant mieux) parce que le but de ces exercices est de fouiller les langages C et Pascal et non pas de demander une solution toute faite.  :hello:  


 
je ne demande pas une soluce toute faite, mais bien un "coup de pouce" pour avancer  ;)  si tu a des bouquins a me conseiller  :hello:


---------------
.
Reply

Marsh Posté le 27-03-2003 à 15:43:47    

vala, faut pas se compliquer la vie des fois
 

Code :
  1. int voyelle(char *toto[],char lettre)
  2. {
  3. int i=0,j=0,k=0;
  4. while (*(*(toto+i)) != '\0')
  5. {
  6.  while (*(*(toto+i)+j) != '\0')
  7.  // tolower : met tout en minuscule
  8.  {
  9.   if (tolower(*(*(toto+i)+j++)) == lettre)
  10.    k++;
  11.  }
  12.  i++;
  13.  j=0;
  14. }
  15. return k;
  16. }


 
et l'appel

Code :
  1. cout << "a:"<<voyelle(ch,'a')<<endl;
  2. cout << "e:"<<voyelle(ch,'e')<<endl;
  3. cout << "i:"<<voyelle(ch,'i')<<endl;
  4. cout << "o:"<<voyelle(ch,'o')<<endl;
  5. cout << "u:"<<voyelle(ch,'u')<<endl;
  6. cout << "y:"<<voyelle(ch,'y')<<endl;


 


---------------
.
Reply

Marsh Posté le 27-03-2003 à 15:48:52    

Didier1809 a écrit :


 
je ne demande pas une soluce toute faite, mais bien un "coup de pouce" pour avancer  ;)  si tu a des bouquins a me conseiller  :hello:  


 
ton syllabus de C de 132 pages devrait amplement te suffir pour debuter


Message édité par polo021 le 27-03-2003 à 15:50:01
Reply

Marsh Posté le 27-03-2003 à 15:50:35    

Didier1809 a écrit :

vala, faut pas se compliquer la vie des fois
 

Code :
  1. int voyelle(char *toto[],char lettre)
  2. {
  3. int i=0,j=0,k=0;
  4. while (*(*(toto+i)) != '\0')
  5. {
  6.  while (*(*(toto+i)+j) != '\0')
  7.  // tolower : met tout en minuscule
  8.  {
  9.   if (tolower(*(*(toto+i)+j++)) == lettre)
  10.    k++;
  11.  }
  12.  i++;
  13.  j=0;
  14. }
  15. return k;
  16. }


 
et l'appel

Code :
  1. cout << "a:"<<voyelle(ch,'a')<<endl;
  2. cout << "e:"<<voyelle(ch,'e')<<endl;
  3. cout << "i:"<<voyelle(ch,'i')<<endl;
  4. cout << "o:"<<voyelle(ch,'o')<<endl;
  5. cout << "u:"<<voyelle(ch,'u')<<endl;
  6. cout << "y:"<<voyelle(ch,'y')<<endl;


 
 
 
 

déja utilise la notation de tableaux...
*(*(toto+i)+j) ca devient toto[i][j] et c plus claire
ton truc ca fait un peu concours d'obscurantisme programmationnel !
 
quant à écrire char* toto[], choisis un écriture plus coherente (avec le reste de ton prog) donc soit tu fais du *, soit du [], mais ne mixe pas.
 
ca devrait rendre ton code plus facile a lire, pour nosu comme pour toi; et t'éviter un bon nombre de fautes
 
 
et puis les char* cai mal ( ++Taz Engine Powered )


Message édité par farib le 27-03-2003 à 15:51:55

---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 27-03-2003 à 15:52:45    

polo021 a écrit :


 
ton syllabus de C de 132 pages devrait amplement te suffir pour debuter


 
 :whistle:


---------------
.
Reply

Marsh Posté le 27-03-2003 à 15:55:28    

Didier1809 a écrit :

vala, faut pas se compliquer la vie des fois
 


 
Ton algorithme est super inéfficace puisque tu parcours la chaine pour chaque voyelle. Difficile de faire une programmation plus sale...


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 27-03-2003 à 16:01:37    

Tetragrammaton IHVH a écrit :


 
Ton algorithme est super inéfficace puisque tu parcours la chaine pour chaque voyelle. Difficile de faire une programmation plus sale...
 


 
c'est le seul que j'ai reussi a faire [:spamafote]
 
tu croit que je devrait tout faire en : if a : a++ ; if e : e++ ? et la parcourir qu'une fois, et retourner un tableau ?


---------------
.
Reply

Marsh Posté le 28-03-2003 à 15:01:46    

Didier1809 a écrit :


 
c'est le seul que j'ai reussi a faire [:spamafote]
 
tu croit que je devrait tout faire en : if a : a++ ; if e : e++ ? et la parcourir qu'une fois, et retourner un tableau ?


 
 
Pas besoin de faire des "if". Tu comptes toutes les lettres et tu n'affiches que celles qui t'interessent (aeiouy). C'est l'algo que j'ai fourni un peu plus haut.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 28-03-2003 à 21:00:29    

Tetragrammaton IHVH a écrit :


 
 
Pas besoin de faire des "if". Tu comptes toutes les lettres et tu n'affiches que celles qui t'interessent (aeiouy). C'est l'algo que j'ai fourni un peu plus haut.


 
ca c'est plutot intelligent!

Reply

Marsh Posté le 29-03-2003 à 12:31:21    

Solution optimisée :-) Présence d'algorithme: nulle :-)
 

Code :
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. class VoyelleTesteur
  5. {
  6. public:
  7.   // LIFE CYCLE
  8.   VoyelleTesteur()
  9.   {
  10.     std::fill(m_Lettres, m_Lettres+256, false);
  11.     m_Lettres['a'] = true; m_Lettres['A'] = true;
  12.     m_Lettres['e'] = true; m_Lettres['E'] = true;
  13.     m_Lettres['i'] = true; m_Lettres['I'] = true;
  14.     m_Lettres['o'] = true; m_Lettres['O'] = true;
  15.     m_Lettres['u'] = true; m_Lettres['U'] = true;
  16.     m_Lettres['y'] = true; m_Lettres['Y'] = true;
  17.   }
  18.   // OPERATIONS
  19.   bool operator()(char lettre)const
  20.   {
  21.     return m_Lettres[lettre];
  22.   }
  23. private:
  24.   // ATTRIBUTES
  25.   bool m_Lettres[256];
  26. };
  27. size_t compte_voyelles(const char *array, size_t len)
  28. {
  29.   static VoyelleTesteur testeur;
  30.   return std::count_if(array, array+len, testeur);
  31. }
  32. int main(int argc, char *argv[])
  33. {
  34.   std::string str;
  35.   std::getline(std::cin, str);
  36.   std::cout << "Voyelles: " << compte_voyelles(str.c_str(), str.size()) << std::endl;
  37.   return 0;
  38. }

Reply

Marsh Posté le 29-03-2003 à 13:27:24    

kenshiro182 a écrit :

Solution optimisée :-) Présence d'algorithme: nulle :-)
 

Code :
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. class VoyelleTesteur
  5. {
  6. public:
  7.   // LIFE CYCLE
  8.   VoyelleTesteur()
  9.   {
  10.     std::fill(m_Lettres, m_Lettres+256, false);
  11.     m_Lettres['a'] = true; m_Lettres['A'] = true;
  12.     m_Lettres['e'] = true; m_Lettres['E'] = true;
  13.     m_Lettres['i'] = true; m_Lettres['I'] = true;
  14.     m_Lettres['o'] = true; m_Lettres['O'] = true;
  15.     m_Lettres['u'] = true; m_Lettres['U'] = true;
  16.     m_Lettres['y'] = true; m_Lettres['Y'] = true;
  17.   }
  18.   // OPERATIONS
  19.   bool operator()(char lettre)const
  20.   {
  21.     return m_Lettres[lettre];
  22.   }
  23. private:
  24.   // ATTRIBUTES
  25.   bool m_Lettres[256];
  26. };
  27. size_t compte_voyelles(const char *array, size_t len)
  28. {
  29.   static VoyelleTesteur testeur;
  30.   return std::count_if(array, array+len, testeur);
  31. }
  32. int main(int argc, char *argv[])
  33. {
  34.   std::string str;
  35.   std::getline(std::cin, str);
  36.   std::cout << "Voyelles: " << compte_voyelles(str.c_str(), str.size()) << std::endl;
  37.   return 0;
  38. }

 


 
heeeuuu, merci, mais j'ai pas encore vu les classes  ;)  
 
si tu a le temps et le courage, tu peut expliquer  :)


---------------
.
Reply

Marsh Posté le 29-03-2003 à 13:55:49    

Didier1809 a écrit :


heeeuuu, merci, mais j'ai pas encore vu les classes  ;)  
si tu a le temps et le courage, tu peut expliquer  :)  


Bon en fait c'est tout bête :-)
Dans un tableau de 256 éléments, je stocke pour chaque caractère possible si c'est une voyelle ou pas. L'idée est de le remplir une seule fois dans le programme. Ca pourrait être une variable globale (mais les variables globales c'est mal).
Après, pour tester si un caractère est une voyelle, tu fais "tableau[caractere]". D'ailleurs il y a un bug, comme "caractere" est une valeur signée, il se peut qu'on accède à un élément d'index négatif. Donc vaut mieux faire "tableau[(unsigned char)caractere]" (ouais faudrait faire un "static_cast<unsigned char>" ).
 
Après, compter dans une chaine le nombre de voyelles est tout bete (une boucle "for" ).
 
En C++ il y a des fonctions utilisant des algorithmes génériques dans la bibliothèque standard. Ici la fonction "std::count_if" va compter tous les éléments se situant entre "array" et "array+len" pour lequel l'object "testeur" va répondre "true".
"testeur" est un objet-fonction. Il agit comme une fonction (une fonction qui teste si c'est une voyelle).
 
Bon pourquoi une classe ? Mon besoin est:
- initialiser le tableau une fois. Si je crée un élément "static" de cette classe, son constructeur sera appelé une seule fois. Et autant encapsuler ce tableau dans une classe
- utiliser ce tableau dans une fonction (ou un objet-fonction) avec la fonction "std::count". "operator()" permet de faire passer mon objet pour une fonction.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed