struct richtig anwenden?
-
Hallo Freude,
ich habe vor ca. 5 Monaten mit dem Java Programmieren angefangen und wollte jetzt mal in C++ reinschnuppern, da ich es im nächsten Semester haben werde. Bin also leider noch ein absoluter Anfänger im Programmieren und bitte hiermit um Nachsicht falls meine Frage total bescheuert ist.
Ich wollte mit ein paar Beispielaufgaben aus dem Letzten Semester üben und habe mich da leider seit 1. Stunde an einer einfachen Aufgabe festgebissen.
Ich soll ganz einfach eine Struktur erstellen zum Speichern eines Mathematischen Bruches (Zähler, Nenner) diesen ausgeben und dann noch multiplizieren.
Ich könnte die Aufgabe ganz einfach ohne Struktur lösen so wie bei Java mit Konstruktor etc.. aber mit struct bekomme ich es einfach nicht hin... habe keine Ahnung wo der Fehler ist, da ich die Syntax und die Klassenstruktur mit main,header,cpp noch nicht 100% verstehe.
Habe die Vermutung das noch sehr viel an der Syntax falsch sein könnte.
Das hier ist bisher mein Ansatz hat jemand Lösungsvorschläge?
Vielen Dank für jede Hilfe
------main.cpp------
/* * Created on 24. April 2015, 19:53 */ #include <cstdlib> #include <iostream> #include <iomanip> #include "Brueche.h" using namespace std; /** * Dieses Programm dient zur Bruchrechnung */ int main(int argc, char** argv) { std::cout << "-------Programmstart Bruchrechnung---------" << endl; eingabe(); return 0; }
---Brueche.cpp----
/* * Created on 24. April 2015, 19:59 */ #include "Brueche.h" #include <iostream> using namespace std; struct Bruch{ int Z,N; }; void eingabe(struct Bruch a,struct Bruch b){ std::cout << "Bitte Zähler für Bruch a eingeben" << endl; std::cin >> a.Z; std::cout << "Bitte Nenner für Bruch a eingeben" << endl; std::cin >> a.N; std::cout << "Bitte Zähler für Bruch b eingeben" << endl; std::cin >> b.Z; std::cout << "Bitte Nenner für Bruch b eingeben" << endl; std::cin >> b.N; } void ausgeben(Bruch b){ std:: cout << b.Z <<"/" << b.N<<endl; } Bruch multiplizieren(Bruch a, Bruch b){ }
---Brueche.h---
/* * Created on 24. April 2015, 19:59 */ struct Bruch; void eingabe(struct Bruch a,struct Bruch b); void ausgeben(Bruch b);
-
eingabe erwarte als Paramter zwei Variablen. Die müssen vorher definiert sein.
Damit du sie definieren kannst, muss der Typ bekannt sein.
Die Definition vom struct Bruch gehört in den Header.
Allerdings solltes du eingabe nochmal überdenken, denn so bekommst du keine Werte aus eingabe zurück. Du kannst eine Referenz nehmen oder eingabe nur für einen Bruch machen und diesen als Rückgabewert zurückgeben (wie bei multiplizieren geplant)
-
Danke für die Antwort, versuche es mal umzusetzen.
-
Bin bis jetzt so weit, habe noch das Problem das der ausgerechnete Bruch nicht anständig ausgegeben wird(also eine wirre lange zahl). Kann sein das die Referenz oder Rechnung noch falsch ist? Vielen Dank
---Brueche.cpp-----
/* * Created on 24. April 2015, 19:59 */ #include "Brueche.h" #include <iostream> using namespace std; Bruch eingabe1(struct Bruch a){ std::cout << "Bitte Zähler für Bruch a eingeben" << endl; std::cin >> a.Z; std::cout << "Bitte Nenner für Bruch a eingeben" << endl; std::cin >> a.N; return a; } Bruch eingabe2(struct Bruch b){ std::cout << "Bitte Zähler für Bruch b eingeben" << endl; std::cin >> b.Z; std::cout << "Bitte Nenner für Bruch b eingeben" << endl; std::cin >> b.N; return b; } Bruch multiplizieren(Bruch a, Bruch b){ b.Z = a.Z*b.Z; b.N = a.N*b.N; return b; } void ausgeben(Bruch b){ std::cout << "--Multiplikation der beiden Brüche---" << endl; std:: cout << b.Z <<"/" << b.N<<endl; }
---main.cpp---
/* * Created on 24. April 2015, 19:53 */ #include <cstdlib> #include <iostream> #include <iomanip> #include "Brueche.h" using namespace std; /** * Dieses Programm dient zur Bruchrechnung */ int main(int argc, char** argv) { std::cout << "-------Programmstart Bruchrechnung---------" << endl; Bruch a; Bruch b; eingabe1(a); eingabe2(b); multiplizieren(a,b); ausgeben(b); return 0; }
-
Gibt es einen sinnvollen Grund, warum du auf Klassen verzichten willst? struct bedeutet naemlich quasi das gleiche.
Warum sind eingabe1 und eingabe2 quasi das gleiche und was soll die SchreibweiseBruch eingabe2(struct Bruch b)
? Normalerweise reicht
Bruch eingabe()
aus.
-
DirkB schrieb:
Du kannst eine Referenz nehmen oder eingabe nur für einen Bruch machen und diesen als Rückgabewert zurückgeben (wie bei multiplizieren geplant)
Du hast jetzt halbherzig beides gemischt, sodass es nicht funktioniert.
Guck dir die Möglichkeiten an, die C++ bzgl. Parameterübergabe bietet.
Du übergibst Bruch by Value, d.h. Änderungen innerhalb der Funktion wirken nicht nach aussen (statt der vorgeschlagenen Referenz).
Und den Rückgabewert (2ter Vorschlag) nutzt du gar nicht.
-
Du brauchst nur einmal eingabe definieren. Dann aber richtig.
Der einzige Unterschied bei eingabe1 und eingabe2 ist der Name bei der Ausgabe.Bruch eingabe(std::string name){ Bruch x; std::cout << "Bitte Zähler für Bruch " << name << " eingeben" << endl; std::cin >> x.Z; Hier nochmal für Nenner return x; }
Und du hast da einen Rückgabewert. Genau wie bei multiplizieren. Diesen musst du (wenn du mit ihm etwas machen willst) z.B. einer Variablen zuweisen)
c = multiplizieren(a,b);
Das muss nicht eine andere Variable (c) sein, kann auch a oder b sein.
Oder gleich einer Funktion übergeben:
ausgeben(multiplizieren(a,b));
In ausgeben sollten nur die Zahlenwerte und der / ausgegeben werden.
Die Prosa ("--Multiplikation der be ...") hat da nichts drin zu suchen.Aber das ist mehr "C mit
cout
" und kein modernes C++
-
tuscan123 schrieb:
---Brueche.cpp-----
Bruch a; Bruch b; eingabe1(a); eingabe2(b); multiplizieren(a,b);
Das macht nicht was Du glaubst dass es macht.
Du übergibst in die Funktionen die Brüche by value - also eine Kopie Deines Bruches. Die Bruch-Variablen in main werden also gar nicht verändert.
Entweder soBruch a; Bruch b; a = eingabe1(a); b = eingabe2(b); b = multiplizieren(a,b);
oder Du übergibst die Brüche by reference
-
Vielen vielen Dank, habe es hinbekommen- versuche mich mal weiter falls ich nochmal hänge melde ich mich.
-
tuscan123 schrieb:
Vielen vielen Dank, habe es hinbekommen.
Wenn du magst, kannst du deine Lösung hier zeigen.
Dass du eine Ausgabe hast, die deiner Vorstellung entspricht, heißt leider nicht, dass das Programm auch richtig ist.
Oder du hast überflüssige Sachen drin, komische Nebeneffekte oder sogar undefined behavior.