Wo isn in der Schleife der Fehler?



  • Hallo Leute,

    ich will nen Programm schreiben, wo ich die Trennsilben herausfinde, dazu muss ich aber erstmal nach konsonanten und vokale suchen!

    Hab da mal was probiert, aber es geht nicht

    int main(int argc, char* argv[])
    {
    string vokal = "aeiou";
    string show;
    string wort;
    cin>>wort;
    for (unsigned int i = 0;i<wort.length();i++)
     {
     for (unsigned int j = 0;j<=vokal.size();j++)  //hier muss fehler liegen
     {
       //wenn ich hier ein cout<<vokal[j] zum test ausgebe, kommt nur "a"
       if (wort[i]==vokal[j])
       {
       show+="v";
       break;
       }
      else
       {
       show+="k";
       break;
       }
      }
     }
    cout<<wort<<endl;
    cout<<show<<endl;
    getch();
    
            return 0;
    }
    

    weis nich worans liegt, is sicher nur ein schusselfehler, den ich übersehen habe!



  • [cpp]int main(int argc, char* argv[])
    {
    string vokal = "aeiou";
    string show;
    string wort;
    getline(cin, wort); //Für string besser geeignet
    for (unsigned int i = 0;i<wort.length(); i++)
    {
    for (unsigned int j = 0;j**<vokal.length()**; j++) //nicht <= sondern < und statt size() besser length()
    {
    ...
    }[/cpp]



  • ok, hab ich geändert, funktioiert trotzdem nicht, wieso ich size() hatte weiß ich nichmal 😮

    Aber problem besteht noch!

    ZUm veranschaulichen geb ich mal ein Ausgabebeispiel:

    //eingabe
    Hallo
    //ausgabe
    kvkkv
    

    bei mir kommt aber nur kvkkk



  • string bietet dir schon fertig mehtoden mit an... schau mal unter ...

    http://www.sgi.com/tech/stl/basic_string.html

    size_type find_first_of(const basic_string& s, size_type pos = 0) const
    

    Searches within *this, beginning at pos, for the first character that is equal to any character within s.



  • das liegt afaik daran, dass du (wenn der vokal nicht a ist) gleich die innere schleife abbrichst. wenn(buchstabe nicht vokal[0]), dann break;
    du solltest das else durch

    else if(j==vokal.length()-1) 
    {
    show+="k";
    break;
    }
    

    ersetzen. alles klar?



  • ok, schau ich mir mal an!

    Aber wieso funktioniert meines nicht?



  • Hallo probier mal das

    int main(int argc, char* argv[])
    {
     int flag=0;
     string vokal = "aeiou";
    string show;
    string wort; 
    cin>>wort;
    for (unsigned int i = 0;i<wort.length();i++) 
     {
     for (unsigned int j = 0;j<=vokal.length();j++)  //hier muss fehler liegen
     {
       //wenn ich hier ein cout<<vokal[j] zum test ausgebe, kommt nur "a" 
       if (wort[i]==vokal[j])
       {
        flag=1;   //falls ein Vokal
      }
      if(flag==1)
      show+="v";
      else
      show+="k";
      flag=0;
     }
    cout<<wort<<endl;
    cout<<show<<endl; 
    getch();
    return 0;
    }
    

    Gruss
    Difu



  • ahhh zu spät, ja danke das geht!

    Kannst es mir etwas genauer erklären?



  • mal ne andere Idee: wie wär's wenn Du ne Funktion schreibst, die bei Übergabe eines Konsonanten ein k zurückgibt und bei nem Vokal v. Dann benutzt Du einfach transform auf den string.
    Dann mußt Du die Schleife nicht selber schreiben.



  • bin noch bissl anfänger!

    ALso wie meinst das jester?
    wie soll die fkt aussehen?

    Brauch ich nich immer ne schleife?

    Und was is transform?



  • #include <string>
    #include <iostream>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    char toVowelOrConsonant(char c)
    {
      switch(c)
      {
      case 'a':
      case 'e':
      case 'i':
      case 'o':
      case 'u':
        return 'v';
      }
      return 'k';
    }
    
    int main()
    {
      string word;
      cin >> word;
    
      string result;
      transform(word.begin(), word.end(), back_inserter(result), toVowelOrConsonant);
    
      cout << result;
    }
    

    ungetestet. 🙂



  • naja das mit dem transform mach ich später mal, bin soweit im stoff noch nicht 🙂

    Aufjedenfall funktioniet das jetzt erstmal soweit, nun möchte ich nach jedem voakl einen bindestrich...

    Wie kann ich den reinbauen?

    wort.insert(i+1,"-"); //i+1,weil das nach der stelle wo übereinstimmung ist
    

    geht es nicht, da wird ne endlosschleife draus

    PS: habe auch einen neuen string gemacht(weil oben ja auf wort.length() geprüft wird), wird aber auch endlosschleife!



  • Wieso hängst du nicht einfach statt nur dem 'v' ein "v-" an?

    Also statt

    ...
    show += 'v';
    ...
    

    so:

    ...
    show += "v-";
    ...
    

    Caipi



  • weil nich in den show string sondern in das richtige wort die striche rein sollen!

    ALso HAllo zu Ha-llo...



  • Wie wär's mit sowas:

    string result;
    
    for(size_t i=0; i1=word.length(); ++i)
    {
      result += word[i];
      if(isVowel(word[i])
      {
        result += '-';
      }
    }
    

    MfG Jester



  • das probier ich mal aus!

    Kann mir aber jmd mal sagen, wieso das bei meiner schleife mit dem insert() nicht geht?



  • Oh, dann habe ich dich wohl falsch verstanden.
    Ansonsten denke ich mal, dass es so wie du es dir gedacht hast, laufen müsste.

    Ansonsten vergleiche auch eventuell hier:

    int main(int argc, char* argv[])
    {
            cout << "\n Wort eingeben: ";
            string input, output(""), vokal("aeiou");
            getline(cin, input);
    
            for(unsigned int i = 0; i < input.length(); ++i)
            {
                    bool isVokal = false;
                    for(unsigned int j = 0; j < vokal.length(); ++j)
                    {
                            if(input[i] == vokal[j])
                            {
                                    output += 'v';
                                    input.insert(i + 1, "-");
                                    isVokal = true;
                            }
                    }
    
                    if(!isVokal && isalpha(input[i]))
                            output += 'k';
                    else if(isspace(input[i]))
                            output += ' ';
            }
    
            cout << "\n input:  " << input;
            cout << "\n output: " << output << endl;
    
            return 0;
    }
    

    Caipi


Anmelden zum Antworten