Fehler bei Programmmodularisierung und Referenzparametern
-
Ich bin Programmieranfänger und habe Probleme bei einer Aufgabe zum Thema Programmmodularisierung.Das ist meine erste Aufgabe zum Thema Programmmodularisierung und
Referenzparametern, daher denke ich , dass ich irgendwo einen grundlegenden Fehler gemacht habe. Bin leider im Umgang noch nicht sehr erfahren.
Ich verwende VS 2015.Das Programm soll zwei Zahlen entgegennehmen und noch Rechenoption + oder -
und diese dann Verrechnen. Quasi ein kleiner Taschenrechner.
Man soll bestimmte headerdateien und namespaces verwenden.
Man soll eine EInlesefunktion, eine Berechnungsfunktion und eine
Ausgabefunktion schreiben. Sodass man quasi im mainprogramm nur Funktionen
stehen hat.Ich habe zunächst im Headerdateien Ordner meines Projektes eine gui.h Datei
erstellt. Nun habe ich im Quelldateienordner gui.cpp und meine main.cpp erstellt.Die zwei Zahlen sind im Format das man erst die Zehnerstelle von Zahl eins eingibt und dann die Einerstelle von Zahl eins. Ebenso für die zweite Zahl. Daher 4 int Zahlen
und 1 char Variable für + und -.
Da man bei Funktionen ja nur einen Rückgabewert nehmen kann und wir noch
den char typ haben braucht man noch Referenzparameter.Ich habe nun erstmal meine eingabe() funktion geschrieben
und wollte diese zunächst im main programm mal testen. Jedoch
bekomme ich bei Zahleingaben keinen Schleifenfortschritt und bei
Zeichen lande ich direkt in einer Endlosschleife.
Ich hoffe mir kann jemand helfen und mir meine Fehler aufzeigen.// meine gui.h datei #pragma once namespace gui { int eingabe(int &x, int &x1, int &y, int &y1, char &z); }/meine gui.cpp datei #include "gui.h" #include <iostream> using namespace std; namespace gui { void printout(int) { } int eingabe(int &x, int &x1, int &y, int &y1, char &z) { int charwert = 0; for (int i = 0; i < 5; i++) { if (i == 0) { cout << "Geben Sie die 1. Ziffer der 1. Zahl ein: "; cin >> x; if (x != 0 || x != 1 || x != 2 || x != 3 || x != 4 || x != 5 || x != 6 || x != 7 || x != 8 || x != 9 ) { i--; continue; } } if (i == 1) { cout << "Geben Sie die 2. Ziffer der 1. Zahl ein: "; cin >> x1; if (x1 != 0 || x1 != 1 || x1 != 2 || x1 != 3 || x1 != 4 || x1 != 5 || x1 != 6 || x1 != 7 || x1 != 8 || x1 != 9 ) { i--; continue; } } if (i == 2) { cout << "Geben Sie die 1. Ziffer der 2. Zahl ein: "; cin >> y; if (y != 0 || y != 1 || y != 2 || y != 3 || y != 4 || y != 5 || y != 6 || y != 7 || y != 8 || y != 9) { i--; continue; } } if (i == 3) { cout << "Geben Sie die 2. Ziffer der 1. Zahl ein: "; cin >> y1; if (y1 != 0 || y1 != 1 || y1 != 2 || y1 != 3 || y1 != 4 || y1 != 5 || y1 != 6 || y1 != 7 || y1 != 8 || y1 != 9) { i--; continue; } } if (i==4) { cout << "Geben Sie die Rechenoperation ein (+ oder -) : "; cin >> z; if (z != '+' || z != '-' ) { i--; continue; } int charwert = 0; if( z == '+') { charwert = 0; } else { charwert = 1; } } } return x,x1,y,y1,charwert; } }// mein maiprogramm #include <iostream> #include "gui.h" #include "calc.h" using namespace std; int main() { int zahl1_wert1 =0; int zahl1_wert2=0; int zahl2_wert1=0; int zahl2_wert2=0; char a ; gui::eingabe(zahl1_wert1,zahl1_wert2,zahl2_wert1,zahl2_wert2,a); system("PAUSE"); return 0;
-
Nenne einen Wert von x, bei dem nicht i--; continue ausgeführt wird.
-
manni66 schrieb:
Nenne einen Wert von x, bei dem nicht i--; continue ausgeführt wird.
Ohh, da hatte ich wohl einen Logicfehler drinne. Danke:)
Hab es nun gefixt und nun funktioniert es bei Zahleingaben. Jedoch bekomme ich bei Zeicheneingabe immer noch die Endlosschleife. Ich sehe leider nicht warum.#include "gui.h" #include <iostream> using namespace std; namespace gui { void printout(int) { } int eingabe(int &x, int &x1, int &y, int &y1, char &z) { int charwert = 0; for (int i = 0; i < 5; i++) { if (i == 0) { cout << "Geben Sie die 1. Ziffer der 1. Zahl ein: "; cin >> x; if (x == 0 || x == 1 || x == 2 || x == 3 || x == 4 || x == 5 || x == 6 || x == 7 || x == 8 || x == 9 ) { } else { i--; continue; } } if (i == 1) { cout << "Geben Sie die 2. Ziffer der 1. Zahl ein: "; cin >> x1; if (x1 == 0 || x1 == 1 || x1 == 2 || x1 == 3 || x1 == 4 || x1 == 5 || x1 == 6 || x1 == 7 || x1 == 8 || x1 == 9 ) { } else { i--; continue; } } if (i == 2) { cout << "Geben Sie die 1. Ziffer der 2. Zahl ein: "; cin >> y; if (y == 0 || y == 1 || y == 2 || y == 3 || y == 4 || y == 5 || y == 6 || y == 7 || y == 8 || y == 9) { } else { i--; continue; } } if (i == 3) { cout << "Geben Sie die 2. Ziffer der 1. Zahl ein: "; cin >> y1; if (y1 == 0 || y1 == 1 || y1 == 2 || y1 == 3 || y1 == 4 || y1 == 5 || y1 == 6 || y1 == 7 || y1 == 8 || y1 == 9) { } else { i--; continue; } } if (i==4) { cout << "Geben Sie die Rechenoperation ein (+ oder -) : "; cin >> z; if (z == '+' || z == '-' ) { } else { i--; continue; } } } return x,x1,y,y1,z; } }#include <iostream> #include "gui.h" #include "calc.h" using namespace std; int main() { int zahl1_wert1 =0; int zahl1_wert2=0; int zahl2_wert1=0; int zahl2_wert2=0; char a ; gui::eingabe(zahl1_wert1,zahl1_wert2,zahl2_wert1,zahl2_wert2,a); system("PAUSE"); return 0; }
-
Ich weiss einfach nicht wie ich mein Ergebniss von meiner calculate Funktion nun in mein Hauptprogramm bekomme das ich es in meine printout funktion einbindnen kann. Meine Variable für das Ergebniss ist ja int ausgabe. Jedoch ist diese
ja nur in meiner Funktion calc sichtbar. Ich habe nun versucht vllt durch den
namespace irgendwie meine variable ausgabe in mein mainprogramm zu bekommen aber es gelingt mir einfach nicht):#include <iostream> #include "gui.h" #include "calc.h" using namespace std; using namespace gui; using namespace calc; int main() { int zahl1_wert1 =0; int zahl1_wert2=0; int zahl2_wert1=0; int zahl2_wert2=0; char a ; eingabe(zahl1_wert1,zahl1_wert2,zahl2_wert1,zahl2_wert2,a); calculate(zahl1_wert1, zahl1_wert2, zahl2_wert1, zahl2_wert2, a); //gui::printout(); system("PAUSE"); return 0; }#include "calc.h" namespace calc { int calculate(int x, int x1, int y, int y1, char z) { int zahl_eins_stelle1 = x * 10; int zahl_eins = x + x1; int zahl_zwei_stelle1 = y * 10; int zahl_zwei = y + y1; int ausgabe = 0; if (z == '+') { ausgabe = zahl_eins + zahl_zwei; } if (z =='-') { ausgabe = zahl_eins - zahl_zwei; } return ausgabe; } }#include "gui.h" #include <iostream> using namespace std; namespace gui { void printout(int) { //cout << "Das Ergebnis lautet: " << ; } int eingabe(int &x, int &x1, int &y, int &y1, char &z) { int charwert = 0; for (int i = 0; i < 5; i++) { if (i == 0) { cout << "Geben Sie die 1. Ziffer der 1. Zahl ein: "; cin >> x; if (x == 0 || x == 1 || x == 2 || x == 3 || x == 4 || x == 5 || x == 6 || x == 7 || x == 8 || x == 9 ) { } else { i--; continue; } } if (i == 1) { cout << "Geben Sie die 2. Ziffer der 1. Zahl ein: "; cin >> x1; if (x1 == 0 || x1 == 1 || x1 == 2 || x1 == 3 || x1 == 4 || x1 == 5 || x1 == 6 || x1 == 7 || x1 == 8 || x1 == 9 ) { } else { i--; continue; } } if (i == 2) { cout << "Geben Sie die 1. Ziffer der 2. Zahl ein: "; cin >> y; if (y == 0 || y == 1 || y == 2 || y == 3 || y == 4 || y == 5 || y == 6 || y == 7 || y == 8 || y == 9) { } else { i--; continue; } } if (i == 3) { cout << "Geben Sie die 2. Ziffer der 1. Zahl ein: "; cin >> y1; if (y1 == 0 || y1 == 1 || y1 == 2 || y1 == 3 || y1 == 4 || y1 == 5 || y1 == 6 || y1 == 7 || y1 == 8 || y1 == 9) { } else { i--; continue; } } if (i==4) { cout << "Geben Sie die Rechenoperation ein (+ oder -) : "; cin >> z; if (z == '+' || z == '-' ) { } else { i--; continue; } } } return x,x1,y,y1,z; } }
-
as1as schrieb:
return x,x1,y,y1,z; } }Achtung, Koma-Operator.
-
volkard schrieb:
as1as schrieb:
return x,x1,y,y1,z; } }Achtung, Koma-Operator.
Darf man das nicht so schreiben? Oder habe ich in der Reihenfolge etwas falsch gemacht?
lg
-
(eigentlich hab ich ein suchwort zum googeln eingeworfen.)
-
FTFY: Komma-Operator.
Aber ins Koma kommt man bei dem Code auch

