184
LoVe dOts... ForEver... Autor: Murtic Nirmel ETF - 2005/2006 www.etf.ba Email: [email protected] ; MSN: [email protected] PROGRAMIRANJE U PROGRAMSKIM JEZICIMA „C“ & „C++“ ZBIRKA ZADATAKA DOTS (101 zadatak) Verzija: Final (The_LNe_LOVE) - tHrEE dOts ... - FoUr dOts .... - FiVe dOts ..... - SiX dOts ...... - SeVen dOts ....... ... love dOts ... the number of dots isn't important ... dOts forever ... AUTOR: Murtic Nirmel Email: [email protected]

Skripta Zadataka c++

Embed Size (px)

Citation preview

Page 1: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

PROGRAMIRANJE UPROGRAMSKIM JEZICIMA

„C“ & „C++“ZBIRKA ZADATAKA

DOTS(101 zadatak)

Verzija: Final (The_LNe_LOVE)

- tHrEE dOts ...- FoUr dOts ....- FiVe dOts .....- SiX dOts ......- SeVen dOts .......

... love dOts ...the number of dots isn't important

... dOts forever ...

AUTOR: Murtic NirmelEmail: [email protected]

Page 2: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

... Sadrzaj ...Napomena ...... ...... ...... ...... 3Uvod ... ...... ...... ...... ...... 4Zadaci iz C-a... ...... ...... ...... 5Zadaci iz Cpp-a. ...... ...... ...... 62

Page 3: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

... Napomena ...Cilj skripte nije omogucavanje studentima daiste zadatke prepišu, vec da na osnovu ovihrješenja napišu neka svoja.Skriptu mozete preuzeti sa web stranice:http://www.etf.baSkripta ce biti nadopunjavana, nece stati naovome! A obnovljenu verziju skripte cete mocipreuzeti sa stranice vec navedene.Rješenja su provjerena i rade u Dev Cpp-u,ukoliko ipak neki od programa ne radi, prvoprovjerite dobro da niste neki dio zaboravilikopirati. Neki znakovi nakon sto se prebace updf nisu isti, ako ipak postoji greska, javitemi na mail ili msn, da ispravim.Sretno sa programiranjem...... do rješenja se moze doci na 1000...nacina... vama treba samo jedno rješenje, bilokoje... a zeli se najbolje, najbrze inajkrace... jedno je zelja... drugo sumogucnosti...... ako vam baš i neide najbolje... zapamtite...nijedan program nije vrijedan vaših zivaca...Za štetu nastalu korištenjem programa, autorskripte ne odgovara :)

Page 4: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

... Uvod ...Cilj ove skripte je da prikaze primjenu programskog jezika C &C++ na zadacima. Podrazumjeva se da ste prije „proucavanja“ oveskripte savladali sintaksu C-a. Dva glavna „problema“ koji sejavljaju kroz programiranje su:

- sintaksa programskog jezika;- logika programa (daleko veci problem).

Savladati sintaksu i nije neki problem, mnogo veci problem jenauciti razmisljati programerski. Jedno ide uz drugo, nemoze seprogramirati ako neznamo sintaksu, a ne vrijedi nam ni sintaksaako nemozemo „skontati“ kako da dodjemo do rjesenja.

Medjutim, iz dana u dan „izlaze“ novi programski jezici, novesintakse, i sintaksa nekog starijeg programskog jezika nam nemozemnogo pomoci. Znaci mnogo vise se treba osvrnuti da se savladaovaj drugi problem, jer ako znamo rijesiti program u jednomprogramskom jeziku, to mozemo uraditi u svakom (uz kratkoproucavanje sintakse).

Stoga ovdje mozete naci samo rjesene i objasnjene zadatke, kao ineke metode koje su prakticne za primjenjivanje u programima, aza sintaksu, pronadjite neku drugu litereturu ;).

Page 5: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

... Zadaci iz C-a ...

Page 6: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

1. Napraviti program koji ucitava koordinate dvije tacke utrodimenzionalnom prostoru:Tacke t

1i t

2su definirane kao trojke:

- t1=(x1, y1, z1) ,- t2=(x2, y2, z2).

Kao izlaz program daje udaljenost izmedju tih tacki.

NAPOMENA: Za drugi korijen koristiti funkciju sqrt() koja jedefinirana u datoteci math.h. Na primjer, naredba a=sqrt(9); ceizracunati drugi korijen iz 9 i pridruziti izracunatu vrijednostvarijabli a.

RJEŠENJE:// Ukljucujemo datoteke u kojima se nalaze funkcije koje cemo koristiti.# include <stdio.h># include <math.h>// Definisanje glavne funkcije main()int main () {// Definisanje potrebnih varijabli

float x1,y1,z1,x2,y2,z2,d;// Unos kordinata x1,y1,z1 (printf - ispis poruke; scanf - unos varijabli) printf("Unesi tacku a(x1,y1,z1): "); scanf("%f,%f,%f", &x1, &y1, &z1);// Unos kordinata x2,y2,z2 printf("Unesi tacku b(x2,y2,z2): "); scanf("%f,%f,%f", &x2, &y2, &z2);// Racunanje udaljenosti po formuli (sqrt - funkcija koja racuna drugi korjen) d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));// Ispis udaljenosti d printf("Udaljenost izmedju tacki a i b je: %f", d);// Kraj programa (getch() - stavljamo da bi zadrzali poruku u kojoj je// rezultat. U suprotnom nam se nece prikazati poruka na ekranu, iako je// program uspjesno izvrsen getch();// Return 0; - (umjesto 0 mozemo staviti bilo koji cio broj, jednostavno// nekako je potrebno zavrsiti funkciju main() pa se obicno stavlja return 0; return 0;}

Page 7: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

2. Napravite C-program koji ucitava potrošnju elektricneenergije u KWh (velika tarifa(VT) i mala tarifa(MT)) ipripadajuce cijene po KWh (cijena za malu tarifu i cijena zaveliku tarifu).Kao izlaz program daje:

- ukupnu potrošnju u KWh;- novcani iznos racuna;- udio velike tarife i male tarife u ukupnoj potrošnji.

Na primjer, izlaz iz programa treba biti sljedeceg formata:Ukupna potrosnja je 234.25 KWh.Udio velike tarife u ukupnoj potrosnji je 25 %.Udio male tarife u ukupnoj potrosnji je 75%.Iznos racuna je 25.45 KM.RJEŠENJE:# include <stdio.h>int main () {// Definisanje potrebnih varijabli float VT,MT,CV,CM,UKUPNO,RACUN,UDIOM,UDIOV;// Unos male tarife, velike tarife, cijene male tarife i cijene velike tarife printf("\n Unesi potrosnju po velikoj tarifi (KWh): "); scanf("%f", &VT); printf("\n Unesi potrosnju po maloj tarifi (KWh): "); scanf("%f", &MT); printf("\n Cijena za veliku tarifu po jednom Kwh: "); scanf("%f", &CV); printf("\n Cijena za malu tarifu po jednom Kwh: "); scanf("%f", &CM);// Racunanje ukupne potrosnje UKUPNO=VT+MT;// Racunanje cijene ukupne potrosnje (cijena po maloj tarifi + cijena po// velikoj tarifi) RACUN=VT*CV+MT*CM;// Izracunava udio velike i male tarife u ukupnoj potrosnji (procenat) UDIOM=(MT/UKUPNO)*100; UDIOV=(VT/UKUPNO)*100;// Ispis rezultata printf ("\n Ukupna potrosnja elektricne energije je: %.f KWh", UKUPNO); printf ("\n Ukupna cijena elektricne energije je: %.f KM", RACUN); printf ("\n Udio velike tarife u potrosnji je: %.f procenata", UDIOV); printf ("\n Udio male tarife u potrosnji je: %.f procenata", UDIOM);// Kraj programa getch();

return 0;}

Page 8: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

3. Napisati program koji ce izracunati presjek skupova S1 i S2.Skupovi S1 i S2 definirani su intervalima realnih brojeva:

S1=[A, B]S2=[C, D].

Na primjer, za slijedeci ulaz: A=3, B=9, C=7, D=11program kao izlaz treba dati:

Rezultantni interval je REZ=[7, 9].RJEŠENJE:#include <stdio.h>main() {// Definisanje varijablifloat A,B,C,D,MAX,MIN;// Unos skupovaprintf("\n Unesi prvi skup X[A,B] A>B: ");scanf("%f,%f", &A,&B);printf("\n Unesi drugi skup Y[C,D] C>D: ");scanf("%f,%f", &C,&D);

/* Logika zadatka je sljedeca: Prvo moramo pretpostaviti da je prvi brojintervala veci ili jednak drugom, A>=B i C>=D, jer ako ovo ne vrijedi intervalnije matematicki ispravan (taj uslov nismo ispitivali da nebi komplikovalizadatak). Presjek skupa ce biti neki interval [MIN,MAX].Uslov da zadatak ima RJEŠENJE je da je B < C kao i D < A sto je i logicno jeru suprotnom presjeka nema!Broj MIN je ustvari jedan od brojeva A ili C (manji broj od ova 2 broja),a MAX je manji broj od brojeva B i D. Ako je A=C ili B=D uzima se vrijednostpod ELSE ali tada nam je svakako svejedno koja ce se uzeti vrijednost kao MINili MAX jer je tada A=C odnosno B=D */

if (A>C) MAX=A; else MAX=C;if (B<D) MIN=B; else MIN=D;if ((B<C)||(A>D)) printf("\n Nema presjeka!"); else {printf ("\n Presjek je: [%.f,%.f]", MAX, MIN); }// Kraj programagetch();return 0;}

Page 9: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

4. Napisati program koji ucitava koeficijente a, b i c realnogtipa. Ti koeficijenti definiraju funkciju f(x):f(x)=ax

2+bx+c

Program zatim provjerava da li su ti keficijenti u rasponu -10 do10. Ako nisu, program ispisuje poruku:Koeficijenti a, b i c nisu u zadanom rasponu.Ako koeficijenti a, b i c jesu u zadanom rasponu, program kaoizlaz daje vrijednost prve derivacije u tacki x. Tacka x setakodjer unosi sa standardnog ulaza.Na primjer, ako je ulaz a=1, b=2, c=1, x=1 program kao izlazdaje: Prva derivacija u tacki x=1 je 4.RJEŠENJE:# include <stdio.h>int main () {// Definisanje varijablifloat a,b,c,x,izvod;// Unos koeficijenata a,b,cprintf ("Unesi koef. (a,b,c) funkcije f(x)=ax2+bx+c (-10<(a,b,c)<10):");scanf("%f,%f,%f", &a,&b,&c);// Unos vrijednosti xprintf ("Unesi vrijednost x");scanf("%f", &x);// Ispit uslovaif (a>-10&&a<10&&b>-10&&b<10&&c>-10&&c<10){// Izracunavanje izvoda po odredjenoj matematickoj formuliizvod=2*a*x+b;// Ispis izvodaprintf("Prva derivacija u tacki x=%.f je %.f", x, izvod);// Ispis odgovarajuce poruke ukoliko uslov nije zadovoljen} else printf ("Koeficijenti nisu iz odgovarajuceg intervala!");// Kraj programagetch();return 0;}

Page 10: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

5. Napisati program koji ucitava tri cijela broja iz intervalaod 50 do 200. Ako svi uneseni brojevi nisu iz tog intervala,program treba ispisati poruku "Svi brojevi nisu iz intervala 50do 200” i završiti program. Ako su brojevi unutar tog intervalaprogram treba ispisati ucitane brojeve po velicini od najmanjegprema najvecem.

RJEŠENJE:#include <stdio.h>main() {// Definisanje varijabliint x[3], i, j, p;// Unos brojevaprintf("\n Unesi tri broja u rasponu od 50 do 200 (U formatu: a, b, c): ");scanf("%d, %d, %d", &x[0], &x[1], &x[2]);// Provjera jesu li brojevi iz odgovarajuceg intervala

if (x[0]>50&&x[1]>50&&x[2]>50&&x[0]<200&&x[1]<200&&x[2]<200) {/* Sortiranje brojevaPotrebne su nam dvije for petlje koje ce „listati“ brojeve koji se nalaze unekom nizu. Ovaj tip sortiranja se uglavnom svodi na provjeru da li je prvibroj manji od drugog ili treceg, i ako jeste, onda mijenja mjesto sa timbrojem. Medjutim nakon ovoga nije zavrseno sortiranje. Ako npr. Unesemobrojeve 3, 2, 1, nakon prvog prolaska imamo 2, 3, 1 nakon drugog 2, 1, 3 alijos uvijek nije zavrseno sortiranje, i zbog toga i postoji prva for petljakoja ce to ponoviti jos jednom i dobivamo 1, 2, 3 i niz je sortiran, i sada gasamo jos treba ispisati na ekran. */

for (i=0;i<2;i++)for (j=0;j<2;j++)

if (x[j]>x[i]) {p=x[i];x[i]=x[j];x[j]=p;

}// Ispis sortiranih brojeva

printf("\n Sortirani brojevi: %d, %d, %d ", x[0], x[1], x[2]);// Ako brojevi nisu iz intervala, ispis odgovarajuce poruke

} else { printf("\n Svi brojevi nisu iz intervala 50 do 200!!!");}// Kraj programagetch();return 0;}

Page 11: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

6. Napisati program koji ce ispisati brojeve djeljive sa 5, 7ili 11, a manje ili jednake od nekog ucitanog broja n satastature. Brojeve treba ispisati od najveceg prema najmanjem.Obavezno koristiti for petlju. Na primjer, ako je korisnik za nunio broj 20 onda program treba ispisati:201514111075RJEŠENJE:#include <stdio.h>int main(){// Definisanje varijabliint n, i;// Unos nekog prirodnog brojaprintf("Unesite broj: ");scanf("%d", &n);/* For petlja postavlja brojac „i“ na vrijednost unesenog broja, i provjeravase da li je taj broj djeljiv sa 5, 7 ili 11, i ako jeste printa ga na ekran iumanjuje brojac za jedan, ako broj nije djeljiv sa ovim brojevima, onda sesamo brojac umanji na kraju for petlje bez printanja broja na ekranu. Isti sepostupak ponavlja i za broj manji za jedan, kao i broj manji za dva... svetako do broja 1 (mogli smo staviti i 4 jer brojevi ispod 5 svakako nisudjeljivi sa ovim brojevima! */for(i=n;i>0;i--){

if ((i % 5 == 0)||(i % 7 == 0)||(i % 11 == 0)) printf("\n Broj: %d", i);}// Kraj programagetch();return 0;}

Page 12: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

7. Napisati program koji ce izracunavati sumu prema slijedecojformuli: suma=1-1/2+1/3-1/4+...+1/nBroj n se unosi sa tastature(standardnog ulaza). Program trebaispisati vrijednost sume na standardnom izlazu (monitoru)koristeci slijedecu poruku:Koristeci <n> clanova suma je <suma>.(Na mjestu <n> se treba nalaziti konkretno uneseni broj n, a namjestu <suma> se treba nalaziti konkretno izracunata suma.)Zadatak riješite koristeci while petlju.

RJEŠENJE:#include <stdio.h>int main(){// Definisanje varijablifloat i=1,n,suma=0;// Unos prirodnog brojaprintf ("\n Unesi broj n:");scanf("%f", &n);/* Racunanje sumeWhile petlja vrti podprogam u okviru while petlje sve dok je brojac „i“ kojije na pocetku 1, manji od unesenog broja n. Ako je uneseni broj 1 ne ulazi seu petlju i na izlazu se ispisuje Suma je:1. Ako je broj veci od 1 onda seracuna suma prema matematickoj formuli. Grupisali smo formulu datu u zadatkutako da trazimo sume po dva broja (odnosno razlike), i zatim te razlikebrojeva sabiramo, ali moramo paziti jer moramo brojac „i“ uvecati za 2 jer smou formuli ukljucili odmah 2 broja.Ovaj nacin ima i dobru i losu stranu. Dobra strana je jer nemoramo uvoditinikakvu pomocnu varijablu i citav kod za racunanje sume se sastoji od dvaizraza, a losa strana je kad unesemo neparne brojeve sto necemo dobiti tacnusumu i tako kad unesemo broj 3 program ce izracunati 1-1/2+1/3=0.5 sto nijetacno, a to smo dobili jer program nemoze grupisati clanove po 2 jer ih imamotri i zadnji ostaje sam i ne racuna se. Ali ovaj mali nedostatak mozemozanemariti jer se u ovakvim zadacima obicno unose veliki brojevi da se svesvodi na preciznost nalazenja broja 0.69 pa nam je svejedno da li je zadnjiclan uracunat ili ne, ali eto ako zelimo ipak 100% precizno uraditi, zadatakmoze se uraditi i bez grupisanja sa mijenjanjem predznaka sume, ali to uraditesami :) */while ((i<n)&&(n>1)) {suma=suma+(1/i-1/(i+1));i=i+2;}// Ispis sumeif (n>1) printf ("\n Suma je: %f", suma); else if (n=1) printf ("Suma je: 1");// Kraj programagetch();return 0;}

Page 13: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

8. Napraviti program koji sa standardnog ulaza ucitava cijelibroj m koji predstavlja redni broj mjeseca u godini, te ucitava ibroj g koji predstavlja godinu, a na monitoru ispisuje naziv togmjeseca i broj dana u tom mjesecu. Pretpostaviti da je prestupnasvaka cetvrta godina, iako je pravilo o racunanju prestupnihgodina nešto slozenije. Na primjer, ako su ulazne vrijednostim=2, g=2000 program treba ispisati:

februar, 2000. g., broj dana:29Ili ako su ulazne vrijednosti m=5, g=2005 program treba ispisati:maj, 2005. g., broj dana: 31RJEŠENJE:#include <stdio.h>main() {/* Deklarisanje varijabliDefinisanje dvodimenzionalne matrice 12 sa 9 (12 mjeseci, a broj 9 je ustvaribroj slova od kojih se sastoje mjeseci, najvise ima semptembar (9 slova). */int m,g,d,i;char mj[12][9]={{"Januar"},{"Februar"},{"Mart"},{"April"}, {"Maj"},{"Juni"},{"Juli"},{"August"},{"Septembar"}, {"Oktobar"},{"Novembar"},{"Decembar"}};// U programu se uvodi i naredba „goto“ koja „skace“ sa linije na liniju// programa.pocetak:// Unos mjeseca i godineprintf ("\n Unesi mjesec i godinu (m,g):"); scanf ("%d,%d", &m,&g);// Ako se unese 1,3,5,7,8,10 ili 12 mjesec onda ima d=31 danif ((m==1)||(m==3)||(m==5)||(m==7)||(m==8)||(m==10)||(m==12)) d=31; else// Ako se ipak unese 4,6,9 ili 11 mjesec onda ima d=30 danaif ((m==4)||(m==6)||(m==9)||(m==11)) d=30; else/* Ili ako se ipak unese mjesec 2 onda se provjerava jos i prijestupna godina(svaka godina djeljiva sa 4), i u zavisnosti da li je prijestupna ili ne d=29odnosno d=29 dana. Ako broj nije od 1 do 12 vraca se na pocetak programa*/if ((m==2)) if ((g%4==0)) d=29; else d=28; else goto pocetak;// Ispis mjeseca koji se nalazi zapisan u mj[] (m-1 jer nam je januar podbrojem 0)printf("%s , %d. g., broj dana: %d", mj[m-1], g, d);// Kraj programagetch();return 0;}

Page 14: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

9. Napisati program koji ucitava realnu matricu dimenzija 10x10te pronalazi najmanji element na glavnoj dijagonali.

RJEŠENJE:#include <stdio.h>main (){// Deklarisanje varijablifloat A[10][10], MIN;int i,j;/* Unos matrice (koristimo 2 for petlje pri unosu (i su redovi a j su kolone).Brojevi se unose po redovima.*/printf("\n Unesi matricu A[10][10]: \n");for (i=0;i<10;i++)for (j=0;j<10;j++){printf(" [%d,%d]:", i+1, j+1);scanf("%f", &A[i][j]);}/* Trazenje najmanjeg elementa na dijagonali!Postupak je sljedeci. Elementi na dijagonali su tipa [i,j] gdje su i,jjednaki. Tako dijagonalni elementi matrice 3x3 su [1,1], [2,2], [3,3]. Postonam trebaju samo elementi kada su (i,j) jednaki koristimo jednu for petlju. Napocetku stavimo da je najmanji element prvi element na poziciji [1,1], u C-uje pozicija (0,0) ustvari pozicija (1,1) u realnom svijetu. I ulazimo u forpetlju. Ispituju se redom brojevi kod kojih su brojaci „i“ i „j“ jednaki. Akoje neki od brojeva koji se ispitaju manji od MIN onda se taj broj pridruzivarijabli MIN. */MIN=A[0][0];for (i=1,j=1;i<10;i++,j++) if (A[i][j]<MIN) MIN=A[i][j];// Ispis najmanjeg broja na dijagonaliprintf("\nNajmanji element na glavnoj dijagonali je: %.f", MIN);// Kraj programagetch();return 0;}

Page 15: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

10. Napišite funkciju faktor () koja izracunava n! pri cemu jeprototip funkcije faktor (): double faktor (int n)Zatim, napisati glavni program koji ucitava neki prirodni brojn,1<n<10; a zatim izracunava n! pozivom funkcije faktor() irezultat ispisuje na standardni izlaz.

RJEŠENJE:#include <stdio.h>main (){// Deklarisanje varijabliint N;double F;// Deklarisanje prototipa funkcijedouble faktor (int n);//Unos prirodnog brojaprintf("\nUnesi prirodan broj N: ");scanf("%d", &N);/* Pozivanje funkcije faktor() i pridruzivanje vrijednosti koju funkcijaizracuna varijabli F */F=faktor(N);// Ispis faktorijeleprintf("Faktorijela od %d je: %g", N, F);// Kraj programagetch();return 0;}

/* Funkcija koja racuna vrijednost faktorijele. Funkcija prima prirodan broj Na vraca realan broj (double) kao rezultat. */double faktor (int n) {int i;double fak=1;/* Racunanje faktorijele se vrsi tako da se broj od kojeg trazimo faktorijelupomnozi sa svakim cijelim brojem manjim od sebe a koji je veci od 1. Napocetku je fak=1 jer ako bi bilo 0 dobili bi uzastopno mnozenje sa 0 i nebidobili ispravan rezultat */for (i=n;i>1;i--) fak=fak*i;// Vracanje izracunate faktorijelereturn fak;}

Page 16: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

11. Napisati program koji ucitava broj elemenata (n) nekogcjelobrojnog polja (Polje) a zatim i elemente tog polja(maksimalno 100). Program nakon toga pronalazi maksimalni elementunesenog polja i ispisuje ga na standardni izlaz.Na primjer, ako su ulazni podaci: n=4, Polje=(2,5,20,4) programce ispisati vrijednost broja 20.

RJEŠENJE:# include <stdio.h>main (){// Definisanje varijabliint n, i, niz[100], max;// Unos broja elemenataprintf("\nUnesi broj elemenata: ");scanf("%d", &n);// Unos niza od N elemenata (pomocu for petlje)for (i=0;i<n;i++){printf ("\nUnesi elemenat broj %d: ", i+1);scanf("%d", &niz[i]);}// Postavljanje vrijednosti max na vrijednost prvog clana nizamax=niz[0];/* For petlja vrti brojeve od 2 broja (prvi je ukljucen u liniju iznad) iprovjerava se da li je i-ti broj veci od max i ako jeste varijabli max sepridruzuje vrijednost tog elementa*/for (i=1;i<n;i++)if (max<niz[i]) max=niz[i];// Ispis najveceg elementa nizaprintf("Najveci element niza je: %d", max);// Kraj programagetch();return 0;}

Page 17: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

12. Napisati program koji ucitava 5 realnih elemenata dva poljaA i B a zatim izracunava elemente treceg polja C (koji takodjerima 5 elemenata) pri cemu se i-ti element polja C dobiva premaslijedecoj formuli:C[i]=2*A[i]+B[i], i=1,2,…nNa kraju program na standardni izlaz ispisuje elemente sva tripolja: A, B i C.

RJEŠENJE:# include <stdio.h>main (){// Definisanje varijablifloat A[5], B[5], C[5];int i;/* Unos elemenata prvog polja (pomocu for petlje, i+1 zbog realnosti, da namne ispisuje se na ekranu "Unesi element 0") */for (i=0;i<5;i++){printf("\nUnesi %d element prvog polja: ",i+1);scanf("%f", &A[i]);}// Unos elemenata drugog poljafor (i=0;i<5;i++){printf("\nUnesi %d element drugog polja: ",i+1);scanf("%f", &B[i]);}// Racunanje clanova matrice C po formuli C=2*A+B (pomocu jedne for petlje).for (i=0;i<5;i++) C[i]=2*A[i]+B[i];// Ispis elemenata polja Aprintf("\nElementi prvog polja A: ");for (i=0;i<5;i++) printf("%.f ", A[i]);// Ispis elemenata polja Bprintf("\nElementi drugog polja B: ");for (i=0;i<5;i++) printf("%.f ", B[i]);// Ispis elemenata polja Cprintf("\nElementi treceg polja C: ");for (i=0;i<5;i++) printf("%.f ", C[i]);// Kraj programagetch();return 0;}

Page 18: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

13. Napisati program koji ucitava broj elemenata nekog polja(maksimalno 100) a zatim i elemente tog polja. Program zatimpronalazi najmanji element i na standardni izlaz ispisuje sveelemente koji su manji od dvostruke vrijednosti pronadjenognajmanjeg elementa.

RJEŠENJE:# include <stdio.h>main (){// Definisanje varijabliint n, i, niz[100], min;// Unos broja elemenataprintf("\nUnesi broj elemenata: ");scanf("%d", &n);// Unos niza od N elemenata (pomocu for petlje)for (i=0;i<n;i++){printf ("\nUnesi elemenat broj %d: ", i+1);scanf("%d", &niz[i]);}// Postavljanje vrijednosti min na vrijednost prvog clana nizamin=niz[0];/* For petlja vrti brojeve od drugog broja (prvi je ukljucen u liniju iznad) iprovjerava se da li je i-ti broj manji od min i ako jeste varijabli min sepridruzuje vrijednost tog elementa. */for (i=1;i<n;i++)if (min>niz[i]) min=niz[i];/* For petlja vrti sve brojeve i za svaki broj se vrsi provjera da li je manjiod dvostruke vrijednosti nadjenog najmanjeg broja, i ako je taj broj zaistamanji od 2*min ispisuje se na ekran, a ako nije ide se na iduci broj. */for (i=0;i<n;i++)if (niz[i]<min*2) printf("\n %d", niz[i]);// Kraj programagetch();return 0;}

Page 19: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

14. Napisati funkciju koja kao argument prima cijeli broj avraca broj koji se dobije tako da se iz argumenta izbace cifre2,3,8 i 9.Prototip funkcije je: int izbaci2389(int x)Nakon toga, napišite glavni program koji ucitava neki cjeli broj,poziva funkciju izbaci2389 i ispisuje rezultat na standardnomizlazu.

RJEŠENJE:# include <stdio.h>main (){// Definisanje prototipa funkcijeint izbaci2389(int x);// Definisanje varijabliint N, X;// unos prirodnog brojaprintf("\nUnesi prirodan broj: ");scanf("%d", &N);// Poziv funkcije i pridruzivanje rezultata varijabli XX=izbaci2389(N);// Ispis prepravljenog brojaprintf("\nPrepravljeni broj: %d", X);// Kraj programagetch();return 0;}

// Funkcija za izbacivanje cifri 2,3,8,9 iz prirodnog brojaint izbaci2389(int x){int t=1, y=0, ost;/* While petlja se izvrsava dok je x>0. Uzima se ostatak dijeljenja broja sa10 (npr. od broja 129, ostatak je 9), zatim se varijabli x odbije zadnja cifradijeljenjem sa 10 (do odbijanja dolazi jer radimo sa int brojevima pa nemadecimalnog zareza (npr 129/10=12). Zatim provjerimo dali je dobijeni ostatakost jednak 2,3,8 ili 9 i ako jest vracamo se na pocetak petlje i vrsimo istipostupak za broj koji smo dobili odbijanjem zadnje cifre (i sve tako dok neodbijemo sve cifre, tj. dok ne dobijemo broj 0). Ako varijabla ost ipak jerazlicita od 2,4,8,9 onda se varijabli y doda vrijednost ost pomnozena sa t. Uprogramu varijabla t nam ustvari broji koja je decimala u pitanju. Kad je t=1radimo sa jedinicama, kad je t=10 radimo sa deseticama... Tako npr. broj 1234mozemo rastaviti kao 4*1+3*10+2*100+1*1000 gdje su nam brojevi 1,10,100,1000ustvari nase t. */while (x>0){ost=x%10;x=x/10;if ((ost==2)||(ost==3)||(ost==8)||(ost==9)) continue;y=y+ost*t;t=t*10;}return y;}

Page 20: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

15. Napisati funkciju koja kao argument uzima potrošnju u KWhza veliku i malu tarifu te na standardnom izlazu ispisuje racunza utrošenu elektricnu energiju.Pretpostaviti da je cijena za veliku tarifu po utrošenom KWh 0.10KM, a cijena za malu tarifu po utrošenom KWh je 0.05 KWh.Prototip funkcije je: void racun(float vt, float mt) gdje : * vt oznacava potrošnju za veliku tarifu * mt oznacava potrošnju za malu tarifuNakon toga, napišite glavni program koji ucitava potrošnju zaveliku tarifu i malu tarifu, te na standardnom izlazu ispisujeracun za tu potrošnju.

RJEŠENJE:# include <stdio.h>main (){// Definisanje prototipa funkcijevoid racun(float vt, float mt);// Definisanje varijablifloat vt, mt;// Unos potrosnje po velikoj i maloj tarifiprintf("Unesi potrosnju za veliku tarifu: ");scanf("%f", &vt);printf("Unesi potrosnju za malu tarifu: ");scanf("%f", &mt);// Poziv void funkcije (funkcija ne vraca rezultat), sa argumentima vt i mtracun(vt, mt);// Kraj programagetch();return 0;}// Funkcija koja kreira racun za utrosak energije na osnovu argumenata vt i mtvoid racun(float vt, float mt){float cijena;// Racunanje ukupne cijene na osnovu argumenata vt i mt i zadatih cijenacijena=vt*0.10+mt*0.05;// Ispis rezultataprintf("\n--------------RACUN ZA UTROSENU EL. ENERGIJU-------------------- ");printf("\nPotrosnja VT: %f KWh", vt);printf("\nPotrosnja MT: %f KWh", mt);printf("\n**************************************************************** ");printf("\nUkupno: %f KM", cijena);printf("\n**************************************************************** ");}

Page 21: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

16. Napisati funkciju koja kao argument uzima tri cijela brojaa, p i c. Funkcija vraca cijeli broj koji se dobije tako da se ubroju a iza p-te cifre s desne strane umetne cifra c.Ako je p veci od ukupnog broja cifri izlaz iz funkcije treba bitijednak ulazu. Ako se broj c sastoji od više cifri onda se umecesamo zadnja cifra iz tog broja.Prototip funkcije je: int umetni(int a, int p, int c)Nakon toga, napišite program koji ucitava neki pozitivan cijelibroj a, poziciju umetanja cifre p i broj koji definira cifru kojase umece c, te poziva funkciju umetni() i ispisuje na standardnomizlazu rezultirajuci broj.

RJEŠENJE:# include <stdio.h>main (){// Definisanje prototipa funkcijeint umetni(int a, int p, int c);// Definisanje varijabliint a, p, c, rez;// Unos brojeva a,p,cprintf("Unesi brojeve a, p, c: ");scanf("%d,%d,%d", &a,&p,&c);// Poziv funkcije umetni() i pridruzivanje rezultata varijabli rezrez=umetni(a,p,c);// Ispis rezultataprintf("Rezultat: %d", rez);// Kraj programagetch();return 0;}

// Funkcija koja umece broj c na p-tu poziciju u broju a s desnaint umetni(int a, int p, int c){int t=1, ost, x=0,br=0;// Broju c pridruzuje se samo njegova zadnja cifrac=c%10;/* Racuna se ostatak dijeljenja sa 10 (ost), broju a se "otkida" zadnja cifra.Ukoliko su brojevi p i br (brojac) identicni na to mjesto treba ubaciti brojc. t nam broji decimale (vidi 14. zadatak).Varijabli x se dodaje ostatak ost pomnozen sa t.X je trazeni broj koji funkcija vraca u glavni program. */while (a>0){ost=a%10;a=a/10;if (p==br) {x=x+c*t; t=t*10; p=1000;}x=x+ost*t;t=t*10;br++;}return x;}

Page 22: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

17. Napraviti program koji ce na monitoru ispisati prvih Ncijelih brojeva i njihove kvadrate u formatu:

1 na kvadrat je 12 na kvadrat je 43 na kvadrat je 9..........................

Broj N se unosi sa tastature. Koristiti for petlju.

RJEŠENJE:#include <stdio.h>

int main() {// Definisanje varijabli

int n,i;

/* Unos broja n sa tastature */

printf("\nUnesi broj n: ");scanf("%d", &n);

/* Ispis prvih n brojeva i njihovih kvadrata, krenuvsi od broja 1, i znacikrece od 1 i ide sve do broja za jedan manji od unesenog */

for ( i = 1 ; i < n ; i++ )printf("\n %d na kvadrat je %d \n", i, i*i);

// Kraj programagetch();return 0;

}

Page 23: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

18. Napraviti program koji izracunava rješenja sistemalinearnih jednadzbi:

a11x1 + a12x2 = b1a21x1 + a22x2 = b2

(nepoznate su x1 i x2)

Koeficijenti a11, a12, b1, a21, a22, b2 se unose sa tastature. Akosistem jednadzbi nema rješenje program ispisuje poruku «RJEŠENJEne postoji».RJEŠENJE:#include <stdio.h>int main() {// Definisanje varijabli

float a11,a21,a12,a22,x1,x2,b1,b2;/* Unos podataka (U dijelu %fx1%fx2=%f izmedju %fx1 i %fx2 nema plusa, usuprotnom bi morali pri unosu operacije - (minus) upisivati +-) */printf("\n Unesite 1 linearnu jednacinu a11x1+a12x2=b1 (x1, x2 nepoznate): ");scanf("%fx1%fx2=%f", &a11, &a12, &b1);printf("\n Unesite 2 linearnu jednacinu a21x1+a22x2=b2 (x1, x2 nepoznate): ");scanf("%fx1%fx2=%f", &a21, &a22, &b2);/* Izracunavanje x2 metodom supstitucije */x2=(b2 * a11 - a21 * b1) / (a22 * a11-a21 * a12);/* Izracunavanje x1 metodom uvrstavanja x2 u prvu jednacinu */x1=(b1 - a12 * x2) / a11;/* Provjerava se da li je sistem odredjen *//* Ukoliko je sistem odredjen ispisuju se rjesenja, u suprotnom se ispisujeporuka: RJEŠENJE ne postoji */if ((a11*a22)==(a12*a21)) printf("\nRJEŠENJE ne postoji!!!");

else printf("\nRezultat je: x1=%.2f i x2=%.2f", x1, x2);// Kraj programa

getch();return 0;

}

Page 24: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

19. Napisati program koji ucitava 4 cijela broja, a kao izlazdaje dva najveca broja. Na primjer, ako korisnik kao ulaz uneseslijedece cijele brojeve:

23 5 45 33rezultat izvodjenja programa treba biti:Najveci broj je 45.Drugi broj po velicini je 33.Napomena: Tekstualne poruke vašeg programa trebaju biti iste kaogore navedene.

RJEŠENJE:#include <stdio.h>

int main() {// Definisanje varijabli

int i,j,p,niz[4];/* Unos brojeva niza (4 broja), pomocu for petlje koja ide od 1 do 4. */ printf("\n Unesite 4 cijela broja!");

for(i=1;i<=4;i++){printf("\n %d broj: ", i);scanf("%d",&niz[i]);

}

/* Proces sortiranjaKoristena je metoda bubblesort (spomenuta u jednom od zadataka ranije), to jemetoda „preljevanja“, provjerava se da li je j-ti clan manji od j+1-vog i akojeste mijenjaju se mjesta.Npr. Unesemo 1,2,3,4. Nakon prvog prolaska imamo 2,1,3,4. Nakon drugogprolaska 2,3,1,4. Nakon treceg prolaska imamo 2,3,4,1. I onda prva for petljaproces ponavlja jos jednom. Pa imamo 3,2,4,1 zatim i 3,4,2,1 pa onda ostajeisto jer je 2 vec vece od 1. Ali niz nije sortiran! Prva for petlja jos jednompokrece postupak i imamo 4,3,2,1. Proci ce se onako bezveze jos 2 puta krozpetlju „j“ i zatim se izlazi iz petlje, i ispisuju se rezultati*/

for(i=1;i<=3;i++)for(j=1;j<=3;j++)

if (niz[j+1]>niz[j]) { p=niz[j]; niz[j]=niz[j+1]; niz[j+1]=p;

}

/*Ispis rjesenja zadatka*/

printf("\n Najveci broj je %d", niz[1]);printf("\n Drugi broj po velicini je %d", niz[2]);

// Kraj programa getch();

return 0;}

Page 25: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

20. Napisati program koji ce sa tastature ucitati prirodanbroj, te ispitati da li je broj prost. Ako se unese broj kojinije prirodan (n<=0), program ispisuje poruku „Broj nijeprirodan“ i završava. Ako je broj prost program ispisuje poruku „Uneseni broj je prost“. Ako broj n nije prost program ispisujeporuku „Uneseni broj je slozen“. Ako je unesen broj n=1 programispisuje poruku: „Broj 1 nije niti prost niti slozen“.Napomena:Pod prostim brojem podrazumijevamo prirodan broj koji sene moze napisati kao umnozak dvaju prirodnih brojeva manjih odtog broja. Broj 1 nije niti prost niti slozen.

RJEŠENJE:#include <stdio.h>

main () {

// Definisanje varijabliint i,br, ispit;// Unos jednog prirodnog brojaprintf ("\n Unesi prirodan broj: ");scanf ("%d", &br);// Provjera da li je broj prirodan, i ako nije ispisuje// se poruka da broj nije prirodanif (br<=0) printf("\n Broj nije prirodan"); else// Provjera da li je uneseni broj, broj 1, i ako jeste,// ispisuje se odgovarajuca porukaif (br==1) printf("\n Broj 1 nije ni prost ni slozen"); else/* Ako je unesen prirodan broj veci od 1, provjerava se da li je broj prostili slozen, varijabla "ispit" kao rezultat. Djelimo broj „br“ sa svakim brojemmanjim od polovine unesenog broja. Na pocetku je „ispit=0“ sto nam govori daje broj neparan. Ulazi se u petlju i pocinje dijeljenje sa brojevima 2,3,4...Ako se broj „br“ uspije podijeliti sa nekim od brojeva varijabla ispit ceautomatski poprimiti vrijednost 1. U zavisnosti da li je broj „br“ uspio sepodijeliti sa nekim brojem bez ostatka, zavisiti ce i cinjenica da li je brojprost ili slozen. */{ispit=0; i=2;while (i<br/2) {

if ((br % i == 0)) ispit=1;i++;

}// Ispis odgovarajuce poruke na izlazu (PROST ILI SLOZEN)if (ispit) printf("\n Broj je slozen"); else printf("\n Broj je prost");}// Kraj programagetch();return 0;}

Page 26: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

21. Napraviti program koji izracunava n! (n faktorijela). Broj nse unosi sa tastature i treba biti u rasponu [1,20]. Ako broj nnije u datom rasponu, program ispisuje poruku „Uneseni broj nijeu datom rasponu“ i završava se program.Napomena: n! je definirano kao n! = n⋅ (n-1) ⋅ (n-2) ⋅....3⋅2⋅1.RJEŠENJE:#include <stdio.h>

main () {

// Definisanje varijabliint i;float n,f;

// Unos prirodnog brojaprintf("\n Unesi broj N u rasponu od [1,20]: ");scanf("%f", &n);

/* Racunanje faktorijele, ukoliko je broj u rasponu [1,20]. Faktorijela seracuna tako sto se uneseni broj pomnozi sa svakim brojem manjim od sebe, i svese to pridruzuje varijabli „f“. */f=1;if ((n>0) && (n<21)) {

for (i=0;i<n;i++) f=f*(n-i);

// Ispis rezultataprintf("\n Faktorijela od broja %.0f je: %0.f", n, f);

// Ispis poruke ukoliko broj n nije u odgovarajucem rasponu} else printf ("\n Uneseni broj nije u datom rasponu!");

// Kraj programagetch();return 0;

}

Page 27: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

22. Napisati program koji ce izracunati sumu kvadrata prvih nprirodnih brojeva. Broj n se unosi sa tastature i treba biti uintervalu [2,100]. Ako broj n nije u tom intervalu programispisuje poruku „Broj nije u zadanom intervalu“ i završava. Naprimjer, ako se unese n=3, program ce izracunati sumu:suma=12+22+32=14.RJEŠENJE:#include <stdio.h>main () {// Definisanje varijabli

int i,broj,suma;// Unosenje prirodnog broja sa tastature u rasponu od [2,100] printf("\n ULAZ: Broj \"N\" u rasponu od [2,100]: "); scanf("%d", &broj);

/* Ukoliko se unese broj u tacnom intervalu [1,100] racunanje sume kvadrata.Imamo varijablu suma (na pocetku 0), koja se krece sabirati redom sa:1*1 + 2*2 + 3*3 + 4*4 ... I sve do unesenog broja.*/ suma=0; if ((broj>1) && (broj<101)) {

for (i=1;i<=broj;i++) suma=suma+(i*i);

// Ispis sume kvadrata prvih n brojevaprintf("\n Suma kvadrata prvih %d brojeva: %d", broj, suma);

// Ispis odgovarajuce poruke ukoliko broj n nije u odgovarajucem rasponu } else printf ("\n Uneseni broj nije u datom rasponu!");

// Kraj programagetch();return 0;}

Page 28: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

23. Napraviti program koji ce na ekranu ispisivati broj PIprema formuli PI=1-1/3+1/5-1/7...1/i, a vrijednost eps unosimo satastature i mora biti u intervalu 0.1 do 0.0001. Suma se racunasve dok je 1/i vece od eps.RJEŠENJE:#include <stdio.h>

main () {

// Definisanje varijablifloat eps,pi,n;

// Unos broja koji oznacava preciznostprintf("\n Unesi broj eps u rasponu od [0.0001,0.1]: ");scanf("\n %f", &eps);

/* Provjera da li je broj „eps“ iz odredjenog intervala, i ako jeste racunanjebroja „pi“. Radi lakseg sastavljanja formule (jer imamo – i + naizmjenicno)grupisacemo clanove po 2. i onda sve svodimo na operaciju sabiranja razlika 2broja. Na kraju se brojac uvecava za 4 jer smo odmah po dva clana u formulikoristili */

n=1; pi=0;if ((eps>0.0001) && (eps<0.1)) {

while (1/n>eps) {pi=pi+(4/n-4/(n+2));n=n+4;

}

// Ispis broja PIprintf ("PI je: %f", pi);

// Ispis poruke ukoliko broj eps nije u odgovarajucem rasponu} else printf ("\n Broj nije u trazenom rasponu!");

// Kraj programagetch();

return 0;}

Page 29: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

24. Napisati C program koji ce ucitati dimenzije (RA x KA)realne matrice A (maksimalno 10 x 10) , dimenzije (RB x KB)realne matrice B (maksimalno 10 x 10), te ucitati elemente tihmatrica. Program zatim treba izracunati matricu C koja jeproizvod matrica A i B. Na kraju program treba ispisati sve trimatrice: A, B i C.* RA, RB oznacavaju broj redova matrica A i B, respektivno;* KA, KB oznacavaju broj kolona matrica A i B, respektivno.Prilikom unosa dimenzija matrica program treba provjeriti da lisu unesene dimenzije u dozvoljenim granicama, tj. da li jeRA<=10, RB<=10, KA<=10, KB<=10, te isto tako program trebaprovjeriti da li se matrice mogu mnoziti, tj. da li je ispunjeno:KA=RB

RJEŠENJE:#include <stdio.h>main(){float A[10][10], B[10][10], C[10][10];int RA, RB, KA, KB, i, j, k;// Unos dimenzija prve i druge matriceprintf("\nUnos dim. matrica A[RA,KA], B[RB,KB], u obliku \"RA,KA,RB,KB\": ");scanf("%d,%d,%d,%d", &RA, &KA, &RB, &KB);

// Ispit uslova: da li su dimenzije u intervalu od 1 do 10.if ((RA<=10)&&(RA>0)&&(RB<=10)&&(RB>0)&&(KA<=10)&&(KA>0)&&(KB<=10)&&(KB>0)) {// Ispit uslova: da li je broj kolona prve matrice i broj redova druge isti.if (KA==RB){

/* Unos elemenata prve matrice A (pomocu 2 for petlje, objasnjeno u jednom odprethodnih zadataka. */printf("\nUnesi elemente matrice A[%d,%d]: \n", RA, KA);for (i=0;i<RA;i++)for (j=0;j<KA;j++){printf("Unesi element [%d,%d]: ", i+1, j+1);scanf("%f", &A[i][j]); }

// Unos elemenata druge matrice Bprintf("\nUnesi elemente matrice B[%d,%d]: \n", RB, KB);for (i=0;i<RB;i++)for (j=0;j<KB;j++){printf("Unesi element [%d,%d]: ", i+1, j+1);scanf("%f", &B[i][j]); }

/* Racunanje matrice C po formuli C=A*B. Dvije for petlje identicne forpetljama pri unosu matrice ili ispisu, koje „setaju“ po redovima i kolonamamatrica A,B,C. Prema matematickom postupku proizvod matrica A i B je:C[1][1]=A[0][0] * B[0][0] + A[0][1] * B[1][0] + ... + A[0][n] * B[n][0] sto jeprimjenjeno na formulu koja se nalazi unutar for petlje sa argumentom „k“.Argument „k“ se krece od 1 do broja kolona prve matrice, i predstavlja brojsabiraka u formuli iznad. C[i][j] = 0; je uvedeno jer vrijednost C[i][j] nijedefinisana, a moramo je koristiti u formuli unutar for petlje po „k“. */

Page 30: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

for (i=0;i<RA;i++)for (j=0;j<KB;j++) {C[i][j]=0;for (k=0;k<KA;k++) C[i][j]=C[i][j]+A[i][k]*B[k][j]; }// Ispis matrice Aprintf("\nMatrica A[%d,%d]: \n", RA, KA);for (i=0;i<RA;i++){printf("\n");for (j=0;j<KA;j++) printf("%4.f ", A[i][j]); }// Ispis matrice Bprintf("\nMatrica B[%d,%d]: \n", RB, KB);for (i=0;i<RB;i++){printf("\n");for (j=0;j<KB;j++) printf("%4.f ", B[i][j]); }// Ispis matrice Cprintf("\nMatrica C[%d,%d]: \n", RA, KB);for (i=0;i<RA;i++){printf("\n");for (j=0;j<KB;j++) printf("%4.f ", C[i][j]); }// Ispis poruka ukoliko podaci nisu regularni} else printf("\n Matrice se nemogu pomnoziti!");} else printf("\n Matrice nisu u odgovarajucem intervalu!");// Kraj programagetch();return 0;}

Page 31: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

25. Napisati C program koji sa standardnog ulaza ucitavaelemente realne matrice dimenzija 5 x 5, te izracunava sumuelemenata svake kolone i sumu elemenata svakog reda.Za unos i pohranjivanje matrice koristite dvodimenzionalno polje,dok za pohranjivanje suma po redovima i kolonama trebatekoristiti jednodimenzionalno polje.Program takodjer treba pronaci:* u kojoj koloni je najmanja suma,* u kojem redu je najveca suma,te ispisati na standardni izlaz unesenu matricu, redne brojeve isume pronadjene kolone, odnosno, reda.

RJEŠENJE:#include <stdio.h>main(){

// Definisanje varijablifloat MATRIX[5][5], SUMA[5], sumaR, sumaK;int i,j, Kolona, Red;

// Unos elemenata matriceprintf("\nUnesi elemente matrice MATRIX[5,5]: \n");for (i=0;i<5;i++)for (j=0;j<5;j++){printf("[%d,%d]: ", i+1, j+1);scanf("%f", &MATRIX[i][j]); }

/* Postavljanje vrijednosti elemenata niza SUMA na 0 (jer vrijednosti nizaSUMA[] nisu definisane. */for (i=0;i<5;i++) SUMA[i]=0;

/* Racunanje suma po redovima. Sabiramo sve brojeve prvog reda, znaci „i“ sene mijenja, a „j“ se uvecava za 1 sve do 5. I kada se sabere tih 5 brojeva, toje suma prvog reda i zapisuje se u SUMA[0], zatim se isto ponavlja za ostaleredove, tako sto se samo „i“ uvecava za 1 i prelazi time na iduci red. */for (i=0;i<5;i++)for (j=0;j<5;j++)SUMA[i]=SUMA[i]+MATRIX[i][j];

/* Nalazenje najvece od izracunatih suma. Postavlja se da je prva sumanajveca, i zatim se provjerava da li od preostalih ima neka koja je veca, iako je veca, onda se ta suma postavlja da je najveca. Vrijednost „i+1“ nampredstavlja broj reda u kojem je ta suma (na pocetku stavili smo da je „i=1“jer ispred stoji da je „sumaR=SUMA[0]“. */sumaR=SUMA[0]; Red=1;for (i=1;i<5;i++) if (sumaR<SUMA[i]) {sumaR=SUMA[i]; Red=i+1;}

// Postavljanje vrijednosti elemenata niza SUMA na 0for (i=0;i<5;i++) SUMA[i]=0;

Page 32: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

/* Racunanje suma po kolonama... ista procedura, samo smo zamijenili mjestabrojaca „i, j“ unutar „MATRIX[i][j]“. */for (i=0;i<5;i++)for (j=0;j<5;j++)SUMA[i]=SUMA[i]+MATRIX[j][i];

// Pronalazenje najmanje od izracunatih sumasumaK=SUMA[0]; Kolona=1;for (i=1;i<5;i++) if (sumaK>SUMA[i]) {sumaK=SUMA[i]; Kolona=i+1;}

// Ispis matrice MATRIXprintf("\nMatrica MATRIX[5,5]: \n");for (i=0;i<5;i++){printf("\n");for (j=0;j<5;j++) printf("%.f ", MATRIX[i][j]); }

// Ispis rjesenjaprintf("\nU %d koloni je najmanja suma koja iznosi %.f", Kolona, sumaK);printf("\nU %d redu je najveca suma koja iznosi %.f", Red, sumaR);

// Kraj programagetch();return 0;}

Page 33: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

26. Program ucitava jednu rijec a i znak c koji se trebaprebrojati u toj rijeci. Nakon toga program poziva funkcijeduzina() i izbroji () i samogl(), te ispisuje duzinu unesenerijeci a i broj pojavljivanja znaka c u toj rijeci, kao i brojsamoglasnika u rijeci.

RJEŠENJE:#include <stdio.h>// Funkcije „duzina“, „izbroji“ i „samogl“// Funkcija duzina prima pokazivac na prvo slovo nekog stringa, a zatim uwhile petlji provjerava se koliko znakova ima rijec, kada se dodje do nultogznaka, izlazi se iz petlje, rezultet je varijabla „d“ koja se vraca izfunkcije.int duzina(char *string){int d=0;while (*string++!='\0') d++;return d;}

/* Slicno prvoj funkciji, samo funkcija pored pokazivaca na prvi znak stringaprima i znak koji se broji. I umjesto da broji se broj clanova, umjesto d++ide uslov (ako je slovo na koje pokazuje pokazivac nase slovo), „b“ se uvecaza 1. Kada „dodje“ while petlja do nultog znaka, izlazi se iz petlje avarijabla „b“ se vraca kao rezultat.NAPOMENA: U gornjoj funkciji stoji u uslovu *string++ sto prebaca pokazivac naiduci clan nakon sto while petlja napravi jedan „krug“, dok u drugoj funkcijistoji u uslovu samo *string ali je poslije if petlje uvecan pokazivac za „1“,sto nam daje opet isti efekat. */int izbroji(char *string, char c){int b=0;while (*string!='\0'){if (*string==c) b++;string++;}return b;}

/* Identicno funkciji izbroji() samo umjesto provjere „*string==c“ ide uslovda li je „*string“ neki od samoglasnika, a ne znak koji unosimo. Funkcijaprima samo pokazivac bez znaka. */int samogl (char *string){int b=0;while(*string!='\0'){if (*string=='a'||*string=='A'||*string=='E'||*string=='e'||*string=='I'||*string=='i'||*string=='O'||*string=='o'||*string=='U'||*string=='u') b++;string++;}return b;}

Page 34: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){// Definisanje varijablichar a[80],c;// Unos rijeci bez razmaka i jednog slova koje ce se prebrojavatiprintf("\nUnesite jednu rijec do 20 znakova (bez razmaka):");scanf("%s",a);printf("\nKoji znak treba prebrojati:");scanf("\n%c",&c);// Ispis rjesenjaprintf("\nUnesena rijec sadrzi %d znakova!",duzina(a));printf("\nBroj znakova %c je: %d",c,izbroji(a,c));printf("\nBroj samoglasnika je: %d", samogl(a));// Kraj programagetch();return 0;}

Page 35: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

27. Napisati program koji u realno polje temp ucitava 10realnih vrijednosti koje predstavljaju temperature u 10razlicitih dnevnih termina. Program zatim poziva funkcijemaxtemp() i prtemp() koje izracunavaju maksimalnu dnevnutemperaturu i prosjecnu dnevnu temperaturu i ispisuje nastandardnom izlazu te vrijednosti.RJEŠENJE:#include <stdio.h>main (){// Definisanje varijablifloat temp[10], *p;int i;// Definisanje prototipa funkcijafloat maxtemp(float *p);float prtemp(float *p);// Unos 10 temperatura u niz temp[];for (i=0;i<10;i++){printf("\nUnesi temperaturu br.%d: ",i+1);scanf("%f", &temp[i]);}// Postavljanje pokazivaca p na prvi clan niza temp[];p=temp;// Isipis rezultata uz poziv funkcijaprintf("\nMaksimalna temperatura je: %.1f", maxtemp(p));printf("\nProsjecna temperatura je: %.1f", prtemp(p));// Kraj programagetch();return 0;}/* Funkcija maxtemp() prima pokazivac na realan niz i pomocu for petlje (vidi11. zadatak) pronalazi se najveci broj (temperatura i vraca se iz funkcije */float maxtemp(float *p){float max=*p;int i;for (i=0;i<10;i++) { if (max<*p) max=*p; p++; }return max;}/* Funkcija prtemp() prima pokazivac na realan niz i pomocu for petlje sesaberu svi clanovi niza i na kraju (poslije for petlje) se podijeli sve sa 10(broj temperatura), tj. vraca se vrijednost (pr/10) kao rezultat */

float prtemp(float *p){float pr=0;int i;for (i=0;i<10;i++) { pr=pr+*p; p++; }return (pr/10);}

Page 36: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

28. Modificirati prethodni program (27) tako da program ucitavacijeli broj n a zatim se sa tastature unosi n vrijednosti zatemperature u polje temp. Pretpostaviti da je n<=10. U skladu stim potrebno je modificirati funkcije maxtemp() i prtemp() takoda imaju slijedece prototipove:

float maxtemp(int n, float *p);float prtemp(int n, float *p);RJEŠENJE:# include <stdio.h>main (){// Definisanje varijablifloat temp[10], *p;int i, n;// Definisanje prototipa funkcijafloat maxtemp(int n, float *p);float prtemp(int n, float *p);// Unos broja nprintf("\nUnesi broj temperatura: ");scanf("%d", &n);// Unos n temperatura u niz temp[];for (i=0;i<n;i++){printf("\nUnesi temperaturu br.%d: ",i+1);scanf("%f", &temp[i]);}// Postavljanje pokazivaca p na prvi clan niza temp[];p=temp;// Isipis rezultata uz poziv funkcijaprintf("\nMaksimalna temperatura je: %.1f", maxtemp(n, p));printf("\nProsjecna temperatura je: %.1f", prtemp(n, p));// Kraj programagetch();return 0; }

/* Funkcija prima pokazivac na realan niz, i broj n i pomocu for petlje (vidi11. zadatak) pronalazi se najveci broj (temperatura i vraca se iz funkcije */float maxtemp(int n, float *p) {float max=*p;int i;for (i=0;i<n;i++) { if (max<*p) max=*p; p++; }return max; }/* Funkcija prima pokazivac na realan niz i broj „n“ i pomocu for petlje sesaberu svi clanovi niza i na kraju (poslije for petlje) se podijeli sve sabrojem „n“ (broj temperatura), tj. vraca se vrijednost (pr/n) kao rezultat */float prtemp(int n, float *p){float pr=0;int i;for (i=0;i<n;i++) { pr=pr+*p; p++; }return (pr/n); }

Page 37: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

29. Napisati funkciju s imenom adresa() koja kao argument uzimadva stringa koji predstavljaju ime i prezime a kao rezultat vracase novi string koji se dobije tako da se string koji predstavljaprezime promijeni u string koji predstavlja e-mail adresuslijedeceg oblika: [prezime].[ime]@etf.unsa.baPrototip funkcije je: char *adresa(char *ime, char *prezime)Na primjer, ako su argumenti ime=“Marko“, prezime=“Markovic“funkcija adresa() vraca pokazivac na rezultirajuci string prezimekoji je promijenjen u novi string oblika:[email protected] toga, napisati glavni program koji ucitava ime i prezimeneke osobe i na standardnom izlazu ispisuje toj osobi pridruzenue-mail adresu koja se dobije pozivom funkcije adresa().RJEŠENJE:#include <stdio.h>// Funkcija adresa()char *adresa(char *ime, char *prezime){// Definisanje varijabli potrebnih za rad u funkcijichar *p, POMOC[]="@etf.unsa.ba", *POM;/* Pointer „p“ pokazuje na pocetak prezimena, a „POM“ pokazuje na pomocni niz“POMOC“ u kojem se nalazi string „@etf.unsa.ba.“ */p=prezime; POM=POMOC;

// Generisanje email adrese// Ova while petlja pokazivac postavi iza zadnjeg znaka, tj. Na nulti znak.while (*p!='\0') p++;// Umjesto nultog znaka upise se „.“ i predje se na iduci znak*p='.'; p++;// Poslije tacke se ubacaju karakteri iz niza na koji pokazuje pokazivac „ime“while (*ime!='\0') { *p=*ime; ime++; p++; }// Poslije imena se doda string na koji pokazuje pokazivac „POM“while (*POM!='\0') { *p=*POM; POM++; p++; }// Vracanje pokazivaca iz funkcijereturn p;}

// Glavni programint main(){// Definisanje varijablichar *ime, *prezime, *c;char U1[100], U2[100];// Unos podataka ime i prezimeprintf("\nUnesi ime:");scanf("%s", &U1);printf("\nUnesi prezime:");scanf("%s", &U2);// Postavljanje pokazivaca „c“ na pocetak prezimenac=U2;// Postavljanje pokazivaca ime i prezime na stringove U1 i U2

Page 38: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

ime=U1;prezime=U2;// Poziv funkcije „adresa()“ i slanje pokazivaca „ime“ i „prezime“ u funkcijuprezime=adresa(ime, prezime);// Ispis Email adreseprintf("\nGenerirana korisnikova Email adresa: %s", c);// Kraj programagetch();return 0;}

Page 39: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

30. Napisati funkciju koja kao argument uzima znakovno poljejmbg (jedinstveni maticni broj gradjanina) a kao izlaz vracastrukturnu varijablu koja predstavlja datum rodjenja doticneosobe. Prototip funkcije je: struct datum fdatum(char *jmbg) gdjestruct datum predstavlja strukturu definiranu kao:

struct datum{int dan;int mjesec;int godina;};Na primjer, ako je strukturna varijala drodj definirana kao:struct datum drodj; te ako je ulaz u funkcijujmbg=“2405978234567“ poziv funkcije drodj=fdatum(jmbg); trebavratiti strukturnu varijablu koja predstavlja datum 24.05.1978.,tj. funkcija vraca slijedece podatke strukturne varijable tipadatum:

drodj.dan=24;drodj.mjesec=5;drodj.godina=1978;Nakon toga napišite glavni program koji sa standardnog ulazaucitava jmbg kao znakovno polje a nakon poziva funkcije fdatum()ispisuje datum rodjeja osobe sa doticnim jedinstvenim maticnimbrojem.RJEŠENJE:# include <stdio.h>

// Definisanje strukture datumstruct datum {int dan;int mjesec;int godina;};

/* Funkcija koja vraca datum kreiran od znakovnog polja u koje je upisanmaticni broj */

struct datum fdatum(char *jmbg){

// Definisanje varijable drodj kao strukturne varijable od datumstruct datum drodj;

// Definisanje pokazivaca koji pokazuje na strukturnu varijablustruct datum *pd;int i;

Page 40: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Racunanje varijabli strukturne varijable// Pretpostavka je da je korisnik ciji maticni broj unesete rodjen 1xxx godinedrodj.dan=0; drodj.mjesec=0; drodj.godina=1000;// Racunanje jedinice danafor (i=0;i<10;i++) if (*jmbg==49+i) drodj.dan=10*(1+i);// Racunanje desetice dana i sabiranje sa jedinicomfor (i=0;i<10;i++) if (*(jmbg+1)==49+i) drodj.dan+=(1+i);// Racunanje jedinice mjesecafor (i=0;i<10;i++) if (*(jmbg+2)==49+i) drodj.mjesec=10*(1+i);// Racunanje desetice mjeseca i sabiranje sa jedinicomfor (i=0;i<10;i++) if (*(jmbg+3)==49+i) drodj.mjesec+=(1+i);// Racunanje stotice godine i sabiranje sa 1000for (i=0;i<10;i++) if (*(jmbg+4)==49+i) drodj.godina+=100*(1+i);// Racunanje desetice godine i sabiranje sa stoticomfor (i=0;i<10;i++) if (*(jmbg+5)==49+i) drodj.godina+=10*(1+i);// Racunanje jedinice godine i sabiranje sa deseticomfor (i=0;i<10;i++) if (*(jmbg+6)==49+i) drodj.godina+=(1+i);// Postavljanje pokazivaca na prvi znak strukturne varijable „drodj“pd=&drodj;// Funkcija vraca objekat koji se nalazi na adresi na koju pokazuje „pd“return *pd;}

// Glavni dio programamain () {struct datum drodj;char jmbg[40], *p;

// Pretpostavka je da je uneseni maticni broj odgovarajuciprintf("Unesi maticni broj: ");scanf("%s", &jmbg);

// Poziv funkcije fdatum i pridruzivanje rezultata strukturnoj varijabli drodjdrodj=fdatum(jmbg);

// Ispis rjesenjaprintf("\nDatum rodjenja: %d.%d.%d", drodj.dan, drodj.mjesec, drodj.godina);

// Kraj programagetch();return 0;}

Page 41: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

31. Napisati program koji broji rijeci koje imaju n znakova utekstualnoj datoteci cije ime se unosi sa tastature. Na primjer,ako u direktoriju(folderu) T11 na disku C: postoji datotekapismo.txt sa slijedecim sadrzajem:Lijep pozdrav!Sretnu i uspjesnu Novu godinu zeli Vam kompanija BHKOM.Isto tako se nadamo da ce se dosadasnja uspjesna saradnjanastaviti i u novoj 2006. godini.Direktor: IVIC IVICAprogram treba nakon unosa imena sa tastature i broja n:Unesite broj znakova: 5Unesite ime datoteke: C:\T11\pismo.txtdati slijedeci izlaz:Datoteka pismo.txt sadrzi 4 rijeci sa 5 znakova.Napomene:Rijeci sa pet znakova za gore navedenu datoteku su:{Lijep, BHKOM, novoj, IVICA}.Prilikom brojanja znakova ne uzimaju se u obzir znakoviinterpunkcije: tacka (.), zarez (,), usklicnik (!) i sl.Prilikom rješavanja zadatka obavezno napravite testnu datotekupismo.txt i pohranite je u direktorij T11, te tu datotekukoristite za testiranje vašeg rješenja.

RJEŠENJE:# include <stdio.h>main() {// Definisanje varijabliFILE *datoteka;char dat[60], znak;int znakovi, br=0, rez=0;// Unos putanje do datotekeprintf("Unesi putanju do datoteke: ");scanf("%s", &dat);// Ispituje se da li datoteka postoji, ako postoji, ide se dalje u program u// suprotnom se ispisuje error poruka i izlazi iz programaif ( (datoteka = fopen (dat, "r")) == NULL) {printf("Greska kod otvaranja datoteke %s !\n", dat);getch();exit(1); }// Unos broja znakovaprintf("Unesi broj znakova: ");scanf("%d", &znakovi);

/* While petlja vrti se i uzima se znak po znak iz datoteke sve dok ne dodjese do kraja datoteke i kada stignemo na kraj izlazi se iz programa. Ukoliko jeuneseni karakter razlicit od znakova ? ! . \n , \t i blanko znaka onda sevarijabla br uveca za jedan, u suprotnom se provjeri da li je broj br jednakbroju znakova koji smo unjeli, i ako jeste varijabla rez se uveca za jedan, ionda se br postavi na 0. Kada stignemo do kraja datoteke izlazi se izpetlje.*/

Page 42: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

while((znak=fgetc(datoteka))!=EOF){if ((znak=='?')||(znak=='!')||(znak==' ')||(znak=='.')||(znak=='\n')||(znak==',')||(znak=='\t')) {if (br==znakovi) rez++; br=0;} else br++;}/* Ukoliko zadnja rijec se sastoji od trazenog broja znakova, ona nece bitiuracunata jer smo izasli iz petlje, pa je potrebno dodati ovaj uslov izapetlje da bi smo imali 100% tacan program*/if (br==znakovi) rez++;//Zatvaranje datotekefclose(datoteka);// Izlaz iz programaprintf("Datoteka %s sadrzi %d rijeci sa %d znakova.", dat, rez, znakovi);getch();return 0;}

Page 43: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

32. Napravite tekstualnu datoteku “ORPodaci.txt“ (pomocuprograma Notepad ili slicnog) slijedeceg formata:[prezime ]· · · · · ·[ime] · · · · ·[brbod1] · · · · · ·[brbod2]gdje :- kolona [prezime] zauzima 15 mjesta;- kolona [ime] zauzima 10 mjesta;- kolona [brbod1] zauzima 4 mjesta i predstavlja broj bodova naprvom parcijalnom ispitu- kolona [brbod2] zauzima 4 mjesta i predstavlja broj bodova nadrugom parcijalnom ispitu- U datoteku “ORPodaci.txt“ unesite podatke za 15 studenata.- Spasite datoteku “ORPodaci.txt“ u direktorij C:\T12.- VAZNO: Prilikom kreiranja datoteke “ORPodaci.txt“ buditeprecizni u zauzimanju mjesta za pojedine kolone.Zatim, napisati program koji ucitava sadrzaj tekstualne datoteke“ORPodaci.txt” i na temelju te datoteke kreira novu datoteku podimenom “Polozili.txt” u kojoj se treba nalaziti sortiran (odveceg prema manjem) spisak onih studenata koji su polozili obaparcijalna ispita (to su oni studenti koji imaju na obaparcijalna 10 ili više bodova).Datoteka “Polozili.txt” je slijedeceg formata:[prezime ]· · · · · · · ·[ime] · · · · · · ·[ukupno]gdje :- kolona [prezime] zauzima 15 mjesta;- kolona [ime] zauzima 10 mjesta;- kolona [ukupno] zauzima 4 mjesta i predstavlja ukupan brojbodova sa oba parcijalna ispita.

RJEŠENJE:#include <stdio.h>#include <stdlib.h>

/* Definisanje strukture forma koja se sastoji iz varijabli prezime i ime tipachar i prvi i drugi tipa integer */struct forma {char prezime[15];char ime[10];int prvi;int drugi;};

main(){

/* Definisanje varijabli:Neo - pokazivac na fajl koji se citaTrinity - pokazivac na fajl u koji se pise

Page 44: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

podaci[15] - strukturni niz podaci u koji ce se upisati svi podaci koji seucitaju iz fajla, maksimalno 15...Love - pomocna strukturna varijablai,j,k - potrebni projaci za sortiranje, i jos ponesta :) */FILE *Neo, *Trinity;struct forma podaci[15];struct forma Love;int i=0, j=0, k=0;

/* Otvaranje datoteke ORPodaci.txt i pridruzivanje pokazivacu Neo, ako nepostoji datoteka izlazi se iz programa */if ((Neo=fopen("C:\\T12\\ORPodaci.txt","r"))==NULL){printf("Greska pri otvaranju datoteke");exit(1);}

/* Datoteka polozili.txt se kreira i pridruzuje pokazivacu Trinity */Trinity = fopen ("c:\\T12\\Polozili.txt", "w");

/* Citanje podataka iz datoteke i upisivanje istih u strukturu podaci.Varijabla i se vraca kao broj koji oznacava broj studenata koji su poloziliobe parcijale. podaci[i].prvi se automatski sabira sa podaci[i].drugi i ukupnavrijednost postaje ustvari podaci[i].prvi!*/while(fscanf(Neo,"%15s%10s%4d%4d",&podaci[i].prezime,&podaci[i].ime,&podaci[i].prvi,&podaci[i].drugi) != EOF ){if ((podaci[i].prvi>=10)&&(podaci[i].drugi>=10))podaci[i].prvi+=podaci[i].drugi; else i--;i++;}

// Proces sortiranja... objasnjen u jednom od zadataka ranije...for(j=0;j<i-1;j++)for(k=j+1;k<i;k++)if (podaci[k].prvi>podaci[j].prvi){Love=podaci[j];podaci[j]=podaci[k];podaci[k]=Love;}

// Upis podataka u datoteku na koju pokazuje pokazivac Trinity (Polozili.txt)for (j=0; j<i; j++)fprintf(Trinity,"%-15s%-10s%-4d\n",podaci[j].prezime,podaci[j].ime,podaci[j].prvi);

// Zatvaranje datoteka...fclose(Neo);fclose(Trinity);

// Kraj programa...getch();return 0;}

Page 45: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

33. Napisati funkciju okreni() koja kao argument uzima nekistring i okrece sadrzaj tog stringa naopako. Prototip funkcijeokreni() treba biti:void okreni(char* p)Zatim napravite glavni program koji sa standardnog ulaza ucitavaneki string, te ga ispisuje naopako.Primjer:Unesite string: SarajevoNaopako: ovejaraS

RJEŠENJE:#include <stdio.h>// Funkcija okrenivoid okreni(char *p){// Definisanje pomocnih varijablichar pom;int i=0, j=0, br=0;// Brojanje slova rijeci, pointer „odlazi“ na kraj rijeci.while (*p!='\0') {br++; p++;}/* Pointer je „otisao“ na kraj rijeci, a nama treba u nastavku da je napocetku, pa cemo ga vratiti na pocetak tako sto ga pomaknemo za isti brojmjesta nazad, za koji smo ga while petljom pomjerili naprijed! */p=p-br;// Glavni dio programa, ALGORITAM./* Recimo da smo unjeli rijec LOVE. Rijec koju trebamo dobiti kao rezultat jeEVOL. Znaci potrebno je zamjeniti zadnje slovo sa prvim, i drugo sapredzadnjim. Brojac „i“ nam predstavlja znak do kojeg smo dosli sprijeda, abrojac „j“ straga. Na pocetku ce biti i=0, j=3 (jer je br=3, nemojte sezbuniti sto je 3 a ne 4, tu su ipak cetiri clana 0,1,2,3). Znaci nakon sto sefor petlja jednom izvrsi „i“ se uveca za 1 i postaje 1, a j se umanji za 1 ipostane 2. Znaci u prvom slucaju pomocu pomocne varijable „pom“ mijenjamoznakove na 0 i 3 poziciji, drugi put ce se zamjeniti znakovi na 1 i 2poziciji. I dobili smo trazenu rijec. Mozda zbunjuje uslov i<br/2; ali jeneophodan, broj permutacija je jednak polovini duzine rijeci, nacrtajte sebineki primjer i zakljucite to :). Ukoliko se uzme rijec sa neparnim brojemslova onda se srednji clan ne pomjera nigdje, ostaje, sto je i logicno. Dok seclanovi oko njega izmjenjaju simetricno. Funkcija nevraca nikakvu vrijednost,ali promjene ostaju zapamcene zbog pristupa vrijednostima preko pointera! */for (i=0,j=br-1;i<br/2;i++,j--){pom=*(p+i);*(p+i)=*(p+j);*(p+j)=pom;}}// Glavni programmain(){// Definisanje varijabli i pointerachar NIZ[100];char *t;// Unos neke rijeci i zapisivanje iste u NIZprintf("Unesi neku rijec: ");scanf("%s", &NIZ);

Page 46: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Postavljanje pokazivaca „t“ na „NIZ“t=NIZ;// Pozivanje funkcije i slanje pokazivaca „t“ u funkcijuokreni(t);/* Ispis stringa NIZ preuredjenog funkcijom (printa se „t“, a „t“ nam pokazujena „NIZ“). */printf("%s", t);// Kraj programagetch();return 0;}

Page 47: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

34. Napisati funkciju ubaci5() koja kao argument uzima nekiprirodni broj n i dva broja a i b, a zatim vraca se broj koji binastao zamjenom cifri na mjestu a i b cifrom 5 (gledano s desnestrane). Funkcija ne treba ništa ispisivati. Funkcija ubaci5()treba imati prototip:int ubaci5(int n,int a,int b);Pretpostaviti da su a i b valjano unesene vrijednosti koje imajusmisla. Primjeri ulaznih argumenata i vracenih vrijednosti:Primjer1: za ulazne argumente n=123321, a=2, b=3 funkcija vracabroj 123551.Primjer 2: za ulazne argumente n=23455, a=3, b=5 funkcija vracabroj 53555.RJEŠENJE:#include <stdio.h>// Funkcija ubaci5();int ubaci5(int n,int a,int b) {// Definisanje varijabliint c=0,t=1,o,i;/* Brojac „i“ krece od 1(prvi znak straga) i ide dok broj „n“ koji smo primiliu funkciju ne postane 0. Svaki put kada for petlja se izvrsava ponovo, uzimase ostatak dijeljenja sa 10, odnosno uzima se zadnja cifra broja „n“, ipridruzuje varijabli „o“. Zatim se broj „n“ podijeli sa 10, cime mu se odbijezadnja cifra. Suma „c“ se uvecava za „t*o“ gdje t se mijenja kao1,10,100,1000. Kada i bude jednako „a“ ili „b“ onda se umjesto „t*o“ doda„t*5“ i time se na „a-to/b-to“ mjesto doda broj 5 umjesto broja koji je bio natoj poziciji. Naredba „continue;“ ce vratiti na pocetak for petlje kako senebi izvrsile i linije ispod, jer bi time dobili ubacivanje brojeva, a nezamjenu!!! Savjet: Probajte napisati recimo petocifren broj, i skontajte malona papiru prvo kako biste te zamjene uradili, skontajte ulogu varijabli „o“ i„t“!!! */for (i=1;n>0;i++){o=n%10;n=n/10;if (i==a) {c=c+t*5; t=t*10; continue;}if (i==b) {c=c+t*5; t=t*10; continue;}c=c+t*o;t=t*10;}return c;}main(){// Definisanje varijabli a,b,nint n, a, b;// Unos brojeva a,b,nprintf("Unesi prirodan bron n:"); scanf("%d", &n);printf("Unesi brojeve a,b:"); scanf("%d,%d", &a, &b);/* Poziv funkcije, slanje n,a,b u funkciju, a rezultat sepridruzuje varijabli n, koja se printa u iducoj liniji. */n=ubaci5(n,a,b);printf("%d", n);// Kraj programa.getch();return 0; }

Page 48: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

35. Napisati program koji ucitava podatke iz ulazne formatiranetekstualne datoteke „gradovi.txt“ i kreira izlaznu datoteku„prosjeci.txt“ koja sadrzi spisak gradova s prosjecnomtemperaturom za prva tri mjeseca. Datoteka „gradovi.txt“ jesljedeceg formata:[grad] [JAN] [FEB] [MAR]gdje je:[grad] kolona u kojoj su zapisani nazivi gradova i koja zauzima15 mjesta;[JAN], [FEB], [MAR] kolona u kojoj su zapisane cjelobrojneprosjecne temperature za mjesec januar, februar i mart,respektivno. Ove kolone zauzimaju po 10 mjesta.Datoteka „prosjeci.txt“ je slijedeceg formata:[grad] [PRTEMP]gdje je:[grad] kolona u kojoj su zapisani nazivi gradova i koja zauzima15 mjesta;[PRTEMP] kolona u kojoj su zapisane prosjecne temperaturekoristeci dva decimalna mjesta i maksimalno dva mjesta prijedecimalne tacke.Primjer sadrzaja datoteke „gradovi.txt“:TRAVNIK 0 1 2ZENICA 2 3 4TUZLA 2 5 5SARAJEVO 0 3 1Primjer sadrzaja datoteke „prosjeci.txt“:TRAVNIK 1.00ZENICA 3.00TUZLA 4.00SARAJEVO 1.33RJEŠENJE:#include <stdio.h>main(){// Definisanje varijabliFILE *Neo, *Trinity;char grad[15];float JAN, FEB, MAR, PRO;/* Provjera da li postoji datoteka gradovi.txt i ako ne postoji ispis greske,u suprotnom se nastavlja program */if ((Neo=fopen("C:\\gradovi.txt","r"))==NULL){printf("Greska pri otvaranju datoteke");return 0;}// Otvaranje datoteke prosjeci.txtTrinity=fopen("C:\\prosjeci.txt","w");/* Citanje podataka iz datoteke gradovi.txt izracunavanje prosjecnetemperature PRO i printanje u datoteku prosjeci.txt */

Page 49: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

while(fscanf(Neo,"%15s%10f%10f%10f", &grad, &JAN, &FEB, &MAR) != EOF ) {PRO=(JAN+FEB+MAR)/3;fprintf(Trinity,"%-15s%2.2f\n", grad, PRO);}// Kraj programaclose(Neo);close(Trinity);getch();return 0;}

Page 50: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

36. Napisati funkciju izbacip() koja kao argument uzima nekiprirodni broj n, a zatim vraca broj koji bi nastao izbacivanjemparnih cifri iz tog broja. Funkcija ne treba ništa ispisivati.Funkcija izbacip() treba imati prototip:int izbacip(int n);Na primjer, za argument 123420 funkcija treba vratiti broj 13.RJEŠENJE:// Funkcija izbacip() prima neki integer brojint izbacip(int n){/* Definisanje varijabli, „t“ je tezisnica koja se svaki put kada dodajemoneku cifru pomnozi sa 10, „o“ je ostatak, „i“ je brojac, a „c“ je broj koji cefunkcija vratiti kao rezultat */int c=0,t=1,o,i;/* „i“ se uvecava za 1 i for petlja se vrti sve dok broj „n“ bude jednak 0 */for (i=1;n>0;i++){/* Uzima se ostatak dijeljenja sa 10, odnosno zadnja cifra broja */o=n%10;// „Odbije“ se zadnja cifra broja „n“ dijeljenjem sa 10n=n/10;/* Ako je broj paran, vraca se na pocetak petlje i time se izbacaju parnecifre */if (o%2==0) continue;// Dodavanje cifre na broj „c“c=c+t*o;// Mnozenje tezisnice sa 10t=t*10;}// Vracanje varijable creturn c;}

Page 51: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

37. Napisati funkciju ispis_preko_a() koja kao argment uzimaneko cjelobrojno polje i dva prirodna broja a i d, a zatimispisuje sve elemente polja koji su veci od broja a. Broj dpredstavlja broj elemenata polja. Funkcija treba imati slijedeciprototip:void ispis_preko_a(int *polje, int a, int d)Na primjer, za ulazne argumenteint polje[]={4,5,7,20,8,10,2,-2}, a=6, d=8trebaju se ispisati brojevi: 7, 20, 8, 10RJEŠENJE:// Funkcija prima pokazivac na polje, i dva cijela broja „a“,“d“void ispis_preko_a(int *polje, int a, int d){// Definisanje brojaca „i“int i;/* For petlja se „vrti“ sve dok brojac i koji krece od 0 ne bude veci od broja„d“ koji je funkcija primila. */for (i=0; i<d; i++){/* Ako je broj „a“ koji je primljen u funkciju manji od broja u polju do kojegsmo dosli on se ispisuje na ekran.*/if (a<polje[i]) printf("%d, ", polje[i]);}}

Page 52: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

38. Napisati funkciju zamijeni() koja ce u jednodimenzionalnompolju A velicine d zamijeniti i-ti element sa minimalnimelementom u polju A. Elementi polja A su vec definirani u glavnomprogramu. Funkcija treba imati prototip:void zamijeni(int *A, int i, int d)Na primjer, ako su elementi polja A:int A[]={3, 7, 10, 20, 18, 4,10, 2, 20], a argumenti i i d imajuslijedece vrijednosti i=3, d=9 funkcija zamijeni() promjeni poljeA u polje sa slijedecim elementima: 3, 7, 2, 20, 18, 4, 10, 2, 20(na trece mjesto se stavlja minimalni element iz polja a to je 2)

RJEŠENJE:// U funkciju se prima niz brojeva „A“, broj „i“, broj „d“.void zamijeni(int *A, int i, int d){// Definisanje brojaca „j“ i varijable „min“int j,min;// Postavljanje vrijednosti „min“ na prvi clan nizamin=A[0];/* Trazenje najmanjeg elementa u nizu. Pretpostavili smo da je to prvi broj, isada trebamo ispitati da li postoji neki broj krenuvsi od drugog (j=1 umjestoj=0 u for petlji) i ako postoji neki manji postavi se da je taj broj „min“. */for (j=1; j<d; j++) if (min>A[j]) min=A[j];/* Postavljanje na i-tu poziciju vrijednosti „min“ (i=1 ide jer nam je i-ticlan ustvari broj za jedan manje, jer nam je prvi clan nulti clan! */A[i-1]=min;// Ispis nizafor (j=0; j<d; j++) printf("%d ", A[j]);}

Page 53: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

39. Data je tekstualna datoteka c:\pismo.txt.Napisati funkcije za:a) ispis datoteke na standardni izlaz zadrzavajuci strukturu poredovima;b) prepis datoteke u novu mijenjajuci mala i velika slova;c) ispisati datoteku u obrnutom redosljedu na izlaz (prvapostaje zadnja, druga postaje pretposljednja rijec...)d) ispitati da li je neka rijeè palindrom (isto znacenje kada secita i u obrnutom smjeru)RJEŠENJE:# include <stdio.h>// Ispis datoteke na standardni izlaz zadrzavajuci strukturu po redovima...void ispis(FILE *datoteka){char znak;printf("\nSadrzaj datoteke je: \n\n");while(fscanf(datoteka,"%c", &znak)!=EOF){printf("%c", znak);}}

/* Ispitati da li je neka rijec palindrom (isto znacenje kada se cita i uobrnutom smjeru) */void palindrom(FILE *datoteka){char znak[100];char *p, *t;int i, br=0, ispit=0;printf("\n\nProvjera palindroma: \n");while(fscanf(datoteka,"%s", &znak)!=EOF){p=znak;t=znak;br=0;while(*p!='\0') {p++; br++;} p--;ispit=1;for(i=0;i<(br/2);i++) if (*(p-i)!=*(t+i)) {ispit=0; break;}if (ispit==1) {printf("\nPalindrom je: %s", znak); ispit=0;}}}

// Prepis datoteke u novu mijenjajuci mala i velika slovavoid ispisunovu(FILE *datoteka){FILE *datoteka1;char znak;datoteka1=fopen("c:\\pismo1.txt","w");while(fscanf(datoteka,"%c", &znak)!=EOF){if ((znak>64)&&(znak<91)) znak=znak+32; elseif ((znak>96)&&(znak<122)) znak=znak-32;fprintf(datoteka1, "%c", znak);}fclose(datoteka1);}

Page 54: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

/* Ispisati datoteku u obrnutom redosljedu na izlaz (prva postaje zadnja,druga postaje pretposljednja rijec...) */void ispisobrnuto(FILE *datoteka){char znak, matrix[1000][1000], pok[1000];int i=0, j=0, br=0, k=0, niz[100];printf("\n\nSadrzaj datoteke je (naopako): \n");while(fscanf(datoteka,"%c", &znak)!=EOF){if (znak==' ') {br++; j++; i=0; continue;}if (znak=='\n') {br++; niz[k]=j; j++; k++; i=0; continue;}matrix[j][i]=znak;i++;}niz[k]=j;j=0;for (i=br;i>=0;i--) {if((i==niz[k-j])&&(k-j!=-1)) { printf("\n"); j++;}printf("%s ", matrix[i]);}}

main() {// Definisanje pokazivaca na datotekuFILE *datoteka;// Otvaranje datoteke za citanjedatoteka=fopen("c:\\pismo.txt","r");// Poziv funkcije za ispis datoteke na ekran...ispis(datoteka);fclose(datoteka);// Otvaranje datoteke za citanjedatoteka=fopen("c:\\pismo.txt","r");// Poziv funkcije za prepis datoteke u novu mijenjajuci mala i velika slova.ispisunovu(datoteka);fclose(datoteka);// Otvaranje datoteke za citanjedatoteka=fopen("c:\\pismo.txt","r");/* Poziv funkcije za ispis datoteke u obrnutom redosljedu na izlaz (prvapostaje zadnja, druga postaje pretposljednja rijec...) */ispisobrnuto(datoteka);fclose(datoteka);// Otvaranje datoteke za citanjedatoteka=fopen("c:\\pismo.txt","r");/* Poziv funkcije za ispitivanje da li je neka rijec palindrom (isto znacenjekada se cita i u obrnutom smjeru) */palindrom(datoteka);fclose(datoteka);// Kraj programa...getch();return 0;}

Page 55: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

40. Napisati program koji cita više linija teksta sa ulaza ištampa koliko rijeci je duzine 2 3 4 i više slova. Štampurealizovati pomocu funkcije STAM_REZ u datoteku ili na ekranu. Izdatoteke rezultata dati izvještaj o ukupnom broju rijeci iprosjecnoj duzini rijeci.

RJEŠENJE:#include <stdio.h>

// Funkcija koja kreira datoteku sa rezultatimavoid STAM_REZ(char *tekst, int br){

// Definisanje pokazivaca na fajlFILE *rezultati;

// Definisanje varijabliint i,b=0,dva=0,tri=0,cetiri=0,vise=0, brojslova=0, prosjek=0;

// Otvaranje datoteke u koju cemo pisati podatkerezultati=fopen("c:\\rezultati.txt","w");

// For petlja vrti se "br" puta...for (i=0;i<br;i++){

/* Ukoliko znak do kojeg smo dosli nije „?“ „!“ „.“ „\n“ , „\t“ ili „blanko“brojac „b“ se uvecava za 1, brojac „b“ nam pokazuje koliko slova je u rijeciizbrojano. */if ((tekst[i]=='?')||(tekst[i]=='!')||(tekst[i]==' ')||(tekst[i]=='.')||(tekst[i]=='\n')||(tekst[i]==',')||(tekst[i]=='\t')) {

/* Nakon sto naidjemo na neki od ovih znakova u uslovu ulazimo u petlju... iimamo... ako je b>1 broj slova ce se sabrati sa brojem slova rijeci koja setrenutno obradjuje, ako je b=2 onda se varijabla dva koja broji rijeci sa 2slova uveca za 1. Ako je tri onda se varijabla tri uveca za 1... ako je preko4 onda se varijabla vise uveca za 1... primjetite da se brojac vraca na 0izlaskom iz uslova, nebitno da li je bilo b=0 ili 1 ili 2 ili ... */if (b>1) brojslova=brojslova+b;if (b==2) {dva++; b=0;} elseif (b==3) {tri++; b=0;} elseif (b==4) {cetiri++; b=0;} elseif (b>4) {vise++; b=0;} else b=0;} else b++;}

// Upis podataka u datoteku...fprintf(rezultati,"Rijeci sa 2 slova: %d\n", dva);fprintf(rezultati,"Rijeci sa 3 slova: %d\n", tri);fprintf(rezultati,"Rijeci sa 4 slova: %d\n", cetiri);fprintf(rezultati,"Rijeci sa preko 4 slova: %d\n", vise);prosjek=brojslova/(dva+tri+cetiri+vise);fprintf(rezultati,"PROSJEK: %d\n", prosjek);

Page 56: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

/* Zatvaranje datoteke i izlaz iz funkcije... „void“ funkcija ne vracanista!!! Izlaskom je sve sto se u njoj desavalo zaboravljeno, ali zato imamosve rezultate pohranjene u datoteci iz koje cemo po povratku u program citatipodatke.*/fclose(rezultati);}

