Schleife statt goto
-
Hallo,
Ich beschäftige mich erst seit ein paar Tagen mit c++ und hab daher mal ne Anfängerfrage.
Im folgendem Code will ich erreichen, dass das Programm, wenn es durchgelaufen ist, wieder von vorne beginnt.
Das Programm rechnet eine Parabelgleichung mit hilfe der p-q Formel aus.
Ich hab gehört, dass der goto loop; Befehl sehr unschön ist.
Wie kann ich das Programm mit einer Schleife unendlich durchlaufen lassen?#include<iostream> #include <cmath> using namespace std; int main() { float p, q, a, D, pein, qein ; cout << "FUER EIN KOMMA BITTE EINEN PUNKT EINGEBEN" << endl; loop: // Das ist unschön cout << "gib p ein: " << endl; cin >> pein; cout << endl << "gib q ein" << endl; cin >> qein; cout << endl << "gib a ein" << endl; cin >> a; cout << endl; p = pein/a; q = qein/a; D = ((p*p)/4)-q; if (D < 0) { cout << "L = { }" << endl; goto loop; // Das ist unschön return 0; } cout << "D =" << D << endl; cout << "X1 = " << -(p/2)+ sqrt(D) << endl; cout << "X2 = " << -(p/2)- sqrt(D) << endl; cout << "L = { " << -(p/2)+ sqrt(D) << " | " << -(p/2)- sqrt(D) << "}" << endl; goto loop; return 0; }
-
while(true) { ... continue; ...}
-
Wie soll das genau gehen?
Vorallendingen das{ ... continue; ...}
-
Eigentlich ist dieses Forum nicht dazu da, dass Du Deine "Hausaufgaben" nicht mehr machen brauchst...
Du kannst für solche trivialen Dinge entweder Bücher lesen oder im Internet Millionen von Beispielen finden...http://msdn.microsoft.com/library/en-us/vclang/html/_pluslang_the_c.2b2b_.while_statement.asp
-
#include<iostream> #include <cmath> using namespace std; int main() { float p, q, a, D, pein, qein ; cout << "FUER EIN KOMMA BITTE EINEN PUNKT EINGEBEN" << endl; //loop: // Das ist unschön while(true) { cout << "gib p ein: " << endl; cin >> pein; cout << endl << "gib q ein" << endl; cin >> qein; cout << endl << "gib a ein" << endl; cin >> a; cout << endl; p = pein/a; q = qein/a; D = ((p*p)/4)-q; if (D < 0) { cout << "L = { }" << endl; //goto loop; // Das ist unschön continue; return 0; } cout << "D =" << D << endl; cout << "X1 = " << -(p/2)+ sqrt(D) << endl; cout << "X2 = " << -(p/2)- sqrt(D) << endl; cout << "L = { " << -(p/2)+ sqrt(D) << " | " << -(p/2)- sqrt(D) << "}" << endl; //goto loop; continue; return 0; }
Allgemein:
while(Abfrage) { //Block mit Anweisungen und einer Abruchbedingung }
eine while - Schleife wiederholt einen Block solang die Bedingung erfüllt ist und bei continue geht das Programm an den anfang der schleife zurück zur bedingung. das true in der klammer sagt aus dass die schleife nie beendet wird. Soll die schleife z.b. bei einer eingabe beendet werden muss es so aussehen:
char eingabe = ' '; cin >> eingabe; if(eingabe == '0') { break; }
hoffe das hilft
-
kleiner Tip: Du hast da eine nette Endlosschleife (weiß nicht, ob die beabsichtigt ist) - die 'return 0;' Anweisungen werden nie erreicht, da du jeweils kurz vorher an den Schleifenanfang springst, also könntest du sie auch ganz weglassen. Wie wäre es denn mit einer Nutzer-Frage, ob überhaupt nochmal gerechnet werden soll?
-
Ja danke!
Ihr habt mir sehr weiter geholfen!
-
Hatte ich das net auch gesagt @ CStoll dass er noch ne Benutzerabfrage einbauen kann die bei ner 0 zum Beispiel aus der schleife abbricht? ^^
gut, das mit dem return 0 kann man auch weglassen, aber das is ja ne schönheitssache. Ich bins halt gewohnt das bei jedem Programm am ende zu haben, ok ich hab auch nie eine "richtige" endlosschleife ohne benutzerabfrage, aber dann vergisst er es wenigstens nicht wieder reinzunehmen wenn er eine abfrage drin hat