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:
    Dreitausendvierhundertundeinundzwanzig

    EDIT (verkürzt):
    Dreitausendvierhunderteinundzwanzig

    EDIT #2:
    Elf, Zwölf

    EDiT #3:
    sieben -> siebzehn

    Alles nicht so trivial. Jede Menge Sonderfälle in der deutschen Sprache.

    Gruß an Rapsoel.


  • Mod

    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;
    }
    

Log in to reply