switch case Verständnis Problem...



  • Hallo !
    So nun eröfne ich mal ein neues Thema 🙂
    Ich habe ein Problem mit der switch case Geschichte.
    Ich habe kommentare im Quelltext geschrieben bitte schaut es euch mal an...

    #include <iostream.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <conio.h> // für clrscr entfällt bei Nicht-DOS-Compilern
    
    int main() 
    { 
    
    float fahrenheit, celsius; 
    char eingabe, vier;
    double bit = 0, byte = 0, kilobit = 0, kilobyte = 0, megabit = 0, megabyte = 0, kibibit = 0, kibibyte = 0, mebibyte = 0;   
    
    cout << "1 fuer Fahrenheit nach Clesius\n"; 
    cout << "2 fuer Celsius nach Fahrenheit\n";
    cout << "3 fuer Bit nach kilobit, kilobyte, byte, Megabit usw.\n" ;  
    
        do   
        {   
    
           cin.get(eingabe); 
    
           //eingabe = getch();     
    
        switch (eingabe) 
    
            { 
    
         case vier:  // Warum geht das nicht? vier ist doch als Char initialisiert...
         cout << "\nFahrenheit eingeben: "; // und wieso gehen case Auswahlen über 9  nicht ? Wenn ich bis 10 mache nimmt er, wenn ich 10 eintippe
                                             // immer die 1 ... Irgendetwas habe ich doch da falsch verstanden...
         cin  >> fahrenheit; 
         celsius =(fahrenheit -32) / 1.8; 
         cout <<celsius <<" Grad Celsius"<<endl; 
         break; 
    
        case '2': 
        cout << "\nCelsius eingeben: "; 
        cin  >> celsius; 
        fahrenheit = (celsius * 1.8) + 32; 
        cout << fahrenheit <<" Grad Fahrenheit"<< endl; 
        break;   
    
        case '3':
        cout << "\nHinweis: Dies sind die aktuellen Werte nach dem neuen IEC\n";
        cout << "Standard. Alte Gegebenheiten werden nicht beruecksichtigt.\n\n";
        cout << "Bitzahl eingeben: ";
    
        cin >> bit;                           // Rechnung bit  
        byte = bit / 8; 
        kilobit = bit / 1000; 
        kibibit = bit / 1024;
        kilobyte = bit / 8 /1000;
        kibibyte = bit  / 8 / 1024;
        megabit = bit / 1000 / 1000;
        mebibyte = ( bit  / 8 ) / 1024 /1024;
        megabyte = ( bit / 8 ) / 1000 / 1000;
    
        cout << byte << " Byte (b = 8 bits)\n"; 
        cout << kilobit << " Kilobit (kbit = 1000 bits)\n";
        cout << kilobyte << " Kilobyte (kB = 1000 bytes)\n";
        cout << megabit << " Megabit (Mbit = 1000 kilobits)\n";
        cout << megabyte << " Megabyte ( MB = 1000 kilobytes)\n";  
        cout << mebibyte << " Mebibyte (MiB = 1024  kibibytes)\n";
          break;
    
    /*
    bit bit       0 or 1 
    byte B 8 bits 
    kibibit Kibit 1024 bits 
    kilobit kbit 1000 bits 
    kibibyte (binary) KiB 1024 bytes 
    kilobyte (decimal) kB 1000 bytes 
    megabit Mbit 1000 kilobits 
    mebibyte (binary) MiB 1024 kibibytes 
    megabyte (decimal)  MB 1000 kilobytes 
    gigabit Gbit 1000 megabits 
    gibibyte (binary) GiB 1024 mebibytes 
    gigabyte (decimal) GB 1000 megabytes 
    terabit Tbit 1000 gigabits 
    tebibyte (binary) TiB 1024 gibibytes 
    terabyte (decimal) TB 1000 gigabytes 
    petabit Pbit 1000 terabits 
    pebibyte (binary) PiB 1024 tebibytes 
    petabyte (decimal) PB 1000 terabytes 
    exabit Ebit 1000 petabits 
    exbibyte (binary) EiB 1024 pebibytes 
    exabyte (decimal) EB 1000 petabytes 
    
      */  
    
        default: 
            cout << "\nFehleingabe" ; 
    
       }     
    
    }while (eingabe !=27 ); 
    
     return 0;   
    }
    

    Noch eine kleine Frage... Nehmen wir an das Programm hat auch ein Leben nach der Case Auswahl wie komme ich aus der SChleife wieder raus und kann außerhalb noch etwas ausführen und nach belieben wieder hinein ???

    Komische Sache



  • const char vier = '4';
    

    Muss Konstante sein und natülich initialisiert.



  • Deine case unterscheidung geht immer danach was in eingabe steht, das heißt dein erster Fall funktioniert nur wenn du eingabe=vier hättest, da ein char aber nur eun Zeichen ist geht es natürlich nicht.
    Je nachdem was in einabe steht wird der jenige Fall aufgerufen.

    int i;
    cout<<"Bitte geben sie eine Zahl zwischen 0 und 5 ein(1, 2, 3, 4)"<<endl;
    cin>>i;
    switch(i)
    {
        case 1:
            cout<<"Sie haben 1 eingegeben"<<endl;
            break;
        case 2:
            cout<<"Sie haben 2 eingegeben"<<endl;
            break;
        case 3:
            cout<<"Sie haben 3 eingegeben"<<endl;
            break;
        case 4:
            cout<<"Sie haben 4 eingegeben"<<endl;
            break;
        default :
           cout<<"Bitte geben sie eine Zahl zw 1 und 5 ein und nicht "<<i<<endl;
    
    }
    


  • Hi
    Ich meinte das anders ich versuche, dass das man vier eingeben kann und nicht 4...
    Das mit int , dass klappt auch nicht wirklich irgendwie...
    Außerdem würd ich gern wissen wie man ne Case Auswahl höher als 9 machen kann also 10 oder höher, denn so nimmt er immer den ersten Wert.

    Edit:
    Gibt es irgendwo ausführlichere beispiele zu case wo mein Problem Thematisiert wird ??
    Ist sehr frustrierend gerade für mich.. 😞



  • AlternativEnde schrieb:

    Ich meinte das anders ich versuche, dass das man vier eingeben kann und nicht 4...

    std::mapstd::string,int

    AlternativEnde schrieb:

    Das mit int , dass klappt auch nicht wirklich irgendwie...
    Außerdem würd ich gern wissen wie man ne Case Auswahl höher als 9 machen kann also 10 oder höher, denn so nimmt er immer den ersten Wert.

    Das solltest du vielleicht nochmal verständlich umformulieren 😉





  • AlternativEnde schrieb:

    Noch eine kleine Frage... Nehmen wir an das Programm hat auch ein Leben nach der Case Auswahl wie komme ich aus der SChleife wieder raus und kann außerhalb noch etwas ausführen und nach belieben wieder hinein ???

    bool jetztaberwirklichschluss = false;
    do
    {
        //die Welt vor Case
        do
        {
            cin >> eingabe;
            switch (eingabe)
            {
                //whatever
            }
        }
        while(eingabe != 27);
        //die Welt nach case
    }while( !jetztaberwirklichschluss );
    

    Meintest Du das?



  • Ja sieht super aus und ich habe es nun so umgeschrieben..

    #include <iostream.h>
    #include <conio.h> // Entfällt bei Nicht DOS Compilern
    
    int main()
    
    {
    
        int eingabe;
    
    bool jetztaberwirklichschluss = false;
    
    //do { 
    
        do 
        { 
            cin >> eingabe; 
            switch (eingabe) 
            { 
                    case 1:
                        cout <<"Dies ist ein Beispiel Fall Tippe ESC zum beenden\n";
                        break;
    
                        case 27:
                            jetztaberwirklichschluss = true; // Bei tastendruck ESC wird bool auf wahr
                            break;                           // gesetzt
    
                            case '\n':
                            // Ignoriere Entertaste
                            break;
    
            } 
        // }     while(eingabe != 27); 
    
    }while( !jetztaberwirklichschluss ); // und das ist das Ende
    
    cout <<"endlich raus aus der Do While Schleife...\n\n";
    
    getch(); // Entfällt bei Nicht DOS Compilern
    return 0;
    
    }
    

    Dummerweise beendet er dann, wenn man 27 eintippt und nicht ESC drückt.
    Warum das ?

    Die zweite Frage wahr ( Entschuldigt für die undeutliche Ausdrucksweise )
    , wie ich es machen kann das zB. soetwas kommt..

    cout <<"Bitte tippen sie "Menu" ein um ins selbige zu kommen";
    // Also einfach man gibt etwas ein und anhand dessen wird der case Fall ausgewählt 
    case: Menu
    // oder ähnlich... wenn ich das wie oben vorgeschalgen mache dann muss man trotzdem noch die Zahl eingeben die man dann zuweist :(
    


  • Die einfachste Möglichkeit die mir dazu einfällt ist folgende: (Kein Standard C++)

    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
            int input = 0;
            do
            {
                    input = getch();
                    cout << "\n INPUT: " << input << endl;
            } while(input != 27);
    
            return 0;        
    }
    

    @all:
    Gibts da überhaupt eine einfache Möglichkeit in Standard-C++? IIRC wird doch bei allen Steuerzeichen zuerst eine 0 gesendet, bevor der eigentliche ASCII-Code kommt (Bitte schlagen, wenn ich mich täusche).

    //Edit: Geht soweit ich weiß nicht mit switch, musst du mit IF-Abfragen machen...

    Caipi



  • Eingabe ist ja momentan ne int-Variable. Versuch mal als char (obwohl Du dann das Problem hast, dass nur einstellige Eingaben verarbeitet werden).
    Dann kannst Du per untigem Code abfragen:

    char eingabe;
    do
    {
    
    //blabla
    
    }
    while ((int)eingabe != 27);
    

    Damit castest Du den den Wert der Eingabe auf seinen ASCII-Code.



  • MG80S schrieb:

    while ((int)eingabe != 27);
    

    Ein Cast ist hier völlig unnötig. Zudem sind wir hier nicht im C Forum.



  • Ich hatte das ja auch in der Art wie du schon richtig bemerkt hast..

    Könnte ich denn den case auf "exit" legen ? Also das der User exit eingeben muss damit der bool Wert auf wahr gesetzt wird ? Ich wüsste nicht wie man das mit int machen sollte, aber vielleicht gibts da ja ne Möglichkeit..



  • AlternativEnde schrieb:

    Könnte ich denn den case auf "exit" legen ?

    Unter bestimmten Umständen schon möglich, das ist aber ein ziemlicher Hack mit Multicharacter Literalen und nicht empfehlenswert.

    AlternativEnde schrieb:

    Also das der User exit eingeben muss damit der bool Wert auf wahr gesetzt wird ?

    Möglich ist auch dies.

    string eingabe;
    getline(cin, eingabe);
    if (eingabe == "ende")
    {
        jetztaberwirklichschluss = true;
    }
    else
    {
        // blabla
    }
    

    Da ein String nunmal nicht als case Argument herhalten kann, kannst du dann auch nicht mit switch arbeiten. Du musste dann mit if/else Konstrukten arbeiten

    if (eingabe == "ende")
    {
        jetztaberwirklichschluss = true;
    }
    else if (eingabe == "1")
    {
        // blabla
    }
    else if (eingabe == "2")
    {
        // blabla
    }
    else
    {
        // switch default
    }
    

    Wenn du nur Zahlen eingibst (bis auf "ende"), kannst du dir mit einer Umwandlung switch zurückholen

    #include <sstream>
    //...
    if (eingabe == "ende")
    {
        jetztaberwirklichschluss = true;
    }
    else
    {
        stringstream s(eingabe);
        int eingabe_als_int;
        s >> eingabe_als_int;
        switch (eingabe_als_int)
        {
            case 1:
                break;
            case 2:
                break;
            // ...
            default:
                cout << "Falsche Eingabe!" << endl;
        }
    }
    


  • Irgendwie funktioniert das alles noch nicht richtig....
    Über 27 kann ich bei folgendem Programm aussteigen, aber über ESC nicht 😞

    #include <iostream.h>
    //#include <conio.h> // Entfällt bei Nicht DOS Compilern
    
    int main()
    
    {
    
        int eingabe;
    
    bool jetztaberwirklichschluss = false;
    
    do { 
    
        do 
       { 
            cin >> eingabe; 
            switch (eingabe) 
            { 
                    case '1':
                        cout <<"Dies ist ein Beispiel Fall Tippe ESC zum beenden\n";
                        break;
    
                        case 27:
                            jetztaberwirklichschluss = true; // Bei tastendruck ESC wird bool auf wahr
                            break;                           // gesetzt
    
                            case '\n':
                            // Ignoriere Entertaste
                            break;
    
                            default:
                                cout <<"Fehleingabe";
                                break;
    
            }  
       } while(eingabe != 27); 
    
    }while( !jetztaberwirklichschluss ); // und das ist das Ende
    
    cout <<"endlich raus aus der Do While Schleife...\n\n";
    
    //getch(); // Entfällt bei Nicht DOS Compilern
    return 0;
    
    }
    


  • AlternativEnde ungeloggt schrieb:

    Irgendwie funktioniert das alles noch nicht richtig....
    Über 27 kann ich bei folgendem Programm aussteigen, aber über ESC nicht 😞

    Das wird auch nicht funktionieren. 27 ist der Tastencode, den getch zurückgibt. Mit cin hat das nix zu tun.

    btw:
    benutze doch bitte den richtigen Header, also <iostream> ohne .h



  • hmm wie ist das zu verstehen ?
    Ich habe in anderen programmen gesehen, dass es trotz int möglich ist und zwar indem oben #define ESC 27 gemacht wurde.
    Dort lief es auch allerdings waren das C Programme.
    In meinem fall funktioniert es auch mit dem define nicht...



  • Dann zeig das Programm mal her. AFAIK hat das mit einem C-Programm (speziell) nichts zu tun.

    Caipi



  • ihr seit die besten ! 👍 👍

    #include <iostream.h>
    #define ESC = 27
    
    //#include <conio.h> // Entfällt bei Nicht DOS Compilern
    
    int main()
    
    {
    
        int eingabe;
    
    bool jetztaberwirklichschluss = false;
    
        do 
       { 
           cin >> eingabe;
            switch (eingabe) 
            { 
                    case 1:
                        cout <<"Dies ist ein Beispiel Fall Tippe ESC zum beenden\n";
                        break;
    
                        case 27:
                            jetztaberwirklichschluss = true; // Bei tastendruck ESC wird bool auf wahr
                            break;                           // gesetzt
    
                            case '\n':
                            // Ignoriere Entertaste
                            break;
    
                            default:
                                cout <<"Fehleingabe";
                                break;
    
            }  
    
    }while( !jetztaberwirklichschluss ); // und das ist das Ende
    
    cout <<"endlich raus aus der Do While Schleife...\n\n";
    
    //getch(); // Entfällt bei Nicht DOS Compilern
    return 0;
    
    }
    


  • AlternativEnde ungeloggt schrieb:

    hmm wie ist das zu verstehen ?
    Ich habe in anderen programmen gesehen, dass es trotz int möglich ist und zwar indem oben #define ESC 27 gemacht wurde.

    Der Standard, und zu dem gehört cin nunmal, definiert keine Tastencodes. Genauso wenig wie er sicherstellt, dass cin bei einem Drücken von Escape in entsprechende Variable 27 schreibt. Was du machst, ist die Funktionalität von cin mit der Verarbeitung von getch() zu mischen, und das ist, wie man sieht, keine gute Idee.



  • Aber getch ist doch kein Standard...
    Unter Unix ist der Befehl so nicht möglich genausowenig wie unter Beos..
    Also meinst du ich sollte cin >> eingabe wieder durch eingabe = getch (); bzw. getchar(); ersetzen und es mit #define zu machen ?
    Ich brauche quasi eine Lösung einen Weg für spätere Sachen, der dem Ansi Standard entspricht und den kein programmierer bemängeln würde...


Anmelden zum Antworten