LoVe dOts... ForEver...

ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

PROGRAMIRANJE U PROGRAMSKIM JEZICIMA „C“ & „C++“
ZBIRKA ZADATAKA DOTS (101 zadatak) Verzija: Final (The_LNe_LOVE)

-

tHrEE FoUr FiVe SiX SeVen

dOts dOts dOts dOts dOts

... .... ..... ...... .......

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

AUTOR: Murtic Nirmel Email: matrix.bih@gmail.com

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

... Napomena ...
Cilj skripte nije omogucavanje studentima da iste zadatke prepišu, vec da na osnovu ovih rješenja napišu neka svoja. Skriptu mozete preuzeti sa web stranice: http://www.etf.ba Skripta ce biti nadopunjavana, nece stati na ovome! A obnovljenu verziju skripte cete moci preuzeti sa stranice vec navedene. Rješenja su provjerena i rade u Dev Cpp-u, ukoliko ipak neki od programa ne radi, prvo provjerite dobro da niste neki dio zaboravili kopirati. Neki znakovi nakon sto se prebace u pdf nisu isti, ako ipak postoji greska, javite mi na mail ili msn, da ispravim. Sretno sa programiranjem... ... do rješenja se moze doci na 1000... nacina... vama treba samo jedno rješenje, bilo koje... a zeli se najbolje, najbrze i najkrace... jedno je zelja... drugo su mogucnosti... ... ako vam baš i neide najbolje... zapamtite... nijedan program nije vrijedan vaših zivaca... Za štetu nastalu korištenjem skripte ne odgovara :) programa, autor

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

... Uvod ...
Cilj ove skripte je da prikaze primjenu programskog jezika C & C++ na zadacima. Podrazumjeva se da ste prije „proucavanja“ ove skripte savladali sintaksu C-a. Dva glavna „problema“ koji se javljaju kroz programiranje su: - sintaksa programskog jezika; - logika programa (daleko veci problem). Savladati sintaksu i nije neki problem, mnogo veci problem je nauciti razmisljati programerski. Jedno ide uz drugo, nemoze se programirati ako neznamo sintaksu, a ne vrijedi nam ni sintaksa ako nemozemo „skontati“ kako da dodjemo do rjesenja. Medjutim, iz dana u dan „izlaze“ novi programski jezici, nove sintakse, i sintaksa nekog starijeg programskog jezika nam nemoze mnogo pomoci. Znaci mnogo vise se treba osvrnuti da se savlada ovaj drugi problem, jer ako znamo rijesiti program u jednom programskom jeziku, to mozemo uraditi u svakom (uz kratko proucavanje sintakse). Stoga ovdje mozete naci samo rjesene i objasnjene zadatke, kao i neke metode koje su prakticne za primjenjivanje u programima, a za sintaksu, pronadjite neku drugu litereturu ;).

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

... Zadaci iz C-a ...

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

1.

Napraviti program koji ucitava koordinate trodimenzionalnom prostoru: Tacke t i t su definirane kao trojke:
1 2

dvije

tacke

u

- t =(x , y , z ) ,
1 2 1 2 1 2 1 2

- t =(x , y , z ). Kao izlaz program daje udaljenost izmedju tih tacki. NAPOMENA: Za drugi korijen koristiti funkciju sqrt() koja je definirana u datoteci math.h. Na primjer, naredba a=sqrt(9); ce izracunati drugi korijen iz 9 i pridruziti izracunatu vrijednost varijabli 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

2.

Napravite C-program koji ucitava potrošnju elektricne energije u KWh (velika tarifa(VT) i mala tarifa(MT)) i pripadajuce cijene po KWh (cijena za malu tarifu i cijena za veliku 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

3.

Napisati program koji ce izracunati presjek skupova S1 i S2. Skupovi S1 i S2 definirani su intervalima realnih brojeva: S1=[A, S2=[C, Na primjer, program kao B] D]. za slijedeci ulaz: izlaz treba dati:

A=3, B=9, C=7, D=11

Rezultantni interval je REZ=[7, 9]. RJEŠENJE:
#include <stdio.h> main() { // Definisanje varijabli float A,B,C,D,MAX,MIN; // Unos skupova printf("\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 broj intervala veci ili jednak drugom, A>=B i C>=D, jer ako ovo ne vrijedi interval nije matematicki ispravan (taj uslov nismo ispitivali da nebi komplikovali zadatak). 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 jer u 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 vrijednost pod ELSE ali tada nam je svakako svejedno koja ce se uzeti vrijednost kao MIN ili 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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

4.

Napisati program koji ucitava koeficijente a, b i c realnog tipa. Ti koeficijenti definiraju funkciju f(x):
2

f(x)=ax +bx+c Program zatim provjerava da li su ti keficijenti u rasponu -10 do 10. 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 kao izlaz daje vrijednost prve derivacije u tacki x. Tacka x se takodjer unosi sa standardnog ulaza. Na primjer, ako je ulaz a=1, b=2, c=1, x=1 program kao izlaz daje: Prva derivacija u tacki x=1 je 4. RJEŠENJE:
# include <stdio.h> int main () { // Definisanje varijabli float a,b,c,x,izvod; // Unos koeficijenata a,b,c printf ("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 x printf ("Unesi vrijednost x"); scanf("%f", &x); // Ispit uslova if (a>-10&&a<10&&b>-10&&b<10&&c>-10&&c<10){ // Izracunavanje izvoda po odredjenoj matematickoj formuli izvod=2*a*x+b; // Ispis izvoda printf("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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

5.

Napisati program koji ucitava tri cijela broja iz intervala od 50 do 200. Ako svi uneseni brojevi nisu iz tog intervala, program treba ispisati poruku "Svi brojevi nisu iz intervala 50 do 200” i završiti program. Ako su brojevi unutar tog intervala program treba ispisati ucitane brojeve po velicini od najmanjeg prema najvecem. RJEŠENJE:
#include <stdio.h> main() { // Definisanje varijabli int x[3], i, j, p; // Unos brojeva printf("\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 brojeva Potrebne su nam dvije for petlje koje ce „listati“ brojeve koji se nalaze u nekom nizu. Ovaj tip sortiranja se uglavnom svodi na provjeru da li je prvi broj manji od drugog ili treceg, i ako jeste, onda mijenja mjesto sa tim brojem. Medjutim nakon ovoga nije zavrseno sortiranje. Ako npr. Unesemo brojeve 3, 2, 1, nakon prvog prolaska imamo 2, 3, 1 nakon drugog 2, 1, 3 ali jos uvijek nije zavrseno sortiranje, i zbog toga i postoji prva for petlja koja ce to ponoviti jos jednom i dobivamo 1, 2, 3 i niz je sortiran, i sada ga samo 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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

6.

Napisati program koji ce ispisati brojeve djeljive sa 5, 7 ili 11, a manje ili jednake od nekog ucitanog broja n sa tastature. Brojeve treba ispisati od najveceg prema najmanjem. Obavezno koristiti for petlju. Na primjer, ako je korisnik za n unio broj 20 onda program treba ispisati: 20 15 14 11 10 7 5 RJEŠENJE:
#include <stdio.h> int main() { // Definisanje varijabli int n, i; // Unos nekog prirodnog broja printf("Unesite broj: "); scanf("%d", &n); /* For petlja postavlja brojac „i“ na vrijednost unesenog broja, i provjerava se da li je taj broj djeljiv sa 5, 7 ili 11, i ako jeste printa ga na ekran i umanjuje brojac za jedan, ako broj nije djeljiv sa ovim brojevima, onda se samo brojac umanji na kraju for petlje bez printanja broja na ekranu. Isti se postupak ponavlja i za broj manji za jedan, kao i broj manji za dva... sve tako do broja 1 (mogli smo staviti i 4 jer brojevi ispod 5 svakako nisu djeljivi 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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

7.

Napisati program koji ce izracunavati sumu prema slijedecoj formuli: suma=1-1/2+1/3-1/4+...+1/n Broj n se unosi sa tastature(standardnog ulaza). Program treba ispisati 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 na mjestu <suma> se treba nalaziti konkretno izracunata suma.) Zadatak riješite koristeci while petlju. RJEŠENJE:
#include <stdio.h> int main() { // Definisanje varijabli float i=1,n,suma=0; // Unos prirodnog broja printf ("\n Unesi broj n:"); scanf("%f", &n); /* Racunanje sume While petlja vrti podprogam u okviru while petlje sve dok je brojac „i“ koji je na pocetku 1, manji od unesenog broja n. Ako je uneseni broj 1 ne ulazi se u petlju i na izlazu se ispisuje Suma je:1. Ako je broj veci od 1 onda se racuna suma prema matematickoj formuli. Grupisali smo formulu datu u zadatku tako da trazimo sume po dva broja (odnosno razlike), i zatim te razlike brojeva sabiramo, ali moramo paziti jer moramo brojac „i“ uvecati za 2 jer smo u formuli ukljucili odmah 2 broja. Ovaj nacin ima i dobru i losu stranu. Dobra strana je jer nemoramo uvoditi nikakvu pomocnu varijablu i citav kod za racunanje sume se sastoji od dva izraza, a losa strana je kad unesemo neparne brojeve sto necemo dobiti tacnu sumu i tako kad unesemo broj 3 program ce izracunati 1-1/2+1/3=0.5 sto nije tacno, a to smo dobili jer program nemoze grupisati clanove po 2 jer ih imamo tri i zadnji ostaje sam i ne racuna se. Ali ovaj mali nedostatak mozemo zanemariti jer se u ovakvim zadacima obicno unose veliki brojevi da se sve svodi na preciznost nalazenja broja 0.69 pa nam je svejedno da li je zadnji clan uracunat ili ne, ali eto ako zelimo ipak 100% precizno uraditi, zadatak moze se uraditi i bez grupisanja sa mijenjanjem predznaka sume, ali to uradite sami :) */ while ((i<n)&&(n>1)) { suma=suma+(1/i-1/(i+1)); i=i+2; } // Ispis sume if (n>1) printf ("\n Suma je: %f", suma); else if (n=1) printf ("Suma je: 1"); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

8.

Napraviti program koji sa standardnog ulaza ucitava cijeli broj m koji predstavlja redni broj mjeseca u godini, te ucitava i broj g koji predstavlja godinu, a na monitoru ispisuje naziv tog mjeseca i broj dana u tom mjesecu. Pretpostaviti da je prestupna svaka cetvrta godina, iako je pravilo o racunanju prestupnih godina nešto slozenije. Na primjer, ako su ulazne vrijednosti m=2, g=2000 program treba ispisati: februar, 2000. g., broj dana:29 Ili ako su ulazne vrijednosti m=5, g=2005 program treba ispisati: maj, 2005. g., broj dana: 31 RJEŠENJE:
#include <stdio.h> main() { /* Deklarisanje varijabli Definisanje dvodimenzionalne matrice 12 sa 9 (12 mjeseci, a broj 9 je ustvari broj 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 godine printf ("\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 dan if ((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 dana if ((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=29 odnosno 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 pod brojem 0) printf("%s , %d. g., broj dana: %d", mj[m-1], g, d); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

9.

Napisati program koji ucitava realnu matricu dimenzija 10x10 te pronalazi najmanji element na glavnoj dijagonali. RJEŠENJE:
#include <stdio.h> main (){ // Deklarisanje varijabli float 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,j jednaki. Tako dijagonalni elementi matrice 3x3 su [1,1], [2,2], [3,3]. Posto nam trebaju samo elementi kada su (i,j) jednaki koristimo jednu for petlju. Na pocetku stavimo da je najmanji element prvi element na poziciji [1,1], u C-u je pozicija (0,0) ustvari pozicija (1,1) u realnom svijetu. I ulazimo u for petlju. Ispituju se redom brojevi kod kojih su brojaci „i“ i „j“ jednaki. Ako je neki od brojeva koji se ispitaju manji od MIN onda se taj broj pridruzi varijabli 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 dijagonali printf("\nNajmanji element na glavnoj dijagonali je: %.f", MIN); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

10.

Napišite funkciju faktor () koja izracunava n! pri cemu je prototip funkcije faktor (): double faktor (int n) Zatim, napisati glavni program koji ucitava neki prirodni broj n,1<n<10; a zatim izracunava n! pozivom funkcije faktor() i rezultat ispisuje na standardni izlaz. RJEŠENJE:
#include <stdio.h> main (){ // Deklarisanje varijabli int N; double F; // Deklarisanje prototipa funkcije double faktor (int n); //Unos prirodnog broja printf("\nUnesi prirodan broj N: "); scanf("%d", &N); /* Pozivanje funkcije faktor() i pridruzivanje izracuna varijabli F */ F=faktor(N); // Ispis faktorijele printf("Faktorijela od %d je: %g", N, F); // Kraj programa getch(); return 0; }

vrijednosti

koju

funkcija

/* Funkcija koja racuna vrijednost faktorijele. Funkcija prima prirodan broj N a 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 faktorijelu pomnozi sa svakim cijelim brojem manjim od sebe a koji je veci od 1. Na pocetku je fak=1 jer ako bi bilo 0 dobili bi uzastopno mnozenje sa 0 i nebi dobili ispravan rezultat */ for (i=n;i>1;i--) fak=fak*i; // Vracanje izracunate faktorijele return fak; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

11.

Napisati program koji ucitava broj elemenata (n) nekog cjelobrojnog polja (Polje) a zatim i elemente tog polja (maksimalno 100). Program nakon toga pronalazi maksimalni element unesenog polja i ispisuje ga na standardni izlaz. Na primjer, ako su ulazni podaci: n=4, Polje=(2,5,20,4) program ce ispisati vrijednost broja 20. RJEŠENJE:
# include <stdio.h> main (){ // Definisanje varijabli int n, i, niz[100], max; // Unos broja elemenata printf("\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 niza max=niz[0]; /* For petlja vrti brojeve od 2 broja (prvi je ukljucen u liniju iznad) i provjerava se da li je i-ti broj veci od max i ako jeste varijabli max se pridruzuje vrijednost tog elementa*/ for (i=1;i<n;i++) if (max<niz[i]) max=niz[i]; // Ispis najveceg elementa niza printf("Najveci element niza je: %d", max); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

12.

Napisati program koji ucitava 5 realnih elemenata dva polja A i B a zatim izracunava elemente treceg polja C (koji takodjer ima 5 elemenata) pri cemu se i-ti element polja C dobiva prema slijedecoj formuli: C[i]=2*A[i]+B[i], i=1,2,…n Na kraju program na standardni izlaz ispisuje elemente sva tri polja: A, B i C. RJEŠENJE:
# include <stdio.h> main (){ // Definisanje varijabli float A[5], B[5], C[5]; int i; /* Unos elemenata prvog polja (pomocu for petlje, i+1 zbog realnosti, da nam ne 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 polja for (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 A printf("\nElementi prvog polja A: "); for (i=0;i<5;i++) printf("%.f ", A[i]); // Ispis elemenata polja B printf("\nElementi drugog polja B: "); for (i=0;i<5;i++) printf("%.f ", B[i]); // Ispis elemenata polja C printf("\nElementi treceg polja C: "); for (i=0;i<5;i++) printf("%.f ", C[i]); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

13.

Napisati program koji ucitava broj elemenata nekog polja (maksimalno 100) a zatim i elemente tog polja. Program zatim pronalazi najmanji element i na standardni izlaz ispisuje sve elemente koji su manji od dvostruke vrijednosti pronadjenog najmanjeg elementa. RJEŠENJE:
# include <stdio.h> main (){ // Definisanje varijabli int n, i, niz[100], min; // Unos broja elemenata printf("\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 niza min=niz[0]; /* For petlja vrti brojeve od drugog broja (prvi je ukljucen u liniju iznad) i provjerava se da li je i-ti broj manji od min i ako jeste varijabli min se pridruzuje 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 manji od dvostruke vrijednosti nadjenog najmanjeg broja, i ako je taj broj zaista manji 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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

14.

Napisati funkciju koja kao argument prima cijeli broj a vraca broj koji se dobije tako da se iz argumenta izbace cifre 2,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 standardnom izlazu. RJEŠENJE:
# include <stdio.h> main (){ // Definisanje prototipa funkcije int izbaci2389(int x); // Definisanje varijabli int N, X; // unos prirodnog broja printf("\nUnesi prirodan broj: "); scanf("%d", &N); // Poziv funkcije i pridruzivanje rezultata varijabli X X=izbaci2389(N); // Ispis prepravljenog broja printf("\nPrepravljeni broj: %d", X); // Kraj programa getch(); return 0; } // Funkcija za izbacivanje cifri 2,3,8,9 iz prirodnog broja int izbaci2389(int x) { int t=1, y=0, ost; /* While petlja se izvrsava dok je x>0. Uzima se ostatak dijeljenja broja sa 10 (npr. od broja 129, ostatak je 9), zatim se varijabli x odbije zadnja cifra dijeljenjem sa 10 (do odbijanja dolazi jer radimo sa int brojevima pa nema decimalnog zareza (npr 129/10=12). Zatim provjerimo dali je dobijeni ostatak ost jednak 2,3,8 ili 9 i ako jest vracamo se na pocetak petlje i vrsimo isti postupak za broj koji smo dobili odbijanjem zadnje cifre (i sve tako dok ne odbijemo sve cifre, tj. dok ne dobijemo broj 0). Ako varijabla ost ipak je razlicita od 2,4,8,9 onda se varijabli y doda vrijednost ost pomnozena sa t. U programu varijabla t nam ustvari broji koja je decimala u pitanju. Kad je t=1 radimo sa jedinicama, kad je t=10 radimo sa deseticama... Tako npr. broj 1234 mozemo rastaviti kao 4*1+3*10+2*100+1*1000 gdje su nam brojevi 1,10,100,1000 ustvari 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

15.

Napisati funkciju koja kao argument uzima potrošnju u KWh za veliku i malu tarifu te na standardnom izlazu ispisuje racun za utrošenu elektricnu energiju. Pretpostaviti da je cijena za veliku tarifu po utrošenom KWh 0.10 KM, 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 tarifu Nakon toga, napišite glavni program koji ucitava potrošnju za veliku tarifu i malu tarifu, te na standardnom izlazu ispisuje racun za tu potrošnju. RJEŠENJE:
# include <stdio.h> main (){ // Definisanje prototipa funkcije void racun(float vt, float mt); // Definisanje varijabli float vt, mt; // Unos potrosnje po velikoj i maloj tarifi printf("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 mt racun(vt, mt); // Kraj programa getch(); return 0; } // Funkcija koja kreira racun za utrosak energije na osnovu argumenata vt i mt void racun(float vt, float mt) { float cijena; // Racunanje ukupne cijene na osnovu argumenata vt i mt i zadatih cijena cijena=vt*0.10+mt*0.05; // Ispis rezultata printf("\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**************************************************************** "); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

16.

Napisati funkciju koja kao argument uzima tri cijela broja a, p i c. Funkcija vraca cijeli broj koji se dobije tako da se u broju a iza p-te cifre s desne strane umetne cifra c. Ako je p veci od ukupnog broja cifri izlaz iz funkcije treba biti jednak ulazu. Ako se broj c sastoji od više cifri onda se umece samo 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 cijeli broj a, poziciju umetanja cifre p i broj koji definira cifru koja se umece c, te poziva funkciju umetni() i ispisuje na standardnom izlazu rezultirajuci broj. RJEŠENJE:
# include <stdio.h> main (){ // Definisanje prototipa funkcije int umetni(int a, int p, int c); // Definisanje varijabli int a, p, c, rez; // Unos brojeva a,p,c printf("Unesi brojeve a, p, c: "); scanf("%d,%d,%d", &a,&p,&c); // Poziv funkcije umetni() i pridruzivanje rezultata varijabli rez rez=umetni(a,p,c); // Ispis rezultata printf("Rezultat: %d", rez); // Kraj programa getch(); return 0; } // Funkcija koja umece broj c na p-tu poziciju u broju a s desna int umetni(int a, int p, int c) { int t=1, ost, x=0,br=0; // Broju c pridruzuje se samo njegova zadnja cifra c=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 broj c. 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

17.

Napraviti program koji ce na monitoru ispisati prvih N cijelih brojeva i njihove kvadrate u formatu: 1 na kvadrat je 1 2 na kvadrat je 4 3 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 znaci krece 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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

18.

Napraviti program linearnih jednadzbi:
11 1 21 1

koji

izracunava

rješenja

sistema

a x + a x = b
12 2 22 2

1 2 2

a x + a x = b
1

(nepoznate su x i x ) Koeficijenti a , a , b , a , a , b se unose sa tastature. Ako
11 12 1 21 22 2

sistem jednadzbi nema rješenje program ispisuje poruku «RJEŠENJE ne 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, u suprotnom 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 ispisuje poruka: 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

19.

Napisati program koji ucitava 4 cijela broja, a kao izlaz daje dva najveca broja. Na primjer, ako korisnik kao ulaz unese slijedece cijele brojeve: 23 5 45 33 rezultat izvodjenja programa treba biti: Najveci broj je 45. Drugi broj po velicini je 33. Napomena: Tekstualne poruke vašeg programa trebaju biti iste kao gore 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 sortiranja Koristena je metoda bubblesort (spomenuta u jednom od zadataka ranije), to je metoda „preljevanja“, provjerava se da li je j-ti clan manji od j+1-vog i ako jeste mijenjaju se mjesta. Npr. Unesemo 1,2,3,4. Nakon prvog prolaska imamo 2,1,3,4. Nakon drugog prolaska 2,3,1,4. Nakon treceg prolaska imamo 2,3,4,1. I onda prva for petlja proces ponavlja jos jednom. Pa imamo 3,2,4,1 zatim i 3,4,2,1 pa onda ostaje isto jer je 2 vec vece od 1. Ali niz nije sortiran! Prva for petlja jos jednom pokrece postupak i imamo 4,3,2,1. Proci ce se onako bezveze jos 2 puta kroz petlju „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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

20.

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

RJEŠENJE:
#include <stdio.h> main () { // Definisanje varijabli int i,br, ispit; // Unos jednog prirodnog broja printf ("\n Unesi prirodan broj: "); scanf ("%d", &br); // Provjera da li je broj prirodan, i ako nije ispisuje // se poruka da broj nije prirodan if (br<=0) printf("\n Broj nije prirodan"); else // Provjera da li je uneseni broj, broj 1, i ako jeste, // ispisuje se odgovarajuca poruka if (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 prost ili slozen, varijabla "ispit" kao rezultat. Djelimo broj „br“ sa svakim brojem manjim od polovine unesenog broja. Na pocetku je „ispit=0“ sto nam govori da je 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 ce automatski poprimiti vrijednost 1. U zavisnosti da li je broj „br“ uspio se podijeliti sa nekim brojem bez ostatka, zavisiti ce i cinjenica da li je broj prost 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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

21. Napraviti

program koji izracunava n! (n faktorijela). Broj n se unosi sa tastature i treba biti u rasponu [1,20]. Ako broj n nije u datom rasponu, program ispisuje poruku „Uneseni broj nije u 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 varijabli int i; float n,f; // Unos prirodnog broja printf("\n Unesi broj N u rasponu od [1,20]: "); scanf("%f", &n); /* Racunanje faktorijele, ukoliko je broj u rasponu [1,20]. Faktorijela se racuna tako sto se uneseni broj pomnozi sa svakim brojem manjim od sebe, i sve se to pridruzuje varijabli „f“. */ f=1; if ((n>0) && (n<21)) { for (i=0;i<n;i++) f=f*(n-i); // Ispis rezultata printf("\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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

22.

Napisati program koji ce izracunati sumu kvadrata prvih n prirodnih brojeva. Broj n se unosi sa tastature i treba biti u intervalu [2,100]. Ako broj n nije u tom intervalu program ispisuje poruku „Broj nije u zadanom intervalu“ i završava. Na primjer, 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 brojeva printf("\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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

23.

Napraviti program koji ce na ekranu ispisivati broj PI prema formuli PI=1-1/3+1/5-1/7...1/i, a vrijednost eps unosimo sa tastature i mora biti u intervalu 0.1 do 0.0001. Suma se racuna sve dok je 1/i vece od eps. RJEŠENJE:
#include <stdio.h> main () { // Definisanje varijabli float eps,pi,n; // Unos broja koji oznacava preciznost printf("\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 racunanje broja „pi“. Radi lakseg sastavljanja formule (jer imamo – i + naizmjenicno) grupisacemo clanove po 2. i onda sve svodimo na operaciju sabiranja razlika 2 broja. Na kraju se brojac uvecava za 4 jer smo odmah po dva clana u formuli koristili */ 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 PI printf ("PI je: %f", pi); // Ispis poruke ukoliko broj eps nije u odgovarajucem rasponu } else printf ("\n Broj nije u trazenom rasponu!"); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 tih matrica. Program zatim treba izracunati matricu C koja je proizvod matrica A i B. Na kraju program treba ispisati sve tri matrice: 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 li su unesene dimenzije u dozvoljenim granicama, tj. da li je RA<=10, RB<=10, KA<=10, KB<=10, te isto tako program treba provjeriti 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 matrice printf("\nUnos dim. matrica A[RA,KA], B[RB,KB], u obliku \"RA,KA,RB,KB\": "); scanf("%d,%d,%d,%d", &RA, &KA, &RB, &KB); // if // if Ispit uslova: da li su dimenzije u intervalu od 1 do 10. ((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. (KA==RB){

/* Unos elemenata prve matrice A (pomocu 2 for petlje, objasnjeno u jednom od prethodnih 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 B printf("\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 for petljama pri unosu matrice ili ispisu, koje „setaju“ po redovima i kolonama matrica 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 je primjenjeno na formulu koja se nalazi unutar for petlje sa argumentom „k“. Argument „k“ se krece od 1 do broja kolona prve matrice, i predstavlja broj sabiraka u formuli iznad. C[i][j] = 0; je uvedeno jer vrijednost C[i][j] nije definisana, a moramo je koristiti u formuli unutar for petlje po „k“. */

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 A printf("\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 B printf("\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 C printf("\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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

25.

Napisati C program koji sa standardnog ulaza ucitava elemente realne matrice dimenzija 5 x 5, te izracunava sumu elemenata svake kolone i sumu elemenata svakog reda. Za unos i pohranjivanje matrice koristite dvodimenzionalno polje, dok za pohranjivanje suma po redovima i kolonama trebate koristiti 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 i sume pronadjene kolone, odnosno, reda. RJEŠENJE:
#include <stdio.h> main(){ // Definisanje varijabli float MATRIX[5][5], SUMA[5], sumaR, sumaK; int i,j, Kolona, Red; // Unos elemenata matrice printf("\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 niza SUMA[] nisu definisane. */ for (i=0;i<5;i++) SUMA[i]=0; /* Racunanje suma po redovima. Sabiramo sve brojeve prvog reda, znaci „i“ se ne mijenja, a „j“ se uvecava za 1 sve do 5. I kada se sabere tih 5 brojeva, to je suma prvog reda i zapisuje se u SUMA[0], zatim se isto ponavlja za ostale redove, 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 suma najveca, i zatim se provjerava da li od preostalih ima neka koja je veca, i ako je veca, onda se ta suma postavlja da je najveca. Vrijednost „i+1“ nam predstavlja 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 0 for (i=0;i<5;i++) SUMA[i]=0;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

/* Racunanje suma po kolonama... ista procedura, samo smo zamijenili mjesta brojaca „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 suma sumaK=SUMA[0]; Kolona=1; for (i=1;i<5;i++) if (sumaK>SUMA[i]) {sumaK=SUMA[i]; Kolona=i+1;} // Ispis matrice MATRIX printf("\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 rjesenja printf("\nU %d koloni je najmanja suma koja iznosi %.f", Kolona, sumaK); printf("\nU %d redu je najveca suma koja iznosi %.f", Red, sumaR); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

26.

Program ucitava jednu rijec a i znak c koji se treba prebrojati u toj rijeci. Nakon toga program poziva funkcije duzina() i izbroji () i samogl(), te ispisuje duzinu unesene rijeci a i broj pojavljivanja znaka c u toj rijeci, kao i broj samoglasnika u rijeci. RJEŠENJE:
#include <stdio.h> // Funkcije „duzina“, „izbroji“ i „samogl“ // Funkcija duzina prima pokazivac na prvo slovo nekog stringa, a zatim u while petlji provjerava se koliko znakova ima rijec, kada se dodje do nultog znaka, izlazi se iz petlje, rezultet je varijabla „d“ koja se vraca iz funkcije. int duzina(char *string) { int d=0; while (*string++!='\0') d++; return d; } /* Slicno prvoj funkciji, samo funkcija pored pokazivaca na prvi znak stringa prima 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 uveca za 1. Kada „dodje“ while petlja do nultog znaka, izlazi se iz petlje a varijabla „b“ se vraca kao rezultat. NAPOMENA: U gornjoj funkciji stoji u uslovu *string++ sto prebaca pokazivac na iduci clan nakon sto while petlja napravi jedan „krug“, dok u drugoj funkciji stoji 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 uslov da li je „*string“ neki od samoglasnika, a ne znak koji unosimo. Funkcija prima 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

int main() { // Definisanje varijabli char a[80],c; // Unos rijeci bez razmaka i jednog slova koje ce se prebrojavati printf("\nUnesite jednu rijec do 20 znakova (bez razmaka):"); scanf("%s",a); printf("\nKoji znak treba prebrojati:"); scanf("\n%c",&c); // Ispis rjesenja printf("\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 programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

27.

Napisati program koji u realno polje temp ucitava 10 realnih vrijednosti koje predstavljaju temperature u 10 razlicitih dnevnih termina. Program zatim poziva funkcije maxtemp() i prtemp() koje izracunavaju maksimalnu dnevnu temperaturu i prosjecnu dnevnu temperaturu i ispisuje na standardnom izlazu te vrijednosti. RJEŠENJE:
#include <stdio.h> main () { // Definisanje varijabli float temp[10], *p; int i; // Definisanje prototipa funkcija float 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 funkcija printf("\nMaksimalna temperatura je: %.1f", maxtemp(p)); printf("\nProsjecna temperatura je: %.1f", prtemp(p)); // Kraj programa getch(); return 0; } /* Funkcija maxtemp() prima pokazivac na realan niz i pomocu for petlje (vidi 11. 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 se saberu 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); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

28.

Modificirati prethodni program (27) tako da program ucitava cijeli broj n a zatim se sa tastature unosi n vrijednosti za temperature u polje temp. Pretpostaviti da je n<=10. U skladu s tim potrebno je modificirati funkcije maxtemp() i prtemp() tako da imaju slijedece prototipove: float maxtemp(int n, float *p); float prtemp(int n, float *p); RJEŠENJE:
# include <stdio.h> main () { // Definisanje varijabli float temp[10], *p; int i, n; // Definisanje prototipa funkcija float maxtemp(int n, float *p); float prtemp(int n, float *p); // Unos broja n printf("\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 funkcija printf("\nMaksimalna temperatura je: %.1f", maxtemp(n, p)); printf("\nProsjecna temperatura je: %.1f", prtemp(n, p)); // Kraj programa getch(); return 0; } /* Funkcija prima pokazivac na realan niz, i broj n i pomocu for petlje (vidi 11. 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 se saberu svi clanovi niza i na kraju (poslije for petlje) se podijeli sve sa brojem „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); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

29.

Napisati funkciju s imenom adresa() koja kao argument uzima dva stringa koji predstavljaju ime i prezime a kao rezultat vraca se novi string koji se dobije tako da se string koji predstavlja prezime promijeni u string koji predstavlja e-mail adresu slijedeceg oblika: [prezime].[ime]@etf.unsa.ba Prototip funkcije je: char *adresa(char *ime, char *prezime) Na primjer, ako su argumenti ime=“Marko“, prezime=“Markovic“ funkcija adresa() vraca pokazivac na rezultirajuci string prezime koji je promijenjen u novi string oblika: Markovic.Marko@etf.unsa.ba. Nakon toga, napisati glavni program koji ucitava ime i prezime neke osobe i na standardnom izlazu ispisuje toj osobi pridruzenu e-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 funkciji char *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 funkcije return p; } // Glavni program int main(){ // Definisanje varijabli char *ime, *prezime, *c; char U1[100], U2[100]; // Unos podataka ime i prezime printf("\nUnesi ime:"); scanf("%s", &U1); printf("\nUnesi prezime:"); scanf("%s", &U2); // Postavljanje pokazivaca „c“ na pocetak prezimena c=U2; // Postavljanje pokazivaca ime i prezime na stringove U1 i U2

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

30.

Napisati funkciju koja kao argument uzima znakovno polje jmbg (jedinstveni maticni broj gradjanina) a kao izlaz vraca strukturnu varijablu koja predstavlja datum rodjenja doticne osobe. Prototip funkcije je: struct datum fdatum(char *jmbg) gdje struct 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 funkciju jmbg=“2405978234567“ poziv funkcije drodj=fdatum(jmbg); treba vratiti strukturnu varijablu koja predstavlja datum 24.05.1978., tj. funkcija vraca slijedece podatke strukturne varijable tipa datum: drodj.dan=24; drodj.mjesec=5; drodj.godina=1978; Nakon toga napišite glavni program koji sa standardnog ulaza ucitava jmbg kao znakovno polje a nakon poziva funkcije fdatum() ispisuje datum rodjeja osobe sa doticnim jedinstvenim maticnim brojem. RJEŠENJE:
# include <stdio.h> // Definisanje strukture datum struct datum { int dan; int mjesec; int godina; }; /* Funkcija koja vraca datum kreiran od znakovnog polja u koje je upisan maticni broj */ struct datum fdatum(char *jmbg){ // Definisanje varijable drodj kao strukturne varijable od datum struct datum drodj; // Definisanje pokazivaca koji pokazuje na strukturnu varijablu struct datum *pd; int i;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Racunanje varijabli strukturne varijable // Pretpostavka je da je korisnik ciji maticni broj unesete rodjen 1xxx godine drodj.dan=0; drodj.mjesec=0; drodj.godina=1000; // Racunanje jedinice dana for (i=0;i<10;i++) if (*jmbg==49+i) drodj.dan=10*(1+i); // Racunanje desetice dana i sabiranje sa jedinicom for (i=0;i<10;i++) if (*(jmbg+1)==49+i) drodj.dan+=(1+i); // Racunanje jedinice mjeseca for (i=0;i<10;i++) if (*(jmbg+2)==49+i) drodj.mjesec=10*(1+i); // Racunanje desetice mjeseca i sabiranje sa jedinicom for (i=0;i<10;i++) if (*(jmbg+3)==49+i) drodj.mjesec+=(1+i); // Racunanje stotice godine i sabiranje sa 1000 for (i=0;i<10;i++) if (*(jmbg+4)==49+i) drodj.godina+=100*(1+i); // Racunanje desetice godine i sabiranje sa stoticom for (i=0;i<10;i++) if (*(jmbg+5)==49+i) drodj.godina+=10*(1+i); // Racunanje jedinice godine i sabiranje sa deseticom for (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 programa main () { struct datum drodj; char jmbg[40], *p; // Pretpostavka je da je uneseni maticni broj odgovarajuci printf("Unesi maticni broj: "); scanf("%s", &jmbg); // Poziv funkcije fdatum i pridruzivanje rezultata strukturnoj varijabli drodj drodj=fdatum(jmbg); // Ispis rjesenja printf("\nDatum rodjenja: %d.%d.%d", drodj.dan, drodj.mjesec, drodj.godina); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

31.

Napisati program koji broji rijeci koje imaju n znakova u tekstualnoj datoteci cije ime se unosi sa tastature. Na primjer, ako u direktoriju(folderu) T11 na disku C: postoji datoteka pismo.txt sa slijedecim sadrzajem: Lijep pozdrav! Sretnu i uspjesnu Novu godinu zeli Vam kompanija BHKOM. Isto tako se nadamo da ce se dosadasnja uspjesna saradnja nastaviti i u novoj 2006. godini. Direktor: IVIC IVICA program treba nakon unosa imena sa tastature i broja n: Unesite broj znakova: 5 Unesite ime datoteke: C:\T11\pismo.txt dati 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 znakovi interpunkcije: tacka (.), zarez (,), usklicnik (!) i sl. Prilikom rješavanja zadatka obavezno napravite testnu datoteku pismo.txt i pohranite je u direktorij T11, te tu datoteku koristite za testiranje vašeg rješenja. RJEŠENJE:
# include <stdio.h> main() { // Definisanje varijabli FILE *datoteka; char dat[60], znak; int znakovi, br=0, rez=0; // Unos putanje do datoteke printf("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 programa if ( (datoteka = fopen (dat, "r")) == NULL) { printf("Greska kod otvaranja datoteke %s !\n", dat); getch(); exit(1); } // Unos broja znakova printf("Unesi broj znakova: "); scanf("%d", &znakovi); /* While petlja vrti se i uzima se znak po znak iz datoteke sve dok ne dodje se do kraja datoteke i kada stignemo na kraj izlazi se iz programa. Ukoliko je uneseni karakter razlicit od znakova ? ! . \n , \t i blanko znaka onda se varijabla br uveca za jedan, u suprotnom se provjeri da li je broj br jednak broju znakova koji smo unjeli, i ako jeste varijabla rez se uveca za jedan, i onda se br postavi na 0. Kada stignemo do kraja datoteke izlazi se iz petlje.*/

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 biti uracunata jer smo izasli iz petlje, pa je potrebno dodati ovaj uslov iza petlje da bi smo imali 100% tacan program*/ if (br==znakovi) rez++; //Zatvaranje datoteke fclose(datoteka); // Izlaz iz programa printf("Datoteka %s sadrzi %d rijeci sa %d znakova.", dat, rez, znakovi); getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

32.

Napravite tekstualnu datoteku “ORPodaci.txt“ (pomocu programa 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 na prvom parcijalnom ispitu - kolona [brbod2] zauzima 4 mjesta i predstavlja broj bodova na drugom 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“ budite precizni u zauzimanju mjesta za pojedine kolone. Zatim, napisati program koji ucitava sadrzaj tekstualne datoteke “ORPodaci.txt” i na temelju te datoteke kreira novu datoteku pod imenom “Polozili.txt” u kojoj se treba nalaziti sortiran (od veceg prema manjem) spisak onih studenata koji su polozili oba parcijalna ispita (to su oni studenti koji imaju na oba parcijalna 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 broj bodova sa oba parcijalna ispita. RJEŠENJE:
#include <stdio.h> #include <stdlib.h> /* Definisanje strukture forma koja se sastoji iz varijabli prezime i ime tipa char 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 cita Trinity - pokazivac na fajl u koji se pise

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

podaci[15] - strukturni niz podaci u koji ce se upisati svi podaci koji se ucitaju iz fajla, maksimalno 15... Love - pomocna strukturna varijabla i,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 ne postoji 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 polozili obe parcijale. podaci[i].prvi se automatski sabira sa podaci[i].drugi i ukupna vrijednost 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

33.

Napisati funkciju okreni() koja kao argument uzima neki string i okrece sadrzaj tog stringa naopako. Prototip funkcije okreni() treba biti: void okreni(char* p) Zatim napravite glavni program koji sa standardnog ulaza ucitava neki string, te ga ispisuje naopako. Primjer: Unesite string: Sarajevo Naopako: ovejaraS RJEŠENJE:
#include <stdio.h> // Funkcija okreni void okreni(char *p){ // Definisanje pomocnih varijabli char 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 na pocetku, pa cemo ga vratiti na pocetak tako sto ga pomaknemo za isti broj mjesta 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 je EVOL. Znaci potrebno je zamjeniti zadnje slovo sa prvim, i drugo sa predzadnjim. Brojac „i“ nam predstavlja znak do kojeg smo dosli sprijeda, a brojac „j“ straga. Na pocetku ce biti i=0, j=3 (jer je br=3, nemojte se zbuniti sto je 3 a ne 4, tu su ipak cetiri clana 0,1,2,3). Znaci nakon sto se for petlja jednom izvrsi „i“ se uveca za 1 i postaje 1, a j se umanji za 1 i postane 2. Znaci u prvom slucaju pomocu pomocne varijable „pom“ mijenjamo znakove na 0 i 3 poziciji, drugi put ce se zamjeniti znakovi na 1 i 2 poziciji. I dobili smo trazenu rijec. Mozda zbunjuje uslov i<br/2; ali je neophodan, broj permutacija je jednak polovini duzine rijeci, nacrtajte sebi neki primjer i zakljucite to :). Ukoliko se uzme rijec sa neparnim brojem slova onda se srednji clan ne pomjera nigdje, ostaje, sto je i logicno. Dok se clanovi 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 program main(){ // Definisanje varijabli i pointera char NIZ[100]; char *t; // Unos neke rijeci i zapisivanje iste u NIZ printf("Unesi neku rijec: "); scanf("%s", &NIZ);

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

34.

Napisati funkciju ubaci5() koja kao argument uzima neki prirodni broj n i dva broja a i b, a zatim vraca se broj koji bi nastao zamjenom cifri na mjestu a i b cifrom 5 (gledano s desne strane). 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 imaju smisla. Primjeri ulaznih argumenata i vracenih vrijednosti: Primjer1: za ulazne argumente n=123321, a=2, b=3 funkcija vraca broj 123551. Primjer 2: za ulazne argumente n=23455, a=3, b=5 funkcija vraca broj 53555. RJEŠENJE:
#include <stdio.h> // Funkcija ubaci5(); int ubaci5(int n,int a,int b) { // Definisanje varijabli int c=0,t=1,o,i; /* Brojac „i“ krece od 1(prvi znak straga) i ide dok broj „n“ koji smo primili u funkciju ne postane 0. Svaki put kada for petlja se izvrsava ponovo, uzima se ostatak dijeljenja sa 10, odnosno uzima se zadnja cifra broja „n“, i pridruzuje varijabli „o“. Zatim se broj „n“ podijeli sa 10, cime mu se odbije zadnja cifra. Suma „c“ se uvecava za „t*o“ gdje t se mijenja kao 1,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 na toj poziciji. Naredba „continue;“ ce vratiti na pocetak for petlje kako se nebi izvrsile i linije ispod, jer bi time dobili ubacivanje brojeva, a ne zamjenu!!! Savjet: Probajte napisati recimo petocifren broj, i skontajte malo na 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,n int n, a, b; // Unos brojeva a,b,n printf("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 se pridruzuje varijabli n, koja se printa u iducoj liniji. */ n=ubaci5(n,a,b); printf("%d", n); // Kraj programa. getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

35.

Napisati program koji ucitava podatke iz ulazne formatirane tekstualne datoteke „gradovi.txt“ i kreira izlaznu datoteku „prosjeci.txt“ koja sadrzi spisak gradova s prosjecnom temperaturom za prva tri mjeseca. Datoteka „gradovi.txt“ je sljedeceg formata: [grad] [JAN] [FEB] [MAR] gdje je: [grad] kolona u kojoj su zapisani nazivi gradova i koja zauzima 15 mjesta; [JAN], [FEB], [MAR] kolona u kojoj su zapisane cjelobrojne prosjecne 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 zauzima 15 mjesta; [PRTEMP] kolona u kojoj su zapisane prosjecne temperature koristeci dva decimalna mjesta i maksimalno dva mjesta prije decimalne tacke. Primjer sadrzaja datoteke „gradovi.txt“: TRAVNIK 0 1 2 ZENICA 2 3 4 TUZLA 2 5 5 SARAJEVO 0 3 1 Primjer sadrzaja datoteke „prosjeci.txt“: TRAVNIK 1.00 ZENICA 3.00 TUZLA 4.00 SARAJEVO 1.33 RJEŠENJE:
#include <stdio.h> main(){ // Definisanje varijabli FILE *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.txt Trinity=fopen("C:\\prosjeci.txt","w"); /* Citanje podataka iz datoteke gradovi.txt izracunavanje prosjecne temperature PRO i printanje u datoteku prosjeci.txt */

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 programa close(Neo); close(Trinity); getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

36.

Napisati funkciju izbacip() koja kao argument uzima neki prirodni broj n, a zatim vraca broj koji bi nastao izbacivanjem parnih 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 broj int izbacip(int n){ /* Definisanje varijabli, „t“ je tezisnica koja se svaki put kada dodajemo neku cifru pomnozi sa 10, „o“ je ostatak, „i“ je brojac, a „c“ je broj koji ce funkcija 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 10 n=n/10; /* Ako je broj paran, vraca se na pocetak petlje i time se izbacaju parne cifre */ if (o%2==0) continue; // Dodavanje cifre na broj „c“ c=c+t*o; // Mnozenje tezisnice sa 10 t=t*10; } // Vracanje varijable c return c; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

37.

Napisati funkciju ispis_preko_a() koja kao argment uzima neko cjelobrojno polje i dva prirodna broja a i d, a zatim ispisuje sve elemente polja koji su veci od broja a. Broj d predstavlja broj elemenata polja. Funkcija treba imati slijedeci prototip: void ispis_preko_a(int *polje, int a, int d) Na primjer, za ulazne argumente int polje[]={4,5,7,20,8,10,2,-2}, a=6, d=8 trebaju se ispisati brojevi: 7, 20, 8, 10 RJEŠ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 kojeg smo dosli on se ispisuje na ekran.*/ if (a<polje[i]) printf("%d, ", polje[i]); } }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

38.

Napisati funkciju zamijeni() koja ce u jednodimenzionalnom polju A velicine d zamijeniti i-ti element sa minimalnim elementom u polju A. Elementi polja A su vec definirani u glavnom programu. 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 imaju slijedece vrijednosti i=3, d=9 funkcija zamijeni() promjeni polje A 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 niza min=A[0]; /* Trazenje najmanjeg elementa u nizu. Pretpostavili smo da je to prvi broj, i sada trebamo ispitati da li postoji neki broj krenuvsi od drugog (j=1 umjesto j=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-ti clan ustvari broj za jedan manje, jer nam je prvi clan nulti clan! */ A[i-1]=min; // Ispis niza for (j=0; j<d; j++) printf("%d ", A[j]); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

39.

Data je tekstualna datoteka c:\pismo.txt. Napisati funkcije za: a) ispis datoteke na standardni izlaz zadrzavajuci strukturu po redovima; b) prepis datoteke u novu mijenjajuci mala i velika slova; c) ispisati datoteku u obrnutom redosljedu na izlaz (prva postaje zadnja, druga postaje pretposljednja rijec...) d) ispitati da li je neka rijeè palindrom (isto znacenje kada se cita 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 u obrnutom 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 slova void 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; else if ((znak>96)&&(znak<122)) znak=znak-32; fprintf(datoteka1, "%c", znak); } fclose(datoteka1); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

/* 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 datoteku FILE *datoteka; // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); // Poziv funkcije za ispis datoteke na ekran... ispis(datoteka); fclose(datoteka); // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); // Poziv funkcije za prepis datoteke u novu mijenjajuci mala i velika slova. ispisunovu(datoteka); fclose(datoteka); // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); /* Poziv funkcije za ispis datoteke u obrnutom redosljedu na izlaz (prva postaje zadnja, druga postaje pretposljednja rijec...) */ ispisobrnuto(datoteka); fclose(datoteka); // Otvaranje datoteke za citanje datoteka=fopen("c:\\pismo.txt","r"); /* Poziv funkcije za ispitivanje da li je neka rijec palindrom (isto znacenje kada se cita i u obrnutom smjeru) */ palindrom(datoteka); fclose(datoteka); // Kraj programa... getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

40.

Napisati program koji cita više linija teksta sa ulaza i štampa koliko rijeci je duzine 2 3 4 i više slova. Štampu realizovati pomocu funkcije STAM_REZ u datoteku ili na ekranu. Iz datoteke rezultata dati izvještaj o ukupnom broju rijeci i prosjecnoj duzini rijeci. RJEŠENJE:
#include <stdio.h> // Funkcija koja kreira datoteku sa rezultatima void STAM_REZ(char *tekst, int br){ // Definisanje pokazivaca na fajl FILE *rezultati; // Definisanje varijabli int i,b=0,dva=0,tri=0,cetiri=0,vise=0, brojslova=0, prosjek=0; // Otvaranje datoteke u koju cemo pisati podatke rezultati=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 rijeci izbrojano. */ 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... i imamo... ako je b>1 broj slova ce se sabrati sa brojem slova rijeci koja se trenutno obradjuje, ako je b=2 onda se varijabla dva koja broji rijeci sa 2 slova uveca za 1. Ako je tri onda se varijabla tri uveca za 1... ako je preko 4 onda se varijabla vise uveca za 1... primjetite da se brojac vraca na 0 izlaskom 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;} else if (b==3) {tri++; b=0;} else if (b==4) {cetiri++; b=0;} else if (b>4) {vise++; b=0;} else b=0; } else b++; } // Upis podataka u datoteku... fprintf(rezultati,"Rijeci sa 2 slova: %d\n", fprintf(rezultati,"Rijeci sa 3 slova: %d\n", fprintf(rezultati,"Rijeci sa 4 slova: %d\n", fprintf(rezultati,"Rijeci sa preko 4 slova: %d\n", prosjek=brojslova/(dva+tri+cetiri+vise); fprintf(rezultati,"PROSJEK: %d\n", prosjek);

dva); tri); cetiri); vise);

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