// Glavni programmain(){

// Definisanje varijabliint br=0, i=0, p=0, dva, tri, cetiri, vise, prosjek;char tekst[1000];

// Definisanje pokazivaca na fajlFILE *izvjestaj;

/* Unos teksta (koristio sam while petlju koja upisuje znak po znak, a ne %skoja upisuje cijeli string odjednom, a zasto? pa jednostavno jos uvijek neznamdrugi nacin da izbjegnem situaciju kad upisete prvi razmak, a program toshvati kao kraj stringa i racuna samo da je string prva rijec, a ostalo kao daniste unjeli. Ovako se ucita sve sto unesete sa tastature, sto nam i treba. Uzadatku nije naznaceno sta ce biti prekid unosa, pa sam ja stavio tacku :) )*/printf("Unesi tekst[i], (Tacka za kraj unosa!):");while (tekst[i-1]!='.') { scanf("%c", &tekst[i]); i++; br++;}

/* Poziv funkcije u koju saljemo tekst koji smo unijeli kao i brojac „br“ kojije prebrojao broj unesenih karaktera, mogli smo i bez njega, al eto ja nekakovise volim for petlje od while petlji :) */STAM_REZ(tekst, br);

// Otvaranje datoteke za citanje i pridruzivanje pokazivacu izvjestaj.izvjestaj=fopen("c:\\rezultati.txt","r");

// Citanje podataka iz datoteke... formati isti kao pri upisu :)fscanf(izvjestaj,"Rijeci sa 2 slova: %d\n", &dva);fscanf(izvjestaj,"Rijeci sa 3 slova: %d\n", &tri);fscanf(izvjestaj,"Rijeci sa 4 slova: %d\n", &cetiri);fscanf(izvjestaj,"Rijeci sa preko 4 slova: %d\n", &vise);fscanf(izvjestaj,"PROSJEK: %d", &prosjek);

// Ispis izvjestaja na ekranu.printf("\n\nIZVJESTAJ: ");printf("\n\nUkupno rijeci: %d", dva+tri+cetiri+vise);printf("\nProsjecna duzina rijeci: %d", prosjek);

// Zatvaranje datoteke i kraj programafclose(izvjestaj);getch();return 0;}

Page 57: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

41. Program treba unjeti 2 broja i ispisati NZD... najvecizajednicki djeljilac...RJEŠENJE:#include <stdio.h>main() {// Definicija varijabliint i,a,b,min,nzd=1;// Unos dva prirodna brojaprintf("Unesi dva broja: ");scanf("%d,%d", &a, &b);// Pridruzuje se varijabli min manji od unesena 2 brojaif (a<=b) min=a; else min=b;// I se stavlja da je jednako min, i umanjuje se sve do 1... prvi broj// sa kojem uspiju podijeliti se oba broja je i NZD... izlazi se iz petlje kad// se oba broja uspiju bodijeliti...for (i=min;i>0;i--){if (((a%i)==0)&&((b%i)==0)) {nzd=i; break;}}// Ispis NZD-aprintf("\nNajveci zajednicki sadrzilac je: %d" , nzd);// Kraj programagetch();return 0;}

Page 58: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

42. Ispis sljedeceg znaka na ekranu...+++++-+++++++++---+++++++-----+++++-------+++---------+++-------+++++-----+++++++---+++++++++-+++++#include <stdio.h>main() {int k,i,j,a=11; // a predstavlja dimenzije znakafor (k=0;k<a;k++) printf("+");printf("-");for (k=0;k<a;k++) printf("+");printf("\n");for (i=1;i<a;i++){for (k=0;k<a-i;k++) printf("+");for (k=a;k>a-i;k--) printf("-");printf("-");for (k=a;k>a-i;k--) printf("-");for (k=0;k<a-i;k++) printf("+");printf("\n");}for (i=2;i<a;i++){for (k=a;k>a-i;k--) printf("+");for (k=0;k<a-i;k++) printf("-");printf("-");for (k=0;k<a-i;k++) printf("-");for (k=a;k>a-i;k--) printf("+");printf("\n");}for (k=0;k<a;k++) printf("+");printf("-");for (k=0;k<a;k++) printf("+");printf("\n");// Svaki pokusaj pojasnjenja ovog zadatka je suvisan... ovo cete ili skontatili necete :) jednostavna igra sa for petljama... pokusajte uraditi prekofunkcija :)// Kraj programagetch();return 0;}

Page 59: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

43. Unesite broj clanova niza cijelih brojeva, a zatim iclanove niza a zatim ih sortirajte od najveceg ka najmanjem iispisite sortirano na ekran.

RJEŠENJE:# include <stdio.h>main(){// Definisanje varijabliint n,i,j,niz[100],pom;// Unos broja clanova nizaprintf("\n Unesite broj clanova: "); scanf("%d", &n);/* Unos niza */for (i=0;i<n;i++){ printf("\n Unesi clan %d :", i+1); scanf("%d", &niz[i]); }/* Znaci imamo neki niz, recimo od 5 clanova: [1,3,4,2,5] i trebamo gasortirati od veceg ka manjem broju... na kraju treba izgledati [5,4,3,2,1].Pri koristenju ove metode, koristimo dvije for petlje, od kojih je jedna (po„i“ brojacu, tu samo onako radi reda) :) dok druga petlja obavlja vecinuposla. Mozete primjetiti da u uslovu stoji „i<(n-1)“ kao i „j<(n-1)“. Akopogledamo jedan niz od 5 clanova i ako bi mijenjali brojeve tako da mijanjamo,prvi i drugi clan, zatim drugi i treci, pa 3 i 4, pa 4 i 5. Znaci imamo 4izmjene iako imamo 5 clanova, i zbog toga u uslovu ide „n-1“ umjesto „n“!Znaci program radi tako da se vanjska for petlja izvrsi „n-1“ puta aunutrasnja se izvrsi „(n-1)*(n-1)“ puta... u nasem slucaju od 5 clanova, znaci16 puta. Mozda je ova metoda spora dosta jer se okrece 16 puta, sto bi semoglo smanjiti, ali zbog jednostavnosti izgleda, prvo sam uzeo ovu metodu.Dalje imamo uslov u unutrasnjoj petlji „niz[j]<niz[j+1]“ koji bi u prijevoduznacio, ako je j-ti clan manji od iduceg (j+1) onda im mijenja mjesta...Graficki desavanja pri sortiranju naseg niza izgledaju ovako (uspravnocitajte).1 - 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 53 - 1 4 4 4 3 3 3 3 3 5 5 5 4 4 4 44 - 4 1 2 2 2 2 5 5 5 3 3 3 3 3 3 32 - 2 2 1 5 5 5 2 2 2 2 2 2 2 2 2 25 - 5 5 5 1 1 1 1 1 1 1 1 1 1 1 1 1I na kraju smo dobili soritran niz... znaci 16 puta se vrtila unutrasnjapetlja po 4 puta je kretala od prvog do cetvrtog clana i vrsila izmjene pouslovu u if petlji, i na kraju rezultat mora biti sortiran niz! Da smo htjeliobrnuto da sortiramo od najmanjeg ka najvecem samo bi se promjenio znak < uuslovu u if petlji u znak > ... :) */for (i=0;i<(n-1);i++)for (j=0;j<(n-1);j++)if (niz[j]<niz[j+1]) { pom=niz[j+1]; niz[j+1]=niz[j]; niz[j]=pom; }// Ispis niza i kraj programa...printf("\n Ispis niza: ");for (i=0;i<n;i++) printf("[%d]", niz[i]);getch();return 0;}

Page 60: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

44. Zadatak br. 43. (prethodni) na drugi nacin...

RJEŠENJE:# include <stdio.h>main(){// Definisanje varijabliint n,i,j,niz[100],pom;// Unos broja clanova nizaprintf("\n Unesite broj clanova: "); scanf("%d", &n);/* Unos niza */for (i=0;i<n;i++){ printf("\n Unesi clan %d :", i+1); scanf("%d", &niz[i]); }

/* U prethodnom primjeru sam uradio zadatak metodom bubblesort, a ovaj samuradio koristeci metodu NALAZENJA NAJVECEG U NIZU/PODNIZU i stavljanje na"vrh". Znaci samo se ove for petlje razlikuju u odnosu na prethodni zadatak :)Imamo vanjsku petlju koja je identicna onoj iz prethodnog zadatka, i ona vrtiunutrasnju petlju n-1 puta. Sad, ako pogledate prethodni primjer primjetiticete na grafickom prikazu da nekoliko puta su se vrtile for petlje ali je nizostajao isti. Ovom metodom cemo izbjeci to, i uciniti da program radi josbrze. Znaci svakim novim prolaskom kroz vanjsku petlju se PODNIZ unutarunutrasnje petlje umanji za 1, i time dobijamo na vremenu. Ovo je malo tezeobjasniti :) pa pogledajte graficki prikaz:

1 - 3 4 4 5 5 5 5 5 5 53 - 1 1 1 1 3 3 4 4 4 44 - 4 3 3 3 1 1 1 2 3 32 - 2 2 2 2 2 2 2 1 1 25 - 5 5 5 4 4 4 3 3 2 1

Vidite kako smo dosli do rezultata uz samo 11 permutacija, naspram onih 16 izprvog primjera. Znaci u prvom dijelu ovog grafickog prikaza, nadjen je najvecibroj niza i stavljen na vrh (broj 5). U drugom dijelu (primjetite da smosmanjili broj okretanja sa 4 na 3 jer nas vise broj na vrhu ne interesuje, isamo od preostalog niza od 4 clana trazimo najveci i stavljamo na vrh... itako do kraja. */

for (i=0;i<(n-1);i++)for (j=i+1;j<n;j++)if (niz[j]>niz[i]){pom=niz[i];niz[i]=niz[j];niz[j]=pom;}

// Ispis niza i kraj programa...printf("\n Ispis niza: ");for (i=0;i<n;i++) printf("[%d]", niz[i]);

getch();return 0;}

Page 61: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

45. Unosi se sa ulaza broj clanova. Zatim se unese IME, PREZIMEi broj bodova svakog clana. Na izlazu treba ispisati clanovesortirane po broju bodova.RJEŠENJE:# include <stdio.h>// Definisanje strukturestruct struktura {char ime[100];char prezime[100];int bodovi;};

main(){// Definisanje varijabliint n,i,j;struct struktura spisak[100];struct struktura pom;// Unos broja clanova nizaprintf("\n Unesite broj imena: "); scanf("%d", &n);/* Unos imena, prezimena, bodova i direktan upis u strukturu*/for (i=0;i<n;i++){ printf("\n Unesi %d ime:", i+1); scanf("%s", &spisak[i].ime); printf(" i prezime:"); scanf("%s", &spisak[i].prezime); printf(" i bodove:"); scanf("%d", &spisak[i].bodovi); }/* Proces sortiranja */for(i=0;i<(n-1);i++)for(j=0;j<(n-1);j++)if (spisak[j].bodovi<spisak[j+1].bodovi){pom=spisak[j];spisak[j]=spisak[j+1];spisak[j+1]=pom;}// Ispis niza i kraj programa...for (i=0;i<n;i++) printf("\n%d. [%s %s]: %d", i+1, spisak[i].prezime,spisak[i].ime, spisak[i].bodovi);

getch();return 0;}

Page 62: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

... Zadaci iz Cpp-a ...

Page 63: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

46. Napisati program u cpp-u, koji sa ulaza prima dva cijelabroja, a kao rezultat daje zbir, razliku, proizvod i kolicnik.RJEŠENJE:// Dva jednostavnija programa za pocetak, da se osjeti razlika c-a i cpp-a.// Komentar iz cpp-a, 2 kose crte na pocetku svakog reda.../* Komentar iz c-a... moze se koristiti i u cpp-u */// U cpp-u se biblioteke iz c-a zapisuju na sljedeci nacin...// u c-u: #include <stdio.h>// u cpp-u: #include <cstdio> ili #include <cmath>// znaci ispred biblioteke se doda slovo "c", a nastavak ".h" brisemo...// Glavna bibilioteka cpp-a, kao stdio.h u c-u...# include <iostream>

using namespace std;

// Ova linija je kao i u c-u, osim sto uvijek moramo stavljati tip funkcije,// u ovom slucaju "int" ispred, ako ne navedemo, program nece raditi... :)int main() {

// Definisanje varijabli (isto kao i u c-u, barem za sada ;) )...int a,b;

// Funkcija za ispis na ekranu (ne samo ekranu, ali ce nam uglavnom za to// koristiti, barem u pocetku... poput printf() u c-u)// "<<" - citaj, salji na (ekran), primjetite da nema zagrada kao u c-u// Moguce je i nadovezivanje vise znakova "<<"...// "endl" - prijelaz u novi red, kao "\n" iz c-a, mada mozemo i dalje// koristiti "\n" ali ako zelimo program cisto u duhu cpp-a onda cemo// od sada na dalje i ubuduce koristiti endl... ;)cout << "Unesite dva cijela broja: " << endl;

// Funkcija za unos podataka (kao scanf() u c-u)...// ">>" - citaj, salji u (program), unos je mnogo jednostavniji od onog iz c-a// u cpp-u smo postedjeni navodnika, definisanja tipova podataka, i znaka & :)cin >> a >> b;

// Ispis zbira, razlike, proizvoda i kolicnika na ekran (sve su „integeri“// osim kolicnika, koji je realan (double))...cout << "Zbir brojeva je:"<< a + b << ", razlika: "<< a - b << ", proizvod: " << a * b << ", kolicnik: " << (double)a/b << endl;

// Na ovu funkciju "ignore" se naviknite, ako zelite da vidite ipak na ekranu// rezultat, jer ako navedete samo getchar(), nece ici bas najbolje, nemorate// staviti 999, moze i neki drugi broj ;)cin.ignore(999, '\n');

// Kao getch() u c-u, cekanje da se unese neki znak sa tastature...getchar();// Vraca se 0 iz main funkcije (onako radi reda ;) )...return 0;// Kraj programa...}

Page 64: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

47. Napisati program koji ce ispisati na ekranu zeljeni brojtackica, broj tackica se unosi na ulazu...

RJEŠENJE:// Ukljucivanje bibilioteke u program#include <iostream>

using namespace std;

// Definisanje glavne funkcije programaint main(){

// Definisanje varijabliint dots;

// Ispis odgovarajuce poruke na ekranucout << "Koliko tackica zelite: ";

// Beskonacna for petlja, prekinut cemo je sa funkcijom break...for(;;) {

// Unos broja...cin >> dots;

// Ukoliko je unesena vrijednost broj izlazi se iz for petlje// u suprotnom se ispisuje odgovarajuca poruka, brise ulazni bufer// i znakovi upisani u bufer i ponovo se unosi broj...if(cin) break;cout << "Ne zafrkajite se :P, unesite broj: " << endl;cin.clear();cin.ignore(10000, '\n');}

// Nakon sto se unese ispravan broj, ispis poruke na ekran...cout << dots << " tackica, samo za vas :) -->" << endl;

// I nakon poruke, jos ispis tackica...for(int brojac=0;brojac<dots;brojac++) cout << ".";

// Brisanje ulaznog bufera i kraj programa...cin.ignore(1000, '\n');getchar();return 0;}

// P.S. Zadatak se moze rijesiti na 1000000... nacina... probajte drugacije ;)

Page 65: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

48. Jedan simpatican ;) program na kojem mozete uociti nacinformatiranja teksta u cpp-u. Program treba na ekranu ispisatisljedeci znak:

*** *** * * * * * * * * * * * * *

* * * * * * **

RJEŠENJE:/* Ukljucicanje biblioteka, biblioteka iomanip je unesena jer se u njoj nalazifunkcija za formatiranje teksta setw()*/#include <iostream>#include <iomanip>

using namespace std;

