Wątek przeniesiony 2018-11-12 16:36 z C/C++ przez furious programming.

Program do obliczania odsetek - co robię źle?

0

Witam,
początkuję z C++ i chcę napisać program, który oblicza odsetki składane od kwoty wpłaconego depozytu. Czy mogę prosić o jakąś podpowiedź co robię nie tak?
Jeżeli roczna stopa procentowa wynosi r procent, a początkowa kwota b jest zdeponowana w banku, to kapitał wraz z odsetkami po n latach można obliczyć według wzoru:
b * (1 + r / 100) n

#include <iostream> 
using namespace std;
double iniamount = 0;
double percent = 0;
int years = 0;
double final = 0;
void loads();
void calculates();
void prints();
int main()
{
    char answer;
    do
    {
        loads();
        calculates();
        prints();
        cout << "\nOne more time (Y/N) ?";
        cin >> answer;
    } while (answer == 'Y' || answer == 'y');
    return 0;
}
 
void loads()
{
    cout << "Enter initial amount : ";
    cin >> iniamount;
    cout << "Enter percent : ";
    cin >> percent;
    cout << "Enter number of years : ";
    cin >> years;
}
void calculates()
{
    final = iniamount * ((1+ percent /100) * years);
}
void prints()
{
 cout << "The final amount is    : " << final << endl; 
}
0
b * (1 + r / 100) n

A jest jakiś zestaw parameterów dla którego program nie daje odpowiedzi zgodnej z tym wzorem?

0

Witam,
tak - parametry to 1000, 3%, 10 lat a wynik 1343.92
Kod jest brzydki i nieczytelny, na co muszę zwrócić uwagę?
Powiedziane mam że program musi się powtarzać bez wyłączania oraz że każdy etap ma odbyć się w osobnej funkcji.
Z góry dziękuję za wszystkie podpowiedzi.

0

No ale co się niby nie zgadza dla tych danych?

Lata Zysk rocznie Zysk skumulowany
1 30,00 1030,00
2 30,90 1060,90
3 31,83 1092,73
4 32,78 1125,51
5 33,77 1159,27
6 34,78 1194,05
7 35,82 1229,87
8 36,90 1266,77
9 38,00 1304,77
10 39,14 1343,92

Obliczenia są poprawne.

EDIT.
Sorry, nie zwróciłem uwagi na kod. Jest błąd we wzorze. Żeby policzyć zysk po latach to bierzesz oprocentowanie w potędze ilości lat a nie mnożysz:

#include <iostream> 
#include <cmath>
using namespace std;
double iniamount = 0;
double percent = 0;
int years = 0;
double final = 0;
void loads();
void calculates();
void prints();
int main()
{
    char answer;
    do
    {
        loads();
        calculates();
        prints();
        cout << "\nOne more time (Y/N) ?";
        cin >> answer;
    } while (answer == 'Y' || answer == 'y');
    return 0;
}
 
void loads()
{
    cout << "Enter initial amount : ";
    cin >> iniamount;
    cout << "Enter percent : ";
    cin >> percent;
    cout << "Enter number of years : ";
    cin >> years;
}
void calculates()
{
    final = iniamount * pow((1+ percent /100), years);
}
void prints()
{
 cout << "The final amount is    : " << final << endl; 
}
2

Z tym rozwiązaniem wyżej to trzeba uważać. Po prawdze dla typowych wartości będzie dawać dobre wyniki. Ale dla wieloletnich kredytów i bardzo wysokich liczb już nie.
double nie nadaje się do obliczeń dziesiętnych, a takie sa wymagane do liczenia odsetek.

Tutaj się wyrypiemy dla kredytu wielkości : 10000000, na 10% i 200 lat (różnica między kalkulatorem, a c/double wychodzi około 30 złotych :-)).

Można się z tego śmiać, ale zastosowanie tego samego podejścia do odsetek liczonych miesięcznie, ( których może być kilkaset) ... gwarantuje wręcz problemy i ośmieszenie się w banku (lub przed księgowymi).
Byłem nawet dokładnie takiego przypadku (źle policzone raty miesięczne przez float/double) świadkiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1