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

[C] Ilość banknotów i monet

Ostatnio zmodyfikowano 2014-02-16 18:34
Autor Wiadomość
--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.

C/C++
#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.
P-104453
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:

C/C++
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 }; //zamiast pisania tylu zmiennych lepiej skorzystać z tablicy
    float tab_wynik[ 15 ] = { 0 }; //tablica pomocnicza, wypelniona zerami. Chodzi o to by w tym samym miejscu co w tablicy powyżej dać odpowiednią liczbę banknotów
   
    std::cout << "Wprowadz kwote (kropka oddziela centy) w euro: ";
    std::cin >> tot;
   
    for( int i = 0; i < 15; i++ )
    {
        //tutaj są odejmowane odpowiednie wartości z tablicy "tab"
        while(( tot - tab[ i ] ) >= 0 ) //zamiast tylu pętli while mamy tylko jedną
        {
            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"; //\t=tabulator
   
    for( int i = 0; i < 15; i++ ) //wyswietlanie wyników
    {
        std::cout << tab_wynik[ i ] << "\t";
    }
   
    return 0;
}
P-104463
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ść.
C/C++
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:
C/C++
cout << "Ilosc banknotów:\n";
for( int i = 0; i < 15; i++ )
     cout << tab[ i ] << " euro = " << tab_wynik[ i ] << endl;

P-104465
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.
P-104468
alixir
» 2014-02-11 20:54:13
A ja dla odmiany użyłem tylko jednej pętli obliczającej.

C/C++
#include <stdio.h>

struct banknot {
    char nominal[ 14 ];
    int wartosc; // nominal * 100
    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;
}
P-104477
--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.
P-104481
--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?
C/C++
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.
P-104726
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.
P-104730
« 1 » 2
  Strona 1 z 2 Następna strona