2016-04-19 6 views
-4

J'ai un programme C++ qui trouve et efface toutes les voyelles dans une chaîne de caractères. Le seul problème est, ça ne marche pas et je ne peux pas trouver la raison. Je dois utiliser 2 fonctions qui supprime toutes les voyelles et une autre qui détermine si un caractère est une voyelle et tout cela devrait fonctionner dans une boucle.Le programme qui lit les voyelles et les efface ne fonctionnera pas correctement

Ceci est mon code:

#include <iostream> 
#include <string> 
using namespace std; 

bool isA_Vowel(string s); 
string remov(string s); 

int main() 
{ 
    string s; 
    string ans = "y"; 

    while((ans == "Y") || (ans == "y")) 
    { 
     cout << "Please enter a word or a series of letters: "; 
     cin >> s; 

     cout << "Old: " << s << endl; 
     cout << "New: " << remov(s) << endl; 
     cout << "Would you like to go again? <y/n> "; 
     cin >> ans; 
    } 

} 
bool isA_Vowel (string s) 
{ 
    if (s == "a" || s == "e"|| s == "i" || s == "o" || s == "u" || s == "A"  
      || s == "E" || s == "I" || s == "O" || s == "U") 
    { 
     return (true); 
    } 
    else 
    { 
     return (false); 
    } 
} 
string remov(string s) 
{ 
    for (unsigned int i = 0; i < s.length(); ++i) 
    { 
     if (isA_Vowel(s)) 
     { 
      s.erase(i,1); 
     } 

    } 
    return(s); 
} 

je l'avais avant de travailler, mais maintenant il ne fonctionnera pas correctement et effacer toutes les voyelles. Toutes les suggestions ou conseils seraient géniaux! Merci d'avance!

+4

Parcourez votre code avec le débogueur. –

+0

Maintenant, ce serait une excellente occasion de vous familiariser avec un débogueur. Le problème devrait être assez évident lorsque vous parcourez le code. –

+0

Ajoutant à ce que les deux ci-dessus m'a dit que vous devriez en faire un cas et non une déclaration if. Si vous faites une autre tentative, je vais vous montrer une meilleure façon de le faire ...Mais seulement si vous essayez un peu plus car en toute honnêteté vous n'êtes pas loin :) – Afflicted

Répondre

0

Très bien, je suis impantient et de bonne humeur, donc ici.

#include <iostream> 
#include <string> 



bool isVowel(char ch); 
void removeVowels(std::string& str); 

int main() 
{ 
    std::string Text = ""; 
    std::cout << "Please enter a string, what ever you like: "; 
    std::getline(std::cin, Text); 
    removeVowels(Text); 

    std::cout << Text << std::endl; 


    return 0; 
} 






bool isVowel(char ch) 
{ 
    switch (ch) 
    { 
    case 'a': 

    case 'A': 

    case 'e': 

    case 'E': 

    case 'i': 

    case 'I': 

    case 'o': 

    case 'O': 

    case 'u': 

    case 'U': 
     return true; 

    default: 
     return false; 
    } 

} 



void removeVowels(std::string& str) 
{ 
    int len = str.length(); 

    int index = 0; 

    while (index < len) 
    { 
     if (isVowel(str[index])) 
     { 
     str = str.substr(0, index) + str.substr(index + 1, str.length()); 
     len = str.length(); 
     } 
     else index++; 
    } 

} 

La question que vous aviez été

je l'avais avant de travailler, mais maintenant il ne fonctionnera pas correctement et effacer toutes les voyelles. Toute suggestion ou conseil serait génial! Merci d'avance!

  1. Dans votre boucle ne pas utiliser un unsigned int, il suffit d'utiliser un int! En règle générale, vous ne devriez pas vraiment retourner le vrai ou le faux «droit» comme vous l'avez fait ici, il y a une variété de raisons pour lesquelles, et je suis sûr que votre professeur les couvrira. Mais à toutes fins utiles, déclarez une variable booléenne (bool voyelle = true) est un exemple de celle-ci et vous pouvez l'utiliser dans votre déclaration. Parce que vous utilisez une instruction if seule sans structure en boucle (et même avec une structure qui vous pose encore des problèmes), elle ne s'exécute qu'une fois, ce qui signifie au mieux qu'elle ne trouverait qu'une seule voyelle. Vous revenez également vrai, mais vous ne fournissez pas de logique pour le gérer.

    Par exemple, que voulez-vous qu'il se produise quand il renvoie true, et que voulez-vous qu'il fasse quand il renvoie false?

  2. Vous utilisez cin qui ne prend pas et ne prendra pas de multiples mots (espaces) utilisez getline (cin, input); (entrée étant votre variable d'entrée)

  3. J'ai réellement mal lu votre code et j'ai changé mon commentaire ici pour clarifier. Vous dites dans votre fonction d'enlever la voyelle s.erase (i, 1); Essentiellement, ce que vous faites commence à la position 0 dans votre chaîne en itérant en avant d'une position et en supprimant le point de départ et d'arrivée (le point de départ étant 0 point final étant 1).

Rappelez-vous la première position est 0 pas 1.

Si vous avez des questions sur le code je vous ai exposés s'il vous plaît laissez-moi savoir et je vais vous l'expliquer!