/* Zatvaranje datoteke i izlaz iz funkcije... „void“ funkcija ne vraca nista!!! Izlaskom je sve sto se u njoj desavalo zaboravljeno, ali zato imamo sve rezultate pohranjene u datoteci iz koje cemo po povratku u program citati podatke.*/ fclose(rezultati); } // Glavni program main(){ // Definisanje varijabli int br=0, i=0, p=0, dva, tri, cetiri, vise, prosjek; char tekst[1000]; // Definisanje pokazivaca na fajl FILE *izvjestaj; /* Unos teksta (koristio sam while petlju koja upisuje znak po znak, a ne %s koja upisuje cijeli string odjednom, a zasto? pa jednostavno jos uvijek neznam drugi nacin da izbjegnem situaciju kad upisete prvi razmak, a program to shvati kao kraj stringa i racuna samo da je string prva rijec, a ostalo kao da niste unjeli. Ovako se ucita sve sto unesete sa tastature, sto nam i treba. U zadatku 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“ koji je prebrojao broj unesenih karaktera, mogli smo i bez njega, al eto ja nekako vise 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 fscanf(izvjestaj,"Rijeci sa 2 slova: fscanf(izvjestaj,"Rijeci sa 3 slova: fscanf(izvjestaj,"Rijeci sa 4 slova: fscanf(izvjestaj,"Rijeci sa preko 4 slova: fscanf(izvjestaj,"PROSJEK: %d", &prosjek); isti kao pri upisu :) %d\n", &dva); %d\n", &tri); %d\n", &cetiri); %d\n", &vise);

// 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 programa fclose(izvjestaj); getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

41.

Program treba unjeti 2 broja i ispisati NZD... najveci zajednicki djeljilac... RJEŠENJE:
#include <stdio.h> main() { // Definicija varijabli int i,a,b,min,nzd=1; // Unos dva prirodna broja printf("Unesi dva broja: "); scanf("%d,%d", &a, &b); // Pridruzuje se varijabli min manji od unesena 2 broja if (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-a printf("\nNajveci zajednicki sadrzilac je: %d" , nzd); // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

42.

Ispis sljedeceg znaka na ekranu... +++++-+++++ ++++---++++ +++-----+++ ++-------++ +---------+ ++-------++ +++-----+++ ++++---++++ +++++-+++++
#include <stdio.h> main() { int k,i,j,a=11; // a predstavlja dimenzije znaka for (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 skontat ili necete :) jednostavna igra sa for petljama... pokusajte uraditi preko funkcija :) // Kraj programa getch(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

43.

Unesite broj clanova niza cijelih brojeva, a zatim i clanove niza a zatim ih sortirajte od najveceg ka najmanjem i ispisite sortirano na ekran. RJEŠENJE:
# include <stdio.h> main(){ // Definisanje varijabli int n,i,j,niz[100],pom; // Unos broja clanova niza printf("\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 ga sortirati 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 vecinu posla. Mozete primjetiti da u uslovu stoji „i<(n-1)“ kao i „j<(n-1)“. Ako pogledamo 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 4 izmjene 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 a unutrasnja se izvrsi „(n-1)*(n-1)“ puta... u nasem slucaju od 5 clanova, znaci 16 puta. Mozda je ova metoda spora dosta jer se okrece 16 puta, sto bi se moglo smanjiti, ali zbog jednostavnosti izgleda, prvo sam uzeo ovu metodu. Dalje imamo uslov u unutrasnjoj petlji „niz[j]<niz[j+1]“ koji bi u prijevodu znacio, ako je j-ti clan manji od iduceg (j+1) onda im mijenja mjesta... Graficki desavanja pri sortiranju naseg niza izgledaju ovako (uspravno citajte). 1 - 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 3 - 1 4 4 4 3 3 3 3 3 5 5 5 4 4 4 4 4 - 4 1 2 2 2 2 5 5 5 3 3 3 3 3 3 3 2 - 2 2 1 5 5 5 2 2 2 2 2 2 2 2 2 2 5 - 5 5 5 1 1 1 1 1 1 1 1 1 1 1 1 1 I na kraju smo dobili soritran niz... znaci 16 puta se vrtila unutrasnja petlja po 4 puta je kretala od prvog do cetvrtog clana i vrsila izmjene po uslovu u if petlji, i na kraju rezultat mora biti sortiran niz! Da smo htjeli obrnuto da sortiramo od najmanjeg ka najvecem samo bi se promjenio znak < u uslovu 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

44.

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

RJEŠENJE:
# include <stdio.h> main(){ // Definisanje varijabli int n,i,j,niz[100],pom; // Unos broja clanova niza printf("\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 sam uradio 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 vrti unutrasnju petlju n-1 puta. Sad, ako pogledate prethodni primjer primjetiti cete na grafickom prikazu da nekoliko puta su se vrtile for petlje ali je niz ostajao isti. Ovom metodom cemo izbjeci to, i uciniti da program radi jos brze. Znaci svakim novim prolaskom kroz vanjsku petlju se PODNIZ unutar unutrasnje petlje umanji za 1, i time dobijamo na vremenu. Ovo je malo teze objasniti :) pa pogledajte graficki prikaz: 1 3 4 2 5 3 1 4 2 5 4 1 3 2 5 4 1 3 2 5 5 1 3 2 4 5 3 1 2 4 5 3 1 2 4 5 4 1 2 3 5 4 2 1 3 5 4 3 1 2 5 4 3 2 1

Vidite kako smo dosli do rezultata uz samo 11 permutacija, naspram onih 16 iz prvog primjera. Znaci u prvom dijelu ovog grafickog prikaza, nadjen je najveci broj niza i stavljen na vrh (broj 5). U drugom dijelu (primjetite da smo smanjili broj okretanja sa 4 na 3 jer nas vise broj na vrhu ne interesuje, i samo od preostalog niza od 4 clana trazimo najveci i stavljamo na vrh... i tako 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

45.

Unosi se sa ulaza broj clanova. Zatim se unese IME, PREZIME i broj bodova svakog clana. Na izlazu treba ispisati clanove sortirane po broju bodova. RJEŠENJE:
# include <stdio.h> // Definisanje strukture struct struktura { char ime[100]; char prezime[100]; int bodovi; }; main(){ // Definisanje varijabli int n,i,j; struct struktura spisak[100]; struct struktura pom; // Unos broja clanova niza printf("\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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

... Zadaci iz Cpp-a ...

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

46.

Napisati program u cpp-u, koji sa ulaza prima dva cijela broja, 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... }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

47.

Napisati program koji ce ispisati na ekranu zeljeni broj tackica, broj tackica se unosi na ulazu... RJEŠENJE:
// Ukljucivanje bibilioteke u program #include <iostream> using namespace std; // Definisanje glavne funkcije programa int main(){ // Definisanje varijabli int dots; // Ispis odgovarajuce poruke na ekranu cout << "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 ;)

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

48.

Jedan simpatican ;) program na kojem mozete uociti nacin formatiranja teksta u cpp-u. Program treba na ekranu ispisati sljedeci znak: ***
* * * * * * * ** * * * * * * * *

***
* * * *

RJEŠENJE:
/* Ukljucicanje biblioteka, biblioteka iomanip je unesena jer se u njoj nalazi funkcija za formatiranje teksta setw()*/ #include <iostream> #include <iomanip> using namespace std; int main(){ // Ispis 5 praznih redova, da bismo odmaknuli znak malo od vrha ekrana cout << endl << endl << endl << endl; /* Ispis prvog dijela znaka, prvo je ostavljeno 35 praznih mjesta a zatim su ispisane 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

