Frage von 5FragenSteller5, 64

Was ist daran der Fehler?

Versuche mich ins Programmieren einzuarbeiten... und Der Fehler ,,goto Frage2'' geht nicht weg bitte schnell helfen... danke

include

include

include

using namespace std;

int main(int argc, char** argv) { string eingabe; int rand = 0 ; cout << "Willkommen zum Quiz. \nZum Starten einfach\"Start\" eingabe. \n"; cin >> eingabe; if (eingabe == "Start") { cout << "Ok,Frage 1: Was ist Mein Lieblinghaustier?\n"; cout << "1. Katze\n"; cout << "2. Hund\n"; cout << "3. Hamster\n"; if(eingabe == "1") { cout << "Das ist Richtig\n"; rand++; }

  Frage2:
        cout << "Ok,Frage 2: Wie Alt bin ich?\n";
cout << "1. 10\n"; 
cout << "2. 14\n";
cout << "3. 18\n";
if(eingabe == "2") {
    cout << "Das ist Richtig\n";
    rand++;

          }else{
    cout << "Das ist Falsch";
    goto end;

        }

        }else{

            cout << "Das ist Falsch"
            goto Frage2;

}

} end: cout << "Sie Haben alle Fragen beantwortet und " << rand << "erriecht\n" system("PAUSE"); return 0;}

WICHTIG!!

hab esüberarbeitet nur jetzt wenn man im Programm Start eingibt um das Quiz zu Starten springt es direkt zur letzen frage und man hat 0 von 2 punkten erreicht 

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von ceevee, 34
Error: expected ';' before goto

sagt dir dein Compiler. Mit anderen Worten: In Zeile 38 fehlt dir ein ; am Ende der Zeile.

Daneben: das Wort "goto" solltest du dir abgewöhnen, das führt zu einem schlechten und unsauberen Programmierstil. In deinem Fall kann man das "goto" durch eine Schleife ersetzen. Gerade wenn du anfängst zu programmieren, solltest du dir ein Buch / Tutorial suchen und das stumpf durcharbeiten, anstatt dir irgendwas ausm Internet zusammenzukopieren, was vielleicht irgendwie funktioniert. system("PAUSE") ist fast genauso schlimm, stattdessen lieber cin.get() am Ende.

Kommentar von 5FragenSteller5 ,

Danke erstmal bis hierhin ein buch dazu bestell ich mir die tage und ein tutorial guck ich mir währenddessen an er hat es genauso gemacht und es hat funktioniert.

Kommentar von ceevee ,

Wenn dein Tutorial auch "goto" nutzt, dann taugt es nix und du solltest dir ein anderes suchen. ;)

Nur weil es funktioniert, heißt noch nicht, dass es gut ist. Wenn die Antwort aus deinem Beispiel falsch ist, dann soll er einmal zu Frage 2 und einmal ans Ende springen? Wozu? Wenn bei dem Quiz noch ein paar Fragen dazukommen würden, dann würdest du mit goto wahrscheinlich auch überhaupt nicht mehr durchsehen.

Antwort
von JSFS2001, 39

Das geht glaub ich gar nicht. So viel ich weis muss da was dazwischen (Also über goto Frage 2). kenn mich mit der Sprache aber nicht so gut aus.

Expertenantwort
von TeeTier, Community-Experte für programmieren, 13

Wenn ich die Wahl zwischen einer Schleife und goto habe, entscheide ich mich auch immer für Letzteres. :)

Kommentar von ceevee ,

Das ist aber nicht gut. Denn durch den BAF kann es auf alten Computern dazu kommen, dass die Sprungadresse nicht mehr korrekt bestimmt wird und das Programm beim goto versehentlich eine Zeile zu früh oder zu spät ansteuert. Das sind anfangs nur minimale Unterschiede - also dass die echte Adresse mal 0,3 Bit weiter ist als die, die angesprungen wird. Aber mit wachsendem BAF werden auch die Unterschiede immer größer, die Resultate können fatal sein.

Wenn du hingegen Schleifen verwendest, dann bist du auf der sicheren Seite. Viele moderne Compiler haben durch den strukturierten Programmaufbau einen eingebauten BAF-Schutz und können Ungenauigkeiten abfangen. Und wenn das Problem doch mal auftritt, dann sieht das Resultat meist echt total lustig aus. Ich schmeiß mich regelmäßig weg, wenn ich sehe, was ein Schleifendurchlauf mehr so alles ausmachen kann.

Hier ist erklärt, wie das Problem im kommenden C++-Standard gelöst ist:

https://en.wikipedia.org/wiki/C%2B%2B17#Bit_Wastage_Factor_Protection

Kommentar von TeeTier ,

Da bist du wohl leider nicht mehr auf dem Laufenden! Wegen des BAF setzen moderne Computer auf Jitter-Adressierung, bei der die selbe CPU-Instruktion einmal direkt VOR und einmal direkt NACH der anzuspringenden Adresse steht. Damit werden Rundungsfehler bei Bits mit einer Abweichung bis knapp über 0,5 ausgeglichen.

Neuere Intel-CPUs erkennen den BAF übrigens automatisch und können die JA dynamisch anpassen, sodass überflüssige zusätzliche Instruktionen vor und nach der Sprungadresse bei brandneuem Speicher wegfallen, und bei altem Speicher sogar vervier- oder versechsfacht werden können.

Im Grunde sieht ein Disassemblat dann (bei 4-fach Jittering) so aus:

  xor eax,eax ; Jitter Level 2 (dynamisch)
xor eax,eax ; Jitter Level 1
label:
xor eax,eax ; Original Ziel-Instruktion
xor eax,eax ; Jitter Level 1
xor eax,eax ; Jitter Level 2

Somit kann der Sprung zur Zieladresse relativ ungenau sein!

Hier noch der Entsprechende Link:

https://en.wikipedia.org/wiki/Jitter-Addressing#dynamic_jittering

Schönen Abend noch! :)

Antwort
von 5FragenSteller5, 23

Jetzt ist bei ,,goto end “ der wurm drin...

Antwort
von bfake, 15

Da steht:

 cout << "Das ist Falsch"

Da gehört hin

 cout << "Das ist Falsch";
Kommentar von 5FragenSteller5 ,

ist doch

Kommentar von bfake ,

Nein:

 }else{
cout << "Das ist Falsch";
goto end;

}

}else{

cout << "Das ist Falsch"
goto Frage2;

Schau mal bei  zweiten cout << "Das ist falsch"

da steht kein ";".

Kommentar von 5FragenSteller5 ,

Ok gefunden und behoben in Zeile 32 spalte 17 hab ich jetzt noch einen Fehler (goto end) und in Zeile 47 spalte 3 auch (return 0; )

Kommentar von Tschoo ,

... aber du willst  unbedingt am "goto" festhalten (weil's einmal funktioniert hat)

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten