(H) Pankkitili¶
Tavoite: Opin toteuttamaan pienen luokan C++:lla ja käyttämään luokan ilmentymää (oliota) metodin parametrina.
Ohjeita:
Hae ohjelmakoodipohja: templates/03/bank_account/
->
student/03/bank_account/
.
(Tiedostossa main.cpp
oleva funktio print_three_accounts
ei ole järkevä, mutta tässä vaiheessa ei ole vielä opittu tarpeeksi asioita,
jotta osaisimme kirjoittaa funktion,
joka tulostaisi minkä tahansa määrän pankkitilejä.
Kyseisen funktion tarkoitus on vähentää toisteista koodia ja selventää
main
-funktiota.)
Tehdään ohjelma, jossa voidaan luoda erilaisia pankkitilejä. Pankkitilillä on numero (IBAN), omistaja ja saldo. Lisäksi tili voi olla luotollinen, jolloin sillä on luottoraja. (Luotollinen tili voi mennä miinukselle luottorajan verran.)
Pankkitilille voidaan tallettaa rahaa, sieltä voidaan nostaa rahaa
ja siirtää rahaa toiselle tilille.
Pankkitilin tiedot voidaan tulostaa muodossa: omistaja : IBAN : saldo
.
Lisäksi luottokorttitilille voidaan asettaa luottoraja.
Pohjakoodissa luokalla Account
on staattinen attribuutti
running_number_
.
Staattinen attribuutti ei ole oliokohtainen (kuten tavalliset attribuutit)
vaan luokkakohtainen.
Toisin sanoen sen arvo on kaikilla luokan olioilla sama, ja jos jokin luokan
olio muuttaa sitä, uusi arvo päivittyy kaikille muillekin luokan olioille.
Tällaista attribuuttia voi käyttää kertomaan luokan olioiden lukumäärä,
ja niin on tavallaan tehty tässäkin ohjelmassa.
Kyseistä attribuuttia käytetään generoitaessa tilinumeroita.
Ensimmäiseksi luotavalle tilille tulee numeroksi FI00 1234 01
,
toiselle FI00 1234 02
jne.
Luokalla Account
on valmiina metodi generate_iban
, joten
sinun ei tarvitse huolehtia asiasta tämän enempää.
Metodin generate_iban
kutsu on valmiina luokan rakentajassa,
ja attribuutin running_number_
alkuarvon asettaminen on tehty valmiiksi.
Koodipohjassa on mukana pääohjelma (tiedostossa main.cpp
).
Sieltä näkyy, miten luokan Account
metodeja on kutsuttu.
Toteuta luokkaan Account
kaikki metodit, joita pääohjelmassa kutsutaan.
Huomaa, että Account
-luokka sisältää tiedot yksittäisestä
pankkitilistä.
Pääohjelmassa kaikkia toteutettavia metodeja on kutsuttu,
kuten paluuarvottomia eli void
-tyyppisiä metodeja kutsutaan.
Jos huomaat hyödylliseksi välittää tiedon metodin onnistumisesta
kutsujalle, voit määritellä metodin paluuarvoksi totuusarvon (bool
).
Tällöin funktioita voidaan kutsua molemmilla tavoilla:
bool
-arvon palauttamana funktiona tai void
-funktion tyyppisesti
(jos paluuarvosta ei olla kyseisessä kutsukohdassa kiinnostuneita).
Kun luokka Account
on toteutettu valmiiksi, ohjelma toimii
annetulla pääohjelmalla seuraavasti:
1: Creating three accounts
Cannot set credit limit: the account has no credit card
Printing all three accounts:
Tupu : FI00 1234 01 : 100 euros
Hupu : FI00 1234 02 : 200 euros
Lupu : FI00 1234 03 : 300 euros
2: Taking money succesfully:
50 euros taken: new balance of FI00 1234 01 is 50 euros
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 200 euros
Lupu : FI00 1234 03 : 300 euros
3: Taking money unsuccesfully:
Cannot take money: balance underflow
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 200 euros
Lupu : FI00 1234 03 : 300 euros
4: Taking money succesfully from a credit card account:
310 euros taken: new balance of FI00 1234 03 is -10 euros
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 200 euros
Lupu : FI00 1234 03 : -10 euros
5: Taking money unsuccesfully from a credit card account:
Cannot take money: credit limit overflow
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 200 euros
Lupu : FI00 1234 03 : -10 euros
6: Transferring money succesfully:
50 euros taken: new balance of FI00 1234 02 is 150 euros
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 150 euros
Lupu : FI00 1234 03 : 40 euros
7: Transferring money unsuccesfully:
Cannot take money: balance underflow
Transfer from FI00 1234 02 failed
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 150 euros
Lupu : FI00 1234 03 : 40 euros
8: Transferring money succesfully from a credit card account:
60 euros taken: new balance of FI00 1234 03 is -20 euros
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 210 euros
Lupu : FI00 1234 03 : -20 euros
9: Transferring money unsuccesfully from a credit card account:
Cannot take money: credit limit overflow
Transfer from FI00 1234 03 failed
Printing all three accounts:
Tupu : FI00 1234 01 : 50 euros
Hupu : FI00 1234 02 : 210 euros
Lupu : FI00 1234 03 : -20 euros
Vinkkejä tehtävän tekemiseen:
- Kun olet kirjoittanut metodin esittelyn tiedostoon
account.hh
, testaa myös toimintoa “Refactor” -> “Add Definition in account.cpp”. Löydät tämän klikkaamalla metodin esittelyä hiiren oikeanpuoleisella näppäimellä. - Ohjelma ei käänny, kun funktiossa
main
on kutsuja metodeille, joita ei ole vielä määritelty. Jos haluat koodata ohjelmasi fiksusti osissa toteutat ensin luokkarajapinnasta nk. stubin, jossa on vain tyhjät metodien määrittelyt mahdollisesti tarvittavienreturn
-käskyjen kera. Tämän jälkeen suoritat tietenkin commitin versionhallintaan (luokkarajapinnan stub valmis). - Mieti, mitä tilisiirrossa tapahtuu. Miten voisit toteuttaa tilisiirron mahdollisimman yksinkertaisesti?
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.