Umdrehen einer switch Anweisung? -->Reihung?
-
eine mögliche lösung wäre jede ziffer einzeln in ein integer zu speichern und dann ein paar switches drüberlaufen zu lassen. das wäre eine sehr einfache möglichkeit. das könnte dann zB in etwa so aussehen:
#include<iostream> using namespace std; int main() { cout<<"Bitte geben Sie die Zahl Ziffernweise ein!\n"; int ziffer1,ziffer2,ziffer3; cin>>ziffer1; cin>>ziffer2; cin>>ziffer3; //ziffer1 ermitteln: switch(ziffer1) { case 0: cout<<"Null "; break; case 1: cout<<"Eins " break; //...(für alle fälle von 0-9 durch) } //dasselbe für die ziffern 2 und 3 }vielleicht nicht unbedingt die eleganteste Lösung, aber eine relativ einfache Möglichkeit.
alternativ kannst du, wenn du willst dass der user die zahl nicht ziffernweise eingeben muss, das problem auch so lösen:
(den code habe ich jedoch noch nicht getestet!)#include<iostream> #include<string> using namespace std; int main() { cout<<"Bitte geben Sie die Zahl ein\n"; char zahl[100];//ja char als typ ist absicht wegen strlen später cin>>zahl; int länge; länge=strlen(zahl);//ermittelt stellenanzahl der zahl; string zahl_neu=zahl;//wandelt zahl in string um //stelle1 ermitteln: int stelle1; stelle1=left(länge-1);/*schneidet alles außer 1. stelle ab und speichert diese*/ //letzte stelle ermitteln: int letzte_stelle; letzte_stelle=right(länge-1);/*schneidet alles außer letzter atelle ab und speichert*/ //2. stelle ermitteln: int stelle2; string zwischenspeicherung_1; zwischenspeicherung_1=left(länge-2);/*schneidet alles außer ersten 2 ziffern ab*/ stelle2=right(länge-1);/*sch neidet erste stelle noch gar ab*/ //weiter mit anderen stellen //... //code von 1. möglichkeit }diese möglichkeit wäre zwar wesentlich komplizierter, aber der user müsste die zahl nicht in zifern eingeben.
mfg,
andi01.
-
Was soll das Programm denn mal machen? Davon abhängig ist das Vorgehen; ich fürchte, die Vorschläge hier passen allesamt wie ein runder Hut auf einen viereckigen Kopf.
-
schonmal vielen Dank für die Tipps!
@ Andi01: Dein erster Vorschlag gefällt mir, da ich Ihn direckt verstanden habe. Allerdings soll die Zahl nicht in Ziffern eingegeben werden und beliebiger Länge sein!
Das passt dein zweiter Vorschlag schon besser und ich versuche grade da durchzusteigen

Vielen Dank

@ volkard:
Die Aufgabenstellung lautet jediglich:
Entwickel ein Programm welches eine Zahl in folgende Art und Weise umschreibt:
Bsp.: 432 --> vier drei zwei
Zahl beliebig! nicht nur dreistellig!LG
Chris
-
also vom User ist eine Zahlenfolge einzugeben
-
cknopp schrieb:
schonmal vielen Dank für die Tipps!
@ Andi01: Dein erster Vorschlag gefällt mir, da ich Ihn direckt verstanden habe. Allerdings soll die Zahl nicht in Ziffern eingegeben werden und beliebiger Länge sein!
Das passt dein zweiter Vorschlag schon besser und ich versuche grade da durchzusteigen

Vielen Dank

