2016-04-19 15 views
-4

Ich habe ein C++ - Programm, das alle Vokale in einer Zeichenfolge gibt und löscht. Das einzige Problem ist, es funktioniert nicht und ich kann den Grund nicht finden. Ich muss 2 Funktionen verwenden, die alle Vokale entfernt und ein anderes, das bestimmt, wenn ein Zeichen ein Vokal ist und das alles sollte in einer Schleife funktionieren.Programm, das Vokale liest und löscht sie nicht ordnungsgemäß ausgeführt

Dies ist mein 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); 
} 

ich es vor der Arbeit hatte, aber jetzt wird es nicht richtig laufen und alle Vokale löschen. Irgendwelche Vorschläge oder Tipps wären toll! Vielen Dank im Voraus!

+4

Schritt durch Ihren Code mit dem Debugger. –

+0

Nun wäre dies eine gute Gelegenheit, sich mit einem Debugger vertraut zu machen. Das Problem sollte ziemlich offensichtlich sein, wenn Sie den Code durchgehen. –

+0

Hinzufügen zu dem, was die beiden über mich sagten, sollten Sie dies ein Fall machen und keine if-Anweisung. Wenn du einen weiteren Versuch machst, werde ich dir einen besseren/einfacheren Weg zeigen, dies zu tun ...Aber nur, wenn du ein bisschen mehr versuchst, weil du ehrlich gesagt nicht weit weg bist :) – Afflicted

Antwort

0

In Ordnung, ich bin impantient und in einer guten Stimmung, also hier.

#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++; 
    } 

} 

Das Problem, das Sie wurden war mit

ich es vor der Arbeit hatte, aber jetzt wird es nicht richtig laufen und alle Vokale löschen. Irgendwelche Vorschläge oder Tipps wären toll! Vielen Dank im Voraus!

  1. In Ihrer for-Schleife verwenden keine unsigned int verwenden, nur ein int!

  2. Im Allgemeinen sollten Sie nicht wirklich genau oder falsch "gerade" zurückgeben, wie Sie hier getan haben, gibt es eine Vielzahl von Gründen, und ich bin sicher, dass Ihr Professor sie decken wird. Aber in jeder Hinsicht deklarieren Sie eine boolesche Variable (Bool Vokal = True) ist ein Beispiel für einen und Sie können das in Ihrer Rückkehr verwenden.

  3. Da Sie eine if-Anweisung ohne Schleifenstruktur verwenden (und selbst wenn Sie noch Probleme haben), wird nur einmal ausgeführt, was im besten Fall nur einen einzigen Vokal ergibt. Sie geben auch wahr zurück, aber Sie liefern keine Logik, um damit umzugehen.

    Zum Beispiel was möchten Sie auftreten, wenn es wahr zurückgibt, und was soll es tun, wenn es false zurückgibt?

  4. Sie verwenden cin, die keine multiples Wörter (weiße Leerzeichen) verwenden und nicht verwenden getline (cin, input); (Eingabe ist Ihre Eingabevariable)

  5. Ich habe tatsächlich Ihren Code falsch gelesen und ich habe meinen Kommentar hier geändert, um zu verdeutlichen. Sie sagen in Ihrer Funktion, den Vokal s.resease (i, 1) zu entfernen; Im Wesentlichen beginnen Sie an der Position 0 in der Zeichenkette, indem Sie um 1 Position vorwärts iterieren und den Start- und Endpunkt löschen (der Anfangspunkt ist 0, der Endpunkt ist 1).

Denken Sie an die erste Position ist 0 nicht 1.

Wenn Sie Fragen zu den Code habe ich vorausgesetzt, Sie lassen Sie es mich wissen und ich werde es dir erklären!