Zahl in Wort umwandeln
-
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.
-
Folgender Code funktioniert einwandfrei und lässt sich ohne Warnung mit CodeBlocks und Visual Studio 2008 kompilieren
#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); }
-
ttf schrieb:
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.Jaja, so nen Compiler zu benutzen, ist schon schwierig. Sonst würdest du merken, dass sich mein Code kompilieren lässt.
wtf schrieb:
Beat this!
Kein Problem, e[30] ist überflüssig, using namespace std; spart zwei Token und int i = 0 spart ebenfalls zwei Token ggü. unsigned int i(0); :p
-
Jaja, so nen Compiler zu benutzen, ist schon schwierig. Sonst würdest du merken, dass sich mein Code kompilieren lässt.
So ist es funktionsfahig.
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?string("Null"):e[32]; }
-
Jetzt kommt mal alle wieder runter.
Letztendlich habt ihr ja nur den optimalsten und schönsten Code von "zähler" kopiert und etwas zusammengefrickelt ohne euch dafür zu schämen.
-
beurteiler schrieb:
Jetzt kommt mal alle wieder runter.
Letztendlich habt ihr ja nur den optimalsten und schönsten Code von "zähler" kopiert und etwas zusammengefrickelt ohne euch dafür zu schämen.
-
beurteiler schrieb:
Jetzt kommt mal alle wieder runter.
Letztendlich habt ihr ja nur den optimalsten und schönsten Code von "zähler" kopiert und etwas zusammengefrickelt ohne euch dafür zu schämen.ach komm, das geht schon noch ein bisschen 'schöner' und 'optimaler' und zählers ansatz ist auch nicht 'neu'.
-
ach komm, das geht schon noch ein bisschen 'schöner' und 'optimaler'...
... zeig mal.
...und zählers ansatz ist auch nicht 'neu'
Theoretisch nicht aber praktisch schon.
-
beurteiler schrieb:
... zeig mal.
Nö. :p
Denn deine Meinung steht ja schon fest:"...optimalsten und schönsten Code..."