int main(){

// Ispis 5 praznih redova, da bismo odmaknuli znak malo od vrha ekranacout << endl << endl << endl << endl;

/* Ispis prvog dijela znaka, prvo je ostavljeno 35 praznih mjesta a zatim suispisane 3 zvjezdice, pa opet 7 praznih mjesta pa 3 zvjezdice*/cout << setw(35) << "***" << setw(7) << "***" << endl;

// Odmicanje kursora od pocetka ekrana za 32 mjesta, na drugi nacin ;)cout.width(32);cout << "*" << setw(4) << "*" << setw(3) << "*" << setw(4) << "*" << endl;cout.width(32);cout << "*" << setw(5) << "*" << setw(1) << "*" << setw(5) << "*" << endl;cout.width(33);cout << "*" << setw(9) << "*" << endl;cout.width(34);cout << "*" << setw(7) << "*" << endl;cout.width(35);cout << "*" << setw(5) << "*" << endl;cout.width(36);cout << "*" << setw(3) << "*" << endl;cout.width(37);cout << "*" << setw(1) << "*" << endl;

// I dobili smo na kraju... simbol... of love...getchar();return 0;}

Page 66: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

49. Sa ulaza se unose dimenzije 2 vektora (iste dimenzije), azatim se izracuna treci vektor koji predstavlja zbir (prvi clanprvog vektora plus prvi clan drugog vektora...) dva unesenavektora.RJEŠENJE:// Pocetak programa, i ukljucivanje biblioteka u program#include <iostream>#include <vector>

using namespace std;

int main(){

/* Definisanje varijabli (trebalo bi ici ovo tek kad se koristi varijabla uprogramu, ali ja ovako naviko :) */vector<int> a(100), b(100), c;int broj;

// Unos dimenzija vektoracout << "Unesi broj elemenata vektora [1-100]: ";cin >> broj;

// Unos elemenata prvog vektoracout << "Unesi elemente prvog vektora: " << endl;for(int i=0; i<broj; i++){cin >> a[i];}

// Unos elemenata drugog vektoracout << "Unesi elemente drugog vektora: " << endl;for(int i=0; i<broj; i++){cin >> b[i];}

/* Racunanje treceg vektora, tako sto se sabiraju odgovarajuci elementi,vektora a i b... */for(int i = 0; i < a.size(); i++) c.push_back(a[i] + b[i]);

// Ispis vektora c...cout << "\"Zbir\" vektora je vektor: (";for(int i=0; i<broj; i++) cout << c[i] << ", ";cout << ")";

// Kraj programa...cin.ignore(9999, '\n');getchar();return 0;}

Page 67: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

50. Rijesiti zadatak 49. preko funkcija...

RJEŠENJE:#include <iostream>#include <vector>

using namespace std;

/* Funkcija unos() koja prima dimenziju vektora, a kao rezultat vraca vektortrazenih dimenzija, ciji ce clanovi unesu sa tastature */vector<int> unos(int broj){vector<int> vrati(broj);cout << endl << "Unesi elemente vektora: " << endl;for(int i=0; i<broj; i++) cin >> vrati[i];return vrati;}

/*Funkcija saberi() koja prima dva vektora, a vraca treci vektor kojipredstavlja zbir ta dva vektora */vector<int> saberi(vector<int> a, vector<int> b){vector<int> c;for(int i = 0; i < a.size(); i++) c.push_back(a[i] + b[i]);return c;}

/* Funkcija ispis() koja prima vektor koji ispisuje se na ekranu */void ispis(vector<int> a){cout << "\"Zbir\" vektora je vektor: (";for(int i=0; i<a.size(); i++) cout << a[i] << ", ";cout << ")";}

int main(){

// Unos dimenzije vektoracout << "Unesi broj elemenata vektora [1-100]: ";int broj;cin >> broj;

// Unos dva vektora "a" i "b"...vector<int> a=unos(broj);vector<int> b=unos(broj);

// Sabiranje vektora "a" i "b"vector<int> c=saberi(a,b);

// Ispis vektora c...ispis(c);

// Kraj programacin.ignore(9999, '\n');getchar();return 0;}

Page 68: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

51. Napisati program koji racuna sumu trocifrenih prirodnihbrojeva, kojima je zadnja cifra 2 puta veca od prve cifre.Rezultat ispisati na ekran.RJEŠENJE:#include <iostream>

using namespace std;

main(){

// Ispis poruke "Brojim..." :)cout << "Brojim... :)" << endl;

// Definisanje varijable "suma" tipa int...int suma=0;

/* Trostruka petlja, i se vrti od 0 do 9 i predstavlja cifru stotica, j seisto vrti od 0 do 9 i predstavlja cifru desetica, a k predstavlja cifrujedinica. Kada je uslov u trecoj for petlji zadovoljen tada se "suma" uvecavaza taj broj, ako nije zadovoljen prelazi se na iduci broj. */for (int i=1;i<10;i++)for (int j=0;j<10;j++)for (int k=0;k<10;k++) {if ((k>2*i)) suma=suma+(i*100+j*10+k);

}// Ispis sume na ekranu...cout << "Suma je:" << suma << endl;getchar();return 0;}

Page 69: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

52. Napisati program koji ucitani tekst štampa naopako. Tekstse ucitava s tastature sve do znaka za novi red.

RJEŠENJE:#include<iostream>#include<cstring>

using namespace std;

int main(){

// Ispis poruke "Unesite tekst"...cout << "Unesite tekst: ";

// Definisanje i unos teksta koristeci funkciju getc() iz biblioteke "cstring"char tekst[100];gets(tekst);

// Pridruzivanje duzine teksta varijabli "duzina", pomocu funkcije strlen()...int duzina=strlen(tekst);

// Ispis teksta "slovo po slovo" krenuvsi sa kraja niza tekst[]...for(int i=duzina-1;i>=0;i--) cout << tekst[i];

// Kraj programagetchar();return 0;}

Page 70: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

53. Napisati program koji ce izracunati ekvivalentnu otpornostparalelno vezanih otpornika.

RJEŠENJE:#include <iostream>#include <vector>

using namespace std;

/* Funkcija otpornici() koja prima broj otpornika, a kao rezultat vracavektor, koji sadrzi vrijednosti svih otpornika */vector<int> unos(int broj){vector<int> vrati(broj);cout << endl << "Unesi vrijednosti otpornika: " << endl;for(int i=0; i<broj; i++) {cout << "Otpor: [" << i+1 << "]" << endl;cin >> vrati[i];}return vrati;}

/* Funkcija izracunaj() koja prima vektor koji sadrzi vrijednosti otpornika avraca vrijednost ekvivalentnog otpora */float izracunaj(vector<int> a){float suma;for(int i=0; i<a.size(); i++) {suma=suma+1./a[i];}return suma=1./suma;}

int main(){

// Unos broja otpornikacout << "Unesi broj otpornika: ";int broj;cin >> broj;

// Unos vrijednosti otpornikavector<int> otpornici=unos(broj);

// Ispis ekvivalentnog otporacout << "Ekvivalentni otpor je: " << izracunaj(otpornici) << endl;

// Kraj programacin.ignore(9999, '\n');getchar();return 0;}

Page 71: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

54. Napišite funkciju “UnesiBroj” bez parametara, koja odkorisnika ocekuje da unese neki realni broj. Ukoliko je zaistaunesen realan broj, funkcija treba da ga vrati kao rezultat izfunkcije. Ukoliko nije unesen broj, funkcija treba ispisati“Neispravan unos. Molimo, pokušajte ponovo.” i ponovo trazitibroj, sve dok se zaista ne unese ispravan broj (prema tome,funkcija ne završava dok se ne unese ispravan broj). Napisanufunkciju iskoristite u programu koji trazi da se unesukoeficijenti a, b i c linearne jednacine ax + b = c, a koji zatimnalazi i ispisuje njeno rješenje, pod uvjetom da ono postoji, iliodgovarajucu poruku u suprotnom.

RJEŠENJE:# include <iostream>

using namespace std;

// Funkcija za unos brojadouble Unesibroj(){// Definisanje broja tipa doubledouble broj;// Beskonacna for petljafor(;;) {cout << endl << "Unesite realan broj: ";cin >> broj;// Prekid for petlje kada se unese realan brojif(cin) break;// Ispis poruke, ako unos nije ispravancout << "Neispravan unos. Molimo, pokusajte ponovo.";// Praznjenje buferacin.clear();cin.ignore(10000, '\n');}// Vracanje broja iz funkcijereturn broj;}

int main(){

// Unos brojevadouble a=Unesibroj();double b=Unesibroj();double c=Unesibroj();// Racunanje vrijednosti xdouble x=(c-b)/a;// Ispis rjesenjaif (a==0) cout << "Jednacina nema rjesenja" << endl;else cout << "Rjesenje jednacine je: " << x << endl;

// Kraj programagetchar();return 0;}

Page 72: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

55. Napišite program koji trazi da se sa tastature unese jedankompleksan broj z i dva realna broja x i y, a koji zatim racuna iispisuje vrijednost izraza:

RJEŠENJE:# include <iostream># include <complex>

using namespace std;

int main(){

// Definisanje varijablicomplex<double> z;double x, y;

// Unos kompleksnog brojacout << "Unesi komleksan broj z: " << endl;cin >> z;

// Unos dva realna brojacout << "Unesi dva realna broja: " << endl;cin >> x >> y;

// Ispis rezultatacout << "Vrijednost izraza: " << pow(x+((z*z*complex<double>(2, 3))/(complex<double>(x, -y))),3) << endl;

// Kraj programagetchar();return 0;}

Page 73: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

56. Napraviti program za rješavanje kvadratne jednacine kojikoristi kompleksne promjenljive. Pri tome, rješenja ciji jeimaginarni dio jednak nuli treba ispisati tako da se ispisujucisto kao realni brojevi, a ne kao uredjeni parovi realnihbrojeva.

RJEŠENJE:#include <iostream>#include <cmath>#include <complex>

using namespace std;

int main() {

// Definisanje i ucitavanje varijablicomplex<double> a, b, c;cout << "Unesi koeficijente:\n";cin >> a >> b >> c;

// Racunanje diskriminantecomplex<double> d=b*b-complex<double>(4,0)*a*c;

// Racunanje x1 i x2complex<double>x1 = (-b-sqrt(complex<double>(d)))/(complex<double>(2,0)*a);complex<double>x2 = (-b+sqrt(complex<double>(d)))/(complex<double>(2,0)*a);

/* Ako nema imaginarnog dijela onda ide dio u „if“ petlji, u suprotnom ide„else“ dio */if (imag(x1)!=0&&imag(x2)!=0) cout << "x1 = " << x1 << "\nx2 = " << x2 <<endl; else {if (imag(x1)==0) cout << "x1 = " << real(x1) << endl;if (imag(x2)==0) cout << "x2 = " << real(x2) << endl;}

// Kraj programagetchar();return 0;}

Page 74: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

57. Napišite program koji trazi da se prvo unese prirodan broj“n”, a nakon toga elementi vektora “a” koji ima “n” cjelobrojnihelemenata. Zatim, program treba da kreira dva nova vektora “b” i“c”, i da u vektor “b” prepiše sve parne brojeve iz vektora “a”,a u vektor “c” sve neparne brojeve iz vektora “a”. Konacno,program treba da u jednom redu ispiše elemente vektora “b”, a udrugom redu elemente vektora “c”. Brojevi trebaju biti medjusobnorazdvojeni zarezom, pri cemu iza posljednjeg broja u svakom redune treba da bude zarez.

RJEŠENJE:#include <iostream>#include <vector>

using namespace std;

int main() {

// Definisanje varijabli...int n;vector<int> a, b, c;

// Unos prirodnog broja n...cout << "Unesite prirodan broj \"n\": ";cin >> n;

// Unos clanova vektora a...for (int i=0;i<n;i++) {int upisi;cout << "Unesi " << i+1 << " clan: ";cin >> upisi;a.push_back(upisi);}

// Kreiranje vektora b i c od vektora a...for(int i=0;i<n;i++) if (a[i]%2==0) b.push_back(a[i]); else c.push_back(a[i]);

// Ispis vektora na ekranuif (b.size()>0) cout << "Ispis vektora b: " << endl;for (int i=0;i<b.size();i++) if (i!=(b.size()-1)) cout << b[i] << ", ";else cout << b[i] << endl;

if (c.size()>0) cout << "Ispis vektora c: " << endl;for (int i=0;i<c.size();i++) if (i!=(c.size()-1)) cout << c[i] << ", ";else cout << c[i] << endl;

// Kraj programagetchar();return 0;}

Page 75: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

58. Koristeci tip podataka “string“ definiran u istoimenojstandardnoj biblioteci, napišite program koji trazi da se satastature unesu dvije recenice, a zatim na ekranu ispisuje kolikosvaka od recenica sadrzi znakova, koja od ove dvije recenicedolazi prije po abecednom poretku, kao i recenicu koja se sastojiod ove dvije recenice sastavljene zajedno. Takodjer, ispišiteprvu od ove dvije recenice u obrnutom poretku (od kraja kapocetku). Pri tome, za tu svrhu koristite operacije koje supodrzane za tip podataka “string”.

RJEŠENJE:# include <iostream># include <string>

using namespace std;

main(){

// Definisanje dva stringastring rec1, rec2;

// Unos dva stringacout << "Unesi prvu recenicu: ";getline(cin, rec1);cout << "Unesi drugu recenicu: ";getline(cin, rec2);

// Ispis broja znakova prve i druge recenicecout << "Prva recenica sadrzi: " << rec1.length() << " znakova..." << endl;cout << "Druga recenica sadrzi: " << rec2.length() << " znakova..." << endl;

// Ispis recenica po abecednom reduif (rec1<rec2) cout << "1: " << rec1 << endl << "2: " << rec2;else cout << "1: " << rec2 << endl << "2: " << rec1;

// Sastavljanje prve i druge recenice u jednucout << endl << "Zajedno: " << rec1 + " " + rec2;

// Ispis prve recenice naopakocout << endl << "Prva naopako: ";for(int i=rec1.length()-1;i>=0;i--) cout << rec1[i];

// Kraj programacout << endl;getchar();return 0;}

Page 76: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

59. Napišite funkciju koja racuna vrijednost funkcije f(x, n)definirane sljedecim izrazom, pri cemu su x i n realni argumenti:

U slucaju da funkcija nije definirana, ona treba da baciizuzetak. To se moze desiti u tri slucaja: ako n nije prirodanbroj ili nula (tada suma nema smisla), zatim ukoliko se podkorijenom pojavi negativan broj, i konacno, ukoliko nazivnikdobije vrijednost nula. Za svaki od ova tri slucaja treba bacitirazlicite tipove izuzetaka. Funkciju testirajte u glavnomprogramu koji u beskonacnoj petlji trazi da se sa tastature unosevrijednosti argumenata x i n, a koji potom ispisuje vrijednostfunkcije ili odgovarajucu poruku o greški (na osnovu bacenogizuzetka). Pri testiranju obavezno pronadjite takve vrijednostiargumenata za koje ce se desiti svaki od tri moguca izuzetka.

RJEŠENJE:# include <iostream># include <cmath>

using namespace std;

double racunaj(double x, double n){

// y je konacna suma, na pocetku je 0...double y=0;

// Ako je n<=0 baca se izuzetakif (n<=0) throw "Greska: n mora biti vece od 0...";

// Racunanje sumefor (double i=0; i<=n; i++){

// Ako je podkorjen negativan baca se izuzetakif (x*(x+i)-(pow(-1,i)*i*i)<0) throw "Greska: Korjen iz negativnog broja...";

// Ako je nazivnik nula baca se izuzetakif (sqrt(x*(x+i)-pow(-1,i)*i*i)==0) throw "Greska: Nazivnik nemoze bitinula...";

// Formulay+=(pow(x,i))/sqrt(x*(x+i)-pow(-1,i)*i*i);}

// Vracanje rezultatareturn y;}

Page 77: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

main(){

// Try blok...try{

// Definisanje varijabli i unos varijablidouble x,n;cout << "Unesite n: "; cin >> n;cout << "Unesite x: "; cin >> x;

// Ispis rezultata uz poziv funkcijecout << endl << "Rezultat je: " << racunaj(x,n);}

// Catch blok, hvata baceni izuzetak i ispisuje error poruku...catch(const char poruka[]) {cout << endl << poruka << endl;}

// Kraj programacout << endl;getchar();return 0;}

Page 78: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

60.(*) Napisati program koji simulira Paint. Rad u konzoli.Jedan piksel predstavlja jedan znak '*'. Kursor koji crta poekranu krece se pomocu strelica. Boja piksela se mijenja pomocutipke ENTER. A gumicu ukljucujemo na tipku SPACE. Program ima zacilj podsjetiti korisnike C++ da se i u C++ moze formatirati iuljepsavati tekst. Poenta zadatka je razmotriti funkcije zalociranje kursora na odredjenu poziciju na ekranu kao i funkcijuza mijenjanje boje teksta.

RJEŠENJE:// Ovaj program je sa zvjezdicom, nije tezak, ali su ukljucene neke funkcijeza koje mozda nikada necete ni cuti, i namijenjen je onima kojima nedostajuneke komande iz PASCALA, kao LOCATE i TEXTCOLOR ;)

#include <iostream>#include <windows.h> // ukljuceno zbog funkcija za rad sa bojom i kordinatama#include <conio.h> // ukljuceno zbog funkcije kbhit()

using namespace std;

/* Funkcija koja mijenja boju teksta. Prima broj veci od 0. Svaki brojpredstavlja neku boju. Npr. 0 = crna, 12=crvena, 10=zelena, 9=plava... ... */void PromjeniBoju(int boja){

// ovo za sad samo zapamtite ;)HANDLE Konzola = GetStdHandle(STD_OUTPUT_HANDLE);// Promjena boje teksta u boju 'boja' koju je funkcija primila...SetConsoleTextAttribute(Konzola, boja);

}

/* Funkcija koja prima kordinate kursora tipa COORD, i postavlja kursor na tupoziciju */void LocirajKursor(COORD kordinate){

HANDLE Konzola = GetStdHandle(STD_OUTPUT_HANDLE);// Postavljanje pozicije kursora na poziciju 'kordinate' koju jefunkcija primila...SetConsoleCursorPosition(Konzola,kordinate);

}

int main(){// Definisanje koordinata tipa COORD...COORD kordinate;// Definisanje varijable boja i postavljanje na vrijednost 10(svijetlo-zelena)int boja=10;// Poziva se funkcija PromjeniBoju() koja ce promjeniti boju teksta u zelenuPromjeniBoju(10);// Postavljanje koordinata kurosora na poziciju (0,0)...kordinate.X = 0; kordinate.Y = 0;// Poziv funkcije koja ce locirati kursor...LocirajKursor(kordinate);

Page 79: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Ispis LEGENDE programacout << "Strelicama se pomjera zvjezdica... Izlaz -->> ESC";kordinate.X = 0; kordinate.Y = 1;LocirajKursor(kordinate);PromjeniBoju(9);cout << "Enter mijenja boju zvjezdice...";kordinate.X = 0; kordinate.Y = 2;LocirajKursor(kordinate);PromjeniBoju(12);cout << "Space ukljucuje gumicu, iskljucuje se na ENTER...";

// Kursor se postavlja na poziciju (40,10) i tu se printa '*'kordinate.X = 40; kordinate.Y = 10;LocirajKursor(kordinate);cout << "*";

/* Poziv beskonacne petlje u okviru koje se i izvrsava cio program, petlja semoze normalnim putem prekinuti samo pritiskom na tipku ESC, koja predstavljaizlaz iz programa */for(;;)// Provjera da li je pritisnuta neka tipka na tastaturi

if (kbhit() != 0){// Ako je pritisnuka tipka, pridruzivanje ASCII koda tipke varijabli 'c'char c = getch();if (c==(00,72)) kordinate.Y-=1; // (00,72) ASCII kod strelice gore...if (c==(00,75)) kordinate.X-=1; // (00,75) ASCII kod strelice lijevo...if (c==(00,80)) kordinate.Y+=1; // (00,80) ASCII kod strelice dole...if (c==(00,77)) kordinate.X+=1; // (00,77) ASCII kod strelice desno...

/* Kako bismo onemogucili "izlijetanje" zvjezdice van okvira ekrana,uvodimo sljedece restrikcije */if (kordinate.X==0) kordinate.X=1;if (kordinate.X==79) kordinate.X=78;if (kordinate.Y==3) kordinate.Y=4;if (kordinate.Y==50) kordinate.Y=49;

// Ako se pritisne tipka SPACE (32) boja se postavlja na 0 (crna)if (c==32) boja=0;

// Ako se pritisne tipka ESC (27) izlazi se iz programaif (c==27){

system("cls"); // Brisanje ekranaboja=0; // Postavljanje boje na 0 (crna)

// Beskonacna for petlja koja se prekida bilo kojom tipkom...for(;;){

if (kbhit() != 0) return 0;

// Poruke na izlazukordinate.X = 30; kordinate.Y = 14;LocirajKursor(kordinate);PromjeniBoju(boja);cout << "Autor: Murtic Nirmel";kordinate.X = 26; kordinate.Y = 15;LocirajKursor(kordinate);PromjeniBoju(boja);cout << "Email: [email protected]";

Page 80: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Naizmjenicna izmjena boja, daje simpatican efekat ;)boja++;if (boja==12) boja=0;

}}

// Ako se pritisne tipka ENTER boja se umanjuje za 1...if (c==13) boja-=1;

// Ako je boja manja od 0, vraca se na 12...if (boja<0) boja=12;

// Lokacija kursora, promjena boje i printanje zvjezdice...LocirajKursor(kordinate);PromjeniBoju(boja);cout << "*";}

/* Ako nije pritisnuta tipka, printa se zvjezdica... ako se pitate zasto ovajdio uopste postoji, pa samo zato da bi kursor „treptio“ u suprotnom, kadabrisemo nebismo vidjeli na kojoj je poziciji kursor ;) */else

{LocirajKursor(kordinate);cout << "*";

}

// Kraj programa, do ovoga se nemoze doci, barem ne normalnim putem... ;)return 0;}

Page 81: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

61. Napišite dvije preklopljene verzije funkcije“RadijaniUStepene” koje pretvaraju radijane u stepene. Prvaverzija prihvata dva realna parametra “alfa“ i “stepeni”, dokdruga verzija prihvata cetiri parametra nazvana “alfa”,“stepeni”, “minute“ i “sekunde”, od kojih je prvi realan a ostalicjelobrojni. U oba slucaja prvi parametar predstavlja neki ugao uradijanima. Prva verzija funkcije treba da pretvori tu vrijednostu stepene (kao realan broj) i smjesti pretvorenu vrijednost udrugi parametar. Druga verzija funkcije treba da pretvorivrijednost ugla u stepene, minute i sekunde i da smjestipretvorenu vrijednost redom u drugi, treci i cetvrti parametar.Na primjer, ukoliko se izvrse naredbe:RadijaniUStepene(1.326, s);RadijaniUStepene(1.326, x, y, z);u promjenljive “s”, “x”, “y” i “z” (pod pretpostavkom da suispravno deklarirane) treba da se smjeste brojevi 75.9742, 75, 58i 27, jer je 1.326 rad = 75.9742○ = 75○ 58' 27". Napišite ikratku glavnu funkciju (“main”) u kojoj cete demonstriratinapisanu funkciju.

RJEŠENJE:# include <iostream>

using namespace std;

/* Prima realan broj alfa, i stvara se referenca &stepeni na s koji jenedefinisan u startu, ali u funkciji dobije neku vrijednost preko reference */void RadijaniUStepene(double alfa, double &stepeni) { stepeni=alfa/3.1415*180.; }

/* Prima realan broj alga, i stvaraju se 3 reference preko kojih dobijemovrijednosti za stepene, minute i sekunde, vrijednosti se pamte i zapisuju uvarijable koje su poslate i u jednoj i u drugoj funkciji jer promjenareference unutar funkcije mijenja i varijablu van funkcije na koju je stvorenareferenca*/void RadijaniUStepene(double alfa, int &stepeni, int &minute, int &sekunde){

double pom; RadijaniUStepene(alfa,pom); stepeni=int(pom); pom=pom-stepeni; pom=pom*60; minute=int(pom); pom=pom-minute; sekunde=int(pom*60);}

Page 82: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){// Tri cijela broja x,y,z (stepeni, minute, sekunde respektivno)int x,y,z;// Dva realna broja (ugao i stepeni respektivno)double r,s;// Unos uglacout << "Unesi x: "; cin >> r;// Funkcija koja "vraca" samo stepene i to u realnom oblikuRadijaniUStepene(r, s);// Funkcija koja vraca stepene, minute, sekunde u cjelobrojnom oblikuRadijaniUStepene(r, x, y, z);// Ispis stepeni u realnom oblikucout << "Stepeni: " << s << endl;// Ispis stepeni, minuta, sekundi u cjelobrojnom oblikucout << "Stepeni: " << x << ", minute:" << y << ", sekunde: " << z << endl;// Kraj programagetchar();return 0;}

Page 83: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

62. Napišite genericku funkciju “UnosBroja” sa tri parametra.Funkcija treba da omoguci pouzdano unošenje brojeva u program, uzpotpunu kontrolu grešaka pri unosu. Prvi i drugi parametar sutipa “string”. Pri tome, prvi parametar predstavlja tekst koji seispisuje korisniku kao obavijest da treba unijeti broj (prompt),dok drugi parametar predstavlja tekst koji se ispisuje korisnikukao upozorenje u slucaju da unos nije ispravan. Treci parametarje referenca na proizvolji numericki tip, a predstavljapromjenljivu u koju ce se smjestiti uneseni broj. Na primjer,funkcija se moze pozvati na sljedeci nacin:UnosBroja("Unesi prvi broj: ", "Neispravan unos!\n", prvi_broj);Funkcija treba da trazi unos od korisnika sve dok unos ne budeispravan. Napisanu funkciju demonstrirajte u testnom programukoji od korisnika trazi da unese realni broj x i cijeli broj n, azatim racuna i ispisuje vrijednost stepena xn.

RJEŠENJE:# include <iostream># include <cmath># include <string>

using namespace std;/* Genericka funkcija, u zavisnosti od tipa treceg parametra koji je poslat ufunkciju zavisi i koji to tip predstavlja tip 'tip' */template<typename tip>/* Primaju se dva stringa p1 i p2 i referenca na treci parametar pri pozivufunkcije tipa 'tip' */void UnosBroja(string p1, string p2, tip &t){

for (;;){ cout << p1; cin >> t; // Ispis poruke i unos broja/* Ako je pravilan unos prekida se funkcija, referenca se promjenila, mijenjase i treci parametar funkcije koristen pri pozivu */

if (cin) break;// Ako nije ispravan unos printa se greska i cisti buffer i ponavlja se proces cout << p2; cin.clear(); cin.ignore(10000, '\n');}}int main(){// Definisanje cijelog i realnog broja

int prvi_broj;double drugi_broj;

/* Poziv funkcije sa doticnim parametrima, jednom kao treci parametar ide ciobroj a drugi put realan */ UnosBroja("unesi prvi broj: ", "Neispravan unos!\n", prvi_broj); UnosBroja("unesi drugi broj: ", "Neispravan unos!\n", drugi_broj);// Ispis rezultata na osnovu dobijenih podataka cout << "Rezultat: " << pow(prvi_broj,drugi_broj) << endl;// Kraj programagetchar();return 0;}

Page 84: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

63. Napišite genericku funkciju “BrojZajednickih” sa cetiriparametra “niz1”, “n1”, “niz2” i “n2”. Parametri “niz1“ i “niz2“su klasicni nizovi (ne vektori) proizvoljnog ali istog tipaelemenata (tj. tip elemenata u oba niza je isti), a “n1“ i “n2“predstavljaju brojeve elemenata u tim nizovima respektivno.Funkcija treba da kao rezultat vrati broj elemenata koji sejavljaju kao zajednicki elementi i u jednom i u drugom nizu (radijednostavnosti, podrazumijevati da nizovi ne sadrze elemente kojise ponavljaju). Na primjer, neka su date sljedece deklaracije:int a[5] = {3, 7, 2, 1, 5};int b[6] = {4, 6, 7, 8, 1, 3};Tada sljedeca naredba:cout << Zajednicki(a, 5, b, 6);treba da ispiše broj 3, jer se tri elementa (3, 7 i 1) pojavljujuu oba niza. Napišite i kratki testni program u kojem cetedemonstrirati napisanu funkciju.

RJEŠENJE:# include <iostream>

using namespace std;

/* Genericka funkcija u kojoj je definisan tip kao sto je tip varijable kojase salje u funkciju */template<typename tip>int BrojZajednickih(tip niz1, int n1, tip niz2, int n2){/* 'br' je brojac, na pocetku 0, kada bude i-ti clan prvog niza jednak bilokojem (citaj j-tom) clanu drugog niza, tada se br uvecava za 1*/int br=0;for (int i=0;i<n1;i++) for (int j=0;j<n2;j++) if (niz1[i]==niz2[j]) br++;// Vracanje brojacareturn br;}int main(){// Definisanje duzina nizova i njihov unosint n1, n2;cout << "Unesi duzinu prvog niza: "; cin >> n1;cout << "Unesi duzinu drugog niza: "; cin >> n2;// Definisanje nizova i njihov unosint niz1[n1], niz2[n2];cout << "Unesi clanove prvog niza: " << endl;for (int i=0; i<n1; i++){ cout << i+1 << ": "; cin >> niz1[i]; }cout << "Unesi clanove drugog niza: " << endl;for (int i=0; i<n2; i++){ cout << i+1 << ": "; cin >> niz2[i]; }// Ispis rezultata uz poziv funkcijecout << "Broj istih elemenata" << BrojZajednickih(niz1,n1,niz2,n2) << endl;// Kraj programagetchar();return 0;}

Page 85: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

64. Napišite genericku funkciju “Izvrni“ sa jednim parametrom,koji predstavlja vektor elemenata proizvoljnog tipa. Funkcijatreba da ispremješta elemente vektora tako da prvi elementpostane posljednji, a posljednji prvi. Na primjer, ukoliko se uglavnom programu izvrši sekvenca naredbi:

vector<int> a(5)a[0] = 3; a[1] = 5; a[2] = 6; a[3] = 1; a[4] = 2;Izvrni(a, 5);for(int i = 0; i < 5; i++) cout << a[i] << " ";

ispis na ekranu treba da bude “2 1 6 5 3”. Funkcija treba da buderealizirana da vrši premještanje “u mjestu”, odnosno da nekoristi nikakav pomocni vektor osim vektora prenesenog kaoparametar (uputa: razmijenite prvi element sa posljednjim, drugisa pretposljednjim, itd.). Napišite i kratki glavni program ukojoj cete demonstrirati napisanu funkciju na sekvenci brojevakoji se unose sa tastature.

Oprez: funkcija izvrni ne smije sama po sebi ništa da ispisuje naekran. Njeno dejstvo treba samo da bude izmjena poretka elemenatau vektoru, koje ce kasnije na ekran ispisati neko drugi (npr.“main“ funkcija).RJEŠENJE:# include <iostream># include <vector>

using namespace std;

// Genericka funkcija izvrni

template<typename niz>// Prima se vektor u funkcijuvector<niz> izvrni(vector<niz> a){

/* Vrti se petlja od nultog clana do sredine vektora i izmjenjuju se clanovisimetricno */

for (int i=0;i<a.size()/2;i++){ niz pom; pom=a[i]; a[i]=a[a.size()-1-i]; a[a.size()-1-i]=pom; }

// Vracanje obrnutog vektorareturn a;}

Page 86: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){

// Definisanje duzine vektora, vektora i unos clanova vektoravector<char> a;int n;cout << "Unesi duzinu vektora: "; cin >> n;cout << "Unesi clanove vektora: " << endl;for (int i=0; i<n; i++){char pom;cout << i+1 << ": ";cin >> pom;a.push_back(pom);}

// Poziv funkcije izvrni() u koju saljemo vektora=izvrni(a);

// Ispis rezultatafor(int i = 0; i < a.size(); i++) cout << a[i] << " " << endl;

// Kraj programagetchar();return 0;}

Page 87: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

65. Napišite genericku funkciju “Odstrani” sa dva parametra “v”i “prag”. Prvi parametar je vektor elemenata koji pripadajukonceptu uporedivih elemenata (tj. elemenata za koje sudefinirane operacije poredjenja, tako da se mogu porediti povelicini). Funkcija treba da odstrani sve elemente iz zadanogvektora cija je vrijednost manja od vrijednosti parametra “prag”.Na primjer, neka vektor “a” realnih brojeva sadrzi redomvrijednosti 3.5, –7.11, 2, 1.3, –5, –6.12, 4, 5, –6.3 i 0.Nakon poziva funkcije:Odstrani(a, 0);elementi vektora “a” treba da postanu 3.5, 2, 1.3, 4, 5 i 0(odstranjeni su elementi manji od nule). Funkcija “Odstrani” netreba da koristi nikakav pomocni vektor osim samog parametra “v”.Takodjer, za realizaciju ove funkcije ne smijete koristitinikakve koncepte koji nisu obradjivani na predavanjima (npr.funkciju “erase”, iteratore, itd.). Napišite i kratki testniprogram u kojem cete demonstrirati napisanu funkciju na sekvencirealnih brojeva koji se unose sa tastature (vrijednost parametra“prag” se takodjer unosi sa tastature).RJEŠENJE:# include <iostream># include <vector>

using namespace std;

// Genericka funkcija odstranitemplate<typename niz>

// Prima se vektor i prag u funkcijuvector<niz> odstrani(vector<niz> a, niz prag){

int br=0; // br je brojac koji predstavlja broj clanova manjih od praga

/* Vrti se petlja od nultog clana do kraja i ako je i-ti clan vektora manji odpraga tada se br uveca za 1, a ako nije tada se broj upise na poziciju koja jeza br puta manja od trenutne pozicije, znaci ako smo dosli do 5 clana i dotada su nadjena dva clana manji od praga tada ce se 5 clan upisati na 5-2=3poziciju, a na kraju ce se jos velicina vektora "umanjiti" za br i dobili smovektor koji smo trebali dobiti :) */

for (int i=0; i<a.size(); i++) {if (a[i]<prag) br++; else a[i-br]=a[i];

} a.resize(a.size()-br);

// Vracanje obrnutog vektorareturn a;}

Page 88: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){

// Definisanje duzine vektora, vektora i unos clanova vektoravector<int> a;int n;cout << "Unesi duzinu vektora: "; cin >> n;cout << "Unesi clanove vektora: " << endl;for (int i=0; i<n; i++){int pom;cout << i+1 << ": ";cin >> pom;a.push_back(pom);}

// Definisanje praga i unos pragaint prag;cout << "Unesi prag: "; cin >> prag;

// Poziv funkcije izvrni() u koju saljemo vektor i praga=odstrani(a, prag);

// Ispis rezultatafor(int i = 0; i < a.size(); i++) cout << a[i] << " ";

// Kraj programagetchar();return 0;}

Page 89: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

66. Poznata Moievrova teorema za kompleksne brojeve tvrdi da jeza ma kakve realne brojeve x i n:

(cos x + i sin x) n = cos n x + i sin n x

Napisati program koji ce za realne brojeve x i n unesene satastature izracunati lijevu i desnu stranu ovog izraza i ispisatiih na ekranu, koristeci kompleksni tip podataka. Na nekolikoprimjera provjeriti da li se zaista dobijaju jednake vrijednosti.RJEŠENJE:# include <iostream># include <cmath># include <complex>

using namespace std;

int main() {

// Definisanje i unos dva realna brojadouble x, n;cout << "Unesi realan broj \"x\": ";cin >> x;cout << "Unesi realan broj \"n\": ";cin >> n;

// Racunanje prvog dijela (prvidio je rezultat)complex<double> prvidio(cos(x), sin(x));prvidio=pow(prvidio,n);

// Racunanje drugog dijela (drugidio je rezultat)complex<double> drugidio(cos(n*x), sin(n*x));

// Ispis rezultatacout << "Lijeva strana jednacine je: " << prvidio << " a desna: " << drugidio<< endl;getchar();return 0;}

Page 90: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

67. Deklarirajte pobrojani tip “Dani” takav da promjenljiveovog tipa mogu uzimati samo vrijednosti “Ponedjeljak”, “Utorak”,“Srijeda”, “Cetvrtak”, “Petak”, “Subota” i “Nedjelja”. Zatimnapišite funkciju “StampajKalendar” koja ne vraca nikakavrezultat, a zahtijeva dva parametra. Prvi parametar “broj_dana”je tipa “int”, dok je drugi parametar “pocetni_dan” tipa “Dani”.Parametar “broj_dana” odredjuje broj dana u mjesecu, dokparametar “pocetni_dan” odredjuje dan u sedmici kojim zapocinjetaj mjesec. Funkcija “StampajKalendar” štampa kalendar za tajmjesec. Na primjer, ukoliko zelimo odštampati kalendar za mjeseckoji ima 31 dan, a pocinje srijedom, to mozemo uraditi sljedecimpozivom:

StampajKalendar(31, Srijeda);Taj poziv treba da na ekranu proizvede ispis poput sljedeceg:

P U S C P S N 1 2 3 4 56 7 8 9 10 11 1213 14 15 16 17 18 1920 21 22 23 24 25 2627 28 29 30 31

RJEŠENJE:# include <iostream># include <iomanip>

using namespace std;// Definisanje pobrojanog tipa Danienum Dani {Ponedjeljak, Utorak, Srijeda, Cetvrtak, Petak, Subota, Nedjelja};

// Funkcija koja stampa kalendarvoid StampajKalendar(int broj_dana, Dani pocetni_dan){cout << endl << endl << " P U S C P S N" << endl;

// Stampanje odgovarajuceg broja praznih mjesta na pocetkufor (int i=0; i<pocetni_dan; i++) cout << setw(3) << "";

// Dodjeljivanje odgovarajuce vrijednosti varijabli bint b=pocetni_dan;

// Ispis rednih brojeva danafor (int i=1; i<=broj_dana; i++) {cout << setw(3) << i;b++;// Prelazak u novi red nakon ispisa svakih 7 brojevaif (b==7) { b=0; cout << endl; }}

}

Page 91: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){

// Definisanje varijabliint broj_dana, redni_broj_dana;Dani pocetni_dan;

// Unos rednog broja dana od kojeg pocinje mjesecwhile(redni_broj_dana<=0||redni_broj_dana>=8){cout << "Unesi redni broj dana u sedmici kojim pocinje mjesec (1-7): ";cin >> redni_broj_dana;}

// Unos broja dana u mjesecuwhile(broj_dana<=27||broj_dana>=32){cout << "Unesi broj dana u mjesecu (28-31): ";cin >> broj_dana;}

// Dodjeljivanje odgovarajuce vrijednosti varijabli pocetni_danpocetni_dan=Dani(redni_broj_dana-1);

// Poziv funkcije i slanje argumenataStampajKalendar(broj_dana, pocetni_dan);

// Kraj programagetchar();return 0;}

Page 92: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

68. Napišite program koji trazi da se prvo unese prirodan broj“n”, a nakon toga elementi vektora “a” koji ima “n” cjelobrojnihelemenata. Zatim, program treba da kreira novi vektor “b” u kojice biti prepisani elementi vektora “a” izostavljajuci duplikate(tj. brojeve koji se ponavljaju). Na kraju, program treba daispiše elemente vektora “b”, kao i broj elemenata koji seponavljaju. Na primjer, ukoliko se sa tastature unese niz od 15brojeva: 7, 10, 4, 2, 4, 4, 5, 6, 7, 3, 9, 1, 8, 6 i 7 programtreba kao elemente vektora “b” da ispiše brojeve 7, 10, 4, 2, 5,6, 3, 9, 1 i 8, kao i da ispiše da se 3 broja ponavljaju (to subrojevi 7, 4 i 6).RJEŠENJE:# include <iostream># include <vector>

using namespace std;

int main(){// Definisanje varijabliint ponavljanja=0;vector<int> a, b, pom;

// Unos broja clanova vektoracout << "Unesi prirodan broj \"n\": ";int n;cin >> n;

// Unos clanova vektoracout << "Unesi clanove vektora: ";for (int i=0; i<n; i++){int broj;cin >> broj;a.push_back(broj);}

for (int i=0; i<n; i++){int istina=0;

// Ako broj a[i] vec postoji u pomocnom nizu onda se on preskace...for (int k=0; k<pom.size(); k++) if (a[i]==pom[k]) istina=1;if (istina==1) continue;

/* Ako je broj a[i] jednak nekom od ostalih onda se varijabla "ponavljanja"uveca za 1, a broj a[i] se upisuje u pomocni niz u koji su zapisani brojevikoji se ponavljaju...*/for (int j=0; j<n; j++) if ((a[i]==a[j])&&(i!=j)) { pom.push_back(a[i]);ponavljanja++; break;}

Page 93: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Prepis broja a[i] u vektor bb.push_back(a[i]);}

// Ispis clanova vektora b i odgovarajuce poruke...for (int i=0; i<b.size(); i++) cout << b[i] << " ";cout << endl << "Imamo " << ponavljanja << " ponovljenih brojeva, to su: ";

// Ispis clanova koji su se ponavljalifor (int i=0; i<pom.size(); i++) cout << pom[i] << " ";cout << endl;

// Kraj programagetchar();return 0;}

Page 94: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

69. Napišite funkcije “SviElementiSuJednaki” i„SviElementiSuRazliciti”. I jedna i druga funkcija primaju kaoparametar jedan vektor realnih brojeva, a vracaju kao rezultatlogicku vrijednost (tj. vrijednost tipa “bool”). Funkcija“SviElementiSuJednaki” vraca vrijednost “true” ako i samo ako susvi elementi vektora medjusobno identicni, a u suprotnom vraca“false”. Funkcija “SviElementiSuRazliciti” vraca vrijednost“true” ako i samo ako su svi elementi vektora medjusobnorazliciti (tj. ukoliko nikoja dva elementa nisu medjusobnojednaka), a u suprotnom vraca “false”. Napisane funkcijetestirati u glavnom programu (“main” funkciji) na vektoru ciji seelementi unose sa tastature.

RJEŠENJE:# include <iostream># include <vector>

using namespace std;

// Funkcija SviElementiSuJednaki()...bool SviElementiSuJednaki(vector<double> vektor){bool istina=true;double pom=vektor[0];for (int i=1;i<vektor.size();i++) if (pom!=vektor[i]){istina=false; break;}return istina;}

// Funkcija SviElementiSuRazliciti()...bool SviElementiSuRazliciti(vector<double> vektor){bool istina=true;for (int i=0; i<vektor.size(); i++)for (int j=i+1; j<vektor.size(); j++)if (vektor[i]==vektor[j]) { istina=false; break; }return istina;}

main(){vector<double> vektor;

// Unos broja clanova vektoracout << "Unesi prirodan broj \"n\": ";int n;cin >> n;

// Unos clanova vektoracout << "Unesi clanove vektora: ";for (int i=0; i<n; i++){int broj;cin >> broj;vektor.push_back(broj);}

Page 95: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Ispis odgovarajucih porukaif(SviElementiSuJednaki(vektor)) cout << "Svi elementi su identicni... ";if(SviElementiSuRazliciti(vektor)) cout << "Svi elementi su razliciti... ";

// Kraj programagetchar();return 0;}

Page 96: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

70. Napišite funkciju sa jednim argumentom n koja kreiradinamicki niz od n cijelih brojeva, popunjava ga sa prvih nFibonacijevih brojeva, i vraca kao rezultat pokazivac na prvielement kreiranog niza. Napisanu funkciju testirajte u kratkomtestnom programu koji prvo sa tastature unosi broj n, zatimispisuje elemente kreiranog niza, i konacno, uništava kreiraniniz.

RJEŠENJE:#include <iostream>

using namespace std;

/* Funkcija Kreiraj koja prima prirodan broj n, kreira dinamicki niz od nelemenata, popunjava se niz a vraca se pokazivac na prvi clan*/int *Kreiraj(int n){// Definisanje i kreiranje dinamickog niza niz[]int *niz = new int[n];// Popunjavanje niza fibonacijevim ciframafor(int i=0; i<n; i++){if (i==0) niz[i]=0;

else if (i==1) niz[i]=1;else niz[i]=niz[i-1]+niz[i-2];

}// Vracanje pokazivaca iz funkcijereturn niz;}

int main(){/* U funkciji postoji mogucnost da bude bacen izuzetak, koji cemo uhvatiti ucatch bloku i ispisati gresku. */try {// Unos broja clanova nizaint n;cout << "Unesite broj clanova niza";cin >> n;/* Definisanje dinamickog niza "dinamickiniz[]" koji ce poprimiti vrijednostidinamickog niza kojeg vrati funkcija Kreiraj(n) */int *dinamickiniz=Kreiraj(n);/* Ispis clanova niza (fibonacijev niz) */for (int i=0;i<n;i++) if (i!=(n-1)) cout << dinamickiniz[i] << ", ";else cout << dinamickiniz[i] << endl;// Unistavanje dinamickog niza...delete[] dinamickiniz;}// Dio koji ide ako se baci izuzetak...catch(...) {cout << "Problem: Nema dovoljno memorije!\n";}// Kraj programagetchar();return 0;}

Page 97: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

71. Napišite program koji od korisnika trazi da unese dimenzijekvadratne matrice n, a zatim da unese dvije matrice formata n n(pretpostavite da su elementi matrica realni brojevi). Programnakon toga treba da ispiše zbir dvije unesene matrice. U programutreba da se nalaze sljedece funkcije: “KreirajMatricu”,“UnesiMatricu”, “SaberiMatrice”, “IspisiMatricu“ i“UnistiMatricu”. Funkcija “KreirajMatricu“ prima kao parametredvojni pokazivac koji sluzi za pristup dinamicki kreiranojmatrici (u nastavku cemo ovaj pokazivac prosto zvati dinamickamatrica), kao i dimenziju matrice n. Funkcija treba da alociraprostor za matricu formata n n, i dodijeli adresu alociranogprostora pokazivacu koji se koristi za pristup njenim elementima(za tu svrhu, odgovarajuci formalni parametar mora biti referencana dvojni pokazivac). Funkcija “UnesiMatricu” popunjava matricuelementima unesenim sa tastature, a prima kao parametre dinamickumatricu i dimenziju n. Funkcija “SaberiMatrice” prima kaoparametre dvije dinamicke matrice i dimenziju n. Ova funkcijatreba da kreira novu dinamicku matricu (pozivom funkcije“KreirajMatricu”), da je popuni zbirom dvije dinamicke matricekoje su joj proslijedjene kao parametri, i da vrati kao rezultatdvojni pokazivac koji sluzi za pristup elementima novokreiranematrice. Funkcija “IspisiMatricu” kao parametre prima dinamickumatricu i dimenziju n, a ispisuje elemente matrice na ekran.Konacno, funkcija “UnistiMatricu” unistava dinamicki kreiranumatricu koja joj se prosljedjuje kao parametar (zajedno sadimenzijom n). Funkcija “KreirajMatricu” treba da baci izuzetak uslucaju da kreiranje ne uspije. Pri tome, ova funkcija mora davodi racuna da u slucaju da dodje do bacanja izuzetka “pocistiiza sebe” sve uspjele alokacije, tako da ne dodje do curenjamemorije. Baceni izuzetak treba hvatati u glavnom programu.Obavezno testirajte slucaj kada alokacija ne uspijeva (unosomprevelikog broja n).

RJEŠENJE:#include <iostream>

using namespace std;

// Funkcija koja unistava matricu odredjenih dimenzija koju prima kaoparametar...int UnistiMatricu(double **MATRIX, int n){if (MATRIX == 0) { cout << "Ova matrica nije nikad kreirana, pa je necemobrisati... \n"; return 1; }cout << "Brisem matricu... \n";for(int i = 0; i < n; i++) delete[] MATRIX[i];delete[] MATRIX;cout << "Uspjesno izbrisana matrica... \n";}

Page 98: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

/* Funkcija koja kreira matricu dimenzija n x n, baca izuzetak ako nemozekreirati... */void KreirajMatricu(double **&MATRIX, int n){MATRIX = new double*[n];for(int i = 0; i < n; i++) MATRIX[i] = new double[n];}

/* Funkcija koja prima praznu matricu, a vraca matricu koja je popunjenaelementima preko reference*/void UnesiMatricu(double **&MATRIX, int n){for (int i=0; i<n; i++)for (int j=0; j<n; j++){cout << "[" << i+1 << "," << j+1 << "]: ";cin >> MATRIX[i][j];}}

/* Funkcija koja prima dvije kvadratne matrice n-tih dimenzija, i sabire ihtako sto razultat sabiranja pripisuje u prvu od dvije matrice, vraca sepokazivac na prvu matricu *//* Kreiranje trece dinamicke matrice smo izbjegli, da stedimo memoriju ;) */double **SaberiMatrice(double **MATRIX1, double **MATRIX2, int n){for (int i=0; i<n; i++) for (int j=0; j<n; j++) MATRIX1[i][j]+=MATRIX2[i][j];return MATRIX1;}

/* Funkcija prima matricu i dimenzije matrice i ispisuje matricu na ekran */void IspisiMatricu(double **MATRIX, int n){for(int i=0; i<n; i++){for(int j=0; j<n; j++){cout.width(5);cout << MATRIX[i][j];}cout << endl;}}

Page 99: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){

// Definisanje tri dvostruka pokazivaca koji ce kasnije predstavljati matricedouble **MATRIX1=0, **MATRIX2=0, **MATRIX3=0;

// Definisanje dimenzija matriceint n;try{cout << "Unesi broj kolona/redova kvadratne matrice (samo jedan broj) : ";cin >> n;KreirajMatricu(MATRIX1, n);KreirajMatricu(MATRIX2, n);UnesiMatricu(MATRIX1, n);UnesiMatricu(MATRIX2, n);MATRIX3=SaberiMatrice(MATRIX1, MATRIX2, n);cout << "Zbir matrica: " << endl;IspisiMatricu(MATRIX3, n);}

// Ako je bacen izuzetak ispis error poruke...catch(...) {cout << "Problem: Nema dovoljno memorije za smjestanje matrice u memoriju!\n";}// Brisu se kreirane matrice...UnistiMatricu(MATRIX1, n);UnistiMatricu(MATRIX2, n);UnistiMatricu(MATRIX3, n);

// Kraj programagetchar();return 0;}

Page 100: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

72. Napišite program koji trazi od korisnika da unese nizrecenica, pri cemu se broj recenica prethodno unosi sa tastature.Za svaku unesenu recenicu dinamicki alocirajte prostor, uzvodjenje evidencije o adresi svake alocirane recenice udinamickom nizu pokazivaca na pocetke svake od recenica. Nakontoga, treba ispisati unesene recenice sortirane u abecedniporedak (odnosno u poredak po ASCII kodovima). Sortiranje obaviterucno, bilo kojim postupkom koji Vam je poznat (drugim rijecima,nemojte koristiti gotove funkcije za sortiranje, poput funkcije"sort" iz biblioteke "algorithm".RJEŠENJE:#include <iostream>#include <string>using namespace std;int main(){// Unos broja recenicaint broj_rec;cout << "Unesite broj recenica: ";cin >> broj_rec;cin.ignore(10000, '\n'); // Ignorisanje nepotrebih znakova iz buferachar **recenice = new char*[broj_rec]; // Definisanje dvostrukog pokazivaca

for(int i=0; i<broj_rec; i++) { // For petlja u kojoj se unosi n recenica

// Definisanje pomocnog niza pom i unos recenice u njegachar pom[1000];cout << i+1 << ": ";cin.getline(pom, 1000);

// Definisanje niza na niz (matrica, i to grbava) (pomocu pokazivaca)recenice[i] = new char[strlen(pom) + 1];

// Upisivanje recenice iz pom na i-to mjesto u nizustrcpy(recenice[i], pom);}

// Pomocni stringovi, uveo sam ih zbog efikasnije provjere operacija < >string pom1, pom2;// Proces sortiranja, metodom nalazenja najveceg i stavljanje na vrhfor (int i=0;i<broj_rec-1;i++) for (int j=i+1;j<broj_rec;j++){pom1=recenice[i];pom2=recenice[j];

if (pom1>pom2){char pomocna[1000];strcpy(pomocna, recenice[i]);strcpy(recenice[i], recenice[j]);strcpy(recenice[j], pomocna);}}

// Ispis sortiranog nizacout << endl << "Sortirano: " << endl;for(int k = 0; k < broj_rec; k++) cout << k+1 << ": " << recenice[k] << endl;// Kraj programagetchar();return 0;}

Page 101: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

73. Napišite funkcije “TragMatrice”, “DaLiJeGornjaTrougaona” i“Transponovana”. Sve tri funkcije primaju jedan parametar “A”,koji predstavlja matricu realnih brojeva. Funkcija “TragMatrice”treba da kao rezultat vrati trag matrice (tj. sumu elemenata naglavnoj dijagonali) ukoliko je matrica kvadratna, a da baciizuzetak ukoliko nije (s obzirom da se trag definira samo zakvadratne matrice). Funkcija “DaLiJeGornjaTrougaona” treba da kaorezultat vrati logicku vrijednost “true” ukoliko je matricagornja trougaona (tj. ako ima sve nule ispod glavne dijagonale),a “false” ako nije. Konacno, funkcija “Transponovana” treba dakao rezultat vrati transponovanu matricu u odnosu na matricu kojajoj je proslijedjena kao argument. Napisane funkcije testirajte uglavnom programu na primjeru matrice cije dimenzije i elementeunosi korisnik putem tastature.

RJEŠENJE:# include <iostream># include <vector>

using namespace std;

// Funkcija DaLiJeGornjaTrougaona...bool DaLiJeGornjaTrougaona(vector<vector<double> > a){bool istina=true;

for (int i=1; i<a.size(); i++)for (int j=0; j<i; j++)

if (a[i][j]!=0) istina=false;return istina;}// Funkcija TragMatrice...double TragMatrice(vector<vector<double> > a){if (a.size()!=a[0].size())

throw "Matrica nije kvadratna, nema traga i ne moze biti trougaona!\n";double rez=0;for (int i=0; i<a.size(); i++) rez+=a[i][i];return rez;}// Funkcija Transponovana...vector<vector<double> > Transponovana(vector<vector<double> > a){int pom1=a.size(); // Pocetni broj redova matriceint pom2=a[0].size(); // Pocetne broj kolona matrice// max - veca dimenzija (red ili kolona)int max=a[0].size();if (a.size()>a[0].size()) max=a.size();// Resize matrice na kvadratnu dimenzija [max][max]a.resize(max);for(int i = 0; i < max; i++) a[i].resize(max);

// "Okretanje" odgovarajucih pozicija u matricidouble priv;for (int i=0;i<max;++i)for (int j=i+1;j<max;++j)

Page 102: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

{priv = a[i][j];a[i][j] = a[j][i];a[j][i] = priv;}

// Resize kolona na pocetne redovea.resize(pom2);

// Resize redova na pocetne kolonefor(int i = 0; i < pom2; i++) a[i].resize(pom1);return a;}

int main(){try {// Unos dimenzija matrice

int r, k; cout << "Unesite broj redova matrice: "; cin >> r; cout << "Unesite broj kolona matrice: "; cin >> k;// Definisanje matrice a vector<vector<double> > a(r, vector<double>(k));// Unos clanova matrice a

for (int i=0; i<r; i++)for (int j=0; j<k; j++)

{ cout << "[" << i+1 << "," << j+1 << "]: "; cin >> a[i][j]; }// Ispis transponovane matrice cout << endl << "Transponovana matrica: " << endl; vector<vector<double> > tr=Transponovana(a);

for(int i=0; i<tr.size(); i++){for(int j=0; j<tr[0].size(); j++) {

cout.width(5); cout << tr[i][j]; } cout << endl; }// Ispis traga matrice

double trag=TragMatrice(a); cout << endl << "Trag matrice je: " << trag;// Ispis poruke da li je matrica gornja trougaona ili ne

bool istina=DaLiJeGornjaTrougaona(a);if (istina) cout << endl << "Matrica je gornja trougaona!"; else

cout << endl << "Matrica nije gornja trougaona!";// Kraj try bloka}// catch blokcatch(const char poruka[]) {cout << endl << poruka << endl;}// Kraj programareturn 0;}

Page 103: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

74. Napišite program koji prvo trazi da se sa tastature uneserecenica, a zatim ispisuje svaku rijec te recenice u posebnomredu, kao i informaciju koliko ta recenica ima slova (neracunajuci interpunkcijske znakove) i rijeci. Obratite paznju darijeci recenice mogu biti razdvojene sa više od jednog razmaka,kao i da se na samom pocetku i na samom kraju recenice mogutakodjer nalaziti razmaci. Za realizaciju koristite tip “string”i odgovarajuce manipulacije sa stringovima.

RJEŠENJE:# include <iostream># include <string>

using namespace std;int main(){

// Unos recenicecout << "Unesi recenicu: " << endl;string recenica;getline(cin, recenica);

// Ispis rijecicout << endl << "Rijeci iz recenice: " << endl << endl;bool istina=false;

int br=0, br1=0;for (int i=0; i<=recenica.length(); i++) {

if (((recenica[i]>='a')&&(recenica[i]<='z'))|| ((recenica[i]>='A')&&(recenica[i]<='Z'))) { cout << recenica[i]; br++; istina=true; continue; }

if (istina) {cout << endl; istina=false; br1++; }}

// Ispis broja slovacout << endl << "Recenica ima " << br << " slova i " << br1 << " rijeci!";// Kraj programareturn 0;}

Page 104: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

75. Napišite funkciju “DaLiJePalindrom” koja za string koji joj jeproslijedjen kao parametar ispituje da li je palindrom ili nije, i kaorezultat vraca odgovarajucu logicku vrijednost “true” ili “false”. Podpalindromima smatramo rijeci ili recenice koje se isto citaju sa obestrane (npr. “kapak”). Prilikom ispitivanja treba ignorirati eventualnerazmake, interpunkcijske znake i razliku izmedju velikih i malih slova,tako da recenica “Ana voli Milovana” treba da bude prepoznata kaopalindrom, iako bukvalno procitana sa suprotnog kraja glasi “anavoliMilov Ana”. Još neki od poznatih palindromnih recenica su “Udovica bacivodu”, “E, sine, zeni se”, “I jogurt ujutru goji”, “I Dara za mast samazaradi”, “Jovi limaru gumu gura Milivoj”, itd. Historijski najpoznatijipalindrom je latinska recenica “Sator Arepo tenet opera rotas” za kojuse u srednjem vijeku smatralo da ima magicna svojstva. Napišite ikratki testni program (“main” funkciju) u kojem cete testirati napisanufunkciju.

RJEŠENJE:# include <iostream># include <string>

using namespace std;

// Funkcija DaLiJePalindrom...bool DaLiJePalindrom(string a){bool istina=true;string b;// Kopiranje slova i brojeva u niz b(char) izbacivanjem ostalih znakova...for (int i=0; i<=a.length(); i++)

if (((a[i]>='a')&&(a[i]<='z'))|| ((a[i]>='A')&&(a[i]<='Z'))) { if((a[i]>='a')&&(a[i]<='z')) a[i]+= 'A'-'a'; b+=a[i]; }// Provjera da li je rijec "simetricna", tj. da li je palindrom...for (int i=0, j=b.size(); i<b.size(); i++,j--) if (b[i]!=b[j-1]) istina=false;return istina;}

int main(){

// Unos recenice...cout << "Unesi rijec ili recenicu: " << endl;string recenica;getline(cin, recenica);

// Poziv funkcije...bool istina=DaLiJePalindrom(recenica);

// Ispis rezultata...if (istina) cout << endl << "Palindrom je!!!";

else cout << endl << "Nije palindrom!!!";

// Kraj programa...return 0;}

Page 105: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

76. Napisati program koji trazi od korisnika da unese spisakrijeci (broj rijeci se prethodno unosi sa tastature), a zatimispisuje na ekran prvu i poslednju rijec iz spiska po abecednomporetku, kao i popis svih unesenih rijeci, ali bez ispisivanjaduplikata (tj. bez ispisivanja rijeci koje su se vec jednomispisale). Program realizirati korištenjem vektora stringova,odnosno vektora ciji su elementi tipa “string”.RJEŠENJE:# include <iostream># include <string># include <vector>

using namespace std;

main(){

// Unos broja rijeci a zatim unos rijeci u vektor...vector<string> a;int n;cout << "Unesi broj rijeci: "; cin >> n;for (int i=0; i<n; i++){cout << i+1 << ". ";string pom;cin >> pom;a.push_back(pom);}

// Sortiranje imenastring pom;for (int i=0;i<(a.size()-1);i++)

for (int j=i+1;j<a.size();j++)if (a[j]<a[i]){

pom=a[i]; a[i]=a[j]; a[j]=pom; }

// Ispis prve i zadnje rijecicout << "Prva rijec je: " << a[0] << " a zadnja " << a[a.size()-1] << endl;

// Ispis svih rijecicout << endl << "Ispis rijeci: " << endl;a.push_back("");for (int i=0, j=0; i<a.size()-1; i++){if ((a[i]!=a[i+1])) { cout << j+1 << ". " << a[i] << endl; j++; }}

// Kraj programareturn 0;}

Page 106: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

77. Iz numericke matematike je poznato da se odredjeni integralneke funkcije f(x) na intervalu (a, b) moze priblizno izracunatiuz pomoc tzv. Simpsonovog pravila, prema kojem je:

gdje je n broj podintervala na koji dijelimo interval (a, b) ikoji mora biti paran (veci broj podintervala daje vecu tacnostracunanja), a h je duzina svakog podintervala, tj. h=(b–a)/n.Napišite funkciju “Integral” koja prima kao parametre f, a, b i n( f je funkcija ciji se integral racuna) a koja kao rezultat dajepribliznu vrijednost integrala. Napisanu funkciju testirajte naprimjerima integrala funkcije sin x na intervalu (0, π), zatimfunkcije x3 na intervalu (0, 10), i funkcije 1/x na intervalu (1,2). Testiranje izvršite za razlicite vrijednosti n i uporediterezultate sa tacnim rezultatima. Utvrdite kolike su vrijednostiza n bile potrebne da se dobije rezultat tacan na 5 decimala zasva tri primjera.

RJEŠENJE:#include <iostream>#include <cmath> // zbog sin funkcijeusing namespace std;

// Funkcija od koje trazimo integral x*x*xdouble xnatrecu(double x){

return x*x*x; // probajte sin(x) i 1/x takodjer }

/* Funkcija prima kao parametar funkciju xnatrecu, te tri realna broja *//* - a pocetak intervala; b - kraj intervala; n - preciznost */double Integral(double F(double), double n, double a, double b){

double dio1, dio2, h=(b-a)/n; // h - duzina intervalafor(int k=1; k<=n-1; k+=2) dio1+=F(a+k*h); // racunanje prve sumefor(int k=2; k<=n-2; k+=2) dio2+=F(a+k*h); // racunanje druge sumereturn (h/3)*(F(a)+4*dio1+2*dio2+F(b)); // Formula :)

}

int main(){double a,b,n;// Unos podatakacout << "Unesi broj podintervala (n): "; cin >> n;cout << "Unesi interval (a,b): "; cin >> a >> b;// Ispis rezultatacout << "Rezultat: " << Integral(xnatrecu, n, a, b);getchar();return 0;}

Page 107: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

78. Koristeci odgovarajuce funkcije iz biblioteke “algorithm”,napišite program koji ce za niz cijelih brojeva unesenih satastature ispisati:• najveci i najmanji element niza;• koliko puta se u nizu pojavljuje najmanji element;• koliko u nizu cijelih brojeva unesenih sa tastature ima brojevakoji su potpuni kvadrati (tj. kvadrati nekog drugog cijelogbroja).Nakon toga, program treba prepisati u drugi niz sve elemente kojinisu potpuni kvadrati, i ispisati elemente tako formiranog niza.

Napomena: U programu nije uopce dozvoljeno koristiti petlje (osimza unos elemenata niza), vec sve manipulacije treba ostvaritiiskljucivo pozivima funkcija iz biblioteke “algorithm”.

RJEŠENJE:#include <iostream>#include <algorithm>#include <cmath>

using namespace std;

// Funkcija koja vraca true ako je broj puni kvadrat, u suprotnom falsebool jelkvadrat(int a){

if(a==sqrt(a)*sqrt(a)) { return true; } else return false; }

// Funkcija koja ispisuje broj koji primavoid Ispisi(int x) { cout << x << " "; }

int main(){int A[100], B[100]; // Dva niza cijelih brojevaint n; // Broj clanovaint brojac=0; // Broj clanova koji su puni kvadrati

// Unos nizacout << "Unesite broj clanova niza: "; cin >> n;for (int i=0; i<n; i++){

int br; cout << i+1 << ": "; cin >> br; A[i]=br;/* Ako je broj puni kvadrat onda se brojac uvecava, u suprotnom se upisuje uniz B[] */

if(jelkvadrat(br)) brojac++; else B[i-brojac]=br; }

Page 108: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Ispis rezultatacout << "Najmanji element: " << *min_element(A, A+n) << " a najveci: " <<*max_element(A, A+n) << endl;

cout << "Najmanji element se ponavlja " << count(A, A+n,*min_element(A, A+n))<< " puta." << endl;

cout << "Imamo " << brojac << " punih kvadrata!!!" << endl;

cout << "Niz brojeva koji nisu puni kvadrati: ";for_each(B, B+(n-brojac), Ispisi);

// Kraj programagetchar();return 0;}

Page 109: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

79. Napišite genericku funkciju “Izvrni” koja prihvata isteparametre i obavlja isti zadatak kao funkcija “reverse” izbiblioteke “algorithm”. Funkciju treba realizirati iskljucivokorištenjem pokazivacke aritmetike, bez korištenja indeksiranja injegove trivijalne simulacije (tj. pisanja “*(p+i)” umjesto“p[i]”). Napišite i kratki testni program u kojem cete testiratinapisanu funkciju na dva fiksna niza, od kojih je jedan nizcijelih brojeva, a drugi niz znakova.

RJEŠENJE:#include <iostream>#include <algorithm>

using namespace std;

// Genericka funkcija izvrnitemplate<typename TIP>void Izvrni(TIP *p1, TIP *p2){

int br=0; // br - broj clanova niza

p2--; // Pokazivac p2 se vrati na zadnji clan

while(*p1!=*p2) { p1++; br++; } // Racuna se duzina niza

p1-=br; // Pokazivac p1 se vrati gdje je i bio :)

// For petlja koja okrece clanove nizafor(int i=0; i<br/2; i++){

TIP pr=*p1; *p1=*p2; *p2=pr; *p1++; *p2--; }}

// Funkcija za ispis brojavoid Ispisi(int x) { cout << x << " "; }

int main(){int A[100]; // Definisanje nizaint n; // Broj clanova niza// Unos nizacout << "Unesite broj clanova niza: "; cin >> n;for (int i=0; i<n; i++){

int br; cout << i+1 << ": "; cin >> br; A[i]=br; }

Page 110: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Poziv funkcije koja izvrce nizIzvrni(A, A+n);

// Ispis izvrnutog nizacout << "Izvrnuti niz: ";for_each(A, A+n, Ispisi);

// Kraj programagetchar();return 0;}

Page 111: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

80. Napišite program koji ce na primjeru jednog fiksnogsortiranog niza od 50 elemenata i broja “n” unesenog sa tastatureispisati poziciju gdje se broj “n” nalazi unutar niza, odnosnocinjenicu da broj “n” nije pronadjen unutar niza. Koristitebinarnu pretragu i odgovarajuce funkcije iz biblioteke„algorithm”.

RJEŠENJE:#include <iostream>#include <algorithm>

using namespace std;

int main(){int n, istina=1;

// Definisanje i popunjavanje niza ciframa od 50 do 1 (samo primjer)int A[50];for (int i=0;i<=50;i++) A[i]=50-i;

// Unos broja ncout << "Unesite broj n: "; cin >> n;

// Ispis pozicije na kojoj se broj nalazi, ako se nalazi...for (int i=0; i<=50; i++){if (binary_search(A+(i-1), A+i, n)){ cout << "Na poziciji: " << i << endl; istina=0; }}if (istina) cout << "Nema tog broja u nizu!!!" << endl;

// Kraj programagetchar();return 0;}

Page 112: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

81. Definirajte strukturu “Vrijeme” koja sadrzi tri polja„sati”, “minute” i “sekunde”, i koja predstavlja tekuce vrijeme utoku dana, izrazenu u satima, minutama i sekundama. Zatimdefinirajte funkciju “IspisiVrijeme” koja ispisuje vrijemeproslijedjeno kao parametar u funkciju u obliku hh:mm:ss (tj.sati, minute i sekunde se ispisuju kao dvocifreni brojevi,eventualno sa vodecim nulama), kao i funkciju “SaberiVrijeme”koja prima dva vremena kao parametre, i vraca kao rezultat trecevrijeme koje nastaje sabiranjem vremena koja su proslijedjena kaoparametri (npr. sabiranjem 3h 34min 52sek i 4h 42min 20sek trebada se dobije vrijeme 8h 17min 12sek). Konacno, napravite malitestni program u kojem cete testirati napisane funkcije.RJEŠENJE:# include <iostream>using namespace std;struct Vrijeme { // Definisanje strukture Vrijeme

int Sati;int Minute;int Sekunde;

};

void Unesivrijeme(Vrijeme &V){ // Unos vremena (hh:mm:ss)cout << "Unesi vrijeme: " << endl << endl;while (V.Sati<0||V.Sati>23) { cout << "Unesi sate: "; cin >> V.Sati; }while (V.Minute<0||V.Minute>59) { cout << "Unesi minute: "; cin >> V.Minute; }while (V.Sekunde<0||V.Sekunde>59) { cout << "Unesi sek: "; cin >> V.Sekunde; }}

void Ispisivrijeme(Vrijeme V){ // Ispis vremenacout << endl << "Vrijeme: ";if (V.Sati<10) cout << 0 << V.Sati; else cout << V.Sati; cout << ":";if (V.Minute<10) cout << 0 << V.Minute; else cout << V.Minute; cout << ":";if (V.Sekunde<10) cout << 0 << V.Sekunde; else cout << V.Sekunde;}// Sabiranje dva vremena (hh+hh:mm+mm:ss+ss) uz postivanje odredjenih pravila.Vrijeme SaberiVrijeme(Vrijeme V, Vrijeme K){Vrijeme pom;int ost=0;if((pom.Sekunde=V.Sekunde+K.Sekunde)>59) { pom.Sekunde-=60; ost=1; }if((pom.Minute=V.Minute+K.Minute+ost)>59) { pom.Minute-=60; ost=1; } elseost=0;if((pom.Sati=V.Sati+K.Sati+ost)>23) pom.Sati=0;return pom;}

int main(){ // Glavni programVrijeme V, K;Unesivrijeme(V); Unesivrijeme(K);Ispisivrijeme(V); Ispisivrijeme(SaberiVrijeme(V, K));system("pause");return 0;}

Page 113: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

82. Definirajte strukturu “Cvor” koja sadrzi polje “element”tipa “double” i polje “veza” koje je tipa pokazivac na “Cvor”.Iskoristite ovu strukturu u programu koji cita slijed realnihbrojeva sa tastature sve dok se ne unese 0, uvezuje te elemente upovezanu listu cvorova, i na kraju prolazi kroz listu cvorova saciljem da prebroji i ispiše koliko ima elemenata u listi koji suveci od aritmeticke sredine svih unesenih elemenata (potrebna suzapravo dva prolaza: prvi za racunanje aritmeticke sredine, idrugi za brojanje elemenata sa trazenim svojstvom).RJEŠENJE:#include <iostream>using namespace std;

// Struktura Cvorstruct Cvor {double element;Cvor *veza;};

int main(){Cvor *pocetak(0), *prethodni;

for(;;) {double broj;

cin >> broj; // Ucitavanje brojaif(broj == 0) break; // Prekid ako je 0

Cvor *novi = new Cvor; // Kreiranje novog cvora novi->element = broj; // U novi cvor se pise unijeti broj novi->veza = 0; // Nova veza se inicijalizira na 0

// Veza od prethodnog koja je do sada bila 0, se sada postavi na noviif(pocetak != 0) prethodni->veza = novi;

// Ako se radi o prvom elementu, pocetak pokazuje na unjeti brojelse pocetak = novi;

// Prethodni pokazuje na novi (potrebno za iduci broj)prethodni = novi;

}

double aritm_sred; // Aritmeticka sredinaint br=1; // Broj elemenata

// Listaju se brojevi od pocetka do krajafor(Cvor *p = pocetak; p != 0; p = p->veza){ aritm_sred+=p->element; // racuna se suma svih brojeva br++; // racuna se broj elemenata}

aritm_sred=double(aritm_sred/br); // Aritmeticka sredna po formuli

Page 114: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Ispis svih brojeva koji su veci od aritmeticke sredinecout << endl << "Ispis onih koji su veci od aritmeticke sredine: " << endl;for(Cvor *p = pocetak; p != 0; p = p->veza){if (p->element>aritm_sred) cout << p->element << endl;}

// Ispis aritmeticke sredinecout << endl << "Aritmeticka sredina: " << aritm_sred << endl;

getchar();return 0;}

Page 115: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

83. Definirajte i implementirajte klasu “Sat” koja predstavljadigitalni sat. Klasa treba da ima sljedeci interfejs:

void Postavi(int sati, int minute, int sekunde);void Sljedeci();void Ispisi() const;Metoda “Postavi” treba da sluzi za namještanje tekuceg vremena.Ona treba da baci izuzetak u slucaju da se zadaju neispravniparametri. Metoda “Sljedeci” treba da poveca vrijeme zapamceno usatu za 1 sekundu (npr. ukoliko je tekuce vrijeme “12:48:59”,nakon poziva ove metode vrijeme treba da postane “12:49:00”).Metoda “Ispisi” treba da ispiše stanje sata u obliku “hh : mm :ss”. Kao atribute klase uzmite trenutni broj sati, minuta isekundi, koje cete definirati privatne atribute. Obaveznonapišite i testni program u kojem ce se upotrebiti svi elementiinterfejsa napisane klase.RJEŠENJE:#include <iostream>using namespace std;

// Klasa Satclass Sat{

int h, m, s; // Varijable klase (privatno)public:// Metode klase

void Postavi(int sati, int minute, int sekunde);void Sljedeci();void Ispisi() const;

};

// Metoda postavivoid Sat::Postavi(int sati, int minute, int sekunde){

// Ako je neki uslov zadovoljen baca se izuzetakif (sati > 23 || sati < 0 || minute > 59 || minute < 0 || sekunde > 59 || sekunde < 0) throw "Neispravno vrijeme!!!"; else

// Postavljanje varijabli klase na vrijednosti poslane u funkciju...h=sati;m=minute;s=sekunde;

}

// Metoda koja pomjera sat za 1 sekundu unaprijedvoid Sat::Sljedeci(){ s++;

if(s>59) { s = 0; m++; }if(m>59) { m = 0; h++; }if(h>23) { h=0; }

}

Page 116: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Metoda za ispis vremena u formatu hh:mm:ssvoid Sat::Ispisi() const {

cout << endl << endl << h << ":" << m << ":" << s << endl;}

int main(){Sat dig; // Definisanje strukture digint h, m, s; // sati, minute, sekunde...cout << "Unesi sate: "; cin >> h;cout << "Unesi minute: "; cin >> m;cout << "Unesi sekunde: "; cin >> s;

try{dig.Postavi(h, m, s); // Postavljanje sata na vrijednosti h,m,sdig.Ispisi(); // Ispis vremenadig.Sljedeci(); // Pomjeranje za sekundudig.Ispisi(); // Ispis pomjerenog vremena

}catch(const char poruka[]) {

cout << poruka;}

getchar();return 0;

}

Page 117: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

84. Definirajte i implementirajte klasu “Sat” koja ima potpunoisti interfejs i potpuno isto ponašanje kao klasa iz prethodnogzadatka, samo cija se interna struktura umjesto tri atributa kojacuvaju trenutni broj sati, minuta i sekundi sastoji samo odjednog atributa, koji cuva ukupan broj sekundi (npr. umjestoinformacije “3 sata, 20 minuta, 15 sekundi” cuva se samoinformacija koja kaze 12015 sekundi). Mada ce ovo traziti izmjenuimplementacije svih metoda klase (metoda “Postavi” ce se sasvimneznatno izmijeniti,metoda “Sljedeci” ce se bitno pojednostaviti,dok ce se metoda “Ispisi” bitno zakomplicirati), demonstrirajteda ce testni program iz prethodnog zadatka bez ikakve prepravkeraditi sa ovako modificiranom klasom.

RJEŠENJE:#include <iostream>using namespace std;

// Klasa Satclass Sat{

int s; // Varijable klase (privatno)public:// Metode klasevoid Postavi(int sekunde);void Sljedeci();void Ispisi() const;};

// Metoda postavivoid Sat::Postavi(int sekunde){// Postavljanje varijable klase na vrijednost poslatu u funkciju...s=sekunde;}

// Metoda koja pomjera sat za 1 sekundu unaprijedvoid Sat::Sljedeci(){ s++;}

// Metoda za ispis vremena u formatu hh:mm:ssvoid Sat::Ispisi() const {int pom=Sat::s;int h1, m1, s1;h1=pom/3600; pom=pom%3600;m1=pom/60; pom=pom%60;s1=pom;cout << endl << endl << h1 << ":" << m1 << ":" << s1 << endl;}

Page 118: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){Sat dig; // Definisanje strukture digint s; // sekundecout << "Unesi broj sekundi: "; cin >> s;

dig.Postavi(s); // Postavljanje sata na vrijednost sdig.Ispisi(); // Ispis vremenadig.Sljedeci(); // Pomjeranje za sekundudig.Ispisi(); // Ispis pomjerenog vremena

getchar();return 0;}

Page 119: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

85. Definirajte i implementirajte klasu “Vektor” u skladu sazadatom deklaracijom i implementacijom prikazanom u nastavku stim što cete u implementaciju klase dodati još dva konstruktora,kao i tri nove metode “Postavi_x”, “Postavi_y” i “Postavi_z”.Konstruktor bez parametara treba da inicijalizira sve koordinatevektora na nule, a konstruktor sa tri parametra treba dainicijalizira sve atribute vektora na vrijednosti dateparametrima. Metode “Postavi_x”, “Postavi_y” i “Postavi_z” trebada omoguce neovisnu izmjenu pojedinacnih koordinata vektora.Napišite i mali testni program u kojem cete demonstrirati sveelemente razvijene klase.// Zadati izgled klase:

class Vektor {double x, y, z;public:void Postavi(double x, double y, double z) {Vektor::x = x; Vektor::y = y; Vektor::z = z; }void Ocitaj(double &x, double &y, double &z) const {x = Vektor::x; y = Vektor::y; z = Vektor::z; }void Ispisi() const {cout << "{" << x << "," << y << "," << z << "}"; }double Vrati_x() const { return x; }double Vrati_y() const { return y; }double Vrati_z() const { return z; }double Duzina() const { return sqrt(x * x + y * y + z * z); }Vektor &PomnoziSaSkalarom(double s) { x *= s; y *= s; z *= s; return *this; }Vektor &SaberiSa(const Vektor &v) {x += v.x; y += v.y; z += v.z;return *this; }friend Vektor ZbirVektora(const Vektor &v1, const Vektor &v2);};

Vektor ZbirVektora(const Vektor &v1, const Vektor &v2) {Vektor v3;v3.x = v1.x + v2.x; v3.y = v1.y + v2.y; v3.z = v1.z + v2.z;return v3; }

RJEŠENJE:# include <iostream># include <cmath>

using namespace std;

// Klasa Vektorclass Vektor {double x, y, z; // x,y,z privatne varijable klase Vektorpublic:Vektor() { x = 0; y = 0; z = 0; } // Inicijalizacija na 0 varijabli x,y,z// Inicijalizacija na parametre x,y,z koji se salju pri deklaraciji klaseVektor(double x1, double y1, double z1) { x = x1; y = y1; z = z1; }

Page 120: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

void Postavi(double x, double y, double z) { // Metoda PostaviVektor::x = x; Vektor::y = y; Vektor::z = z;}

void Ocitaj(double &x, double &y, double &z) const { // Metoda Ocitajx = Vektor::x; y = Vektor::y; z = Vektor::z;}

void Ispisi() const { // Metoda Ispisicout << endl << "Vektor je: {" << x << "," << y << "," << z << "}";}

double Vrati_x() const { return x; } // Metoda Vrati_xdouble Vrati_y() const { return y; } // Metoda Vrati_ydouble Vrati_z() const { return z; } // Metoda Vrati_zdouble Postavi_x(double x) { return Vektor::x = x; } // Metoda Postavi_xdouble Postavi_y(double y) { return Vektor::y = y; } // Metoda Postavi_ydouble Postavi_z(double z) { return Vektor::z = z; } // Metoda Postavi_zdouble Duzina() const { return sqrt(x * x + y * y + z * z); } // Metoda Duzina

Vektor &PomnoziSaSkalarom(double s) { // Metoda PomnoziSaSkalarom x *= s; y *= s; z *= s;

return *this;}

Vektor &SaberiSa(const Vektor &v) { // Metoda SaberiSax += v.x; y += v.y; z += v.z;return *this;}// Deklarisanje prijatelja klase Vektorfriend Vektor ZbirVektora(const Vektor &v1, const Vektor &v2);};

// Funkcija ZbirVektora (obicna funkcija, ali prijatelj klase Vektor)Vektor ZbirVektora(const Vektor &v1, const Vektor &v2) {Vektor v3;v3.x = v1.x + v2.x; v3.y = v1.y + v2.y; v3.z = v1.z + v2.z;return v3;}

// Glavni program predstavlja testiranje klase!int main(){Vektor v;double a,b,c,a1,b1,c1,skalar;

v.Ispisi(); // Ispis pocetnih vrijednosti (0,0,0)

// Unos vrijednosti vektora i jednog skalaracout << endl << "Unesi vrijednosti vektora: \n";cin >> a >> b >> c;cout << "Unesi skalar: \n";cin >> skalar;

// Postavljanje vrijednosti varijabli klase Vektor na a,b,cv.Postavi(a,b,c);

Page 121: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Citanje vrijednosti varijable klase Vektor i prepisivanje u a1,b1,c1v.Ocitaj(a1,b1,c1);

// Ispis vrijednosti a1,b1,c1cout << "Vektor je: {" << a1 << "," << b1 << "," << c1 << "}" << endl;

// Ispisi vrijednosti varijabli klase Vektor koristeci metodu Ispisiv.Ispisi();

// Ispisi vrijednosti varijabli klase koristeci metode Vrati_x...cout << endl << "Vektor je: {" << v.Vrati_x() << "," << v.Vrati_y() << "," <<v.Vrati_z() << "}" << endl;

// Ispis duzine vektoracout << "Duzina vektora je: " << v.Duzina() << endl;

// Vektor v kopiramo u varijablu zVektor z=v;

// Vektor v mnozimo sa unijetim skalarom i ispisujemo gav.PomnoziSaSkalarom(skalar); v.Ispisi();

// Na vektor v dodamo vektor z (saberemo ga sa vektorom z), i ispisujemo gav.SaberiSa(z); v.Ispisi();

// Zbir vektora z i v se pise u vektor k i ispisuje se novi vektorVektor k=ZbirVektora(z,v); k.Ispisi();

// Prepravka Vektora vcout << endl << "Unesi nove vrijednosti vektora: \n";cin >> a >> b >> c;v.Postavi_x(a); v.Postavi_y(b); v.Postavi_z(c);

// Ispis prepravljenog vektorav.Ispisi();

getchar();return 0;}

Page 122: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

86. Izmijenite implementaciju klase razvijene u prethodnomzadatku tako da se za cuvanje koordinata vektora umjesto triprivatna atributa “x”, “y” i “z” koji su tipa realnih brojevakoristi jedan privatni atribut “koordinate” koji je tipa niza odtri realna elementa. Izmjenu treba izvesti tako da zaglavlja svihmetoda unutar interfejsa klase ostanu neizmijenjena.Demonstrirajte da ce testni program napisan u prethodnom zadatkuraditi bez ikakvih izmjena sa ovako izmijenjenom klasom.

RJEŠENJE:# include <iostream># include <cmath>

using namespace std;

// Klasa Vektorclass Vektor {double koordinate[3]; // koordinate[], niz koji cuva vrijednosti Vektorapublic:// Inicijalizacija na 0 koordinata VektoraVektor() { koordinate[0] = 0; koordinate[1] = 0; koordinate[2] = 0; }// Inicijalizacija na parametre x1,y1,z1 koji se šalju pri deklaraciji klaseVektor(double x1, double y1, double z1) { koordinate[0] = x1; koordinate[1] = y1; koordinate[2] = z1; }

void Postavi(double x, double y, double z) { // Metoda Postavi Vektor::koordinate[0] = x; Vektor::koordinate[1] = y;Vektor::koordinate[2] = z;}

void Ocitaj(double &x, double &y, double &z) const { // Metoda Ocitajx = Vektor::koordinate[0]; y = Vektor::koordinate[1]; z =Vektor::koordinate[2];}

void Ispisi() const { // Metoda Ispisicout << endl << "Vektor je: {" << koordinate[0] << "," << koordinate[1] << ","<< koordinate[2] << "}";}

double Vrati_x() const { return koordinate[0]; } // Metoda Vrati_xdouble Vrati_y() const { return koordinate[1]; } // Metoda Vrati_ydouble Vrati_z() const { return koordinate[2]; } // Metoda Vrati_z// Metoda Postavi_xdouble Postavi_x(double x) { return Vektor::koordinate[0] = x; }// Metoda Postavi_ydouble Postavi_y(double y) { return Vektor::koordinate[1] = y; }// Metoda Postavi_zdouble Postavi_z(double z) { return Vektor::koordinate[2] = z; }

Page 123: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Metoda Duzinadouble Duzina() const {return sqrt(koordinate[0] * koordinate[0] + koordinate[1] * koordinate[1]+ koordinate[2] * koordinate[2]); }

Vektor &PomnoziSaSkalarom(double s) { // Metoda PomnoziSaSkalarom koordinate[0] *= s; koordinate[1] *= s; koordinate[2] *= s;

return *this;}

Vektor &SaberiSa(const Vektor &v) { // Metoda SaberiSakoordinate[0] += v.koordinate[0]; koordinate[1] += v.koordinate[1];koordinate[2] += v.koordinate[2];return *this;}

// Deklarisanje prijatelja klase Vektorfriend Vektor ZbirVektora(const Vektor &v1, const Vektor &v2);};

// Funkcija ZbirVektora (obicna funkcija, ali prijatelj klase Vektor)Vektor ZbirVektora(const Vektor &v1, const Vektor &v2) {Vektor v3;v3.koordinate[0] = v1.koordinate[1] + v2.koordinate[0]; v3.koordinate[1] =v1.koordinate[1] + v2.koordinate[1]; v3.koordinate[2] = v1.koordinate[2] +v2.koordinate[2];return v3;}

// Glavni program predstavlja testiranje klase!int main(){Vektor v;double a,b,c,a1,b1,c1,skalar;

v.Ispisi(); // Ispis pocetnih vrijednosti (0,0,0)

// Unos vrijednosti vektora i jednog skalaracout << endl << "Unesi vrijednosti vektora: \n";cin >> a >> b >> c;cout << "Unesi skalar: \n";cin >> skalar;

// Postavljanje vrijednosti varijabli klase Vektor na a,b,cv.Postavi(a,b,c);

// Citanje vrijednosti varijable klase Vektor i prepisivanje u a1,b1,c1v.Ocitaj(a1,b1,c1);

// Ispis vrijednosti a1,b1,c1cout << "Vektor je: {" << a1 << "," << b1 << "," << c1 << "}" << endl;

// Ispisi vrijednosti varijabli klase Vektor koristeci metodu Ispisiv.Ispisi();

Page 124: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Ispisi vrijednosti varijabli klase koristeci metode Vrati_x...cout << endl << "Vektor je: {" << v.Vrati_x() << "," << v.Vrati_y() << "," <<v.Vrati_z() << "}" << endl;

// Ispis duzine vektoracout << "Duzina vektora je: " << v.Duzina() << endl;

// Vektor v kopiramo u varijablu zVektor z=v;

// Vektor v mnozimo sa unijetim skalarom i ispisujemo gav.PomnoziSaSkalarom(skalar); v.Ispisi();

// Na vektor v dodamo vektor z (saberemo ga sa vektorom z), i ispisujemo gav.SaberiSa(z); v.Ispisi();

// Zbir vektora z i v se pise u vektor k i ispisuje se novi vektorVektor k=ZbirVektora(z,v); k.Ispisi();

// Prepravka Vektora vcout << endl << "Unesi nove vrijednosti vektora: \n";cin >> a >> b >> c;v.Postavi_x(a); v.Postavi_y(b); v.Postavi_z(c);

// Ispis prepravljenog vektorav.Ispisi();

getchar();return 0;}

Page 125: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

87. Definirajte i implementirajte klasu “Tim” koja predstavljajedan tim u fudbalskom prvenstvu, sa privatnim atributima “ime”,“broj_odigranih”, “broj_pobjeda”, “broj_nerijesenih”,“broj_poraza”, “broj_datih”, “broj_primljenih” i “broj_poena”koji sadrze redom naziv tima (do 20 znakova), broj odigranihutakmica, broj pobjeda, broj neriješenih utakmica, broj poraza,ukupan broj datih i primljenih golova, kao i broj poena zarazmatrani tim. Atribut “ime” treba izvesti kao klasicni nizznakova. Klasa treba da ima sljedeci interfejs:

Tim(const char ime[]);void ObradiUtakmicu(int broj_datih, int broj_primljenih);const char *ImeTima() const;int BrojPoena() const;int GolRazlika() const;void IspisiPodatke() const;

Konstruktor treba da postavi ime tima na vrijednost zadanuparametrom, a sve ostale atribute klase na nulu. Metoda“ObradiUtakmicu” treba da na osnovu rezultata utakmice koji jojse prenosi kao parametar (u vidu broja datih i primljenih golovasa posmatrane utakmice) azurira ne samo atribute koje brojegolove, nego i atribute koji broje odigrane utakmice, brojpobjeda, poraza i neriješenih utakmica, kao i broj bodova. Pritome se za pobjedu dodjeljuju 3 boda, za neriješen rezultat 1bod, a za poraz ništa. Metode “ImeTima”, “BrojPoena“ i“GolRazlika“ treba da vrate respektivno ime tima (preciznije,pokazivac na prvi znak imena), broj poena kao i gol razliku (tj.razliku izmedju ukupnog broja datih i primljenih golova) zaposmatrani tim (ove metode implementirati unutar deklaracijeklase). Konacno, metoda “IspisiPodatke” treba da ispiše na ekransve podatke o timu u jednom redu, i to sljedecim redom: ime tima,broj utakmica, broj pobjeda, broj neriješenih utakmica, brojporaza, broj datih golova, broj primljenih golova i broj poena.Pri ispisu, za ime tima zauzmite prostor od 20 znakova, u kojemime treba da bude ispisano poravnato ulijevo, a za sve brojnepodatke prostor od 4 znaka na ekranu, pri cemu ispis svakogbrojcanog podatka treba biti poravnat udesno unutar predvidjenogprostora. Napišite i kratki testni program u kojem cetedemonstrirati napisanu klasu.

RJEŠENJE:# include <iostream># include <string># include <iomanip>

using namespace std;

Page 126: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Klasa Timclass Tim {// Privatne varijable klasechar ime[20];int broj_odigranih, broj_pobjeda, broj_nerijesenih, broj_poraza, broj_datih;int broj_primljenih, broj_poena;public:// Konstruktor koji postavlja pocetne vrijednosti (ime na poslati parametar).Tim(const char ime[]) {

int i=0;while(*ime!='\0'){ Tim::ime[i]=*ime; ime++; i++; }Tim::ime[i]='\0';

broj_odigranih=0; broj_pobjeda=0; broj_nerijesenih=0; broj_poraza=0;broj_datih=0; broj_primljenih=0; broj_poena=0;

}

// Prototip metode ObradiUtakmicuvoid ObradiUtakmicu(int broj_datih, int broj_primljenih);

// Metoda ImeTima koja vraca ime timaconst char *ImeTima() const {

return ime;}

// Metoda BrojPoena koja vraca broj_poena timaint BrojPoena() const { return broj_poena; }

// Metoda GolRazlika koja vraca gol razliku timaint GolRazlika() const { return broj_datih-broj_primljenih; }

// Prototip metode IspisiPodatkevoid IspisiPodatke() const;};

// Implementacija metode ObradiUtakmicuvoid Tim::ObradiUtakmicu(int broj_datih, int broj_primljenih){Tim::broj_odigranih+=1;Tim::broj_primljenih+=broj_primljenih;Tim::broj_datih+=broj_datih;if (broj_datih==broj_primljenih) {Tim::broj_nerijesenih+=1; Tim::broj_poena+=1;} elseif (broj_datih>broj_primljenih) {Tim::broj_pobjeda+=1; Tim::broj_poena+=3;} elseif (broj_datih<broj_primljenih) Tim::broj_poraza+=1;}

// Implementacija metode IspisiPodatkevoid Tim::IspisiPodatke() const {int br=0; // br je duzina naziva timaconst char *pom=ime;while(*pom!='\0') { br++; pom++; }cout << ime << setw(20-br) << "" << setw(4) << broj_odigranih << setw(4)

<< broj_pobjeda << setw(4) << broj_nerijesenih << setw(4) << broj_poraza<< setw(4) << broj_datih << setw(4) << broj_primljenih << setw(4)<< broj_poena << endl;

}

Page 127: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){char ime[20];int brp, brd, DN;/* Unosenje razmaka u naziv tima je moguce implementirati, ali bi se programnepotrebno znatno zakomplikovao, a cilj zadatka nije eliminacija razmaka vecprimjena klasa */// Unos nazina timacout << endl << "Unesi naziv tima (bez razmaka!!!): ";cin >> ime;Tim T(ime);

// Unos podataka za timfor(;;){cout << "Unesi broj datih golova: ";cin >> brd;cout << "Unesi broj primljenih golova: ";cin >> brp;T.ObradiUtakmicu(brd, brp); // Obradjivanje podataka

// Dio koji ce nam "pita" da li zelimo prekinuti unoseint istina=true;while(istina){cout << "Unosi dalje [1=DA] ili [2=NE]";cin >> DN;if (DN==1||DN==2) istina=false;}if (DN==2) break;}

// Ispis podatakacout << "Ispis podataka za tim (" << T.ImeTima() << " [" << T.BrojPoena()

<< "] ): " << endl;T.IspisiPodatke();cout << "Gol razlika tima je: " << T.GolRazlika() << endl;

// Kraj programagetchar();return 0;}

Page 128: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

88. Napišite klasu “Liga” koja se oslanja na klasu “Tim”napisanu na prethodnom tutorialu. Klasa treba da ima privatneatribute “broj_timova” i “max_br_timova” koji cuvaju redom brojtimova odnosno maksimalni dozvoljeni broj timova u ligi (atribut“max_br_timova” treba da bude konstantni atribut), kao i privatniatribut “timovi” koji ce sluziti za pristup dinamicki alociranomnizu od “max_br_timova” elemenata, pri cemu je svaki element nizapokazivac na objekat tipa “Tim”. Interfejs klase treba da izgledaovako:

explicit Liga(int velicina_lige);~Liga();void DodajNoviTim(const char ime_tima[]);void RegistrirajUtakmicu(const char tim1[], const char tim2[],int rezultat_1, int rezultat_2);void IspisiTabelu();

Konstruktor treba da izvrši dinamicku alokaciju memorije zaprihvatanje onoliko timova koliko je navedeno parametrom, dokdestruktor treba da izvrši oslobadjanje svih resursa koje jeklasa“Liga” alocirala tokom svog rada. Metoda “DodajNoviTim” kreiratim sa navedenim imenom i upisuje ga na prvo slobodno mjesto uligu (pri tome se naravno broj timova u ligi povecava zajedinicu). Metoda ne smije da dozvoli upis više timova odmaksimalno dozvoljenog broja timova. U metodi“RegistrirajUtakmicu” prva dva parametra predstavljaju imenatimova koji su odigrali utakmicu, dok su treci i cetvrtiparametar broj golova koji su dali prvi i drugi tim respektivno.Ova metoda treba da azurira rezultate u tabeli za oba tima,odnosno da baci izuzetak ukoliko timovi sa navedenim imenima nepostoje u tabeli. Konacno, metoda “IspisiTabelu” treba da ispišetabelu lige sortiranu u opadajucem poretku po broju bodova.Ukoliko dva tima imaju isti broj poena, tada u tabeli prvo dolazitim sa vecom gol razlikom. Ispis treba vršiti pozivom metode“IspisiPodatke” iz klase “Tim”, tako da bi tabela trebala da imaizgled poput sljedeceg:

Celik 18 11 5 1 34 10 38Jedinstvo 18 9 4 5 33 20 31Zeljeznicar 18 9 4 5 25 19 31Velez 18 8 6 4 23 24 30Sarajevo 18 8 5 5 32 16 29

itd.

Page 129: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

Kopiranje i medjusobno dodjeljivanje primjeraka klase “Liga”treba zabraniti. Obavezno treba napisati i testni program u kojemcete demonstrirati sve elemente razvijenih klasa (“Tim” i“Liga”), na manjem broju fiksnih timova (npr. liga od 6elemenata) i rezultatima utakmica koji se unose sa tastature.Predvidjeti i hvatanje eventualno bacenih izuzetaka.

RJEŠENJE:# include <iostream># include <string># include <iomanip>using namespace std;

// Klasa Timclass Tim {char ime[20];int broj_odigranih, broj_pobjeda, broj_nerijesenih, broj_poraza, broj_datih;int broj_primljenih, broj_poena;public:

// KonstruktorTim(const char ime[]){ int i=0;while(*ime!='\0'){Tim::ime[i]=*ime;ime++; i++; }Tim::ime[i]='\0'; broj_odigranih=0; broj_pobjeda=0; broj_nerijesenih=0;broj_poraza=0; broj_datih=0; broj_primljenih=0; broj_poena=0;}

// Metoda ImeTimaconst char *ImeTima() const {return ime;}

// Metoda BrojPoenaint BrojPoena() const { return broj_poena; }

// Metoda GolRazlikaint GolRazlika() const { return broj_datih-broj_primljenih; }

// Prototipovi metodavoid ObradiUtakmicu(int broj_datih, int broj_primljenih);void IspisiPodatke() const;};

// Implementacija metode ObradiUtakmicuvoid Tim::ObradiUtakmicu(int broj_datih, int broj_primljenih){Tim::broj_odigranih+=1;Tim::broj_primljenih+=broj_primljenih;Tim::broj_datih+=broj_datih;if (broj_datih==broj_primljenih) {Tim::broj_nerijesenih+=1; Tim::broj_poena+=1;} elseif (broj_datih>broj_primljenih) {Tim::broj_pobjeda+=1; Tim::broj_poena+=3;} elseif (broj_datih<broj_primljenih) Tim::broj_poraza+=1;}

Page 130: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Implementacija metode IspisiPodatkevoid Tim::IspisiPodatke() const {int br=0;const char *pom=ime;while(*pom!='\0') { br++; pom++; }cout << ime << setw(20-br) << "" << setw(4) << broj_odigranih << setw(4)

<< broj_pobjeda << setw(4) << broj_nerijesenih << setw(4) << broj_poraza<< setw(4) << broj_datih << setw(4) << broj_primljenih << setw(4)<< broj_poena << endl;

}

// Klasa Ligaclass Liga {int broj_timova;const int max_br_timova;Tim **timovi;Liga(const Liga &);Liga &operator =(const Liga &);

public:

// Konstruktorexplicit Liga(int velicina_lige): broj_timova(0),max_br_timova(velicina_lige), timovi(new Tim*[velicina_lige]) { };

// Destruktor~Liga(){ for(int i = 0; i < max_br_timova; i++) delete timovi[i];delete[] timovi; }

// Prototipovi metodavoid DodajNoviTim(const char ime_tima[]);void RegistrirajUtakmicu(const char tim1[], const char tim2[], int rezultat_1,int rezultat_2);void IspisiTabelu();};

// Implementacija metode DodajNoviTimvoid Liga::DodajNoviTim(const char ime_tima[]){if (max_br_timova==broj_timova)

throw "Dostignut je maksimalan broj studenata!"; Tim *St = new Tim(ime_tima); timovi[broj_timova] = St; broj_timova++;}

Page 131: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Implementacija metode RegistrirajUtakmicuvoid Liga::RegistrirajUtakmicu(const char prvi[], const char drugi[],

int pr, int dr){bool istina, istina1;int poz1=-1, poz2=-1;for(int i=0; i<broj_timova; i++){const char *pom=timovi[i]->ImeTima();const char *p=prvi;if (*pom==*p) { istina=true;

while(*pom!='\0') { if (*pom==*p) { pom++; p++; }else {istina=false; break; }

if(*pom!=*p) { istina=false; break; } poz1=i; }}const char *pom1=timovi[i]->ImeTima();const char *p1=drugi;if (*pom1==*p1) { istina=true;

while(*pom1!='\0') { if (*pom1==*p1) { pom1++; p1++; }else {istina1=false; break; }

if(*pom1!=*p1) { istina1=false; break; } poz2=i; }}

}if (poz1==poz2) throw "Nemoze tim igrati sam sa sobom!!!";if (poz1!=-1&&poz2!=-1) {timovi[poz1]->ObradiUtakmicu(pr, dr); timovi[poz2]->ObradiUtakmicu(dr, pr); }

else throw "Ne postoji u bazi jedan od timova!!!";}

// Implementacija metode IspisiTabeluvoid Liga::IspisiTabelu(){

if (broj_timova==0) throw "Nema timova u bazi!";for (int i=0;i<(broj_timova-1);i++)for (int j=i+1;j<broj_timova;j++)if (timovi[j]->BrojPoena()>=timovi[i]->BrojPoena()){

if (timovi[j]->BrojPoena()==timovi[i]->BrojPoena()){if (timovi[j]->GolRazlika()<=timovi[i]->GolRazlika()){

Tim *pom; pom=timovi[i]; timovi[i]=timovi[j]; timovi[j]=pom; } } Tim *pom; pom=timovi[i]; timovi[i]=timovi[j]; timovi[j]=pom; } cout << endl << "Sortirano: " << endl;

for (int i=0; i<broj_timova; i++) timovi[i]->IspisiPodatke();}

Page 132: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Glavni programint main(){int max;cout << "Unesite maksimalni broj timova: "; cin >> max;Liga L(max);for(int i=1;;i++){char ime[20];cout << "Unesi naziv " << i << " tima: "; cin >> ime;try { L.DodajNoviTim(ime); }catch(const char poruka[]) { cout << poruka << endl; i--;}int choice;cout << "1 za novi unos ili 2 za izlaz: "; cin >> choice;if (choice==2) break;}

cout << "Unos rezultata utakmica: " << endl;for(;;){char prvi[20], drugi[20];int brpr, brdr;cout << "Unesi naziv prvog tima: "; cin >> prvi;cout << "Unesi naziv drugog tima: "; cin >> drugi;cout << "Unesi broj golova prvog tima: "; cin >> brpr;cout << "Unesi broj golova drugog tima: "; cin >> brdr;try { L.RegistrirajUtakmicu(prvi, drugi, brpr, brdr); }catch(const char poruka[]) { cout << poruka << endl; }int choice;cout << "1 za novi unos ili 2 za izlaz: "; cin >> choice;if (choice==2) break;}L.IspisiTabelu();system("pause");return 0;}

Page 133: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

89. Za potrebe neke meteorološke stanice neophodno je vršiticestu registraciju spoljašnje temperature. Za tu svrhumeteorološka stanica koristi racunarski program u kojem jedefinirana i implementirana klasa nazvana “Temperature”. Ovaklasa omogucava cuvanje podataka o temperaturi za izvjesnivremenski period u dinamicki alociranom nizu realnih brojevakojem se pristupa preko nekog od internih atributa klase. Poznatoje da klasa sadrzi slijedece elemente:

a) Konstruktor sa jednim parametrom, koji vrši dinamickualokaciju memorije, pri cemu parametar predstavlja maksimalanbroj temperatura koje se mogu registrirati (pri tome je potrebnosprijeciti da se taj konstruktor koristi za automatsku konverzijucjelobrojnih podataka u objekte tipa “Temperature”);

b) Destruktor, koji oslobadja memoriju zauzetukonstruktorom;

c) Konstruktor kopije koji ce osigurati da se objekti tipa“Temperature” mogu bezbjedno prenositi kao parametri povrijednosti, koristiti za inicijalizaciju drugih objekata istogtipa i vracati kao rezultati iz funkcija;

d) Preklopljeni operator dodjele, koji garantira sigurnododjeljivanje jednog objekta tipa “Temperature” drugom objektuistog tipa, bez problema koji mogu biti uzrokovani kreiranjemplitkih kopija;

e) Metodu koja vrši registraciju nove temperature, pri cemuse temperatura koja se registrira prenosi kao parametar metode (uslucaju da se dostigne maksimalan broj temperatura koje se moguregistrirati, treba baciti izuzetak);

f) Metodu koja briše sve unesene temperature;

g) Metode koje vracaju kao rezultat prosjecnu, minimalnu imaksimalnu temperaturu;

h) Metodu koja ispisuje sve unesene (registrirane)temperature sortirane u opadajucem poretku (tj. najvecatemperatura se ispisuje prva), pri cemu se svaka temperaturaispisuje u posebnom redu.

Implementirajte klasu sa navedenim svojstvima. Sve neophodneatribute obavezno izvesti kao privatne clanove klase. Obaveznonapišite i mali testni program u kojem ce se testirati svenavedene metode.

Page 134: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:# include <iostream># include <string># include <iomanip>using namespace std;

class Temperature{int br, kap;double *pok;

public:// Konstruktor kopije

Temperature(const Temperature &v);

// Operator preklapanja Temperature &operator =(const Temperature &v);

// Konstruktorexplicit Temperature(int kap): br(0), kap(kap), pok(new double[kap]) {}

// Destruktor ~Temperature(){ delete[] pok; }

// Prototipovi metodavoid DodajTemp(double x);void BrisiTemp();void IspisiSortirano();

// Metoda VratiMaxdouble VratiMax(){

double max=pok[0];for(int i=1; i<br; i++) if (pok[i]>max) max=pok[i];return max;

}

// Metoda VratiMindouble VratiMin(){

double min=pok[0];for(int i=1; i<br; i++) if (pok[i]<min) min=pok[i];return min;

}

// Metoda VratiProsjekdouble VratiProsjek(){

double prosjek;for(int i=0; i<br; i++) prosjek+=pok[i];return prosjek/br;

}

};

// Implementacija metode DodajTempvoid Temperature::DodajTemp(double x){

if (br==kap) throw "Dostignut je maksimalan broj temperatura!!!"; else pok[br]=x; br++;

}

Page 135: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Implementacija metode BrisiTempvoid Temperature::BrisiTemp(){

for(int i=0; i<br; i++) pok[i]=0; kap=0; br=0;}

// Implementacija metode IspisiSortiranovoid Temperature::IspisiSortirano(){

if (br==0) throw "Nema temperatura u bazi!";for (int i=0;i<(br-1);i++)for (int j=i+1;j<br;j++)if (pok[j]>pok[i]){

double pom; pom=pok[i]; pok[i]=pok[j]; pok[j]=pom; } cout << endl << "Sortirano: " << endl;

for (int i=0; i<br; i++) cout << i+1 << ". " << pok[i] << endl;}

// Konstruktor kopijeTemperature::Temperature(const Temperature &v) : br(v.kap), pok(newdouble[v.kap]) { copy(v.pok, v.pok + v.kap, pok);}

// Preklopljeni operatorTemperature &Temperature::operator =(const Temperature &v) {

if(br < v.br) { delete[] pok; pok = new double[v.br]; } br = v.br; copy(v.pok, v.pok + v.br, pok);

return *this;}

// Glavni programint main(){int max;idiovdje: cout << "Unesi maksimalan broj temperatura: "; cin >> max;Temperature T(max);for(int i=1;;i++){ double temp;cout << "Unesi " << i << " temperaturu: "; cin >> temp;try { T.DodajTemp(temp); }catch(const char poruka[]) { cout << poruka << endl; i--; }int choice;cout << "1 za novi unos, 2 za izlaz, 3 za brisanje temp: "; cin >> choice;if (choice==2) break;if (choice==3) { T.BrisiTemp(); goto idiovdje; }}try { T.IspisiSortirano(); }catch(const char poruka[]) { cout << poruka << endl; }cout << endl << "Maksimalna temperatura je: " << T.VratiMax();cout << endl << "Minimalna temperatura je: " << T.VratiMin();cout << endl << "Prosjecna temperatura je: " << T.VratiProsjek();getchar();return 0;}

Page 136: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

90. Dopunite program “matrica_struct.cpp” prilozen uzPredavanje 7. funkcijama “ProduktMatrica” i “StepenMatrica”.Funkcija “ProduktMatrica” prima dvije matrice kao parametre(matrice su definirane kao odgovarajuce strukture) i vraca njihovprodukt kao rezultat, odnosno baca izuzetak ukoliko matrice nisusaglasne za mnozenje. Funkcija “StepenMatrica” prima matricu kaojedan parametar, kao drugi parametar prima prirodan broj n, i kaorezultat vraca matricu dignutu na n-ti stepen (u matricnomsmislu) odnosno baca izuzetak ukoliko matrica nije kvadratna, sobzirom da je stepen matrice definiran samo za kvadratne matrice(pri realizaciji ove funkcije mozete koristiti vec napisanufunkciju “ProduktMatrica”). Takodjer, proširite funkciju“IspisiMatricu” dodatnim parametrom “treba_brisati” tipa “bool”.Ukoliko ovaj parametar ima vrijednost “true”, funkcija treba daoslobodi prostor zauzet matricom koja joj je proslijedjena kaoparametar, u suprotnom ne treba da radi ništa. Ovim se omogucavada mozemo zadavati pozive poput:

IspisiMatricu(ZbirMatrica(a, b), 7, true);tako da se oslobadjanje memorije koju je zauzela pomocna matricakoja predstavlja zbir matrica moze obaviti bez korištenja pomocnepromjenljive (kao u programu “matrica_struct.cpp”). Definirajteda parametar “treba_brisati” ima podrazumijevanu vrijednost“false”, tako da ga ne treba navoditi ukoliko nam brisanje netreba. Napisane funkcije testirajte u glavnom programu naprimjeru matrica cije dimenzije i elemente unosi korisnik putemtastature. U glavnom programu predvidite hvatanje svih izuzetakakoji bi eventualno mogli nastupiti. Takodjer, dobro pazite danigdje ne dodje do curenja memorije (ni pod kakvim okolnostima).

Page 137: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:#include <iostream>#include <iomanip>#include <conio.h>using namespace std;

template <typename Tip>struct Matrica {

int broj_redova, broj_kolona; Tip **elementi;};

template <typename Tip>void UnistiMatricu(Matrica<Tip> mat) {

if(mat.elementi == 0) return;for(int i = 0; i < mat.broj_redova; i++) delete[] mat.elementi[i];delete[] mat.elementi;

}

template <typename Tip>Matrica<Tip> StvoriMatricu(int broj_redova, int broj_kolona) { Matrica<Tip> mat; mat.broj_redova = broj_redova; mat.broj_kolona = broj_kolona; mat.elementi = new Tip*[broj_redova];

for(int i = 0; i < broj_redova; i++) mat.elementi[i] = 0;try {

for(int i = 0; i < broj_redova; i++) mat.elementi[i] = new Tip[broj_kolona]; }

catch(...) { UnistiMatricu(mat);

throw; }

return mat;}

template <typename Tip>void UnesiMatricu(char ime_matrice, Matrica<Tip> &mat) {

for(int i = 0; i < mat.broj_redova; i++)for(int j = 0; j < mat.broj_kolona; j++) {

cout << ime_matrice << "(" << i + 1 << "," << j + 1 << ") = "; cin >> mat.elementi[i][j]; }}

template <typename Tip>void IspisiMatricu(const Matrica<Tip> &mat, int sirina_ispisa,bool treba_brisati=false) {

for(int i = 0; i < mat.broj_redova; i++) {for(int j = 0; j < mat.broj_kolona; j++)

cout << setw(sirina_ispisa) << mat.elementi[i][j]; cout << endl;}if (treba_brisati) UnistiMatricu(mat);}

Page 138: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

template <typename Tip>Matrica<Tip> ZbirMatrica(const Matrica<Tip> &m1, const Matrica<Tip> &m2) {

if(m1.broj_redova != m2.broj_redova || m1.broj_kolona !=m2.broj_kolona)throw "Matrice se nemogu sabrati!\n";

Matrica<Tip> m3 = StvoriMatricu<Tip>(m1.broj_redova, m1.broj_kolona);for(int i = 0; i < m1.broj_redova; i++)

for(int j = 0; j < m1.broj_kolona; j++) m3.elementi[i][j] = m1.elementi[i][j] + m2.elementi[i][j];

return m3;}

template <typename Tip>Matrica<Tip> ProduktMatrica(const Matrica<Tip> &m1, const Matrica<Tip> &m2) {

if(m2.broj_redova != m1.broj_kolona)throw "Matrice se nemogu sabrati niti mnoziti!\n";

Matrica<Tip> m3 = StvoriMatricu<Tip>(m1.broj_redova, m2.broj_kolona);for(int i = 0; i < m1.broj_redova; i++)

for(int j = 0; j < m2.broj_kolona; j++){ m3.elementi[i][j]=0;

for (int k = 0; k < m1.broj_kolona; k++) m3.elementi[i][j]+=m1.elementi[i][k]*m2.elementi[k][j]; }

return m3;}

template <typename Tip>Matrica<Tip> StepenMatrica(const Matrica<Tip> &m, int s) {

if(m.broj_redova != m.broj_kolona)throw "Matrica nije kvadratna, nemoze se traziti stepen!\n";

Matrica<Tip> m3 = StvoriMatricu<Tip>(m.broj_redova, m.broj_kolona); Matrica<Tip> Jedinicna = StvoriMatricu<Tip>(m.broj_redova,m.broj_kolona);

for(int i=0; i<m.broj_redova; i++)for(int j=0; j<m.broj_redova; j++){if (i==j) Jedinicna.elementi[i][j]=1; else Jedinicna.elementi[i][j]=0;

}if (s>1) m3 = ProduktMatrica(m, m);else if (s==1) m3 = ProduktMatrica(m, Jedinicna);for(int i = 2; i < s; i++){

Matrica<Tip> pom=m3; m3 = ProduktMatrica(m3, m); UnistiMatricu(pom); }

return m3;}

Page 139: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main() { Matrica<double> a = {0, 0, 0}, b = {0, 0, 0};

int m1, n1, m2, n2, s; cout << "Unesi broj redova i kolona za prvu matricu:\n"; cin >> m1 >> n1; cout << "Unesi broj redova i kolona za drugu matricu:\n"; cin >> m2 >> n2;

while (s<=0){ cout << "Na koji stepen zelite dici drugu matricu (prirodan broj):\n"; cin >> s;}

try { a = StvoriMatricu<double>(m1, n1); b = StvoriMatricu<double>(m2, n2); cout << "Unesi matricu A:\n"; UnesiMatricu('A', a); cout << "Unesi matricu B:\n"; UnesiMatricu('B', b);

if(b.broj_kolona == b.broj_redova){ cout << "Druga matrica na stepen " << s << " je:\n"; IspisiMatricu(StepenMatrica(b, s), 7, true); } cout << "Produkt ove dvije matrice je:\n"; IspisiMatricu(ProduktMatrica(a, b), 7, true); cout << "Zbir ove dvije matrice je:\n"; IspisiMatricu(ZbirMatrica(a, b), 7, true); }

catch(bad_alloc) { cout << "Nema dovoljno memorije!\n"; }

catch(const char poruka[]) { cout << poruka; } UnistiMatricu(a); UnistiMatricu(b);

getch();return 0;}

Page 140: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

91. Definirajte strukturu “Cvor” koja sadrzi polje “element”tipa “string” i polje “veza” koje je tipa pokazivac na “Cvor”.Iskoristite ovu strukturu u programu koji cita slijed recenica satastature sve dok se ne unese prazna recenica (tj. dok se nepritisne samo ENTER bez ikakvog prethodnog unosa), i koji uvezujete recenice u povezanu listu cvorova, ali koji nakon unosa svakeod recenica umece cvor na takvo mjesto da lista u svakom trenutkubude sortirana po abecedi (odnosno po poretku ASCII kodova) kadase posmatra u redoslijedu kako idu veze izmedju cvorova. Nakraju, program treba da ispiše sve recenice u listi, da seuvjerimo da je lista zaista sortirana.

RJEŠENJE:#include <iostream>using namespace std;

struct Cvor {string element;Cvor *veza;};

int main(){Cvor *pocetak(0), *prethodni, *pom, *pom1;for(;;) { string recenica; getline(cin, recenica);

if(recenica.length() == 0) break; Cvor *novi = new Cvor; novi->element = recenica; novi->veza = 0;

if(pocetak != 0) {int i=1;for(Cvor *p = pocetak; p != 0; p = p->veza){if ((novi->element < p->element)&&(p==pocetak))

{ pocetak = novi; novi->veza=p; i=0; break; } elseif ((novi->element < p->element))

{ pom1=p; pom->veza=novi; novi->veza=p; i=0; break;} pom=p; }

if (i) { prethodni->veza = novi; i=0; prethodni = novi;} }

else { pocetak = novi; prethodni = novi; }}

cout << "Sortirano: " << endl;for(Cvor *p = pocetak; p != 0; p = p->veza)cout << p->element << endl;

getchar();return 0;}

Page 141: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

92. Definirajte i implementirajte kompletnu klasu “Datum” sasvim atributima i metodima koji su prikazani u Predavanju 8. anakon toga proširite klasu dodavanjem nove metode“VratiDanUSedmici” koja vraca ime dana u sedmici koji odgovaradatumu (preciznije receno, pokazivac na prvi znak imena dana usedmici, poput metode “VratiImeMjeseca”). Na primjer, ukoliko jepohranjeni datum 3. 5. 2006. metoda treba da vrati tekst“Srijeda” kao rezultat (odnosno pokazivac na prvi znak togteksta). Napisanu klasu demonstrirajte u testnom programu u kojemcete demonstrirati sve elemente napisane klase.

RJEŠENJE:#include <iostream>using namespace std;

class Datum {int dan, mjesec, godina;char *VratiImeMjeseca() const;static int BrojDana(int mjesec, int godina);

public:char *VratiDanUSedmici() const;void Postavi(int d, int m, int g);void Sljedeci();

void Ocitaj(int &d, int &m, int &g) const { d = dan; m = mjesec; g = godina; }

int VratiDan() const { return dan; }int VratiMjesec() const { return mjesec; }int VratiGodinu() const { return godina; }

void Ispisi() const { cout << dan << ". " << mjesec << ". " << godina << "."; }

void IspisiLijepo() const;};

int Datum::BrojDana(int mjesec, int godina) {int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(godina % 4 == 0 && godina % 100 != 0 || godina % 400 == 0)

broj_dana[1]++;return broj_dana[mjesec - 1];

}

void Datum::Postavi(int dan, int mjesec, int godina) {if(godina < 1 || dan < 1 || mjesec < 1 || mjesec > 12 || dan >

BrojDana(mjesec, godina)) throw "Neispravan datum!\n"; Datum::dan = dan; Datum::mjesec = mjesec; Datum::godina = godina;}

Page 142: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

char *Datum::VratiImeMjeseca() const {char *imena_mjeseci[] = {"Januar", "Februar", "Mart", "April", "Maj",

"Juni", "Juli", "August", "Septembar", "Oktobar", "Novembar", "Decembar"};

return imena_mjeseci[mjesec - 1];}

char *Datum::VratiDanUSedmici() const { Datum pom;

char *imena_dana[] = {"Ponedjeljak", "Utorak", "Srijeda", "Cetvrtak", "Petak", "Subota", "Nedjelja"}; pom.Postavi(31, 12, 1979);

int rednidan=0;while ((pom.VratiGodinu()!=VratiGodinu())||

(pom.VratiMjesec()!=VratiMjesec())|| (pom.VratiDan()!=VratiDan())){ pom.Sljedeci(); rednidan++;

if (rednidan==7) rednidan=0; }

return imena_dana[rednidan];}

void Datum::Sljedeci() { dan++;

if(dan > BrojDana(mjesec, godina)) { dan = 1; mjesec++; }if(mjesec > 12) { mjesec = 1; godina++; }

}

void Datum::IspisiLijepo() const { cout << dan << ". " << VratiImeMjeseca() << " " << godina << ".";}

Page 143: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

int main(){ Datum dat;

int d, m, g, d1, m1, g1; cout << "Unesi dan: "; cin >> d; cout << "Unesi mjesec: "; cin >> m; cout << "Unesi godinu: "; cin >> g;

try{ dat.Postavi(d, m, g); dat.Ocitaj(d1, m1, g1); cout << endl << "Ocitani podaci funkcijom Ocitaj(): " << endl; cout << "Godina: " << g1 << endl; cout << "Mjesec: " << m1 << endl; cout << "Dan: " << d1 << endl << endl; cout << "Ocitani podaci pojedinacnim funkcijama: " << endl; cout << "Godina: " << dat.VratiGodinu() << endl; cout << "Mjesec: " << dat.VratiMjesec() << endl; cout << "Dan: " << dat.VratiDan() << endl; cout << endl << "Ispisi datum: " << endl; dat.Ispisi(); cout << endl << endl << "Ispisi lijepo datum: " << endl; dat.IspisiLijepo(); cout << endl << "Trazeni datum bio je: " << dat.VratiDanUSedmici(); cout << endl << endl << "Ispisi lijepo sljedeci datum: " << endl; dat.Sljedeci(); dat.IspisiLijepo(); cout << endl << "Trazeni datum bio je: " << dat.VratiDanUSedmici(); }

catch(const char poruka[]) { cout << poruka; } cout << endl << endl; system("pause");

return 0;}

Page 144: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

93. Neka je data deklaracija:

enum Pravci {Sjever, Istok, Jug, Zapad};Definirajte klasu “Robot” koja predstavlja zamišljenog robotakoji moze da se krece kroz koordinatni sistem sa cjelobrojnimkoordinatama i koji moze da gleda u jednom od cetiri pravcadefinirana u pobrojanom tipu “Pravci”. Klasa treba da imasljedeci interfejs:

void Postavi(int x, int y, Pravci p);void PomjeriSe(int korak);void Nalijevo();void Nadesno();int Pozicija_x() const;int Pozicija_y() const;Pravci Orjentacija() const;void Ispisi() const;Metoda “Postavi” treba da postavi robot na zadanu poziciju, i daga usmjeri u zadani pravac. Metoda “PomjeriSe” pomjera robotazadani broj koraka u pravcu u kojem robot trenutno gleda. Metode“Nalijevo” i “Nadesno” obrcu robota za 90o na lijevo odnosno nadesno. Metode “Pozicija_x”, “Pozicija_y” i “Orjentacija” treba davrate tekucu poziciju odnosno orjentaciju robota. Metoda “Ispisi”treba da ispiše podatke o poziciji i orjentaciji robota na nacinkao u sljedecem primjeru:Robot se nalazi na poziciji (3,–5) i gleda na istok.Napisanu klasu upotrijebite u programu u kojem ce korisnik mocida bira neku od dozvoljenih operacija sa robotom, a nakon svakeizvršene operacije program treba da prikaze tekucu poziciju iorjentaciju (kratke metode dozvoljeno je implementirati odmahunutar deklaracije klase).

Page 145: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:#include <iostream>using namespace std;

enum Pravci {Sjever, Istok, Jug, Zapad};

class Robot {int x,y;

Pravci p;public:

void Postavi(int x, int y, Pravci p);void PomjeriSe(int korak);void Nalijevo();void Nadesno();int Pozicija_x() const;int Pozicija_y() const;

Pravci Orjentacija() const;void Ispisi() const;

};

void Robot::Postavi(int x, int y, Pravci p){ Robot::x=x; Robot::y=y; Robot::p=p;}

int Robot::Pozicija_x() const{return Robot::x;

}

int Robot::Pozicija_y() const{return Robot::y;

}

Pravci Robot::Orjentacija() const{return Robot::p;

}

void Robot::PomjeriSe(int korak){if (Robot::p==0) Robot::y+=korak;if (Robot::p==1) Robot::x+=korak;if (Robot::p==2) Robot::y-=korak;if (Robot::p==3) Robot::x-=korak;

}

void Robot::Nalijevo(){if (Robot::p==Sjever) Robot::p=Zapad; elseif (Robot::p==Zapad) Robot::p=Jug; elseif (Robot::p==Jug) Robot::p=Istok; elseif (Robot::p==Istok) Robot::p=Sjever;

}

Page 146: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

void Robot::Nadesno(){if (Robot::p==Sjever) Robot::p=Istok; elseif (Robot::p==Istok) Robot::p=Jug; elseif (Robot::p==Jug) Robot::p=Zapad; elseif (Robot::p==Zapad) Robot::p=Sjever;

}

void Robot::Ispisi() const {char *imena_strana[] = {"Sjever", "Istok", "Jug", "Zapad"};

cout << "Robot se nalazi na poziciji (" << Pozicija_x() << "," << Pozicija_y() << ") i gleda na " << imena_strana[Orjentacija()] << ". " << endl;}

int main(){ Robot DOTS;

int x,y, pr;char *imena_strana[] = {"Sjever", "Istok", "Jug", "Zapad"};

Pravci Strana; cout << "Unesite pocetnu poziciju robota: "; cin >> x >> y; cout << "Unesite pocetnu pravac (0-sjever, 1-istok, 2-jug, 3-zapad): "; cin >> pr;

Strana = Pravci(pr); DOTS.Postavi(x, y, Strana);

for(;;){int pom, mjesta, kuda;

cout << "Unesi 1 za omjeranje robota ili 2 za orjentaciju robota ili 3 za izlaz: "; cin >> pom;

if (pom==1){ cout << "Za koliko mjesta se pomjera robot: ";

cin >> mjesta; DOTS.PomjeriSe(mjesta); }

if (pom==2){ cout << "Na koju stranu (1-nadesno, 2-nalijevo): "; cin >> kuda;

if (kuda==1) DOTS.Nadesno();if (kuda==2) DOTS.Nalijevo();

}

if (pom==3) break;DOTS.Ispisi();}

getchar();return 0;}

Page 147: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

94. Definirajte i implementirajte klasu “Datum” koja omogucavacuvanje datumskih podataka. Klasa treba da ima sljedeciinterfejs:

enum Mjeseci {Januar, Februar, Mart, April, Maj, Juni,Juli, August, Septembar, Oktobar, Novembar, Decembar};Datum();Datum(int dan, Mjeseci mjesec, int godina);void Postavi(int dan, Mjeseci minute, int godina);int Dan() const;Mjeseci Mjesec() const;int Godina() const;int BrojDanaOdPocetkaGodine() const;void Sljedeci();void Prethodni();void PomjeriZa(int broj_dana);void Ispisi() const;Konstruktor bez parametara postavlja datum na 1. 1. 2000. godine,dok konstruktor sa tri parametra postavlja datum na osnovuinformacija koje se prosljedjuju kroz parametre. Konstruktor vršikontrolu ispravnosti datuma, i baca izuzetak u slucaju da suproslijedjeni pogrešni podaci. Metoda “Postavi” nacelno obavljaistu funkciju kao i konstruktor sa tri parametra. Metode “Dan”,“Mjesec” i “Godina” sluze za ocitavanje informacija o danu,mjesecu i godini koje su pohranjene u datumu. Metoda“BrojDanaOdPocetkaGodine” vraca kao rezultat broj dana koji jeprotekao od pocetka godine zapamcene u datumu do dana zapamcenogu datumu (npr. ukoliko je u datumu zapamcen 3. 7. 2002. godine,metoda vraca broj dana koji je protekao od 1. 1. 2002. do 3. 7.2002.). Metode “Sljedeci” i “Prethodni” pomjeraju datum za jedandan unaprijed odnosno unazad, dok metoda “PomjeriZa” pomjeradatum za broj dana naveden parametrom. Pomjeranje se vršiunaprijed ukoliko je parametar pozitivan, a unazad ukoliko jeparametar negativan. Konacno, metoda “Ispisi” ispisuje datum nasljedeci nacin: prvo se ispisuje redni broj dana, zatim tacka,zatim puno ime mjeseca (rijecima) iza koje slijedi razmak, ikonacno redni broj godine iza kojeg takodje slijedi tacka. Naprimjer, ukoliko je u datumu zapamcen datum 3. 7. 2002. na ekranutreba da se ispiše “3.Juli 2002.”. Sve metode implementirajteizvan klase, osim trivijalnih metoda cija implementacija mozestati u jedan red ekrana. Obavezno napišite i mali testni programu kojem ce se testirati svi zahtijevani elementi ove klase.

Page 148: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:#include <iostream>

using namespace std;

// Klasa Datumclass Datum {int d, m, g; // Varijable klasepublic:enum Mjeseci {Januar, Februar, Mart, April, Maj, Juni,Juli, August, Septembar, Oktobar, Novembar, Decembar};explicit Datum(): d(1), m(1), g(2000) {}// Konstruktor bez parametara

// Konstruktor sa parametrima (vodi racuna o ispravnosti datuma)Datum(int dan, Mjeseci mjesec, int godina){int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(godina % 4 == 0 && godina % 100 != 0 || godina % 400 == 0) broj_dana[1]++;if(godina < 1 || dan < 1 || mjesec < 0 || mjesec > 12 || dan > broj_dana[mjesec]) throw "Neispravan datum!\n";d=dan; m=mjesec; g=godina;}

// Metoda Postavivoid Postavi(int dan, Mjeseci minute, int godina);int Dan() const { return d; } // Vraca danMjeseci Mjesec() const { return Mjeseci(m); } // Vraca mjesecint Godina() const { return g; } // Vraca godinuint BrojDanaOdPocetkaGodine() const;void Sljedeci();void Prethodni();void PomjeriZa(int broj_dana);void Ispisi() const;};

// Metoda PomjeriZavoid Datum::PomjeriZa(int broj_dana){if (broj_dana>0) for (int i=0; i<broj_dana; i++) Sljedeci(); elseif (broj_dana<0) for (int i=0; i>broj_dana; i--) Prethodni();}

// Metoda BrojDanaOdPocetkaGodineint Datum::BrojDanaOdPocetkaGodine() const{Datum pom;pom.Postavi(1,Datum::Mjeseci(0),g);int br=0;while(pom.Dan()!=d||pom.Mjesec()!=m){ pom.Sljedeci(); br++; }return br;}

// Metoda Ispisivoid Datum::Ispisi() const{char *imena_mjeseci[] = {"Januar", "Februar", "Mart", "April", "Maj", "Juni", "Juli", "August", "Septembar", "Oktobar", "Novembar", "Decembar"};cout << d << ". " << imena_mjeseci[m] << " " << g << "." << endl;}

Page 149: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Metoda Postavivoid Datum::Postavi(int dan, Mjeseci mjesec, int godina) {int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(godina%4==0 && godina%100 != 0 || godina % 400==0) broj_dana[1]++;if(godina < 1 || dan < 1 || mjesec < 0 || mjesec > 12 || dan > broj_dana[mjesec]) throw "Neispravan datum!\n";d = dan; m = mjesec; g = godina;}

// Metoda Prethodnivoid Datum::Prethodni() {int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(g % 4 == 0 && g % 100 != 0 || g % 400 == 0) broj_dana[1]++;d--;if(d < 1) { if(m==0) d = broj_dana[m]; else d = broj_dana[m-1]; m--;}if(m < 0) { m = 11; g--; }}

// Metoda Sljedecivoid Datum::Sljedeci() {int broj_dana[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};if(g % 4 == 0 && g % 100 != 0 || g % 400 == 0) broj_dana[1]++;d++;if(d > broj_dana[m]) { d = 1; m++; }if(m > 11) { m = 0; g++; }}

// Glavni programint main(){{ Datum test; test.Ispisi(); } // testiranje konstruktora bez parametara

// Testiranje konstruktora sa parametrimaDatum TheLNe(29, Datum::Mjeseci(1), 2000); TheLNe.Ispisi();

// Unos podatakaint dan, mjesec, godina;cout << "Unesi dan: "; cin >> dan;cout << "Unesi mjesec: "; cin >> mjesec;cout << "Unesi godinu: "; cin >> godina;

try{// Postavlja datum i ispisuje gaTheLNe.Postavi(dan,Datum::Mjeseci(mjesec-1),godina);TheLNe.Ispisi();

// Ispis preko jednostavnih metoda klasecout << "Ispis preko jednostavnih metoda klase: " << endl;char *imena_mjeseci[] = {"Januar", "Februar", "Mart", "April","Maj",

"Juni", "Juli", "August", "Septembar", "Oktobar","Novembar", "Decembar"};cout << TheLNe.Dan() << ". " << imena_mjeseci[TheLNe.Mjesec()] << ". " << TheLNe.Godina() << "." << endl;

// Ispis sljedeceg datumaTheLNe.Sljedeci();cout << "Sljedeci datum: " << endl;TheLNe.Ispisi();

Page 150: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Ispis prethodnog datumaTheLNe.Prethodni();cout << "Prethodni datum: " << endl;TheLNe.Ispisi();

// Ispis broja dana koji su protekli od pocetka godinecout << "Broj dana od pocetka godine do trenutnog datuma: " << TheLNe.BrojDanaOdPocetkaGodine() << endl;

// Pomjeri datum za...int pomjeri;cout << "Trenutni datum je: ";TheLNe.Ispisi();cout << "Pomjeri ga za: ";cin >> pomjeri;TheLNe.PomjeriZa(pomjeri);cout << "Sada je: ";TheLNe.Ispisi();}catch(const char poruka[]) {cout << poruka;}

// Kraj programareturn 0;}

Page 151: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

95. Definirajte i implementirati genericku klasu “Vreca” kojasluzi za smještanje kolekcije elemenata jednakog ali proizvoljnogtipa, pri cemu poredak nije moguce imati dva identicna elementaunutar kolekcije (slicno matematskom pojmu skupa). Kolekcijatreba da sadrzi sljedece elemente:

a) Privatne atribute koji redom predstavljaju broj elemenatau vreci, kapacitet vrece (tj. maksimalni broj elemenata koji semogu smjestiti u vrecu), te pokazivac na dinamicki alocirani niz(preciznije, na njegov prvi element) koji ce cuvati elementevrece;

b) Konstruktor sa jednim parametrom tipa cijeli broj, kojipredstavlja kapacitet vrece, i koji vrši dinamicku alokacijuprostora za cuvanje elementa vrece. Inicijalno vreca treba dabude prazna. Pri tome je potrebno zabraniti da se ovajkonstruktor koristi za automatsku konverziju cjelobrojnog tipa utip “Vreca”;

c) Destruktor, koji oslobadja memoriju zauzetukonstruktorom;

d) Konstruktor kopije koji ce osigurati da se objekti tipa“Vreca” mogu bezbjedno prenositi kao parametri po vrijednosti,koristiti za inicijalizaciju drugih objekata istog tipa i vracatikao rezultati iz funkcija;

e) Preklopljeni operator dodjele, koji garantira sigurnododjeljivanje jednog objekta tipa “Vreca” drugom objektu istogtipa, bez problema koji mogu biti uzrokovani kreiranjem plitkihkopija;

f) Metodu sa jednim parametrom, koja dodaje u vrecu elementpredstavljen parametrom. U slucaju da se takav element vec nalaziu vreci, unos elementa treba ignorirati. U slucaju da jedostignut kapacitet vrece, metoda treba da baci izuzetak;

g) Metodu bez parametara, koja vraca kao rezultat brojelemenata u vreci;

h) Metodu sa jednim parametrom, koja vraca kao rezultat“true” ukoliko se element predstavljen parametrom nalazi u vreci,a “false” ukoliko se ne nalazi;

