Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Problem z Agorytmem - Przeliczanie pieniędzy

Ostatnio zmodyfikowano 2011-08-02 11:22
Autor Wiadomość
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 ;)


C/C++
#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();
}

P-37778
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? (%)
P-37780
pekfos
» 2011-08-01 10:30:56
%
prędzej fmod()

//edit: He he, widzę że algorytm przez duże 'A' :P
P-37785
GoldWolf
» 2011-08-01 10:35:24
A ja sobie takie coś wymyśliłem:
C/C++
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ę.
P-37786
akwes
» 2011-08-01 11:08:22

prędzej fmod()

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.
P-37788
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.
P-37804
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:

C/C++
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 ;)
P-37881
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.
P-37902
« 1 »
  Strona 1 z 1