Zahlenratespiel von Stroustrup
-
DirkB schrieb:
Dann ist deine Abbruchbedingung nicht richtig.
Lies dir die Antworten mal richtig durch:Hyde++ schrieb:
...Wenn das Intervall nur noch eine Zahl enthaelt - naemlich die gesuchte.
Danach solltest du deine Schleife ausrichten.DirkB schrieb:
5. ist obere und untere Grenze gleich? Nein, dann weiter bei 2.
Da steht nichts von: Solange du eine gültige Eingabe bekommst, .....
Dann ist bei mir leider wieder alles falsch. Die obere/untere Grenze wird bei mir nie gleich.
Ich fang nochmal von vorne an aber ich zweifel langsam was mein Abstraktionsvermögen angeht da die Aufgabe nun eigentlich Kindergarten ist und ich nach 3 Tagen immer noch nicht dahinter gestiegen bin.
-
Dann ist bei mir leider wieder alles falsch. Die obere/untere Grenze wird bei mir nie gleich.
Korrekt. Dazu nochmal genau ueberlegen, welche Ja/Nein-Fragen du stellst:
"Ist die Zahl kleiner oder gleich x?" Wenn du hier mit Nein anwortest, setzt du das untere Limit auf x.
Das bedeutet, die kleinste Zahl die deine zahl annehmen koennte, waere x.
Aber die Frage war kleiner ODER GLEICH. Wenn du hier mit nein antwortest, sagst du also, dass deine Zahl groesser als x ist. Du musst hier also low = middle + 1 setzen.Edit:
Lass dich nicht entmutigen! Um Programmieren zu lernen braucht man nun mal Zeit. Wenn C++ deine erste Sprache ist, wird es umso schwieriger. Ich habe auch mit c++ angefangen und habe Monate gebraucht, um ueberhaupt ein einfaches Programm zu schreiben, dass ohne Fehler kompiliert.
An der Aufgabe, die Binaerdarstellung einer Zahl zu erzeugen, bin ich voellig gescheitert.Wenn dich das interessiert, bleib dran. Am besten ist es, wenn du irgendwann mal ein echtes Projekt hast, dass du umsetzen kannst. Ich bin Elektrotechniker, hatte nur absolut rudimentaere Programmierkurse in Java und schreibe momentan meine Bachelorarbeit in c++. Das ist zwar kein Grossprojekt, aber es ist trotzdem ein schoenes Gefuehl, mal die Sachen, die man ueber die Jahre so liesst, wirklich anzuwenden. Hier im Forum mitlesen hilft auch schon einiges, da man manche Sachen, die man besser vermeiden sollte, die man besser nutzen sollte usw. unbewusst aufnimmt.
Zum abstrakten Denken: ueben, ueben, ueben. Das kommt leider nicht von irgendwo her, ich fand es als Programmierneuling eine sehr eigenartige Denkweise.
Heute helfe ich ab und zu meiner Schwester in Programmierhausaufgaben der Uni (meistens Python) und bin erstaunt, welche (vermeintlich einfachste) Konzepte ihr nicht klar sind. Das ist natuerlich nicht ihr Fehler, man neigt nur dazu, viel zu lernen und zu verinnerlichen, dass man vergisst, welche Probleme Schwierigkeiten bereiten.
Also: Kopf hoch!
-
Hyde++ schrieb:
Lass dich nicht entmutigen!
Nein, und danke

Hyde++ schrieb:
Zum abstrakten Denken: ueben, ueben, ueben.
Mach ich, zum Glück kann ich mir Zeit lassen und kann das einfach mal beiseite legen und dann nochmal neu rann. Aber bis jetzt hat das noch nicht "klick" gemacht.
Hyde++ schrieb:
Du musst hier also low = middle + 1 setzen.
Ok, das verstehe ich glaube ich. Weil ja im "ja" Fall 1-50 schon abgedekt
ist muss es dann bei "nein" 51-100 sein.
-
Ok ich glaube jetzt klappts. Das "+1" hat geholfen. Jetzt werden Unter/Obergrenze auch mal gleich.
#include "std_lib_facilities.h" // vorgefertigte Datei für das Buch int main() // C++-Programme beginnen mit der Ausführung von main { char qst = 'n'; int high = 100; int low = 1; int middle = 50; int runde =0; cout << "kleiner oder gleich " << middle << " ? (j,n)\n"; while (cin >> qst) { runde = runde+1; cout << "Frage= " << runde << endl; if (qst == 'j') { high = (high+low)/2; middle =((high-low)/2)+low; } else if (qst == 'n') { low = ((low+high)/2)+1; middle = ((high-low)/2)+low; } else cout << "Falsche Eingabe!\n"; cout << "high= " << high << endl; cout << "middle= " << middle << endl; cout << "low= " << low << endl; cout << "Runde= " << runde << endl; if (low != high) cout << "kleiner oder gleich " << middle << " ? (j,n)" << endl; else cout << "Die Zahl ist " << middle << endl; } return 0; }
-
Ich weiß nicht *kopfkratz* ist
cin >> qstwirklich eine gute Abbruchbedingung?
Warum überhaupt eine kopfgesteuertewhile(...){}-Schleife wenn die Werte für eine sinnvolle Abbruchbedingung erst nach Ausführung des Schleifenkörpers feststehen?
do{}while(...)
-
Swordfish schrieb:
Ich weiß nicht *kopfkratz* ist
cin >> qstwirklich eine gute Schleifenbedingung?Weiß ich leider auch nicht aber die Schleife wurde in dem Buch bis zu der Übung schon öfters so zur Demonstration verwendet, oder soll das ein "Wink" in Richtung Optimierung sein?

