650 likes | 776 Views
Razredi kot strukture - primer aplikacije bančni račun. Milan Ojsteršek. Primer: uporaba struktur in razredov.
E N D
Razredi kot strukture - primer aplikacije bančni račun Milan Ojsteršek
Primer: uporaba struktur in razredov Program vodi evidenco o bančnih računih komintentov banke.Za vsak račun imamo podane dvige in vloge, številko računa ter ime in priimek komintenta. O vsakem dvigu in vlogi imamo podan datum dviga in znesek. Program lahko vnaša in izpisuje osnovne podatke o varčevalcih in transakcije (dvige in vloge). Program naj javlja, če transakcija ni mogoča. Transakcija ni mogoča, če vpišemo številko računa, ki ne obstaja ali če hočemo izvesti dvig denarja pa nimamo dovolj na računu. Program naj tudi sortira varčevalce glede na vsoto privarčevanega denarja.
Uporaba struktur in razredov – podatki – določi samostalnike Program vodi evidenco o bančnih računih komintentov banke. Za vsak račun imamo podane dvige in vloge, številko računa ter ime in priimek komintenta. O vsakem dvigu in vlogi imamo podan datum dviga in znesek. Program lahko vnaša in izpisuje osnovne podatke o varčevalcih in transakcije (dvige in vloge). Program naj javlja, če transakcija ni mogoča. Transakcija ni mogoča, če vpišemo številko računa, ki ne obstaja ali če hočemo izvesti dvig denarja pa nimamo dovolj na računu. Program naj tudi sortira varčevalce glede na vsoto privarčevanega denarja.
Podatkovne strukture Število bančnih računov Bančni računi Bančni račun Število transakcij Transakcije Ime in priimek Številka računa Datum Znesek Tip transakcije
Konstante const najv_stev_transakcij = 10; // najvecje stevilo transakcij const najv_stev_rac = 10; // najvecje stevilo bancnih racunov const najv_dol_niza = 16; // najvecja dolzina niza enum tip_transakcije {vloga, dvig}; // tip transakcije
Podatkovna struktura za transakcijo struct transakcija { tip_transakcije tip_tr; char datum[najv_dol_niza]; float znesek; };
Podatkovna struktura za bančni račun struct Bancni_racun { char ime[najv_dol_niza]; char priimek[najv_dol_niza]; char stevilka_racuna[najv_dol_niza]; int stevilo_transakcij; transakcija trans[najv_stev_transakcij]; float vsota_na_racunu; };
Podatkovna struktura za bančne račune struct Bancni_racuni { Bancni_racun racun[najv_stev_rac]; int stev_komintentov; };
Uporaba struktur in razredov – metode – določi glagole Program vodi evidenco o bančnih računih komintentov banke. Za vsak račun imamo podane dvige in vloge, številko računa ter ime in priimek komintenta. O vsakem dvigu in vlogi imamo podan datum dviga in znesek. Program lahko vnaša in izpisuje osnovne podatke o varčevalcih in transakcije (dvige in vloge). Program naj javlja, če transakcija ni mogoča. Transakcija ni mogoča, če vpišemo številko računa, ki ne obstaja ali če hočemo izvesti dvig denarja pa nimamo dovolj na računu. Program naj tudi sortira varčevalce glede na vsoto privarčevanega denarja.
Struktura programa Evidenca o bančnih računih Vnesi komintente Izvajaj transakcije Sortiraj komintente Izpiši podatke o komintentih Izpiši podatke o komintentu Vnesi komintenta Izpiši transakcije komintenta
Funkcija za primerjavo dveh nizov Funkcija primerja dva niza in da kot izhod 1, ce sta niza enaka, v nasprotnem primeru da kot izhod vrednost 0. int primerjaj_niza(const char *n1, // VHOD: prvi niz znakov const char *n2) // VHOD drugi niz znakov { for ( ; *n1 != '\0' && *n2 != '\0'; n1++, n2++) if (*n1 != *n2) return 0; return 1; } // konec primerjaj_niza
Iskanje komintenta Funkcija vrne vrednost indeksa komintenta, če obstaja komintent, ki ima takšno številko računa, drugače vrne vrednost -1. int iskanje_komintentov(Bancni_racuni& racuni, // VHOD: vsi komintenti char* iskani_racun) // VHOD: stevilka racuna, // ki ga iscemo { int i=0; while (i<=racuni.stev_komintentov-1) { if (primerjaj_niza(racuni.racun[i].stevilka_racuna,iskani_racun)) return i; // vrne indeks komintenta (indeks polja) else i++; } // konec while return -1; // iskanje je bilo neuspesno, zato vrne vrednost -1 } // konec iskanje_komintentov
VNAŠANJE KOMINTENTOV Vnesi število komintentov FOR (I=1; I<= Število komintentov; I++) Vnesi podatke o komintentu Preveri, če takšen komintent že obstaja v bazi IF komintent ne obstaja Vnesi komintenta ELSE Izpiši, da takšen komintent že obstaja
VNOS KOMINTENTOV: void vnos_komintentov(Bancni_racuni& racuni) { int vn_st_kom; // stevilo komintentov, ki jih bomo vnesli Bancni_racun rac; // novi komintent int index; // indeks komintenta // vnos stevila novih komintentov cout << "Koliko komintentov zelis vnesti:"; cin >> vn_st_kom; // vnos novih komintentov for (int i=1; i<= vn_st_kom; i++) { // vnos komintenta cout << "Vnesi ime osebe, ki zeli odpreti racun:"; cin >> rac.ime; cout << "Vnesi priimek osebe, ki zeli odpreti racun:"; cin >> rac.priimek; cout << "Vnesi stevilko racuna:"; cin >> rac.stevilka_racuna;
VNOS KOMINTENTOV - NADALJEVANJE: // preverjanje, ce taksen komintent ze obstaja index=iskanje_komintentov(racuni,rac.stevilka_racuna); if (index ==-1) // ce taksnega komintenta nismo nasli { racuni.racun[racuni.stev_komintentov] = rac; racuni.racun[racuni.stev_komintentov].vsota_na_racunu=0; racuni.racun[racuni.stev_komintentov].stevilo_transakcij=0; racuni.stev_komintentov +=1; } else cout << " Taksen komintent je ze v seznamu varcevalcev" << endl; } // konec for } // konec vnos_komintentov
IZPIS KOMINTENTOV IF nismo vnesli nobenega komintenta končaj z izpisom komintentov Izpiši glavo izpisa FOR (I=1; I<=Število komintentov; I++) Izpis osnovnih podatkov o komintentu
IZPIS KOMINTENTOV: // Funkcija izpise osnovne podatke o komintentih (ime, priimek, stevilko racuna in vsoto // denarja na racunu. void izpis_komintentov(Bancni_racuni& racuni) { // ce nimamo vnesenega se nobenega komintenta if (racuni.stev_komintentov==0) { cout << "Vnesli nismo se nobenega komintenta" << endl; return; } // izpis glave cout << setw(15) << "Ime" << setw(15) << "Priimek" << setw(20) << "Stevilka racuna" << setw(20) << "Vsota na racunu" << endl;
IZPIS KOMINTENTOV - NADALJEVANJE // izpis osnovnih podatkov o komintentih for (int i=0; i<=racuni.stev_komintentov-1; i++) { cout << setw(15) << racuni.racun[i].ime; cout << setw(15) << racuni.racun[i].priimek; cout << setw(20) << racuni.racun[i].stevilka_racuna; cout << setw(20) << racuni.racun[i].vsota_na_racunu << endl; } } // konec izpis_komintentov
ZAMENJAVA DVEH KOMINTENTOV Funkcija zamenja dva komintenta v polju bančnih računov void zamenjaj_komintenta (Bancni_racun& racun, // VHOD-IZHOD: element polja racunov Bancni_racun& racun1) // VHOD-IZHOD: element polja racunov { Bancni_racun vmesni; // vmesni bancni racun, ki nam sluzi za // zamenjavo komintetov vmesni=racun; racun=racun1; racun1=vmesni; } // konec zamenjaj_komintenta
Iskanje komintenta z največjo vsoto na računu Funkcija vrne indeks bančnega računa komintenta z največjo vsoto na računu. Takšnega komintenta išče v območju med začetnim in končnim indeksom polja.
ISKANJE KOMINTENTA Z NAJVEČJO VSOTO NA RAČUNU int najvecji(Bancni_racuni& racuni, // VHOD: bancni racuni komintentov int zacetni_indeks, // VHOD: zacetni indeks polja int koncni_indeks) // VHOD: koncni indeks polja { int max; // indeks elementa polja, ki predstavlja racun z najvecjo // vsoto na racunu int i; // stevec racunov max = zacetni_indeks; for (i=zacetni_indeks+1; i<=koncni_indeks; i++) if (racuni.racun[i].vsota_na_racunu>racuni.racun[max].vsota_na_racunu) max=i; return max; } // konec najvecji
Sortiranje komintentov glede na vsoto na računu for (i=0; i<=število komintentov -2; i++) Poišči največjega med i-tim in številom komintentov if največji ni na i-tem mestu Zamenjaj komintenta z indeksom največji in indeksom i
SORTIRANJE KOMINTENTOV GLEDE NA VSOTO NA RAČUNU void sortiranje_komintentov (Bancni_racuni& racuni) // VHOD-IZHOD: bancni racuni komintentov { int max; // indeks bancnega racuna, ki vsebuje najvecjo vsoto // denarja na racunu int i; // stevec racunov for (i=0; i<=racuni.stev_komintentov-2; i++) { // poisci najvecje med i in stev_komintentov komintenti max=najvecji(racuni,i,racuni.stev_komintentov-1); if (max !=i) // ce najvecji ni na i-tem mestu zamenjaj oba racuna zamenjaj_komintenta(racuni.racun[i],racuni.racun[max]); } // konec for }
Vnašanje transakcij Funkcija vnaša transakcije (dvige, vloge). Javlja, če komintent s to številko računa ne obstaja ali če ni možno izvesti dviga, ker je vsota na računu manjša od velikosti dviga.
Vnašanje transakcij Vnesi številko računa komintenta Poišči komintenta IF komintent obstaja DO Vnesi podatke o transakciji IF transakcija je DVIG IF vsota na računu po transakciji večja od 0 izvedi transakcijo ELSE javi, da transakcije ne moreš izvesti ELSE izvedi transakcijo WHILE želiš izvajati transakcije
VNAŠANJE TRANSAKCIJ . void vnos_transakcij(Bancni_racuni& racuni) // VHOD-IZHOD: racuni komintentov { char odgovor; // za ugotavljanje ali zelimo izvajati novo transakcijo char iskani_racun[najv_dol_niza]; // za ugotavljanje ali taksen racun // obstaja med bancnimi racuni int index; // indeks komintenta int tr; // tip transakcije float vrednost_tr; // vrednost transakcije float na_racunu; // koliko bo na bancnem racunu po // transakciji Bancni_racun racun; // bancni racun komintenta
do { // preverjanje ali bancni racun z vneseno stevilko racuna obstaja cout << "Vnesi stevilko racuna:"; cin >> iskani_racun; index=iskanje_komintentov(racuni,iskani_racun); if (index !=-1) // bancni racun z vneseno stevilko obstaja { racun=racuni.racun[index]; // vnos tipa transakcije do { cout << "Vnesi transakcijo 1 - dvig, 2 - vloga:"; cin >> tr; } while ((tr <= 0)|| (tr >2));
// vnos vrednosti transakcije cout << "Vnesi vrednost transakcije:"; cin >> vrednost_tr; if (tr==1) // ce je transakcija dvig { na_racunu=racun.vsota_na_racunu-vrednost_tr; if (na_racunu < 0) // ce je po transakciji na racunu skupna vsota // manjsa od 0 cout << "Transakcija ni mogoca" << endl; else // ce je po transakciji na racunu skupna vsota vecja od 0 { racun.vsota_na_racunu=na_racunu; racun.trans[racun.stevilo_transakcij].znesek=vrednost_tr; cout << "Vnesi datum transakcije:"; cin >> racun.trans[racun.stevilo_transakcij].datum; racun.trans[racun.stevilo_transakcij].tip_tr=dvig; racun.stevilo_transakcij+=1; racuni.racun[index]=racun; } // konec else } // konec if (tr==1)
else // ce je transakcija dvig { racun.trans[racun.stevilo_transakcij].znesek=vrednost_tr; racun.vsota_na_racunu+= racun.trans[racun.stevilo_transakcij].znesek; cout << "Vnesi datum transakcije:"; cin >> racun.trans[racun.stevilo_transakcij].datum; racun.trans[racun.stevilo_transakcij].tip_tr=vloga; racun.stevilo_transakcij+=1; racuni.racun[index]=racun; } // konec else } // konec if (index !=-1) else // ce komintenta s taksno stevilko bancnega tacuna nimamo cout << " Taksnega komintenta ni v seznamu varcevalcev" << endl; // vnos ali zelimo izvajati novo transakcijo ali ne (d,n) do { cout << "Ali zelis novo transakcijo - vpisi d ali n:"; cin >> odgovor; } while ((odgovor !='d') && (odgovor !='n') && (odgovor !='D') && (odgovor !='N')); } while ((odgovor =='d') || (odgovor =='D')); } // konec vnos_transakcij
Izpis transakcij komintenta DO Vnesi številko računa komintenta Poišči komintenta IF komintent obstaja izpiši osnovne podatke o komintentu IF število transakcij komintenta večje od 0 izpiši glavo za transakcije FOR transakcije komintenta izpiši transakcijo komintenta WHILE želiš izpisovati podatke o komintentih
void izpis_transakcij(Bancni_racuni& racuni // VHOD racuni komintentov { char odgovor; // za ugotavljanje ali zelimo izpis transakcij za // se enega komintenta char iskani_racun[najv_dol_niza]; // za iskanje komintenta z vneseno // stevilko racuna int index; // indeks racuna komintenta, ki ga // bomo izpisali Bancni_racun racun; // racun komintenta, ki ga bomo izpisali int tr; // stevec transakcij do { // vnos in iskanje racuna, ki ga bomo izpisali cout << "Vnesi stevilko racuna:"; cin >> iskani_racun;
Index=iskanje_komintentov(racuni,iskani_racun); if (index !=-1) // ce smo komintenta s tako stevilko racuna nasli { // izpis osnovnih podatkov o komintentu racun=racuni.racun[index]; cout << "Komintent: " << racun.ime << setw(15) << racun.priimek << endl << "Skupna vsota na racunu je:" << racun.vsota_na_racunu << endl; cout << "Komintent je izvedel naslednje transakcije:" << endl;
// izpis transakcij komintenta if (racun.stevilo_transakcij !=0) cout << "Tip transakcije Datum Znesek" << endl; for (tr=0; tr<=racun.stevilo_transakcij-1; tr++) { if (racun.trans[tr].tip_tr==dvig) cout << setw(10) << "dvig"; else cout << setw(10) << "vloga"; cout << setw(15) << racun.trans[tr].datum << setw(15) << racun.trans[tr].znesek << endl; } // konec for } // konec if index != -1 else // ce komintenta s taksno stevilko racuna ni na seznamu cout << " Taksnega komintenta ni v seznamu varcevalcev" << endl; // vpis ali zelimo izpis podatkov za drugega komintenta
do { cout << "Ali zelis izpis transakcij se za kakega komintenta:"; cin >> odgovor; } while ((odgovor !='d') && (odgovor !='n') && (odgovor !='D') && (odgovor !='N')); } while ((odgovor =='d') || (odgovor =='D')); } // konec izpis_transakcij
// funkcija izpise glavni menu void izpis_menuja() { cout << "Vpisi:" << endl; cout << "1 - za vnos osnovnih podatkov o komintentih" << endl; cout << "2 - za izpis osnovnih podatkov o komintentih" << endl; cout << "3 - sortiranje komintententov po visini denarja na racunu" << endl; cout << "4 - za vnos transakcij" << endl; cout << "5 - za izpis vseh podatkov o posameznih komintentih" << endl; } // izpis_menuja
int main() { int izbira; // izbira klica podprograma iz menija char odgovor; // ali zelimo se izvajati program (d,n) Bancni_racuni racuni; // racuni komintentov // inicializacija stevila racunov na vrednost 0 (nimamo se // nobenega komintenta racuni.stev_komintentov=0;
do { // izpis menija in izbor podprograma, ki ga zelimo uporabiti izpis_menuja(); do { cin >> izbira; if ((izbira <= 0)|| (izbira >5)) { cout << "Nisi vnesel prave stevilke" << endl; izpis_menuja(); } } while ((izbira <= 0)|| (izbira >5));
// klici podprogramov glavnega programa na podlagi izbire iz menija switch (izbira) { case 1: vnos_komintentov(racuni); break; case 2: izpis_komintentov(racuni); break; case 3: sortiranje_komintentov(racuni); break; case 4: vnos_transakcij(racuni); break; case 5: izpis_transakcij(racuni); break; }
do { cout << "Ali zelis se izvajati program - vpisi d ali n:"; cin >> odgovor; cout << odgovor << endl; } while ((odgovor !='d')&& (odgovor !='n') && (odgovor !='D')&& (odgovor !='N')); } while ((odgovor =='d') || (odgovor =='D')); return 0; }
Reševanje istega primera objektno Definicija konstant in enostavnih tipov: const max_niz = 16; // največja dolžina niza const max_trans = 10;// največje število transakcij const max_rac = 10;// največje število bančnih računov in naštevalni tip: enum tip_transakcije {vloga, dvig}; // tip transakcije
Definicija transakcije class Transakcija { public: Transakcija() {}; Transakcija(tip_transakcije tip, char dat[], float zne); void Izpisi_Transakcijo(); float VrniZnesek() { return znesek; }; private: tip_transakcije tip_tr; char datum[max_niz]; float znesek; };
Konstruktor za transakcijo Transakcija :: Transakcija(tip_transakcije tip, char dat[], float zne) { tip_tr = tip; for (int i=0; i<max_niz; i++) datum[i] = dat[i]; znesek = zne; }
Izpis transakcije void Transakcija :: Izpisi_Transakcijo() { if (tip_tr==dvig) cout << setw(35) << "Dvig"; else cout << setw(35) << "Vloga"; cout << setw(22) << datum << setw(15) << znesek << endl; }
Bančni račun class Bancni_Racun { public: Bancni_Racun() {}; Bancni_Racun(char im[], char pr[], int st_r); void Izpisi_Varcevalca(); void Vnesi_Transakcijo(); void Izpisi_Transakcije(); void Izpisi_Varcevalca_Komplet(); int VrniStevRac() { return stevilka_racuna; }; float VrniVsoto() { return vsota_na_racunu; }; private: char ime[max_niz]; char priimek[max_niz]; int stevilka_racuna; int stevilo_transakcij; Transakcija trans[max_trans]; float vsota_na_racunu; };
Konstruktor za bančni račun Bancni_Racun :: Bancni_Racun(char im[], char pr[], int st_r) { int i; for (i=0; i<max_niz; i++) ime[i] = im[i]; for (i=0; i<max_niz; i++) priimek[i] = pr[i]; stevilka_racuna = st_r; stevilo_transakcij = 0; vsota_na_racunu = 0.0; }
Vnesi varčevalca void Bancni_Racun :: Izpisi_Varcevalca() { cout << setw(15) << ime; cout << setw(15) << priimek; cout << setw(20) << stevilka_racuna; cout << setw(20) << vsota_na_racunu << endl; }
Vnašanje transakcij varčevalca void Bancni_Racun :: Vnesi_Transakcijo() { if (stevilo_transakcij == max_trans) //preverjamo ali je ze dosezeno//maks. stev. transakcij { cout << " Najvecje stevilo transakcij je ze dosezeno..."; return; } int tip; float znesek; char datum[max_niz]; tip_transakcije tip_t;
cout << "Vnesi transakcijo 1 - dvig, 2 - vloga: "; cin >> tip; if (tip==1) // če je tip transakcije dvig tip_t = dvig; else // če je tip transakcije vloga tip_t = vloga; cout << "Vnesi znesek transakcije: "; cin >> znesek; if ((tip==1) && (vsota_na_racunu - znesek < 0)) //preverjamo ali je prišlo do prekoračitve (minusa) { cout << endl << " Varcevalec ne more dvigniti toliko denarja."; return; } cout << "Vnesi datum transakcije: "; cin >> datum;
Transakcija tran(tip_t,datum,znesek); //klic prired. konstruktorja trans[stevilo_transakcij] = tran; if (tip==1)// vsoto na racuno povecamo ali zmanjsamo vsota_na_racunu -= trans[stevilo_transakcij].VrniZnesek(); else vsota_na_racunu += trans[stevilo_transakcij].VrniZnesek(); stevilo_transakcij++;//stevilo transakcij se poveca za ena }
Izpis transakcij bančnega računa void Bancni_Racun :: Izpisi_Transakcije() { cout << endl; cout << setw(35) << "Tip transakcije" << setw(22) << "Datum" << setw(15) << "Znesek" << endl; for (int i=0; i<stevilo_transakcij; i++) { trans[i].Izpisi_Transakcijo(); } }