Probleme mit der While und do-while Schleife
-
Guten Abend,
Wir nehmen C++ in der Schule durch. Im Moment arbeiten wir an den Schleifen. While und do-while Schleifen um genau zu sein. Als hausaufgabe haben wir nun ein Programm zur Berechnung eines Tilgungsplans aufbekommen. Ich habe mittlerweile etliche Stunden drangesessen aber irgendwas scheint mit meinen Schleifen nicht zu stimmen. Die Formeln müssten Stimmen da sie vorgegeben waren, jedoch bin ich mir da nicht so sicher..{ do { // Bildschirm löschen system ( "CLS" ); cout << "Kreditberechnung" << endl; cout << "================" << endl; cout << endl; cout << "Kreditbetrag (in Euro): " ; cin >> K; cout << "Disagio (in Prozent): "; cin >> D; cout << "Kreditzins (in Prozent): "; cin >> KreditZ; cout << endl; cout << "Gew" << char(129) << "nschte monatliche Belastung (in Euro): "; cin >> B; cout << endl; monat=0; while (R<=0) { // Berechnung K=K-K*D/100; T=B-K*(KreditZ/(12*100)); R=K-T; } monat=monat+1; RE=R*(-1); cout.precision (2); cout.setf (ios::fixed); // Ausgabe cout << "Ausgezahlter Kreditbetrag (in Euro): " << K << " Euro" << endl; cout << "Monatliche Belastung: " << B << " Euro" << endl; cout << "Laufzeit: " << monat << " Monate" << endl; cout << "R" << char(129) << "ckerstattung " << RE << " Euro" << endl; cout << endl; cout << "Eine weitere Berechnung ? (J/N)"; cin >> Antwort; } while ((Antwort == 'j' ) || (Antwort == 'J')); return 0; }K= Kredit, D= Disagio, B= Belastung, T= Tilgung R= Restkredit, KreditZ= Kreditzins, Re= Rückerstattung.
Gebe ich beim Probedurchlauf Kreditbetrag 1000 ein, Disagio 2 %, Kreditzins 5.5 %, Belastung 50 Euro. Dann bekomme ich Als Ergebnisse: ausgezahlter Kreditbetrag: 980
Belastung: 50
Laufzeit 1 Monat
Rückerstattung -934,49 Euro.
Laufzeit sollte aber 22 Monate betragen und Rückerstattung -48,75 Euro.Liegt der Fehler wirklich in der Schleife? Wenn ja würdet ihr mir bitte verate wo?
Ich sag schon mal Dankeschön im Vorraus!
Jolina
-
Vielleicht solltest du eher irgendwo fragen, wo man sich mit Krediten auskennt? Ich kann dir nur sagen, dass dein Programm genau das berechnet, was du da auch rausbekommst. Aber um den Fehler zu finden, müsste man sich
- auskennen wie die Berechnung von Disagio und so genau funktioniert und das wird wahrscheinlich niemand hier.
- Selbst wenn der Fehler in der Rechnung offensichtlich ist, könnte man ihn wegen der kryptischen Abkürzungen nicht finden. Ich habe gerade mal versucht die Zeilen ohne Disagio nachzuprüfen, musste aber ständig in der Legende gucken, was was ist und habe entnervt aufgegeben.
Wenn du uns die Formeln gibst, nach der die Rechnung erfolgen soll, können wir dir aber sagen, ob du sie richtig umgesetzt hast.
Und mindestens ein Fehler: Wenn der Anwender eine weitere Berechnung wünscht, wird diese nicht funktionieren, weil R beim zweiten Durchlauf immer noch den Wert vom vorherigen Durchlauf hat.
-
Die Rechnung mit dem Disagio wirdrichtig umgesetzt. Das Problem ist ja das er die Monate nicht mitzählt und ich nicht verstehe wo da der Fehler in meiner Schleife hängt.
Wenn der Benutzer noch eine Berechnung will startet das Programm ja wieder ganz neu, das heißt das er ja auch einen neuen Kredit eingeben muss.
-
Der Monat wird bei dir immer '1' sein, da du ja den Monat erst NACH der Schleife um 1 erhöhst.
Und bei der Rückerstattung (RE) hast du anscheinend ein ähnliches Problem.
Debugge doch einfach dein Programm oder laß dir in der Schleife die einzelnen Werte mal testweise ausgeben...
-
Jolina schrieb:
Die Rechnung mit dem Disagio wirdrichtig umgesetzt. Das Problem ist ja das er die Monate nicht mitzählt und ich nicht verstehe wo da der Fehler in meiner Schleife hängt.
Das ist doch ganz einfach: monat wird innerhalb der Schleife nicht verändert. Soll monat=monat+1 vielleicht in der Schleife stehen?
Wenn der Benutzer noch eine Berechnung will startet das Programm ja wieder ganz neu, das heißt das er ja auch einen neuen Kredit eingeben muss.
Nein, tut es nicht. Bei 'j' springt das Programm dahin, wo es bei dir der Bildschirm gelöscht wird. R wird ab dieser Stelle nie geändert.
-
Also wenn der Monat in der Schleife steht bekomme ich auf keine andere Ausgabe.
Jetzt sieht es folgendermaßen aus, aber die Ausgabe ändert sich nicht:while (Restkredit<=0) { // Berechnung ausgezahlterKredit=Kredit-Kredit*Disagio/100; Tilgung=Belastung-Kredit*(Kreditzins/(12*100)); Restkredit=Kredit-Tilgung; monat=monat+1; Rückerstattung=Restkredit*(-1); }
-
AAAALSO ich hab mich auch grad ma dran gesetzt, ich hoffe du suchst immernoch nach ner lösung^^
deine whileschleife kann ja nur einmal ausgeführt werden, weil diese schleife ausgeführt wird solange der Restkredit kleiner gleich 0 ist.
Wenn du jetzt mal alles mit dem taschenrechner nachrechnest wird der Restkredit nach der ersten rechnung den Betrag von 934,49€ sein. womit die schleifenbedingung nichtmehr erfüllt ist.
Vielleicht hilft dir das ja^^
-
Also ich hab mal aus Langeweile und Interesse am Thema Kredit deinen Code studiert, ich glaube es nicht ein C++ Problem sondern eher ein Mathematisches:
Hier ist der lauffähige Code, gerechnet wird das Disagio über die gesamte Laufzeit fest, der Kreditzins wird monatlich berechnet:
#include <iostream> #include <cstdlib> // unter windows #include <conio.h> - für system() using namespace std; int main() { double Kredit,Disagio,Belastung,Restkredit,Tilgung, Rueckerstattung , KreditZins; short Monat; char Antwort; do { // Bildschirm löschen // system ( "clear" ); // POSIX system ("cls"); cout << "Kreditberechnung" << endl; cout << "================" << endl; cout << endl; cout << "Kreditbetrag (in Euro): " ; cin >> Kredit; cout << "Disagio (Abschlag) (in Prozent): "; cin >> Disagio; cout << "Kreditzins (in Prozent): "; cin >> KreditZins; cout << "----------------" << endl; cout << "Gewünschte monatliche Belastung (in Euro): "; cin >> Belastung; cout << endl; // Berechne jetzt den gesamt Kreditrahmen incl. des Disagios Restkredit= Kredit + Kredit * Disagio/100; // das Disagio ist Mehrwert der Bank und wird // bei Kreditstellung voll berechnet, richtig ? // allg. Bearbeitungskosten... ;)= // Berechne was dem Kunden tatsächlich ausgezahlt wird Kredit= Kredit - Kredit * Disagio/100; // das Disagio ist Mehrwert der Bank und wird // bei Kreditstellung voll berechnet, richtig ? // allg. Bearbeitungskosten... ;)= Monat=0; // Die Schleife solange durchlaufen bis kein Restkredit vorhanden ist while(Restkredit > 0) { // Die relle Kredit-Tilgung ist Restkredit = Belastung - monatl. KreditZins Tilgung = Belastung - ( Restkredit * ( KreditZins/(12*100) ) ); Restkredit -= Tilgung; // Restkredit = Restkredit - Tilgung Monat++; // ein weiterer Monat-Laufzeit } Rueckerstattung = Restkredit * (-1); // zuviel bezahlt ? Wertmässiges saldo erfassen cout.precision (2); cout.setf (ios::fixed); // Ausgabe cout << "Ausgezahlter Kreditbetrag (in Euro): " << Kredit << " Euro" << endl; cout << "Monatliche Belastung: " << Belastung << " Euro" << endl; cout << "Laufzeit: " << Monat << " Monate" << endl; cout << "Restkredit: " << Restkredit << " Euro, daher eine Rückerstattung von: " << Rueckerstattung<< " Euro" << endl; cout << endl; cout << "Eine weitere Berechnung ? (J/N)"; cin >> Antwort; } while ((Antwort == 'j' ) || (Antwort == 'J')); return 0; }Als Ausgabe erhalte ich folgendes:
Kreditberechnung ================ Kreditbetrag (in Euro): 1000 Disagio (Abschlag) (in Prozent): 2 Kreditzins (in Prozent): 5.5 ---------------- Gewünschte monatliche Belastung (in Euro): 50 Ausgezahlter Kreditbetrag (in Euro): 980.00 Euro Monatliche Belastung: 50.00 Euro Laufzeit: 22 Monate Restkredit: -26.64 Euro, daher eine Rückerstattung von: 26.64 Euro Eine weitere Berechnung ? (J/N)Wenn das Disagio monatlich berechnet werden soll muss dies natürlich in der while-Schleife geschehen.

-
Hallo,
vielen Dank für deine Hilfe. Jetzt wo ich es sehe fällt mir der Fehler auch auf. Allerdings ist glaub ich noch ein Fehler in der Berechnung der "Rückerstattung" oder der Leherer hat einen Fehler gemacht.
Morgen früh werde ich es erfahren. Ich werde dir seine Lösungen dann gerne einmal präsentieren.Ein ganz großes Danke für die Hilfe!
Liebe Grüße,
Jolina