Zahl in Wort umwandeln



  • kein kOMMENTARFÜR DEIN [edit]

    VIELEN DANK FÜR DIE HILFE



  • nami22 schrieb:

    ICH KONNTE ES LÖSEN

    Verdammt! Gerade wo es so spannend wurde. Na ja, nutze ich die Regenpause um einkaufen zu gehen ... 😃

    Die nächste Aufgabe kommt bestimmt ...



  • egon2 schrieb:

    nami22 schrieb:

    MFG
    nami :p

    Mein Vorschlag:

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main()
    {
    	const string zahlen("null eins zwei drei vier fünf "
    		"sechs sieben acht neun zehn elf zwölf");
    	istringstream is(zahlen);
    	int zahl  = 13;
    	cout << "Bitte eine Zahl eingeben (0 - 12)" << endl;
    	cin >> zahl;
    	string ausgabe;
    	if (zahl > -1 && zahl < 13)
    		do
    	    {
    			is >> ausgabe;
    		}while(zahl--);
    	else
    		ausgabe = "ungueltig!";
    	cout << "Eingabe war " << ausgabe << "." << endl;
    	return 0;
    }
    

    😉
    mfg

    Wozu braucht man die Bibliothek sstream?



  • Shivan schrieb:

    Wozu braucht man die Bibliothek sstream?

    Für std::stringstream s. Siehe in dem von dir geposteten Code die folgenden Codezeilen:

    istringstream is(zahlen);
    /* ... */
    is >> ausgabe;
    

    Weitere Infos: http://www.cplusplus.com/reference/iostream/stringstream/



  • nami22 schrieb:

    DANKE VIEL MAL VIEL VIEL MAL ICH KONNTE ES LÖSEN ICH SCHULDE DIR WAS

    MFG NAMI

    Ich? *hust hust*



  • Danke Mizar 🙂



  • [edit]wie dumm mus man sein xD
    Nimmt mich under welcher idiot von unserer klasse das war ...
    ***Yv.....***

    mfg
    emanuell



  • Nein es war nicht Yves^^



  • Hier ist ein Code der auch wirklich funktioniert, doch ich verstehe nicht alles, kann mir jemand helfen?

    #include <iostream> 
    #include <string> 
    
    using namespace std; 
    
    string unter20(unsigned long wert, bool eins) 
    { 
      switch(wert) 
        { 
          case 1: 
            if(eins) 
              return("eins"); 
            else 
              return("ein"); 
          case 2: return("zwei"); 
          case 3: return("drei"); 
          case 4: return("vier"); 
          case 5: return("fuenf"); 
          case 6: return("sechs"); 
          case 7: return("sieben"); 
          case 8: return("acht"); 
          case 9: return("neun"); 
          case 10: return("zehn");
          case 11: return("elf"); 
          case 12: return("zwoelf"); 
          case 13: return("dreizehn"); 
          case 14: return("vierzehn"); 
          case 15: return("fuenfzehn"); 
          case 16: return("sechszehn"); 
          case 17: return("siebzehn"); 
          case 18: return("achtzehn"); 
          case 19: return("neunzehn"); 
          default: return("Fehler!"); 
        } 
    } 
    
    string zehner(unsigned long wert) 
    { 
      switch(wert/10) 
        { 
          case 2: return("zwanzig"); 
          case 3: return("dreissig"); 
          case 4: return("vierzig"); 
          case 5: return("fuenfzig"); 
          case 6: return("sechzig"); 
          case 7: return("siebzig"); 
          case 8: return("achtzig"); 
          case 9: return("neunzig"); 
          default: return("Fehler!"); 
        }
    } 
    
    string unter100(unsigned long wert,bool eins)
    { 
      string s="";      
      if(wert<20) 
        return(unter20(wert,true)); 
    
      if(wert%10)      //wert%10  Was bewirkt dies?
        return(unter20(wert%10,false)+"und"+zehner(wert));  //wird +"und"+ nur gebraucht um das und reinzumachen?
      else 
        return(zehner(wert)); 
    } 
    
    string zuWort(unsigned long wert) 
    { 
      if(wert==0) 
        return("Null"); 
    
      string s=unter100(wert,true); 
      s[0]=toupper(s[0]);  //Was passiert hier?
      return(s);
    } 
    
    int main() 
    { 
    unsigned long wert; 
    
      cout << "Bitte Zahl eingeben (0 - 99):"; 
      cin >> wert; 
      cout << zuWort(wert) << endl; 
    
    fflush(stdin);
    getchar(); 
    return 0; 
    }
    

    Ich habe die verschiedenen Stellen markiert, bei denen ich Probleme habe, wäre echt nett, wenn mir jemand helfen könnte.

    MfG Shivan



  • if(wert % 10) // wert%10  Was bewirkt dies?
    

    Das ist der Modulo-Operator. Es ist eine Division, aber als Ergebnis erhält man den Rest eben dieser.

    return(unter20(wert % 10, false) + "und" + zehner(wert)); //wird +"und"+ nur gebraucht um das und reinzumachen?
    

    Jo, der Ausdruck "unter20(wert % 10, false)" repräsentiert einen std::string. Auf diesen kann der + Operator angewandt werden, somit können damit Strings verkettet werden. ( http://www.cplusplus.com/reference/string/operator+/ ).

    s[0] = toupper(s[0]); // Was passiert hier?
    

    Indexoperator ist dir klar? Dann http://www.cplusplus.com/reference/clibrary/cctype/toupper/



  • nimm doch ma nen debugger und guck es dir an?!

    bb



  • Danke, hat sehr geholfen! 🙂

    unskilled schrieb:

    nimm doch ma nen debugger und guck es dir an?!

    bb

    Hmm.. hab den glaub ich noch nie verwendet, wie funktioniert das?



  • #include <iostream>
    
    using namespace std;
    string IntAsString(int zahl)
    {
       string u20[20]={"Null","Ein","Zwei","Drei","Vier","Fuenf","Sechs","Sieben","Acht","Neun","Zehn","Elf","Zwoelf","Dreizehn","Vierzehn","Fuenfzehn","Sechzehn","Siebzehn","Achtzehn","Neunzehn"};
       string zehner[9]={"Zwanzig","Dreissig","Vierzig","Fuenfzig","Sechzig","Siebzig","Achtzig","Neunzig"};
       if(zahl<20)
       {
          if(zahl==1) return u20[zahl]+"s";
          return u20[zahl];
       }
       else
       {
          int zi=zahl/10-2;
          if (zahl%10)
          {
             string ausgabe=u20[zahl%10];
             string z=zehner[zi];
             z[0]=tolower(z[0]);
             return ausgabe+"und"+z;
          }
          return zehner[zi];
       }
    }
    int main(int argc, char* argv[])
    {
       for(int i=0;i<100;i++)
       {
          cout << IntAsString(i) << endl;
       }
       return 0;
    }
    


  • Auja, ein Wettbewerb, wer es kürzer hinbekommt:

    #include <iostream>
    #include <string>
    using namespace std;
    
    string foo(int i)
    {
    	string e[]={"","ein","zwei","drei","vier","fuenf","sechs","sieben","acht","neun","zehn","elf","zwoelf","dreizehn","vierzehn","fuenfzehn","sechzehn","siebzehn","achtzehn","neunzehn"};
    	string z[]={"","","zwanzig","dreissig","vierzig","fuenfzig","sechzig","siebzig","achtzig","neunzig"}; 
    	string u[]={"","und",""};
    	return u[2]=e[i>19?i%10:i]+(i==1?"s":"")+u[i%10&&i>20?1:0]+z[i/10],u[2][0]=toupper(u[2][0]),i==0?"Null":u[2];
    }
    
    int main()
    {
    	for(int i = 0; i < 100; ++i)
    		cout << foo(i) << endl;
    }
    

    😉



  • Jetzt könnte man noch aus den 3 arrays eins machen und schon hat man eine zweizeilige funktion. Das Gesicht des Profs will ich sehn 😃



  • Auja, ein Wettbewerb, wer es kürzer hinbekommt:

    Ja aber dann müsste man sich auch die Mühe machen, und mal einen Compiler versuchsweise drüberlaufen lassen. 😃



  • wtf schrieb:

    Jetzt könnte man noch aus den 3 arrays eins machen und schon hat man eine zweizeilige funktion. Das Gesicht des Profs will ich sehn 😃

    Hast Recht 🙂

    string foo(int i)
    {
    	string e[]={"","ein","zwei","drei","vier","fuenf","sechs","sieben","acht","neun","zehn","elf","zwoelf","dreizehn","vierzehn","fuenfzehn","sechzehn","siebzehn","achtzehn","neunzehn","","","zwanzig","dreissig","vierzig","fuenfzig","sechzig","siebzig","achtzig","neunzig","","und",""};
    	return e[32]=e[i>19?i%10:i]+(i==1?"s":"")+e[i%10&&i>20?31:30]+e[i/10+20],e[32][0]-='a'-'A',i==0?"Null":e[32];
    }
    


  • Beat this!

    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string e[]={"","ein","zwei","drei","vier","fuenf","sechs","sieben","acht","neun","zehn","elf","zwoelf","dreizehn","vierzehn","fuenfzehn","sechzehn","siebzehn","achtzehn","neunzehn","","","zwanzig","dreissig","vierzig","fuenfzig","sechzig","siebzig","achtzig","neunzig","","und",""};
        for(unsigned int i(0); i != 100 && std::cout<<(e[32]=e[i>19?i%10:i]+(i==1?"s":"")+e[i%10&&i>20?31:30]+e[i/10+20],e[32][0]-='a'-'A',i==0?"Null":e[32])<<std::endl; ++i);
    }
    


  • tff schrieb:

    Auja, ein Wettbewerb, wer es kürzer hinbekommt:

    Ja aber dann müsste man sich auch die Mühe machen, und mal einen Compiler versuchsweise drüberlaufen lassen. 😃

    ebenfalls beides nicht lauffähig...
    Wenn man schon die if's weglassen muss dann auch bitte richtig.



  • Ja oder aber einen Compiler verwenden, der es nicht so genau mit der Syntax nimmt und die Typumwandlung selbst implementiert.


Anmelden zum Antworten