Zum Inhalt springen

Problem mit do schleife in c++


Empfohlene Beiträge

Geschrieben

ich bin eine blutige anfängerin was programmieren angeht und über die ferien haben wir jetzt die aufgabe bekommen ein "spiel" zuprogrammieren

Aufgabenstellung:

Schreibe ein C++-Programm "Zahlenraten" mit folgenden Inhalt:

Der Computer "denkt" sich eine Zahl aus (zwischen 1 und 999), die man erraten muss.

Wie ein Computer sich eine Zahl erdenkt, könnt ihr bei "Zufallszahlengenerator" nachlesen.

Der Dialog soll ungefähr so ablaufen:

Man gibt eine Zahl ein und der Computer antwortet, ob seine Zahl grösser oder kleiner ist, als die des Benutzers. Dann kann der Benutzer erneut eine Zahl eingeben.

Das Ganze geht so lange, bis der Benutzer die Zahl herausgefunden bzw. erraten hat oder er die erdachte Zahl nach 12 Versuchen nicht herausgefunden hat.

An für sich funktioniert das alles super bei mir, aber ich hätte jetzt gerne dass man gefragt wird ob man nochmal spielen möchte...und das es dann praktisch von vorne anfängt nur will das nicht funktionieren, weil es irgendwie nich mehr in die while schleife reingeht.

Das wär das, was ich bis jetzt habe...bedanke mich schon mal im vorraus für Hilfe.


#include<conio>
#include<math>
#include<iostream>
using namespace std;

int main()
{
int zahl;
int counter=1;
int zufallszahl;
int ug=1;
int og=999;
int x;

cout << "..:Zahlenraten:.." <<endl;
cout<<endl;
cout<<"Spielanleitung: Der Computer legt eine Zahl zwischen 1 und 999 per Zufall fest. Sie haben 12 Versuche diese Zahl zu erraten! Der Computer wird ihnen sagen ob die von ihnen eingegebene Zahl, gr\x94\xe1\er oder kleiner als die Zufallszahl ist. Viel Spa\xe1!"<<endl;
cout<<endl;

do{ //Beginng Do-schleife

randomize(); //Zufallszahl berechnen
zufallszahl=(rand()%og)+ug;

cout<<"Geben Sie bitte eine Zahl ein:";

while ((zahl!=zufallszahl)&&(counter<=12)){ //Beginn While

cout<<endl;
cout<<counter<<". Versuch:";

cout<<" ";
cin>>zahl; //Zahleingabe

if (zahl>zufallszahl){
cout<<"Zahl ist kleiner als "<<zahl<<endl;
}

if (zahl<zufallszahl){
cout<<"Zahl ist gr\x94\xe1\er als "<<zahl<<endl;
}

counter++;
} //Ende while

if (zahl==zufallszahl) {
cout<<"Herzlichen Gl\x81\ckwunsch! Sie haben die Zahl nach dem "<<counter-1<<". Versuch erraten!"<<endl;
}

if ((zahl!=zufallszahl)&&(counter>12)){
cout<<endl;
cout<<"Leider nicht geschafft!"<<endl;
cout<<"Die richtige Zahl w\x84re: "<<zufallszahl<<" gewesen."<<endl;
}

cout<<endl; //Leere Zeile
cout<<"Nochmal spielen?1/0"<<endl;
cin>>x;

}while(x==1); //Ende do

getch();
return 0;
}[/PHP]

Geschrieben

Baue doch einfach um die While Schleife noch eine Schleife, die abbricht, wenn der Benutzer "nein" eingibt. Die Initialisierung machst du dann in der äußersten Schleife, damit hast Du bei jedem Versuch wieder die Startwerte. Die Deklaration machst Du besser außerhalb der Schleife

HTH Phil

Geschrieben

Hallo ,

Versuch mal es mal ein marke zu setzen. Damit müsste es gehen!!

#include<conio>

#include<math>

#include<iostream>

using namespace std;


int main()

