--Smigol-- Temat założony przez niniejszego użytkownika |
[C] Ilość banknotów i monet » 2014-02-11 17:15:01 Witam. Dostałem zadanie ze szkoły - napisać program, który po wprowadzeniu określonej kwoty poda jak najmniejszą ilość odpowiednich banknotów potrzebnych do jej otrzymania, w euro. Oto co udało mi się sklecić, program działa dla niektórych wartości a dla innych nie. Domyślam się też że zamiast powtarzać pętlę while da radę zrobić to w mniejszej ilości kodu, choć niezbyt wiem jak. Jeśli się komuś nie chce, to proszę chociaż o podpowiedzenie czy popełniam tu błąd w pisaniu programu czy błąd w toku myślenia. #include <stdio.h> #include <stdlib.h>
int main() { float tot; int b500 = 0; int b200 = 0; int b100 = 0; int b50 = 0; int b20 = 0; int b10 = 0; int b5 = 0; int m2 = 0; int m1 = 0; int m050 = 0; int m020 = 0; int m010 = 0; int m005 = 0; int m002 = 0; int m001 = 0; printf( "Wprowadz kwote (kropka oddziela centy) w euro: " ); scanf( "%f", & tot ); while(( tot - 500 ) >= 0 ) { b500++; tot = tot -( 500 * b500 ); } while(( tot - 200 ) >= 0 ) { b200++; tot = tot -( 200 * b200 ); } while(( tot - 100 ) >= 0 ) { b100++; tot = tot -( 100 * b100 ); } while(( tot - 50 ) >= 0 ) { b50++; tot = tot -( 50 * b50 ); } while(( tot - 20 ) >= 0 ) { b20++; tot = tot -( 20 * b20 ); } while(( tot - 10 ) >= 0 ) { b10++; tot = tot -( 10 * b10 ); } while(( tot - 5 ) >= 0 ) { b5++; tot = tot -( 5 * b5 ); } while(( tot - 2 ) >= 0 ) { m2++; tot = tot -( 2 * m2 ); } while(( tot - 1 ) >= 0 ) { m1++; tot = tot -( 1 * m1 ); } while(( tot - 0.5 ) >= 0 ) { m050++; tot = tot -( 0.5 * m050 ); } while(( tot - 0.1 ) >= 0 ) { m010++; tot = tot -( 0.1 * m010 ); } while(( tot - 0.05 ) >= 0 ) { m005++; tot = tot -( 0.05 * m005 ); } while(( tot - 0.02 ) >= 0 ) { m002++; tot = tot -( 0.02 * m002 ); } while(( tot - 0.01 ) >= 0 ) { m001++; tot = tot -( 0.01 * m001 ); } printf( "Userai:\n%d Banknotow o wartosci 500 euro.\n%d Banknotow o wartosci 200 euro.\n%d Banknotow o wartosci 100 euro.\n%d Banknotow o wartosci 50 euro.\n%d Banknotow o wartosci 20 euro.\n%d Banknotow o wartosci 10 euro.\n%d Banknotow o wartosci 5 euro.\n%d Monet o wartosci 0,50 euro.\n%d Monet o wartosci 0,20 euro.\n%d Monet o wartosci 0,10 euro.\n%d Monet o wartosci 0,005 euro.\n%d Monet o wartosci 0,002 euro.\n%d Monet o wartosci 0,001 euro.\n", b500, b200, b100, b50, b20, b10, b5, m2, m1, m050, m020, m010, m005, m002, m001 ); return 0; }
Pozdrawiam serdecznie. |
|
dante89 |
Banknoty » 2014-02-11 18:38:20 Witam. Napisałem trochę prościej.Napisałem w C++, ale myślę, że przekształcenie do C to chwila moment. Nie mam jeszcze tyle wprawy w programowaniu ale zrobiłem to tak: int main() { float tot; float tab[ 15 ] = { 500, 200, 100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01 }; float tab_wynik[ 15 ] = { 0 }; std::cout << "Wprowadz kwote (kropka oddziela centy) w euro: "; std::cin >> tot; for( int i = 0; i < 15; i++ ) { while(( tot - tab[ i ] ) >= 0 ) { tab_wynik[ i ] ++; tot = tot -( tab[ i ] * tab_wynik[ i ] ); } } std::cout << "Ilosc banknotów:\n"; std::cout << "500\t200\t100\t50\t20\t10\t5\t2\t1\t0,50\t0,20\t0,10\t0,05\t0,02\t0.01\n"; for( int i = 0; i < 15; i++ ) { std::cout << tab_wynik[ i ] << "\t"; } return 0; }
|
|
leon_w |
» 2014-02-11 18:48:39 Ogólnie powinno działać dobrze, jeśli pousuwa się wszystkie błędy: 1.W każdej pętli powinieneś odejmować samą wartość, bez mnożenia. Pętla za każdym razem odejmie daną wartość a jeśli ją pomnożysz, to z każdym kolejnym obiebigiem odejmuje zwielokrotnioną wartość. while(( tot - 500 ) >= 0 ) { b500++; tot = tot - 500; Takie coś w zupełności wystarczy. 2.Masz brakującą pętle dla wartoćci 0.2. 3.Przy wyświetlaniu też masz braki: 2 i 1 euro. @edit @dante89 Tak samo nie potrzebnie mnożysz. Jeżeli pominąć to niepotrzebne mnożenie to program też zadziała dobrze, jednak wynik jest mało czytelny. W Twoim programie bym zaproponował takie wyświetlanie: cout << "Ilosc banknotów:\n"; for( int i = 0; i < 15; i++ ) cout << tab[ i ] << " euro = " << tab_wynik[ i ] << endl;
|
|
dante89 |
Banknoty » 2014-02-11 19:11:23 Masz racje, Twoja wersja jest bardziej czytelna i prostsza no i nie ma niepotrzebnego mnożenia :). Dzięki za poprawienie mnie. |
|
alixir |
» 2014-02-11 20:54:13 A ja dla odmiany użyłem tylko jednej pętli obliczającej. #include <stdio.h>
struct banknot { char nominal[ 14 ]; int wartosc; int ilosc; };
int main() { banknot banknoty[] = { { "500 euro", 50000, 0 }, { "200 euro", 20000, 0 }, { "100 euro", 10000, 0 }, { "50 euro", 5000, 0 }, { "20 euro", 2000, 0 }, { "10 euro", 1000, 0 }, { "5 euro", 500, 0 }, { "2 euro", 200, 0 }, { "1 euro", 100, 0 }, { "50 eurocentow", 50, 0 }, { "20 eurocentow", 20, 0 }, { "10 eurocentow", 10, 0 }, { "5 eurocentow", 5, 0 }, { "2 eurocenty", 2, 0 }, { "1 eurocent", 1, 0 } }; printf( "Podaj kwote w formacie (100,25): " ); int kwota; scanf( "%d", & kwota ); kwota *= 100; int temp; scanf( "%*c%d", & temp ); kwota += temp; int i = 0; while( kwota != 0 ) { banknoty[ i ].ilosc = kwota / banknoty[ i ].wartosc; kwota = kwota % banknoty[ i ].wartosc; i++; } printf( "\nIlosc banknotow:\n" ); for( int n = 0; n < 15; n++ ) if( banknoty[ n ].ilosc != 0 ) printf( "%-15s = %4d\n", banknoty[ n ].nominal, banknoty[ n ].ilosc ); return 0; }
|
|
--Smigol-- Temat założony przez niniejszego użytkownika |
» 2014-02-11 21:24:12 O widzisz Leon, dziękuję ;) Faktycznie niepotrzebnie, nie pomyślałem że przecież pętla za każdym razem będzie odejmować tę wartość. Jeszcze raz dzięki, już wszystko styka. Pozdrawiam. |
|
--Smigol-- Temat założony przez niniejszego użytkownika |
» 2014-02-16 16:02:46 alixir, możesz wyjaśnić mi co oznacza ten kawałek kodu? printf( "Podaj kwote w formacie (100,25): " ); int kwota; scanf( "%d", & kwota ); kwota *= 100; int temp; scanf( "%*c%d", & temp ); kwota += temp;
Głównie chodzi o drugiego scanf. Z góry dziękuję i pozdrawiam. |
|
alixir |
» 2014-02-16 17:35:31 To jest taka prosta zagrywka. Pierwszy scanf wczytuje pierwszą liczbę do przecinka. W buforze pozostaje nadal przecinek i liczba (po przecinku), więc drugi scanf wczytuje obie te rzeczy, lecz przecinak porzuca. Zapis %*c oznacza, wczytaj znak i porzuć go bez zapisywania. |
|
« 1 » 2 |