Hei,
Hjelpiä tarvitsisin,...
Tämän luvun ensimmäisessä ohjelmointitehtävässä tehtävänäsi on laatia luokka "Asiakastili". Luokan palveluita käytetään hyväksi alkeellisessa pankkiohjelmassa, jolla ohjelman käyttäjä voi selata asiakastietoja ja muuttaa asiakkaiden saldoja annetun tilinumeron perusteella. Pankkiohjelma on toteutettu pääohjelmassa, jonka toiminnasta sinun ei tarvitse välittää vaan riittää, että ohjelma saa tarvitsemansa palvelut alla esitettyjen määritelmien mukaan. Tehtävästä suoriutuminen vaatii huolellisuutta, kuten aina ohjelmoitaessa luokkia annetun toimeksiannon / määrittelyn mukaan.
Luokka "Asiakastili" sisältää kolme jäsenmuuttujaa: kokonaislukutyypin muuttujat asiakkaan tilinumerolle ja saldolle, sekä string-tyypin muuttujan asiakkaan nimelle. Jäsenmuuttujat ovat luokan sisäisiä, joten voit nimetä ne haluamallasi tavalla.
Luokan kaikki jäsenfunktiot ovat julkisia ja niistä ensimmäinen, "LisaaAsiakas" saa parametrinä asiakkaan tilinumeron, saldon ja nimen sijoittaen nämä olion jäsenmuuttujiin. Parametrit välitetään jäsenfunktiolle esitetyssä järjestyksessä. "LisaaAsiakas" ei palauta arvoa sitä kutsuvalle ohjelman osalle.
Toinen jäsenfunktio, "NaytaTiedot" ei ota vastaan parametrejä, eikä palauta mitään arvoa. Funktion tehtävävänä on tulostaa näytölle kolme riviä, jotka sisältävät olion jäsenmuuttujien arvot esimerkkitulosteen mukaisella tavalla.
Kolmas jäsenfunktio, "MuutaSaldoa" ottaa vastaan kokonaislukuparametrin, jonka se sijoittaa olion saldoa kuvaavaan jäsenmuuttujaan. Funktio ei palauta arvoa.
Luokan viimeinen jäsenfunktio, "VertaaTiliNro" saa parametrinä kokonaislukuarvon, jota verrataan olion tilinumeroon. Mikäli parametrinä välitetty tilinumero on sama kuin olion tiedoissa sijaitseva, palauttaa jäsenfunktio kokonaislukuarvon 1. Jos taas annettu ja olion tilinumero eivät täsmää, palauttaa jäsenfunktio kokonaislukuarvon 0.
Luokan palveluita hyödyntävän pankkiohjelman toiminta perustuu luokasta muodostettavaan automaattiseen oliotaulukkoon, jonka avulla eri asiakkaiden tietoja käsitellään. Ohjelmisto toimii kokonaisuutena, kun sinun vastuulla oleva luokka tarjoaa siltä pyydetyt palvelut.
Example output:
1: Näytä asiakkaan tiedot.
2: Muuta asiakkaan saldoa.
Lopetus negatiivisella luvulla.
Valitse toiminto: 1
Anna tilinumero:
23456
Tilinumero: 23456
Asiakkaan nimi: Anni Manninen
Tilin saldo: 23
1: Näytä asiakkaan tiedot.
2: Muuta asiakkaan saldoa.
Lopetus negatiivisella luvulla.
Valitse toiminto: 2
Anna tilinumero: 23456
Anna uusi saldo: 7434
Saldo muutettu.
1: Näytä asiakkaan tiedot.
2: Muuta asiakkaan saldoa.
Lopetus negatiivisella luvulla.
Valitse toiminto: 0
Ohjelma lopetetaan.
Koodini so Far;
#include <iostream> #include <string> using namespace std; class Asiakastili { public: int tilinumero; int saldo; string nimi; void LisaaAsiakas(int tilinro, int sald, string nim); void NaytaTiedot(void); void MuutaSaldoa(int saldo2); int VertaaTiliNumero(int numero); }; void Asiakastili::LisaaAsiakas(int tilinro, int sald, string nim) { tilinumero = tilinro; saldo = sald; nimi = nim; } void Asiakastili::NaytaTiedot(void) { cout << "Tilinumero: " << tilinumero << endl; cout << "Asiakkaan nimi: " << nimi << endl; cout << "Tilin saldo: " << saldo << endl; } void Asiakastili::MuutaSaldoa(int saldo2) { saldo = saldo2; } int Asiakastili::VertaaTiliNumero(int numero) { int vali; if (numero = tilinumero) { vali = 1; } else { vali = 0; } return vali; } int main() { int tilinumero, toiminto; cout << "1:Näytä asiakkaan tiedot." << endl; cout << "2:Muuta asiakkaan saldoa." << endl; cout << "Lopetus negatiivisella luvulla." << endl; cout << "Valitse toiminto: "; cin >> toiminto; switch (toiminto) { case 1: cout << NaytaTiedot << endl; break; case 2: cout << MuutaSaldoa << endl; break; case 3: cout << "Ohjelma lopetetaan." << endl; } cout << "Anna tilinumero: "; cin >> tilinumero; }
Luulisin, että koodi olisi hyvillä mallilla (voi kertoa jos on ongelmia) paitsi tuo switch komento, en oikein osaa yhdistää sitä jotenkin, niin jos voisi joku vähäsen avittaa.
Tuota pääohjelmaahan ei tarvinnut tehdä, joten saat varmasti paremman opettajaltasi. Sillä pystyt varmasti myös testaamaan ohjelmaasi paremmin. Tuo lähettämäsi lähdekoodi ei nimittäin varmuudella käänny, koska riveiltä 62 ja 65 puuttuvat lainausmerkit.
Asiakastili luokasta ei luoda uutta oliota, joten haluttu toiminallisuuskaan ei toimi. Luultavasti asiakastili kannattaa ainakin aluksi kirjoittaa omaan tiedostoonsa ja liittää sieltä se pääohjelmaan.
Noin muutoin kotitehtävät pitäisi varmasti ohjelmoida itse. Tässä ei ole mitään erityisen vaikeaa, mutta jos jokin osa tuottaa myöhemmin hankaluuksia, niin kysy uudestaan.
Funktiossa VertaaTiliNumero on kriittinen yhden merkin virhe – löydätkö sen? Funktion toteutus noin lisämuuttujalla on näyttää kömpelöltä vaikka toimiikin; yleensä tehtäisiin if-lauseen sisälle return tai suoraan return vaikka ?:-rakenteella (tai pelkkä return ja vertailu, koska vertailun tulos muuttuu automaattisesti oikein luvuksi 1 tai 0). Lisäksi funktion nimi ei vastaa tehtävänantoa, jossa lukee VertaaTiliNro.
Pääohjelmaa sinulta ei pyydetty, vaan tehtävän palautuksessa kuuluu olla vain luokka. Jos kuitenkin haluat tehdä toimivan pääohjelman, sinun pitää selvästikin rakentaa se eri tavalla: Ensiksi pitäisi olla silmukka kaiken ympärillä. Valinnan jälkeen pitäisi tarvittaessa lopettaa silmukka. Muuten valinnan jälkeen pitäisi pyytää tilinumero ja hakea sen perusteella oikea asiakas tietokannasta (joka voisi olla vaikka taulukko) ja kutsua kyseisestä Asiakastili-oliosta oikeaa funktiota.
Terveisiä tehtävän keksijälle: Suunnittelun kannalta sekä luokka että sen säilytys taulukossa ovat katastrofaalisen huonoja. Luokassa ei pitäisi olla funktiota LisaaAsiakas vaan järkevä muodostin (konstruktori). Erillinen funktio int-tyyppisen tilinumeron vertailuun on ihan pöljä. Taulukon tilalle sopisi paremmin std::unordered_map.
Kiitos avustuksestanne!
Korjattu koodini
int Asiakastili::VertaaTiliNro(int numero) { int numero; if (numero == tilinumero) { return 1; } else { return 0; } }
Eli jos oikein ymmärsin myös vaihtoehtona olisi kirjoittaa näin?;
int Asiakastili::VertaaTiliNro(int numero){ return numero == tilinumero ? numero : tilinumero;
Korjatussa koodissasi on vikana, että määrittelet funktion sisällä uuden numero-nimisen muuttujan (jolle et edes aseta arvoa), jolloin et pysty enää käyttämään numero-nimistä parametria.
Jälkimmäisessä koodissa taas palauttaisit luvun jommastakummasta muuttujasta, kun pitäisi palauttaa ykkönen tai nolla.
Kiitos avusta ongelma ratkesi!
Aihe on jo aika vanha, joten et voi enää vastata siihen.