Problem mit while - Schleife
-
BBBB schrieb:
Du solltest dir unbedingt Funktionen genauer anschauen. In deinem Code ist so viel Code, der sich wiederholt. Das macht ihn natürlich unnötig lang.
Die Gotos machen den Code schließlich noch unübersichtlicher.Warum dein Code nicht so funktioniert, wie du das willst, lässt sich wegen des sehr unübersichtlichen Codes auch nicht so einfach sagen.
Danke für deine Tipps, doch wie kann ich schlussendlich den Code kürzer fassen? Die einzige Möglichkeit, die mir so spontan einfällt ist Structs, doch die hab ich integriert wos mir möglich war.
-
BBBB schrieb:
Wo wird die Variable
loesunginitalisiert? Ohne Initalisierung kann diese Variable jeden Wert haben ==> Ergebnis undefiniert.Sie ist eine globale Variable und wird am Anfang der Funktion main() definiert.
-
Quatsch, sie wird vor dem Menü des Rechners, wo man Addition Subtraktion ... auswählen kann deklariert.
-
shivan schrieb:
BBBB schrieb:
Wo wird die Variable
loesunginitalisiert? Ohne Initalisierung kann diese Variable jeden Wert haben ==> Ergebnis undefiniert.Sie ist eine globale Variable und wird am Anfang der Funktion main() definiert.
Ja, sie ist global. Aber manchmal auch lokal. Doch einen Wert hast du ihr nie zugewiesen (initalisiert). Ausnahme bei
rechnerauswahl == 3.Probier doch mal:
if(rechnerauswahl == 1) { loesung = 0; // der übrige Code... }Das selbe gilt auch für die anderen Fälle. Dort sollte der Fehler also (manchmal) auch auftreten.
-
Ich hab die Variablen jetzt lokal gemacht, aber nicht initialisiert. Nicht initialisierte Variablen haben ja den Wert 0, dies sollte ja aufs gleiche rauskommen wie loesung = 0;
-
shivan schrieb:
Ich hab die Variablen jetzt lokal gemacht, aber nicht initialisiert. Nicht initialisierte Variablen haben ja den Wert 0, dies sollte ja aufs gleiche rauskommen wie loesung = 0;
Nein, das ist eben nicht der Fall!
C/C++ ist nicht Visual Basic

Die Variable wird nicht automatisch initalisiert. Das heißt sie kann jeden beliebigen Wert haben. Das ist sozusagen Zufall und damit undefiniert.
-
1. globale variablen weden mit einem startwert (meist 0) initialisiert. lokale variablen werden nicht initialisert, sofern sie keinen standardkonstruktor haben, was bei den integrierten typen nicht der fall ist.
2. du musst variablen, sofern sie nicht in der schleife deklariert werden, bei jedem neuen schleifendurchlauf auf 0 setzen
-
shivan schrieb:
Wie schon geschrieben, hab ich ein Problem mit meiner Addition und Subtraktion Funktion, ich habe mir gedacht, dass es mehr Sinn macht, den Code hier zu posten.
Addition
while(wiederholen != 'h' && wiederholen != 'H' && wiederholen != 'j' && wiederholen != 'J' && wiederholen != 'n' && wiederholen != 'N'); }Das einzig Neue ist die do while Schleife in Zeile 20 bzw. 37, doch das sollte ja die Funktionsweise des Rechners nicht beeinflussen.
Sorry, aber die Bedingung ist für´n Fritz.
Du weißt, dass && nur dann wahr ist, wenn alle anderen auch wahr sind?
Das heißt in Pseudocode:
Solange(Wiederholen != 'h' UND wiederholen !='H'....)
Es kann nie beides Wahr sein.
Da gehört ein Oder hin.
Konjunktion == && (Beide Aussagen müssen WAHR sein!)
Disjunktion == || (Nur eine der beiden Aussagen muss WAHR sein!)
Aber, das wird das Problem auch nicht lösen^^ Wollte nur mal erwähnen, das die Bedingung keine Logik hat.
Lg Mentras
-
hmmmm schrieb:
1. globale variablen weden mit einem startwert (meist 0) initialisiert. lokale variablen werden nicht initialisert, sofern sie keinen standardkonstruktor haben, was bei den integrierten typen nicht der fall ist.
2. du musst variablen, sofern sie nicht in der schleife deklariert werden, bei jedem neuen schleifendurchlauf auf 0 setzenAlle slaren Typen haben keinen Konstruktor. Folglich sind diese Variablen auch nicht initalisiert. Ob diese nun lokal oder global sind ist dabei nicht entscheidend.
Mentras schrieb:
shivan schrieb:
Wie schon geschrieben, hab ich ein Problem mit meiner Addition und Subtraktion Funktion, ich habe mir gedacht, dass es mehr Sinn macht, den Code hier zu posten.
Addition
while(wiederholen != 'h' && wiederholen != 'H' && wiederholen != 'j' && wiederholen != 'J' && wiederholen != 'n' && wiederholen != 'N'); }Das einzig Neue ist die do while Schleife in Zeile 20 bzw. 37, doch das sollte ja die Funktionsweise des Rechners nicht beeinflussen.
Sorry, aber die Bedingung ist für´n Fritz.
Du weißt, dass && nur dann wahr ist, wenn alle anderen auch wahr sind?
Das heißt in Pseudocode:
Solange(Wiederholen != 'h' UND wiederholen !='H'....)
Es kann nie beides Wahr sein.
Da gehört ein Oder hin.
Konjunktion == && (Beide Aussagen müssen WAHR sein!)
Disjunktion == || (Nur eine der beiden Aussagen muss WAHR sein!)
Aber, das wird das Problem auch nicht lösen^^ Wollte nur mal erwähnen, das die Bedingung keine Logik hat.
Lg Mentras
Die Bedingung ist vollkommen richtig. Die Schleife wird solange ausgeführt, wie
wiederholennicht den Wert h, H, j, J, n und N hat. Gibst du also x ein, läuft die Schleife weiter. Gibst du jedoch h ein, wird sie unterbrochen. Genau das ist wohl auch die Absicht hinter dieser Schleife.
-
Mentras schrieb:
shivan schrieb:
Wie schon geschrieben, hab ich ein Problem mit meiner Addition und Subtraktion Funktion, ich habe mir gedacht, dass es mehr Sinn macht, den Code hier zu posten.
Addition
while(wiederholen != 'h' && wiederholen != 'H' && wiederholen != 'j' && wiederholen != 'J' && wiederholen != 'n' && wiederholen != 'N'); }Das einzig Neue ist die do while Schleife in Zeile 20 bzw. 37, doch das sollte ja die Funktionsweise des Rechners nicht beeinflussen.
Sorry, aber die Bedingung ist für´n Fritz.
Du weißt, dass && nur dann wahr ist, wenn alle anderen auch wahr sind?
Das heißt in Pseudocode:
Solange(Wiederholen != 'h' UND wiederholen !='H'....)
Es kann nie beides Wahr sein.
Da gehört ein Oder hin.
Konjunktion == && (Beide Aussagen müssen WAHR sein!)
Disjunktion == || (Nur eine der beiden Aussagen muss WAHR sein!)
Aber, das wird das Problem auch nicht lösen^^ Wollte nur mal erwähnen, das die Bedingung keine Logik hat.
Lg Mentras
Die Schleife funktioniert richtig
-
BBBB schrieb:
shivan schrieb:
Ich hab die Variablen jetzt lokal gemacht, aber nicht initialisiert. Nicht initialisierte Variablen haben ja den Wert 0, dies sollte ja aufs gleiche rauskommen wie loesung = 0;
Nein, das ist eben nicht der Fall!
C/C++ ist nicht Visual Basic