i) Metodu sa jednim parametrom koja uklanja elementpredstavljen parametrom iz vrece. U slucaju da se takav elementne nalazi u vreci, metoda treba da baci izuzetak.

j) Metodu bez parametara koja vraca kao rezultat neki odelemenata iz vrece po slucajnom izboru, osim u slucaju kada jevreca prazna (u tom slucaju, treba baciti izuzetak).Sve metode implementirajte izvan deklaracije klase, osimtrivijalnih metoda koje treba implementirati direktno unutardeklaracije klase. Napisane metode testirajte u testnom programukoji unosi niz rijeci sa tastature, trpa ih u vrecu, a zatimispisuje na ekran sve rijeci smještene u vrecu (koristeci samometode koje objekti tipa “Vreca” podrzavaju).

Page 152: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:#include <iostream>#include <string>#include <algorithm>using namespace std;// Klasa vrecatemplate <typename Tip>class Vreca{

int br, kap; Tip *pok;public: Vreca(const Vreca &v); Vreca &operator =(const Vreca &v);

explicit Vreca(int kap): br(0), kap(kap), pok(new Tip[kap]) {} ~Vreca(){ delete[] pok; }

void Dodaj(Tip element);void Ispisi() const;int VratiBr() { return br; }

void Izbaci(Tip element) {bool istina=true;for(int i=0; i<br; i++) if (element==pok[i]){

for(int j=i; j<br-1; j++) pok[j]=pok[j+1]; br=br-1; istina=false; }

if (istina) throw "Nema trazenog elementa u vreci!"; }