-
pauledd schrieb:
Swordfish schrieb:
Ich weiß nicht *kopfkratz* ist
cin >> qstwirklich eine gute Schleifenbedingung?Weiß ich leider auch nicht aber die Schleife wurde in dem Buch bis zu der Übung schon öfters so zur Demonstration verwendet,
Du weißt also garnicht, wann
cin >> qstzufalsewird?pauledd schrieb:
oder soll das ein "Wink" in Richtung Optimierung sein?

Nein. Ich will daß du über eine Abbruchbedingung nachdenkst, die
falsewird, wenn du die gedachte Zahl gefunden hast.
-
Ich glaube du meinst eher so:
#include "std_lib_facilities.h" // vorgefertigte Datei für das Buch int main() // C++-Programme beginnen mit der Ausführung von main { char qst = 'n'; int high = 100; int low = 1; int middle = 50; while (low != high) { cout << "kleiner oder gleich " << middle << " ? (j,n)\n"; cin >> qst; if (qst == 'j') { high = (high+low)/2; middle =((high-low)/2)+low; } else if (qst == 'n') { low = ((low+high)/2)+1; middle = ((high-low)/2)+low; } else cout << "Falsche Eingabe!\n"; } cout << "Zahl ist " << middle << endl; return 0; }
-
Eigentlich hab ich die Aufgabe immer noch nicht...
Verwenden Sie die Operatoren < und <=
in meinem Programm kommen die nicht einmal vor.
-
Naja, falls die Aufgabe wirklich so gemeint ist, dann hast du mit deiner fleißigen Tipparbeit von ~500 Zeilen eh schon gezeigt, daß du's kannst.
Vorschlag:
#include <iostream> using std::cout; using std::cin; int main() { char qst; // = 'n'; nee. unsiniger Wert zur Initialisierung int low = 1; int high = 100; do { cout << "kleiner oder gleich " << low + (high - low) / 2 << " ? (j,n)\n"; cin >> qst; if (qst == 'j') high = (low + high) / 2; else if (qst == 'n') low = (low + high) / 2 + 1; else cout << "Falsche Eingabe!\n"; } while(low != high); cout << "Zahl ist " << low << /* endl nee, flushen brauchts wirklich nicht */ '\n'; // return 0; unnoetig. main() gibt immer 0 zurueck wenn sie nichts zurueckgibt. }// edit: haesslichkeiten entfernt
-
Swordfish schrieb:
char qst; // = 'n'; nee. unsiniger Wert zur InitialisierungBin sehr dankbar, daß Du ihn nicht initialisierst.
Hab dafür ein Kopf-Makro:
#define "nee, unsinnig zu initialisieren" "tu mal lokaler machen"
, das klappt fast immer.
-
volkard schrieb:
Bin sehr dankbar, daß Du ihn nicht initialisierst.
Hey, hast Du mir beigebracht!

volkard schrieb:
#define "nee, unsinnig zu initialisieren" "tu mal lokaler machen"
Ja. Sorry, Kopf-Praeprozessor nicht drueberlaufenlassen.
@pauledd: tu mal lokaler machen!
-
@Swordfish
Das "do{}" hatte ich noch nicht in dem Buch,ich werde sicherlich im Laufe des Buches noch darauf stoßen und vielen Dank für die Vorschläge und Hinweise auch von den anderen.
Ich werde jetzt mal die nächsten Übungen durchmachen.@pauledd: tu mal lokaler machen!
Was meinst du? Soll ich sächsisch Schreiben?
-
pauledd schrieb:
@pauledd: tu mal lokaler machen!
Was meinst du? Soll ich sächsisch Schreiben?
Variablen so lokal wie möglich deklarieren:
{ char ch; { { cin >> ch; } } }vs.
{ { { char ch; cin >> ch; } } }
-
ah verstehe, so nah wie möglich an die Verwendungsstelle.
-
Genau: So nah wie möglich, so fern wie nötig.
-
Swordfish schrieb:
Hey, hast Du mir beigebracht!

Danke für die Rückmeldung. Das freut mich.
Und es motiviert mich doppelt, da ich gerade hier auch sehen darf, daß Du einer der wenigen bist, der in der Lage ist, noch einfachen Code zu schreiben, was ich klasse finde, und ich vielleicht unter Umständen daran mitgeholfen haben könnte.