int ergebnis = calculate(zahl1_wert1, zahl1_wert2, zahl2_wert1, zahl2_wert2, a); printout(ergebnis);
-
Danke für die helfenden Beiträge. Mein Programm läuft nun.
Die einzige Sache die noch nicht läuft ist wenn man bei den vier Zahlabfragen einen Buchstaben eingibt.
Ich habe mich ein wenig mit dem Kommaoperator befasst und denke es müsste nun dadran liegen, weil meine ersten vier Werte x,x1,y,y1 int Werte sind und keine char Werte. Daher kommt der Fehler. Jedoch verstehe ich nicht warum der Fehler auftritt. Meine if Abfrage sollte doch jeden char abfangen und mich sofort wieder zur erneuten Eingabe auffordern. Das hieße ja , man darf schon bei cin>> x keine
Eingabe machen welche != Zahl ist. Ich wüsste nicht wie ich das kontrollieren könnte. Jemand ein Tipp?
-
Sobald bei cin im Stream ein Zeichen ist, welches nicht geparst werden kann (z.B. ein Buchstabe bei einem 'int'), dann wird der gesamte Stream in den Fehlerstatus gesetzt und du müßtest diesen wieder zurücksetzen. Such mal nach "cin.clear()" hier im Forum.
Ich frage mich aber schon die ganze Zeit, warum du genau 2 Stellen abfragst, anstatt einfach jede mögliche Zahl einliest, d.h. nur ein "cin << x;" benutzt (und die große Schleife ist auch überflüssig):
int eingabe(int &x, int &y, char &op) { cout << "Geben Sie die 1. Zahl ein: "; cin >> x; cout << "Geben Sie die Rechenoperation ein (+ oder -) : "; cin >> op; cout << "Geben Sie die 2. Zahl ein: "; cin >> y; }Wenn du die Neueingabe der einzelnen Zahlen oder des Rechenzeichens möchtest, dann packe jeweils nur um "cout / cin" eine Schleife, z.B.
do { cout << "Geben Sie die 1. Zahl ein: "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Letzte Eingabe ignorieren cin >> x; } while(!cin); // Fehlerstatus abfragenAm besten die beiden Funktionen dann in eine eigene Funktion packen:
void clearbuffer() { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Letzte Eingabe ignorieren }und diese dann oben aufrufen (und noch "#include <limits>" einfügen).
Edit:
Und obwohl du soweit noch nicht bist (d.h. dies ist eher für die anderen Leser interessant), könnte man die ganze Funktion dann als Template realisieren:template<T> void input(const char *text, T& t) { do { cout << text; clearbuffer(); cin >> t; } while(!cin); // Fehlerstatus abfragen ]Und dann einfach so aufrufen:
int x; input("Geben Sie die 1. Zahl ein: ", x);Alternativ den eingegeben Wert als Rückgabewert, aber dann muß der Datentyp explizit angegeben werden (da der Compiler ihn nicht mehr aus den Parametern ermitteln kann):
int x = input<int>("Geben Sie die 1. Zahl ein: ");