bool Nadji(Tip element) {for(int i=0; i<br; i++) if (element==pok[i]) return true;return false;

}

void Slucajni(){if (br==0) throw "Vreca je prazna!!!";if (br>1){

int broj=(rand()%br-1)+1; cout << pok[broj] << endl;} else if (br==1) cout << pok[0] << endl; }};// Konstruktor kopijetemplate <typename Tip>Vreca<Tip>::Vreca<Tip>(const Vreca<Tip> &v) : br(v.kap), pok(new Tip[v.kap]) { copy(v.pok, v.pok + v.kap, pok);}// Preklopljeni operatortemplate <typename Tip>Vreca<Tip> &Vreca<Tip>::operator =(const Vreca<Tip> &v) {

if(br < v.br) { delete[] pok; pok = new Tip[v.br]; } br = v.br; copy(v.pok, v.pok + v.br, pok);

return *this;}

Page 153: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Metoda Ispisitemplate <typename Tip>

void Vreca<Tip>::Ispisi() const{ cout << "Ispis elemenata vrece: " << endl;

for(int i=0; i<br; i++) cout << pok[i] << endl;}

// Metoda Dodajtemplate <typename Tip>

void Vreca<Tip>::Dodaj(Tip element){if (br==kap) throw "Vreca je puna!!!"; elseif (Nadji(element)) throw "Duplikat!!!";

pok[br]=element; br++;}