49.

Sa ulaza se unose dimenzije 2 vektora (iste dimenzije), a zatim se izracuna treci vektor koji predstavlja zbir (prvi clan prvog vektora plus prvi clan drugog vektora...) dva unesena vektora. 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 u programu, ali ja ovako naviko :) */ vector<int> a(100), b(100), c; int broj; // Unos dimenzija vektora cout << "Unesi broj elemenata vektora [1-100]: "; cin >> broj; // Unos elemenata prvog vektora cout << "Unesi elemente prvog vektora: " << endl; for(int i=0; i<broj; i++){ cin >> a[i]; } // Unos elemenata drugog vektora cout << "Unesi elemente drugog vektora: " << endl; for(int i=0; i<broj; i++){ cin >> b[i]; } /* Racunanje treceg vektora, tako sto se sabiraju odgovarajuci 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; } elementi,

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 vektor trazenih 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 predstavlja vector<int> vector<int> for(int i = return c; } saberi() koja prima dva vektora, a vraca treci zbir ta dva vektora */ saberi(vector<int> a, vector<int> b){ c; 0; i < a.size(); i++) c.push_back(a[i] + b[i]); vektor koji

/* 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 vektora cout << "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 programa cin.ignore(9999, '\n'); getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

51.

Napisati program koji racuna sumu trocifrenih prirodnih brojeva, 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 se isto vrti od 0 do 9 i predstavlja cifru desetica, a k predstavlja cifru jedinica. Kada je uslov u trecoj for petlji zadovoljen tada se "suma" uvecava za 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

52.

Napisati program koji ucitani tekst štampa naopako. Tekst se 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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

53.

Napisati program koji ce izracunati ekvivalentnu otpornost paralelno vezanih otpornika. RJEŠENJE:
#include <iostream> #include <vector> using namespace std; /* Funkcija otpornici() koja prima broj otpornika, a vektor, 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; } kao rezultat vraca

/* Funkcija izracunaj() koja prima vektor koji sadrzi vrijednosti otpornika a vraca 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 otpornika cout << "Unesi broj otpornika: "; int broj; cin >> broj; // Unos vrijednosti otpornika vector<int> otpornici=unos(broj); // Ispis ekvivalentnog otpora cout << "Ekvivalentni otpor je: " << izracunaj(otpornici) << endl; // Kraj programa cin.ignore(9999, '\n'); getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

54.

Napišite funkciju “UnesiBroj” bez parametara, koja od korisnika ocekuje da unese neki realni broj. Ukoliko je zaista unesen realan broj, funkcija treba da ga vrati kao rezultat iz funkcije. Ukoliko nije unesen broj, funkcija treba ispisati “Neispravan unos. Molimo, pokušajte ponovo.” i ponovo traziti broj, sve dok se zaista ne unese ispravan broj (prema tome, funkcija ne završava dok se ne unese ispravan broj). Napisanu funkciju iskoristite u programu koji trazi da se unesu koeficijenti a, b i c linearne jednacine ax + b = c, a koji zatim nalazi i ispisuje njeno rješenje, pod uvjetom da ono postoji, ili odgovarajucu poruku u suprotnom. RJEŠENJE:
# include <iostream> using namespace std; // Funkcija za unos broja double Unesibroj(){ // Definisanje broja tipa double double broj; // Beskonacna for petlja for(;;) { cout << endl << "Unesite realan broj: "; cin >> broj; // Prekid for petlje kada se unese realan broj if(cin) break; // Ispis poruke, ako unos nije ispravan cout << "Neispravan unos. Molimo, pokusajte ponovo."; // Praznjenje bufera cin.clear(); cin.ignore(10000, '\n'); } // Vracanje broja iz funkcije return broj; } int main(){ // Unos brojeva double a=Unesibroj(); double b=Unesibroj(); double c=Unesibroj(); // Racunanje vrijednosti x double x=(c-b)/a; // Ispis rjesenja if (a==0) cout << "Jednacina nema rjesenja" << endl; else cout << "Rjesenje jednacine je: " << x << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

55.

Napišite program koji trazi da se sa tastature unese jedan kompleksan broj z i dva realna broja x i y, a koji zatim racuna i ispisuje vrijednost izraza:

RJEŠENJE:
# include <iostream> # include <complex> using namespace std; int main(){ // Definisanje varijabli complex<double> z; double x, y; // Unos kompleksnog broja cout << "Unesi komleksan broj z: " << endl; cin >> z; // Unos dva realna broja cout << "Unesi dva realna broja: " << endl; cin >> x >> y; // Ispis rezultata cout << "Vrijednost izraza: " << pow(x+((z*z*complex<double>(2, 3))/ (complex<double>(x, -y))),3) << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

56.

Napraviti program za rješavanje kvadratne jednacine koji koristi kompleksne promjenljive. Pri tome, rješenja ciji je imaginarni dio jednak nuli treba ispisati tako da se ispisuju cisto kao realni brojevi, a ne kao uredjeni parovi realnih brojeva. RJEŠENJE:
#include <iostream> #include <cmath> #include <complex> using namespace std; int main() { // Definisanje i ucitavanje varijabli complex<double> a, b, c; cout << "Unesi koeficijente:\n"; cin >> a >> b >> c; // Racunanje diskriminante complex<double> d=b*b-complex<double>(4,0)*a*c; // Racunanje x1 i x2 complex<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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

57.

Napišite program koji trazi da se prvo unese prirodan broj “n”, a nakon toga elementi vektora “a” koji ima “n” cjelobrojnih elemenata. 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 u drugom redu elemente vektora “c”. Brojevi trebaju biti medjusobno razdvojeni zarezom, pri cemu iza posljednjeg broja u svakom redu ne 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 ekranu if (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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

58.

Koristeci tip podataka “string“ definiran u istoimenoj standardnoj biblioteci, napišite program koji trazi da se sa tastature unesu dvije recenice, a zatim na ekranu ispisuje koliko svaka od recenica sadrzi znakova, koja od ove dvije recenice dolazi prije po abecednom poretku, kao i recenicu koja se sastoji od ove dvije recenice sastavljene zajedno. Takodjer, ispišite prvu od ove dvije recenice u obrnutom poretku (od kraja ka pocetku). Pri tome, za tu svrhu koristite operacije koje su podrzane za tip podataka “string”. RJEŠENJE:
# include <iostream> # include <string> using namespace std; main(){ // Definisanje dva stringa string rec1, rec2; // Unos dva stringa cout << "Unesi prvu recenicu: "; getline(cin, rec1); cout << "Unesi drugu recenicu: "; getline(cin, rec2); // Ispis broja znakova prve i druge recenice cout << "Prva recenica sadrzi: " << rec1.length() << " znakova..." << endl; cout << "Druga recenica sadrzi: " << rec2.length() << " znakova..." << endl; // Ispis recenica po abecednom redu if (rec1<rec2) cout << "1: " << rec1 << endl << "2: " << rec2; else cout << "1: " << rec2 << endl << "2: " << rec1; // Sastavljanje prve i druge recenice u jednu cout << endl << "Zajedno: " << rec1 + " " + rec2; // Ispis prve recenice naopako cout << endl << "Prva naopako: "; for(int i=rec1.length()-1;i>=0;i--) cout << rec1[i]; // Kraj programa cout << endl; getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 baci izuzetak. To se moze desiti u tri slucaja: ako n nije prirodan broj ili nula (tada suma nema smisla), zatim ukoliko se pod korijenom pojavi negativan broj, i konacno, ukoliko nazivnik dobije vrijednost nula. Za svaki od ova tri slucaja treba baciti razlicite tipove izuzetaka. Funkciju testirajte u glavnom programu koji u beskonacnoj petlji trazi da se sa tastature unose vrijednosti argumenata x i n, a koji potom ispisuje vrijednost funkcije ili odgovarajucu poruku o greški (na osnovu bacenog izuzetka). Pri testiranju obavezno pronadjite takve vrijednosti argumenata 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 izuzetak if (n<=0) throw "Greska: n mora biti vece od 0..."; // Racunanje sume for (double i=0; i<=n; i++){ // Ako je podkorjen negativan baca se izuzetak if (x*(x+i)-(pow(-1,i)*i*i)<0) throw "Greska: Korjen iz negativnog broja..."; // Ako je nazivnik nula baca se izuzetak if (sqrt(x*(x+i)-pow(-1,i)*i*i)==0) throw "Greska: Nazivnik nemoze biti nula..."; // Formula y+=(pow(x,i))/sqrt(x*(x+i)-pow(-1,i)*i*i); } // Vracanje rezultata return y; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

main(){ // Try blok... try{ // Definisanje varijabli i unos varijabli double x,n; cout << "Unesite n: "; cin >> n; cout << "Unesite x: "; cin >> x; // Ispis rezultata uz poziv funkcije cout << endl << "Rezultat je: " << racunaj(x,n); } // Catch blok, hvata baceni izuzetak i ispisuje error poruku... catch(const char poruka[]) { cout << endl << poruka << endl; } // Kraj programa cout << endl; getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

60.(*)

Napisati program koji simulira Paint. Rad u konzoli. Jedan piksel predstavlja jedan znak '*'. Kursor koji crta po ekranu krece se pomocu strelica. Boja piksela se mijenja pomocu tipke ENTER. A gumicu ukljucujemo na tipku SPACE. Program ima za cilj podsjetiti korisnike C++ da se i u C++ moze formatirati i uljepsavati tekst. Poenta zadatka je razmotriti funkcije za lociranje kursora na odredjenu poziciju na ekranu kao i funkciju za mijenjanje boje teksta. RJEŠENJE:
// Ovaj program je sa zvjezdicom, nije tezak, ali su ukljucene neke funkcije za koje mozda nikada necete ni cuti, i namijenjen je onima kojima nedostaju neke 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 broj predstavlja 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 tu poziciju */ void LocirajKursor(COORD kordinate){ HANDLE Konzola = GetStdHandle(STD_OUTPUT_HANDLE); // Postavljanje pozicije kursora na poziciju 'kordinate' koju je funkcija 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 zelenu PromjeniBoju(10); // Postavljanje koordinata kurosora na poziciju (0,0)... kordinate.X = 0; kordinate.Y = 0; // Poziv funkcije koja ce locirati kursor... LocirajKursor(kordinate);

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Ispis LEGENDE programa cout << "Strelicama se pomjera zvjezdica... 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 << "*";

Izlaz -->> ESC";

/* Poziv beskonacne petlje u okviru koje se i izvrsava cio program, petlja se moze normalnim putem prekinuti samo pritiskom na tipku ESC, koja predstavlja izlaz 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 programa if (c==27){ system("cls"); // Brisanje ekrana boja=0; // Postavljanje boje na 0 (crna) // Beskonacna for petlja koja se prekida bilo kojom tipkom... for(;;){ if (kbhit() != 0) return 0; // Poruke na izlazu kordinate.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: matrix.bih@gmail.com";

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// 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 ovaj dio uopste postoji, pa samo zato da bi kursor „treptio“ u suprotnom, kada brisemo nebismo vidjeli na kojoj je poziciji kursor ;) */ else { LocirajKursor(kordinate); cout << "*"; } // Kraj programa, do ovoga se nemoze doci, barem ne normalnim putem... ;) return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

61.

Napišite dvije preklopljene verzije funkcije “RadijaniUStepene” koje pretvaraju radijane u stepene. Prva verzija prihvata dva realna parametra “alfa“ i “stepeni”, dok druga verzija prihvata cetiri parametra nazvana “alfa”, “stepeni”, “minute“ i “sekunde”, od kojih je prvi realan a ostali cjelobrojni. U oba slucaja prvi parametar predstavlja neki ugao u radijanima. Prva verzija funkcije treba da pretvori tu vrijednost u stepene (kao realan broj) i smjesti pretvorenu vrijednost u drugi parametar. Druga verzija funkcije treba da pretvori vrijednost ugla u stepene, minute i sekunde i da smjesti pretvorenu 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 su ispravno deklarirane) treba da se smjeste brojevi 75.9742, 75, 58 i 27, jer je 1.326 rad = 75.9742○ = 75○ 58' 27". Napišite i kratku glavnu funkciju (“main”) u kojoj cete demonstrirati napisanu funkciju. RJEŠENJE:
# include <iostream> using namespace std; /* Prima realan broj alfa, i stvara se referenca &stepeni na s koji je nedefinisan 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 dobijemo vrijednosti za stepene, minute i sekunde, vrijednosti se pamte i zapisuju u varijable koje su poslate i u jednoj i u drugoj funkciji jer promjena reference unutar funkcije mijenja i varijablu van funkcije na koju je stvorena referenca*/ 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); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 ugla cout << "Unesi x: "; cin >> r; // Funkcija koja "vraca" samo stepene i to u realnom obliku RadijaniUStepene(r, s); // Funkcija koja vraca stepene, minute, sekunde u cjelobrojnom obliku RadijaniUStepene(r, x, y, z); // Ispis stepeni u realnom obliku cout << "Stepeni: " << s << endl; // Ispis stepeni, minuta, sekundi u cjelobrojnom obliku cout << "Stepeni: " << x << ", minute:" << y << ", sekunde: " << z << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

62.

Napišite genericku funkciju “UnosBroja” sa tri parametra. Funkcija treba da omoguci pouzdano unošenje brojeva u program, uz potpunu kontrolu grešaka pri unosu. Prvi i drugi parametar su tipa “string”. Pri tome, prvi parametar predstavlja tekst koji se ispisuje korisniku kao obavijest da treba unijeti broj (prompt), dok drugi parametar predstavlja tekst koji se ispisuje korisniku kao upozorenje u slucaju da unos nije ispravan. Treci parametar je referenca na proizvolji numericki tip, a predstavlja promjenljivu 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 bude ispravan. Napisanu funkciju demonstrirajte u testnom programu koji od korisnika trazi da unese realni broj x i cijeli broj n, a zatim 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 u funkciju zavisi i koji to tip predstavlja tip 'tip' */ template<typename tip> /* Primaju se dva stringa p1 i p2 i referenca na treci parametar pri pozivu funkcije 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, mijenja se 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 cio broj 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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

63.

Napišite genericku funkciju “BrojZajednickih” sa cetiri parametra “niz1”, “n1”, “niz2” i “n2”. Parametri “niz1“ i “niz2“ su klasicni nizovi (ne vektori) proizvoljnog ali istog tipa elemenata (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 se javljaju kao zajednicki elementi i u jednom i u drugom nizu (radi jednostavnosti, podrazumijevati da nizovi ne sadrze elemente koji se 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) pojavljuju u oba niza. Napišite i kratki testni program u kojem cete demonstrirati napisanu funkciju. RJEŠENJE:
# include <iostream> using namespace std; /* Genericka funkcija u kojoj je definisan tip kao sto je tip varijable koja se 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 bilo kojem (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 brojaca return br; } int main(){ // Definisanje duzina nizova i njihov unos int n1, n2; cout << "Unesi duzinu prvog niza: "; cin >> n1; cout << "Unesi duzinu drugog niza: "; cin >> n2; // Definisanje nizova i njihov unos int 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 funkcije cout << "Broj istih elemenata" << BrojZajednickih(niz1,n1,niz2,n2) << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

64.

Napišite genericku funkciju “Izvrni“ sa jednim parametrom, koji predstavlja vektor elemenata proizvoljnog tipa. Funkcija treba da ispremješta elemente vektora tako da prvi element postane posljednji, a posljednji prvi. Na primjer, ukoliko se u glavnom 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 bude realizirana da vrši premještanje “u mjestu”, odnosno da ne koristi nikakav pomocni vektor osim vektora prenesenog kao parametar (uputa: razmijenite prvi element sa posljednjim, drugi sa pretposljednjim, itd.). Napišite i kratki glavni program u kojoj cete demonstrirati napisanu funkciju na sekvenci brojeva koji se unose sa tastature. Oprez: funkcija izvrni ne smije sama po sebi ništa da ispisuje na ekran. Njeno dejstvo treba samo da bude izmjena poretka elemenata u 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 funkciju vector<niz> izvrni(vector<niz> a){ /* Vrti se petlja od nultog clana do sredine vektora i izmjenjuju se clanovi simetricno */ 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 vektora return a; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

