Zahlen und Ziffern ausgeben



  • Hi Leutz,

    Habe ein kleines Problem und zwar weiß ich nicht warum untenstehendes Programm zwar meine eingebenen Zahlen problemlos als ausgeschriebene Ziffern ausgibt, jedoch einfach die If Kontrukte überspringt wenn ich eine ausgeschrieben Zahl eingebe ...-.- und ja ich weiß warscheinlich gibts 10mal einfachere Methoden ohne if else Würste wie in meinem Code aber es geht mir momentan nur ums funktionieren Vielen Dank im Voraus LG

    #include<iostream>
    #include<string>
    #include<vector>
    
    using namespace std;
    
    int main(){
    
        int zahl=0;
        char beender=' ';
        string ausgeschrieben=" ";
    
        vector<string> ziffer(11);
        ziffer[0]="null";
        ziffer[1]="eins";
        ziffer[2]="zwei";
        ziffer[3]="drei";
        ziffer[4]="vier";
        ziffer[5]="fuenf";
        ziffer[6]="sechs";
        ziffer[7]="sieben";
        ziffer[8]="acht";
        ziffer[9]="neun";
        ziffer[10]="zehn";
    
        cout << "Bitte geben Sie eine Zahl ein !" << endl;
    
        if(cin>>zahl){
    
        switch(zahl){
    
                     case 0: cout << ziffer[0] << '\t' << 0 << endl;
                     break;
    
                     case 1: cout << ziffer[1] << '\t' << 1 << endl;
                     break;
    
                     case 2: cout << ziffer[2] << '\t' << 2 << endl;
                     break;
    
                     case 3: cout << ziffer[3] << '\t' << 3 << endl;
                     break;
    
                     case 4: cout << ziffer[4] << '\t' << 4 << endl;
                     break;
    
                     case 5: cout << ziffer[5] << '\t' << 5 << endl;
                     break;
    
                     case 6: cout << ziffer[6] << '\t' << 6 << endl;
                     break;
    
                     case 7: cout << ziffer[7] << '\t' << 7 << endl;
                     break;
    
                     case 8: cout << ziffer[8] << '\t' << 8 << endl;
                     break;
    
                     case 9: cout << ziffer[9] << '\t' << 9 << endl;
                     break;
    
                     case 10: cout << ziffer[10] << '\t' << 10 << endl;
                     break;
    
                     default: cout << "Bitte eine gueltige Zahl eingeben (von null bis zehn)! " << endl;
                     break;
                     }
                     }
         if(cin>>ausgeschrieben){
    
        if(ausgeschrieben=="null"){
                                   cout << 0 << endl;
                                   }
        else if(ausgeschrieben=="eins"){
                                        cout << 1 << endl;
                                        }
        else if(ausgeschrieben=="zwei"){
                                        cout << 2 << endl;
                                        }
        else if(ausgeschrieben=="drei"){
                                        cout << 3 << endl;
                                        }
        else if(ausgeschrieben=="vier"){
                                        cout << 4 << endl;
                                        }
        else if(ausgeschrieben=="fuenf"){
                                         cout << 5 << endl;
                                         }
        else if(ausgeschrieben=="sechs"){
                                         cout << 6 << endl;
                                         }
        else if(ausgeschrieben=="sieben"){
                                          cout << 7 << endl;
                                          }
        else if(ausgeschrieben=="acht"){
                                        cout << 8 << endl;
                                        }
        else if(ausgeschrieben=="neun"){
                                        cout << 9 << endl;
                                        }
        else if(ausgeschrieben=="zehn"){
                                        cout << 10 << endl;
                                        }
    
                                        }
    
        system("Pause");
        return 0;
    }
    


  • Geht doch.

    gruß
    syntax



  • hmm bei mir funzt das gar net ...wenn ich "vier" eingeb beendet sich das Prog ohne iwas zu tun ...geb ich 4 ein gibt er mir auch "vier" aus, so wie gewollt ..



  • Du liest zweimal ein. Beim ersten Mal mußt Du eine Zahl eingeben. Beim zweiten mal dann ein Wort.



  • Omg stimmt jetzt fällts mir auch auf -.-' ....ok wie könnte ich das umgehen ? würde es mit einer while(cin>>zahl || cin>>ausgeschrieben)Anweisung funktionieren?
    Also es soll nur einmal eingelesen werden.

    LG



  • Oder kann man eine Entscheidungsfrage für cin nicht mit so einer Schleife lösen ?



  • Was genau willst du denn erreichen?
    Wie soll die Variable "ausgeschrieben" gefüllt werden (vom Benutzer oder vom Programm)?

    Wenn du einfach den vector benutzen willst, dann

    ausgeschrieben = ziffer[zahl];
    

    (auch wenn die Variablenbenennung so nicht toll ist)



  • Naja ich will erreichen, dass wenn ich zb. 9 eingebe "neun" rausbekomm (was ja schon hinhaut) und wenn ich "neun" eingebe die 9 rausbekomm.... War das irgendwie klar? ^^



  • Naja ich will erreichen, dass wenn ich zb. 9 eingebe "neun" rausbekomm (was ja schon hinhaut) und wenn ich "neun" eingebe die 9 rausbekomm.... War das irgendwie klar? ^^



  • Habs hinbekommen, danke 🙂



  • Zum Abschluss vllt noch eine etwas schönere Version.

    #include <iostream>
    #include <string>
    #include <vector>
    #include <sstream>
    #include <cctype>
    
    int main()
    {
        const unsigned anzahl_ziffern = 10;
        const std::string ziffern[anzahl_ziffern] = //besser wäre std::array. mich nervt aber die sinnlose Warnung.
        {
            "null", "eins", "zwei", "drei", "vier",
            "fuenf", "sechs", "sieben", "acht", "neun"
        };
        while(true)
        {
            std::cout << "\n\n(1) Zahl -> Ziffern\n"
                         "(2) Ziffern -> Zahl\n"
                         "Anderes: Beenden\n\n>> ";
            int wahl;
            std::cin >> wahl;
            switch(wahl)
            {
                case 1:
                {
                    std::cout << "\nGeb ne Zahl ein: ";
                    std::string zahl; //damit koennen wir deutlich groessere zahlen eingeben lassen
                    std::cin >> zahl;
                    for(unsigned i = 0; i < zahl.size(); ++i)
                        if(std::isdigit(zahl[i]))
                            std::cout << ziffern[zahl[i] - '0'] << ' '; 
                        //mit zahl[i] - '0' erhalten wir zb: '3' == 51, '0' == 48, 51-48 == 3, siehe ascii tabelle
                }
                break;
    
                case 2:
                {
                    std::cout << "Ziffern in Worte eingeben (durch ' ' trennen): ";
                    std::string ausgeschrieben;
                    std::cin.ignore(1, '\n'); //das ENTER aus dem Puffer loeschen
                    std::getline(std::cin, ausgeschrieben); //auch leerzeichen einlesen
                    std::string ziffer;
                    std::istringstream is(ausgeschrieben);
                    while(is >> ziffer) //">>" ueberspringt fuer uns die leerzeichen
                        for(unsigned i = 0; i < anzahl_ziffern; ++i)
                            if(ziffern[i] == ziffer)
                                std::cout << i;
                }
                break;
                default:
                    return 0;
            }
        }
    }
    


  • Daumen runter für ein Array aus std::string 👎



  • 314159265358979 schrieb:

    Daumen runter für ein Array aus std::string 👎

    Was schlägst du vor?



  • Incocnito schrieb:

    Zum Abschluss vllt noch eine etwas schönere Version.

    [...]

    Zeile 29 ist überflüssig, da der Vektor nicht benutzt wird. Die modulo - Funktion in Zeile 32 ist auch übrig, da zahl[i] immer nur eine einzige Ziffer darstellt.



  • redlight schrieb:

    Was schlägst du vor?

    char const* 🤡



  • 314159265358979 schrieb:

    Daumen runter für ein Array aus std::string 👎

    wie wäre es statt Daumen runter mit einem konstruktiven Verbesserungsvorschlag - kann nicht jeder gleich C++11 von 0 auf 100



  • Als ob das was mit C++11 zu tun hätte.



  • 314159265358979 schrieb:

    redlight schrieb:

    Was schlägst du vor?

    char const* 🤡

    ich hatte statt des Rückfalls in die Steinzeit eher eine einzeilige Initialisierung mit std::array im Sinn



  • Lustig,

    der Code war vorher genau ohne all diese Fehler.
    std::array hab ich dann zurueck zu nem "normalen" (jaja std::array ist ja eigentlich normal) array gemacht, weil ich unseren Anfänger mit dieser total sinnlosen Warnung nicht verunsichern wollte, er könnte ja denken das sei normal

    const std::array<std::string, 10> ziffern =
        {
            "null", "eins", "zwei", "drei", "vier",
            "fuenf", "sechs", "sieben", "acht", "neun"
        };
    
    d.cpp|15|Warnung: geschweifte Klammern fehlen um Initialisierung für »std::array<std::basic_string<char>, 10u>::value_type [10] {aka std::basic_string<char> [10]}« [-Wmissing-braces]|
    

    Aber das ist ja ein bekannter Bug. Ich benutz std::array erst wieder, wenn diese blöde Warnung endlich mal weg ist.

    Die restlichen Fehler sind nur Relikte vom Rumprobieren.



  • std::array würde ich hier nicht nehmen, weil es erfordert, die Größe anzugeben.

    DAFÜR std::string STREICHEN!


Anmelden zum Antworten