switch case Verständnis Problem...
-
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
-
Sie dir hierzu mal folgenden Thread an: http://www.c-plusplus.net/forum/viewtopic.php?t=62077&highlight=switch+map
Edit: Der hier ist auch gut -> http://www.c-plusplus.net/forum/viewtopic.php?t=36889&highlight=switch+map
-
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 nichtDas 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...
-
AlternativEnde ungeloggt schrieb:
Aber getch ist doch kein Standard...
Hat auch niemand behauptet, aber ich sehe in deinem Code keine Verwendung von getch().
AlternativEnde ungeloggt schrieb:
Also meinst du ich sollte cin >> eingabe wieder durch eingabe = getch (); bzw. getchar(); ersetzen und es mit #define zu machen ?
Das hab ich nicht gesagt. Da ich die Anforderungen deiner Anwendungen nicht kenne, kann ich dir auch nicht sagen, wie du es nun machen sollst.
cin hat den Nachteil, dass man immer mit Enter bestätigen muss. Andererseits bietet der Standard keine Möglichkeit, zumindest ist mir nichts bekannt, direkt auf Tastendrücke zu reagieren. Wenn du sowas benötigst, dann musst du auf plattformspezifische Sachen zurückgreifen, wie zB getch(). Kapselung heisst dann hier das Zauberwort.
Wenn du bei cin bleiben willst, dann vergiss das mit ESC, und mach es so, dass zB bei eingegebener "0" das Programm beendet wird.
-
Ok habs nun geschafft...
Vielen DAnk den Code gibts nachher muss gleich weiter arbeiten.
Aber eine andere Frage kam auf die in meinem buch zu kurz erwähnt wurde..Strings... Wie kann ich große Zahlenreihen, Werte aus rechnungen da rein schreiben ?
Also ich habe einen Wert der größer ist, als der Speicherbereich von double.
Wie ist es möglich den in einen String schreiben zu lassen.. ?Schreibe mir gerade kleine Testprogramme damit ich später noch weiß wie das alles funktioniert.
Vielen Dank in Eile
Alternativ Ende