Wydawanie reszty - Czy dobrze zrobilem zadanie?

0

Witam
Dostałem takie zadanie:

Napisz program, który najpierw czyta nominały (zadecyduj, czy przeliczać nominały na
najmniejsza jednostkę), a następnie w pętli czyta kwoty/reszty do tworzenia z najmniejszej
liczby nominałów metodą zachłanną. Wykonaj program dla wielu kwot/reszt.
(a) Jako danych użyj nominałów naszej waluty.
(b) Jako danych użyj monet i banknotów amerykańskiej waluty; w centach: 1 (penny), 5
(nickel), 10 (dime), 25 (quarter), 50 i w dolarach: 1, 2, 5, 10, 20, 50, 100, 200, 1000.

Moje pytanie brzmi. Czy dobrze zrobiłem to zadanie?

#include <iostream>
#include <stdlib.h>

using namespace std;

const short WIELKOSC_TAB = 15;
int * tab1;
int wybor;

int main()
{
    while( true )
    {
        int r, p, x = 0;
        cout << "Wybierz nominal: " << endl;
        cout << "1. polski zloty (przeliczony w groszach)" << endl;
        cout << "2. amerykanski dolar (przeliczony w centach)" << endl;
        
        
        
        
        
        cin >> wybor;
        
        if( wybor == 1 || wybor == 2 )
        {
            
            switch( wybor )
            {
            case 1:
                tab1 = new int[ WIELKOSC_TAB ] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 }; // zloty w groszach
                break;
                
            case 2:
                tab1 = new int[ WIELKOSC_TAB ] { 100000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 25, 10, 5, 1 }; // dolar w centach
                break;
            }
            
        }
        else
        {
            cout << "Wybrales zla liczbe" << endl;
            system( "PAUSE" );
            return 0;
        }
        
        cout << "Podaj reszte do wyplacenia: ";
        cin >> r;
        
        
        
        while( r > 0 )
        {
            
            int n = 0;
            for( int i = 0; i < 15; ++i )
            {
                if(( tab1[ i ] <= r ) &&( tab1[ i ] > n ) )
                {
                    p = r / tab1[ i ];
                    n = tab1[ i ];
                    
                    cout << tab1[ i ] << " x " << p << endl;
                }
                
            }
            
            r -= n * p;
            ++x;
        }
        
        
        delete[] tab1;
    }
    return 0;
}
0

Jak dla mnie co najwyżej średnio.

int * tab1;
int wybor;

Zmienne globalne.

        if( wybor == 1 || wybor == 2 )
        {
 
            switch( wybor )
            {
            case 1:
                tab1 = new int[ WIELKOSC_TAB ] { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 }; // zloty w groszach
                break;
 
            case 2:
                tab1 = new int[ WIELKOSC_TAB ] { 100000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 25, 10, 5, 1 }; // dolar w centach
                break;
            }
 
        }
        else
        {
            cout << "Wybrales zla liczbe" << endl;
            system( "PAUSE" );
            return 0;
        }

Po co if/else, skoro switch i default by załatwiły sprawę?
Nagie new
Nie wiedzieć czemu tworzysz tablice w czasie wykonania. Łatwiej by było użyć stałej i wybierać tylko którą tablicę chcesz.

 for( int i = 0; i < 15; ++i )

magiczna liczba

        while( r > 0 )
        {
 
            int n = 0;
            for( int i = 0; i < 15; ++i )
            {
                if(( tab1[ i ] <= r ) &&( tab1[ i ] > n ) )
                {
                    p = r / tab1[ i ];
                    n = tab1[ i ];
 
                    cout << tab1[ i ] << " x " << p << endl;
                }
 
            }
 
            r -= n * p;
            ++x;
        }

nie ogarniam po co tutaj masz dwie pętle.


To tyle po szybkim przejrzeniu.

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