Funktion mit Rückgabewert
-
Der Rückgabewert sollte double oder float sein.
dann muss ich ja später wieder die Nachkommastellen entfernen, darum hatte ich int genommen. Wenn ich zB 6/4 hab (also "sechs Viertel" mein ich), dann interessiert mich beim Umwandeln ja erst mal wie oft 4 quasi ganz in 6 reinpasst (huu, welch Ausrucksweise...) und das ist ein Mal.
Übrigens wäre es besser Du würdest einfach einen Konvertierungsoperator überladen statt eine neue Funktion namens umwandeln zu schreiben.
ähm, wie mach ich das? Ich hab noch nicht so ganz den Überblick...
nenner = nenner; // wofuer ist das gut?
okay, das sollte ich eigentlich löschen, diente nur zu meiner eigenen Übersicht, ist natürlich überflüssig (und sinnlos)
zaehler = zaehler%nenner; // und das?
Brauch ich, der zaehler verändert sich doch beim Umwandeln und da kommt mir "%" ganz recht, oder seh ich das falsch? Bei 6/4 wär das 2, sodass eigentlich aus 6/4 dann 1 2/4 werden sollen. Wird aber leider nicht...
-
Du berechnest doch die Zahl und gibst sie zurück. Danach weist du nur noch nenner und zaehler einen Wert zu, mit dem du weder rechnest noch ihn zurückgibst. Das, was in zaehler steht, ist sowieso nach dem Verlassen der Funktion weg.
-
Du berechnest doch die Zahl und gibst sie zurück. Danach weist du nur noch nenner und zaehler einen Wert zu, mit dem du weder rechnest noch ihn zurückgibst. Das, was in zaehler steht, ist sowieso nach dem Verlassen der Funktion weg.
wieso ist das weg? zaehler und nenner sind beides Instanzen (Instanzvariablen? Ich komm da immer durcheinander) der Klasse und umwandeln() ist eine Methode, dann wird doch den Variablen der jeweilige Wert zugewiesen oder nicht?
-
lousypoetry schrieb:
wieso ist das weg? zaehler und nenner sind beides Instanzen (Instanzvariablen? Ich komm da immer durcheinander) der Klasse und umwandeln() ist eine Methode, dann wird doch den Variablen der jeweilige Wert zugewiesen oder nicht?
Du hast recht!
Nur statt Instanzen heisst es Membervariable (Attribut)
Aber umwandeln() sollte das Objekt nicht verändern.
denn wenn ich
cout<<b.umwandeln();
schreibe, denn rechne ich nicht damit, dass b sich geändert hat.Und erklär mal kurz, WAS umwandeln machen soll. Mir ist das noch nicht ganz klar.
-
Und erklär mal kurz, WAS umwandeln machen soll. Mir ist das noch nicht ganz klar.
huch, das hätt ich wirklich mal tun sollen, sorry.
Eigentlich aber ganz einfach: angenommen bei der Addition zweier Brüche kommt ein Bruch raus, bei dem der Zähler größer ist als der Nenner (3/4 + 2/4 = 5/4). Hier soll "umwandeln()" den Bruch in einen gemischten Bruch (ich hoffe, dsa heißt so...) umwandeln, also in diesem Fall in 1 1/4. "Zahl" soll jetzt die 1 zurückgeben, kommt in der Main-Funktion aber immer als 0 an. Ich geb sie deshalb zurück, weil sie anschließend als Parameter in einer Funktion "ausgeben()" dienen soll (vielleicht etwas umständlich, aber anders krieg ichs noch nicht hin)
-
Der Ansatz gefällt mir nicht.
Schreib doch lieber eine Methode von Bruch die ausgeben heisst.
Die sieht dann in etwa so aus:
void Bruch::ausgaben(ostream& stream) { if(zaehler>nenner) { stream<<zaehler/nenner<<" "<<zaehler%nenner<<"/"<<nenner; } else if(zaehler==nenner) { stream<<1; } else { stream<<zaehler<<"/"<<nenner; } } // Bruch b; b.ausgeben(cout);
Überdenke dein Design nochmal. Wenn du dir nicht sicher bist, dann mach einen neuen Thread auf, wo wir über das Design reden können.
Designen ist in der OOP sehr wichtig.
-
Nur statt Instanzen heisst es Membervariable (Attribut)
Er hatte auch recht. Instanzvariable ist eine gängige Bezeichnung, nur in der C++-Szene eher selten gesehen. Instanz ist natürlich falsch.
-
Der C++-Begriff für Instanzvariable ist übrigens nicht-statische Membervariable.
-
Der C++-Begriff für Instanzvariable ist übrigens nicht-statische Membervariable.
Also kann ich sowohl Instanzvariable als auch Membervariable sagen? Oder lieber nur Membervariable? Denn eigentlich wollt ich mir von Anfang an die richiten Ausdrücke angewöhnen, ist ja auch blöd wenn man in einem Forum fragt und es drei Postings dauert bis die anderen verstanden haben, was man eigentlich meint
Der Ansatz gefällt mir nicht. Schreib doch lieber eine Methode von Bruch die ausgeben heisst.
hm, ich dachte es sei besser wenn die da nicht drin wäre? Ich verweise mal auf meinen früheren Thread, wo ich das als Tipp bekommen habe, die einlesen und ausgeben-Funktionen nicht mit in die Klasse zu nehmen.
http://www.c-plusplus.net/forum/viewtopic.php?t=55079&start=15void Bruch::ausgaben(ostream& stream) //stream? Wieso das? { if(zaehler>nenner) { stream<<zaehler/nenner<<" "<<zaehler%nenner<<"/"<<nenner; } else if(zaehler==nenner) { stream<<1; } else { stream<<zaehler<<"/"<<nenner; } }
-
Ob ausgeben() jetzt global und eine Memberfunktion ist wuerde ich nicht so eng sehen.
Der Hauptunterchied zwischen meinem ausgeben und deinem ist der, dass mein ausgeben() mit allen 'streams' funktioniert.
Sprich: du kannst
b.ausgeben(cout);
genauso wie
ofstream file("dings.dat");
b.ausgeben(file);schreiben.
Normalerweise ueberladet man dafuer den operator<< - aber das lassen wir mal links liegen, denn so wichtig ist es nicht.
Das wichtige ist, dass die Klasse nicht auf cout/cin festgelegt ist - denn sonst koenntest du die klasse nichtmehr verwenden, wenn du zB eine grafische Oberflaeche erstellen willst.
Anscheinend ist Instanzvariable und Memebervariable das selbe. Ich wuerde dir zu Membervariablen raten, da ich Instanzvariable noch nie gehoert habe.
-
Okay. Aber mal abgesehen von allem: wieso wird bei der Rückgabe von "zahl" ein falscher Wert zurückgegeben? Ich hab mal getestet, die Funktion rechnet für zahl den richtigen Wert, also scheint der Fehler bei der Übergabe zu liegen. Das komische ist ja, dass das Zurückgeben mal problemlos geklappt hat... Und dummerweise weiß ich natürlich nicht, was ich geändert hab damit es nicht mehr geht...
-
es müsste doch gehen...
such mal in der FAQ nach runden vn Zahlen, da war ne nette Funktion drindann müsste das doch so gehen:
return Round(Zähler / Nenner);
-
@Maxi2: Aber das will er doch garnicht haben.
Die Funktion tut das, was er haben will. Der Fehler muß also woanders liegen.MfG Jester
-
So, wenn ichs richtig sehe, dann funktioniert jetzt alles so, wie ichs haben wollte. Der Fehler lag nicht in der Funktion sonderm (natürlich :)) woanders, ich hab ihn auch gefunden, hab aber noch mal ein paar Fragen.
ich hab eine Methode "kuerzen()", die zB nach der Addition zweier Brüche in der Methode "addieren(...)" aufgerufen wird, das sieht bei mir so aus:void bruch::addieren(int z, int n) { if(nenner == n) { zaehler += z; } else { int kgv = nenner*n; zaehler *= n; z *= nenner; zaehler += z; nenner = kgv; } bruch::kuerzen(); }
1. ist die Syntax bei bruch::kuerzen() so korrekt oder könnte ich auch nur kuerzen() schreiben?
2. wenn ich kuerzen() an dieser Stelle aufrufe, muss kuerzen() dann vor addieren(...) definiert sein? Oder ist das egal?
3. angenommen ich möchte zwei Brüche addieren, da rufe ich in meiner Main-Funktion folgendes auf:int main() { bruch br1, br2; einlesen(br1.zaehler, br1.nenner); einlesen(br2.zaehler, br2.nenner); br1.addieren(br2.zaehler, br2.nenner); int zahl = br1.umwandeln(); ausgeben(br1.zaehler, br1.nenner, zahl); return 0; }
Funktioniert soweit auch wie gewünscht. Jetzt möchte ich aber, dass der Anwender bestimmt, welche Operation er vornimmt, soll heißen, dass er das Rechenzeichen eingeben kann. Dazu hatte ich mir folgendes überlegt:
int main() { bruch br1, br2; einlesen(br1.zaehler, br1.nenner); char zeichen; cin >> zeichen; einlesen(br2.zaehler, br2.nenner); switch(zeichen) { case '+': br1.addieren(br2.nenner, br2.zaehler); break; case '-': br1.subtrahieren(br2.zaehler, br2.nenner); break; }// ich beschränk mich mal auf '+' und '-' int zahl = br1.umwandeln(); ausgeben(br1.zaehler, br1.nenner, zahl); return 0; }
Wenn ich das Programm aber so ausführen lasse, rechnet es nicht korrekt, weiß jemand von euch warum?
Danke!