Czy dobrze napisałem kod na podstawie polecenia?

0

Witam. Dostałem takie polecenie i nie wiem czy dobrze napisałem program zgodnie z treścią. Prosiłbym o pomoc w przeanalizowaniu mojego kodu

  • 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.

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

using namespace std;

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

int main()
{
    while(true)
    {
        int r,p, i;
        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] {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;

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

        delete [] tab1;
    }
    return 0;
}


0

No ale odpaliłeś?

Podaj reszte do wyplacenia: 1234
1000 x 1
200 x 1
20 x 1
10 x 1
2 x 2

Ustawiłem złotówki

0

Odpaliłem. Wiem, ze wszystko dobrze przelicza na grosze/centy i poprawnie reszty wydaje. Tylko chodzi mi o to czy dobrze zrobiłem program zgodnie z treścią, którą podałem, ponieważ mam taką ciętą babkę z algorytmów i o wszystko się czepia.

1

Ty no ale mi napisało, że 1000 x 1. Jest taki banknot w ogóle? Może i nie jestem najbogatszy ale coś bym na ten temat wiedział.

0

to są złotówki przeliczone w groszach i dolary przeliczone w centach

0

A jak tak to działanie wydaje się okej. Dodaj sobie tylko 500 PLN bo taki w Polsce jest teraz.

0

Moim zdaniem masz źle zrobione to zadanie. A jego głównym celem jest zapewne, abyś zrozumiał na czym polega problem wydawania reszty: Wiki: Problem wydawania reszty

Dlaczego tak uważam? Bo treść twojego zadania zawiera:

  • wczytaj nominały;
  • wykorzystaj algorytm zachłanny

Czyli najpierw twój program powinien otrzymać pewną liczbę nominałów, a następnie w pętli otrzymywać kwotę. Następnie utworzyć kwotę z najmniejszej możliwej liczby nominałów, które otrzymał na początku.

0

Mógłbyś pomóc w przerobieniu mojego kodu, tak jak mówisz?

0

Zastosowałem metodę zachłanną, tylko jak powiedzmy dam resztę 400000 to wyswietla mi:
50000 x 8
50000 x 7
50000 x 6
50000 x 5
50000 x 4
50000 x 3
50000 x 2
50000 x 1

Zamiast tylko 50000 x 8. Macie pomysl na to?

#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;
        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;
            ++x;

        }

        delete [] tab1;
    }
    return 0;
}

0

A jak ma Ci wyświetlić 50000 skoro tego nie masz w tablicy?
Racja. Jest w tablicy ale widzę, że są też jakieś inne zmiany. To trzeba na spokojnie usiąść a teraz nie mam czasu :]

0

Jak to nie ma?

0

Udało mi się zrobić tę metodę zachłanną. Pomógłby ktoś przerobić ten kod, zeby zgadzał się z treścią zadania?

#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;
}

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