Berux Temat założony przez niniejszego użytkownika |
Ćwiczenie z pieniędzmi - nie mogę znaleźć błędu » 2013-01-28 22:47:01 Witam. Przed chwilą zabrałem się do pisania programu - ćwiczenia, którego zadanie polega na obliczaniu jakimi pieniędzmi należy zapłacić daną kwotę tak, aby dać najmniej "przedmiotów". Może trochę nie zrozumiale napisane, ale wytłumaczę to przykładem: Mamy zapłacić 22.05 zł. Możemy to zrobić np. za pomocą tych pieniędzy: 10 zł + 10 zł + 2 zł + 5 gr. Program ma jednak za zadanie użycia,że tak powiem najmniej pieniędzy. Byłoby to więc: 20 zł + 2 zł + 5 gr. Oto kod: #include <iostream> #include <cstdlib>
using namespace std;
int main() { double cena; cin >> cena; int dwiescie = 0; int sto = 0; int piecdziesiat = 0; int dwadziescia = 0; int dziesiec = 0; int piec = 0; int dwa = 0; int jeden = 0; int grosz50 = 0; int grosz20 = 0; int grosz10 = 0; int grosz5 = 0; int grosz2 = 0; int grosz1 = 0; while( true ) { if( cena >= 200 ) { dwiescie++; cena -= 200; } if( cena >= 100 && cena < 200 ) { sto++; cena -= 100; } if( cena >= 50 && cena < 100 ) { piecdziesiat++; cena -= 50; } if( cena >= 20 && cena < 50 ) { dwadziescia++; cena -= 20; } if( cena >= 10 && cena < 20 ) { dziesiec++; cena -= 10; } if( cena >= 5 && cena < 10 ) { piec++; cena -= 5; } if( cena >= 2 && cena < 5 ) { dwa++; cena -= 2; } if( cena >= 1 && cena < 2 ) { jeden++; cena -= 1; } if( cena >= 0.5 && cena < 1 ) { grosz50++; cena -= 0.5; } if( cena >= 0.2 && cena < 0.5 ) { grosz20++; cena -= 0.2; } if( cena >= 0.1 && cena < 0.2 ) { grosz10++; cena -= 0.1; } if( cena >= 0.05 && cena < 0.1 ) { grosz5++; cena -= 0.05; } if( cena >= 0.02 && cena < 0.05 ) { grosz2++; cena -= 0.02; } if( cena >= 0.01 && cena < 0.02 ) { grosz1++; cena -= 0.01; } if( cena == 0 ) break; } cout << "200zl: " << dwiescie << "\n100zl: " << sto << "\n50zl: " << piecdziesiat << "\n20zl: " << dwadziescia << "\n10zl: " << dziesiec << "\n5zl: " << piec << "\n2zl: " << dwa << "\n1zl: " << jeden << "\n50gr: " << grosz50 << "\n20gr: " << grosz20 << "\n10gr: " << grosz10 << "\n5gr: " << grosz5 << "\n2gr: " << grosz2 << "\n1gr: " << grosz1 << endl; system( "pause" ); return 0; }
Problem polega na tym, że jak wpiszę 0.3 lub 0.7, itd. to program nic nie robi. Rozumiem, że te ponad 150 linijek kodu może zniechęcić, jednakże proszę o wyprowadzenie mnie z błędu. Z góry dzięki. |
|
jsc |
» 2013-01-28 23:24:21 Dziwny błąd, w ogóle wiesza się na liczbach nie z ułamkiem dziesiętnym. |
|
Schulze13 |
» 2013-01-28 23:24:35 Sprawdziłem kod i błąd jest natury logicznej, czyli najtrudniejszy do wykrycia. Proponuje Ci sprawdzić co się dzieje z ceną podczas podliczania monet: wstaw cout << cena; do pętli. Będziesz mógł zobaczyć, że problem jest z nieszczęsną 1 groszówką i dalej pokombinuj sam :). Mi udało się rozwiązać ten problem. |
|
crash |
» 2013-01-28 23:26:10 Po pierwsze, ja też lubię klepać w klawiaturę zwłaszcza programując, ale nie odważyłbym się tyle razy z rzędu napisać int int int int. Można ładnie w jednej linijce: int a = 0, b = 0, c = 0, d = 0, e, f, g, h = 0, i, j, k = 0; Można mieszać deklaracje z inicjalizacjami. Po drugie, int przechowuje liczby całkowite i tylko całkowite! Do zmiennoprzecinkowych służą typy float oraz double. |
|
Schulze13 |
» 2013-01-28 23:29:08 @up typy są poprawne. Te wszystkie zmienne int przechowują ilość monet, a nie kwotę, ale muszę się zgodzić, można wszystko w jednej linii. |
|
crash |
» 2013-01-28 23:45:30 Fakt, mój błąd, sorka ;p Zmodyfikowałem kod i patrzta jaka akcja, lol: #include <iostream> #include <cstdlib>
using namespace std;
int main() { double cena; cin >> cena; int dwiescie = 0; int sto = 0; int piecdziesiat = 0; int dwadziescia = 0; int dziesiec = 0; int piec = 0; int dwa = 0; int jeden = 0; int grosz50 = 0; int grosz20 = 0; int grosz10 = 0; int grosz5 = 0; int grosz2 = 0; int grosz1 = 0; while( true ) { cout << "\n@@@@@@\n"; if( cena >= 200 ) { dwiescie++; cena -= 200; } cout << "\n200: " << cena; if( cena >= 100 && cena < 200 ) { sto++; cena -= 100; } cout << "\n100:" << cena; if( cena >= 50 && cena < 100 ) { piecdziesiat++; cena -= 50; } cout << "\n50:" << cena; if( cena >= 20 && cena < 50 ) { dwadziescia++; cena -= 20; } cout << "\n20:" << cena; if( cena >= 10 && cena < 20 ) { dziesiec++; cena -= 10; } cout << "\n10:" << cena; if( cena >= 5 && cena < 10 ) { piec++; cena -= 5; } cout << "\n5:" << cena; if( cena >= 2 && cena < 5 ) { dwa++; cena -= 2; } cout << "\n2:" << cena; if( cena >= 1 && cena < 2 ) { jeden++; cena -= 1; } cout << "\n1:" << cena; if( cena >= 0.5 && cena < 1 ) { grosz50++; cena -= 0.5; } cout << "\n0.5:" << cena; if( cena >= 0.2 && cena < 0.5 ) { grosz20++; cena -= 0.2; } cout << "\n0.2:" << cena; if( cena >= 0.1 && cena < 0.2 ) { grosz10++; cena -= 0.1; } cout << "\n0.1:" << cena; if( cena >= 0.05 && cena < 0.1 ) { grosz5++; cena -= 0.05; } cout << "\n0.5:" << cena; if( cena >= 0.02 && cena < 0.05 ) { grosz2++; cena -= 0.02; } cout << "\n0.2:" << cena; if( cena >= 0.01 && cena < 0.02 ) { grosz1++; cena -= 0.01; } cout << "\nKONIEC PRZEBIEGU:" << cena << endl << "napisz cos i enter\n"; char c; cin >> c; } cout << "200zl: " << dwiescie << "\n100zl: " << sto << "\n50zl: " << piecdziesiat << "\n20zl: " << dwadziescia << "\n10zl: " << dziesiec << "\n5zl: " << piec << "\n2zl: " << dwa << "\n1zl: " << jeden << "\n50gr: " << grosz50 << "\n20gr: " << grosz20 << "\n10gr: " << grosz10 << "\n5gr: " << grosz5 << "\n2gr: " << grosz2 << "\n1gr: " << grosz1 << endl; system( "pause" ); return 0; }
EDIT: Zdaje mi się, że najlepiej jest policzyć osobno rozkład złotówek i osobno groszy. Takie moje małe zdajemisię |
|
Schulze13 |
» 2013-01-28 23:58:02 crash, twój kod jest magiczny, a przynajmniej wyniki. Nie wiem co tam zrobiłeś, ale mniejsza. Program można poprawić zmieniając jeden if() :D (zawrze mogę się mylić bo jestem noobem) |
|
ison |
» 2013-01-29 00:01:30 Taki już urok liczb zmiennoprzecinkowych. if( cena == 0 ) taki zapis niekoniecznie robi to co chcesz aby robił (tzn. sam ten zapis może i tak, ale operacje arytmetyczne użyte wcześniej powodują, że niekoniecznie daje takie wyniki jakbyś chciał). Liczby zmiennoprzecinkowe porównuj z jakimś epsilonem if( fabs( cena ) < 0.001 ) To samo tyczy się innych ifów gdzie używasz operatorów >= <= == if( cena >= 0.01 ) taki if powinien wyglądać tak if( cena > 0.01 || fabs( cena - 0.01 ) < 0.001 ) (gdzie 0.001 to epsilon) Lepiej jednak gdybyś się nie bawił w liczby zmiennoprzecinkowe i rozpatrywał złotówki i grosze osobno int zl = 0, gr = 0; scanf( "%d.%d", & zl, & gr );
|
|
« 1 » 2 |