int main(){ // Definisanje duzine vektora, vektora i unos clanova vektora vector<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 vektor a=izvrni(a); // Ispis rezultata for(int i = 0; i < a.size(); i++) cout << a[i] << " " << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

65.

Napišite genericku funkciju “Odstrani” sa dva parametra “v” i “prag”. Prvi parametar je vektor elemenata koji pripadaju konceptu uporedivih elemenata (tj. elemenata za koje su definirane operacije poredjenja, tako da se mogu porediti po velicini). Funkcija treba da odstrani sve elemente iz zadanog vektora cija je vrijednost manja od vrijednosti parametra “prag”. Na primjer, neka vektor “a” realnih brojeva sadrzi redom vrijednosti 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” ne treba da koristi nikakav pomocni vektor osim samog parametra “v”. Takodjer, za realizaciju ove funkcije ne smijete koristiti nikakve koncepte koji nisu obradjivani na predavanjima (npr. funkciju “erase”, iteratore, itd.). Napišite i kratki testni program u kojem cete demonstrirati napisanu funkciju na sekvenci realnih 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 odstrani template<typename niz> // Prima se vektor i prag u funkciju vector<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 od praga tada se br uveca za 1, a ako nije tada se broj upise na poziciju koja je za br puta manja od trenutne pozicije, znaci ako smo dosli do 5 clana i do tada su nadjena dva clana manji od praga tada ce se 5 clan upisati na 5-2=3 poziciju, a na kraju ce se jos velicina vektora "umanjiti" za br i dobili smo vektor 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 vektora return a; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

int main(){ // Definisanje duzine vektora, vektora i unos clanova vektora vector<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 praga int prag; cout << "Unesi prag: "; cin >> prag; // Poziv funkcije izvrni() u koju saljemo vektor i prag a=odstrani(a, prag); // Ispis rezultata for(int i = 0; i < a.size(); i++) cout << a[i] << " "; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

66.

Poznata Moievrova teorema za kompleksne brojeve tvrdi da je za 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 sa tastature izracunati lijevu i desnu stranu ovog izraza i ispisati ih na ekranu, koristeci kompleksni tip podataka. Na nekoliko primjera 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 broja double 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 rezultata cout << "Lijeva strana jednacine je: " << prvidio << " a desna: " << drugidio << endl; getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

67.

Deklarirajte pobrojani tip “Dani” takav da promjenljive ovog tipa mogu uzimati samo vrijednosti “Ponedjeljak”, “Utorak”, “Srijeda”, “Cetvrtak”, “Petak”, “Subota” i “Nedjelja”. Zatim napišite funkciju “StampajKalendar” koja ne vraca nikakav rezultat, 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, dok parametar “pocetni_dan” odredjuje dan u sedmici kojim zapocinje taj mjesec. Funkcija “StampajKalendar” štampa kalendar za taj mjesec. Na primjer, ukoliko zelimo odštampati kalendar za mjesec koji ima 31 dan, a pocinje srijedom, to mozemo uraditi sljedecim pozivom: StampajKalendar(31, Srijeda); Taj poziv treba da na ekranu proizvede ispis poput sljedeceg: P U S C P S N 1 2 3 4 5 8 9 10 11 12 15 16 17 18 19 22 23 24 25 26 29 30 31

6 7 13 14 20 21 27 28

RJEŠENJE:
# include <iostream> # include <iomanip> using namespace std; // Definisanje pobrojanog tipa Dani enum Dani {Ponedjeljak, Utorak, Srijeda, Cetvrtak, Petak, Subota, Nedjelja}; // Funkcija koja stampa kalendar void StampajKalendar(int broj_dana, Dani pocetni_dan){ cout << endl << endl << " P U S C P S N" << endl; // Stampanje odgovarajuceg broja praznih mjesta na pocetku for (int i=0; i<pocetni_dan; i++) cout << setw(3) << ""; // Dodjeljivanje odgovarajuce vrijednosti varijabli b int b=pocetni_dan; // Ispis rednih brojeva dana for (int i=1; i<=broj_dana; i++) { cout << setw(3) << i; b++; // Prelazak u novi red nakon ispisa svakih 7 brojeva if (b==7) { b=0; cout << endl; } } }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

int main(){ // Definisanje varijabli int broj_dana, redni_broj_dana; Dani pocetni_dan; // Unos rednog broja dana od kojeg pocinje mjesec while(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 mjesecu while(broj_dana<=27||broj_dana>=32){ cout << "Unesi broj dana u mjesecu (28-31): "; cin >> broj_dana; } // Dodjeljivanje odgovarajuce vrijednosti varijabli pocetni_dan pocetni_dan=Dani(redni_broj_dana-1); // Poziv funkcije i slanje argumenata StampajKalendar(broj_dana, pocetni_dan); // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

68.

Napišite program koji trazi da se prvo unese prirodan broj “n”, a nakon toga elementi vektora “a” koji ima “n” cjelobrojnih elemenata. Zatim, program treba da kreira novi vektor “b” u koji ce biti prepisani elementi vektora “a” izostavljajuci duplikate (tj. brojeve koji se ponavljaju). Na kraju, program treba da ispiše elemente vektora “b”, kao i broj elemenata koji se ponavljaju. Na primjer, ukoliko se sa tastature unese niz od 15 brojeva: 7, 10, 4, 2, 4, 4, 5, 6, 7, 3, 9, 1, 8, 6 i 7 program treba 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 su brojevi 7, 4 i 6). RJEŠENJE:
# include <iostream> # include <vector> using namespace std; int main(){ // Definisanje varijabli int ponavljanja=0; vector<int> a, b, pom; // Unos broja clanova vektora cout << "Unesi prirodan broj \"n\": "; int n; cin >> n; // Unos clanova vektora cout << "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 brojevi koji se ponavljaju...*/ for (int j=0; j<n; j++) if ((a[i]==a[j])&&(i!=j)) { pom.push_back(a[i]); ponavljanja++; break;}

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Prepis broja a[i] u vektor b b.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 ponavljali for (int i=0; i<pom.size(); i++) cout << pom[i] << " "; cout << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

69.

Napišite funkcije “SviElementiSuJednaki” i „SviElementiSuRazliciti”. I jedna i druga funkcija primaju kao parametar jedan vektor realnih brojeva, a vracaju kao rezultat logicku vrijednost (tj. vrijednost tipa “bool”). Funkcija “SviElementiSuJednaki” vraca vrijednost “true” ako i samo ako su svi elementi vektora medjusobno identicni, a u suprotnom vraca “false”. Funkcija “SviElementiSuRazliciti” vraca vrijednost “true” ako i samo ako su svi elementi vektora medjusobno razliciti (tj. ukoliko nikoja dva elementa nisu medjusobno jednaka), a u suprotnom vraca “false”. Napisane funkcije testirati u glavnom programu (“main” funkciji) na vektoru ciji se elementi 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 vektora cout << "Unesi prirodan broj \"n\": "; int n; cin >> n; // Unos clanova vektora cout << "Unesi clanove vektora: "; for (int i=0; i<n; i++){ int broj; cin >> broj; vektor.push_back(broj); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Ispis odgovarajucih poruka if(SviElementiSuJednaki(vektor)) cout << "Svi elementi su identicni... "; if(SviElementiSuRazliciti(vektor)) cout << "Svi elementi su razliciti... "; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

70.

Napišite funkciju sa jednim argumentom n koja kreira dinamicki niz od n cijelih brojeva, popunjava ga sa prvih n Fibonacijevih brojeva, i vraca kao rezultat pokazivac na prvi element kreiranog niza. Napisanu funkciju testirajte u kratkom testnom programu koji prvo sa tastature unosi broj n, zatim ispisuje elemente kreiranog niza, i konacno, uništava kreirani niz. RJEŠENJE:
#include <iostream> using namespace std; /* Funkcija Kreiraj koja prima prirodan broj n, kreira dinamicki niz od n elemenata, 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 ciframa for(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 funkcije return niz; } int main(){ /* U funkciji postoji mogucnost da bude bacen izuzetak, koji cemo uhvatiti u catch bloku i ispisati gresku. */ try { // Unos broja clanova niza int n; cout << "Unesite broj clanova niza"; cin >> n; /* Definisanje dinamickog niza "dinamickiniz[]" koji ce poprimiti vrijednosti dinamickog 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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

71.

Napišite program koji od korisnika trazi da unese dimenzije kvadratne matrice n, a zatim da unese dvije matrice formata n n (pretpostavite da su elementi matrica realni brojevi). Program nakon toga treba da ispiše zbir dvije unesene matrice. U programu treba da se nalaze sljedece funkcije: “KreirajMatricu”, “UnesiMatricu”, “SaberiMatrice”, “IspisiMatricu“ i “UnistiMatricu”. Funkcija “KreirajMatricu“ prima kao parametre dvojni pokazivac koji sluzi za pristup dinamicki kreiranoj matrici (u nastavku cemo ovaj pokazivac prosto zvati dinamicka matrica), kao i dimenziju matrice n. Funkcija treba da alocira prostor za matricu formata n n, i dodijeli adresu alociranog prostora pokazivacu koji se koristi za pristup njenim elementima (za tu svrhu, odgovarajuci formalni parametar mora biti referenca na dvojni pokazivac). Funkcija “UnesiMatricu” popunjava matricu elementima unesenim sa tastature, a prima kao parametre dinamicku matricu i dimenziju n. Funkcija “SaberiMatrice” prima kao parametre dvije dinamicke matrice i dimenziju n. Ova funkcija treba da kreira novu dinamicku matricu (pozivom funkcije “KreirajMatricu”), da je popuni zbirom dvije dinamicke matrice koje su joj proslijedjene kao parametri, i da vrati kao rezultat dvojni pokazivac koji sluzi za pristup elementima novokreirane matrice. Funkcija “IspisiMatricu” kao parametre prima dinamicku matricu i dimenziju n, a ispisuje elemente matrice na ekran. Konacno, funkcija “UnistiMatricu” unistava dinamicki kreiranu matricu koja joj se prosljedjuje kao parametar (zajedno sa dimenzijom n). Funkcija “KreirajMatricu” treba da baci izuzetak u slucaju da kreiranje ne uspije. Pri tome, ova funkcija mora da vodi racuna da u slucaju da dodje do bacanja izuzetka “pocisti iza sebe” sve uspjele alokacije, tako da ne dodje do curenja memorije. Baceni izuzetak treba hvatati u glavnom programu. Obavezno testirajte slucaj kada alokacija ne uspijeva (unosom prevelikog broja n). RJEŠENJE:
#include <iostream> using namespace std; // Funkcija koja unistava matricu odredjenih dimenzija koju prima kao parametar... int UnistiMatricu(double **MATRIX, int n){ if (MATRIX == 0) { cout << "Ova matrica nije nikad kreirana, pa je necemo brisati... \n"; return 1; } cout << "Brisem matricu... \n"; for(int i = 0; i < n; i++) delete[] MATRIX[i]; delete[] MATRIX; cout << "Uspjesno izbrisana matrica... \n"; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

/* Funkcija koja kreira matricu dimenzija n x n, baca izuzetak ako nemoze kreirati... */ 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 popunjena elementima 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 ih tako sto razultat sabiranja pripisuje u prvu od dvije matrice, vraca se pokazivac 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; } }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