// Glavni programint main(){srand (time(NULL)); // Potrebno za izbor slucajnog broja

// Unos kapaciteta vrece i definisanje vreceint kap;cout << "Unesi kapacitet vrece: "; cin >> kap;Vreca<string> TheLNe(kap);

// Unos elemenata vrecefor(;;){string element;cout << "Ubaci element u vrecu (\"izlaz\" za kraj): "; cin >> element;if (element=="izlaz") break;

try{ TheLNe.Dodaj(element); }catch(const char poruka[]) { cout << poruka << endl; }

}

// Ispis broja elemenata vrececout << "Vreca ima " << TheLNe.VratiBr() << " elemenata!" << endl;

// Provjera postojanja nekog elementa u vrecistring element;cout << "Unesi element cije postojanje zelis provjeriti: "; cin >> element;if (TheLNe.Nadji(element)) cout << "POSTOJI!!!" << endl;else cout << "NE POSTOJI!!!" << endl;

// Brisanje elementa iz vrececout << "Unesi element koji zelis izbaciti iz vrece: "; cin >> element;try{ TheLNe.Izbaci(element); }catch(const char poruka[]) { cout << poruka << endl; }// Ispis slucajnog elementa iz vrececout << "Slucajni element: ";try{ TheLNe.Slucajni(); }catch(const char poruka[]) { cout << poruka << endl; }// Ispis svih elemenata vreceTheLNe.Ispisi();

// Kraj programareturn 0;}

Page 154: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

96. Za pracenje dnevnog vodostaja neke rijeke u toku odredjenogvremenskog perioda hidrometeorološka stanica koristi racunarskiprogram u kojem je definirana i implementirana klasa nazvana“Vodostaji”. Ova klasa omogucava cuvanje podataka o vodostajuposmatrane rijeke za u nekom od internih atributa klase kojipredstavlja dinamicki alocirani niz cijelih brojeva (vodostaj seizrazava u centimetrima, zaokruzeno na cijeli broj). Pored ovogatributa, poznato je da klasa sadrzi sljedece elemente:

a) Konstruktor sa jednim parametrom, koji vrši dinamickualokaciju memorije i inicijalizaciju svih ostalih atributa, pricemu parametar predstavlja maksimalan broj podataka o vodostajukoji se mogu registrirati (pri tome je potrebno sprijeciti da seovaj konstruktor koristi za automatsku konverziju cjelobrojnihpodataka u objekte tipa “Vodostaji”);

b) Destruktor koji oslobadja memoriju koju je alociraokonstruktor;

c) Metodu koja vrši registraciju novog podatka o vodostaju,pri cemu se podatak koja se registrira prenosi kao parametarmetode (u slucaju da se dostigne maksimalan broj podataka koje semogu registrirati, treba baciti izuzetak);

d) Metodu koja vraca kao rezultat razliku izmedju najveceg inajmanjeg vodostaja;

e) Metode koje vracaju broj dana u kojima je registriranvodostaj veci od vrijednosti koja je zadata kao parametar, kao ibroj dana u kojima je registriran vodostaj manji od vrijednostikoja je zadata kao parametar (podrazumijeva se da svakiregistrirani vodostaj odgovara jednom danu, tj. da se vodostajiregistriraju jedanput dnevno);

f) Metodu koja vraca kao rezultat prosjecni vodostaj tokomposmatranog perioda;

g) Metodu koja briše sve unesene podatke;h) Metodu koja ispisuje sve registrirane podatke sortirane u

rastucem poretku (tj. Najmanji vodostaj se ispisuje prvi), pricemu se svaki podatak ispisuje u posebnom redu;

Kopiranje i medjusobno dodjeljivanje objekata tipa “Vodostaji”treba zabraniti. Implementirajte klasu sa navedenim svojstvima.Sve neophodne atribute treba obavezno izvesti kao privatneclanove klase, a sve metode implementirati izvan klase, osimmetoda cija implementacija zahtijeva jednu ili dvije naredbe.Obavezno napišite i mali testni program u kojem ce se testiratisve navedene metode.

Page 155: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:#include <iostream>#include <algorithm>

using namespace std;

// Klasa Vodostajiclass Vodostaji{

int *v,br,max; Vodostaji(const Vodostaji &); Vodostaji &operator =(const Vodostaji &);public:

explicit Vodostaji(int max): v(new int[max]), max(max), br(0) {} ~Vodostaji(){ delete[] v; }

void Ispisi() const;void Brisi();void Dodaj(int cm);double Prosjek();int Razlika() { return *max_element(v, v+br)-*min_element(v, v+br); }

int VratiVece(int prag) {int brojac(0);for (int i=0; i<br; i++) if (v[i]>prag) brojac++;return brojac;

}

int VratiManje(int prag) {int brojac(0);for (int i=0; i<br; i++) if (v[i]<prag) brojac++;return brojac;

}};

double Vodostaji::Prosjek(){if (br==0) return 0;double prosjek=0;for(int i=0; i<br; i++) prosjek+=v[i];return prosjek/br;

}

void Vodostaji::Brisi(){for(int i=0; i<br; i++) v[i]=0;

max=0; br=0;}

void Vodostaji::Ispisi() const{ cout << "Ispis registrovanih vodostaja: " << endl; sort(v, v+br);

for(int i=0; i<br; i++) cout << v[i] << endl;}

void Vodostaji::Dodaj(int cm){if (br==max) throw "Nemoze se vise registrovati vodostaja!"; else

v[br]=cm; br++;

Page 156: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

}

int main(){int br;cout << "Unesi maksimalni broj registracija vodostaja: "; cin >> br;

try{Vodostaji TheLNe(br);for(;;){int vod;cout << "Unesi vodostaj (0 za kraj): "; cin >> vod;if (vod==0) break;try{ TheLNe.Dodaj(vod); }catch(const char poruka[]) { cout << poruka << endl; }}cout << "Razlika izmedju max i min vodostaja je: " << TheLNe.Razlika() << endl;

int prag;cout << "Unesi prag: "; cin >> prag;cout << "Imamo " << TheLNe.VratiVece(prag) << " dana kada je vodostaj bio veci od praga!" << endl;cout << "Imamo " << TheLNe.VratiManje(prag) << " dana kada je vodostaj bio manji od praga!" << endl;

cout << "Prosjek: " << TheLNe.Prosjek() << endl;TheLNe.Ispisi();TheLNe.Brisi();}catch(const char poruka[]) { cout << poruka << endl; }

// Kraj programareturn 0;}

Page 157: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

97. Za potrebe nekog fakulteta neophodno je vršiti evidenciju opolaznicima (studentima) i njihovom uspjehu. Za tu svrhu fakultetkoristi racunarski program u kojem je definirana i implementiranaklasa nazvana “Student”, kao i klasa nazvana “Fakultet”. Klasa“Student” sadrzi sljedece elemente:

a) Privatne atribute koje cuvaju podatke o imenu i prezimenustudenta (po maksimalno 20 znakova), broju indeksa (cijeli broj),broju polozenih ispita (cijeli broj) i prosjecnoj ocjeni (realanbroj), i nikave druge atribute;

b) Konstruktor ciji su parametri ime i prezime studenta, kaoi broj indeksa studenta, koji odgovarajuce atribute inicijalizirana vrijednosti zadane parametrima, dok se broj polozenih ispita iprosjecna ocjena inicijaliziraju respektivno na 0 i 5;

c) Trivijalne metode koje vracaju vrijednosti svihodgovarajucih atributa;

d) Metodu sa jednim parametrom, koja sluzi za registracijunovog ispita, a koja povecava broj polozenih ispita za jedinicu iazurira prosjecnu ocjenu u skladu sa ocjenom iz novopolozenogispita, koja se zadaje kao parametar (u slucaju neispravneocjene, treba baciti izuzetak);

e) Metodu koja ispisuje podatke (ime, prezime, brojpolozenih ispita, prosjecna ocjena) o studentu.

Klasa “Fakultet” sadrzi sljedece elemente:a) Privatne atribute koji predstavljaju broj upisanih

studenata, maksimalno moguci broj studenata, kao i pokazivac nadinamicki alocirani niz pokazivaca na objekte tipa “Student”,koji sadrze podatke u upisanim studentima;

b) Konstruktor sa jednim parametrom, koji vrši dinamickualokaciju memorije, pri cemu parametar predstavlja maksimalanbroj studenata koji se mogu upisati (i koji se ne smije koristitiza potrebe automatske konverzije cjelobrojnih vrijednosti uobjekte tipa “Student”), kao i odgovarajuci destruktor;

c) Metodu koja vrši upis novog studenta, pri cemu se kaoparametri metode prenose broj indeksa studenta, kao i njegovo imei prezime studenta (u slucaju da se dostigne maksimalan brojstudenata koji se mogu upisati, treba baciti izuzetak);

d) Metodu koja briše sve upisane studente;e) Metodu koja vrši registraciju nove ocjene. Metoda kao

parametre zahtijeva broj indeksa studenta kao i ocjenu koju jestudent dobio. Ova metoda treba da azurira prosjecnu ocjenustudenta na osnovu novounesene ocjene;

f) Metodu koja ispisuje podatke (ime, prezime, brojpolozenih ispita, prosjecna ocjena) o studentu sa brojem indeksakoji se zadaje kao parametar;

Page 158: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

g) Metodu koja ispisuje imena i prezimena svih studenatacija je prosjecna ocjena veca od vrijednosti koja se zadaje kaoparametar;

h) Metodu koja ispisuje imena i prezimena svih studenatakoji su polozili više ispita od broja koji se zadaje kaoparametar;

i) Metodu koja ispisuje sve upisane studente sortirane uopadajucem poretku po prosjecnoj ocjeni (tj. student sa najvecomprosjecnom ocjenom se ispisuje prvi), pri cemu se podaci o svakomstudentu ispisuju u posebnom redu.

Implementirajte klase “Student” i “Fakultet” sa navedenimsvojstvima. Sve metode implementirajte izvan tijela klase, osimmetoda cija implementacija zahtijeva jednu ili dvije naredbe.Kopiranje i medjusobno dodjeljivanje objekata tipa “Fakultet”treba zabraniti.Obavezno napišite i mali testni program u kojem ce se testiratisve navedene metode.

RJEŠENJE:# include <iostream># include <iomanip>

using namespace std;

// Klasa Studentclass Student{

char Ime[20], Prezime[20];int index, polozenih;double prosjek;

Student(const Student &); Student &operator =(const Student &);

public: Student (char *Ime1, char *Prezime1, int index1): polozenih(0), prosjek(5), index(index1){

int i=0;while(*Ime1!='\0'){

Ime[i]=*Ime1; Ime1++;

i++; } Ime[i]=*Ime1; i=0;

while(*Prezime1!='\0'){ Prezime[i]=*Prezime1; Prezime1++; i++; }

Prezime[i]=*Prezime1; }

Page 159: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

char *VratiIme() { return Ime; }char *VratiPrezime() { return Prezime; }int VratiIndex() { return index; }int VratiPolozenih() { return polozenih; }double VratiProsjek() { return prosjek; }void DodajO(int ocjena);void Ispisi() const;

};

void Student::DodajO(int ocjena){if (ocjena<6||ocjena>10) throw "Neispravna ocjena!";if (prosjek==5) prosjek=ocjena;

else prosjek=((prosjek*polozenih)+ocjena)/(polozenih+1); polozenih++;

}

void Student::Ispisi() const{ cout.precision(3); cout << setw(10) << index << setw(20) << Ime << setw(20) << Prezime << setw(10) << polozenih << setw(10) << prosjek << endl;}

// Klasa Fakultetclass Fakultet{

int BrSt;const int Max;

Student **Studenti; Fakultet(const Fakultet &); Fakultet &operator =(const Fakultet &);public:

explicit Fakultet(int Max): BrSt(0), Max(Max), Studenti(new Student*[Max]) { }

~Fakultet() { for(int i = 0; i < BrSt; i++)delete Studenti[i]; delete[] Studenti; }

void Dodaj(char *Ime1, char *Prezime1, int index1);void DodajOcjenu(int index, int ocjena);void IspisiStatistiku(int index);void IspisiVece(int broj);void IspisiVise(int broj);void IspisiSortirano();void Brisi();

};

void Fakultet::Dodaj(char *Ime1, char *Prezime1, int index1){if (Max==BrSt) throw "Dostignut je maksimalan broj studenata!";

Student *St = new Student(Ime1, Prezime1, index1); Studenti[BrSt] = St; BrSt++;}

Page 160: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

void Fakultet::DodajOcjenu(int index, int ocjena){int pom;bool istina(true);for (int i=0; i<BrSt; i++)

if(index==Studenti[i]->VratiIndex()) { istina=false; pom=i; }if (istina==false) Studenti[pom]->DodajO(ocjena);

else throw "Student ne postoji!";}

void Fakultet::IspisiStatistiku(int index){int pom;bool istina(true);for (int i=0; i<BrSt; i++)

if(index==Studenti[i]->VratiIndex()) { istina=false; pom=i; }if (istina==false) Studenti[pom]->Ispisi();

else throw "Student ne postoji!";}

void Fakultet::IspisiVece(int broj){for (int i=0; i<BrSt; i++)

if(Studenti[i]->VratiProsjek()>broj) Studenti[i]->Ispisi();}

void Fakultet::IspisiVise(int broj){for (int i=0; i<BrSt; i++)

if(Studenti[i]->VratiPolozenih()>broj) Studenti[i]->Ispisi();}

void Fakultet::IspisiSortirano(){if (BrSt==0) throw "Nema studenata u bazi!";for (int i=0;i<(BrSt-1);i++)for (int j=i+1;j<BrSt;j++)if (Studenti[j]->VratiProsjek()>Studenti[i]->VratiProsjek()){

Student *pom; pom=Studenti[i]; Studenti[i]=Studenti[j]; Studenti[j]=pom; } cout << endl << "Sortirano: " << endl;

for (int i=0; i<BrSt; i++) Studenti[i]->Ispisi();}

void Fakultet::Brisi(){for (int i=0; i<BrSt; i++) delete Studenti[i];

BrSt=0;}

Page 161: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Glavni programint main(){

int Max; cout << "Unesi maksimalni broj studenata: "; cin >> Max; Fakultet F(Max);

for(;;){char ime[20], prezime[20];int index;

cout << "Unesi broj indexa studenta(0 za kraj): "; cin >> index;

if (index==0) break; cout << "Unesi ime studenta: "; cin >> ime;

cout << "Unesi prezime studenta: "; cin >> prezime;try { F.Dodaj(ime, prezime, index); }catch(const char poruka[]) { cout << poruka << endl; }

}

for(;;){int index, ocjena;

cout << "Broj indexa na koji treba upisati ocjenu(0 - kraj): "; cin >> index;

if (index==0) break; cout << "Unesi ocjenu: "; cin >> ocjena;

try { F.DodajOcjenu(index, ocjena); }catch(const char poruka[]) { cout << poruka << endl; }

}

for(;;){int index;

cout << "Broj indexa za koji treba ispisati stat.(0 - kraj): "; cin >> index;

if (index==0) break;try { F.IspisiStatistiku(index); }catch(const char poruka[]) { cout << poruka << endl; }

} {

double broj; cout << "Ispisi one ciji je prosjek veci od: "; cin >> broj;

try { F.IspisiVece(broj); }catch(const char poruka[]) { cout << poruka << endl; }

} {

double broj; cout << "Ispisi one koji su polozili vise od ? predmeta: "; cin >> broj;

try { F.IspisiVise(broj); }catch(const char poruka[]) { cout << poruka << endl; }

}try { F.IspisiSortirano(); }catch(const char poruka[]) { cout << poruka << endl; }

F.Brisi(); cout << "Izbrisano!!!" << endl;

// Kraj programareturn 0;}

Page 162: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

98. Definirajte i implementirajte klasu “Polinom”, kojaomogucava rad sa polinomima. Klasa treba da ima konstruktor sadva parametra koji predstavljaju redom stepen polinoma, kao i imenezavisne varijable u polinomu, koje obavezno predstavlja samojedan znak, a ne string (ovo ce se koristiti samo pri ispisupolinoma). Koeficijenti polinoma treba da se cuvaju u dinamickialociranom nizu realnih brojeva. Zbog toga je neophodno da klasaima definirane i destruktor, konstruktor kopije i prekopljenioperator dodjele (inace nece biti moguce definirati operatorskefunkcije koje ce raditi ispravno). Klasa bi trebala da imapreklopljeni operator “[]” kojim se omogucava pristupkoeficijentima polinoma. Indeksi koeficijenata polinoma se krecuod nule (slobodni clan) do stepena polinoma, a u slucaju indeksaizvan opsega treba baciti izuzetak. Za racunanje vrijednostipolinoma koristi se preklopljeni operator “()” kojem seprosljedjuje vrijednost argumenta za koji treba izracunativrijednost polinoma. Treba podrzati i binarne operatore “+”, “–”,“*”, “/” i “%” za sabiranje, oduzimanje, mnozenje, djeljenje inalazenje ostatka pri dijeljenju dva polinoma, njihove bliskesrodnike “+=”, “–=”, “*=”,“/=” i “%=”, kao i unarni operator “–”koji kao rezultat daje polinom sa izvrnutim predznacima svihkoeficijenata. Binarne operacije nad polinomima su podrzane samonad dva polinoma koji zavise od iste promjenljive (u suprotnom,treba baciti izuzetak). Dalje, treba podrzati i binarne relacioneoperatore “==” i “!=” koji testiraju jednakost, odnosnonejednakost dva polinoma. Konacno, treba podrzati i operator zaispis “<<” koji ispisuje polinom na ekran, koristeci imenezavisne varijable koje je bilo zadato u konstruktoru. Naprimjer, moguci izgled ispisanog polinoma mogao bi izgledatiovako:

3 + 2 x^2 – 4 x^3 – x^5 + 6 x^6uz pretpostavku da su koeficijenti polinoma bili redom 3, 0, 2, –4, 0, –1 i 6. Obavezno napišite i mali testni program u kojem cese testirati svi zahtijevani elementi ove klase.

Page 163: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:# include <iostream># include <vector>

using namespace std;

// Klasa Polinomclass Polinom{

int red;char X;double *koef;

public: Polinom(int red, char X): red(red), X(X), koef(new double[red])

{ for(int i=0; i<red; i++) koef[i]=0; } ~Polinom(){ delete[] koef; }

// Definisanje prototipovavoid Dodaj(vector<double> v);

Polinom(const Polinom &v); Polinom &operator =(const Polinom &v);

double operator [](int i) const;double &operator [](int i);double operator ()(double x) const;friend Polinom operator +(const Polinom &v1, const Polinom &v2);friend Polinom operator -(const Polinom &v1, const Polinom &v2);friend Polinom operator *(const Polinom &v1, const Polinom &v2);friend Polinom operator /(const Polinom &v1, const Polinom &v2);friend Polinom operator %(const Polinom &v1, const Polinom &v2);friend Polinom operator -(const Polinom &v);friend ostream &operator <<(ostream &cout, const Polinom &v);friend bool operator ==(const Polinom &v1, const Polinom &v2);friend bool operator !=(const Polinom &v1, const Polinom &v2);

// Definisanje jednostavnijih metoda

// Preklapanje operatora += Polinom &operator +=(const Polinom &v) {

return *this = *this + v; }

// Preklapanje operatora -= Polinom &operator -=(const Polinom &v) {

return *this = *this - v; }

// Preklapanje operatora *= Polinom &operator *=(const Polinom &v) {

return *this = *this * v; }

// Preklapanje operatora /= Polinom &operator /=(const Polinom &v) {

return *this = *this / v; }

// Preklapanje operatora %= Polinom &operator %=(const Polinom &v) {

return *this = *this % v; }};

Page 164: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Konstruktor kopijePolinom::Polinom(const Polinom &v) : red(v.red), koef(new double[v.red]) { copy(v.koef, v.koef + v.red, koef);}// Preklapanje operatora =Polinom &Polinom::operator =(const Polinom &v) {

if(red < v.red) { delete[] koef; koef = new double[v.red]; } red = v.red; copy(v.koef, v.koef + v.red, koef);

return *this;}// Preklapanje operatora []double Polinom::operator [](int i) const {

if(i < 0 || i > red-1) throw "Pogresan indeks!\n";return koef[i];

}

// Preklapanje operatora []double &Polinom::operator [](int i) {

if(i < 0 || i > red-1) throw "Pogresan indeks!\n";return koef[i];

}

// Preklapanje operatora ()double Polinom::operator ()(double x) const {

double suma(0);for(int i = red - 1; i >= 0; i--)

suma = suma * x + koef[i];return suma;

}

// Preklapanje operatora <<ostream &operator <<(ostream &cout, const Polinom &v) {

bool istina(false);for(int i = 0; i < v.red; i++){

if (v.koef[i]==0) continue;double pom=v.koef[i];char z='+';if (pom>0) z='+'; else { z='-'; pom*=-1; }if (i==0) { cout << v.koef[i]; istina=true; } elseif (i==1) { cout << " ";

if(istina) cout << z << " ";if(pom!=1&&pom!=-1) cout << pom << " ";

cout << v.X; istina=true;

}else {

cout << " ";if(istina) cout << z << " ";if(pom!=1&&pom!=-1) cout << pom << " ";

cout << v.X << "^" << i; istina=true;

} }if (istina==false) cout << 0;return cout << "";

}

Page 165: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Implementacija metode Dodaj()void Polinom::Dodaj(vector<double> v){

for(int i=0; i<red; i++) koef[i]=v[i];}

// Preklapanje operatora +Polinom operator +(const Polinom &v1, const Polinom &v2) {

int max=v2.red, min=v1.red;if (v1.red>v2.red) { max=v1.red; min=v2.red; }

