Konsolen Anwendung: Benutzer fragen (Ja oder Nein)
-
Hi!
Also ich versuche gerade den Benutzer zu fragen, ob das Programm etwas tun soll. Leider erfolglos. Das Programm tut es immer. Egal was der Benutzer eingibt.Die Header, Variablen, etc.
#include "stdafx.h" #include <windows.h> #include <conio.h> using namespace std; void lecher(); int length; float time_m; float time_ms; bool log; char vote;Das Problem:
cout << "Sollen die Tastenanschläge mitgelogt werden? (Y/N)" << endl; cin >> vote; cout << "\n"; if(vote = 'y') { log = true; } if(vote = 'n') { log = false; } else { cout << "Ungueltige Eingabe" << endl; getch(); }Die nächste Bedingung befindet sich mitten in einer while Schleife:
while(0 < length) { time_ms = time_m * 60000; //Das ist um Minuten statt MS eingeben zu können Sleep(time_ms); leecher(); // Eine Funktion die ausgeführt werden soll if(log = true) // Das hier wird IMMER asgeführt!! { cout << "Taste emuliert nach " << time_ms << " MS" << endl; } if(log = false) // Das ist nur zum Test { cout << "lala" << endl; } length--; }
-
vergleich geht mit ==, nur = ist eine zuweisung und die ist immer wahr, solange nicht grad zufällig eine 0 zugewiesen wird.
-
= ist die Zuweisung, Vergleiche erledigst du mit ==:
if(vote == 'y') { log = true; } else if(vote == 'n') { log = false; } else ...(Nebenbemerkung: Die Zuweisung liefert den Wert der Zielvariablen zurück, den if() wiederum in einen Wahrheitswert (0=false, alles andere=true) umwandelt - darum schlägt bei dir auch immer die if(log=true) Bedingung zu)
PS: Tests auf true oder false kannst du übrigens verkürzen zu 'if(log)' bzw. 'if(!log)'
-
Ich Idiot! Ich dachte mir schon, dass es irgendwas offensichtliches ist.

Vielen dank und danke auf für den Tipp das werde ich gleich mal ausprobieren.
-
Ach eine Frage hätte ich da noch. Kann ich nachdem ich hier angekommen bin...
else { cout << "Ungueltige Eingabe" << endl; getch(); return 0; // Ohne das ging es nicht richtig...wieder zum Anfang der Frage zurückspringen?
-
Du kannst den ganzen Block in eine Schleife packen, die so lange durchläuft, bis der User was richtiges eingegeben hat.
-
Achso, ich dachte es gibt da vielleicht etwas komfortableres aber danke!

-
Naja, da gäbe es noch g**o, aber das ist in den meisten Fällen überflüssig und gilt als schlechter Programmierstil

-
und gehört nicht in die hände von anfängern

-
mikey schrieb:
Naja, da gäbe es noch g**o, aber das ist in den meisten Fällen überflüssig und gilt als schlechter Programmierstil

Das habe ich mir gerade mal angesehen. Es ist eigentlich genau das wonach ich gesucht habe. Aber was ist daran so schlecht?

-
mit goto wird der code schnell unübersichtlich.
-
Thundereye schrieb:
mit goto wird der code schnell unübersichtlich.
Naja, ich brauche ja nur eins davon.

-
Verzweifter Neuling
schrieb:Achso, ich dachte es gibt da vielleicht etwas komfortableres aber danke!

Was soll an einer Schleife denn unkomfortabel sein? Ich denke das ist wesentlich komfortabler als ein goto und viel übersichtlicher auf jeden Fall.
-
Verzweifter Neuling
schrieb:Achso, ich dachte es gibt da vielleicht etwas komfortableres aber danke!

Schleifen sind komfortabel
Die einzige Steiergung (gerade wenn du solche Abfragen häufiger durchführen willst) ist es wohl, das ganze (inklusive der Schleife) in eine eigene Funktion auszulagern.
-
wenn man kontrollfluß und ein-/ausgaben strikt trennt, sind schleifen übersichtlich und komfortabel. wenn natürlich in deinem schleifenkörper 500 zeilen code stehen, weil alles monolithisch an ort und stelle steht, dann kann ne schleife schon unübersichtlich werden.
-
Das ändert aber nichts daran, daß sie um Längen besser sind als g*** (und wer solche monolithischen "Super"funktionen schreibt, ist sowieso nicht mehr zu retten).
-
goto sollte man sich üüüberhaupt nicht angewöhnen. In C++ braucht man es nicht. Der Befehl ist überhaupt nur da um da zu sein, nicht um ihn zu benutzen. Zu einer Programmiersprache gehört einfach die Möglichkeit des goto, aber wo es irgendwie geht, sollte man besseren Möglichkeiten nutzen, die angeboten werden. Das sind für diese Anwendung Schleifen. So wird der Code einfach übersichtlicher und nachvollziehbarer:
Mal ein Beispiel zum Vergleich. Die Schleifenversion bildet einen schönen Block um den Code, der wiederholt werden soll. Bei der goto-Version wird einfach wild im Code rumgesprungen. Da sieht man dann nicht direkt, dass es sich faktisch um eine Schleife handelt.
// Spaghetticode: int counter = 0; loop: ++counter; cout << counter; if (counter < 5) goto loop; // Schleife: int counter = 0; while (counter < 5) { ++counter; cout << counter; }
-
CStoll schrieb:
Das ändert aber nichts daran, daß sie um Längen besser sind als g*** (und wer solche monolithischen "Super"funktionen schreibt, ist sowieso nicht mehr zu retten).
glaub du hast mich falsch verstanden, aber macht nix

-
Wie sollte ich dich denn verstehen?
thordk schrieb:
wenn natürlich in deinem schleifenkörper 500 zeilen code stehen, weil alles monolithisch an ort und stelle steht, dann kann ne schleife schon unübersichtlich werden.
So ein Anweisungsblock ist schon von sich aus unübersichtlich, da kann die Schleife drumherum auch nichts mehr daran verbessern. (aber selbt bei einem solchen Block ist eine Schleife übersichtlicher als ein 'goto begin;')
-
ich habe nirgendwo erwähnt, dass monolithische blocks toll sind oder goto chic. ganz im gegenteil, aber genau das hast du da reininterpretiert. das war mit "glaub du hast mich falsch verstanden" gemeint

-
Sorry, aber deine Aussage klang so, als ob die Schleife den monolithischen Block unübersichtlich machen würde
