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

Bankomat w C++ - Wydawania kwoty z określonej liczby banknotów?

Ostatnio zmodyfikowano 2018-02-20 20:19
Autor Wiadomość
PhilippO
Temat założony przez niniejszego użytkownika
Bankomat w C++ - Wydawania kwoty z określonej liczby banknotów?
» 2018-02-18 22:43:23
Cześć,
Mam do napisania program w języku c++ bankomat z uwzględnieniem poniższych założeń:

"Zakłada się, że bankomat jest automatem wolnostojącym, z dostępem do Internetu.
Bankomat jest powiązany w bankiem internetowym, w którym klient na konto. Klient może
pobrać z bankomatu kwotę nie wyższą niż połowa stanu jego konta. Sekwencja operacji
poboru gotówki z bankomatu – jest losowa.
Przed pobraniem gotówki z bankomatu, klient jest identyfikowany poprzez :
a) Numer PIN;
b) Kartę bankową (odpowiednie dane:.
Konwersacja klienta z bankomatem odbywa się za pomocą ekranu. Identyfikacja klienta jest
dokonywana raz na godzinę (tzn., że po nieprawidłowej identyfikacji, następuje blokada na 1
godzinę). W przypadku prawidłowej identyfikacji – klient podaje kwotę, która ma być
wypłacona. W przypadku braku pokrycia tej kwoty, następuje blokada na 1 dzień.
W stanie początkowym, w kasetach bankomatu znajduje się :
a) 10 banknotów – o nominale 200PLN;
b) 10 banknotów – o nominale 100PLN;
c) 10 banknotów – o nominale 50PLN;
d) 10 banknotów – o nominale 20PLN;
e) 10 banknotów – o nominale 10PLN;
Bankomat może wydawać kwoty, które są wielokrotnością 10PLN (do 500PLN) – od
banknotów o najwyższych nominałach do banknotów o najniższych nominałach.
Jeśli bankomat nie ma banknotów o jakichś nominałach lub nie może wydać żądanej kwoty to
jest częściowo niesprawny. W takim przypadku bankomat powinien podać na ekranie
„najbliższą” kwotę – niższą lub wyższą – którą może wydać. Jeśli bankomat nie potrafi
wydać żądanej kwoty – to jest niesprawny."


Do momentu wypłacanie gotówki jakoś mi się udawało, ale fragment z wypłatą gotówki jak widać trochę mnie przerasta mimo wielu różnych prób nie udało mi się osiągnąć zamierzonego efektu.

Do przechowywania banknotów stworzyłem tabele w której mamy banknot oraz jego ilość i tutaj właśnie pojawia się problem, nie do końca wiem w jaki sposób się do niej odwołać tak żeby po wypłaceniu gotówki zmniejszała się ilość banknotów. W teorii wydaje mi się, że wiem jak to zrobić, ale w praktyce moje umiejętności nie są wystarczające.

Teoria :)
Wydaje mi się, że po podaniu kwoty program powinien sprawdzić czy kwota jest wielokrotnością 10, oraz czy nie jest większa od 500, jeżeli oba warunki są spełnione powinien sprawdzić ile w podanej kwocie znajduje się banknotów 200 złotowych, 100 złotowych itp., następnie wypłacić daną kwotę i odjąć ilość banknotów wypłaconych od ilości banknotów które mamy w bankomacie.

Będę wdzięczny za każdą pomoc :)

Pozdrawiam serdecznie


C/C++
#include "stdafx.h"
using namespace std;
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <ctime>
#include <algorithm>
#include <vector>
#include <cstdlib>



long int unix_timestamp()
{
    time_t t = std::time( 0 );
    long int now = static_cast < long int >( t );
    return now;
}

struct banknotyWbankomacie {
    const int banknot;
    const int liczba;
};