Polinom pom(max,'X');for (int i=0; i<max; i++){

if (i<min) pom[i]=v1[i]+v2[i];else {

if (v2.red==max) pom[i]=v2[i]; else pom[i]=v1[i]; }

}return pom;

}

// Preklapanje unarnog operatora -Polinom operator -(const Polinom &v) { Polinom pom(v.red,'X');

for (int i=0; i<v.red; i++) pom[i]=-1*v[i];return pom;

}

// Preklapanje operatora -Polinom operator -(const Polinom &v1, const Polinom &v2) {

return v1 + -v2;}

// Preklapanje operatora *Polinom operator *(const Polinom &v1, const Polinom &v2) { Polinom pom(v1.red+v2.red,'X');

for(int i=0; i<v1.red; i++)for(int j=0; j<v2.red; j++) pom[i+j]+=v1[i]*v2[j];

return pom;}

// Preklapanje operatora /Polinom operator /(const Polinom &v1, const Polinom &v2) {

if (v1.red<v2.red) throw "Nemoguce dijeliti!!!"; Polinom p(0,'X'), r(0,'X'), pom(v1.red-v2.red+1,'X'); p=v1;

int br=p.red;for (int i=br-v2.red; i>=0; i--){

pom[i]=p[br-1]/v2[v2.red-1]; r=pom; p=v1 + -(v2*r); r[i]=0; br--; }

return pom;}

Page 166: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Preklapanje operatora %Polinom operator %(const Polinom &v1, const Polinom &v2) {

if (v1.red<v2.red) throw "Nemoguce dijeliti!!!"; Polinom p(0,'X'), r(0,'X'), pom(v1.red-v2.red+1,'X'); p=v1;

int br=p.red;for (int i=br-v2.red; i>=0; i--){

pom[i]=p[br-1]/v2[v2.red-1]; r=pom; p=v1 + -(v2*r); r[i]=0; br--; }

return p;}

// Preklapanje operatora ==bool operator ==(const Polinom &v1, const Polinom &v2) {

int max=v2.red, min=v1.red;if (v1.red>v2.red) { max=v1.red; min=v2.red; }for (int i=0; i<min; i++) if (v1[i]!=v2[i]) return false;if (max==v2.red) for (int i=min; i<max; i++)

if (v2[i]!=0) return false;else for (int i=min; i<max; i++)

if (v1[i]!=0) return false;}

// Preklapanje operatora !=bool operator !=(const Polinom &v1, const Polinom &v2) {

if (v1==v2) return false; else return true;}

int main(){int red;

cout << "Unesi red prvog polinoma (npr. 3 red je do X^2): "; cin >> red; Polinom pol(red,'X'); { vector<double> v;

cout << "Unesi redom koef. prvog polinoma: " << endl;for(int i=1; i<=red; i++){

double pom; cout << "X" << i << ": "; cin >> pom;

v.push_back(pom); }

pol.Dodaj(v); }

cout << "Unesi red drugog polinoma: "; cin >> red; Polinom pol1(red,'X'); { vector<double> v; cout << "Unesi redom koef. drugog polinoma: " << endl;

for(int i=1; i<=red; i++){double pom;

cout << "X" << i << ": "; cin >> pom;

Page 167: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

v.push_back(pom); } pol1.Dodaj(v); } cout << "Prvi polinom je: " << pol << endl; cout << "Drugi polinom je: " << pol1 << endl; cout << "Zbir je: " << pol+pol1 << endl; cout << "Razlika je(prvi minus drugi): " << pol-pol1 << endl; cout << "Proizvod je: " << pol*pol1 << endl;

try { cout << "Kolicnik je: " << pol/pol1 << endl;

}catch(const char poruka[]) {

cout << poruka << endl; }

try { cout << "Ostatak dijeljenja: " << pol%pol1 << endl;

}catch(const char poruka[]) {

cout << poruka << endl; }

if (pol==pol1) cout << "Polinomi su jednaki!!!" << endl;else cout << "Polinomi nisu jednaki!!!" << endl;

try { cout << "Drugi koef. prvog polinoma:" << pol[1] << endl;

}catch(const char poruka[]) {

cout << poruka << endl; }

cout << "Vrijednost prvog polinoma za X=2 je: " << pol(2) << endl;

return 0;}

Page 168: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

99. Jedan od nedostataka jezika opce namjene kao sto je C++ uodnosu na specijalisticke matematski orjentirane jezike jenepostojanje podrške za egzaktni rad sa racionalnim brojevima(razlomcima) kakav postoji npr. u programskom paketu Mathematica.Srecom, koncept klasa u jeziku C++ omogucava korisniku da samdefinira nove tipove podataka koji zadovoljavaju njegove potrebe.Vaš zadatak je da definirate novi tip podataka (klasu) nazvan“Razlomak” koji omogucava tacan rad sa razlomcima (umjestonjihovog pribliznog predstavljanja preko decimalnih brojeva).Klasa “Razlomak” treba da sadrzi sljedece elemente:

a) Privatne atribute koji cuvaju vrijednost brojnika inazivnika;

b) Konstruktor sa dva parametra, koji respektivnopredstavljaju vrijednost brojnika i nazivnika razlomka. Ovajkonstruktor treba automatski da izvrsi skracivanje eventualnihzajednickih faktora u brojniku i nazivniku, tako da cedeklaracija poput Razlomak r(10,15); dovesti do toga da cebrojnik razlomka “r” biti 2, a nazivnik 3. Takodjer, konstruktortreba da obezbijedi da u slucaju da je razlomak negativan,negativni znak bude zapamcen u brojniku, a ne u nazivniku. Drugimrijecima, nakon deklaracije Razlomak r(2, –3); vrijednostbrojnika treba da bude –2, a nazivnika 3. Naravno, nakondeklaracije poput Razlomak r(–2, –3); vrijednosti brojnika inazivnika treba da budu 2 i 3, jer se negativni znak krati. Uslucaju da se za vrijednost nazivnika zada nula, konstruktortreba da baci izuzetak;

c) Konstruktor sa jednim parametrom, koji postavljavrijednost brojnika na vrijednost zadanu parametrom, a vrijednostnazivnika na jedinicu. Ovaj konstruktor treba da omogucipretvorbu cjelobrojnih vrijednosti u vrijednosti tipa “Razlomak”;

d) Konstruktor bez parametara, koji postavlja vrijednostbrojnika na nulu, a vrijednost nazivnika na jedinicu, tj. kojikreira nul-razlomak;

e) Metode kojima je moguce saznati vrijednost brojnika,odnosno nazivnika razlomka;

f) Preklopljene binarne operatore “+”, “-”, “*” i “/” kojitreba da omoguce cetiri osnovne operacije sa razlomcima.Rezultati svake od operacija uvijek treba da budu do krajaskraceni (sto cete najlakše postici tako što cete brojnik inazivnik zeljenog rezultata prosto proslijediti konstruktoru,koji ce obaviti neophodno skracivanje);

g) Preklopljene unarne operatore “+” i “–”. Unarni operator“–” treba da izvrce znak razlomku, a unarni operator “+” ne trebada radi ništa;

h) Preklopljene operatore “+=”,“–=”,“*=” i “/=”, pri cemuizrazi “R1+=R2”, “R1–=R2”, “R1*=R2” i “R1/=R2” treba da

Page 169: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

respektivno predstavljaju skracene zapise za izraze “R1=R1+R2”,“R1=R1–R2”, “R1=R1*R2” i “R1=R1/R2”;

i) Preklopljene unarne operatore “++” i “––”, pri cemuizrazi “R++” i “R--” efektivno djeluju kao izrazi “R += 1” i “R -= 1”. Pri tome treba podrzati kako prefiksnu, tako i postfiksnuverziju ovih operatora, pri cemu postfiksne verzije vracaju kaorezultat vrijednost razlomka prije obavljene izmjene;

j) Preklopljen operator “<<” koji treba da podrzi ispisobjekata tipa “Razlomak” na ekran. Ukoliko je p brojnik a qnazivnik razlomka koji se ispisuje, ispis treba da izgleda kaop/q, osim ukoliko je nazivnik jednak jedinici, kada se ispisujesamo vrijednost brojnika (kao cijeli broj);

k) Preklopljen operator “>>” koji treba da podrzi unosobjekata tipa “Razlomak” sa tastature. Potrebno je omoguciti dase objekti tipa “Razlomak” unose u formi p/q, gdje su p i qcijeli brojevi, ali treba omoguciti da se unese i obicni cijelibroj (u tom slucaju se podrazumijeva da je nazivnik jedinica);

l) Preklopljene relacione operatore “<”,“>”,“<=”,“>=”,“==” i“<>” koje ispituju odnose izmedju dva razlomka. Poput svihrelacionih operatora, ovi operatori vracaju kao rezultat “true” uslucaju da je relacija zadovoljena, a “false” ukoliko nije;

m) Preklopljeni operator konverzije tipa “Razlomak” u tip“double” koji omogucava upotrebu promjenljivih tipa “Razlomak” ukontekstima gdje se ocekuju realni brojevi, tj. promjenljive tipa“double”. Ovaj operator treba da vrati kao rezultat pribliznudecimalnu vrijednost koja se dobija dijeljenjem brojnika sanazivnikom.

Sve metode implementirajte izvan deklaracije klase, osimtrivijalnih metoda koje trebate implementirati direktno unutardeklaracije klase. Sve metode koje su inspektori, obaveznodeklarirajte kao takve. Dalje je potrebno da napišete testniprogram koji ce odraditi sljedece:

a) Demonstrirati rad svih napisanih metoda i operatora nadnekoliko fiksno zadanih razlomaka (po vlastitom izboru);

b) Traziti od korisnika da unese broj elemenata niza, azatim dinamicki alocirati niz elemenata tipa “Razlomak”;

c) Ucitati sa tastature elemente alociranog niza, sortiratiih u rastuci poredak, i ispisati sortirani niz razlomaka na ekrani u tekstualnu datoteku “RAZLOMCI.TXT”.

Page 170: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:# include <iostream># include <cmath># include <fstream>

using namespace std;

class Razlomak{int b, n;

public:// Konstruktori

Razlomak(int b, int n){if (n==0) throw "Nazivnik nemoze biti 0!";int min=abs(b);if (abs(n)<min) min=abs(n);for(int i=2; i<=min; i++){

if (abs(b)%i==0&&abs(n)%i==0) { b=b/i; n=n/i; i--; } }

if (n<0) { n=-n; b=-b; } Razlomak::b=b; Razlomak::n=n; } Razlomak(int b){ Razlomak::b=b; Razlomak::n=1; }

Razlomak(){ Razlomak::b=0; Razlomak::n=1; }

// Prototipovi metoda i definisanje nekih jednostavnijih metoda

friend ostream &operator <<(ostream &cout, const Razlomak &v);friend istream &operator >>(istream &cin, Razlomak &a);friend Razlomak operator -(const Razlomak &v);friend Razlomak operator +(const Razlomak &v);friend Razlomak operator +(const Razlomak &v1, const Razlomak &v2);friend Razlomak operator -(const Razlomak &v1, const Razlomak &v2);friend Razlomak operator *(const Razlomak &v1, const Razlomak &v2);friend Razlomak operator /(const Razlomak &v1, const Razlomak &v2);friend Razlomak &operator ++(Razlomak &v);friend Razlomak operator ++(Razlomak &v, int);friend Razlomak &operator --(Razlomak &v);friend Razlomak operator --(Razlomak &v, int);friend bool operator ==(const Razlomak &v1, const Razlomak &v2);friend bool operator !=(const Razlomak &v1, const Razlomak &v2);friend bool operator <(const Razlomak &v1, const Razlomak &v2);friend bool operator >(const Razlomak &v1, const Razlomak &v2);friend bool operator <=(const Razlomak &v1, const Razlomak &v2);friend bool operator >=(const Razlomak &v1, const Razlomak &v2);operator double() const;

// Metoda vraca nazivnikint VratiN() const { return n; }

// Metoda vraca brojnikint VratiB() const { return b; }

Page 171: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Preklapanje operatora += Razlomak &operator +=(const Razlomak &v) {

return *this = *this + v; }

// Preklapanje operatora -= Razlomak &operator -=(const Razlomak &v) {

return *this = *this - v; }

// Preklapanje operatora *= Razlomak &operator *=(const Razlomak &v) {

return *this = *this * v; }

// Preklapanje operatora /= Razlomak &operator /=(const Razlomak &v) {

return *this = *this / v; }};

// Operator konverzijeRazlomak::operator double() const {

double r(0);r=(double)b/n;return r;

}

// Preklapanje operatora ==bool operator ==(const Razlomak &v1, const Razlomak &v2) {

return v1.n == v2.n && v1.b == v2.b;}

// Preklapanje operatora !=bool operator !=(const Razlomak &v1, const Razlomak &v2) {

return v1.n != v2.n || v1.b != v2.b;}

// Preklapanje operatora <bool operator <(const Razlomak &v1, const Razlomak &v2) {

return (double)v1.b/v1.n<(double)v2.b/v2.n;}

// Preklapanje operatora >bool operator >(const Razlomak &v1, const Razlomak &v2) {

return (double)v1.b/v1.n>(double)v2.b/v2.n;}

// Preklapanje operatora >=bool operator >=(const Razlomak &v1, const Razlomak &v2) {

return (double)v1.b/v1.n>=(double)v2.b/v2.n;}

// Preklapanje operatora <=bool operator <=(const Razlomak &v1, const Razlomak &v2) {

return (double)v1.b/v1.n<=(double)v2.b/v2.n;}

Page 172: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Preklapanje operatora ++ prefiksnaRazlomak &operator ++(Razlomak &v) {

v=v+Razlomak(1);return v;

}

// Preklapanje operatora ++ postfiksnaRazlomak operator ++(Razlomak &v, int) {

Razlomak pomocni = v;v=v+Razlomak(1);return pomocni;

}

// Preklapanje operatora -- prefiksnaRazlomak &operator --(Razlomak &v) {

v=v-Razlomak(1);return v;

}

// Preklapanje operatora -- postfiksnaRazlomak operator --(Razlomak &v, int) {

Razlomak pomocni = v;v=v-Razlomak(1);return pomocni;

}

// Preklapanje operatora <<ostream &operator <<(ostream &cout, const Razlomak &v) {

if (v.n==1) cout << v.b; else cout << v.b << "/" << v.n;return cout << "";

}

// Preklapanje operatora >>istream &operator >>(istream &cin, Razlomak &a) {

char znak; cin >> ws; cin >> a.b;

if(cin.peek() == '/') { cin >> znak >> a.n; }

else a.n=1; a=Razlomak(a.b,a.n);

return cin;}

// Preklapanje unarnog operatora -Razlomak operator -(const Razlomak &v) { Razlomak pom(v.b,v.n); pom.b=-pom.b;

return pom;}

// Preklapanje unarnog operatora +Razlomak operator +(const Razlomak &v) { Razlomak pom(v.b,v.n);

return pom;}

Page 173: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Preklapanje operatora +Razlomak operator +(const Razlomak &v1, const Razlomak &v2){

int b1, n1;n1=v1.n*v2.n;b1=(n1/v1.n)*v1.b + (n1/v2.n)*v2.b;return Razlomak(b1, n1);

}

// Preklapanje operatora -Razlomak operator -(const Razlomak &v1, const Razlomak &v2){

return v1 + -v2;}

// Preklapanje operatora *Razlomak operator *(const Razlomak &v1, const Razlomak &v2){

int b1, n1;n1=v1.n*v2.n;b1=v1.b*v2.b;return Razlomak(b1, n1);

}

// Preklapanje operatora /Razlomak operator /(const Razlomak &v1, const Razlomak &v2){

int b1, n1;n1=v1.n*v2.b;b1=v1.b*v2.n;return Razlomak(b1, n1);

}

// Glavni programint main(){

try { Razlomak R1(2,-7), R2(3,-4); cout << "Razlomak 1: " << R1 << " ili " << (double)R1 << endl; cout << "Razlomak 2: " << R2 << " ili " << (double)R2 << endl; cout << "Zbir: " << R1 + R2 << endl; cout << "Razlika: " << R1 - R2 << endl; cout << "Proizvod: " << R1 * R2 << endl; cout << "Kolicnik: " << R1 / R2 << endl; cout << "Rjesenje izraza (R1+R2)/(R1*R2)+R1: "

<< (R1+R2)/(R1*R2)+R1 << endl;if (R1<R2) cout << "R2 je veci!"; else cout << "R1 je veci!";

}catch(const char poruka[]) {

cout << poruka << endl;}

int n;cout << endl << endl << "Koliko elemenata: ";cin >> n;

Razlomak *Niz;Niz=new Razlomak[n];for (int i=0; i<n; i++){ Razlomak R; cin >> R;

Page 174: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

Niz[i]=R;}

for (int i=0;i<n-1;i++) for (int j=i+1;j<n;j++)if(Niz[i]<Niz[j]){

Razlomak pom;pom=Niz[i];Niz[i]=Niz[j];Niz[j]=pom;

}

ofstream izlaz("RAZLOMCI.TXT");cout << "Sortirano: " << endl;for (int i=0;i<n;i++) {

cout << Niz[i] << endl;izlaz << Niz[i] << endl;

}izlaz.close();

delete[] Niz;return 0;

}

Page 175: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

100. U raznim oblastima matematike cesto se javlja potreba zaradom sa skupovima. Vaš zadatak je da razvijete genericku klasu“Skup” koja predstavlja skup ciji elementi mogu bitiproizvoljnog, ali istog tipa (odnosno svi elementi skupa morajubiti istog tipa, tako da skupovi heterogenog sastava nisupodrzani), za koje cemo pretpostaviti da je definiran poredakpomocu operatora “<”.Klasa treba da ima sljedece elemente:

a) Privatne atribute koji redom predstavljaju broj elemenatau skupu, kapacitet skupa (tj. maksimalni broj elemenata koji semogu smjestiti u skup) i pokazivac na dinamicki alocirani niz(preciznije, na njegov prvi element) koji ce cuvati elementeskupa;

b) Konstruktor sa jednim parametrom, koji predstavljakapacitet skupa, i koji vrši dinamicku alokaciju prostora zacuvanje elemenata skupa. Inicijalni broj elemenata kreiranogskupa je 0 (prazan skup). Pri tome je potrebno zabraniti da seovaj konstruktor koristi za automatsku konverziju cjelobrojnogtipa u tip “Skup”;

c) Destruktor, koji oslobadja memoriju zauzetukonstruktorom;

d) Konstruktor kopije koji ce osigurati da se objekti tipa“Skup” mogu bezbjedno prenositi kao parametri po vrijednosti ivracati kao rezultati iz funkcija;

e) Preklopljeni operator dodjele, koji garantira sigurnododjeljivanje jednog skupa drugom skupu, bez problema koji mogubiti uzrokovani kreiranjem plitkih kopija;

f) Metodu sa jednim parametrom, koja dodaje u skup elementpredstavljen parametrom. U slucaju da se takav element vec nalaziu skupu, unos elementa treba ignorirati (ne zaboravimo da skupovipo matematskoj definiciji ne mogu sadrzavati jednake elemente).U slucaju da je dostignut kapacitet skupa, metoda treba da baciizuzetak;

g) Metodu bez parametara, koja vraca kao rezultat brojelemenata skupa;

h) Metodu sa jednim parametrom, koja vraca kao rezultat“true” ukoliko se element predstavljen parametrom nalazi u skupu,a “false” ukoliko se ne nalazi;

i) Preklopljen unarni operator “!”, koji primijenjen na skupdaje “true” ukoliko je skup prazan, a “false” ukoliko nije;

j) Preklopljen operator “<<” koji treba da podrzi ispisskupova na ekran. Skupovi se ispisuju kao slijed svojih elemenataunutar viticastih zagrada, medjusobno razdvojenih zarezima. Priispisu, elementi treba da budu sortirani u rastuci poredak(redoslijed elemenata je kod skupova svakako nebitan). Za

Page 176: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

sortiranje mozete koristiti funkciju “sort” (bez funkcijekriterija, jer je pretpostavljeno da su elementi skupa takvi daje za njih definiran poredak uz pomoc operatora “<”);

k) Preklopljene binarne operatore “+”, “*” i “-” koji redomnalaze uniju, presjek i razliku skupova koji su navedeni kaooperandi. Uputa: Ranije napisane metode za dodavanje novogelementa u skup i ispitivanje da li element pripada skupu moguVam biti od velike koristi pri pisanju operatorskih funkcija zaove operatore. Dalje, kapacitet skupa koji cete vratiti kaorezultat unije “A + B” mozete definirati kao zbir broja elemenataskupova “A” i “B”, bez obzira sto ce broj elemenata unije “A + B”mozda biti manji, ukoliko skupovi “A” i “B” sadrze zajednickeelemente (ionako ce prilikom dodjele tipa “C = A + B” rezultatbiti kopiran u skup “C”, a pri ispisu tipa “cout << A + B” zbir“A + B” se svakako tretira kao privremeni objekat). Slicno, zakapacitet presjeka “A * B” i razlike “A - B” mozete uzeti brojelemenata skupa “A”, jer “A * B” i “A – B”svakako ne mogu imati više elemenata nego što ima skup “A”;

l) Prekopljene binarne operatore “+=”,“*=” i “–=” pri cemuizrazi “A+=B”, “A*=B” i “A–=B” predstavljaju respektivno skracenezapise za izraze “A=A+B”, “A=A*B” i “A=A–B”;

m) Preklopljene binarne relacione operatore“<=”,“>=”,“==”,“!=”,“<” i “>” pri cemu relacije “A <= B”, “A >=B”, “A == B”, “A != B”, “A < B” i “A > B” predstavljajurespektivno odnose “A je podskup od B”, “A je nadskup od B”, “A iB su jednaki”, “A i B su razliciti”, “A je pravi podskup od B”,“A je pravi nadskup od B”.Uputa: Prvo definirajte operator “<=”. Dalje, vrijedi “A >= B”ako je “B <= A”. Vrijedi “A == B” ako je “A >= B” i “A <= B”.Vrijedi “A != B” ako nije “A == B”. Vrijedi “A < B” ako je “A <=B” i “A != B”. Vrijedi “A > B” ako je “A >= B” i “A != B”. Dakle,sve relacione operatore mozete definirati polazeci samo odoperatora “<=”.Sve metode implementirajte izvan deklaracije klase, osimtrivijalnih metoda koje trebate implementirati direktno unutardeklaracije klase. Obavezno napišite i testni program u kojemcete demonstrirati sve elemente napisane genericke klaseuzimajuci stringove (tj. objekte tipa “string”) za elementeskupova.

Page 177: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

RJEŠENJE:# include <iostream>using namespace std;

// Genericka klasa Skuptemplate<typename Tip>class Skup {

int br, kap; Tip *S;public:

explicit Skup(int kap): kap(kap), br(0), S(new Tip[kap]) {} ~Skup(){ delete[] S; }

// Definisanje prototipova Skup(const Skup &v);

Skup &operator =(const Skup &v);void Dodaj(Tip element);

template<typename Tip2>friend bool operator !(const Skup<Tip2> &v);

template<typename Tip2>friend ostream &operator <<(ostream &cout, const Skup<Tip2> &v);

template<typename Tip2>friend Skup<Tip2>

operator +(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend Skup<Tip2>

operator *(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend Skup<Tip2>

operator -(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend bool operator <=(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend bool operator >=(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend bool operator ==(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend bool operator !=(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend bool operator <(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

template<typename Tip2>friend bool operator >(const Skup<Tip2> &v1, const Skup<Tip2> &v2);

Page 178: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Definisanje nekih jednostavnijih metoda

// Metoda Nadjibool Nadji(Tip element) {

for(int i=0; i<br; i++) if (element==S[i]) return true;return false;

}

int VratiBr() { return br; }

// Preklapanje operatora += Skup<Tip> &operator +=(const Skup<Tip> &v) {

return *this = *this + v; }

// Preklapanje operatora *= Skup<Tip> &operator *=(const Skup<Tip> &v) {

return *this = *this * v; }

// Preklapanje operatora -= Skup<Tip> &operator -=(const Skup<Tip> &v) {

return *this = *this - v; }};

// Preklapanje operatora <=template <typename Tip>bool operator <=(const Skup<Tip> &v1, const Skup<Tip> &v2){

Skup<Tip> pom(v2.br);for (int i=0; i<v2.br; i++) { pom.Dodaj(v2.S[i]); }for (int i=0; i<v1.br; i++)

if (pom.Nadji(v1.S[i])==false) return false;return true;

}

// Preklapanje operatora >=template <typename Tip>bool operator >=(const Skup<Tip> &v1, const Skup<Tip> &v2){

if (v1<=v2) return false; else return true;}

// Preklapanje operatora ==template <typename Tip>bool operator ==(const Skup<Tip> &v1, const Skup<Tip> &v2){

if (v1<=v2&&v1>=v2) return true; else return false;}

// Preklapanje operatora !=template <typename Tip>bool operator !=(const Skup<Tip> &v1, const Skup<Tip> &v2){

if (v1==v2) return false; else return true;}

Page 179: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Preklapanje operatora <template <typename Tip>bool operator <(const Skup<Tip> &v1, const Skup<Tip> &v2){

if (v1<=v2&&v1!=v2) return true; else return false;}

// Preklapanje operatora >template <typename Tip>bool operator >(const Skup<Tip> &v1, const Skup<Tip> &v2){

if (v1>=v2&&v1!=v2) return true; else return false;}

// Preklapanje operatora +template <typename Tip>Skup<Tip> operator +(const Skup<Tip> &v1, const Skup<Tip> &v2) { Skup<Tip> pom(v1.br+v2.br);

for (int i=0; i<v1.br; i++) { pom.Dodaj(v1.S[i]); }for (int i=0; i<v2.br; i++) if (pom.Nadji(v2.S[i]));

else { pom.Dodaj(v2.S[i]); }return pom;

}

// Preklapanje operatora *template <typename Tip>Skup<Tip> operator *(const Skup<Tip> &v1, const Skup<Tip> &v2) { Skup<Tip> pom(v1.br); Skup<Tip> p(v1.br);

for (int i=0; i<v1.br; i++) { p.Dodaj(v1.S[i]); }for (int i=0; i<v2.br; i++)

if (p.Nadji(v2.S[i])) { pom.Dodaj(v2.S[i]); }return pom;

}

// Preklapanje operatora -template <typename Tip>Skup<Tip> operator -(const Skup<Tip> &v2, const Skup<Tip> &v1) { Skup<Tip> pom(v1.br); Skup<Tip> p(v1.br);

for (int i=0; i<v1.br; i++) { p.Dodaj(v1.S[i]); }for (int i=0; i<v2.br; i++)

if (p.Nadji(v2.S[i])); else { pom.Dodaj(v2.S[i]); }return pom;

}

// Preklapanje operatora <<template <typename Tip>ostream &operator <<(ostream &cout, const Skup<Tip> &v) {

sort(v.S, v.S+v.br);cout << "{";for (int i=0; i<v.br; i++)

if (i!=v.br-1) cout << v.S[i] << ", ";else cout << v.S[i];

cout << "}";return cout << "";

}

Page 180: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Preklapanje operatora =template <typename Tip>Skup<Tip> &Skup<Tip>::operator =(const Skup<Tip> &v) {

if(br < v.br) { delete[] S; S = new Tip[v.br]; } br = v.br; copy(v.S, v.S + v.br, S);

return *this;}// Preklapanje unarnog operatora !template <typename Tip>bool operator !(const Skup<Tip> &v){

if (v.br==0) return true; else return false;}// Konstruktor kopijetemplate <typename Tip>Skup<Tip>::Skup<Tip>(const Skup<Tip> &v) : br(v.kap), S(new Tip[v.kap]) { copy(v.S, v.S + v.kap, S);}// Metoda Dodajtemplate <typename Tip>void Skup<Tip>::Dodaj(Tip element){

if (br==kap) throw "Skup je pun!!!"; elseif (Nadji(element)) throw "Duplikat!!!";

S[br]=element; br++;}// Glavni programint main(){

// Definisanje skupovaSkup<string> PRVI(10), DRUGI(10);// Unos elemenata skupatry{ PRVI.Dodaj("A"); }catch(const char poruka[]) { cout << poruka << endl; }try{ PRVI.Dodaj("B"); }catch(const char poruka[]) { cout << poruka << endl; }try{ PRVI.Dodaj("C"); }catch(const char poruka[]) { cout << poruka << endl; }try{ PRVI.Dodaj("D"); }catch(const char poruka[]) { cout << poruka << endl; }try{ DRUGI.Dodaj("E"); }catch(const char poruka[]) { cout << poruka << endl; }try{ DRUGI.Dodaj("C"); }catch(const char poruka[]) { cout << poruka << endl; }try{ DRUGI.Dodaj("B"); }catch(const char poruka[]) { cout << poruka << endl; }try{ DRUGI.Dodaj("H"); }catch(const char poruka[]) { cout << poruka << endl; }cout << "Prvi skup: " << PRVI << endl << "Drugi skup: " << DRUGI << endl;cout << "Unija: " << PRVI + DRUGI << endl;cout << "Presjek: " << PRVI * DRUGI << endl;cout << "Razlika: " << PRVI - DRUGI << endl;if (PRVI<=DRUGI) cout << "PRVI je podskup DRUGOG skupa!";

return 0;}

Page 181: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

101. Napišite i implementirajte baznu klasu “Student”, zatimiz nje izvedite naslijedjene klase “Student_VI_stepena”,“Student_VII_stepena”, “Student_postdiplomac”, te konacnoformirajte i implementirajte klasu “StudentskaSluzba”. Baznaklasa “Student” treba da ima sljedece elemente:

a) Privatne atribute “broj_indeksa”, “ime”, “prezime”,“broj_ocjena” i “prosjecna_ocjena”. Atribut “broj_ocjena” sadrzibroj ispita koje je student polozio, dok su ostali atributi jasniiz naziva. Atributi “ime” i “prezime” trebaju biti tipa “string”.

b) Konstruktor sa tri parametra koji postavlja atribute“ime”, “prezime” i “broj_indeksa” na vrijednosti koje se zadajupreko parametara, a atribute “prosjecna_ocjena” i “broj_ocjena”na 5 i 0 respektivno;

c) Metodu “UpisiOcjenu” koja ima kao parametar ocjenu kojuje dobio student na posljednjem ispitu i koja azurira atribute“broj_ocjena” i “prosjecna_ocjena” u skladu sa novom ocjenom;

d) Virtualnu metodu “IspisiPodatke” bez parametara kojaispisuje podatke o studentu u slijedecem obliku (prosjek seispisuje na 2 decimale): Student <ime> <prezime> sa brojemindeksa <indeks> ima prosjek <prosjek>.

Izvedene klase “Student_VI_stepena” i “Student_VII_stepena”razlikuju se samo u metodi “IspisiPodatke” koja ispisuje “StudentVI stepena” odnosno “Student VII stepena” umjesto samo “Student”.Izvedena klasa “Student_postdiplomac” ima i dodatni atribut“godina_diplomiranja” kao i dodatni parametar u konstruktoru kojiomogucava postavljanje ovog atributa. Metoda “IspisiPodatke” zaovu klasu ispisuje podatke o studentu u slijedecem obliku:Student postdiplomskog studija <ime> <prezime> sa brojem indeksa<indeks>,diplomirao godine <godina>, ima prosjek <prosjek>.

Klasa “StudentskaSluzba” treba da ima sljedece elemente:a) Privatne atribute “broj_studenata” i “MaxBrStudenata”

koji cuvaju redom broj upisanih studenata odnosno maksimalnidozvoljeni broj studenata koji se mogu upisati (atribut“MaxBrStudenata” treba da bude konstantni atribut), kao iprivatni atribut “studenti” koji ce sluziti za pristup dinamickialociranom nizu koji sadrzi “MaxBrStudenata” elemenata, pri cemuje svaki element niza pokazivac na objekat klase “Student” iliobjekat nekog od tipova izvedenih iz klase “Student”;

b) Konstruktor sa jednim parametrom i destruktor.Konstruktor treba da izvrši dinamicku alokaciju memorije zaprihvatanje onoliko studenata koliko je navedeno parametrom, dokdestruktor treba da izvrši oslobadjanje svih resursa koje jeklasa “StudentskaSluzba” alocirala tokom svog rada;

Page 182: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

c) Metodu “UpisiStudenta”, koja upisuje novog studenta.Metoda ima cetiri parametra: broj indeksa, ime, prezime i godinadiplomiranja. Za studente koji se upisuju na dodiplomski studij,umjesto godine diplomiranja upisuje se stepen studija (6 ili 7);

d) Metodu “UpisiOcjenu” sa dva parametra: broj indeksastudenta cija se ocjena upisuje, kao i sama ocjena;

e) Metodu “IspisiSpisak” koja ispisuje spisak svih studenatasa pripadnim podacima (pozivom metode “IspisiPodakte” za svakogstudenta).

Obavezno napišite i testni program u kojem cete testirati sveelemente navedenih klasa.

RJEŠENJE:# include <iostream># include <string>

using namespace std;

// Klasa studentclass Student{protected: string ime, prezime;

int broj_ocjena, broj_indeksa;double prosjecna_ocjena;

public: Student(string ime, string prezime, int broj_indeksa): ime(ime), prezime(prezime), broj_indeksa(broj_indeksa), prosjecna_ocjena(5), broj_ocjena(0) {}

void UpisiOcjenu(int ocjena);virtual void IspisiPodatke();int VratiIndex() { return broj_indeksa; }

};

void Student::UpisiOcjenu(int ocjena){if (ocjena<6||ocjena>10) throw "Neispravna ocjena!";if (prosjecna_ocjena==5) prosjecna_ocjena=ocjena;

else prosjecna_ocjena = ((prosjecna_ocjena*broj_ocjena)+ocjena) /(broj_ocjena+1); broj_ocjena++;}

void Student::IspisiPodatke(){ cout << "Student " << ime << " " << prezime << " sa brojem indeksa " << broj_indeksa

<< " ima prosjek " << prosjecna_ocjena << "." << endl;}

Page 183: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

// Klasa Student_VI_stepenaclass Student_VI_stepena : public Student {public: Student_VI_stepena(string ime, string prezime, int broj_indeksa) : Student(ime, prezime, broj_indeksa) {}

virtual void IspisiPodatke();};

void Student_VI_stepena::IspisiPodatke(){ cout << "Student VI stepena " << ime << " "

<< prezime << " sa brojem indeksa " << broj_indeksa << " ima prosjek " << prosjecna_ocjena << "." << endl;

}

// Klasa Student_VII_stepenaclass Student_VII_stepena : public Student {public: Student_VII_stepena(string ime, string prezime, int broj_indeksa) : Student(ime, prezime, broj_indeksa) {}

virtual void IspisiPodatke();};

void Student_VII_stepena::IspisiPodatke(){ cout << "Student VII stepena " << ime << " " << prezime << " sa brojem indeksa " << broj_indeksa << " ima prosjek " << prosjecna_ocjena << "." << endl;}

// Klasa Student_postdiplomacclass Student_postdiplomac : public Student {

int godina_diplomiranja;public: Student_postdiplomac(string ime, string prezime, int broj_indeksa,

int godina_diplomiranja): Student(ime, prezime, broj_indeksa), godina_diplomiranja(godina_diplomiranja) {}

virtual void IspisiPodatke();};

void Student_postdiplomac::IspisiPodatke(){ cout << "Student postdiplomskog studija " << ime

<< " " << prezime << " sa brojem indeksa " << broj_indeksa << ", diplomirao godine " << godina_diplomiranja << ", ima prosjek " << prosjecna_ocjena << "." << endl;

}

Page 184: Skripta Zadataka c++

LoVe dOts... ForEver... Autor: Murtic NirmelETF - 2005/2006 www.etf.ba

Email: [email protected] ; MSN: [email protected]

class StudentskaSluzba{int broj_studenata;const int MaxBrStudenata;

Student **studenti;public:

explicit StudentskaSluzba(int Max): broj_studenata(0), MaxBrStudenata(Max), studenti(new Student*[Max]) { } ~StudentskaSluzba() { for(int i = 0; i < broj_studenata; i++)

delete studenti[i]; delete[] studenti; }

void UpisiStudenta(int br_in, char *Ime, char *Prezime, int X);void UpisiOcjenu(int index, int ocjena);void IspisiSpisak();

};

void StudentskaSluzba::UpisiStudenta(int br_in, char *Ime, char *Prezime,int X){

if (MaxBrStudenata==broj_studenata) throw "Dostignut maksimum!"; Student *St;

if (X==6) St = new Student_VI_stepena(Ime, Prezime, br_in);else if (X==7) St = new Student_VII_stepena(Ime, Prezime, br_in);else St = new Student_postdiplomac(Ime, Prezime, br_in, X);

studenti[broj_studenata] = St; broj_studenata++;}

void StudentskaSluzba::UpisiOcjenu(int index, int ocjena){int pom;bool istina(true);for (int i=0; i<broj_studenata; i++)

if(index==studenti[i]->VratiIndex()) { istina=false; pom=i; }if (istina==false) studenti[pom]->UpisiOcjenu(ocjena);

else throw "Student ne postoji!";}

void StudentskaSluzba::IspisiSpisak(){if (broj_studenata==0) throw "Nema studenata u bazi!";for (int i=0; i<broj_studenata; i++) studenti[i]->IspisiPodatke();

}

// Glavni programint main(){ StudentskaSluzba etf(1000); etf.UpisiStudenta(11, "Ivo", "Ivic", 6); etf.UpisiStudenta(12, "Meho", "Mehic", 1998); etf.UpisiStudenta(13, "Vaso", "Vasic", 7); etf.UpisiStudenta(14, "Ibro", "Ibric", 6); etf.UpisiStudenta(15, "Marko", "Markovic", 2001); etf.UpisiOcjenu(11, 8); etf.UpisiOcjenu(11, 7); etf.UpisiOcjenu(11, 9); etf.UpisiOcjenu(13, 10); etf.UpisiOcjenu(15, 9); etf.IspisiSpisak();

return 0;}