int main(){ // Definisanje tri dvostruka pokazivaca koji ce kasnije predstavljati matrice double **MATRIX1=0, **MATRIX2=0, **MATRIX3=0; // Definisanje dimenzija matrice int 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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

72.

Napišite program koji trazi od korisnika da unese niz recenica, pri cemu se broj recenica prethodno unosi sa tastature. Za svaku unesenu recenicu dinamicki alocirajte prostor, uz vodjenje evidencije o adresi svake alocirane recenice u dinamickom nizu pokazivaca na pocetke svake od recenica. Nakon toga, treba ispisati unesene recenice sortirane u abecedni poredak (odnosno u poredak po ASCII kodovima). Sortiranje obavite rucno, 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 recenica int broj_rec; cout << "Unesite broj recenica: "; cin >> broj_rec; cin.ignore(10000, '\n'); // Ignorisanje nepotrebih znakova iz bufera char **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 njega char 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 nizu strcpy(recenice[i], pom); } // Pomocni stringovi, uveo sam ih zbog efikasnije provjere operacija < > string pom1, pom2; // Proces sortiranja, metodom nalazenja najveceg i stavljanje na vrh for (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 niza cout << endl << "Sortirano: " << endl; for(int k = 0; k < broj_rec; k++) cout << k+1 << ": " << recenice[k] << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 na glavnoj dijagonali) ukoliko je matrica kvadratna, a da baci izuzetak ukoliko nije (s obzirom da se trag definira samo za kvadratne matrice). Funkcija “DaLiJeGornjaTrougaona” treba da kao rezultat vrati logicku vrijednost “true” ukoliko je matrica gornja trougaona (tj. ako ima sve nule ispod glavne dijagonale), a “false” ako nije. Konacno, funkcija “Transponovana” treba da kao rezultat vrati transponovanu matricu u odnosu na matricu koja joj je proslijedjena kao argument. Napisane funkcije testirajte u glavnom programu na primjeru matrice cije dimenzije i elemente unosi 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 matrice int 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 matrici double priv; for (int i=0;i<max;++i) for (int j=i+1;j<max;++j)

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

{ priv = a[i][j]; a[i][j] = a[j][i]; a[j][i] = priv; } // Resize kolona na pocetne redove a.resize(pom2); // Resize redova na pocetne kolone for(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 blok catch(const char poruka[]) { cout << endl << poruka << endl; } // Kraj programa return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

74.

Napišite program koji prvo trazi da se sa tastature unese recenica, a zatim ispisuje svaku rijec te recenice u posebnom redu, kao i informaciju koliko ta recenica ima slova (ne racunajuci interpunkcijske znakove) i rijeci. Obratite paznju da rijeci recenice mogu biti razdvojene sa više od jednog razmaka, kao i da se na samom pocetku i na samom kraju recenice mogu takodjer nalaziti razmaci. Za realizaciju koristite tip “string” i odgovarajuce manipulacije sa stringovima. RJEŠENJE:
# include <iostream> # include <string> using namespace std; int main(){ // Unos recenice cout << "Unesi recenicu: " << endl; string recenica; getline(cin, recenica); // Ispis rijeci cout << 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 slova cout << endl << "Recenica ima " << br << " slova i " << br1 << " rijeci!"; // Kraj programa return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

75.

Napišite funkciju “DaLiJePalindrom” koja za string koji joj je proslijedjen kao parametar ispituje da li je palindrom ili nije, i kao rezultat vraca odgovarajucu logicku vrijednost “true” ili “false”. Pod palindromima smatramo rijeci ili recenice koje se isto citaju sa obe strane (npr. “kapak”). Prilikom ispitivanja treba ignorirati eventualne razmake, interpunkcijske znake i razliku izmedju velikih i malih slova, tako da recenica “Ana voli Milovana” treba da bude prepoznata kao palindrom, iako bukvalno procitana sa suprotnog kraja glasi “anavoliM ilov Ana”. Još neki od poznatih palindromnih recenica su “Udovica baci vodu”, “E, sine, zeni se”, “I jogurt ujutru goji”, “I Dara za mast sama zaradi”, “Jovi limaru gumu gura Milivoj”, itd. Historijski najpoznatiji palindrom je latinska recenica “Sator Arepo tenet opera rotas” za koju se u srednjem vijeku smatralo da ima magicna svojstva. Napišite i kratki testni program (“main” funkciju) u kojem cete testirati napisanu funkciju.

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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

76.

Napisati program koji trazi od korisnika da unese spisak rijeci (broj rijeci se prethodno unosi sa tastature), a zatim ispisuje na ekran prvu i poslednju rijec iz spiska po abecednom poretku, kao i popis svih unesenih rijeci, ali bez ispisivanja duplikata (tj. bez ispisivanja rijeci koje su se vec jednom ispisale). 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 imena string 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 rijeci cout << "Prva rijec je: " << a[0] << " a zadnja " << a[a.size()-1] << endl; // Ispis svih rijeci cout << 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 programa return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

77.

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

gdje je n broj podintervala na koji dijelimo interval (a, b) i koji mora biti paran (veci broj podintervala daje vecu tacnost racunanja), 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 daje pribliznu vrijednost integrala. Napisanu funkciju testirajte na primjerima integrala funkcije sin x na intervalu (0, π), zatim funkcije x3 na intervalu (0, 10), i funkcije 1/x na intervalu (1, 2). Testiranje izvršite za razlicite vrijednosti n i uporedite rezultate sa tacnim rezultatima. Utvrdite kolike su vrijednosti za n bile potrebne da se dobije rezultat tacan na 5 decimala za sva tri primjera. RJEŠENJE:
#include <iostream> #include <cmath> // zbog sin funkcije using namespace std; // Funkcija od koje trazimo integral x*x*x double 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 intervala for(int k=1; k<=n-1; k+=2) dio1+=F(a+k*h); // racunanje prve sume for(int k=2; k<=n-2; k+=2) dio2+=F(a+k*h); // racunanje druge sume return (h/3)*(F(a)+4*dio1+2*dio2+F(b)); // Formula :) } int main(){ double a,b,n; // Unos podataka cout << "Unesi broj podintervala (n): "; cin >> n; cout << "Unesi interval (a,b): "; cin >> a >> b; // Ispis rezultata cout << "Rezultat: " << Integral(xnatrecu, n, a, b); getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

78.

Koristeci odgovarajuce funkcije iz biblioteke “algorithm”, napišite program koji ce za niz cijelih brojeva unesenih sa tastature ispisati: • najveci i najmanji element niza; • koliko puta se u nizu pojavljuje najmanji element; • koliko u nizu cijelih brojeva unesenih sa tastature ima brojeva koji su potpuni kvadrati (tj. kvadrati nekog drugog cijelog broja). Nakon toga, program treba prepisati u drugi niz sve elemente koji nisu potpuni kvadrati, i ispisati elemente tako formiranog niza. Napomena: U programu nije uopce dozvoljeno koristiti petlje (osim za unos elemenata niza), vec sve manipulacije treba ostvariti iskljucivo 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 false bool jelkvadrat(int a){ if(a==sqrt(a)*sqrt(a)) { return true; } else return false; } // Funkcija koja ispisuje broj koji prima void Ispisi(int x) { cout << x << " "; } int int int int main(){ A[100], B[100]; // Dva niza cijelih brojeva n; // Broj clanova brojac=0; // Broj clanova koji su puni kvadrati

// Unos niza cout << "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 u niz B[] */ if(jelkvadrat(br)) brojac++; else B[i-brojac]=br; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Ispis rezultata cout << "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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

79.

Napišite genericku funkciju “Izvrni” koja prihvata iste parametre i obavlja isti zadatak kao funkcija “reverse” iz biblioteke “algorithm”. Funkciju treba realizirati iskljucivo korištenjem pokazivacke aritmetike, bez korištenja indeksiranja i njegove trivijalne simulacije (tj. pisanja “*(p+i)” umjesto “p[i]”). Napišite i kratki testni program u kojem cete testirati napisanu funkciju na dva fiksna niza, od kojih je jedan niz cijelih brojeva, a drugi niz znakova. RJEŠENJE:
#include <iostream> #include <algorithm> using namespace std; // Genericka funkcija izvrni template<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 niza for(int i=0; i<br/2; i++){ TIP pr=*p1; *p1=*p2; *p2=pr; *p1++; *p2--; } } // Funkcija za ispis broja void Ispisi(int x) { cout << x << " "; } int main(){ int A[100]; // Definisanje niza int n; // Broj clanova niza // Unos niza cout << "Unesite broj clanova niza: "; cin >> n; for (int i=0; i<n; i++){ int br; cout << i+1 << ": "; cin >> br; A[i]=br; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Poziv funkcije koja izvrce niz Izvrni(A, A+n); // Ispis izvrnutog niza cout << "Izvrnuti niz: "; for_each(A, A+n, Ispisi); // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

80.

Napišite program koji ce na primjeru jednog fiksnog sortiranog niza od 50 elemenata i broja “n” unesenog sa tastature ispisati poziciju gdje se broj “n” nalazi unutar niza, odnosno cinjenicu da broj “n” nije pronadjen unutar niza. Koristite binarnu 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 n cout << "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 programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

81.

Definirajte strukturu “Vrijeme” koja sadrzi tri polja „sati”, “minute” i “sekunde”, i koja predstavlja tekuce vrijeme u toku dana, izrazenu u satima, minutama i sekundama. Zatim definirajte funkciju “IspisiVrijeme” koja ispisuje vrijeme proslijedjeno 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 trece vrijeme koje nastaje sabiranjem vremena koja su proslijedjena kao parametri (npr. sabiranjem 3h 34min 52sek i 4h 42min 20sek treba da se dobije vrijeme 8h 17min 12sek). Konacno, napravite mali testni program u kojem cete testirati napisane funkcije. RJEŠENJE:
# include <iostream> using namespace std; struct Vrijeme { int Sati; int Minute; int Sekunde; };

// Definisanje strukture Vrijeme

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 vremena cout << 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; } else ost=0; if((pom.Sati=V.Sati+K.Sati+ost)>23) pom.Sati=0; return pom; } int main(){ // Glavni program Vrijeme V, K; Unesivrijeme(V); Unesivrijeme(K); Ispisivrijeme(V); Ispisivrijeme(SaberiVrijeme(V, K)); system("pause"); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 realnih brojeva sa tastature sve dok se ne unese 0, uvezuje te elemente u povezanu listu cvorova, i na kraju prolazi kroz listu cvorova sa ciljem da prebroji i ispiše koliko ima elemenata u listi koji su veci od aritmeticke sredine svih unesenih elemenata (potrebna su zapravo dva prolaza: prvi za racunanje aritmeticke sredine, i drugi za brojanje elemenata sa trazenim svojstvom). RJEŠENJE:
#include <iostream> using namespace std; // Struktura Cvor struct Cvor { double element; Cvor *veza; }; int main(){ Cvor *pocetak(0), *prethodni; for(;;) { double broj; cin >> broj; // Ucitavanje broja if(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 novi if(pocetak != 0) prethodni->veza = novi; // Ako se radi o prvom elementu, pocetak pokazuje na unjeti broj else pocetak = novi; // Prethodni pokazuje na novi (potrebno za iduci broj) prethodni = novi; } double aritm_sred; // Aritmeticka sredina int br=1; // Broj elemenata // Listaju se brojevi od pocetka do kraja for(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

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Ispis svih brojeva koji su veci od aritmeticke sredine cout << 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 sredine cout << endl << "Aritmeticka sredina: " << aritm_sred << endl; getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

83.

Definirajte i implementirajte klasu “Sat” koja predstavlja digitalni 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 neispravni parametri. Metoda “Sljedeci” treba da poveca vrijeme zapamceno u satu 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 i sekundi, koje cete definirati privatne atribute. Obavezno napišite i testni program u kojem ce se upotrebiti svi elementi interfejsa napisane klase. RJEŠENJE:
#include <iostream> using namespace std; // Klasa Sat class 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 postavi void Sat::Postavi(int sati, int minute, int sekunde){ // Ako je neki uslov zadovoljen baca se izuzetak if (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 unaprijed void Sat::Sljedeci(){ s++; if(s>59) { s = 0; m++; } if(m>59) { m = 0; h++; } if(h>23) { h=0; } }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Metoda za ispis vremena u formatu hh:mm:ss void Sat::Ispisi() const { cout << endl << endl << h << ":" << m << ":" << s << endl; } int main(){ Sat dig; // Definisanje strukture dig int 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,s dig.Ispisi(); // Ispis vremena dig.Sljedeci(); // Pomjeranje za sekundu dig.Ispisi(); // Ispis pomjerenog vremena } catch(const char poruka[]) { cout << poruka; } getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

84.

Definirajte i implementirajte klasu “Sat” koja ima potpuno isti interfejs i potpuno isto ponašanje kao klasa iz prethodnog zadatka, samo cija se interna struktura umjesto tri atributa koja cuvaju trenutni broj sati, minuta i sekundi sastoji samo od jednog atributa, koji cuva ukupan broj sekundi (npr. umjesto informacije “3 sata, 20 minuta, 15 sekundi” cuva se samo informacija koja kaze 12015 sekundi). Mada ce ovo traziti izmjenu implementacije svih metoda klase (metoda “Postavi” ce se sasvim neznatno izmijeniti,metoda “Sljedeci” ce se bitno pojednostaviti, dok ce se metoda “Ispisi” bitno zakomplicirati), demonstrirajte da ce testni program iz prethodnog zadatka bez ikakve prepravke raditi sa ovako modificiranom klasom. RJEŠENJE:
#include <iostream> using namespace std; // Klasa Sat class Sat{ int s; // Varijable klase (privatno) public: // Metode klase void Postavi(int sekunde); void Sljedeci(); void Ispisi() const; }; // Metoda postavi void Sat::Postavi(int sekunde){ // Postavljanje varijable klase na vrijednost poslatu u funkciju... s=sekunde; } // Metoda koja pomjera sat za 1 sekundu unaprijed void Sat::Sljedeci(){ s++; } // Metoda za ispis vremena u formatu hh:mm:ss void 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

int main(){ Sat dig; // Definisanje strukture dig int s; // sekunde cout << "Unesi broj sekundi: "; cin >> s; dig.Postavi(s); dig.Ispisi(); dig.Sljedeci(); dig.Ispisi(); // Postavljanje sata na vrijednost s // Ispis vremena // Pomjeranje za sekundu // Ispis pomjerenog vremena

getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

85.

Definirajte i implementirajte klasu “Vektor” u skladu sa zadatom deklaracijom i implementacijom prikazanom u nastavku s tim š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 koordinate vektora na nule, a konstruktor sa tri parametra treba da inicijalizira sve atribute vektora na vrijednosti date parametrima. Metode “Postavi_x”, “Postavi_y” i “Postavi_z” treba da omoguce neovisnu izmjenu pojedinacnih koordinata vektora. Napišite i mali testni program u kojem cete demonstrirati sve elemente 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 Vektor v3.x = return ZbirVektora(const Vektor &v1, const Vektor &v2) { v3; v1.x + v2.x; v3.y = v1.y + v2.y; v3.z = v1.z + v2.z; v3; }

RJEŠENJE:
# include <iostream> # include <cmath> using namespace std; // Klasa Vektor class Vektor { double x, y, z; // x,y,z privatne varijable klase Vektor public: 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 klase Vektor(double x1, double y1, double z1) { x = x1; y = y1; z = z1; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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

// Metoda Postavi

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

// Metoda Ocitaj

void Ispisi() const { // Metoda Ispisi cout << endl << "Vektor je: {" << x << "," << y << "," << z << "}"; } double double double double double double double Vrati_x() const { return x; } // Metoda Vrati_x Vrati_y() const { return y; } // Metoda Vrati_y Vrati_z() const { return z; } // Metoda Vrati_z Postavi_x(double x) { return Vektor::x = x; } // Metoda Postavi_x Postavi_y(double y) { return Vektor::y = y; } // Metoda Postavi_y Postavi_z(double z) { return Vektor::z = z; } // Metoda Postavi_z Duzina() const { return sqrt(x * x + y * y + z * z); } // Metoda Duzina // Metoda PomnoziSaSkalarom

Vektor &PomnoziSaSkalarom(double s) { x *= s; y *= s; z *= s; return *this; }

Vektor &SaberiSa(const Vektor &v) { // Metoda SaberiSa x += v.x; y += v.y; z += v.z; return *this; } // Deklarisanje prijatelja klase Vektor friend 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 skalara cout << endl << "Unesi vrijednosti vektora: \n"; cin >> a >> b >> c; cout << "Unesi skalar: \n"; cin >> skalar; // Postavljanje vrijednosti varijabli klase Vektor na a,b,c v.Postavi(a,b,c);

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Citanje vrijednosti varijable klase Vektor i prepisivanje u a1,b1,c1 v.Ocitaj(a1,b1,c1); // Ispis vrijednosti a1,b1,c1 cout << "Vektor je: {" << a1 << "," << b1 << "," << c1 << "}" << endl; // Ispisi vrijednosti varijabli klase Vektor koristeci metodu Ispisi v.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 vektora cout << "Duzina vektora je: " << v.Duzina() << endl; // Vektor v kopiramo u varijablu z Vektor z=v; // Vektor v mnozimo sa unijetim skalarom i ispisujemo ga v.PomnoziSaSkalarom(skalar); v.Ispisi(); // Na vektor v dodamo vektor z (saberemo ga sa vektorom z), i ispisujemo ga v.SaberiSa(z); v.Ispisi(); // Zbir vektora z i v se pise u vektor k i ispisuje se novi vektor Vektor k=ZbirVektora(z,v); k.Ispisi(); // Prepravka Vektora v cout << endl << "Unesi nove vrijednosti vektora: \n"; cin >> a >> b >> c; v.Postavi_x(a); v.Postavi_y(b); v.Postavi_z(c); // Ispis prepravljenog vektora v.Ispisi(); getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

86.

Izmijenite implementaciju klase razvijene u prethodnom zadatku tako da se za cuvanje koordinata vektora umjesto tri privatna atributa “x”, “y” i “z” koji su tipa realnih brojeva koristi jedan privatni atribut “koordinate” koji je tipa niza od tri realna elementa. Izmjenu treba izvesti tako da zaglavlja svih metoda unutar interfejsa klase ostanu neizmijenjena. Demonstrirajte da ce testni program napisan u prethodnom zadatku raditi bez ikakvih izmjena sa ovako izmijenjenom klasom. RJEŠENJE:
# include <iostream> # include <cmath> using namespace std; // Klasa Vektor class Vektor { double koordinate[3]; // koordinate[], niz koji cuva vrijednosti Vektora public: // Inicijalizacija na 0 koordinata Vektora Vektor() { koordinate[0] = 0; koordinate[1] = 0; koordinate[2] = 0; } // Inicijalizacija na parametre x1,y1,z1 koji se šalju pri deklaraciji klase Vektor(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 Ocitaj x = Vektor::koordinate[0]; y = Vektor::koordinate[1]; z = Vektor::koordinate[2]; } void Ispisi() const { // Metoda Ispisi cout << endl << "Vektor je: {" << koordinate[0] << "," << koordinate[1] << "," << koordinate[2] << "}"; } double Vrati_x() const { return koordinate[0]; } // Metoda Vrati_x double Vrati_y() const { return koordinate[1]; } // Metoda Vrati_y double Vrati_z() const { return koordinate[2]; } // Metoda Vrati_z // Metoda Postavi_x double Postavi_x(double x) { return Vektor::koordinate[0] = x; } // Metoda Postavi_y double Postavi_y(double y) { return Vektor::koordinate[1] = y; } // Metoda Postavi_z double Postavi_z(double z) { return Vektor::koordinate[2] = z; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Metoda Duzina double 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 SaberiSa koordinate[0] += v.koordinate[0]; koordinate[1] += v.koordinate[1]; koordinate[2] += v.koordinate[2]; return *this; } // Deklarisanje prijatelja klase Vektor friend 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 skalara cout << endl << "Unesi vrijednosti vektora: \n"; cin >> a >> b >> c; cout << "Unesi skalar: \n"; cin >> skalar; // Postavljanje vrijednosti varijabli klase Vektor na a,b,c v.Postavi(a,b,c); // Citanje vrijednosti varijable klase Vektor i prepisivanje u a1,b1,c1 v.Ocitaj(a1,b1,c1); // Ispis vrijednosti a1,b1,c1 cout << "Vektor je: {" << a1 << "," << b1 << "," << c1 << "}" << endl; // Ispisi vrijednosti varijabli klase Vektor koristeci metodu Ispisi v.Ispisi();

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Ispisi vrijednosti varijabli klase koristeci metode Vrati_x... cout << endl << "Vektor je: {" << v.Vrati_x() << "," << v.Vrati_y() << "," << v.Vrati_z() << "}" << endl; // Ispis duzine vektora cout << "Duzina vektora je: " << v.Duzina() << endl; // Vektor v kopiramo u varijablu z Vektor z=v; // Vektor v mnozimo sa unijetim skalarom i ispisujemo ga v.PomnoziSaSkalarom(skalar); v.Ispisi(); // Na vektor v dodamo vektor z (saberemo ga sa vektorom z), i ispisujemo ga v.SaberiSa(z); v.Ispisi(); // Zbir vektora z i v se pise u vektor k i ispisuje se novi vektor Vektor k=ZbirVektora(z,v); k.Ispisi(); // Prepravka Vektora v cout << endl << "Unesi nove vrijednosti vektora: \n"; cin >> a >> b >> c; v.Postavi_x(a); v.Postavi_y(b); v.Postavi_z(c); // Ispis prepravljenog vektora v.Ispisi(); getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

87.

Definirajte i implementirajte klasu “Tim” koja predstavlja jedan 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 odigranih utakmica, broj pobjeda, broj neriješenih utakmica, broj poraza, ukupan broj datih i primljenih golova, kao i broj poena za razmatrani tim. Atribut “ime” treba izvesti kao klasicni niz znakova. 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 zadanu parametrom, a sve ostale atribute klase na nulu. Metoda “ObradiUtakmicu” treba da na osnovu rezultata utakmice koji joj se prenosi kao parametar (u vidu broja datih i primljenih golova sa posmatrane utakmice) azurira ne samo atribute koje broje golove, nego i atribute koji broje odigrane utakmice, broj pobjeda, poraza i neriješenih utakmica, kao i broj bodova. Pri tome se za pobjedu dodjeljuju 3 boda, za neriješen rezultat 1 bod, 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) za posmatrani tim (ove metode implementirati unutar deklaracije klase). Konacno, metoda “IspisiPodatke” treba da ispiše na ekran sve podatke o timu u jednom redu, i to sljedecim redom: ime tima, broj utakmica, broj pobjeda, broj neriješenih utakmica, broj poraza, broj datih golova, broj primljenih golova i broj poena. Pri ispisu, za ime tima zauzmite prostor od 20 znakova, u kojem ime treba da bude ispisano poravnato ulijevo, a za sve brojne podatke prostor od 4 znaka na ekranu, pri cemu ispis svakog brojcanog podatka treba biti poravnat udesno unutar predvidjenog prostora. Napišite i kratki testni program u kojem cete demonstrirati napisanu klasu. RJEŠENJE:
# include <iostream> # include <string> # include <iomanip> using namespace std;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Klasa Tim class Tim { // Privatne varijable klase char 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 ObradiUtakmicu void ObradiUtakmicu(int broj_datih, int broj_primljenih); // Metoda ImeTima koja vraca ime tima const char *ImeTima() const { return ime; } // Metoda BrojPoena koja vraca broj_poena tima int BrojPoena() const { return broj_poena; } // Metoda GolRazlika koja vraca gol razliku tima int GolRazlika() const { return broj_datih-broj_primljenih; } // Prototip metode IspisiPodatke void IspisiPodatke() const; }; // Implementacija metode ObradiUtakmicu void 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;} else if (broj_datih>broj_primljenih) { Tim::broj_pobjeda+=1; Tim::broj_poena+=3;} else if (broj_datih<broj_primljenih) Tim::broj_poraza+=1; } // Implementacija metode IspisiPodatke void Tim::IspisiPodatke() const { int br=0; // br je duzina naziva tima 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

int main(){ char ime[20]; int brp, brd, DN; /* Unosenje razmaka u naziv tima je moguce implementirati, ali bi se program nepotrebno znatno zakomplikovao, a cilj zadatka nije eliminacija razmaka vec primjena klasa */ // Unos nazina tima cout << endl << "Unesi naziv tima (bez razmaka!!!): "; cin >> ime; Tim T(ime); // Unos podataka za tim for(;;){ 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 unose int 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 podataka cout << "Ispis podataka za tim (" << T.ImeTima() << " [" << T.BrojPoena() << "] ): " << endl; T.IspisiPodatke(); cout << "Gol razlika tima je: " << T.GolRazlika() << endl; // Kraj programa getchar(); return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

88.

Napišite klasu “Liga” koja se oslanja na klasu “Tim” napisanu na prethodnom tutorialu. Klasa treba da ima privatne atribute “broj_timova” i “max_br_timova” koji cuvaju redom broj timova odnosno maksimalni dozvoljeni broj timova u ligi (atribut “max_br_timova” treba da bude konstantni atribut), kao i privatni atribut “timovi” koji ce sluziti za pristup dinamicki alociranom nizu od “max_br_timova” elemenata, pri cemu je svaki element niza pokazivac na objekat tipa “Tim”. Interfejs klase treba da izgleda ovako: 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 za prihvatanje onoliko timova koliko je navedeno parametrom, dok destruktor treba da izvrši oslobadjanje svih resursa koje je klasa “Liga” alocirala tokom svog rada. Metoda “DodajNoviTim” kreira tim sa navedenim imenom i upisuje ga na prvo slobodno mjesto u ligu (pri tome se naravno broj timova u ligi povecava za jedinicu). Metoda ne smije da dozvoli upis više timova od maksimalno dozvoljenog broja timova. U metodi “RegistrirajUtakmicu” prva dva parametra predstavljaju imena timova koji su odigrali utakmicu, dok su treci i cetvrti parametar 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 ne postoje u tabeli. Konacno, metoda “IspisiTabelu” treba da ispiše tabelu lige sortiranu u opadajucem poretku po broju bodova. Ukoliko dva tima imaju isti broj poena, tada u tabeli prvo dolazi tim sa vecom gol razlikom. Ispis treba vršiti pozivom metode “IspisiPodatke” iz klase “Tim”, tako da bi tabela trebala da ima izgled poput sljedeceg: Celik Jedinstvo Zeljeznicar Velez Sarajevo itd. 18 18 18 18 18 11 9 9 8 8 5 4 4 6 5 1 5 5 4 5 34 33 25 23 32 10 20 19 24 16 38 31 31 30 29

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

Kopiranje i medjusobno dodjeljivanje primjeraka klase “Liga” treba zabraniti. Obavezno treba napisati i testni program u kojem cete demonstrirati sve elemente razvijenih klasa (“Tim” i “Liga”), na manjem broju fiksnih timova (npr. liga od 6 elemenata) 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 Tim class Tim { char ime[20]; int broj_odigranih, broj_pobjeda, broj_nerijesenih, broj_poraza, broj_datih; int broj_primljenih, broj_poena; public: // Konstruktor 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; } // Metoda ImeTima const char *ImeTima() const { return ime; } // Metoda BrojPoena int BrojPoena() const { return broj_poena; } // Metoda GolRazlika int GolRazlika() const { return broj_datih-broj_primljenih; } // Prototipovi metoda void ObradiUtakmicu(int broj_datih, int broj_primljenih); void IspisiPodatke() const; }; // Implementacija metode ObradiUtakmicu void 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;} else if (broj_datih>broj_primljenih) { Tim::broj_pobjeda+=1; Tim::broj_poena+=3;} else if (broj_datih<broj_primljenih) Tim::broj_poraza+=1; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Implementacija metode IspisiPodatke void 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 Liga class Liga { int broj_timova; const int max_br_timova; Tim **timovi; Liga(const Liga &); Liga &operator =(const Liga &); public: // Konstruktor explicit 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 metoda void DodajNoviTim(const char ime_tima[]); void RegistrirajUtakmicu(const char tim1[], const char tim2[], int rezultat_1, int rezultat_2); void IspisiTabelu(); }; // Implementacija metode DodajNoviTim void 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++; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Implementacija metode RegistrirajUtakmicu void 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 IspisiTabelu void 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(); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Glavni program int 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

89.

Za potrebe neke meteorološke stanice neophodno je vršiti cestu registraciju spoljašnje temperature. Za tu svrhu meteorološka stanica koristi racunarski program u kojem je definirana i implementirana klasa nazvana “Temperature”. Ova klasa omogucava cuvanje podataka o temperaturi za izvjesni vremenski period u dinamicki alociranom nizu realnih brojeva kojem se pristupa preko nekog od internih atributa klase. Poznato je da klasa sadrzi slijedece elemente: a) Konstruktor sa jednim parametrom, koji vrši dinamicku alokaciju memorije, pri cemu parametar predstavlja maksimalan broj temperatura koje se mogu registrirati (pri tome je potrebno sprijeciti da se taj konstruktor koristi za automatsku konverziju cjelobrojnih podataka u objekte tipa “Temperature”); b) Destruktor, konstruktorom; koji oslobadja memoriju zauzetu

c) Konstruktor kopije koji ce osigurati da se objekti tipa “Temperature” mogu bezbjedno prenositi kao parametri po vrijednosti, koristiti za inicijalizaciju drugih objekata istog tipa i vracati kao rezultati iz funkcija; d) Preklopljeni operator dodjele, koji garantira sigurno dodjeljivanje jednog objekta tipa “Temperature” drugom objektu istog tipa, bez problema koji mogu biti uzrokovani kreiranjem plitkih kopija; e) Metodu koja vrši registraciju nove temperature, pri cemu se temperatura koja se registrira prenosi kao parametar metode (u slucaju da se dostigne maksimalan broj temperatura koje se mogu registrirati, treba baciti izuzetak); f) Metodu koja briše sve unesene temperature; g) Metode koje vracaju kao rezultat prosjecnu, minimalnu i maksimalnu temperaturu; h) Metodu koja ispisuje sve unesene (registrirane) temperature sortirane u opadajucem poretku (tj. najveca temperatura se ispisuje prva), pri cemu se svaka temperatura ispisuje u posebnom redu. Implementirajte klasu sa navedenim svojstvima. Sve neophodne atribute obavezno izvesti kao privatne clanove klase. Obavezno napišite i mali testni program u kojem ce se testirati sve navedene metode.

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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); // Konstruktor explicit Temperature(int kap): br(0), kap(kap), pok(new double[kap]) {} // Destruktor ~Temperature(){ delete[] pok; } // Prototipovi metoda void DodajTemp(double x); void BrisiTemp(); void IspisiSortirano(); // Metoda VratiMax double VratiMax(){ double max=pok[0]; for(int i=1; i<br; i++) if (pok[i]>max) max=pok[i]; return max; } // Metoda VratiMin double VratiMin(){ double min=pok[0]; for(int i=1; i<br; i++) if (pok[i]<min) min=pok[i]; return min; } // Metoda VratiProsjek double VratiProsjek(){ double prosjek; for(int i=0; i<br; i++) prosjek+=pok[i]; return prosjek/br; } }; // Implementacija metode DodajTemp void Temperature::DodajTemp(double x){ if (br==kap) throw "Dostignut je maksimalan broj temperatura!!!"; else pok[br]=x; br++; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Implementacija metode BrisiTemp void Temperature::BrisiTemp(){ for(int i=0; i<br; i++) pok[i]=0; kap=0; br=0; } // Implementacija metode IspisiSortirano void 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 kopije Temperature::Temperature(const Temperature &v) : br(v.kap), pok(new double[v.kap]) { copy(v.pok, v.pok + v.kap, pok); } // Preklopljeni operator Temperature &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 program int 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

