problem wydawania monet - kolejka z kilkoma wskaznikami?

0

Witam wszystkich serdecznie!

od pol roku programuje w c++, wiec jestem swiezy. Mam za zadanie zrobic klase "automat do wyplacania pieniedzy", w automacie sa 5 €, 20 € i 50 €. Mam juz plan jak ma wygladac klasa tylko napotkalem sie na jeden problem. Np Automat posiada 450€, 420, 4*5€, i on musi najpierw wyplacic 50€ i w dol. Myslalem nad kolejka z kilkoma wskaznikami, to ma mniej wiecej tak wygladac.

   FIRST                          _1ptr     _2ptr                             _3ptr    _4ptr                             LAST
      |                                 |          |                                    |          |                                   |
     50         50        50       50       20         20         20         20         5            5          5         5

ptr=pointer

First i _1ptr pokazuja mi gdzie sa 50€ itd. Jezeli ktos wpisze, ze ma wyplacic np 250 € to mam zamiar przeleciec liste i po drodze usowac elementy.
Jest to do zrealizowania ? moze mysle teraz zbyt skomplikowanie i mozna ten problem inaczej rozwiazac.
JEZELI CIE TO ZACIEKAWILO POCZYTAJ DALSZA CZESC!!

napisze kilka slow na temat programu. No wiec mam funkje bool wyplac(int kwota), ktora testuje czy kwota jest podzielna przez 5, jezeli tak to true, jezeli nie to false i wyskoczy Blad. Nastepnie musze przetestowac czy automat posiada w ogóle tyle pieniedzy jezeli tak przechodze do tej procedury, ktora u gory opisalem.

czekam na wasze propozycje

0

Ja bym zrobił 4 zmienne.

unsigned b50; // ile 50
unsigned b20; // ile 20
unsigned b5; // ile 5

I wtedy sprawdzenie czy jest odpowiedznia liczba banknotów to pikuś:

if( kwota % 5 == 0 && b50*50+b20*20+b5*5 > kwota )
// instrukcje
0

Lepiej tablicę zrobić tablicę na nominały i ich ilość, kod będzie bardziej uniwersalny:

const int iloscNominalow = 3;
int nominaly[iloscNominalow] = { 5, 20, 50 };
int iloscBanknotow[iloscNominalow] = { 1000, 200, 100 };

bool wyplac(int kwota, int banknoty[iloscNominalow])
{
   //tutaj próba wypełnienia tablicy 'banknoty' odpowiednimi bankomatami
   //tak aby uzbierała się żądana kwota, jeśli się nie uda zwracasz false
}
0

Cóż, zrobiłbym to podobnie jak koledzy powyżej lecz stworzyłbym klasę lub ew. strukturę:

class money_automat:
{
  private:
    int ilosc_50;
    int ilosc_20;
    int ilosc_5;
  public:
    int ile_zostalo();
    bool wyplac(int kwota);
    //kwestie metod wpłacania kasy pomijam
};
int money_automat::ile_zostalo()
{
  return (ilosc_50*50+ilosc_20*20+ilosc_5*5);
};

bool money_automat::wyplac(int kwota)
{
  int wyplacono=0;
  if(ile_zostalo<kwota)
    return false;
  else
    while(wyplacono<=kwota)
    {
      if(ilosc_50>0 && (wyplacono+50)<=kwota)
      {
        // Warunek (wyplacono+50)<=kwota wprowadziłem po to by upewnić się, że automat nie wypłaci "za dużo"
        wyplacono+=50;
        --ilosc_50;
      }
      else if(ilosc_20>0 && (wyplacono+20)<=kwota)
      {
        wyplacono+=20;
        --ilosc_20;
      }
      else if(ilosc_5>0 && (wyplacono+5)<=kwota)
      {
        wyplacono+=5;
        --ilosc_20;
      }
      else
        return false; //w przypadku gdy jest za mało pieniędzy lub nie ma odpowiednich drobnych
    };
    return true;
};

Do tego wystarczy dołożyć jakiś zmyślny konstruktor pobierający startową ilość kasy i już można tworzyć automaty :-)

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