char´s besser als int´s im switch() ?



  • Mega_Noob schrieb:

    Hier mal mein Quellcode:

    #include <cstdlib> //wozu eigtl?
    
    #define mwst 1.19 //igitt...
    
    const float MWSt (1.19); // bla * mwst;
    //oder
    const int MWSt (19); //bla + bla*mwst   ==>   bla * (1+mwst)
    //oder
    const float MWSt (19); //bla + bla*mwst   ==> bla * (1+mwst)
    
    int main()
    {
        double zahl, zahl2, erg; //warum denn scho hier deklariert?
        char wahl;
        
        do{
            start: //wozu das denn? nennt sich label und sollte nie verwendet werden (es gibt glaube ich ein paar beispiele, wo es sich nicht umgehen lässt, aber das is wohl eher theorie als praxis - und für uns hier alles andere, als interessant...)
            cout << "Netto ek   -> 1 <- " << endl;
            cout << "Plus   -> 2 <- " << endl; 
            //nimm \t - dann steht das wenigstens au untereinander
            cin >> wahl;
            system("cls"); //ueber so was lässt sich streiten... gibt nen haufen nachteile von system (....)
    
    /*kommt gleich*/
    
          } while (1); //endlosschleife...
    

    also wird aus dem stückchen:

    int main ()
    {
        bool again (true);
        
        do{
            cout << "Netto ek\t-> 1 <- " << endl;
            cout << "Plus    \t-> 2 <- " << endl;
            size_t wahl (std::numeric_limits <size_t>::max ()); //wir geben wahl einen startwert, den es nach der eingabe niemals hat, wenn der user nicht zufällig 2^32-1 eingibt - und wenn, dann kann man ihm ja trotzdem sagen, dass seine eingabe falsch ist - oder hast du vor 4,3 Milliarden case-Marken hinzuzufügen? also geht das denke ich in Ordnung ^^
            cin >> wahl;
            while (wahl == std::numeric_limits <size_t>::max ()) //wir überprüfen, ob wahl immernoch diesen Wert hat, den es eben nicht mehr haben sollte, wenn der Nutzer eine Eingabe gemacht hat, die korrekt ist - bei einer eingabe, wie "asd12a" wird wahl nicht geändert, es werden nur failbits im stream gesetzt siehe ->istream.fail ()
             {
              std::cout << "falsche eingabe... noch mal..." << std::endl; //besser als using namespace ist eigtl immer, den namespace eplizit mitzuschreiben - aber das ist hier auch erst mal egal...
    //TODO: flags des streams überprüfen und ggf neu setzen
              cin >> wahl;
             };
    //hier noch ne eingabe, ob weiter oder nicht... siehe unten...
          } while (again); //unser bool von oben kommt hier zum einsatz ^^
    

    wir brauchen also auch nen für numeric_limits brauchen wir nen neuen header, also fügen wir ganz oben noch #include <limits> hinzu...

    nun schauen wir uns mal den inhalt deiner schleife an...

    switch (wahl) //wir 'switchen' jetzt eine zahl und keinen buchstaben - das heißt, bei uns wird '1', '2' zu 1, 2, ..., 99999 ^^ (hat z.bsp. den vorteil, dass wir nichts umschreiben müssen, wenn wir mal mehr als nur 9 möglichkeiten haben =))
            {
                        case '2': //warum eigtl so ne komische reihenfolge? Oo
                             { //brauchst du nicht
                               cout << "Bitte gib eine Zahl ein " << endl;
                               cin >> zahl;
                               cout << "Und nun eine zweite " << endl;
                               cin >> zahl2;
                               erg = zahl + zahl2;
                               cout << erg << "\n" << endl;
                               break; //damit ist hier schluss
                               system("cls"); //und das hier wird niemals erreicht
                             }            
                        case '1':
                             {
                               cout << "Bitte gib den Netto Betrag ein " << endl;
                               cin >> zahl;
                               zahl2 = zahl * mwst;
                               cout << zahl2 << endl;
                               erg = zahl2 * ge;
                               cout << "Gewinn: " << erg << endl;
                               break;
                               system("cls");
                               }
                               
            }
    

    da machen wir mal so was draus:

    switch (wahl)
            {
                        case 1:
                             { //wir lassen den scope hier, weil wir variable brauchen, die nur innerhalb der case-marke existieren - das können sie nicht, wenn nicht genau definiert ist, wo sie zerstört werden...
                               float netto; //ist nen besserer name, oder?
                               cout << "Bitte gib den Netto Betrag ein " << endl;
                               cin >> zahl;
                             //TODO überprüfung der eingabe?
                               zahl *= mwst;
                               cout << zahl << endl;
                               erg = zahl2 * ge;
                               cout << "Gewinn: " << zahl*ge << endl;
                               break;
                             }
                        case 2: /* analog zu 1 ändern*/
                        default:
                             //fehlermeldung... (falsche eingabe und so)
            }
    

    kommen wir noch zu der eingabe, ob noch mal und so...: (den rest hab ich noch mal mit angedeutet, damit du weist, wo es hin sollte)

    bool again (true);
    do
    {
    /*der große switch block - also alle aufgaben erledigen*/
    
    std::cout << "Wars das? ['y', 'Y', 'j' oder 'J' fürs Beenden]" << std::endl;
    char tmp;
    if ((tmp == 'y') || (tmp == 'Y') || (tmp == 'j') || (tmp == 'J'))
       again = false;
    }
    while (again);
    

    Also könnte man die aufgaben auch in einzelne funktionen packen - vor allem in dem fall sollte man das so gar...
    Du kannst das ja mal versuchen, und dann posten, worauf du gekommen bist und welche Fehler du hast (hoffentlich nicht ^^)...

    bb 🙂



  • ohaaaa..... naja also, das mit der while(1) ist schon richtig, es soll ja auch nach den break; nicht ausgehen, es soll ja weitermachen und dazu muss ich sagen, dass ich ein absoluter beginner bin, also brigen mir die unteren quellcodes nichts 😞 tut mir leid!



  • Zieh dir das mal rein:

    http://de.wikipedia.org/wiki/ASCII

    Prober das mal in deinem Editor aus: ALT-Taste gedrückt halten, 4 und dann 9 drücken, ALT-Taste loslassen. Was erscheint dann? Eine '1'! Denn das Zeichen '1' hat den ASCII-Code 49. 48 ist '0', 50 dann '2' usw. Ein Leerzeichen hat den Code 32, und ein Carriage Return (Wagenrücklauf und Zeilenvorschub) setzt sich zusammen aus den Codes 13 und 10. Ein paar dieser Codes solltest du kennen, aber das kommt mit der Zeit von alleine. 🙂



  • Mega_Noob schrieb:

    @Simon2

    Ja ich habe ihn geändert, nicht nur einmal ^^......

    Ich habe ja nur gefragt, weil es ein äußerst beliebter Fehler (besonders bei "Noobs" (ob nun Mega oder nicht - no offense 😉 ) ) ist, Buchstaben mit Zahlen zu mischen.
    Was mir allerdings abseits dieser Thematik gerade noch auffällt:

    Mega_Noob schrieb:

    break;
                               system("cls");  
                             }
    

    Das "system("cls");" ist da wirkungslos, weil es durch das break immer übersprungen wird (hat Dein Compiler evtl. gar eine entsprechende Warnung angezeigt ?) ...

    Gruß,

    Simon2.



  • Ich habe deinen Code mal leicht überarbeitet:

    #include <cstdlib> 
    #include <iostream> 
    #include <limits>
    
    #define mwst 1.19 
    #define ge 1.12 
    
    using namespace std; 
    
    int main() 
    { 
    	double zahl, zahl2, erg; 
    	int wahl=0; 
    
    	while(wahl!=3) {
    		cout << "Netto ek   -> 1 <- " << endl; 
    		cout << "Plus   -> 2 <- " << endl; 
    		cin >> wahl; 
    		system("cls"); 
    
    		switch(wahl) 
    		{ 
    		case 1: 
    			{ 
    				cout << "Bitte gib den Netto Betrag ein " << endl; 
    				cin >> zahl; 
    				zahl2 = zahl * mwst; 
    				cout << zahl2 << endl; 
    				erg = zahl2 * ge; 
    				cout << "Gewinn: " << erg << endl; 
    				break; 
    			} 
    		case 2: 
    			{ 
    				cout << "Bitte gib eine Zahl ein " << endl; 
    				cin >> zahl; 
    				cout << "Und nun eine zweite " << endl; 
    				cin >> zahl2; 
    				erg = zahl + zahl2; 
    				cout << erg << "\n" << endl; 
    				break; 
    			}             
    		default:
    			{
    				cout << "Ungültige Eingabe!\n";
    				break;
    			}
    		}
    		cin.clear(); 
    		cin.ignore(numeric_limits<streamsize>::max(),'\n');
    	}
    }
    

    Ist trotzdem noch verbesserungswürdig, läuft aber wenigstens...



  • Ok, danke! Naja, aber was nun nicht ausbleibt ist, dass ich nun wieder eine Frage/en habe. Die Befehle

    cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(),'\n');
    

    sind mir leider nicht GANZ klar, dass cin.clear(); leuchtet mir ein, aber der Befehl

    cin.ignore(numeric_limits<streamsize>::max(),'\n');
    

    ist für mich ein "String" nur mit "???"

    Ich habe mir nun zum Glück das Buch "C++ Primer" gekauft, aber lerne nebenbei noch die Sprache Java, ich kann mich nicht entscheiden auf welche ich mich mehr konzentrieren soll, denn ich weiß nicht, was ich mit C++ in der zukunft alles kann. Ich bin erst 15 jahre alt und will unbedingt programmieren! Ich bitte Euch um ein wenig Verständniss! ich würde mich echt über eine positive äusserung von Euch melden, da ich sehr wenig selbstbewusstsein habe 😞

    Naja, danke trotzdem für eure schnelle Hilfe!!

    Mfg André N.



  • Das ignore ist dazu da, den Eingabepuffer zu leeren. Da gibts verschiedene Möglichkeiten, such einfach mal hier im Forum nach diesem Stichwort. Mit dem Visual Studio kannst du das z.B. auch mit fflush(stdin) machen, aber sag das bloß nie, nie, niemals hier im Forum. Da gibts direkt auf den Deckel, da nicht standardkonform! 😉



  • Mega_Noob schrieb:

    Ich habe mir nun zum Glück das Buch "C++ Primer" gekauft, aber lerne nebenbei noch die Sprache Java, ich kann mich nicht entscheiden auf welche ich mich mehr konzentrieren soll, denn ich weiß nicht, was ich mit C++ in der zukunft alles kann.

    Grundsätzlich ist C++ der schwere Einstieg, der dafür den Umstieg auf die verwanden Sprachen deutlich vereinfacht (z.B. in Richtung Java und C#). Vor allem liefert dir C++ auch teilweise genügend Hintergrundwissen um zu verstehen was in anderen Sprachen in etwa unter der Haube passiert. Ich habe mehr C++ Entwickler kennen gelernt die sich leicht in Java oder C# eingearbeitet haben, als Umgekehrt.

    Anderseits: Wenn du weißt das du später wohl nicht mehr mit C++ in Kontakt kommst, würde der einfache Weg häufig auch ausreichen ;). In dem Bereich wo ich hauptsächlich programmiere (Anwendungsentwicklungen, eigentlich ausschließlich Windowsentwicklung, zukünftig auch etwas richtung Web) sehe ich C# und Java deutlich eher die Zukunft (in meinen Fall, wegen der Windowsplattform, wohl C#).

    cu André



  • Hey asc, danke! Ja mir haben auch viele schon gesagt, dass java wohl besser wäre für die Zukunft und auch grade für mich, aber ich sehe die Grundlagen von Java bis jetzt schwerer an, als die von C++. Naja ich muss erstmal ALLE Grundlagen durchgearbeitet haben und nicht nur die Hälfte 😕 naja also, wie gesagt, danke nochmals! Das denke ich, war eien ganz gute hilfe, also werde ich zukünftig warscheinlich in Java programmieren und dann mich wieder ein wenig mit C++ beschäftigen.

    MfG André N.

    🙂



  • hallo commu,

    ich habe in meinem Praktikum die Aufgabe gehabt, einen (sowas wie) rechner zu bauen, ich wollte mich damit nicht großartig beschäftigen, da ich sowieso eher jetz in Java programmieren will, aber ich verstehe nicht, warum mein Programm immerwieder ausgeht! Ich verstehe es nicht und hoffe ihr könnt mir dabei noch ein wenig helfen.

    #include <iostream>
    #include <locale.h>
    
    #define mwst 1.19
    #define ge 1.12
    
    using namespace std;
    
    int main()
    {
        cin.get();
    
        cin.imbue(locale("german"));
        //cout.imbue(locale("de_DE"));   
    
        //cin.imbue(locale::classic());
        //cout.imbue(locale("de_DE"));
    
        system("color f0");
        float zahl, zahl2, erg;
        int wahl = 0;
    
        while(wahl != 99){
    
                   cout << "-> 1 <-    Netto EK " << endl;
                   cout << "-> 2 <-    Wert inkl. MWST  " << endl; 
                   cout << "-> 3 <-    Addition " << endl;
                   cout << "-> 4 <-    Subtraktion " << endl;
                   cin >> wahl;
                   system("cls");
    
            switch(wahl)
            {
    
                        case 1:
                             {
                                          cout << "Bitte gib den Netto Betrag ein: " << endl;
                                          cin >>  zahl;
                                          system("cls");
                                          cout << "     Wert = " << zahl << endl;
                                          zahl2 = zahl * mwst;
                                          cout << "     inkl. MWST = " << zahl2 << endl;
                                          erg = zahl2 * ge;
                                          cout << "     VK Preis   = " << erg << "\n\n\n" << endl;
                                          break;
                             }
    
                        case 3:
                             {
                                       cout << "Bitte gib eine Zahl ein: " << endl;
                                       cin >> zahl;
                                       cout << "Und nun eine zweite Zahl: " << endl;
                                       cin >> zahl2;
                                       erg = zahl + zahl2;
                                       cout << "Ergebnis: " << erg << "\n" << endl;
                                       break;    
                             } 
    
                        case 4:
                             {
                                       cout << "Bitte gib eine Zahl ein: " << endl;
                                       cin >> zahl;
                                       cout << "Und nun eine zweite: " << endl;
                                       cin >> zahl2;
                                       erg = zahl - zahl2;
                                       cout << "Ergebnis: " << erg << "\n" << endl;
                                       break;                       
                              }
    
                        case 2:
                             {
                                          cout << "Bitte gib den Netto Betrag ein: " << endl;
                                          cin >>  zahl;
                                          system("cls");
                                          cout << "     Wert = " << zahl << endl;
                                          erg = zahl * ge;
                                          cout << "     VK Preis   = " << erg << "\n\n\n" << endl;
                                          break;         
                             }
    
                                       default:
                                       {
                                             cout << "Falsche Einngabe du Token! " << endl;
                                             break;      
                                       }
    
                               }    
                             cin.clear();
                             cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
    
                       }
    
    }
    

    wichtig ist mir, dass der Befehl

    cin.imbue(locale("german"));
    

    mein programm zum absturtz bringt. wenn ich es wie die anderen cin.imbue´s auskommentiere, dann geht es wie gewohnt, ziel ist es, dass wenn ein benutzer bei Netto oder Addition oder sonstwas ein "," eingibt, dann muss es ein "." sein, denn das Programm nutzt die kommas nicht, da es nicht deutsche tastaturbelegung im Programm ist, soweit ich weiß.
    Hoffe ihr könnt mir helfen!

    Danke schonmal!

    Mfg André N.


Anmelden zum Antworten