int main( int nargc, char * argv[] )
{
   
    int balance;
    int pin;
    int numer_karty;
    int blokada;
    int opcja;
    pin = 1234;
    numer_karty = 662579860;
    time_t now = time( NULL );
    struct tm * tm = localtime( & now );
   
   
   
   
   
   
   
   
    cout << "Witamy w naszym bankomacie!" << endl;
    cout << "Wybierz 1, aby wlozyc karte." << endl;
    cout << "Wybierz 2, aby zakonczyc sesje." << endl;
   
   
   
    cin >> opcja;
   
    if( opcja == 1 )
    {
    }
    logowanie:
    cout << "Karta o numerze 662579860" << endl;
    cout << "Prosze o podanie numeru pin: ";
    cin >> pin;
   
    if( pin != 1234 )
    {
        cout << "Twoje konto zostało zablokowane." << endl;
        cout << "Blokada bedzie trwac od ";
        asctime( tm );
        cout << asctime( tm );
        cout << "do ";
        tm->tm_hour += 1;
        cout << asctime( tm );
       
        long int now = unix_timestamp();
        blokada = now + 60;
        Sleep( 5000 );
        cout << "Zapraszamy za godzine i zyczymy milego dnia" << endl;
        system( "cls" );
       
        do
        {
           
            cout << "Witamy w naszym bankomacie!" << endl;
            cout << "Wybierz 1, aby wlozyc karte." << endl;
            cout << "Wybierz 2, aby zakonczyc sesje." << endl;
           
            cin >> opcja;
            if( opcja == 1 )
            {
                now = unix_timestamp();
               
                if( blokada > now )
                {
                    cout << "Twoja karta jest zablokowana" << endl;
                    cout << "Prosze wyjac karte i wrocic ponownie po zakonczeniu blokady" << endl;
                    cout << " Zapraszamy o " << asctime( tm ) << endl;
                    Sleep( 5000 );
                    system( "cls" );
                   
                }
                else if( blokada < now )
                {
                    goto logowanie;
                }
               
            }
           
           
           
           
        } while( opcja == 1 );
       
       
       
       
       
       
       
    }
    else if( pin == 1234 )
    {
       
        banknotyWbankomacie banknotyDostepne[] = {
            { 200, 10 },
            { 100, 10 },
            { 50, 10 },
            { 20, 10 },
            { 10, 10 }
        };
       
       
       
        system( "PAUSE" );
       
       
       
       
    }
   
    wyglowanie:
    if( opcja == 2 )
    {
        cout << "Dziekujemy za skorzystanie z naszych uslug" << endl;
        system( "PAUSE" );
        return 0;
    }
   
   
   
   
   
}
P-169507
darko202
» 2018-02-19 07:53:28
pewnie czytałeś jaki jest czas życia zmiennej (widzialności zmiennych)
i wiesz, że po wyjściu z bloku w której została zadeklarowana zmienna
przestaje istnieć.

dlatego gdy zmienisz miejsce deklaracji zmiennej do przechowywania ilości banknotów
C/C++
if(...)
....
else if( pin == 1234 )
{
   
    banknotyWbankomacie banknotyDostepne[] = {
        { 200, 10 },
        { 100, 10 },
        { 50, 10 },
        { 20, 10 },
        { 10, 10 }
    };
będziesz mógł się do niej dobrać z jakiegoś innego miejsca programu
oczywiście jeśli będzie widoczna z tamtego bloku

2.
poczytaj na http://cpp0x.pl/kursy/
19. Przekazywanie tablic jednowymiarowych do funkcji
24. Przekazywanie argumentów funkcji przez referencję

P-169508
PhilippO
Temat założony przez niniejszego użytkownika
» 2018-02-19 08:11:31
Cześć :),

O ile dobrze zrozumiałem te lekcje to najlepiej będzie ją umieścić tutaj :)?
C/C++
#include "stdafx.h"
using namespace std;
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <ctime>
#include <algorithm>
#include <vector>
#include <cstdlib>



long int unix_timestamp()
{
    time_t t = std::time( 0 );
    long int now = static_cast < long int >( t );
    return now;
}

struct banknotyWbankomacie {
    const int banknot;
    const int liczba;
};

banknotyWbankomacie banknotyDostepne[] = {
    { 200, 10 },
    { 100, 10 },
    { 50, 10 },
    { 20, 10 },
    { 10, 10 }
};
int main( int nargc, char * argv[] )
P-169509
darko202
» 2018-02-19 10:25:51
jest już dużo lepiej :)
choć widzę, że musisz jeszcze poczytać o dobrych praktykach programowania.
(ale tego ciągle się uczymy)  :: google + dobre praktyki programowania

w przedstawionym kodzie złą praktyką jest deklaracja zmiennej globalnej
lepsze jest
C/C++
int main( int nargc, char * argv[] )
{
    ...
    banknotyWbankomacie banknotyDostepne[] = {
        { 200, 10 },
        { 100, 10 },
        { 50, 10 },
        { 20, 10 },
        { 10, 10 }
    };
    ....

dlaczego "zła" jest deklaracja zmiennych globalnych ?
poszukaj odpowiedzi :)
google + deklaracja zmiennych globalnych problemy


Powodzenia 

P-169510
PhilippO
Temat założony przez niniejszego użytkownika
» 2018-02-19 11:01:52
Zapoznałem się z "internetami" i faktycznie w przypadku tej jednej zmiennej nie jest to jakiś duży problem, ale przy dłuższym kodzie może być problem :). Lepiej wcześniej zacząć pozbywać się takich nawyków :).

