Program zwracający resztę

0

Witam, napisałem sobię taki program na wydawanie reszty, czy ktoś jest mi w stanie powiedzieć dlaczego nie działa poprawnie?
https://pastebin.com/dBn9u0bq

#include <iostream>
using namespace std;

void xD(int g, double &r)
{
    double pop[14]={200,100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,0.02,0.01};
    int i=0;
    while(r>=pop[g])
    {
        r=r-pop[g];
        i++;
    }
        if(i!=0)
        cout<<i<<"x"<<pop[g]<<"zl"<<endl;

}

int main()
{
    double x, cena, r;
    cout<<"jaka jest cena: ";
    cin>>cena;
    cout<<"ile dales piniendzy: ";
    cin>>x;
    r=x-cena;
    for (int g=0;g<14;g++)
        xD(g,r);

    return 0;
}
0

Zdefiniuj nie działa poprawnie. Pomijając niedokładność obliczeń zmiennoprzecinkowych (powinieneś w takim programie po prostu liczyć wszystko w groszach, całkowitych), wygląda na to, że działa: [link]

0

Mówiąc, że nie działa poprawnie chodzi mi o to, że dla przykładowych danych wejściowych:167.34 i 200 lub 167.36 i 200 już nie pokazuje poprawnie, mam rozumieć że to przez ww niedokładność obliczeń zmiennoprzecinkowych?

0

Nie wszystkie liczby da się skończenie przedstawić w formacie binarnym. Np. 0.1 będzie zapisane jako np. 0.099999... albo 0.10000...1. Tak samo z ostatnim groszem w Twoim przypadku. Zajrzyj np. tutaj: http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html

0

Ok, dzięki, nie miałem w sumie o tym pojęcia, ale dalej nie wiem co trzeba zrobić, żeby pozbyć się tego błędu, bo po wymnozeniu nominałów i reszty przez 100 błąd dalej występuje

2

Jeśli mnożysz przybliżoną liczbę przez 100 to niedokładność pozostaje. Od początku do końca licz w groszach. double nie używaj w ogóle.

0

Nie do końca mogę nie używać doubla, bo na wejściu musi być liczba podana w złotych, nie rozumiem jak miałoby to wyglądać w samych groszach, na dole kod o którym pisałem wyżej

#include <iostream>
using namespace std;

void xD(int g, double &r)
{
    double pop[14]={20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1};
    int i=0;
    while(r>=pop[g])
    {
        r=r-pop[g];
        i++;
    }
        if(i!=0)
        cout<<i<<"x"<<pop[g]/100<<"zl"<<endl;
}

int main()
{
    double x, cena, r;
    cout<<"jaka jest cena: ";
    cin>>cena;
    cout<<"ile dales piniendzy: ";
    cin>>x;
    r=(x-cena)*100;
    for (int g=0;g<14;g++)
        xD(g,r);

    return 0;
}
0

A co to za problem zamienić liczbę groszy na liczbę złotych + groszy? Jesteś zaznajomiony z operatorem reszty z dzielenia (%)?

0

Właśnie o tym pomyślałem, jak wysyłałem posta, przepraszam za taką głupotę :x

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