[C++] Problem z Agorytmem - Przeliczanie pieniędzy
Ostatnio zmodyfikowano 2011-08-02 11:22
DVD93 Temat założony przez niniejszego użytkownika |
[C++] Problem z Agorytmem - Przeliczanie pieniędzy » 2011-08-01 05:30:33 Witam chciałem napisać program ,który po podaniu kwoty przeliczy ile w niej jest banknotów i monet od 200zł do 1gr. I mój problem jest następujący program chyba źle zaokrągla liczby na pod koniec gdyż zawsze brakuje jednego grosza. Widać to szczególnie gdy double zmienimy na float. Próbowałem użyć zaokrąglania z math.h ale nic to nie pomogło jeśli ktoś wie w czym leży problem i jak go rozwiązać to z góry dziękuje ;) #include <conio.h> #include <iostream>
using namespace std;
int main() { double kwota; double wynik; int wynik1; double dzielnik[] = { 200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01 }; printf( "Podaj kwote: " ); cin >> kwota; for( int i = 0; i < 14; i++ ) { cout << "\n"; cout << "Dzielnik: " << dzielnik[ i ] << endl; cout << "Kwota: " << kwota << endl; if( kwota >= dzielnik[ i ] ) { wynik = kwota / dzielnik[ i ]; if( wynik >= 1 ) { for( int licznik = 0; licznik <= wynik; licznik++ ) wynik1 = licznik; } cout << "Wynik: " << wynik1 << endl; kwota =( wynik - wynik1 ) * dzielnik[ i ]; cout << "Kwota po: " << kwota << endl; cout << "\n"; } } getch(); }
|
|
akwes |
» 2011-08-01 07:44:37 Jeżeli naprawdę za każdym razem brakuje grosza to może wystarczy go dodać :P ?
Widzę że wykonujesz dzielnie. Zastanawiałeś się nad użyciem modulo? (%) |
|
pekfos |
» 2011-08-01 10:30:56 prędzej fmod() //edit: He he, widzę że algorytm przez duże 'A' :P |
|
GoldWolf |
» 2011-08-01 10:35:24 A ja sobie takie coś wymyśliłem: if( kwota >= dzielnik[ i ] ) { wynik =( kwota / dzielnik[ i ] ); if( wynik >= 1 ) { if( kwota <= 0.04 && kwota > 0.03 ) wynik2 = int( ceil( wynik ) ); else if( kwota < 0.02 ) wynik2 = int( floor( wynik ) ); else wynik2 = int( wynik ); for( int licznik = 0; licznik <= wynik2; licznik++ ) wynik1 = licznik; } if( kwota > 10 ) cout << "Liczba banknotow: " << wynik1 << endl; else cout << "Liczba monet: " << wynik1 << endl; if( kwota < 0 ) kwota = 0; cout << "Kwota po: " << kwota << endl; cout << "\n"; if( kwota <= 0.01 && kwota > 0 ) kwota += 0.001; } } getch(); Zawsze oblicza dobrą liczbę. |
|
akwes |
» 2011-08-01 11:08:22 No popatrz, a ja bym wszystkie wartości * 100 z tabeli pomnożył żeby wyszedł INT. Przepisał do tablicy int-owskiej, później tylko wyniki pokazywał podzielone przez 100. Eh... Mogłem się domyślić że jak jest fabs() to też będzie fmod() :) No ale zawsze jakoś sobie z tym radziłem. |
|
GoldWolf |
» 2011-08-01 11:34:57 gorzej jak ktoś będzie chciał dużą liczbę wprowadzić 100 miliardów (czy tam wyższą) wtedy może być problem.
Dla małych sum będzie dobrze. To jest piękne w programowaniu, że każdy może to zrobić po swojemu byle by wynik był poprawny. |
|
DVD93 Temat założony przez niniejszego użytkownika |
» 2011-08-02 03:55:35 Do wcześniejszego kodu dodałem jeszcze parę wyjątków: if( kwota <= 0.05 && kwota > 0.041 ) kwota = 0.05; else if( kwota <= 0.04 && kwota > 0.031 ) kwota = 0.04; else if( kwota <= 0.03 && kwota > 0.021 ) kwota = 0.03; else if( kwota <= 0.02 && kwota > 0.011 ) kwota = 0.02; else if( kwota <= 0.01 && kwota > 0.011 ) kwota = 0.01; I teraz program dobrze zlicza monety i banknoty ale czasem daje na końcu jakieś dziwne kwoty np: 6.57252e-016 Ktoś mógłby mi wyjaśnić co to znaczy i dlaczego tak się dzieje? Dzięki za pomoc ;) |
|
Thud |
» 2011-08-02 11:22:53 To nie dziwne kwoty, a notacja wykładnicza często stosowana do zapisu bardzo dużych lub małych liczb.
1e+6 znaczy tyle co 1*(10^6) - of korz to nie xorowanie a potęgowanie. |
|
« 1 » |