Czyli mając już tablicę w odpowiednim miejscu to nasuwają Ci się jakieś pomysły co do stworzenia wypłacania banknotów zgodnie z założeniami?
P-169511
darko202
» 2018-02-19 11:38:35
1.
problem potrzebnego Ci algorytmu jest wielokrotnie opisany jako algorytm plecakowy   

https://www.bing.com/search​?q=algorytm+plecakowy​&src=IE-SearchBox&FORM=IENTSR
w.algorytm.org​/kurs-algorytmiki​/problem-plecakowy.html

2.
co do problemu jak to zrobić ?


Wydaje mi się, że po podaniu kwoty program powinien sprawdzić czy kwota jest wielokrotnością 10, oraz czy nie jest większa od 500, jeżeli oba warunki są spełnione powinien sprawdzić ile w podanej kwocie znajduje się banknotów 200 złotowych, 100 złotowych itp., następnie wypłacić daną kwotę i odjąć ilość banknotów wypłaconych od ilości banknotów które mamy w bankomacie.

czy kwota jest wielokrotnością 10,  Reszta z dzielenia, a liczby rzeczywiste na
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-1/Operacje-matematyczne​/13
* if ( kwota ... 10 == 0)
czy nie jest większa od 500,
* if ( kwota < 500)


jeżeli oba warunki są spełnione powinien sprawdzić
ile w podanej kwocie znajduje się banknotów 200 złotowych, 100 złotowych itp., następnie wypłacić daną kwotę

ile200 = kwota/200
if (  banknotyDostepne["200"] <ile200)
{  ile200 = banknotyDostepne["200"] }

//  wypłacamy ile200 potrzeba
//  zmniejszamy ilość 200 do w bankomacie o ile200


powtarzamy powyższe kroki dla mniejszych walut
czyli najlepiej zrobić to co widać wyżejw funkcji
np.
void wypłac(int &kwota, int waluta, int &ile)



P-169513
PhilippO
Temat założony przez niniejszego użytkownika
» 2018-02-19 18:42:07
C/C++
int ile200;
cout << "Podaj kwote ktora chcesz wyplacic: " << endl;
cin >> kwota;
if( kwota % 10 == 0 && kwota < 500 )
{
   
    ile200 = kwota / 200;
   
   
    if( banknotyDostepne[ 0 ].liczba > ile200 ) //  jako pierwsze w tabeli mam 200, stąd 0
    {
        int liczbaDostepnych = banknotyDostepne[ 0 ].liczba;
        liczbaDostepnych -= ile200;
        cout << liczbaDostepnych << endl;
       
    }
   
   
    cout << ile200 << endl;
    cout << banknotyDostepne[ 0 ].liczba << endl;
    cout << banknotyDostepne[ 0 ].banknot << endl;
    system( "PAUSE" );
}

Udało mi się osiągnąć coś takiego :), "liczbaDostepnych" mówi nam ile zostało 200, ale nie wiem jak ją dodać do tabeli gdyż przy próbie
banknotyDostepne[ 0 ].liczba = liczbaDostepnych

otrzymuje błąd: "wyrażenie musi być modyfikowalną l-wartością".   - Zastanawiam się nad stworzeniem drugiej tabeli do której "włożę" to co wypłacam (ile200) i odejmę od głównej tabeli, ale czy to w czym pomoże?

Na razie nie próbowałem zrobić tej funkcji, gdyż wole ogarnąć to na jednym przypadku, zanim zacznę próbować na wszystkich :).



