Zahlen in Textform ausgeben
-
Sers Leutz,
ich habe folgende Aufgabe bekommen. Es können Zahlen von 0-100 eingegeben werden und anschließend in gesprochener Form wieder ausgegeben werden.
Bsp: 22 = zweiundzwanzig oder 13 = dreizehnLaut Aussage meines Vorgesetzten ist das ganze mit Arrays, Pointern usw. lösbar. Leider komme ich hier auf keinen Lösungsansatz. Ich danke schonmal für eure hilfe.
-
Sowas habe ich vor Jahren mal in Pascal gelöst (im Rahmen des Bundeswettbewerb Informatik):
Du zerlegst die Zahl in handliche Teile (Hunderter, Zehner, Einer) mittels / und %, dann suchst du in entsprechenden Arrays die Bezeichnungen der jeweiligen Teile zusammen und hängst sie mit Füllwörtern ("hundert" bzw. "und") zusammen.
-
ja das macht Sinn. Allerdings wollte ich fragen, ob du mir das nicht ein wenig genauer erklären kannst. Ich wäre dir sehr verbunden. Vielen Dank.
-
gijoe schrieb:
Sers Leutz,
ich habe folgende Aufgabe bekommen. Es können Zahlen von 0-100 eingegeben werden und anschließend in gesprochener Form wieder ausgegeben werden.
Bsp: 22 = zweiundzwanzig oder 13 = dreizehnIch weiss nicht ob auch ich Dir helfen kann, bin selbst noch Anfaenger. Aber ich wuerde das auch so so in der Art anpacken ...
Zahlen > 99 haben was mit dem Wort Hundert zu zun, also z. B. FUENF - HUNDERT oder SECHS - HUNDERT ...
Bei Zahlen > 10 aber < 100 gehts dan umgekehrt, da faengt es mit dem hinteren Teil an, also zum Beispiel EIN - UND - FUENFZIG fuer die 51 oder EIN - UND - ACHTZIG ...
Verbeleiben noch die 'Sonderfaelle' 11 - 19 und 10, 20, 30, 40 ... und natuerlich die Ziffern 0 -9 uebrig ....
Pointer sind mit mittlerweile zumindest in der Theorie recht gelaeufig, aber inwieweit hier Pointer hilfreich sein koennten, das entzieht sich meiner Kenntnis nun total ...
-
Ich hab mich mal etwas umgesehen und tatsächlich beim BWINF eine Musterlösung gefunden (ist zwar Pascal und tauglich bis zu 6 Stellen, aber das Prinzip sollte klar werden): http://www.bwinf.de/uploads/media/download/161aufgaben.pdf (die Musteraufgabe auf Seite 3).
-
Vielen Dank Leute für eure mithilfe. Wenn alle Foren so
wären, dann würde die Foren-Welt viel besser aussgehen.
Nochmals Vielen Dank.
-
die Vorlage mit dem Pascal-Programmcode ist ja schon super. Allerdings
stellt sich jetzt schon wieder eine Frage. In Pascal kann man scheinbar
ohne Probleme Strings in Arrays speichern. In "C" kann mann ja nur Chars
in einen Array-Speicherplatz abspeichern.Leider finde hier keinen Lösungsansatz. Wie bekomme ich die Textform
der Zahlen in einen Array-Speicherplatz gespeichert. Ich bitte nochmals
um Hilfe und schonmal vielen Dank im voraus.Gruß GiJoe
-
In C wird ein String als char-Array verwaltet, allerdings (leider) ohne den Komfort, den Pascal-Strings anbieten. Da mußt du schon manuell genug Platz bereitstellen und die Strings mit strcat() zusammenbauen.
(wenn du nicht unbedingt auf C festgelegt bist, verwende lieber C++ und std::string)
-
so ich habe mal versucht das ganze zu lösen. Bei den Zahlen von 1-100 funktioniert das ganze eigentlich ganz gut. Jetzt habe ich versucht, dass ganze bis 1000 zu programmieren aber von 100-1000 gibt das Programm ganz schön viel Mist aus.
Hier mal der Code:
int getNumber() { int number = 0; char value = '0'; while (value != 13) { value = getch(); switch (value) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': number = number * 10 + value - '0'; printf("%c", value); break; } } return number; } int _tmain(int argc, _TCHAR* argv[]) { unsigned char lowArray[20][10] = {"null", "ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", "sechszehn", "siebzehn", "achtzehn", "neunzehn"}; char zigArray[8][10] = {"zwanzig", "dreißig", "vierzig", "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig"}; char hundertArray[9][20] = {"einhundert", "zweihundert", "dreihundert", "vierhundert", "fünfhundert", "sechshundert", "siebenhundert", "achthundert", "neunhundert"}; int saveNumber = -1; while (saveNumber != 0) { printf("Geben Sie eine Zahl von 1-100 ein: "); saveNumber = getNumber(); if (saveNumber <= 19) printf("\n%s\n", lowArray[saveNumber]); else if (saveNumber >= 20 && saveNumber < 100 && saveNumber%10 != 0) printf("\n%sund%s\n", lowArray[saveNumber%10], zigArray[saveNumber/10-2]); else if(saveNumber >= 100 && saveNumber < 1000 && saveNumber%100 != 0) printf("\n%sund%sund%s\n", hundertArray[saveNumber/100-1], lowArray[saveNumber%10], zigArray[saveNumber/100-1]); else if (saveNumber >= 1000) printf("\nkeine gültige Eingabe\n"); else printf("\n%s\n", zigArray[saveNumber/10-2]); } _getch(); return 0; }
Was haltet ihr von dieser Lösung. Kann man das so lösen oder sollte man da einen
anderen Weg einschlagen. Bitte um konstruktive Kritik und evtl. Verbesserungen.
Vielen DankGruß GiJoe.
-
Im Bereich über 100 mußt du natürlich auch die Sonderregeln für 1..19 und die Zehner berücksichtigen, sonst erhältst du nur Müll.
(ich würde die Zahl aufteilen in Hunderter und Zehner+Einer und jeweils gesondert betrachten:
if(saveNumber>=100) { printf("%s ",hundertArray[saveNumber/100-1]); saveNumber %=100; } if(saveNumber<20) ...
-
Also jetzt haben wir es mit gemeinsamen Kräften geschafft. Vielen Dank nochmal. Hier mal der Programmcode für alle die es interessiert.
int getNumber() { int number = 0; char value = '0'; while (value != 13) { value = getch(); switch (value) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': number = number * 10 + value - '0'; printf("%c", value); break; } } return number; } int _tmain(int argc, _TCHAR* argv[]) { unsigned char lowArray[20][15] = { "ein", "zwei", "drei", "vier", "f\201nf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zw\224lf", "dreizehn", "vierzehn", "f\201nfzehn", "sechszehn", "siebzehn", "achtzehn", "neunzehn"}; char zigArray[8][15] = {"zwanzig", "drei\341ig", "vierzig", "f\201nfzig", "sechzig", "siebzig", "achtzig", "neunzig"}; char hundertArray[9][20] = {"einhundert", "zweihundert", "dreihundert", "vierhundert", "f\201nfhundert", "sechshundert", "siebenhundert", "achthundert", "neunhundert"}; int saveNumber = -1; while (saveNumber != 1000) { printf("Geben Sie eine Zahl von 1-100 ein: "); saveNumber = getNumber(); if(saveNumber >= 100 && saveNumber < 1000) { if (saveNumber%100 != 0) printf("\n%sund", hundertArray[saveNumber/100-1]); else printf("\n%s\n", hundertArray[saveNumber/100-1]); saveNumber%=100; } if (saveNumber <= 19 && saveNumber >0) printf("%s\n", lowArray[saveNumber-1]); else if (saveNumber >= 20 && saveNumber%10 != 0) printf("%sund%s\n", lowArray[saveNumber%10-1], zigArray[saveNumber/10-2]); else if (saveNumber >= 1000) printf("\nkeine gültige Eingabe\n"); else if (saveNumber != 0) printf("%s\n", zigArray[saveNumber/10-2]); } _getch(); return 0; }
Gruß GiJoe