{

        int zahl;

        int counter=1;

        int zufallszahl;

        int ug=1;

        int og=999;

        int x;


        cout << "..:Zahlenraten:.." <<endl;

        cout<<endl;

        cout<<"Spielanleitung: Der Computer legt eine Zahl zwischen 1 und 999 per Zufall fest. Sie haben 12 Versuche diese Zahl zu erraten! Der Computer wird ihnen sagen ob die von ihnen eingegebene Zahl, gr\x94\xe1\er oder kleiner als die Zufallszahl ist. Viel Spa\xe1!"<<endl;

        cout<<endl;

        marke:  // <-- Marke setzen!!

        do{ //Beginng Do-schleife


                randomize();                  //Zufallszahl berechnen

                zufallszahl=(rand()%og)+ug;


                cout<<"Geben Sie bitte eine Zahl ein:";


                while ((zahl!=zufallszahl)&&(counter<=12)){ //Beginn While


                        cout<<endl;

                        cout<<counter<<". Versuch:";


                        cout<<" ";

                        cin>>zahl;  //Zahleingabe


                        if (zahl>zufallszahl){

                                cout<<"Zahl ist kleiner als "<<zahl<<endl;

                        }


                        if (zahl<zufallszahl){ 

                                cout<<"Zahl ist gr\x94\xe1\er als "<<zahl<<endl;

                        }


                        counter++;

                } //Ende while


                if (zahl==zufallszahl) {

                        cout<<"Herzlichen Gl\x81\ckwunsch! Sie haben die Zahl nach dem "<<counter-1<<". Versuch erraten!"<<endl;

                }


                if ((zahl!=zufallszahl)&&(counter>12)){

                        cout<<endl;

                        cout<<"Leider nicht geschafft!"<<endl;

                        cout<<"Die richtige Zahl w\x84re: "<<zufallszahl<<" gewesen."<<endl;

                }


        cout<<endl; //Leere Zeile

        cout<<"Nochmal spielen?1/0"<<endl;

        cin>>x;

 if (x=="1")

    {

    goto marke;

    }

    if (x=="0")

    {

    system("close");

    } 


        return 0; 

Dann durch eine if Verzweigung das Problem lösen!!

Mfg

Singh

Geschrieben
Versuch mal es mal ein marke zu setzen. Damit müsste es gehen!!
Sicher, das geht, ist aber stilistisch äußerst fragwürdig. Es mag Fälle geben, in denen goto angebracht ist, weil es den Code vereinfacht, aber hier würde ich das auf keinen Fall machen.

Es ist auch gar nicht notwendig. Hier ist schon eine funktionierende Schleife. Hier wurde nur vergessen, die Variable counter zurückzusetzen.

Geschrieben

Also in einer kleinen Funktion mit vielen geschachtelten Schleifen kann ein goto error; ganz nützlich, und vor allem übersichtlicher als andere Vorgehensweisen sein.

Geschrieben
Das Problem mit den Schleifen kann aber auch durch ein schönes break bzw. durch Exception-Handling gelöst werden.

Ein break hilft nur bei einfachen Schleifen, nicht bei mehreren verschachtelten. Will man da aus einer der inneren Schleifen herausspringen, muss man etwas anderes benutzen, z.B. eine bool-Variable, die in jeder Schleifenbedingung zusätzlich geprüft wird. Man kann auch das gesamte Schleifenkonstrukt in eine eigene Funktion auslagern, und dann mit einer return-Anweisung vorzeitig rausspringen.

Exceptions würde ich in so einem Fall auch nur mit Vorsicht einsetzen. Exceptions sagen für mich im Code etwas besonderes aus, nämlich dass eine Ausnahmesituation behandelt wird, etwas, das im normalen Programmablauf nicht vorhersehbar ist. Eine Exception für einen zwar vorzeitigen, aber dennoch erwarteten Abbruch zu verwenden, halte ich deshalb für fragwürdig.

IMHO ist es nicht sinnvoll, irgendein Sprachmittel grundsätzlich abzulehnen. Wer goto ohne Kenntnis der Situation verteufelt, sollte IMHO auch gleich von break, continue und vorzeitigem return die Finger lassen, denn letztendlich ist das dasselbe: Ein unbedingter Sprung.

Geschrieben

Also meiner Meinung nach ist goto wohl einer der besten Befehle die es gibt. Allerdings sollte man Ihn nur unter bestimmten Bedingungen benutzen.

1. Man kann shcon im voraus damit rechen dass man der Einzige bleibt, der den Quellcode versteht!

2. Man muss es ganz schön drauf ham um ein größeres Programm mit goto zu erstellen und um eventuelle Fehler dann noch beseitigen können.

3. Spätestens 1 Jahr später kann man sich ersteinem wieder 1 Monat lang in den Code einarbeiten, um ihn wieder einigermaßen zu verstehen.

Dennoch, ich liebe goto;)

Geschrieben

Ist nur meine Meinung, aber n goto sollte man NIE verwenden, wenn es auch irgendwie anders geht.

Mit anders gehen meine ich "vernünftige" andere lösungen.

Ich programmier jetzt doch ne gewisse zeit und hab NIE n goto benutzt (ausser in der kurzen Phase, wo ich ASM geschrieben hab :D ).

Zumindest nicht im release, zu testen is das was anderes und meiner Meinung nach ne grossartige Sache, die man aber vor dem release dringend entfernen sollte.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...