Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1785 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°345298
didier1809
${citation_perso}
Posté le 27-03-2003 à 14:14:47  profilanswer
 

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

---------------
.
mood
Publicité
Posté le 27-03-2003 à 14:14:47  profilanswer
 

n°345306
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-03-2003 à 14:25:07  profilanswer
 

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)
n°345308
didier1809
${citation_perso}
Posté le 27-03-2003 à 14:28:31  profilanswer
 

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:


---------------
.
n°345315
bobuse
Posté le 27-03-2003 à 14:32:39  profilanswer
 

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
n°345318
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-03-2003 à 14:32:47  profilanswer
 

: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)
n°345336
polo021
Posté le 27-03-2003 à 14:44:32  profilanswer
 

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
n°345339
didier1809
${citation_perso}
Posté le 27-03-2003 à 14:46:07  profilanswer
 

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

---------------
.
n°345341
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 27-03-2003 à 14:46:57  profilanswer
 

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
n°345346
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 27-03-2003 à 14:50:01  profilanswer
 

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
n°345348
benou
Posté le 27-03-2003 à 14:50:10  profilanswer
 

les * capuduku

mood
Publicité
Posté le 27-03-2003 à 14:50:10  profilanswer
 

n°345352
didier1809
${citation_perso}
Posté le 27-03-2003 à 14:51:48  profilanswer
 

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


---------------
.
n°345354
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-03-2003 à 14:53:25  profilanswer
 

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)
n°345376
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 27-03-2003 à 15:08:02  profilanswer
 

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
n°345379
polo021
Posté le 27-03-2003 à 15:09:35  profilanswer
 

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:

n°345381
bobuse
Posté le 27-03-2003 à 15:10:40  profilanswer
 

benou a écrit :

les * capuduku


 


*      *      *
                      *          *
 
 
 
                      *           *

 


---------------
get amaroK plugin
n°345425
didier1809
${citation_perso}
Posté le 27-03-2003 à 15:36:46  profilanswer
 

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:


---------------
.
n°345445
didier1809
${citation_perso}
Posté le 27-03-2003 à 15:43:47  profilanswer
 

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;


 


---------------
.
n°345462
polo021
Posté le 27-03-2003 à 15:48:52  profilanswer
 

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
n°345464
farib
Posté le 27-03-2003 à 15:50:35  profilanswer
 

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
n°345472
didier1809
${citation_perso}
Posté le 27-03-2003 à 15:52:45  profilanswer
 

polo021 a écrit :


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


 
 :whistle:


---------------
.
n°345478
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 27-03-2003 à 15:55:28  profilanswer
 

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
n°345489
didier1809
${citation_perso}
Posté le 27-03-2003 à 16:01:37  profilanswer
 

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 ?


---------------
.
n°346614
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 28-03-2003 à 15:01:46  profilanswer
 

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
n°346880
polo021
Posté le 28-03-2003 à 21:00:29  profilanswer
 

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!

n°347133
kenshiro18​2
Posté le 29-03-2003 à 12:31:21  profilanswer
 

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

n°347154
didier1809
${citation_perso}
Posté le 29-03-2003 à 13:27:24  profilanswer
 

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  :)


---------------
.
n°347169
kenshiro18​2
Posté le 29-03-2003 à 13:55:49  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
chaine de caractere .Taille d'une chaine de caractere ?????
Compter et slectionner et ordonner par ce qu'on a compter;)[PHP] multiplier des morceaux de chaîne de caractères
Conversion chaine de caracteres vers entier??taille max d'une chaine de caractère en java?
Recherche dans une chaine de caractere 
Plus de sujets relatifs à : [c++] compter les voyelles dans une chaine de caractere


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR