Zahlen und Ziffern ausgeben



  • 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