Zahlen raten
-
Hallo, ich soll ein Programm schreiben, welches Zahlen errät und der Benutzer soll entscheiden, ob er bei einem Fehlversuch einen weiteren Versuch haben möchte oder nicht.
#include <iostream> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); int zufallzahl,userzahl; char antwort; zufallzahl = rand() % 10; zufallzahl = zufallzahl+1; do { printf ("Errate meine Zahl zwischen 1 und 10"); scanf("%i",&userzahl); if (zufallzahl > userzahl) printf("..meine Zahl ist groesser\n"); if (userzahl > zufallzahl) printf("..meine Zahl ist kleiner\n"); } { //Fehler cout << "Weiterer Versuch (J/N)? "; cin >> antwort; while ('J' == antwort || 'j' == antwort); } while ( userzahl != zufallzahl ); printf("Geschafft\n"); system ("Pause"); return (0); }
Ich habe das geschrieben und weiß leider nicht, warum der Compiler bei der { einen Fehler anzeigt. Ich hoffe mal ihr könnt mir helfen
Danke
-
Wieso verwendest du Kontrollstrukturen, deren Syntax du offensichtlich nicht kennst? Bitte schau dir doch mal in der Doku an, wie eine do-while-Schleife aufgebaut ist. Dann sollte dir der Fehler klar werden. Tipp: deinem do fehlt das while. Würdest du deinen Code vernünftig formatieren und einrücken, wäre es dir eventuell schon selbst aufgefallen.
Außerdem: wenn du einen Fehler hast, dann sag uns, wo der Fehler auftritt (Zeile) und wie sich das genau äußert (z.B. Fehlermeldung). Ansonsten muss man immer unnötigerweise den ganzen Code selber nach dem Fehler durchsuchen, und das macht irgendwann keinen Spaß mehr. Stelle deine Fragen besser, dann kriegst du schneller und mehr Antworten.
-
Ich habe doch hingeschrieben, wo der Fehler ist mit
// Fehler
-
Brain91 schrieb:
Ich habe doch hingeschrieben, wo der Fehler ist mit
// Fehler
Gut, das hast du tatsächlich gemacht. Die Fehlermeldung fehlt trotzdem. Und ist dir das Problem jetzt klar?
Ist dir auch klar, dass du eine potenzielle Endlosschleife in deinem Code hast? Das zweite while ist völlig sinnlos. Für
userzahl != zufallzahl
bleibt dein Programm dort endlos hängen.
-
Nee irgendwie nicht, leider. Aber ich versuche es weiter.
-
Brain91 schrieb:
Nee irgendwie nicht, leider. Aber ich versuche es weiter.
Ok, mal anders. Bitte zeige mir mal, wie eine do-while-Schleife syntaktisch aufgebaut ist.
-
do { printf ("Errate meine Zahl zwischen 1 und 10"); scanf("%i",&userzahl); if (zufallzahl > userzahl) printf("..meine Zahl ist groesser\n"); if (userzahl > zufallzahl) printf("..meine Zahl ist kleiner\n"); } cout << "Weiterer Versuch (J/N)? "; cin >> antwort; while ('J' == antwort || 'j' == antwort); }
Hier oder?
-
Nochmal: zeige mir, wie eine do-while-Schleife aufgebaut ist. Nicht, wo sich eventuell eine Perversion einer do-while-Schleife in deinem Code befindet.
Schreibe exemplarisch eine Schleife nieder und poste sie hier. Hätte ich nach if gefragt, hätte ich sowas erwartet:
if(Bedingung) { //... }
Sowas für die do-while-Schleife. Es geht schließlich um die Syntax. Wo stehen die Schlüsselwörter, wo stehen die Klammern, wo steht deine Abbruchbedingung...
-
do { Anweisung1; Anweisung2; .... Anweisung_n; } while(<Bedingung>)
-
Brain91 schrieb:
do { Anweisung1; Anweisung2; .... Anweisung_n; } while(<Bedingung>)
Passt bis auf das fehlende Semikolon. Und jetzt zeig mir bitte in deinem richtigen Code mal die schließende, geschweifte Klammer vom do-Block (Zeilennummer reicht).
-
do { printf ("Errate meine Zahl zwischen 1 und 10"); scanf("%i",&userzahl); if (zufallzahl > userzahl) printf("..meine Zahl ist groesser\n"); if (userzahl > zufallzahl) printf("..meine Zahl ist kleiner\n"); }
Das oder?
-
Ja, die letzte Zeile davon ist die schließende, geschweifte Klammer des do-Blocks. Was muss nun folgen?
-
Die while Schleife mit Bedingung eigentlich
-
Brain91 schrieb:
Die while Schleife mit Bedingung eigentlich
Ja, genauergesagt das while-Schlüsselwort mit folgender Bedingung in Klammern und einem abschließendem Semikolon. Und was kommt bei dir?
-
erstmal die Frage und dann das mit while
-
Brain91 schrieb:
erstmal die Frage und dann das mit while
Falsch. Bei dir sieht es so aus:
if (userzahl > zufallzahl) printf("..meine Zahl ist kleiner\n"); } //Hier ist die schließende Klammer des do-Blocks. Es muss nun direkt darauf das while folgen! { //Bei dir folgt aber eine öffnende, geschweifte Klammer.
Klar? Du musst beim Programmieren präzise vorgehen. Ein Zeichen falsch, und der Compiler meckert (zu Recht). Wenn die Syntax so festgelegt ist, dass ein
do
, ein Block mitgeschweiften Klammern (kann man bei Einzeilenanweisungen weglassen, aber egal), dann daswhile
und dann die Bedingung in runden Klammern kommen soll, dann musst du das auch genau so machen. Da kannst du nicht einfach zwischendrin noch weitere zufällige Klammern oder gar ganzeif
-Anweisungen einstreuen. Kannst du deinen Code jetzt so umbauen, dass er wenigstens kompiliert wird?
-
#include <iostream>
#include <cstdlib>
#include <time.h>int main() { srand(time(0)); int zufallzahl,userzahl; char antwort; zufallzahl = rand() % 10; zufallzahl = zufallzahl+1; do { printf ("Errate meine Zahl zwischen 1 und 10"); scanf("%i",&userzahl); if (zufallzahl > userzahl) printf("..meine Zahl ist groesser\n"); if (userzahl > zufallzahl) printf("..meine Zahl ist kleiner\n"); cout << "Weiterer Versuch (J/N)? "; //Fehler `cout' undeclared (first use this function) cin >> antwort; } while ('J' == antwort || 'j' == antwort); while ( userzahl != zufallzahl ); printf("Geschafft\n"); system ("Pause"); return (0); }
wieder neuer fehler
-
Das heißt ja auch std::cout. Und es passt auch so gar nicht zum Rest des Programms. Nimm printf und stdio.h und du hast ein astreines C-Programm.
-
Rücke deinen Code erst mal vernünftig ein, bitte. Vorher hat es imho gar keinen Zweck, weiterzumachen. Einrückung ist dazu da, um Struktur in den Code zu bringen. Die geschweiften Klammern sind übrigens ein hervorragender Indikator für's Einrücken. So sieht ein gut formatiertes Programm aus:
int main() { if(Bedingung) { Anweisung; Anweisung; } while(Bedingung) { Anweisung; if(Bedingung) { Anweisung; Anweisung; } else { Anweisung; } } }
Man kann sofort erkennen, was z.B. genau zum while-Block gehört (und welche Klammern zusammengehören), einfach indem man sich die Einrückung ansieht. Deine Variante ist völlig unlesbar:
int main() { if(Bedingung) { Anweisung; Anweisung; } while(Bedingung) { Anweisung; if(Bedingung) { Anweisung; Anweisung; } else { Anweisung; }} }
Btw, du hast immer noch eine völlig unsinnige Zeile und potenzielle Endlosschleife in deinem Code...