Die Variable wird nicht automatisch initalisiert. Das heißt sie kann jeden beliebigen Wert haben. Das ist sozusagen Zufall und damit undefiniert.
Danke! Und genau das war hier das Problem. In den Variablen waren offensichtlich noch andere Werte gespeichert, deshalb stimmte das Ergebnis beim 1. Durchgang jedesmal, jedoch beim 2. Mal nicht.
Ich habe jetzt das Problem gelöst, alles funktioniert wie geplant.
Danke an alle, die sich bemüht haben, mir zu helfen.
Ich werde jetzt noch eine Dokumentation mit PAP und Struktogramm machen, dazu benutze ich Microsoft Visio und Struktugrammer.
Was haltet ihr davon? Gibt es Programme, die besser geeignet wären dafür?
-
Also am folgenden Quelltext ist noch einiges zu ergänzen, Abfrage auf ungültige Eingaben u.s.w.
Aber das mit den Währungen ist schon mal kürzer:
#include <iostream> #include <cmath> // wenn c++, dann nicht math.h #include <windows.h> using namespace std; const unsigned char AE = static_cast<unsigned char>(142); const unsigned char ae = static_cast<unsigned char>(132); const unsigned char OE = static_cast<unsigned char>(153); const unsigned char oe = static_cast<unsigned char>(148); const unsigned char UE = static_cast<unsigned char>(154); const unsigned char ue = static_cast<unsigned char>(129); const unsigned char ss = static_cast<unsigned char>(225); //Variablenvereinbarung int waehrung; int color; int setcolor(); char wiederholen; double strecke; double gewicht; // Struct zur Verwendung von Farben int setcolor() { if (color > 15 || color <= 0) { cout <<"Error" <<endl; } else { HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hcon, color); } } //allgemeine Fehlermeldung long fehleingabe() { system("color 04"); system("cls"); color = 4; setcolor(); cout << "\n\n\n\n\n\n\n\n\n\n ******************************************************************************\n"; cout << " * FEHLEINGABE! *\n"; cout << " ******************************************************************************\n\n"; cout << " Dr"<<ue<<"cken Sie die Eingabetaste, um zum Men"<<ue<<" zur"<<ue<<"ck zu gelangen."; fflush(stdin); getchar(); } //allgemeiner Ausgabetext, bei Beendung des Programms long danke() { system("cls"); cout << "\n\n\n\n\n\n\n\n\n-----------------------------------------------------------"<<endl; cout << " Danke das Sie dieses Programm benutzt haben." << endl; cout << " Dr"<<ue<<"cken Sie die Eingabetaste um das Programm zu beenden."<<endl; cout << "-----------------------------------------------------------"; fflush(stdin); getchar(); } void WR( float f, string Ziel) { system("cls"); double betrag; char ready; cout << " CHF in W"<<ae<<"hrungsumrechnung in " << Ziel << endl; cout << " -----------------------------------" << endl; cout << " Bitte geben Sie den Betrag ein: "; cin >> betrag; cout << " " << betrag << " CHF entsprechen "; cout << betrag * f << Ziel <<endl; cout << " r fuer fertig: "; cin >> ready; } int waehrungsumrechnung() { //Auswahlsmenü Währungsumrechnung char wiederholen; do { system("color F0"); system("cls"); cout << "---------------------" <<endl; cout << " W"<<ae<<"hrungsumrechnung " <<endl; cout << "---------------------" <<endl; cout << " 1) CHF in Euro" <<endl; cout << " 2) CHF in US - Dollar" <<endl; cout << " 3) CHF in Englische Pfund" <<endl; cout << " 4) CHF in Japanische Yen" <<endl; cout << " 5) CHF in Kanadische Dollar " <<endl; cout << " 6) CHF in Australische Dollar" <<endl; cout << " 7) CHF in Neuseel"<<ae<<"ndische Dollar" <<endl; cout << " 8) CHF in Indische Rupien" <<endl; cout << " 9) CHF in Russische Rubel" <<endl; cout << "10) Selbstst"<<ae<<"ndige Berechnung"<<endl<<endl; cout << " Bitte w"<<ae<<"hlen Sie die Gew"<<ue<<"nschte W"<<ae<<"hrung aus (1-10): "; cin >> waehrung; cout << endl; switch (waehrung) { case 1: WR( 0.66, " Euro"); break; case 2: WR( 0.9, " USD " ); break; default: cout << "not realized!"; } } while (waehrung < 10 || waehrung > 1); } int berechnungen_ausfuehren() {} int umrechnen_in_gewuenschte_masseinheit() {} int temperatur_umrechnen() {} int main() { int menuauswahl; //Hauptmenü system("title Universalrechner"); system("color F0"); do { system("color F0"); system("cls"); cout << "------------------" <<endl; cout << " Universalrechner " <<endl; cout << "------------------" <<endl; cout << " 1) W"<<ae<<"hrungsumrechnung" <<endl; cout << " 2) Berechnungen ausf"<<ue<<"hren" <<endl; cout << " 3) Umrechnen in gew"<<ue<<"nschte Masseinheit" <<endl; cout << " 4) Temperatur umrechnen" <<endl; cout << " Bitte w"<<ae<<"hlen Sie Ihre gew"<<ue<<"nschte Option aus (1-4): "; cin >> menuauswahl; switch (menuauswahl) { case 1: waehrungsumrechnung(); break; case 2: berechnungen_ausfuehren(); break; case 3: umrechnen_in_gewuenschte_masseinheit(); break; case 4: temperatur_umrechnen(); break; default: cout << "\n\tSomething go's wrong"; } } // to do eleganten Ausstieg ergänzen while (menuauswahl > 4 || menuauswahl < 1); }Ich hoffe mal das nix mehr von "goto" und Sprungmarken drin ist

-
Boah danke dir! Das werd ich mir gleich mal angucken

-
Muss mich für meine Äußerung entschuldigen.
Diese != Sache hat mich etwas auf den Arm genommen...^^
-
Jo kein Thema
