Schreiben Sie ein Programm, das eine vierstellige ganze Zahl einliest und ihre sprachliche Repräsentation ausgibt.
-
Hallo, ich habe zwar dieses Program schon geschrieben, funktioniert es, aber ich môchte fragen, ob ich das noch anders schreiben kann, zum Beispiel einfacher, danke.
#include <iostream> using namespace std; int main() { int m, z1, z2, z3, z4; cout << "Bitte, geben sie eine vierstellige ganze Zahl ein: " << endl; cin >> m; if (m > 9999 || m < 1000) { cout << "Die Zahl muss vierstellig sein. " << endl; return 0; } switch(z1 = m/1000) { case 0: cout << " null " << endl; break; case 1: cout << " eins " << endl; break; case 2: cout << "zwei " << endl; break; case 3: cout << "drei " << endl; break; case 4: cout << "vier " << endl; break; case 5: cout << "funf " << endl; break; case 6: cout << "sechs " << endl; break; case 7: cout << "sieben " << endl; break; case 8: cout << "acht " << endl; break; case 9: cout << "neun " << endl; break; default: cout << "zahl ist falsch. "; } switch(z2 = (m%1000)/100) { case 0: cout << " null " << endl; break; case 1: cout << " eins " << endl; break; case 2: cout << "zwei " << endl; break; case 3: cout << "drei " << endl; break; case 4: cout << "vier " << endl; break; case 5: cout << "funf " << endl; break; case 6: cout << "sechs " << endl; break; case 7: cout << "sieben " << endl; break; case 8: cout << "acht " << endl; break; case 9: cout << "neun " << endl; break; default: cout << "zahl ist falsch. "; } switch(z3 = (m%100)/10) { case 0: cout << " null " << endl; break; case 1: cout << " eins " << endl; break; case 2: cout << "zwei " << endl; break; case 3: cout << "drei " << endl; break; case 4: cout << "vier " << endl; break; case 5: cout << "funf " << endl; break; case 6: cout << "sechs " << endl; break; case 7: cout << "sieben " << endl; break; case 8: cout << "acht " << endl; break; case 9: cout << "neun " << endl; break; default: cout << "zahl ist falsch. "; } switch(z4 = m%10) { case 0: cout << " null " << endl; break; case 1: cout << " eins " << endl; break; case 2: cout << "zwei " << endl; break; case 3: cout << "drei " << endl; break; case 4: cout << "vier " << endl; break; case 5: cout << "funf " << endl; break; case 6: cout << "sechs " << endl; break; case 7: cout << "sieben " << endl; break; case 8: cout << "acht " << endl; break; case 9: cout << "neun " << endl; break; default: cout << "zahl ist falsch. "; } return 0; }
Edit durch Arcoth: Code-Tags
-
Was Du gebaut hast, wäre stark kürzbar, so etwa
const char* table[]={"null","eins","zwei"... do print(table[z/10]); while(z/=10); //Ups, Ausgabe umdrehen oder Eingabe oder (per Rekursion) den Ablauf.
Ähm, es soll aber doch "Eintausend und Dreihundertundvierundfünfig" sagen, oder? Das wäre ein Bißchen spannender.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo evam88,
Willkommen im C++-Forum.
Es ist schon mehr als 10 Jahre her, da hatten wir das Thema 'Umwandlung von Zahlen Klartext' schon mal - leider nur in englisch. In deutsch ist es ein wenig schwieriger.
evam88 schrieb:
... aber ich môchte fragen, ob ich das noch anders schreiben kann, zum Beispiel einfacher
ja sicher - genau wie volkard schon angedeutet hat:
volkard schrieb:
Was Du gebaut hast, wäre stark kürzbar, so etwa
const char* table[]={"null","eins","zwei"... do print(table[z/10]); while(z/=10); //Ups, Ausgabe umdrehen oder Eingabe oder (per Rekursion) den Ablauf.
mit Rekursion geht's:
#include <iostream> std::ostream& zahl_nach_klartext( std::ostream& out, int zahl ) { const char* ziffern[] = { "null", "eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "(8)", "neun", }; auto prev = zahl / 10; if( prev > 0 ) zahl_nach_klartext( out, prev ); return out << ziffern[ zahl % 10 ] << " "; } int main() { using namespace std; for( int zahl; cout << "\nBitte, geben sie eine ganze Zahl ein: ", cin >> zahl; ) zahl_nach_klartext( cout, zahl ) << endl; }
volkard schrieb:
Ähm, es soll aber doch "Eintausend und Dreihundertundvierundfünfig" sagen, oder? Das wäre ein Bißchen spannender.
das sehe ich auch so; und da wird die Aufgabe erst interessant.
Gruß
Werner
-
Wieder mal ein Einzeiler von mir:
DreitausendvierhundertundeinundzwanzigEDIT (verkürzt):
DreitausendvierhunderteinundzwanzigEDIT #2:
Elf, ZwölfEDiT #3:
sieben -> siebzehnAlles nicht so trivial. Jede Menge Sonderfälle in der deutschen Sprache.
Gruß an Rapsoel.
-
Da dachte ich, ich könnte ganz clever sein: Das Problem auf Englisch lösen - was schließlich viel einfacher ist - und dann von Google übersetzen lassen. Doch Google gibt einem dann die Zifferndarstellung als Übersetzung
Nee, auf Deutsch ist mir das zu viel Handarbeit. Das ist ja eher eine Fleißaufgabe.
-
1111 -> Eintausendeinhundertelf
Das ist wirklich eine Fleißaufgabe alle Fälle abzudecken.
EDIT:
Sind mir noch schöne Beispiele eingefallen:1117 - Eintausendeinhundertsiebzehn
1711 - Eintausendsiebenhundertelf
-
Nicht perfekt - aber fast:
std::string zahlAlsText(unsigned int zahl) { static std::vector<std::string> einer = {"null", "ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun"}; static std::vector<std::string> elfBis19 = {"elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn", "siebzehn", "achtzehn", "neunzehn"}; static std::vector<std::string>dieZehner = {"zehn", "zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig"}; if (zahl == 0) { return "null"; } if (zahl > 999999) { return "Zahl ist zu groß für dieses Programm"; } std::string alles; int nr = 0; while (zahl > 0) { std::string erg; int tausendergruppe = zahl % 1000; int hunderter = tausendergruppe / 100; if (hunderter > 0) { erg += einer[hunderter] + "hundert"; } int x = tausendergruppe % 100; // die letzten 2 Stellen if (x > 0 && x < 10) { erg += einer[x]; } else if (x > 10 && x < 20) { erg += elfBis19[x - 11]; } else if (x > 0 && x % 10 == 0) { // glatter Zehner erg += dieZehner[x / 10 - 1]; } else if (x > 20 && x < 100) { erg += einer[x % 10] + "und" + dieZehner[x / 10 - 1]; } // else (kann nur 0 sein, nichts tun) zahl /= 1000; if (x == 1 && !(hunderter == 0 && nr == 1)) // Ausnahme eintausend erg += "s"; if (nr++ == 1) erg += "tausend"; alles.insert(0, erg); } return alles; }