(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 tarvittavien return-käskyjen kera. Tämän jälkeen suoritat tietenkin commitin versionhallintaan (luokkarajapinnan stub valmis).
  • Tehtävässä käytetään yksikkötestejä, mikä tarkoittaa, että jokaisen metodin pitää erikseen toimia oikein. Ei siis riitä, että ohjelma kokonaisuudessaan toimii oikein eli tulostaa oikeat tulostukset. Tarkemmin sanottuna print-metodi hoitaa varsinaisen tulostuksen. Muut metodit hoitavan nimensä mukaisen toiminnon ja tulostavat virheilmoituksen, jos toiminto ei ole mahdollinen.
  • Mieti, mitä tilisiirrossa tapahtuu. Miten voisit toteuttaa tilisiirron mahdollisimman yksinkertaisesti (kutsumalla luokan muita metodeja)?

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.