@ volkard:
Die Aufgabenstellung lautet jediglich:
Entwickel ein Programm welches eine Zahl in folgende Art und Weise umschreibt:
Bsp.: 432 --> vier drei zwei
Zahl beliebig! nicht nur dreistellig!LG
ChrisDie Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?
#include <iostream> #include <string> std::string gibNamen(char c); int main() { std::cout<< "Bitte eine Zahl eingeben:" << std::endl; std::string zahl; std::cin >> zahl; for (unsigned int i = 0; i < zahl.length(); ++i) { std::cout << gibNamen(zahl[i]) << " "; } std::cout << std::endl; return 0; } std::string gibNamen(char c) { switch (c) { case '0': return "null"; case '1': return "eins"; 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"; } return "<error>"; }
-
cknopp schrieb:
@ volkard:
Die Aufgabenstellung lautet lediglich:
Entwickle ein Programm, welches eine Zahl in folgende Art und Weise umschreibt:
Bsp.: 432 --> vier drei zwei
Zahl beliebig! Nicht nur dreistellig!Dann würde ich den Aufrufstack zum Umdrehen benutzen.
void sprich(int zahl) { if(zahl>=10) sprich(zahl/10); switch(zahl%10) { case '0': cout<<"null "; break; case '1': cout<<"eins "; break; ... case '9': cout<<"neun "; break; } } int main() { //zahl eingeben lassen sprich(zahl); }
-
BBBB schrieb:
Die Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?
Ich nehme an, daß / und % geübt werden sollten.
Und das switch statt eines Arrays auch nur deswegen, weil Arrays noch nicht dran waren.
-
volkard schrieb:
BBBB schrieb:
Die Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?
Ich nehme an, daß / und % geübt werden sollten.
Und das switch statt eines Arrays auch nur deswegen, weil Arrays noch nicht dran waren.Verstehe

-
volkard schrieb:
BBBB schrieb:
Die Lösungen sind alle viel zu kompliziert... Warum macht ihr es euch so schwer?
Ich nehme an, daß / und % geübt werden sollten.
Und das switch statt eines Arrays auch nur deswegen, weil Arrays noch nicht dran waren.Arrays sind doch Reihungen, oder?
Damit haben wir jetzt grade angefangen....dennoch sagt mir dieses std:: im Quellcode von BBBB gar nichts

-
Ist das denn eine Übung zu Arrays, wenn ihr diese gerade behandelt? Dann wird wahrscheinlich erwartet, dass du das switch-Konstrukt entsprechend ersetzt.
cknopp schrieb:
dennoch sagt mir dieses std:: im Quellcode von BBBB gar nichts

cin/cout/string/usw. liegen im Namespace std. Wahrscheinlich habt ihr das noch nicht durchgenommen, aber letztendlich erfordert es, dass man std::cout etc. schreibt (oder using namespace std; irgendwo an den Anfang schreibt). Dein erstes Beispiel dürfte also eigentlich nicht kompilieren.
#include <iostream> using namespace std; int main() { cout << "Geben Sie bitte eine Zahl ein: "; string zahl; cin >> zahl; static const char* zahlen[]={"null","eins","zwei","drei","vier","fuenf","sechs","sieben","acht","neun"}; for (string::iterator it=zahl.begin(),e=zahl.end();it!=e;it++)if (*it>='0' && *it<='9')cout << zahlen[*it-'0'] << ' '; //Edit: obige Zeile ohne Iteratoren: //for (unsigned i=0;i<zahl.length();i++)if (zahl[i]>='0' && zahl[i]<='9')cout << zahlen[zahl[i]-'0'] << ' '; }
-
Das klappt aber nur bei ASCII oder ähnlich aufgebauten Kodierungen.
-
hier ist noch eine relativ einfache lösung:
#include<iostream> #include<conio.h> #include<string> #include<sstream> using namespace std; void umschreiben(int); int main() { cout<<"Bitte geben Sie die Zahl ein!\n"; string zahl; cin>>zahl; int länge=zahl.length(); int zahl_neu[30]; stringstream sstr; for(int a=0;a<länge;a++) { sstr<<zahl[a]; sstr>>zahl_neu[a]; sstr.clear(); } for(int a=0;a<länge;a++) { umschreiben(zahl_neu[a]); } getch(); } void umschreiben(int ziffer) { switch(ziffer) { case 0: cout<<"Null "; break; case 1: cout<<"Eins "; break; case 2: cout<<"Zwei "; break; case 3: cout<<"Drei "; break; case 4: cout<<"Vier "; break; case 5: cout<<"Fünf "; break; case 6: cout<<"Sechs "; break; case 7: cout<<"Sieben "; break; case 8: cout<<"Acht "; break; case 9: cout<<"Neun "; break; } }Das sollte so ziemlich die einfachste und verständlichste möglichkeit sein.
Dieses std:: im Code von BBBB kann auch einfach weggelassen werden, es steht für standard.
-
andi01 schrieb:
... char zahl[100]; cin>>zahl; ...Mit so etwas fangen wir bitte erst gar nicht an. Dafür gibt es doch std::string!
Gruß,
SP
-
jo kleiner fehler von mir
ich bessere das gleich mal aus.edit: hoppla noch ein kleiner fehler, mein obiger code funktioniert nur für einstellige zahlen
. aber den fehler werde ich auch noch finden...
-
David_pb schrieb:
Das klappt aber nur bei ASCII oder ähnlich aufgebauten Kodierungen.
Nenn mir eine andere!
-
so der folgende Code wurde jetzt von mir überarbeitet und getestet und funktioniert einwandfrei!
#include<iostream> #include<conio.h> #include<string> #include<sstream> using namespace std; void umschreiben(int); int main() { cout<<"Bitte geben Sie die Zahl ein!\n"; string zahl; cin>>zahl; int länge=zahl.length(); int zahl_neu[30]; stringstream sstr; for(int a=0;a<länge;a++) { sstr<<zahl[a]; sstr>>zahl_neu[a]; sstr.clear(); } for(int a=0;a<länge;a++) { umschreiben(zahl_neu[a]); } getch(); } void umschreiben(int ziffer) { switch(ziffer) { case 0: cout<<"Null "; break; case 1: cout<<"Eins "; break; case 2: cout<<"Zwei "; break; case 3: cout<<"Drei "; break; case 4: cout<<"Vier "; break; case 5: cout<<"Fünf "; break; case 6: cout<<"Sechs "; break; case 7: cout<<"Sieben "; break; case 8: cout<<"Acht "; break; case 9: cout<<"Neun "; break; } }Damit sollte dein Problem gelöst sein!
mfg,
andi01.
-
andi01 schrieb:
so der folgende Code wurde jetzt von mir überarbeitet und getestet und funktioniert einwandfrei!
int main() { cout<<"Bitte geben Sie die Zahl ein!\n"; string zahl; cin>>zahl; int länge=zahl.length(); int zahl_neu[30]; stringstream sstr; for(int a=0;a<länge;a++) { sstr<<zahl[a]; sstr>>zahl_neu[a]; sstr.clear(); } for(int a=0;a<länge;a++) { umschreiben(zahl_neu[a]); } }Ich weiß ja nicht...
int main() { cout<<"Bitte geben Sie die Zahl ein!\n"; int zahl; cin>>zahl; sage(zahl); }
-
ok, mein code ist vielleicht etwas kompliziert, das liese sich wahrscheinlich auch einfacher lösen.
nur wie soll das mitint main() { cout<<"Bitte geben Sie die Zahl ein!\n"; int zahl; cin>>zahl; sage(zahl); }funktionieren? der Funktion sage() muss wenn man es mit switches lösen will doch jede ziffer einzeln übergeben werden und nicht die ganze zahl, oder? genau deswegen ist mein code ja etwas komplizierter. ob man den teil mit dem zerlegen in die einzelnen ziffern in sage() verschiebt oder in main() lässt ist do eigentlich egal,oder?
aber immerhin, der code funktioniert schonmal, auch wenn er etwas kompliziert ist

-
Auch getestet.
#include <iostream> using namespace std; void sage(int zahl) { if(zahl>=10) sage(zahl/10); switch(zahl%10) { case 0: cout<<"null "; break; case 1: cout<<"eins "; break; case 2: cout<<"zwei "; break; case 3: cout<<"drei "; break; case 4: cout<<"vier "; break; case 5: cout<<"fünf "; break; case 6: cout<<"sech "; break; case 7: cout<<"sibn "; break; case 8: cout<<"acht "; break; case 9: cout<<"neun "; break; } } int main() { cout<<"Bitte geben Sie die Zahl ein!\n"; int zahl; cin>>zahl; sage(zahl); }
-
cin/cout/string/usw. liegen im Namespace std. Wahrscheinlich habt ihr das noch nicht durchgenommen, aber letztendlich erfordert es, dass man std::cout etc. schreibt (oder using namespace std; irgendwo an den Anfang schreibt). Dein erstes Beispiel dürfte also eigentlich nicht kompilieren.
Wir haben bisher immer mit <iostrem.h> und nicht <iostream> gearbeitet!
Warum ka?
Allerdings sind dann die Information für z.B cout, cin schon drin.LG
Chris