90.

Dopunite program “matrica_struct.cpp” prilozen uz Predavanje 7. funkcijama “ProduktMatrica” i “StepenMatrica”. Funkcija “ProduktMatrica” prima dvije matrice kao parametre (matrice su definirane kao odgovarajuce strukture) i vraca njihov produkt kao rezultat, odnosno baca izuzetak ukoliko matrice nisu saglasne za mnozenje. Funkcija “StepenMatrica” prima matricu kao jedan parametar, kao drugi parametar prima prirodan broj n, i kao rezultat vraca matricu dignutu na n-ti stepen (u matricnom smislu) odnosno baca izuzetak ukoliko matrica nije kvadratna, s obzirom da je stepen matrice definiran samo za kvadratne matrice (pri realizaciji ove funkcije mozete koristiti vec napisanu funkciju “ProduktMatrica”). Takodjer, proširite funkciju “IspisiMatricu” dodatnim parametrom “treba_brisati” tipa “bool”. Ukoliko ovaj parametar ima vrijednost “true”, funkcija treba da oslobodi prostor zauzet matricom koja joj je proslijedjena kao parametar, u suprotnom ne treba da radi ništa. Ovim se omogucava da mozemo zadavati pozive poput: IspisiMatricu(ZbirMatrica(a, b), 7, true); tako da se oslobadjanje memorije koju je zauzela pomocna matrica koja predstavlja zbir matrica moze obaviti bez korištenja pomocne promjenljive (kao u programu “matrica_struct.cpp”). Definirajte da parametar “treba_brisati” ima podrazumijevanu vrijednost “false”, tako da ga ne treba navoditi ukoliko nam brisanje ne treba. Napisane funkcije testirajte u glavnom programu na primjeru matrica cije dimenzije i elemente unosi korisnik putem tastature. U glavnom programu predvidite hvatanje svih izuzetaka koji bi eventualno mogli nastupiti. Takodjer, dobro pazite da nigdje ne dodje do curenja memorije (ni pod kakvim okolnostima).

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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); }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 sa tastature sve dok se ne unese prazna recenica (tj. dok se ne pritisne samo ENTER bez ikakvog prethodnog unosa), i koji uvezuje te recenice u povezanu listu cvorova, ali koji nakon unosa svake od recenica umece cvor na takvo mjesto da lista u svakom trenutku bude sortirana po abecedi (odnosno po poretku ASCII kodova) kada se posmatra u redoslijedu kako idu veze izmedju cvorova. Na kraju, program treba da ispiše sve recenice u listi, da se uvjerimo 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; } else if ((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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

92.

Definirajte i implementirajte kompletnu klasu “Datum” sa svim atributima i metodima koji su prikazani u Predavanju 8. a nakon toga proširite klasu dodavanjem nove metode “VratiDanUSedmici” koja vraca ime dana u sedmici koji odgovara datumu (preciznije receno, pokazivac na prvi znak imena dana u sedmici, poput metode “VratiImeMjeseca”). Na primjer, ukoliko je pohranjeni datum 3. 5. 2006. metoda treba da vrati tekst “Srijeda” kao rezultat (odnosno pokazivac na prvi znak tog teksta). Napisanu klasu demonstrirajte u testnom programu u kojem cete 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 << "."; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

93.

Neka je data deklaracija:

enum Pravci {Sjever, Istok, Jug, Zapad}; Definirajte klasu “Robot” koja predstavlja zamišljenog robota koji moze da se krece kroz koordinatni sistem sa cjelobrojnim koordinatama i koji moze da gleda u jednom od cetiri pravca definirana u pobrojanom tipu “Pravci”. Klasa treba da ima sljedeci 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 da ga usmjeri u zadani pravac. Metoda “PomjeriSe” pomjera robota zadani broj koraka u pravcu u kojem robot trenutno gleda. Metode “Nalijevo” i “Nadesno” obrcu robota za 90o na lijevo odnosno na desno. Metode “Pozicija_x”, “Pozicija_y” i “Orjentacija” treba da vrate tekucu poziciju odnosno orjentaciju robota. Metoda “Ispisi” treba da ispiše podatke o poziciji i orjentaciji robota na nacin kao u sljedecem primjeru: Robot se nalazi na poziciji (3,–5) i gleda na istok. Napisanu klasu upotrijebite u programu u kojem ce korisnik moci da bira neku od dozvoljenih operacija sa robotom, a nakon svake izvršene operacije program treba da prikaze tekucu poziciju i orjentaciju (kratke metode dozvoljeno je implementirati odmah unutar deklaracije klase).

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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; else if (Robot::p==Zapad) Robot::p=Jug; else if (Robot::p==Jug) Robot::p=Istok; else if (Robot::p==Istok) Robot::p=Sjever; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

void Robot::Nadesno(){ if (Robot::p==Sjever) Robot::p=Istok; else if (Robot::p==Istok) Robot::p=Jug; else if (Robot::p==Jug) Robot::p=Zapad; else if (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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

94.

Definirajte i implementirajte klasu “Datum” koja omogucava cuvanje datumskih podataka. Klasa treba da ima sljedeci interfejs: 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 osnovu informacija koje se prosljedjuju kroz parametre. Konstruktor vrši kontrolu ispravnosti datuma, i baca izuzetak u slucaju da su proslijedjeni pogrešni podaci. Metoda “Postavi” nacelno obavlja istu 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 je protekao od pocetka godine zapamcene u datumu do dana zapamcenog u 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 jedan dan unaprijed odnosno unazad, dok metoda “PomjeriZa” pomjera datum za broj dana naveden parametrom. Pomjeranje se vrši unaprijed ukoliko je parametar pozitivan, a unazad ukoliko je parametar negativan. Konacno, metoda “Ispisi” ispisuje datum na sljedeci nacin: prvo se ispisuje redni broj dana, zatim tacka, zatim puno ime mjeseca (rijecima) iza koje slijedi razmak, i konacno redni broj godine iza kojeg takodje slijedi tacka. Na primjer, ukoliko je u datumu zapamcen datum 3. 7. 2002. na ekranu treba da se ispiše “3.Juli 2002.”. Sve metode implementirajte izvan klase, osim trivijalnih metoda cija implementacija moze stati u jedan red ekrana. Obavezno napišite i mali testni program u kojem ce se testirati svi zahtijevani elementi ove klase.

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

RJEŠENJE:
#include <iostream> using namespace std; // Klasa Datum class Datum { int d, m, g; // Varijable klase public: 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 Postavi void Postavi(int dan, Mjeseci minute, int godina); int Dan() const { return d; } // Vraca dan Mjeseci Mjesec() const { return Mjeseci(m); } // Vraca mjesec int Godina() const { return g; } // Vraca godinu int BrojDanaOdPocetkaGodine() const; void Sljedeci(); void Prethodni(); void PomjeriZa(int broj_dana); void Ispisi() const; }; // Metoda PomjeriZa void Datum::PomjeriZa(int broj_dana){ if (broj_dana>0) for (int i=0; i<broj_dana; i++) Sljedeci(); else if (broj_dana<0) for (int i=0; i>broj_dana; i--) Prethodni(); } // Metoda BrojDanaOdPocetkaGodine int 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 Ispisi void 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Metoda Postavi void 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 Prethodni void 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 Sljedeci void 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 program int main(){ { Datum test; test.Ispisi(); }

// testiranje konstruktora bez parametara

// Testiranje konstruktora sa parametrima Datum TheLNe(29, Datum::Mjeseci(1), 2000); TheLNe.Ispisi(); // Unos podataka int dan, mjesec, godina; cout << "Unesi dan: "; cin >> dan; cout << "Unesi mjesec: "; cin >> mjesec; cout << "Unesi godinu: "; cin >> godina; try{ // Postavlja datum i ispisuje ga TheLNe.Postavi(dan,Datum::Mjeseci(mjesec-1),godina); TheLNe.Ispisi(); // Ispis preko jednostavnih metoda klase cout << "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 datuma TheLNe.Sljedeci(); cout << "Sljedeci datum: " << endl; TheLNe.Ispisi();

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Ispis prethodnog datuma TheLNe.Prethodni(); cout << "Prethodni datum: " << endl; TheLNe.Ispisi(); // Ispis broja dana koji su protekli od pocetka godine cout << "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 programa return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

95.

Definirajte i implementirati genericku klasu “Vreca” koja sluzi za smještanje kolekcije elemenata jednakog ali proizvoljnog tipa, pri cemu poredak nije moguce imati dva identicna elementa unutar kolekcije (slicno matematskom pojmu skupa). Kolekcija treba da sadrzi sljedece elemente: a) Privatne atribute koji redom predstavljaju broj elemenata u vreci, kapacitet vrece (tj. maksimalni broj elemenata koji se mogu smjestiti u vrecu), te pokazivac na dinamicki alocirani niz (preciznije, na njegov prvi element) koji ce cuvati elemente vrece; b) Konstruktor sa jednim parametrom tipa cijeli broj, koji predstavlja kapacitet vrece, i koji vrši dinamicku alokaciju prostora za cuvanje elementa vrece. Inicijalno vreca treba da bude prazna. Pri tome je potrebno zabraniti da se ovaj konstruktor koristi za automatsku konverziju cjelobrojnog tipa u tip “Vreca”; c) Destruktor, koji oslobadja memoriju zauzetu konstruktorom; 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 vracati kao rezultati iz funkcija; e) Preklopljeni operator dodjele, koji garantira sigurno dodjeljivanje jednog objekta tipa “Vreca” drugom objektu istog tipa, bez problema koji mogu biti uzrokovani kreiranjem plitkih kopija; f) Metodu sa jednim parametrom, koja dodaje u vrecu element predstavljen parametrom. U slucaju da se takav element vec nalazi u vreci, unos elementa treba ignorirati. U slucaju da je dostignut kapacitet vrece, metoda treba da baci izuzetak; g) Metodu bez parametara, koja vraca kao rezultat broj elemenata 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 element predstavljen parametrom iz vrece. U slucaju da se takav element ne nalazi u vreci, metoda treba da baci izuzetak. j) Metodu bez parametara koja vraca kao rezultat neki od elemenata iz vrece po slucajnom izboru, osim u slucaju kada je vreca prazna (u tom slucaju, treba baciti izuzetak). Sve metode implementirajte izvan deklaracije klase, osim trivijalnih metoda koje treba implementirati direktno unutar deklaracije klase. Napisane metode testirajte u testnom programu koji unosi niz rijeci sa tastature, trpa ih u vrecu, a zatim ispisuje na ekran sve rijeci smještene u vrecu (koristeci samo metode koje objekti tipa “Vreca” podrzavaju).

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

RJEŠENJE:
#include <iostream> #include <string> #include <algorithm> using namespace std; // Klasa vreca template <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 kopije template <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 operator template <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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Metoda Ispisi template <typename Tip> void Vreca<Tip>::Ispisi() const{ cout << "Ispis elemenata vrece: " << endl; for(int i=0; i<br; i++) cout << pok[i] << endl; } // Metoda Dodaj template <typename Tip> void Vreca<Tip>::Dodaj(Tip element){ if (br==kap) throw "Vreca je puna!!!"; else if (Nadji(element)) throw "Duplikat!!!"; pok[br]=element; br++; } // Glavni program int main(){ srand (time(NULL));

// Potrebno za izbor slucajnog broja

// Unos kapaciteta vrece i definisanje vrece int kap; cout << "Unesi kapacitet vrece: "; cin >> kap; Vreca<string> TheLNe(kap); // Unos elemenata vrece for(;;){ 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 vrece cout << "Vreca ima " << TheLNe.VratiBr() << " elemenata!" << endl; // Provjera postojanja nekog elementa u vreci string 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 vrece cout << "Unesi element koji zelis izbaciti iz vrece: "; cin >> element; try{ TheLNe.Izbaci(element); } catch(const char poruka[]) { cout << poruka << endl; } // Ispis slucajnog elementa iz vrece cout << "Slucajni element: "; try{ TheLNe.Slucajni(); } catch(const char poruka[]) { cout << poruka << endl; } // Ispis svih elemenata vrece TheLNe.Ispisi(); // Kraj programa return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

96.

Za pracenje dnevnog vodostaja neke rijeke u toku odredjenog vremenskog perioda hidrometeorološka stanica koristi racunarski program u kojem je definirana i implementirana klasa nazvana “Vodostaji”. Ova klasa omogucava cuvanje podataka o vodostaju posmatrane rijeke za u nekom od internih atributa klase koji predstavlja dinamicki alocirani niz cijelih brojeva (vodostaj se izrazava u centimetrima, zaokruzeno na cijeli broj). Pored ovog atributa, poznato je da klasa sadrzi sljedece elemente: a) Konstruktor sa jednim parametrom, koji vrši dinamicku alokaciju memorije i inicijalizaciju svih ostalih atributa, pri cemu parametar predstavlja maksimalan broj podataka o vodostaju koji se mogu registrirati (pri tome je potrebno sprijeciti da se ovaj konstruktor koristi za automatsku konverziju cjelobrojnih podataka u objekte tipa “Vodostaji”); b) Destruktor koji oslobadja memoriju koju je alocirao konstruktor; c) Metodu koja vrši registraciju novog podatka o vodostaju, pri cemu se podatak koja se registrira prenosi kao parametar metode (u slucaju da se dostigne maksimalan broj podataka koje se mogu registrirati, treba baciti izuzetak); d) Metodu koja vraca kao rezultat razliku izmedju najveceg i najmanjeg vodostaja; e) Metode koje vracaju broj dana u kojima je registriran vodostaj veci od vrijednosti koja je zadata kao parametar, kao i broj dana u kojima je registriran vodostaj manji od vrijednosti koja je zadata kao parametar (podrazumijeva se da svaki registrirani vodostaj odgovara jednom danu, tj. da se vodostaji registriraju jedanput dnevno); f) Metodu koja vraca kao rezultat prosjecni vodostaj tokom posmatranog 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), pri cemu 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 privatne clanove klase, a sve metode implementirati izvan klase, osim metoda cija implementacija zahtijeva jednu ili dvije naredbe. Obavezno napišite i mali testni program u kojem ce se testirati sve navedene metode.

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

RJEŠENJE:
#include <iostream> #include <algorithm> using namespace std; // Klasa Vodostaji class 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++;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

}

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 cout << "Imamo << " dana cout << "Imamo << " dana

prag: "; cin >> prag; " << TheLNe.VratiVece(prag) kada je vodostaj bio veci od praga!" << endl; " << TheLNe.VratiManje(prag) 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 programa return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

97.

Za potrebe nekog fakulteta neophodno je vršiti evidenciju o polaznicima (studentima) i njihovom uspjehu. Za tu svrhu fakultet koristi racunarski program u kojem je definirana i implementirana klasa nazvana “Student”, kao i klasa nazvana “Fakultet”. Klasa “Student” sadrzi sljedece elemente: a) Privatne atribute koje cuvaju podatke o imenu i prezimenu studenta (po maksimalno 20 znakova), broju indeksa (cijeli broj), broju polozenih ispita (cijeli broj) i prosjecnoj ocjeni (realan broj), i nikave druge atribute; b) Konstruktor ciji su parametri ime i prezime studenta, kao i broj indeksa studenta, koji odgovarajuce atribute inicijalizira na vrijednosti zadane parametrima, dok se broj polozenih ispita i prosjecna ocjena inicijaliziraju respektivno na 0 i 5; c) Trivijalne metode koje vracaju vrijednosti svih odgovarajucih atributa; d) Metodu sa jednim parametrom, koja sluzi za registraciju novog ispita, a koja povecava broj polozenih ispita za jedinicu i azurira prosjecnu ocjenu u skladu sa ocjenom iz novopolozenog ispita, koja se zadaje kao parametar (u slucaju neispravne ocjene, treba baciti izuzetak); e) Metodu koja ispisuje podatke (ime, prezime, broj polozenih 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 na dinamicki alocirani niz pokazivaca na objekte tipa “Student”, koji sadrze podatke u upisanim studentima; b) Konstruktor sa jednim parametrom, koji vrši dinamicku alokaciju memorije, pri cemu parametar predstavlja maksimalan broj studenata koji se mogu upisati (i koji se ne smije koristiti za potrebe automatske konverzije cjelobrojnih vrijednosti u objekte tipa “Student”), kao i odgovarajuci destruktor; c) Metodu koja vrši upis novog studenta, pri cemu se kao parametri metode prenose broj indeksa studenta, kao i njegovo ime i prezime studenta (u slucaju da se dostigne maksimalan broj studenata 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 je student dobio. Ova metoda treba da azurira prosjecnu ocjenu studenta na osnovu novounesene ocjene; f) Metodu koja ispisuje podatke (ime, prezime, broj polozenih ispita, prosjecna ocjena) o studentu sa brojem indeksa koji se zadaje kao parametar;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

