boeseskeksi Geschrieben 9. Juli 2010 Geschrieben 9. Juli 2010 Hallo, ich hab hier meinen einfachen Taschenrechner den ich etwas ausbauen möchte, ich möchte mit dem Ergebnis weiter rechnen können, hier mal mein bisheriger Code: #include <cstdlib> #include <iostream> using namespace std; float zahl1, zahl2,ergebnis; int rechen; char antwort = ' '; int main(int argc, char *argv[]) { begin: cout<< " Wählen Sie eine Rechenart aus : Addition [1] Subtraktion [2] Multiplikation [3] Division [4]. " ; cin>> rechen; cout<< " Bitte geben Sie die erste zahl ein: "; cin>>zahl1; cout<<endl; cout<< " Bitte geben Sie die zweite Zahl ein: "; cin>>zahl2; switch (rechen) { case 1 : ergebnis=zahl1+zahl2; break; case 2 : ergebnis=zahl1-zahl2; //if (zahl1<zahl2) {cout<< "nicht moeglich!";} break; case 3 : ergebnis=zahl1*zahl2; break; case 4 : ergebnis=zahl1/zahl2; break; } cout<<"Das Ergenbis lautet: "<<ergebnis<<endl; abfrage: cout<<"noch ein Versuch ? Ja (j) /Nein (n): "; cin>>antwort; if (antwort == 'j') { goto begin; } else if (antwort == 'n') goto end; else cout<< "Sie koennen nur j oder n eingeben"<<endl; goto abfrage; end: system("PAUSE"); return EXIT_SUCCESS; } Zitieren
Klotzkopp Geschrieben 9. Juli 2010 Geschrieben 9. Juli 2010 Bevor du da irgendetwas hinzufügst, solltest du die gotos loswerden. So etwas soll man sich gar nicht erst angewöhnen, wenn es eine einfache Schleife auch tut. Zitieren
boeseskeksi Geschrieben 12. Juli 2010 Autor Geschrieben 12. Juli 2010 Ja das ist mir klar sitz grad dran allerdings bin ich noch nicht soweit, mein Script von Datadidact erklärt die While-Schleife eher schlecht als recht muss ich sagen -.- Zitieren
Klotzkopp Geschrieben 12. Juli 2010 Geschrieben 12. Juli 2010 Ich gebe dir einmal eine Starthilfe: #include <iostream> using namespace std; int main(int argc, char *argv[]) { float zahl1, zahl2, ergebnis; int rechen; char antwort = ' '; do { cout<< " Wählen Sie eine Rechenart aus : Addition [1] Subtraktion [2] Multiplikation [3] Division [4]. " ; cin>> rechen; cout<< " Bitte geben Sie die erste zahl ein: "; cin>>zahl1; cout<<endl; cout<< " Bitte geben Sie die zweite Zahl ein: "; cin>>zahl2; switch (rechen) { case 1 : ergebnis=zahl1+zahl2; break; case 2 : ergebnis=zahl1-zahl2; //if (zahl1<zahl2) {cout<< "nicht moeglich!";} break; case 3 : ergebnis=zahl1*zahl2; break; case 4 : ergebnis=zahl1/zahl2; break; } cout<<"Das Ergenbis lautet: "<<ergebnis<<endl; do { cout<<"noch ein Versuch ? Ja (j) /Nein (n): "; cin>>antwort; if (antwort != 'j' && antwort != 'n') cout<< "Sie koennen nur j oder n eingeben"<<endl; } while(antwort != 'j' && antwort != 'n'); } while(antwort == 'j'); return EXIT_SUCCESS; }[/code]Das ist dein Programm, ohne gotos, und ordentlich eingerückt. Du solltest undebingt auf eine richtige Einrückung achten, sonst geht dir bei größeren Programmen ganz schnell die Übersicht verloren. Zitieren
boeseskeksi Geschrieben 12. Juli 2010 Autor Geschrieben 12. Juli 2010 (bearbeitet) while (antwort == ' j ') sagt der Schleife also dass sie weitermachen soll ? Also immer weiterlaufen bis die Bedingung nicht mehr erfüllt ist Bearbeitet 12. Juli 2010 von boeseskeksi Zitieren
Klotzkopp Geschrieben 12. Juli 2010 Geschrieben 12. Juli 2010 while (antwort == ' j ') sagt der Schleife also dass sie weitermachen soll ?Genau, wenn an dieser Stelle die Bedingung true ergibt, fängt die Schleife wieder von vorne an. Die do/while-Schleife ist für Anfänger am einfachsten zu verstehen. Sie wird immer mindestens einmal durchlaufen, und am Ende kann man eine Wiederholungsbedingung angeben. Bei der while-Schleife muss man die Bedingung am Anfang angeben, dadurch kann es sein, dass die Schleife komplett übersprungen wird, wenn die Bedingung gleich am Anfang false ergibt. Die for-Schleife ist eine spezialisierte Schleifenform mit einem Initialisierungs- und einem Schritt-Teil. Letztlich sind sie aber alle äquivalent, man kann jeden Schleifentyp in jeden anderen überführen. Man kann übrings auch mit break aus der innersten aktiven Schleife herausspringen und mit continue einen neuen Schleifendurchlauf starten. Beide Anweisungen verhalten sich insofern wie goto, haben aber nicht denselben unstrukturierten Beigeschmack, weil man nicht irgendwohin springen kann, sondern eben nur an den Anfang oder ans Ende der Schleife. Zitieren
boeseskeksi Geschrieben 13. Juli 2010 Autor Geschrieben 13. Juli 2010 Nachdem ich das mit der while-Schleife nun auch verinnerlicht habe, kommen mir da so einige andere gedanken, wie zum Beispiel : Die Anfangsabfrage geht bis 4, es sollen aber keine Buchstaben eingegeben werden,ich dachte es geht vlt mit isnum() oder isdigit(), jedoch war bis jetzt alles erfolglos if (isdigit(rechen)) cout<<"bitte keine Buchstaben!"<<endl; Das Programm läuft zwar, allerdings sobald ich dann einen Buchstaben eingebe, verursacht die den Absturz des Programms, ohne diese Anweisung verursacht eine Buchstabeneingabe eine Endlosschleife der do/while-Schleife und lässt sich nur mit strg+c hart abbrechen :upps Dann wäre da natürlich auch noch meine ursprüngliche Frage: Wie rechne ich mit dem Ergebnis weiter? lg keksi Zitieren
Ntl Geschrieben 13. Juli 2010 Geschrieben 13. Juli 2010 if (isdigit(rechen)) cout<<"bitte keine Buchstaben!"<<endl; Deine Schleife sagt: Wenn der Wert von "rechen" eine Zahl ist, gib "bitte keine Buchstaben!" aus. Was du willst ist aber: Wenn der Wert von "rechen" keine Zahl ist, gib "bitte keine Buchstaben!" aus. Zitieren
Klotzkopp Geschrieben 13. Juli 2010 Geschrieben 13. Juli 2010 Das Programm läuft zwar, allerdings sobald ich dann einen Buchstaben eingebe, verursacht die den Absturz des Programms, ohne diese Anweisung verursacht eine Buchstabeneingabe eine Endlosschleife der do/while-Schleife und lässt sich nur mit strg+c hart abbrechen :uppsDu kannst das abfangen. Siehe hier: http://forum.fachinformatiker.de/c-c/139793-erstellen-doppeltverketteten-liste.html#post1244301 Dann wäre da natürlich auch noch meine ursprüngliche Frage: Wie rechne ich mit dem Ergebnis weiter?Indem du die Variable zahl nach dem ersten Durchlauf nicht vom Benutzer eingeben lässt, sondern ihr den Wert von ergebnis zuweist. Dazu müsstest du den ersten Schleifendurchlauf erkennen können. Du könntest eine bool-Variable hinzufügen (das wäre sauberer) oder die Variable antwort benutzen, denn die ist nur beim ersten Durchlauf ' ', danach hat sie den Wert 'j'. Zitieren
boeseskeksi Geschrieben 13. Juli 2010 Autor Geschrieben 13. Juli 2010 jo, du musst verzeihen ich fang grad iwie im urschleim an ^^ also hab noned soviel drauf allerdings weiß ich nid wie ich meinem prog sag das es keine buchstaben nimmt oO @ Klotzkopp muss ich mal guggen wie ich das Umsetz ^^ danke Zitieren
Klotzkopp Geschrieben 13. Juli 2010 Geschrieben 13. Juli 2010 Was du willst ist aber: Wenn der Wert von "rechen" keine Zahl ist, gib "bitte keine Buchstaben!" aus.rechen ist ein int, das ist immer eine Zahl. Diese Prüfung ist insofern Unsinn. isdigit (und die anderen is...-Funktionen) prüfen immer Zeichen einer Zeichenkette. Wenn man sofort in numerische variablen einliest, kann man mit ihnen nichts mehr anfangen. Aber man sollte so etwas ohnehin besser dem jeweiligen Eingabeoperator überlassen. Die Prüfung, ob eine eingegebene Zeichenkette eine gültige Fließkommazahl ist, ist nicht ganz einfach. Zitieren
boeseskeksi Geschrieben 22. Juli 2010 Autor Geschrieben 22. Juli 2010 (bearbeitet) #include <cstdlib> #include <iostream> #include <ctype.h> using namespace std; int main() { float zahl1, zahl2, ergebnis; int rechenart; char antwort = 'j'; while(antwort == 'j') { cout<< " Waehlen Sie eine Rechenart aus :"<<endl<<" Addition [1], Subtraktion [2], Multiplikation [3], Division [4]: " ; cin>> rechenart; cout<<endl; if ( rechenart >= 1 && rechenart <= 4) { cout<< "Bitte geben Sie die erste Zahl ein : "; cin>>zahl1; cout<< " Bitte geben Sie die zweite Zahl ein: "; cin>>zahl2; switch (rechenart) { case 1 : ergebnis=zahl1+zahl2; break; case 2 : ergebnis=zahl1-zahl2; break; case 3 : ergebnis=zahl1*zahl2; break; case 4 : ergebnis=zahl1/zahl2; if ( zahl2 == 0) { cout<< "Teilen durch 0 ist nicht moeglich!"<<endl; continue;} break; } cout<<"Das Ergenbis lautet: "<<ergebnis<<endl; } else if ( rechenart >= 4) { cout<< "Fehler,es sind nur Zahlen von 1-4 zulaessig!"<<endl; cout<<endl; continue; } cout<<"noch ein Versuch ? Ja (j) /Nein (n): "; cin>>antwort; } while (antwort != 'j' && antwort != 'n') { if (antwort != 'j' && antwort != 'n') cout<< "Sie koennen nur j oder n eingeben"<<endl; } system("PAUSE"); } Soweit bin ich jetzt mal, mit den Buchstaben hatte ich noch kein Glück -.- Bearbeitet 22. Juli 2010 von boeseskeksi Zitieren
oxygen Geschrieben 22. Juli 2010 Geschrieben 22. Juli 2010 Hab da nen Fehler entdeckt: else if ( rechenart >= 4) { cout<< "Fehler,es sind nur Zahlen von 1-4 zulaessig!"<<endl; cout<<endl; continue; } Du nimmst hier die 4 auch mit wegen >=, allerdings willst du sie ja in deiner Auswahl mit drin haben, das = muss also weg. Ausserdem brauchst du die elseif nicht unbedingt, ne normale else reicht auch, da du ja vorher 1-4 Aussortierst und alle anderen Werte ungültig sind. Anders wär das jetzt, wenn du beispielsweise sagen willst, ob ein zu niedriger oder zu hoher Wert eingegeben worden ist. Um weiter zu Rechnen musst du vor der Eingabe der Zahlen verzweigen und überprüfen, ob du im ersten durchlauf bist oder nicht (wie von Klotzkopp beschrieben) und je nachdem entweder deinen bestehenden Ablauf verwenden oder nur eine Zahl einlesen und diese mit deinem vorigen Ergebnis verrechnen, also entweder mit der Variable ergebnis direkt rechnen, was aber unübersichtlich werden kann oder dein Ergebnis in eine der "zahl"-Variablen schreiben. Zitieren
boeseskeksi Geschrieben 22. Juli 2010 Autor Geschrieben 22. Juli 2010 In erster Linie ist die Sache mit dem Ergebnis weiterzurechnen auf Eis gelegt, was isch eigentlich möchte ist: Wenn bei der Auswahl der Rechenart ein Buchstabe eingegeben wird Dann gebe aus : Bitte keine Buchstaben eingeben springe zum Schleifen-Anfang sonst weitermachen Leider weiß ich nicht wie ich das ganze in C++ umsetze. Zitieren
oxygen Geschrieben 22. Juli 2010 Geschrieben 22. Juli 2010 Da du eine variable mit dem Typ int verwendest, sind Buchstaben nicht erlaubte Werte, deshalb steigt auch das Programm dann aus. Wenn ich jetzt nicht zu kompliziert denke, musst du den Fehler, der abgefeuert wird, wenn deine Eingabe einen ungültigen Wert hat, abfangen und entsprechend in deine Schleife springen. Schau mal Diesen Thread zum Thema an. Hab ihn nicht ganz durchgelesen, aber Klotzkopp hat da auch was interessantes Geschrieben: Wenn der Benutzer einen oder mehrere Buchstaben eingibt, bekommt Dein int den Wert 0. Wenn Null keine gültige Eingabe ist, dann prüf einfach den Wert nach der Eingabe und brich gegebenenfalls ab. Wenn Null ein erlaubter Wert sein soll, dann liegt der Fehler an einer anderen Stelle in Deinem Programm. Was machst Du mit der eingegebenen Zahl? Zitieren
TDM Geschrieben 28. Juli 2010 Geschrieben 28. Juli 2010 In erster Linie ist die Sache mit dem Ergebnis weiterzurechnen auf Eis gelegt, was isch eigentlich möchte ist: Wenn bei der Auswahl der Rechenart ein Buchstabe eingegeben wird Dann gebe aus : Bitte keine Buchstaben eingeben springe zum Schleifen-Anfang while(antwort == 'j') { [INDENT]cout<< " Waehlen Sie eine Rechenart aus :"<<endl<<" Addition [1], Subtraktion [2], Multiplikation [3], Division [4]: " ; if(!(cin>> rechenart)) {[INDENT] cout << "Bitte keine Buchstaben eingeben." << endl; cin.clear(); continue; [/INDENT] } cout<<endl; [/INDENT] Man könnte natürlich auch good, bad, fail oder eine manuelle Prüfung (string Eingabe) benutzen. Geschmackssache. Zitieren
Empfohlene Beiträge
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.