EDIT:
W przypadku dwóch tablic gdzie jedna ma być równa drugiej otrzymuje ten sam błąd :/
C/C++
else if( pin == 1234 )
{
   
    int ile200;
    cout << "Podaj kwote ktora chcesz wyplacic: " << endl;
    cin >> kwota;
    if( kwota % 10 == 0 && kwota < 500 )
    {
       
        ile200 = kwota / 200;
       
       
        if( banknotyDostepne[ 0 ].liczba > ile200 ) //  jako pierwsze w tabeli mam 200, stąd 0
        {
            int liczbaDostepnych = banknotyDostepne[ 0 ].liczba - ile200;
           
            cout << liczbaDostepnych << endl;
            int odliczenie[]
            {
                liczbaDostepnych,
               
            };
           
            cout << odliczenie[ 0 ] << endl;
           
            banknotyDostepne[ 0 ].liczba = odliczenie[ 0 ]; //ten sam błąd :<
        }
       
       
        cout << ile200 << endl;
        cout << banknotyDostepne[ 0 ].liczba << endl;
        cout << banknotyDostepne[ 0 ].banknot << endl;
        system( "PAUSE" );
    }



EDIT2:

Udało mi się rozwiązać ten problem zmieniając

C/C++
struct banknotyWbankomacie {
    const int banknot;
    const int liczba;
};

na
C/C++
struct banknotyWbankomacie {
    const int banknot;
    int liczba;
};

Tylko czy jest to dobra zmiana? Na ten moment fragment kodu o którym mowa wygląda tak:

C/C++
else if( pin == 1234 )
{
   
    int ile200;
    cout << "Podaj kwote ktora chcesz wyplacic: " << endl;
    cin >> kwota;
    if( kwota % 10 == 0 && kwota < 500 )
    {
       
        ile200 = kwota / 200;
       
       
        if( banknotyDostepne[ 0 ].liczba > ile200 ) //  jako pierwsze w tabeli mam 200, stąd 0
        {
           
           
            int liczbaDostepnych = banknotyDostepne[ 0 ].liczba;
            liczbaDostepnych -= ile200;
            cout << liczbaDostepnych << endl;
            banknotyDostepne[ 0 ].liczba = liczbaDostepnych;
           
           
        }
       
       
        cout << ile200 << endl;
        cout << banknotyDostepne[ 0 ].liczba << endl;
        cout << banknotyDostepne[ 0 ].banknot << endl;
       
        system( "PAUSE" );
    }
P-169524
PhilippO
Temat założony przez niniejszego użytkownika
» 2018-02-19 21:44:23
Nowy problem nowy post ;)

Udało mi się prawie osiągnąć to co zamierzałem dzięki ogromnej pomocy darko202, kod który możecie zobaczyć poniżej wypłaca kwotę zgodną z założeniami, ale w poprzednim poście darko202 zasugerował, żeby zrobić to w funkcji, przygotowałem sobie nawet taką funkcję, ale będąc szczerym nie potrafię jej przenieść w takim sposób, żeby działała :(
C/C++
void wyplata( int & kwota, int banknot, int & liczba )
{
   
}


C/C++
else if( pin == 1234 )
{
   
    int ile;
    int liczba;
    cout << "Podaj kwote ktora chcesz wyplacic: " << endl;
    cin >> kwota;
    if( kwota % 10 == 0 && kwota < 500 )
    {
        for( int i = 0; i < banknotyDostepne[ i ].banknot; i++ )
        {
            int liczbaDostepnych = banknotyDostepne[ i ].liczba;
            int banknot = banknotyDostepne[ i ].banknot;
            ile = kwota / banknot;
           
            cout << "ile= " << ile << endl;
           
            if( liczbaDostepnych > 0 && kwota >= banknot ) {
                kwota -= banknot;
                if( banknotyDostepne[ i ].liczba >= ile )
                {
                   
                   
                   
                    liczbaDostepnych -= ile;
                    cout << liczbaDostepnych << endl;
                    banknotyDostepne[ i ].liczba = liczbaDostepnych;
                   
                   
                }
            }
           
           
        }
       
        cout << "200= " << endl;
        cout << banknotyDostepne[ 0 ].liczba << endl;
        cout << banknotyDostepne[ 0 ].banknot << endl;
        cout << "100= " << endl;
        cout << banknotyDostepne[ 1 ].liczba << endl;
        cout << banknotyDostepne[ 1 ].banknot << endl;
        cout << "50= " << endl;
        cout << banknotyDostepne[ 2 ].liczba << endl;
        cout << banknotyDostepne[ 2 ].banknot << endl;
        cout << "20= " << endl;
        cout << banknotyDostepne[ 3 ].liczba << endl;
        cout << banknotyDostepne[ 3 ].banknot << endl;
        cout << "10= " << endl;
        cout << banknotyDostepne[ 4 ].liczba << endl;
        cout << banknotyDostepne[ 4 ].banknot << endl;
       
        system( "PAUSE" );
    }

PS: Może ktoś rzucić okiem na kod czy jest wszystko w porządku? Na kilka moich testów wszystko wydaje się ok :).



Oprócz powyższych problemów pozostaje mi jeszcze tylko jeden:
"Jeśli bankomat nie ma banknotów o jakichś nominałach lub nie może wydać żądanej kwoty to
jest częściowo niesprawny. W takim przypadku bankomat powinien podać na ekranie
„najbliższą” kwotę – niższą lub wyższą – którą może wydać. Jeśli bankomat nie potrafi
wydać żądanej kwoty – to jest niesprawny.""

Pozdrawiam :)


EDIT:
zmieniłem sposób odejmowania banknotów od kwoty na
C/C++
banknot = banknot * ile;
kwota -= banknot;

gdyż poprzednio przy np: 200 odejmował tylko 200, przez co potem brał jeszcze 2x 100.



P-169529
« 1 » 2
  Strona 1 z 2 Następna strona