g) Metodu koja ispisuje imena i prezimena svih studenata cija je prosjecna ocjena veca od vrijednosti koja se zadaje kao parametar; h) Metodu koja ispisuje imena i prezimena svih studenata koji su polozili više ispita od broja koji se zadaje kao parametar; i) Metodu koja ispisuje sve upisane studente sortirane u opadajucem poretku po prosjecnoj ocjeni (tj. student sa najvecom prosjecnom ocjenom se ispisuje prvi), pri cemu se podaci o svakom studentu ispisuju u posebnom redu. Implementirajte klase “Student” i “Fakultet” sa navedenim svojstvima. Sve metode implementirajte izvan tijela klase, osim metoda 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 testirati sve navedene metode. RJEŠENJE:
# include <iostream> # include <iomanip> using namespace std; // Klasa Student class 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 Fakultet class 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 void void void void void void }; 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++; } Dodaj(char *Ime1, char *Prezime1, int index1); DodajOcjenu(int index, int ocjena); IspisiStatistiku(int index); IspisiVece(int broj); IspisiVise(int broj); IspisiSortirano(); Brisi();

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Glavni program int 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 programa return 0; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

98.

Definirajte i implementirajte klasu “Polinom”, koja omogucava rad sa polinomima. Klasa treba da ima konstruktor sa dva parametra koji predstavljaju redom stepen polinoma, kao i ime nezavisne varijable u polinomu, koje obavezno predstavlja samo jedan znak, a ne string (ovo ce se koristiti samo pri ispisu polinoma). Koeficijenti polinoma treba da se cuvaju u dinamicki alociranom nizu realnih brojeva. Zbog toga je neophodno da klasa ima definirane i destruktor, konstruktor kopije i prekopljeni operator dodjele (inace nece biti moguce definirati operatorske funkcije koje ce raditi ispravno). Klasa bi trebala da ima preklopljeni operator “[]” kojim se omogucava pristup koeficijentima polinoma. Indeksi koeficijenata polinoma se krecu od nule (slobodni clan) do stepena polinoma, a u slucaju indeksa izvan opsega treba baciti izuzetak. Za racunanje vrijednosti polinoma koristi se preklopljeni operator “()” kojem se prosljedjuje vrijednost argumenta za koji treba izracunati vrijednost polinoma. Treba podrzati i binarne operatore “+”, “–”, “*”, “/” i “%” za sabiranje, oduzimanje, mnozenje, djeljenje i nalazenje ostatka pri dijeljenju dva polinoma, njihove bliske srodnike “+=”, “–=”, “*=”,“/=” i “%=”, kao i unarni operator “–” koji kao rezultat daje polinom sa izvrnutim predznacima svih koeficijenata. Binarne operacije nad polinomima su podrzane samo nad dva polinoma koji zavise od iste promjenljive (u suprotnom, treba baciti izuzetak). Dalje, treba podrzati i binarne relacione operatore “==” i “!=” koji testiraju jednakost, odnosno nejednakost dva polinoma. Konacno, treba podrzati i operator za ispis “<<” koji ispisuje polinom na ekran, koristeci ime nezavisne varijable koje je bilo zadato u konstruktoru. Na primjer, moguci izgled ispisanog polinoma mogao bi izgledati ovako: 3 + 2 x^2 – 4 x^3 – x^5 + 6 x^6 uz pretpostavku da su koeficijenti polinoma bili redom 3, 0, 2, – 4, 0, –1 i 6. Obavezno napišite i mali testni program u kojem ce se testirati svi zahtijevani elementi ove klase.

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

RJEŠENJE:
# include <iostream> # include <vector> using namespace std; // Klasa Polinom class 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 prototipova void 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 return *this = *this + v; } // Preklapanje operatora -= Polinom &operator -=(const Polinom return *this = *this - v; } // Preklapanje operatora *= Polinom &operator *=(const Polinom return *this = *this * v; } // Preklapanje operatora /= Polinom &operator /=(const Polinom return *this = *this / v; } // Preklapanje operatora %= Polinom &operator %=(const Polinom return *this = *this % v; } };

&v) {

&v) {

&v) {

&v) {

&v) {

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Konstruktor kopije Polinom::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; } else if (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 << ""; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// 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;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

v.push_back(pom); } pol1.Dodaj(v); } cout cout cout cout cout << << << << << "Prvi polinom je: " << pol << endl; "Drugi polinom je: " << pol1 << endl; "Zbir je: " << pol+pol1 << endl; "Razlika je(prvi minus drugi): " << pol-pol1 << endl; "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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

99.

Jedan od nedostataka jezika opce namjene kao sto je C++ u odnosu na specijalisticke matematski orjentirane jezike je nepostojanje 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 sam definira nove tipove podataka koji zadovoljavaju njegove potrebe. Vaš zadatak je da definirate novi tip podataka (klasu) nazvan “Razlomak” koji omogucava tacan rad sa razlomcima (umjesto njihovog pribliznog predstavljanja preko decimalnih brojeva). Klasa “Razlomak” treba da sadrzi sljedece elemente: a) Privatne atribute koji cuvaju vrijednost brojnika i nazivnika; b) Konstruktor sa dva parametra, koji respektivno predstavljaju vrijednost brojnika i nazivnika razlomka. Ovaj konstruktor treba automatski da izvrsi skracivanje eventualnih zajednickih faktora u brojniku i nazivniku, tako da ce deklaracija poput Razlomak r(10,15); dovesti do toga da ce brojnik razlomka “r” biti 2, a nazivnik 3. Takodjer, konstruktor treba da obezbijedi da u slucaju da je razlomak negativan, negativni znak bude zapamcen u brojniku, a ne u nazivniku. Drugim rijecima, nakon deklaracije Razlomak r(2, –3); vrijednost brojnika treba da bude –2, a nazivnika 3. Naravno, nakon deklaracije poput Razlomak r(–2, –3); vrijednosti brojnika i nazivnika treba da budu 2 i 3, jer se negativni znak krati. U slucaju da se za vrijednost nazivnika zada nula, konstruktor treba da baci izuzetak; c) Konstruktor sa jednim parametrom, koji postavlja vrijednost brojnika na vrijednost zadanu parametrom, a vrijednost nazivnika na jedinicu. Ovaj konstruktor treba da omoguci pretvorbu cjelobrojnih vrijednosti u vrijednosti tipa “Razlomak”; d) Konstruktor bez parametara, koji postavlja vrijednost brojnika na nulu, a vrijednost nazivnika na jedinicu, tj. koji kreira nul-razlomak; e) Metode kojima je moguce saznati vrijednost brojnika, odnosno nazivnika razlomka; f) Preklopljene binarne operatore “+”, “-”, “*” i “/” koji treba da omoguce cetiri osnovne operacije sa razlomcima. Rezultati svake od operacija uvijek treba da budu do kraja skraceni (sto cete najlakše postici tako što cete brojnik i nazivnik 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 treba da radi ništa; h) Preklopljene operatore “+=”,“–=”,“*=” i “/=”, pri cemu izrazi “R1+=R2”, “R1–=R2”, “R1*=R2” i “R1/=R2” treba da

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 cemu izrazi “R++” i “R--” efektivno djeluju kao izrazi “R += 1” i “R = 1”. Pri tome treba podrzati kako prefiksnu, tako i postfiksnu verziju ovih operatora, pri cemu postfiksne verzije vracaju kao rezultat vrijednost razlomka prije obavljene izmjene; j) Preklopljen operator “<<” koji treba da podrzi ispis objekata tipa “Razlomak” na ekran. Ukoliko je p brojnik a q nazivnik razlomka koji se ispisuje, ispis treba da izgleda kao p/q, osim ukoliko je nazivnik jednak jedinici, kada se ispisuje samo vrijednost brojnika (kao cijeli broj); k) Preklopljen operator “>>” koji treba da podrzi unos objekata tipa “Razlomak” sa tastature. Potrebno je omoguciti da se objekti tipa “Razlomak” unose u formi p/q, gdje su p i q cijeli brojevi, ali treba omoguciti da se unese i obicni cijeli broj (u tom slucaju se podrazumijeva da je nazivnik jedinica); l) Preklopljene relacione operatore “<”,“>”,“<=”,“>=”,“==” i “<>” koje ispituju odnose izmedju dva razlomka. Poput svih relacionih operatora, ovi operatori vracaju kao rezultat “true” u slucaju da je relacija zadovoljena, a “false” ukoliko nije; m) Preklopljeni operator konverzije tipa “Razlomak” u tip “double” koji omogucava upotrebu promjenljivih tipa “Razlomak” u kontekstima gdje se ocekuju realni brojevi, tj. promjenljive tipa “double”. Ovaj operator treba da vrati kao rezultat pribliznu decimalnu vrijednost koja se dobija dijeljenjem brojnika sa nazivnikom. Sve metode implementirajte izvan deklaracije klase, osim trivijalnih metoda koje trebate implementirati direktno unutar deklaracije klase. Sve metode koje su inspektori, obavezno deklarirajte kao takve. Dalje je potrebno da napišete testni program koji ce odraditi sljedece: a) Demonstrirati rad svih napisanih metoda i operatora nad nekoliko fiksno zadanih razlomaka (po vlastitom izboru); b) Traziti od korisnika da unese broj elemenata niza, a zatim dinamicki alocirati niz elemenata tipa “Razlomak”; c) Ucitati sa tastature elemente alociranog niza, sortirati ih u rastuci poredak, i ispisati sortirani niz razlomaka na ekran i u tekstualnu datoteku “RAZLOMCI.TXT”.

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 nazivnik int VratiN() const { return n; } // Metoda vraca brojnik int VratiB() const { return b; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Preklapanje operatora += Razlomak &operator +=(const Razlomak return *this = *this + v; } // Preklapanje operatora -= Razlomak &operator -=(const Razlomak return *this = *this - v; } // Preklapanje operatora *= Razlomak &operator *=(const Razlomak return *this = *this * v; } // Preklapanje operatora /= Razlomak &operator /=(const Razlomak return *this = *this / v; } }; // Operator konverzije Razlomak::operator double() const { double r(0); r=(double)b/n; return r; }

&v) {

&v) {

&v) {

&v) {

// 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Preklapanje operatora ++ prefiksna Razlomak &operator ++(Razlomak &v) { v=v+Razlomak(1); return v; } // Preklapanje operatora ++ postfiksna Razlomak operator ++(Razlomak &v, int) { Razlomak pomocni = v; v=v+Razlomak(1); return pomocni; } // Preklapanje operatora -- prefiksna Razlomak &operator --(Razlomak &v) { v=v-Razlomak(1); return v; } // Preklapanje operatora -- postfiksna Razlomak 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// 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 program int 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;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

100.

U raznim oblastima matematike cesto se javlja potreba za radom sa skupovima. Vaš zadatak je da razvijete genericku klasu “Skup” koja predstavlja skup ciji elementi mogu biti proizvoljnog, ali istog tipa (odnosno svi elementi skupa moraju biti istog tipa, tako da skupovi heterogenog sastava nisu podrzani), za koje cemo pretpostaviti da je definiran poredak pomocu operatora “<”. Klasa treba da ima sljedece elemente: a) Privatne atribute koji redom predstavljaju broj elemenata u skupu, kapacitet skupa (tj. maksimalni broj elemenata koji se mogu smjestiti u skup) i pokazivac na dinamicki alocirani niz (preciznije, na njegov prvi element) koji ce cuvati elemente skupa; b) Konstruktor sa jednim parametrom, koji predstavlja kapacitet skupa, i koji vrši dinamicku alokaciju prostora za cuvanje elemenata skupa. Inicijalni broj elemenata kreiranog skupa je 0 (prazan skup). Pri tome je potrebno zabraniti da se ovaj konstruktor koristi za automatsku konverziju cjelobrojnog tipa u tip “Skup”; c) Destruktor, koji oslobadja memoriju zauzetu konstruktorom; d) Konstruktor kopije koji ce osigurati da se objekti tipa “Skup” mogu bezbjedno prenositi kao parametri po vrijednosti i vracati kao rezultati iz funkcija; e) Preklopljeni operator dodjele, koji garantira sigurno dodjeljivanje jednog skupa drugom skupu, bez problema koji mogu biti uzrokovani kreiranjem plitkih kopija; f) Metodu sa jednim parametrom, koja dodaje u skup element predstavljen parametrom. U slucaju da se takav element vec nalazi u skupu, unos elementa treba ignorirati (ne zaboravimo da skupovi po matematskoj definiciji ne mogu sadrzavati jednake elemente). U slucaju da je dostignut kapacitet skupa, metoda treba da baci izuzetak; g) Metodu bez parametara, koja vraca kao rezultat broj elemenata 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 skup daje “true” ukoliko je skup prazan, a “false” ukoliko nije; j) Preklopljen operator “<<” koji treba da podrzi ispis skupova na ekran. Skupovi se ispisuju kao slijed svojih elemenata unutar viticastih zagrada, medjusobno razdvojenih zarezima. Pri ispisu, elementi treba da budu sortirani u rastuci poredak (redoslijed elemenata je kod skupova svakako nebitan). Za

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

sortiranje mozete koristiti funkciju “sort” (bez funkcije kriterija, jer je pretpostavljeno da su elementi skupa takvi da je za njih definiran poredak uz pomoc operatora “<”); k) Preklopljene binarne operatore “+”, “*” i “-” koji redom nalaze uniju, presjek i razliku skupova koji su navedeni kao operandi. Uputa: Ranije napisane metode za dodavanje novog elementa u skup i ispitivanje da li element pripada skupu mogu Vam biti od velike koristi pri pisanju operatorskih funkcija za ove operatore. Dalje, kapacitet skupa koji cete vratiti kao rezultat unije “A + B” mozete definirati kao zbir broja elemenata skupova “A” i “B”, bez obzira sto ce broj elemenata unije “A + B” mozda biti manji, ukoliko skupovi “A” i “B” sadrze zajednicke elemente (ionako ce prilikom dodjele tipa “C = A + B” rezultat biti kopiran u skup “C”, a pri ispisu tipa “cout << A + B” zbir “A + B” se svakako tretira kao privremeni objekat). Slicno, za kapacitet presjeka “A * B” i razlike “A - B” mozete uzeti broj elemenata 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 cemu izrazi “A+=B”, “A*=B” i “A–=B” predstavljaju respektivno skracene zapise 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” predstavljaju respektivno odnose “A je podskup od B”, “A je nadskup od B”, “A i B 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 od operatora “<=”. Sve metode implementirajte izvan deklaracije klase, osim trivijalnih metoda koje trebate implementirati direktno unutar deklaracije klase. Obavezno napišite i testni program u kojem cete demonstrirati sve elemente napisane genericke klase uzimajuci stringove (tj. objekte tipa “string”) za elemente skupova.

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

RJEŠENJE:
# include <iostream> using namespace std; // Genericka klasa Skup template<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);

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Definisanje nekih jednostavnijih metoda // Metoda Nadji bool 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// 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 << ""; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// 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 kopije template <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 Dodaj template <typename Tip> void Skup<Tip>::Dodaj(Tip element){ if (br==kap) throw "Skup je pun!!!"; else if (Nadji(element)) throw "Duplikat!!!"; S[br]=element; br++; } // Glavni program int main(){ // Definisanje skupova Skup<string> PRVI(10), DRUGI(10); // Unos elemenata skupa try{ 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

101.

Napišite i implementirajte baznu klasu “Student”, zatim iz nje izvedite naslijedjene klase “Student_VI_stepena”, “Student_VII_stepena”, “Student_postdiplomac”, te konacno formirajte i implementirajte klasu “StudentskaSluzba”. Bazna klasa “Student” treba da ima sljedece elemente: a) Privatne atribute “broj_indeksa”, “ime”, “prezime”, “broj_ocjena” i “prosjecna_ocjena”. Atribut “broj_ocjena” sadrzi broj ispita koje je student polozio, dok su ostali atributi jasni iz 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 zadaju preko parametara, a atribute “prosjecna_ocjena” i “broj_ocjena” na 5 i 0 respektivno; c) Metodu “UpisiOcjenu” koja ima kao parametar ocjenu koju je 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 koja ispisuje podatke o studentu u slijedecem obliku (prosjek se ispisuje na 2 decimale): Student <ime> <prezime> sa brojem indeksa <indeks> ima prosjek <prosjek>. Izvedene klase “Student_VI_stepena” i “Student_VII_stepena” razlikuju se samo u metodi “IspisiPodatke” koja ispisuje “Student VI stepena” odnosno “Student VII stepena” umjesto samo “Student”. Izvedena klasa “Student_postdiplomac” ima i dodatni atribut “godina_diplomiranja” kao i dodatni parametar u konstruktoru koji omogucava postavljanje ovog atributa. Metoda “IspisiPodatke” za ovu 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 maksimalni dozvoljeni broj studenata koji se mogu upisati (atribut “MaxBrStudenata” treba da bude konstantni atribut), kao i privatni atribut “studenti” koji ce sluziti za pristup dinamicki alociranom nizu koji sadrzi “MaxBrStudenata” elemenata, pri cemu je svaki element niza pokazivac na objekat klase “Student” ili objekat nekog od tipova izvedenih iz klase “Student”; b) Konstruktor sa jednim parametrom i destruktor. Konstruktor treba da izvrši dinamicku alokaciju memorije za prihvatanje onoliko studenata koliko je navedeno parametrom, dok destruktor treba da izvrši oslobadjanje svih resursa koje je klasa “StudentskaSluzba” alocirala tokom svog rada;

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

c) Metodu “UpisiStudenta”, koja upisuje novog studenta. Metoda ima cetiri parametra: broj indeksa, ime, prezime i godina diplomiranja. 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 indeksa studenta cija se ocjena upisuje, kao i sama ocjena; e) Metodu “IspisiSpisak” koja ispisuje spisak svih studenata sa pripadnim podacima (pozivom metode “IspisiPodakte” za svakog studenta). Obavezno napišite i testni program u kojem cete testirati sve elemente navedenih klasa. RJEŠENJE:
# include <iostream> # include <string> using namespace std; // Klasa student class 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

// Klasa Student_VI_stepena class 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_stepena class 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_postdiplomac class 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

LoVe dOts... ForEver... ETF - 2005/2006

Autor: Murtic Nirmel www.etf.ba

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 program int 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; }

Email: matrix.bih@gmail.com ; MSN: nirmel_m@hotmail.com

Sign up to vote on this title
UsefulNot useful