ELEKTROTEHNIČKI FAKULTET OSIJEK

Darko Fischer

ZBIRKA ZADATAKA IZ "C " P R O G R A M S K O G J E Z I K A ( Drugo izmijenjeno izdanje )

Osijek, 1997.

2

SADRŽAJ

0. Uvod 1. Algoritmi 2. Jednostavni C zadaci 3. Zadaci s indeksiranim varijablama 4. Zadaci s funkcijama i procedurama 5. Rješenja zadataka

1 7 20 29 50 75

3

0. UVOD Ova skripta namijenjena su učenju C programskog jezika. Nastala su iz slične zbirke zadataka iz FORTRAN programskog jezika odakle je uzeta večina zadataka i svi primjeri. Programski jezik C standardno se koristi pod UNIX operacijskim sustavom te je kao takav jedan od najkorištenijih programskih jezika. Unatoč svojoj sveobuhvatnosti, osnovni dio ovog jezika je jednostavan i pregledan kako po sintaksi tako i po strukturi. Zbog toga i početnici u programiranju mogu lako da savladaju osnove ovog jezika. Skripta su namijenjena početnicima u C-u. Zbog toga su u primjerima i zadacima dati samo razmjerno jednostavni problemi. Primjeri su odabrani tako, da ukažu na bitne i najčešće korištene elemente ovog programskog jezika. Time je obuhvaćen samo vrlo mali dio mogućnosti koje C pruža, ali su obuhvaćeni oni dijelovi, koji se najčešće koriste u rješavanju matematičkih i tehničkih problema. Nastojali smo na taj način napraviti jednostavan udžbenik što pristupačniji čitaocu koji želi da se u početnoj fazi upozna sa bitnim mogućnostima ovog programskog jezika. U prvom dijelu dati su zadaci i primjeri koji se rješavaju bez korištenja C programskog jezika već samo izradom algoritma i njegovim ispisom u pseudokodu. Time se željela naglasiti potreba dobrog poznavanja izrade algoritma, iz kojeg se kasnije može izraditi program u bilo kojem programskom jeziku. Zadaci i primjeri su poredani tako, da se počinje sa sasvim jednostavnim problemima za čije rješenje je dovoljno koristiti samo osnovne programske mehanizme. Dalji zadaci prikazuju složenije probleme za čije rješenje je potrebno koristiti i neke složenije mehanizme, ali još uvijek one, koji su tipični i zajednički u svim programskim jezicima. Odabrani zadaci i primjeri zahtijevaju samo osnovno znanje iz matematike ili elektrotehnike. Primjeri su također odabrani tako da posluže kao koristan putokaz onim studentima i čitaocima koji već dobro znaju sintaksu nekog drugog programskog jezika (BASIC ili Pascal) pa im ovdje navedeni primjeri mogu poslužiti kao brzi uvid u sintaksu C jezika. Zbog toga su svi primjeri i zadaci podijeljeni u 4 dijela. U prvom dijelu traže se rješenja algoritama. U primjerima toga dijela prikazali smo način tekstualne razrade algoritma. Ta tehnika ne zahtijeva strogo definirana pravila izražavanja i zato može koristiti početnicima za lakše razumijevanje logike kojom se moramo služiti pri izradi programske podrške. Zadaci u drugom, trećem i četvrtom poglavlju odnose se na izradu programa u C programskom jeziku. Kompleksnost zadataka se povečava od početka prema kraju svakog poglavlja i to sa stajališta matematičkog modela kao i sa stajališta potrebnih programskih tehnika koje treba koristiti pri rješavanju. Tekst se sastoji od primjera i zadataka. Primjeri su zadaci uz koje je dato opširnije objašnjenje i rješenje. Primjere smo nastojali odabrati tako, da dobro ilustriraju temu u poglavlju u kojem su dati. Uz zadatke data su samo rješenja bez obrazloženja. Ta rješenja se nalaze na kraju, u poglavlju 5. Čitaoci koji žele saznati više detalja o mogućnostima C programskog jezika, trebaju se poslužiti nekim udžbenikom ili priručnikom za ovaj jezik i za neki odabrani njegov prevodilac. Neki mogući udžbenici nvedeni su u popisu literature.

4

1. ALGORITMI Za izradu algoritma (razradu logike) programa poslužiti ćemo se tekstualnim izražavanjem. Bez strogo definiranog pseudo jezika (kakav se često koristi u udžbenicima pri opisu algoritama), koristit ćemo se rečenicama govornog jezika. Te rečenice biti će "strukturirane" po određenom pravilu (koje će biti jasno iz primjera) i biti će napisane tako, da će se moći pretvoriti u jednu ili više naredbi C ili nekog drugog programskog jezika. Naučiti razraditi algoritam nekog problema, ili slobodnije rečeno, naučiti "misliti" na način kako to od nas računalo "očekuje", osnovan je preduvjet za uspješno programiranje u bilo kojem programskom jeziku. Savjetujemo, zato, posebno početnicama u programiranju, da ovom poglavlju posvete temeljitu pažnju. Primjer 1.1 Razraditi logiku programa koji će najprije učitati broj n. Ako broj n nije prirodan broj ispisati poruku o pogreški i ponoviti učitavanje. Učitavati redom, jedan za drugim, n brojeva x i naći i ispisati najveći od njih xmax. Rješenje: Postavi n=0 Sve dok n nije prirodan broj čini Učitaj broj n Ako n nije prirodan broj ispiši poruku o pogrešno zadanom broju n Kraj Sve dok Učitaj prvi broj xmax Za svaki i=2 do n čini slijedeće Učitaj broj x Ako je x > xmax postavi xmax=x Kraj Za svaki Ispiši xmax Komentar rješenja: Prikazano rješenje je jedno od više mogućih. Odabrano je upravo ovo, da bude pregledno i razumljivo. Rečenice su pisane s glagolima u imperativu ("Učitaj", "Postavi"). To naglašava smisao rečenice kojom korisnik (programer) naređuje automatu tj. računalu da izvrši zadanu radnju. "Učitaj broj n" je naredba računalu da prihvati (s nekog ulaznog uređaja, tastature, diska) zadani podatak. Naredbe će se odvijati u redoslijedu kako su napisane ako samom naredbom nije drugačije naređeno. Očito je, da će se nakon naredbe "Učitaj broj n" obaviti naredba "Ako n...". No nakon reda "Kraj Sve dok" ponavlja se petlja "Sve dok.." ako je zadani uvjet "n nije prirodan broj" ispunjen ili se obavlja iduća naredba ako je taj uvjet nije ispunjen, odnosno n je prirodan broj. Također se petlja (iteracija) "Za svaki i=2 do n čini slijedeće" ponavlja n-1 puta da bi se nakon tih n-1 ponavljanja dobio najveći broj xmax koji se nakon obavljene iteracije ispisuje naredbom "Ispiši xmax". Algoritam ne daje sasvim detaljno naznaku kako će se riješiti svaka naredba. Tako druga naredba ispituje da li je n prirodan broj. Način kako se to rješava, ovisi o programskom jeziku. U C-u, gdje n
5

možemo definirati kao cijeli broj, bit će dovoljno ispitati, da li je on veći od nule. Rješenje ovog primjera u C-u dato je u primjeru 2.1. Zadatak 1.1. Razraditi logiku programa koji će najprije učitati broj n. Ako n nije prirodan broj, ispisati o tome poruku i ponoviti učitavanje. Učitati n brojeva i naći i ispisati njihovu aritmetičku sredinu. Zadatak 1.2. Razraditi logiku programa koji će učitavati jedan za drugim niz brojeva. Kraj niza brojeva označen je brojem -99999. Naći i ispisati aritmetičku sredinu učitanih brojeva (broj -99999 ne uzeti u obzir). Zadatak 1.3. Razraditi logiku programa koji će učitavati jedan za drugim niz brojeva. Kraj niza označen je brojem 9. Naći i ispisati aritmetičku sredinu učitanih brojeva uzimajući u obzir samo one brojeve koji su veći ili jednaki 2 i manji ili jednaki pet. Zadatak 1.4. Razraditi logiku programa koji će učitati broj n. Taj broj mora biti prirodan i manji od 34. Ako taj uvjet nije zadovoljen ponoviti učitavanje broja n. Izračunati i ispisati n! (faktorijel od n=1*2*3*..*(n-1)*n). Zadatak 1.5. Razraditi logiku programa koji će učitati brojeve m i n. Oba broja moraju bit prirodna i m mora biti veći od n. Ako taj uvjet nije ispunjen ponoviti učitavanje. Naći i ispisati binomni koeficijent b jednak m povrh n tj. b= m! n !⋅ ( m − n) !

Zadatak 1.6. Razraditi logiku programa koji će učitati dva broja n1 i n2. Oba broja trebaju biti prirodna. Ako taj uvjet nije ispunjen, ponoviti učitavanje. Ako je n2 < n1, zamijeniti n1 sa n2. Naći i ispisati sumu drugih korjena svih neparnih brojeva od n1 do n2.

6

Primjer 1.2. Učitati prirodan broj n. Naći da li je učitani broj prost ili ne i o tome ispisati odgovarajući tekst. Rješenje: Učitaj broj n Ako je n < 4 čini Ispiši poruku da je n prost broj" Zaustavi dalji račun Kraj Ako je Ako je n paran čini Ispiši poruku da n nije prost broj jer je djeljiv s 2 Zaustavi dalji račun Kraj Ako je Postavi m = drugi korjen iz n Za svaki i=3 do m u koraku po 2 učini slijedeće: Ako je n djeljivo s i čini Ispiši poruku da n nije prost jer je djeljiv s i Zaustavi dalji račun Kraj Ako je Kraj Za svaki i Ispiši poruku da je n je prost broj Komentar rješenja: Broj je prost ako nije djeljiv ni sa jednim brojem osim s 1 i samim sobom. Učitani broj n (za koji pretpostavljamo da je prirodan), ako je veći od 1 i manji od 4 je prost broj (2 ili 3). Ako je n paran (i veći od 3) tada nije prost i djeljiv je s 2. Neparan broj ispitujemo da li prost tako, da ga dijelimo sa svakim neparnim brojem i to od 3 do m pri čemu je m drugi korjen iz n (broj koji nije djeljiv ni sa jednim brojem manjim od m sigurno nije djeljiv ni sa brojevima većim od m). Naredbom za iteraciju "Za svaki i=3 do m u koraku po 2" i poprima vrijednosti neparnih brojeva jer je se i povečava za 2 u svakoj narednoj iteraciji. Zadatak 1.7. Razraditi logiku programa koji će najprije učitati broj n. Broj n mora biti prirodan i veći od 3. Ako taj uvjet nije ispunjen, ispisati poruku o pogreški i ponoviti učitavanje. Naći i ispisati namanji prosti broj veći od n.

7

Zadatak 1.8. Razraditi logiku programa koji će učitati broj n koji mora biti veći od 10. Ako taj uvjet nije ispunjen, ispisati poruku o pogreški i prekinuti rad programa. Naći i ispisati najveći prosti broj manji od n. Zadatak 1.9. Razraditi logiku programa koji će učitati brojeve n1 i n2. Ako je n1 veće od n2, zamijeniti njihove vrijednosti. Naći i ispisati sve proste brojeve u intervalu n1 do n2. Primjer 1.3. Simetričan kvadrat je prirodan broj koji je kvadrat drugog prirodnog broja i čije znamenka su simetrične. 121 je takav broj jer je 121=11x11. Razraditi logiku programa koji će naći sve simetrične kvadrate od 10 do 10000. Rješenje: Za svaki i=4 do 100 učini slijedeće Postavi j=i*i Postavi k = cjelobrojni dio od log(j)+1 /* Ovim k daje broj znamenaka broja j */ Postavi m=k Postavi k=k/2 Za svaki l=1 do k učini slijedeće Postavi i1= cjelobrojni dio od j/10**(m-1) /* i1 je prva znamenka broja j */ Izračunaj i2=ostatak djeljenja j s 10 /* i2 je zadnja znamenka broja j */ Ako je i1 različito od i2 nastavi sa slijedećim i iteraciju po i Izračunaj (u cjelobrojnoj aritmetici) j = (j-i1*10**(m-1))/10 /* Ovim smo broju j "odrezali" 1. i posljednju znamenku */ Smanji m za 2 Kraj Za svaki l Ispiši broj i*i jer je on simetričan kvadrat Kraj Za svali i Komentar rješenja: Traže se simetrični kvadrati brojeva od 10 do 10000, pa je dovoljno ispitivati kvadrate svih prirodnih brojeva od 4 do 100. Prvom naredbom započinjemo iteraciju po i od 4 do 100. S j smo označili kvadrat broja i tj. j je broj koji treba ispitati na simetričnost. Broj k je broj znamenaka broja j i nalazimo koristeći njegov dekadski logaritam. Tekst između znakova /* i */ služi kao komentar da bi sam algoritam bio jasniji. Broj m će nam davati broj znamenaka ispitivanog broja. Broj k dijelimo s 2 da bi dobili broj potrebnih ispitivanja na simetričnost (u svakom ispitivanju uspoređujemo 2 znamenke, 1. i zadnju, pa imamo k/2 ispitivanja). i1 i i2 su prva i posljednja znamenka broja j. Njih dobivamo nalaženjem ostatka odnosno dijeljenjem u cjelobrojnoj aritmetici. U ovoj aritmetici
8

rezultat svakog dijeljenja je cijeli broj (npr. 5/2 je 2). Ako je i1 različito od i2, broj j sigurno nije simetričan pa prelazimo na idući broj tj. uzet ćemo slijedeći broj i ispitati njegov kvadrat j. Ako su prva i posljednja znamenka iste (i1=i2), trebamo "odbaciti" te dvije znamenke i tako dobiveni broj dalje ispitivati. Odbacivanje tih dviju znamenaka postižemo opet naredbom cjelobrojne aritmetike. Tako dobiveni broj ima sada dvije znamenke manje od prethodnog, pa zato smanjujemo m za 2. Ako smo završili iteraciju po l i svi i1 i i2 su bili međusobno jednaki, ispitivani broj je simetričan. Ispisujemo i*i, a ne broj j koji se tokom ispitivanja promijenio. Zadatak 1.10. Pitagorini brojevi su prirodni brojevi i1, i2 i i3 koji zadovoljavaju uvjet i1*i1+i2*i2=i3*i3. Razraditi logiku programa koji će naći i ispisati sve Pitagorine brojeve manje od 1000. Zadatak 1.11. Svaki paran broj može se prikazati kao suma dvaju prostih brojeva (tkzv. Goldbachovo pravilo). Razraditi logiku programa koji će najprije učitati dva prirodna broja n1 i n2. Ako je n1 > n2 zamijeniti n1 sa n2. Prikazati sve parne brojeve u intervalu n1 do n2 kao sumu dvaju prostih brojeva. Zadatak 1.12. Razraditi logiku programa koji će najprije učitati prirodan broj n i realan broj x. Program treba naći i ispisati sumu prvih n članova niza s=1+x/1!+x**2/2!+..+x**n/n! (** označava potenciranje). Zadatak 1.13. Razraditi logiku programa koji će učitati realne brojeve a, b i c i naći i ispisati rješenja x1 i x2 kvadratne jednadžbe a*x**2 + b*x + c = 0. Ako jednadžba nema realnih rješenja (b*b4*a*c<0), ispisati odgovarajuću poruku i ne računati rješenja. Zadatak 1.14. Razraditi logiku programa koji će učitati brojeve a, b i c. Sva tri broja moraju biti manja od 20 i zadovoljavati uvjet a + b > c. Ako ti uvjeti nisu zadovoljeni, ispisati odgovarajuću poruku i ponovo učitati brojeve a, b i c. Ako su brojevi ispravno zadani, naći površinu p trokuta sa stranicama a, b i c. Koristiti Heronovu formulu p=sqrt(s*(s-a)*(s-b)*(s-c)). (Sa sqrt je označen drugi korjen izraza u zagradi, a s=(a+b+c)/2). Zadatak 1.15. Razraditi logiku programa koji će učitati broj n. Taj broj mora biti veći od nule i manji od 10. Ako taj uvjet nije ispunjen, ispisati odgovarajuću poruku i ponoviti učitavanje. Naći i ispisati srednju vrijednost svih parnih brojeva od n do 2000 ali ne uzimajući u obzir one parne brojeve, koji su djeljivi sa 13.

9

Primjer 1.4. Razraditi logiku programa koji će najprije učitati broj n, koji mora biti prirodan broj manji od 1000. Ako n ne zadovaljava postavljeni uvjet, ispisati poruku i ponoviti učitavanje. Ako n zadovoljava postavljeni uvjet, učitati n brojeva, poredati ih (sortirati) po rastućem redoslijedu i ispisati tako poredane brojeve. Rješenje: Definiraj vektor (jednostupčastu matricu) v od 999 brojeva Postavi n=0 Sve dok n nije prirodan broj manji od 1000 čini Učitaj broj n Ako je n > 999 ili n<=0 ispiši poruku za ponovno zadavanje broja n Kraj Sve dok Za svaki i= 0 do n-1 učitaj v[i]. /* Sada su brojevi učitani, slijedi sortiranje */ Postavi m=n Postavi sortiran=false Sve dok je sortiran=false čini Postavi sortiran=true Za svaki j=0 do m-2 učini slijedeće: Ako je v[j] > v[j+1] čini /* Treba zamijeniti v[j] i v[j+1] */ Postavi sortiran=false Postavi x=v[j] Postavi v[j]=v[j+1] Postavi v[j+1]=x Kraj Ako je Kraj Za svaki j Smanji m za 1 Kraj Sve dok /* Sada su brojevi sortirani, slijedi ispis */ Za svaki i=0 do n-1 ispiši v[i] Komentar rješenja: Postupak poredanja podataka zove se sortiranje. Prikazani algoritam je tkzv. "Bubble sort". Sve brojeve (ili općenito podatke) pohranimo (memoriramo) u matricu ili indeksiranu varijablu. Indeksirane varijable ili matrice predstavljaju skup podataka označen zajedničkim imenom. Pojedini podatak u skupu određen je imenom skupa i položajem u skupu ili indeksom. Koristit ćemo dogovor da je početni član skupa određen indeksom 0, pa prema tome indeksi u skupu od n elemenata poprimaju vrijednosti od 0 do n-1. Ako je skup razmješten u jednoj dimenziji, tada govorimo o jednostupčastoj matrici ili vektoru. Ako je skup razmješten u dvodimenzionalnu tabelu, u retke i stupce, tada govorimo o matrici. U ovom primjeru koristimo vektor v od 999 članova. Svaki član adresira se indeksom. Na. pr. v[0] je prvi član skupa, v[j-1] je j-ti član i t. d. Potrebno je da na početku definiramo vektor od 999 elemenata. Zbog toga broj elemenata koji ćemo učitati i zatim sortirati ne
10

može biti veći od 999 . Nakon učitanog broja n ispitujemo njegovu ispravnost te ako je n ispravan, učitavamo n brojeva u vektor v. Nako toga slijedi samo sortiranje. Ono se svodi na uspoređivanje jtog i idućeg, j+1 broja u vektoru v. Ako je naredni broj manji od prethodnog ( v[j+1] < v[j] ), izvršit ćemo njihovu zamjenu i zabilježit pomoću logičke varijable "sortiran" da svi brojevi još nisu poredani (true i false su logičke konstante). Ovaj postupak ponavljamo tako dugo, dok sve brojeve ne poredamo i nakon prolaska kroz vektor dobijemo sortiran=true. Nakon svakog uspoređivanja još neporedanih brojeva u vektoru, njihov broj se smanjuje za 1. Zato broj m koji označava broj neporedanih podatama nakon toga smanjujemo za 1. Nakon obavljenog sortiranja (sortirani=true) ispisujemo podatke iz vektora v. Zadatak 1.16. Razraditi logiku programa koji će učitati 100 brojeva u jednostupčastu matricu (vektor) v, naći najmanji i najveći broj i zamijeniti njihova mjesta u vektoru. Tako dobiveni vektor ispisati. Zadatak 1.17. Razraditi logiku programa koji će učitati broj n, koji mora biti prirodan broj manji od 500. Ako taj uvjet nije zadovoljen ispisati odgovarajuću poruku i ponoviti učitavanje. Učitati n brojeva u vektor (jednostupčastu matricu, indeksiranu varijablu) v1 i n brojeva u vektor v2. Naći i ispisati skalarni produkt učitanih vektora (skalarni produkt sp je suma produkata odgovarajućih članova vektora tj. sp=

∑ v1[ i] ⋅ v 2[ i]
i =1

n

= v1[0]*v2[0] + v1[1]*v2[1]+....+ v1[n-1]*v2[n-1] )

Zadatak 1.18. Razraditi logiku programa koji će učitati prirodan broj n koji mora biti manji od 500. Ako taj uvjet nije ispunjen ispisati odgovarajuću poruku i ponoviti učitavanje. Učitati n elemenata u vektor v1 i n elemenata u vektor v2. Zamijeniti redoslijed elemenata u vektoru v2 tako da 0. element dođe na n-1 mjesto, 1. na n-2. i t.d. Naći i ispisati skalarni produkt tako dobivenog vektora v2 i učitanog vektora v1. Zadatak 1.19. Medijan je statistički pojam definiran kao "srednji član" niza poredanih podataka. Ako niz ima n članova i n je neparan broj, onda (pod uvjetom da su članovi poredani) medijan je n/2. član (računajući n/2 cjelobrojno; npr. ako je n=17 tada je medijan član poredanog niza s indeksom 8). Ako je n paran, tada je medijan aritmetička sredina n/2-1 i n/2 člana (npr. ako je n=28 tada je medijan aritmetička sredina članova poredanog niza s indeksina 13 i 14). Razraditi logiku programa koji će učitati prirodan broj n, zatim učitati n brojeva u vektor v, poredati te brojeve po rastućem redoslijedu i naći i ispisati medijan. Koristiti algoritam sortiranja iz primjera 1.4. Zadatak 1.20. Razraditi logiku programa koji će naći medijan učitanog niza od n brojeva. Za razliku od zadatka 1.19. naći medijan bez sortiranja podataka, već uzastopnim odbacivanjem najmanjeg i najvećeg člana vektora sve dok u vektoru ne ostanu dva člana (ako je n paran) i tada je medijan aritmetička sredina ta dva člana, ili ne ostane jedan član (ako je n neparan). Primjer 1.5.

11

Pretpostaviti da postoji funkcija Rnd(n), koja pri svakom svom pozivu daje slučajni broj koji je prirodan broj u intervalu 1 do n. Na pr. ako naznačimo "Postavi i= Rnd(34)" tada će i poprimiti vrijednost nekog (slučajnog) cijelog broja između 1 i 34. Ponavljanjem ove naredbe, i će svaki puta poprimiti neku "slučajnu" vrijednost ali uvijek u istom intervalu (ako funkcija Rnd daje jednoliko raspoređene slučajne brojeve, tada će se pri vrlo velikom broju njenog pozivanja svaki broj pojaviti približno jednako mnogo puta). Razraditi logiku programa koji će koristeći Rnd funkciju simulirati izvlačenje lota (od brojeva 1 do 39 nasumce izvući 7). Rješenje: Definiraj vektor loto od 39 elemenata Za svaki i=0 do 38 postavi loto[i]=i+1 Postavi n=38 Za svaki i=1 do 7 učini Postavi j= Rnd[n] Postavi k=loto[j] Ispiši izvučeni broj /* k je "izvučeni" slučajni broj; on se ne može ponovo izvući, pa ga treba izbaciti iz tabele: na njegovo mjesto stavljamo zadnji, n-ti broj*/ Postavi loto[j]=loto[n] Smanji n za 1 Kraj Za svaki i Komentar rješenja: U tabelu (vektor) loto stavili smo brojeve 1 do 39. S n=39 smo naznačili da u tabeli ima 39 brojeva. Iza toga započinjemo iteraciju koja će se obaviti 7 puta, jer ćemo izvući 7 brojeva. Nakon toga dobivamo slučajni broj j koji je između 0 i n-1 (prvi puta n=39). Broj k koji je "izvučen" nalazimo na j-tom mjestu tabele. Ispisujemo taj broj i sada ga izbacujemo iz tabele tako, da na njegovo mjesto stavljamo posljednji tj. n-1. broj. n smanjujemo za 1 jer se izbor brojeva za izvlačenje smanjio za 1. Zadatak 1.21 Razraditi logiku programa koji će simulirati bacanje kocke. Baciti kocku 6000 puta i naći i ispisati broj pojavljivanja svakog od brojeva 1 do 6. Koristiti Rnd funkciju kao u primjeru 1.5. Zadatak 1.22. Razraditi logiku programa koji će simulirati istovremeno bacanje dviju kocaka. Baciti kocke zadani n broj puta. Naći u koliko posto slučajeva su se na obje kocke pojavili isti brojevi. Zadatak 1.23. Razraditi logiku programa koji će koristeći Rnd funkciju generirati 200 slučajnih brojeva u intervalu od 1 do 1000. Naći i ispisati medijan generiranih brojeva. Koristiti algoritam sortiranja iz primjera 1.4.
12

Zadatak 1.24. Razraditi logiku programa koji će pomoću Rnd funkcije postaviti 100 slučajnih brojeva u vektor slbr. Brojevi trebaju biti u intervalu od 1 do 200. Naći i ispisati sve one brojeve postavljene u vektor slbr koji su se pojavili dva ili više puta. Zadatak 1.25. Razraditi logiku programa koji će učitati prirodan broj n koji mora biti manji od 50. Ako taj uvjet nije ispunjen, ispisati odgovarajuću poruku i ponoviti učitavanje. Učitati n brojeva u vektor b1 i generirati n slučajnih brojeva u intrevalu 1 do 2*n i te brojeve staviti u vektor b2. Naći najveći broj u jednom i drugom vektoru i zamijeniti njihova mjesta. Primjer 1.6. Razraditi logiku programa koji će koristiti dvije matrice a1 i a2 od 100 redaka i stupaca. Program najprije učita brojeve m i n koji označavaju broj redaka i broj stupaca koji će biti popunjeni u matricama. m i n moraju biti manji od 100. Ako taj uvjet nije zadovoljen, ispisati poruku i ponovo učitati m i n. Učitati podatke (brojeve) u m redaka i n stupaca matrice a1 (ukupno m * n brojeva). Naći sumu svakog redka i svakog stupca matrice a1 i te sume staviti u posljednji redak (s indeksom 99) odnosno stupac matrice. Naći ukupnu sumu S svih elemenata matrice a1 i taj broj staviti u 100. redak i 100. stupac. Naći sve relativne podatke a[i][j]/S i njihove vrijednosti u postocima staviti u odgovarajuće redke i stupce matrice a2. Ispisati matricu a2. Rješenje: Definiraj matrice a1 i a2 od 100 redaka i stupaca. Ponavljaj Učitaj m i n. Ako je m > 99 ili n > 99 ispiši poruku o pogrešno zadanom m ili n Sve dok je m>99 ili n>99 Za svaki i=0 do m-1 učini Za svaki j=0 do n-1 učitaj a1[i][j] Za svaki i=0 do 99 učini slijedeće: Postavi a1[i][99]=0 /* Postavi na 0 zadnji redak i stupac */ Postavi a1[99][i]=0 Kraj Za svaki i Postavi S=0 Za svaki i=0 do m-1 /* Nađi sumu redka, sumu stupca i ukupnu sumu s */ Za svaki j=0 do n-1 učini Povečaj a1[i][99] za a1[i[j] Povečaj a1[99][j] za a1[i][j] Povečaj S za a1[i][j] Kraj Za svaki j Postavi a1[99][99]=S
13

/* Relativne podatke stavi u matricu a2 i ispiši je */ Za svaki i=0 do m-1 Za svaki j=0 do n-1 učini Postavi a2[i][j]=a1[i][j]/a1[99][99]*100 Ispiši a2[i][j] Kraj Za svaki j Komentar rješenja: Na početku smo definirali matrice koje ćemo koristiti u algoritmu. Kod izrade rješenja u programskom jeziku kakav je C, potrebno je definirati na početku programa sve varijable no za bolju čitljivost algoritma u njemu naznačujemo samo definicije vektora i matrica. Ako su m i n manji od 100, učitat ćemo podatke u m redaka i n stupaca matrice a1. Služimo se konvencijom, da prvi indeks matrice označava redak, a drugi indeks stupac matrice tj. a1[i][j] označava element u i-tom redu i j-tom stupcu. Nakon učitavanja postavljamo na nulu vrijednosti u zadnjem (s indeksom 99) retku i stupcu matrice a1. Iza toga "prolazimo" kroz sve retke i sve stupce matrice tako da za svaki redak i (od 0 do m-1) uzimamo element a1[i][j] u svakom j-tom stupcu (j ide od 0 do n-1) i povečavamo zadnji stupac svakog reda (a1[i][99] ) i zadnji redak svakog stupca (a1 [99][j] ) za svaki element matrice ( a1[i][j] ). Na isti način u zadnji redak i stupac ( a1[99][99] ) stavljamo ukupnu sumu. Relativni iznos u postotku dobivamo tako da svaki podatak iz matrice a1 dijelimo sa a[99][99] i množimo sa 100. Rezultat stavljamo u matricu a2. Tako dobiveni rezultat konačno ispisujemo u dvostrukoj iteraciji po i i j na kraju algoritma. Zadatak 1.26. Razraditi logiku programa koji će koristiti matricu od 20 redaka i 20 stupaca. Učitati brojeve u svaki redak i stupac te matrice. Naći i ispisati sumu članova matrice na njenoj glavnoj dijagonali (glavna dijagonala ide od gornjeg lijevog u donji desni ugao matrice). Zadatak 1.27. Razraditi logiku programa koji će koristiti matricu od 50 redaka i 50 stupaca. Učitati broj m koji mora biti manji ili jednak 50. Ako taj uvjet nije zadovoljen ponoviti učitavanje broja m. Učitati m * m brojeva u m redaka i stupaca matrice. Naći i ispisati produkt članova na sporednoj dijagonali matrice (sporedna dijagonala ide od desnog gornjeg u lijevi donji ugao). Zadatak 1.28. Razraditi logiku programa koji će koristiti matricu od 50 redaka i stupaca. Učitati brojeve m i n koji određuju broj popunjenih redaka (m) i stupaca (n) matrice. m i n moraju biti manji od 51. Ako taj uvjet nije zadovoljen ponoviti učitavanje brojeva m i n. Učitati brojeve u m redaka i n stupaca matrice. Naći i ispisati najveći broj u svakom od m retka matrice. Zadatak 1.29. Kvadratna matrica (s jednakim brojem redaka i stupaca) je dijagonalno dominantna ako je u svakom njenom redu zbroj apsolutnih vrijednosti članova van glavne dijagonale manji od apsolutne vrijednosti člana na glavnoj dijagonali. Razraditi logiku programa koji će koristiti kvadratnu matricu od 100 redaka (i stupaca), učitati broj m, učitati m * m brojeva u tu matricu i naći da li je matrica pozitivno definitna. O tome ispisati odgovarajuću poruku.
14

Zadatak 1.30. Matrice se množe tako, da član u i-tom retku i j-tom stupcu matrice produkta poprima vrijednost skalarnog produkta i-tog reda prve matrice (prvog faktora) i j-tog stupca druge matrice. Razraditi logiku programa koji će kortistiti tri matrice od 20 redaka i 20 stupaca. Učitati tri broja m, n i k koji daju broj redaka (m) i stupaca (n) prve matrice i broj stupaca (k) druge matrice (broj redaka druge matrice jednak je broju stupaca prve matrice). Sva tri broja moraju biti manja od 21. Ako taj uvjet nije zadovoljen ispisati odgovarajuću poruku i završiti program. Učitati podatke u prve dvije matrice i naći i ispisati produkt tih zadanih matrica. Zadatak 1.31. Kvadratna matrica se potencira tako da se obavi uzastopno množenje zadane matrice. Razraditi logiku programa koji će koristiti kvadratnu matricu od 30 redaka. Učitati broj popunjenih redaka i stupaca (m) te matrice. Taj broj mora biti manji od 31. Ako taj uvjet nije zadovoljen ispisati odgovarajuću poruku i ponoviti učitavanje tog broja. Učitati m*m brojeva u matricu. Učitati broj n koji mora biti cijeli broj manji od 10. Ako ovaj uvjet nije zadovoljen ponoviti učitavanje broja n. Naći i ispisati n-tu potenciju zadane matrice. Koristiti množenje matrica opisano u zadatku 1.30. Zadatak 1.32. Razraditi logiku programa koji će koristiti matricu a od 50 redaka i stupaca. Učitati brojeve m i n koji označavaju broj popunjenih redaka i stupaca matrice a. Učitati podatke (brojeve) u m redaka i n stupca matrice a. Učitati tri broja i, l1 i l2. l1 mora biti različito od l2. Osim toga, ako je i=1, l1 i l2 moraju biti jednaki ili manji od m. Ako je i različito od 1, l1 i l2 moraju biti jednaki ili manji od n. Ako ti uvjeti nisu zadovoljeni, ispisati odgovarajuću poruku i ispisati učitanu matricu. Ako su navedeni uvjeti zadovoljeni i ako je i=1, zamijeniti l1 i l2 redak učitane matrice. Ako je i različito od 1, izvršiti zamjenu l1-og i l2-og stupca matrice. Tako dobivenu matricu ispisati.

15

2. JEDNOSTAVNI ZADACI U C PROGRAMSKOM JEZIKU. Kao što smo već napomenuli svaki postavljeni primjer i zadatak ima više mogućih rješenja u bilo kojem pa tako i u C programskom jeziku. Ovdje smo nastojali dati takva rješenja, koja će za čitaoca početnika biti razumljiva i pregledna i nismo težili optimalnim rješenjima po nekim drugim kriterijima. Napredni čitalac ima priliku da napravi i bolja rješenja. U ovom poglavlju dajemo jednostavne primjere i zadatke. Oni su jednostavni zbog jednostavnog algoritma i zbog toga, što se ne koriste indeksirane varijable (vektori ili matrice) niti funkcije (procedure).

Primjer 2.1. Napisati program u C-u koji će najprije učitati broj n. Ako n nije prirodan ispisati poruku o pogreški i ponoviti učitavanje. Učitavati redom jedan za drugim n brojeva x i naći i ispisati najveći od njih xmax. Rješenje: (Za algoritam ovog primjera vidi primjer 1.1.) /* Nalaženje najvećeg broja xmax u skupu X od n članova*/ #include <stdio.h> int main() {int i,n; /* Definiraj potrebne podatke */ float x,xmax; printf("\nNalaženje najvećeg broja u skupu\n\n" ); printf("Molim zadajte broj elemenata u skupu: "); n=0; while (n<=0) /* Ponavljaj učitavanje dok se */ { /* ne učita prirodni broj za n */ scanf("%d",&n); if (n<=0) printf("\nPrirodan broj molim! Ponovite!"); } scanf("%f",&xmax); /* Prvi učitani broj je najveći */ for (i=2;i<=n;i++) /* Ponavljaj n-1 puta */ { scanf("%f",&x); if(x>xmax)xmax=x; /* Ako je veći, ubilježi */ } printf("\nNajveći od učitanih brojeva je %10.3f",xmax); return 0; }

16

Komentar rješenja: Sintaksa C-a ne zahtijeva pisanje svake naredbe u novom redu jer kraj naredbe ("rečenice") završava s ";". Preglednosti radi ipak se najčešće pojedina naredba u C-u piše u zasebnom redu, pa su i ovdje prikazana rješenja napravljena po ovom načelu. Komentari se u C-u pišu između znakova /* i */ i oni su i ovdje umetani da bi primjeri bili razumljiviji. Vitičaste zagrade (otvorena i zatvorena) služe da bi se njima označio blok naredbi koji se sintaktički ponaša kao jedna naredba. To znaći, da se takav blok može nalaziti na mjestu, gdje se može nalaziti i pojedina naredba. Preglednosti radi, u C programu su naredbe koje pripadaju istom bloku napisane pomaknute u desno za određeni broj mjesta. Rješenje ovog primjera, kao i sva ostala ovdje prikazana, počinju s #include naredbom. Tom naredbom naznačuje se prevodiocu da uključi u tekst našeg programa i određene već pripremljene dijelove koji se nalaze u standardnim C datotekama. Znakovi između < > određuju ime datoteke koja se uključuje. Naredba int main() je deklarativna naredba početka glavnog programa. Riječ int (kratica engl. integer, cijeli broj) znači da ovaj program vraća cjelobrojnu vrijednost programu od kojeg je pozvan. S obzirom da je ovo glavni program, njega poziva operacijski sustav, pa int ovdje znači da po završetku ovog programa operacijski sustav od njega dobiva cjelobrojni podatak. Naredbe int i float definiraju varijable cjelobrojnog i realnog (racionalnog) tipa. printf je funkcija kojom se ispisuju podaci na standardnu izlaznu jedinicu. "\n" kao dio znakovne konstante se ne ispisuje već je to kontrolni znak, koji određuje prijelaz u novi redak. Učitavanje broja n obavlja se iterativno pomoću while petlje, koja se obavlja tako dugo, dok je uvjet u zagradi, u ovom slučaju n<=0, ispunjen. Sve naredbe ove petlje su unutar jednog bloka ograničenog s { i }. Samo učitavanje sa standardne ulazne jedinice obavlja se scanf funkcijom. Prvi parametar scanf funkcije u ovom primjeru je "%d", znakovna konstanta, koja određuje format ulaznog podatka i u ovakvom obliku se koristi za učitavanje cijelih brojeva (definiranih int naredbom). Drugi parametar scanf funkcije je adresa podatka n i zbog toga se piše u obliku &n. Adresu, a ne samu vrijednost parametra n, potrebno je predati da bi funkcija scanf na tu adresu mogla postaviti učitanu vrijednost. Naredba za selekciju požinje ključnom riječi if, pa ako je uvjet, napisan između zagrada - ovdje je to (n<=0) - ispunjen, obavit će se naredba (ili blok) koji slijedi. Dalje se u primjeru koristi još i for iteracija. U zagradi iza ključne riječi for su tri izraza odvojena s ";". Prvi od njih, ovdje i=2, označava početnu naredbu, koja se obavlja prije prve iteracije. Drugi izraz, i<=0 u ovom slučaju, određuje uvjet. Petlja se ponavlja sve dok je ovaj uvjet ispunjen. Treći izraz određuje radnju koja se izvršava pri svakom narednom obavljanju iteracije. To je i++ u ovom slučaju i znači povečanje varijable i za 1. Funkcijom printf na kraju ovog primjera ispisuje se rezultat na standardnu izlaznu jedinicu. Naredbom return program se "vraća" u operacijski sustav tj. zabvršava se rad ovog programa. Zadatak 2.1. Napisati C program koji će najprije učitati broj n. Ako n nije prirodan broj, ispisati o tome poruku i ponoviti učitavanje. Učitavati n brojeva i naći i ispisati njihovu aritmetičku sredinu. Zadatak 2.2. Napisati C program koji će učitavati jedan za drugim niz brojeva. Kraj niza brojeva označen je brojem -99999. Naći i ispisati aritmetičku sredinu učitanih brojeva (broj -99999 ne uzeti u obzir). Vidi zadatak 1.2.

17

Zadatak 2.3. Napisati C program koji će učitavati jedan za drugim niz brojeva. Kraj niza označen je brojem 9. Naći i ispisati aritmetičku sredinu učitanih brojeva uzimajući u obzir samo one brojeve koji su veći ili jednaki 2 i manji ili jednaki pet. Vidi zadatak 1.3. Zadatak 2.4. Napisati C program koji će učitati broj n. Taj broj mora biti prirodan i manji od 34. Ako taj uvjet nije zadovoljen ponoviti učitavanje broja n. Izračunati i ispisati n! (faktorijel od n=1*2*3*..*(n-1)*n). Vidi zadatak 1.4). Zadatak 2.5. Napisati C program koji će učitati brojeve m i n. m mora biti veće od n i oba broja moraju biti prirodna. Ako taj uvjet nije ispunjen ponoviti učitavanje. Naći i ispisati binomni koeficijent b jednak m povrh n tj. b= m! n !⋅ ( m − n )!

Vidi zadatak 1.5.

Zadatak 2.6. Napisati C program koji će učitati dva broja N1 i N2. Oba broja trebaju biti prirodna. Ako taj uvjet nije ispunjen, ponoviti učitavanje. Ako je N2 < N1, zamijeniti N1 s N2. Naći i ispisati sumu drugih korjena svih neparnih brojeva od N1 do N2. Vidi zadatak 1.6. Primjer 2.2. Napisati C program koji će učitati cijeli broj n. Taj broj mora biti veći od 1 i manji od 100000. Ako ovaj uvjet nije ispunjen ispisati poruku "POGREŠNO ZADAN BROJ" i završiti rad. Program treba naći i spisati sumu s svih znamenaka učitanog broja. Algoritam rješenja: Učitaj broj n Ako je n<=0 ili n>=<100000 tada Ispiši poruku o pogrešno zadanom broju U suprotnom Postavi x=n Nađi broj znamenaka m zadanog broja n Postavi s=0 Za svaki i=1 do m učini slijedeće Nađi (u cjelobrojnoj aritmetici) zz=n mod 10 Povečaj s za zz. Podijeli n s 10 (cjelobrojno) Kraj Za svaki i Ispiši s Kraj U suprotnom
18

Rješenje u C-u: /* Zbroj znamenaka cijelog broja */ #include <stdio.h> /* Standardna datoteka ulaza i izlaza*/ #include <math.h> /* Datoteka s matematickim funkcijama */ int main() {int i,m,s,zz; long n; printf("Zbroj znamenaka cijelog broja\n\n"); printf("Cijeli broj n (0<n<100000) molim "); scanf("%d",&n); if (n<=0 || n>=1000000) printf("\nPogrešno zadan broj!"); else { m=log10(n)+1; s=0; for (i=1;i<=m;i++) {zz=n%10; s+=zz; n/=10; } printf("Suma znamenaka zadanog broja je %d",s); } return 0; } Komentar rješenja: Zbroj znamenaka broja n naći ćemo tako, da nađemo najprije zadnju znamenku broja. U cjelobrojnoj aritmetici to se može jednostavno obaviti mod operatorom zz =n%10 (ili naredbom zz=nn/10*10). Ako nakon toga broj n cjelobrojno podijelimo sa 10, tada će iduća znamenka s desna postati zadnja i postupak nalaženja zadnje znamenke možemo ponavljati toliko puta, koliko imamo znamenaka u zadanom broju. Zato najprije (u slučaju ispravno zadanog broja) nalazimo m (broj znamenaka) i zatim m puta ponavljamo nalaženje zadnje znamenke zz, njeno pribrajanje sumi s i dijeljenje broja n s 10. U rješenju u C-u imamo dvije #include naredbe, jednu za standardne ulazno-izlazne datoteke (stdio.h) i drugu za matematičke funkcije (math.h) koja je potrebna zbog korištenja log10 funkcije kasnije u programu. Broj n je tipa "long" jer može biti i veći od najvećeg broja za tip int (najveći int je 32627). Broj n učitavamo i poruku u slučaju pogreške ispisujemo koristeći jedinice za standardni ulaz i izlaz i to pomoću funkcija scanf i printf. Broj znamenaka nekog cijelog broja je cjelobrojni dio njegovog dekadskog logaritma (karakteristika broja) uvećan za 1 (drugi način nalaženja broja znamenaka cijelog broja može se postići uzastopnim
19

dijeljenjem brojs s 10 sve dok se ne dobije 0 te brojanjem koliko je bilo dijeljenja). s je suma koju početno svodimo na nulu da bi je nakon toga u petlji povećavali za zadnju znamenku iz "preostalog" broja i to naredbom s+=zz. Zadatak 2.7. Napisati C program koji će učitavati niz cijelih brojeva. Zadnji broj u nizu, koji označava kraj niza je broj -1000. Naći i ispisati broj n koji pokazuje koliko je među učitanim brojevima bilo onih, kod kojih je zadnja znamenka jednaka 3. Zadatak 2.8. Napisati C program koji će najprije učitati cijeli broj M. Taj broj mora biti veći od 0 i manji od 10. Ako taj uvjet nije zadovoljen, ispisati poruku "POGREŠNO ZADANA ZNAMENKA" i ponoviti učitavanje. Program dalje treba učitavati niz brojeva koji završava brojem 9999. Program treba naći i ispisati broj n koji pokazuje koliko je među učitanim brojevima bilo onih kod kojih je prva znamenka jednaka M. Zadatak 2.9. Napisati C program koji će učitavati 300 prirodnih brojeva i naći i ispisati broj n koji pokazuje koliko je među učitanim brojevima bilo takvih, kod kojih su prva i posljednja znamenka jednake. Primjer 2.3. Napisati C program koji će učitati cijeli broj n. Taj broj mora biti veći od 1 i manji od 10000. Ako ovaj uvjet nije ispunjen ispisati poruku "Pogrešno zadan broj" i završiti rad. Program treba ispisati na štampač tablicu faktorijela prirodnih brojeva od 1 do n. Naslov tablice na svakoj stranici treba glasiti: Tablica logaritama faktorijela brojeva od 1 do xxxx Str xx n Log(n!) Štampati 64 reda na svakoj stranici. Logaritam faktorijela ispisati na 4 decimalna mjesta Rješenje: /* Ispis tabele logaritama faktorijela */ #include <stdio.h> #include <math.h> int main() { int n,br,str; float x,xlog,z; FILE *fout; fout=stdprn; printf("\nIspis logaritama faktorijela na štampač\n\n"); printf("Molim gornju granicu n (0<n<10000) "); scanf("%d",&n); if (n<=0 || n>=10000) {printf("\nPogrešno zadan broj!");
20

return 1;} br=64; str=1; for (x=1;x<=n;x++) {if (br==64) /*Ispis naslova */ {if (str==1) fprintf(fout,"\n Tablica logaritama faktorijela od 1 do %5d Str %3d",n,str) else fprintf(fout,"\f Tablica logaritama faktorijela od 1 do %5d Str.%3d" ,n,str); fprintf(fout,"\r\n n Log(n!)\n\n" ); str++; br=3; } xlog=0; for (z=1;z<=x;z++) xlog+=log10(z); fprintf(fout,"\n %5.0f %8.4f",x,xlog); br++; } fprintf(fout,"\f"); } return(0);} Komentar rješenja: Broj n učitavamo i u slučaju pogreške ispisujemo poruku koristeći standardne jedinice. također se u slučaju pogreške program prekida naredbom return 1. No za ispis na štampač koristimo fout unutrašnje ime datoteke koje je tipa FILE. Pri definiciji ove datoteke navodi se podatak na adresi fout pa stoga ta definicija glasi FILE *fout. Ovom unutrašnjem imenu pridjeljujemo vanjsko ime stdprn naredbom pridruživanja fout=stdprn. Pisanje u ovu datoteku obavlja se funkcijom fptintf kojoj kao prvi parametar treba predati unutarnje ima datoteke. Logaritam faktorijela računamo tako da varijablu xlog najprije postavimo na nulu a zatim joj dodajemo logaritam svakog broja (Kako je x!= 1*2*.. *x, to je log(x!)=log(1)+log(2)+...+log(x)). Broj koji se mijenja od 1 do x je z Dekadski logaritam nalazimo funkcijom log10(z). Potrebno je ispisati 64 redaka po stranici. Kontrolni znak "\f "(engl. form feed) daje štampaču naredbu za skok na novu stranicu. Zato imamo varijablu br kojom brojimo redove. Kada br dostigne 64, ispisujemo naslov, pri čemu ujedno brojač redaka br postavimo na 3 a broj stranice str povečavamo za 1. Ispisujemo broj x i logaritam njegovog faktorijela xlog već spomenutom funkcijom fprintf. Pri ispisu svakog reda na početak reda stavljamo kontrolne znakove "\r\n". Slovo r označava povratak (engl. return) na prvu poziciju u redu, dok \n znači skok u novi red. (Kod ispisa na ekran s funkcijom printf kontrolni znak \r ne treba pisati jer se on umeće ispred svakog \n znaka). Za ispis racionalnog broja koristi se format "%5.0f" ili "%8.4f" čime se postiže ispis na traženi broj decimala. Na kraju ispisa se još ubacuje naredba za skok na novu stranicu. Zadatak 2.10. Napisati C program koji će s tastature učitati prirodni broj i naći i ispisati sve proste faktore toga broja.
21

Zadatak 2.11. Napisati C program koji će naći i ispisati sve proste brojeve od 1 do 10000 (algoritam nalaženja prostih brojeva dat je u primjeru 1.2.). Zadatak 2.12. Napisati C program koji će ispisati tablicu dekadskih, prirodnih i logaritama po bazi 2 svih prirodnih brojeva od 1 do učitanog broja n. Logaritme brojeva ispisati s 4 decimale. Štampati naslov i broj stranice na vrhu svake stranice i štampati 60 redaka tablice na svakoj stranici. Naslov ima dva retka slijedećeg sadržaja: Logaritmi prirodnih brojeva Str. xxx n log10 (n) log (n) log2 (n) Zadatak 2.13. Napisati C program koji će štampati tabelicu sinusa i dekadskog logaritma sinusa kuteva od zadanih realnih brojeva x1 do x2 u koraku po dx. Ako je vrijednost sinusa kuta negativna ili jednaka 0 štampati zvjezdice umjesto logaritma sinusa. Učitani brojevi x1, x2 i dx moraju zadovoljavati slijedeće uvjete: x2>x1 i dx<(x2-x1)/50. Ako ovi uvjeti nisu ispunjeni ispisati poruku i prekinuti rad programa. Štampati naslov i broj stranice na početku svake stranice (tekst naslova odabrati po vlastitom nahođenju). Štampati 60 redaka tablice po stranici. Sve podatke štampati na 4 decimale. Zadatak 2.14. Napisati C program koji će najprije učitati dva cijela broja n1 i n2. Oba broja moraju biti veća od nule i n1 mora biti manji od n2. Ako ti uvjeti nisu zadovoljeni ispisati poruku "Pogrešno zadan interval, ponovite!" i ponoviti učitavanje. Sve parne brojeve u intervalu n1 do n2 rastaviti na dva pribrojnika od kojih su oba prosti brojevi . (Goldbachovo pravilo, vidi zadatak 1.11.). Ispisati te brojeve i njihove proste pribrojnike. Formate učitavanja i ispisa izabrati proizvoljno. Zadatak 2.15. Pitagorini brojevi a, b i c su prirodni brojevi koji zadovoljavaju uvjet a*a+b*b=c*c (vidi zadatak 1.10.).Napisati C program koji će naći i ispisati sve Pitagorine brojeve manje od 1000. Zadatak 2.16. Napisati C program koji će učitati prirodan broj n i realan broj x a zatim naći i ispisati sumu od n članova reda 1+x/1!+x**2/2!+x**3/3!+....+x**n/n! (ovaj red predstavlja razvoj eksponencijalne funkcije exp(x) u Mc Laurenov red; ** znaći potenciranje; vidi i zadatak 1.12). Zadatak 2.17. Napisati C program koji će učitati racionalni broj x i naći i ispisati sumu prvih 20 članova reda x-x**3/3!+x**5/5!-x**7/7!+...-..+....x**n/n! (** znači potenciranje). Ovaj red predstavlja razvoj funkcije sin(x). Usporediti dobivenu sumu s vrijednošću C-ove funkcije sin(x) i ispisati apsolutnu pogrešku.

22

3. ZADACI S INDEKSIRANIM VARIJABLAMA U C-u, kao i u ostalim višim programskim jezicima, možemo koristiti skupove podataka koje nazivamo indeksiranim varijablama, poljima ili matricama. Svaki takav skup određen je svojim jedinstvenim imenom a podatak unutar skupa određen je s jednim ili više brojeva koji se zovu indeksi. Jednodimenzionalni skup, koji ima elemente poredane u jednom stupcu nazivamo vektorom. Dvodimenzionalni skup, koji ima elemente poredane u retke i u stupce zovemo matricom. Pojedini element vektora određen je imenom vektora i jednim indeksom (koji se piše u uglatoj zagradi) Na pr. ako je v jednodimenzionalna indeksirana varijabla tj. vektor, tada v[5] označava njen element s indeksom 5. Prvi element ima indeks 0 pa v[5] daje podatak u 6. retku vektora. Također v[i] označava element s ideksom i vektora v. Ako je a matrica tj. dvodimenzionalna indeksirana varijabla, tada A[4] [5] označava element s ineksom reda 4 i indeksom stupca 5 ( i ovdje indeksi mogu biti i varijable ili cjelobrojni izrazi). Primjer 3.1. Napisati C program koji će koristiti vektor v od 100 elemenata. Učitati 100 realnih brojeva u vektor v. Naći najmanji i najveći element u vektoru v, zamijeniti njihova mjesta i ispisati tako dobiveni vektor. Pri ispisu ispisati po 8 elemenata u istom redu. Alogoritam rješenja: Definiraj vektor v od 100 elemenata Za svaki i=0 do 99 učitaj v[i] Postavi imin=0 Postavi imax=0 Za svaki i=1 do 99 učini slijedeće Ako je v[i] < v[imin] postavi imin=i Ako je v(i) > v[imax] postavi imax=i Kraj Za svaki i Postavi vx=v[imin] Postavi v[imin]=v[imax] Postavi v[imax]=vx Za svaki i=0 do 99 ispiši v[i] Rješenje u C-u /* Naći najmanji i najveći broj u vektoru i zamijeniti ih */ #include <stdio.h> int main() { float v[100],vx;
23

int i,imin,imax; for (i=0;i<=99;i++) scanf("%f",&v[i]); /*Učitaj podatke*/ imin=imax=0; /* prvi, na mjestu 0, je najveći i najmanji*/ for (i=1;i<=99;i++) { if (v[i]<v[imin]) imin=i; /* Ubiljezi ako je manji */ if (v[i]>v[imax]) imax=i; /* Ubiljezi ako je veci */ } vx=v[imin]; /* Zamijeni mjesta */ v[imin]=v[imax]; v[imax]=vx; for (i=1;i<=100;i++) /* Ispiši redni broj i podatak iz vektora {printf("%9.3f",v[i-1]); if(i%8==0) printf("\n"); /* Svaki 8. u novi red */ } } Komentar rješenja:

*/

Algoritam rješenja svodi se na nalaženje mjesta najmanjeg (imin) i najvećeg (imax) broja. Na početku je definiran racionalni vektor v od 100 mjesta a zatim u njega učitamo 100 brojeva. Indeksi mjesta u vektoru, kamo se brojevi učitavaju idu od 0 do 99. U programu učitavanje vršimo u petlji tako da se scanf funkcija izvršava 100 puta. imin i imax određuju položaj najmanjeg i najvećeg broja. U početku to je prvi element vektora s indeksom 0 (koji je i najmanji i najveći dok ne ispitamo neki drugi). Zatim ispitujemo sve ostale elemente (1. do 99.) i uvijek mjesto najmanjeg bilježimo s imin a najvećeg s imax. Po završetku petlje ta dva broja daju mjesto najmanjeg i najvećeg člana u vektoru. Zamjenu obavljamo pomoću neophodne treće varijable vx. Ispis po 8 brojeva u redu obavljamo tako, da varijablu i iterativno povećavamo od 1 do 100 i isipisujemo i-1 član vektora. Ispis ide u isti red. Za slučaj da je i djeljivo s 8 (i%8==0) obavlja se prelaz u novi red naredbom printf("\n"). Zadatak 3.1. Napisati C program koji će koristiti vektor v od 50 cijelih brojeva. Učitati 50 cijelih brojeva u vektor v. Naći srednju vrijednost tih brojeva i ispisati samo one brojeve, koji su veći od srednje vrijednosti. Zadatak 3.2. Napisati C program koji će koristiti dva vektora v1 i v2 od po 100 elemenata. Učitati cijeli broj m koji mora biti manji od 101. Ako taj uvjet nije ispunjen ispisati poruku "Broj elemenata je prevelik, ponovite" i ponovo učitati m. Učitati m elemenata u vektore v1 i v2. Zamijeniti položaje elemenata u vektoru v2 tako da se zamijene prvi i posljednji, 2. i pretposljednji i t.d. Naći i ispisati skalarni produkt učitanog vektora v1 i tako dobivenog vektora v2 (skalarni produkt vektora jednak je sumi produkata odgovarajućih članova). Zadatak 3.3. Napisati C program koji će koristiti vektor x od 200 elemenata. Učitati broj m koji mora biti manji od 201 i veći od nule. Ako taj uvjet nije zadovoljen ispisati poruku "Pogrešno zadan broj
24

elemenata vektora" i prekinuti rad. Ako je m ispravan, učitati m realnih brojeva u vektor x. Naći najmanji i najveći član xmin i xmax vektora. Naći i ispisati sve članove vektora koji su veći od xmax/2 i manji od xmin*2. Ispis treba imati izgled: Članovi veći od xmax/2 i manji od xmin*2 su: xxxxxx.xx xxxxxx.xx Zadatak 3.4. Napisati C program koji će koristiti vektor y od 50 elemenata. Učitati 50 realnih brojeva. Ako je učitani broj negativan, staviti ga u vektor s promjenjenim predznakom. Ako je učitani broj jednak nuli ne staviti ga u vektor. Naći geometrijsku sredinu svih članova vektora. Ispisati one članove vektora koji su manji od geometrijske sredine. Zadatak 3.5. Za potrebe nekog sportskog natjecanja kakvo je npr. alpsko skijanje, potrebno je za svakog takmičara odrediti mjesto koje je on zauyeo na temelju postignutog rezultata (vremena) t. Svaki takmičar ima svoj startni broj s. Napisati C program koji će učitavati podatke o startnom broju takmičara i o njegovom postignutom vremenu t i ispisati poruku: Takmičar xxx, vrijeme xxxx.xx ; xxx. mjesto Kada su učitani svi podaci (kada je takmičenje završeno) program treba ispisati redoslijed svih takmičara. Taj ispis treba imati izgled: Br. Takm. Vrijeme 1 2 xxx xxxx.xx xxx xxxx.xx

Zadatak 3.6. Dat je spoj otpornika prema slici 3.1. Napisati C program koji će učitati u jedan vektor podatke o otprima Ra u horizontalnim granama a u drugi vektor podatke o otporima Rb u vertikalnim

1 Ra Rb

Slika 3.1

2

granama. Predvidjeti mogućnost do 100 otpora Ra i Rb. Naći i ispisati vrijednost otpora mjerenog na točkama 1 i 2. Formate učitavanja i ispisa izabrati proizvoljno.
25

Primjer 3.2. Sortiranje (poredanje) podataka. Napisati C program koji će najprije učitati 100 brojeva u vektor v, a nakon toga poredati te brojeve po rastućem redoslijedu i tako poredane brojeve ispisati. Algoritam rješenja: Definiraj vektor v od 100 elemenata Za svaki i od 0 do 99 učitaj v[i] Postavi Sortiran=false Postavi m=100 Sve dok je Sortiran=false čini slijedeće: Za svaki j=0 do m-2 učini slijedeće: Postavi sortiran=true Ako je v[j]>v[j+1] tada čini /* Zamijeni v[j] s v[j+1]*/ Postavi vx=v[j] Postavi v[j]=v[j+1] Postavi v[j+1]=vx Postavi Sortiran=false Kraj Ako je.. Kraj za svaki j Smanji m za 1 Kraj Sve dok je Sortiran=false Za svaki i=0 do 99 ispiši v[i] Rješenje u C-u: /* Sortiranje brojeva u vektoru v - Bubble Sort */ # include <stdio.h> int main() { float v[100],vx; int i,j,Sortiran,m; for (i=0;i<=99;i++) scanf("%f",&v[i]); /*Učitaj podatke*/ m=100; Sortiran=false; while (!Sortiran) {Sortiran=true; for (j=0;j<=m-2;j++) if (v[j]>v[j+1]) {vx=v[j]; v[j]=v[j+1]; v[j+1]=vx; Sortiran=false;
26

} m--; } for (j=0;j<=99;j++) printf("%10.3f\n",v[j]); return 0; } Komentar rješenja: Suština algoritma se sastoji u tome, da se svaki broj u vektoru (v[j]) uspoređuje sa idućim (v[j+1]), pa ako oni još nisu u redoslijedu (ako je prethodni veći od idućeg), vrši se njihova zamjena. U tom slučaju se i indikator Sortiran postavlja na false. Ovo se obavlja iterativno sve dok se svi brojevi ne poredaju, pri čemu indikator Sortiran postaje true i prelazi se na ispis poredanih podataka. Za prikazani algoritam često se koristi engl. naziv "bubble sort". Zadatak 3.7. Napisati C program koji će koristiti vektor x od 200 elemenata i učitati cijeli broj M. Taj broj mora biti veći od 1 i manji od 201. Ako taj uvjet nije zadovoljen ispisati poruku "POGREŠNO ZADAN BROJ PODATAKA M" i ponoviti učitavanje broja M. Ako je M ispravan, učitati M realnih brojeva u vektor x. Naći medijan (srednji član) učitanih brojeva. (Medijan je broj koji se nalazi na sredini poredanog tj. sortiranog skupa. Ako je broj elemenata (ovdje broj M) u skupu neparan, medijan je srednji član; ako je taj broj paran, medijan je srednja vrijednost elemenata s ineksima M/2-1 i M/2). Koristiti algoritam sortiranja iz primjera 3.2. Formate ispisa izabrati proizvoljno. Zadatak 3.8. Napisati C program koji će koristiti tri vektora: SIFRA, CIJENA i KOLIC svaki od po 300 elemenata. Učitati podatke u sva tri vektora. Podaci u vektoru SIFRA su šifre materijala na nekom skladištu. Podaci u vektoru CIJENA predstavljaju cijenu pojedinog materijala a podaci u vektoru KOLIC predstavljaju količinu materijala na skladištu. Naći i ispisati ukupnu vrijednost zaliha materijala na skladištu. Ispisati šifre onih materijala, čije vrijednosti zaliha su veće od 1/10 ukupne vrijednosti zaliha. Formate ispisa izabrati proizvoljno. Zadatak 3.9. Put S po kojem se kreće materijalna točka zadan je vektorski u 100 točaka kordinatama SX i SY. Sila F koja djeluje na materijalnu točku u tim točkama zadana je također vektorski u svakoj toj točki komponentama FX i FY. Napisati C program koji će učitati svih 100 komponenata puta SX i SY i svih 100 komponenata sile FX i FY i naći i ispisti rad koji je obavljen gibanjem materijalne točke po zadanom putu kada na nju djeluje zadana sila. (rad je jednak skalarnom produktu sile i puta).

27

Primjer 3.3. Podaci o broju proizvedenih dijelova na nekom stroju bilježe se automatski u datoteke na disku. Pohranjeni podaci sadrže: Podatak o stroju (STROJ) zapisan kao dvoznamenkasti cijeli broj (u fomatu %2d). Taj podatak, ako je ispravan, treba biti broj od 1 do 12. Podatak o danu u tjednu (DAN) je u formatu %1d (broj od 1 do 6). Podatak o broju proizvedenih komada (KOMADA) zapisan kao 5 znamenkasti broj. Napisati C program koji će čitati opisane podatke s diska iz datoteke proizvod.dat i prikazati podatke u tabeli. U recima tabele treba prikazati podatke za pojedine strojeve, dok po stupcima treba prikazati pojedine dane. Zadnji redak i stupac prikazuju ukupne podatke za sve strojeve u jednom danu odnosno za sve dane ali za pojedini stroj. Ispisati dobivenu tabelu s odgovarajućim naslovom i opisom iznad pojedinog stupca i ispred pojedinog reda. Koristiti tabelu u obliku dvodimenzionalne indeksirane varijable TAB. Algotitam rješenja: Definiraj tabelu TAB od 13 redaka i 7 stupaca Za svaki i=0 do 12 učini Za svaki j=0 do 6 postavi TAB[i][j]=0 Otvori datoteku proizvod.dat Sve dok ne nastupi kraj datoteke proizvod.dat čini Učitaj podatke STROJ, DAN i KOMADA iz zadane datoteke Ako je DAN>0 i DAN<7 i STROJ>0 i STROJ<13 tada čini Povećaj TAB[STOJ-1][DAN-1] za KOMADA Povećaj TAB[12][DAN] za KOMADA Povećaj TAB[STROJ-1][6] za KOMADA Povećaj TAB[12][6] za KOMADA U suprotnom ispiši poruku o pogreški Kraj Ako je... Kraj Sve dok Ispiši naslov tabele Ispiši naslov iznad svakog stupca tabele Za svaki i=1 do 12 učini slijedeće Za svaki j=1 do 7 ispiši TAB[i-1][j-1] Za svaki j=1 do 7 ispiši TAB[12][j-1] Kraj za svaki i Rješenje u C-u: /* TABELIRANJE PODATAKA O PROIZVODNJI */ #include <stdio.h> int main ( ) { int TAB[13][7],i,j,DAN,STROJ,KOMADA; FILE *filin;
28

filin=fopen("proizvod.dat","r"); if(filin==NULL) {printf("Nema datoteke proizvod.dat"); return 1; } for (i=0;i<=12;i++) for (j=0;j<=6;j++) TAB[i][j]=0; while(!feof(filin)) {fscanf(filin,"%d%d%d",&STROJ,&DAN,&KOMADA); if (STROJ>0 && STROJ<13 && DAN>0 && DAN<7) {TAB[STROJ-1][DAN-1]+=KOMADA; TAB[STROJ-1][6]+=KOMADA; TAB[12][DAN-1]+=KOMADA; TAB[12][6]+=KOMADA;} else printf("\nPogrešni podaci za %5d stoj i %5d dan \nOvi podaci nisu uzeti u obzir",STROJ,DAN); } /* KRAJ PODATAKA; ISPIS TABELE */ printf("\n PODACI O PROIZVODNJI DIJELOVA\n\n\nD A N I"); printf(" PON. UTO. SRI. CET. PET. SUB. UKUPNO\nSTROJ:"); printf(" -------------------------------------------\n\n"); for (i=1;i<=12;i++) { for(j=1;j<=7;j++) printf("%7d",TAB[i-1][j-1]); printf("\n"); } printf("\nUK:"); for(j=1;j<=7;j++) printf("%7d",TAB[12][j-1]); printf("\n"); return 0; } Komentar rješenja: Zabilježene podatke tabelirat ćemo pomoću matrice (dvodimenzionalne indeksirane varijable) koja ima 13 redaka i 7 stupaca. Pojedini redak odnosi se na pojedini stroj (redak s indeksom 0 za stoj broj 1, s indeksom 1 za stroj 2 i t.d.) dok će zadnji redak biti sumarni redak u koji ćemo stavljati zbroj. Stupci se na isti način odnose na pojedine dane (od 1 do 6), a zadnji stupac je sumarni i sadrži zbroj ostalih stupaca reda. Cijelu matricu najprije svodimo na nulu kako bi mogli dodavati učitani podatak u određen element matrice. Podatke učitavamo iz datoteke tako da najprije otvorimo tu datoteku. Ako datoteke nema (filin==NULL) ispisujemo poruku i završavo program (s return 1). Ako datoteka postoji, koristimo fscanf proceduru za čitanje iz te datoteke. Ako su učitani podaci (STROJ i DAN) ispravni, pomoću njih direktno "adresiramo" element matrice TAB, tj. STROJ-1 određuje redak a DAN-1 stupac tabele, koji treba povećati za broj proizvedenih komdada. Na sličan način povećava se i sumarni redak i stupac. Kada nastupi kraj podataka, prestat će se obavljati petlja u kojoj se učitavaju i tabeliraju podaci. Tabela s traženim podacima sad je već popunjena i potrebno je samo ispisati odgovarajuće tekstove naslova i same podatke.
29

Zadatak 3.10. Napisati C program koji će učitavati podatke o godini upisa (GOD) i spolu (SPOL) studenata. GOD je cijeli broj koji može biti od 1 do 4. Spol je cijeli broj koji može biti 1 (muški) ili 2 (ženski). Učitane podatke treba tabelirati i dobivenu tabelu ispisati tako, da njen izgled bude slijedeći: PODACI O STUDENTIMA PO GODINAMA MUŠKI ŽENSKI UKUPNO 1. GOD. xxxx xxxx xxxx 2. GOD. xxxx xxxx xxxx 3. GOD. xxxx xxxx xxxx 4. GOD. xxxx xxxx xxxx UKUPNO: xxxx xxxx xxxx Zadatak 3.11. Učitavati iste podatke kao i u zadatku 3.10. ali u tabeli prikazati relativne podatke u postocima, tako da tabele poprimi izgled: RELATIVNI PODACI O STUDENTIMA PO GODINAMA MUŠKI ŽENSKI 1. GOD. 2. GOD. 3. GOD. 4. GOD. UKUPNO: xxx.xx% xxx.xx% xxx.xx% xxx.xx% xxx.xx% xxx.xx% xxx.xx% xxx.xx% xxx.xx% xxx.xx%

Zadatak 3.12. Napisati C program koji će koristiti matricu A od 30 redaka i stupaca. Učitati cijele brojeve m i n koji oba moraju biti manji od 30. Ako taj uvjet nije ispunjen, završiti program. Učitati m * n realnih brojeva u m redaka i n stupaca matrice A. Naći sumu prvog retka (s indeksom 0) matrice A i tu sumu staviti na n+1 mjesto (stupac s indeksom n) prvog retka. Ispisati članove 1. retka tako, da ispis poprimi izgled: BROJEVI U 1. RETKU SU: 1 xxxxx.xx 2 xxxxx.xx .. ........ .. ........ UK: xxxxx.xx Zadatak 3.13. Napisati C program koji će učitati 64 realna broja u matricu X od 8 redaka i stupaca. U svakom retku matrice, u kojem je dijagonalni član različit od nule, podijeliti sve članove retka (uključujući i dijagonalni) sa dijagonalnim članom. Ako je dijagonalni član jednak nuli, sve članove u tom retku postavit na nulu, osim dijagonalnog, koji treba postaviti na 1. Ispisati dobivenu matricu. Formate ispisa izabrati proizvoljno, ali tako, da ispis bude u 8 redaka i stupaca.

30

Zadatak 3.14. Napisati C program koji će najprije učitati realni broj X a zatim učitati 36 realnih brojeva u 6 redaka i stupaca matrice Z. Podijeliti sve članove ispod dijagonale u matrici Z sa X. Pomnožiti sve članove iznad dijagonale sa X (članove na dijagonali ne promijeniti). Tako dobivenu matricu ispisati. Ispis treba imati oblik: MATRICA Z: 1.redak xxxx.xx xxxx.xx xxxx.xx xxxx.xx xxxx.xx xxxx.xx . .. .. .. .. .. .. .. 6.redak xxxx.xx xxxx.xx xxxx.xx xxxx.xx xxxx.xx xxxx.xx Primjer 3.4. Množenje matrica: Dvije matrice A i B mogu se pomnožiti tj. može se naći matrica C tako da je C=A*B ako je broj stupaca matrice A jednak broju redaka matrice B. Pojedini član u matrici C tj.C[i] [j] postaje jednak skalarnom produktu i-tog retka matrice A i j-tog stupca matrice B. Razraditi algoritam i napisati C program koji će učitati broj redaka m matrice A, broj stupaca n matrice A i broj stupaca k matrice B. Iza toga program treba učitati m*n realnih brojeva u matricu A i k*n brojeva u matrice B te naći i ispisati matricu C=A*B. Algoritam rješenja: Definiraj matrice A, B i C od 30 redaka i stupaca Sve dok je m>30 ili n>30 ili k>30 čini slijedeće Učitaj m (broj redaka) i n (broj stupaca) matrice A i k (broj stupaca) matrice B. Ako su m ili n ili k veći od 30 spiši poruku o pogrešno zadanim m, n ili k Kraj sve dok... /* Učitaj brojeve u matricu A */ Za svaki i=0 do m-1 i svaki j=0 do n-1 učitaj A[i][j] /* Učitaj brojeve u matricu B */ Za svaki i=0 do n-1 i za svaki j=0 do k-1 učitaj B[i][j] /* Množenje matrica: Nađi C[i][j] kao skalarni produkt i-tog retka matrice A i j-tog stupca matrice B */ Za svaki i=0 do m-1 čini slijedeće Za svaki j=0 do k-1 učini slijedeće Postavi C[i][j]=0 Za svaki l=0 do n-1 povećaj C[i][j] za A[i][l]*B[l][j] Ispiši C[i][j] Kraj za svaki j Krak za svaki i Rješenje u C-u: /* Množenje matrica C=A*B */ #include <stdio.h> int main() {
31

float A[30][30],B[30][30],C[30][30]; int m,n,k,i,j,l; /* Učitaj m, n i k (broj redaka i stupaca A matrice i stupaca B matrice. Ponavljaj dok se ne zadaju ispravni podaci */ m=31; while(m>30 || n>30 || k>30) { scanf("\n%d%d%d",&m,&n,&k); if(m>30 || n>30 || k>30) printf("\nPogresno zadana veličina matrice, ponovite!"); } /* UČITAJ MATRICU A */ printf("\nMatricu A molim\n"); for (i=0;i<=m-1;i++) for(j=0;j<=n-1;j++)scanf("%f",&A[i][j]); /* UČITAJ MATRICU B */ printf("\nMatricu B molim \n"); for (i=0;i<=n-1;i++) for(j=0;j<=k;j++) scanf("%f",&B[i][j]); /* MNOZENJE MATRICA */ for(i=0;i<=m-1;i++) for(j=0;j<=n;j++) {C[i][j]=0; for(l=0;l<=n-1;l++) C[i][j]+=A[i][l]*B[l][j]; } /* ISPIS REZULTATA */ printf ("\nUmnozak zadanih matrica je:\n"); for (i=0;i<=m-1;i++) {for(j=0;j<=k-1;j++) printf("%7.2f",C[i][j]); printf("\n"); } return 0; } Komentar rješenja: Pojedini član matrice C nalazi se kao skalarni produkt retk i stupca matrica A i B. Zbog toga se u množenju najprije član C[i][j]) svodi na nulu a zatim mu se dodaju umnošci odgovarajućih članova. To se obavlja za svaki redak matrice A i svaki stupac matrice B. Sam problem je takav, da se C-om rješava vrlo efikasno. Zadatak 3.15. Razraditi algoritam i napisati C program koji će koristiti matricu X od 50 redaka i stupaca i vektore Y i Z od 50 članova. Učitati cijeli broj m i zatim m*m realnih brojeva u matricu X i m realnih brojeva u vektor Y. Naći i ispisati vektor Z=X*Y. Koristiti algoritam množenja iz prethodnog primjera.
32

Zadatak 3.16. Razraditi algoritam i napisati C program koji će koristiti matrice A, B i C od po 40 redaka i stupaca. Učitati cijeli broj m i zatim m*m realnih brojeva u matricu A. Iz matrice A formirati matricu B zamjenom redaka sa stupcima (transponirati matricu A). Naći i ispisati C=A*B. Zadatak 3.17. Razraditi algoritam i napisati C program koji će učitati prirodan broj m, m*m realnih brojeva u matricu A i naći i spisati matricu A*A. Zadatak 3.18. Razraditi algoritam i napisati C program koji će učitati prirodan broj m, m*m realnih brojeva u matricu X i realni broj y. Naći matricu Z kao kvadrat matrice X. Pomnožiti svaki član zadnjeg stupca matrice Z s y. Učitati m realnih brojeva u vektor V i naći i ispisati Z*V. Formate ispisa izabrati proizvoljno. Zadatak 3.19. Razraditi algoritam i napisati C program koji će učitati 25 realnih brojeva u matricu A koja ima 5 redaka i stupaca. Učitati jednoznamenkasti prirodan broj n i naći i ispisati n-tu potenciju matrice A. Ispis treba imati izgled: x. POTENCIJA MATRICE A(5,5) GLASI .xxxExx .xxxExx .xxxExx .xxxExx .xxxExx .... .... .... .... .... .xxxExx .xxxExx .xxxExx .xxxExx .xxxExx (Koristiti E format za ispis). Primjer 3.5. Gaussova metoda eliminacije. Matrica koja ima sve članove ispod glavne dijagonale jednake nuli naziv se gornja trokutasta matrica. Svaka regularna matrica može se svesti na oblik gornje trokutaste matrice koristeći slijedeće elementarne transformacije nad recima matrice: bilo koji redak može se pomnožit brojem različitim od nule; bilo koja dva retka mogu zamijeniti svoja mjesta; bilo koji redak prethodno pomnožen nekim brojem može se dodati nekom drugom retku. Računski postupak kojim se matrica svodi na oblik gornje trokutaste matrice naziva se Gaussova metoda eliminacije. Ovdje ćemo promatrati samo regularne matrice jer je općenit postupak složeniji. Razraditi algoritam i napisati C program koji će učitati broj n a zatim n * n realnih brojeva u matricu A te svesti matricu na gornju trokutastu i ispisatu je na ekran. Algoritam rješenja: Definiraj matricu A Učitaj broj redaka i stupaca n matrice A Učitaj n * n brojeva u matricu A Postavi s=1 /* U svakom stupcu k od 1. do n-1. svedi članove ispod dijagonalnog na nulu */ Za svaki k=0 do n-2 učini slijedeće
33

Ako je dijagonalni član A[k][k] jednak nuli tada čini /* Dijagonalni član je jednak nuli, pronađi član u k-tom stupcu ispod dijagonale koji je različit od 0. Ako takvog nema matrica nije regularna i ne može se svesti na gornju trokutastu */ Postavi i=k+1 Sve dok je i<n-1 i A[i][k] jednako nuli povećaj i za 1 Ako je A[i][k] jednako nuli tada Ispiši poruku da matrica nema inverznu Prekini dalji račun Kraj ako je A[i][k]=0 Kraj sve dok /* Član u i-tom retku je različit od nule, zamijeni i-ti i k-ti redak */ Za svaki j=k do n-1 učini slijedeće Postavi z=A[k][j] Postavi A[k][j]=A[i][j] Postavi A[i][j]=z Kraj Za svaki j /* Promijeni predznak varijabli s jer je izvršena zamjena redaka */ Postavi s=-s Kraj Ako je dijagonalni član jednak nuli /* Svedi članove ispod dijagonale na nulu */ Za svaki redak i=k+1 do n-1 učini slijedeće Nađi multiplikator xm=A[i][k]/A[k][k] Za svaki stupac j=k do n-1 smanji A[i][j] za xm*A[k][j] Kraj Za svaki redak i Kraj Za svaki k Ako je A[n][n]=0 tada Ispiši da matrica nema inverznu Zaustavi dalje računanje Kraj ako je A[n][n]=0 Pomnoži A[n][n] sa s /* Uspostavi odgovarajući predznak */ Ispiši dobivenu matricu A Rješenje u C-u: /* Gauss-Jordanova redukcija */ #include <stdio.h> main() { float A[30][30],z,xm; int n,i,j,k,s; printf("\nGauss-Jordanova redukcija\n"); printf("\nMolim broj redaka matrice"); scanf("%d",&n); printf("\nMolim podatke za matricu u %d redaka i stupaca\n",n); for(i=0;i<=n-1;i++)
34

for(j=0;j<=n-1;j++)scanf("%f",&A[i][j]); s=1; /* Iteracija za svaki stupac: svodjenje na nulu clanova ispod dijagonale */ for (k=0;k<=n-2;k++) {if (A[k][k]==0) /* Potrebno je izvrsiti zamjenu redaka; nadji clan u k-tom stupcu razlicit od nule; ako ga nema, ispisi poruku */ {for (i=k+1; i<n-1 && A[i][k]==0; i++) if (i==n-1 && A[i][k]==0) {printf("\nMatrica se ne moze svesti na gornju trokutastu."); return 1; } /* Zamijeni i-ti i k-ti redak */ for (j=k;j<=n-1;j++) { z=A[k][j]; A[k][j]=A[j][k]; A[j][k]=z; } s=-s; } /* Svodjenje na nulu članova ispod dijagonale */ for (i=k+1;i<=n-1;i++) { xm=A[i][k]/A[k][k]; for (j=k;j<=n-1;j++) A[i][j]-=xm*A[k][j]; } } if (A[n][n]==0) {printf("\nMatrica se ne moze svesti na gornju trokutastu."); return 1; } A[n][n]=A[n][n]*s; /* Postavi ispravni predznak */ /* Ispis rezultata */ for (i=0;i<=n-1;i++) {for (j=0;j<=n-1;j++) printf("%7.2f",A[i][j]); printf("\n"); } return 0; } Komentar rješenja: Algoritamsko rješenje svodi se na iterativni postupak u petlji u kojoj se povećva varijabla k. Svođenje članova na nulu obavlja se za sve redove ispod dijagonale i to u svakom stupcu od prvog do predzadnjeg (k ide od 0 do n-2) jer u zadnjem stupcu više nema članova ispod dijagonalnog. Ako je dijagonalni član jednak nuli pa nije moguće s njim dijeliti, pronalazi se redak ispod dijagonale koji u
35

tom (k-tom) stupcu ima vrijednost različitu od nule pa se ti reci zamijene i varijabli s se promijeni predznak. Ako takav redak ne postoji i zamjena nije moguća, matrica se ne može svesti na gornju trokutastu pa se ispisuje odgovarajuća poruka i završava dalje računanje. Za dijagonalni član različit od nule obavlja se množenje i odbijanje da bi se dobile nule u svim recima ispod dijagonale. Pri tome se ne uzimaju stupci lijevo od dijagonale (j ide od k do n-1) jer su ti članovi već svedeni na nulu u prethodnim iteracijama. Nakon obavljene iteracije po k (do predzadnjeg stupca), može se dogoditi da je zadnji dijagonalni član jednak nuli. Tada se matrica opet ne može svesti na gornju trokutastu pa se ispisuje odgovarajuća poruka. Program napisan u C-u točno slijedi dati algoritam. Učitavanje i ispis matrice A obavljen je pomoću iteracija tako da i pri učitavanju i pri ispisu imamo prikazanu matricu u n redaka i stupaca. Zadatak 3.20. Razraditi algoritam i napisati C program koji će učitati prirodan broj n i n*n realnih brojeva u matricu A a zatim svesti matricu na gornju trokutastu. Ispisati početnu matricu i matricu nakon svake iteracije za svaki stupac. Zadatak 3.21. Transponirana matrica je ona u kojoj su zamijenjeni stupci s recima. Napisati C program koji će učitati matricu A od 8 redaka i stupaca, transponirati je i svesti transponiranu matricu na gornju trokutastu. Dobivenu matricu ispisati tako da se u svakom redu ispiše 8 10znamenkastih brojeva s tri decimalna mjesta. Zadatak 3.22. Determinanta matrice je broj koji se dobiva određenim računskim operacijama s članovima matrice. Jedan od načina računanja determinante je svođenje matrice na gornju trokutastu i nalaženje produkta dijagonalnih članova. Napisati C program koji će učitati prirodni broj M i M*M realnih brojeva u matricu A a zatim naći i ispisati determinantu od A. Zadatak 3.23. Razraditi algoritam i napisati C program koji će učitati prirodan broj m1 i m1*m1 realnih brojeva u matricu A1, učitati prirodan broj m2 i m2*m2 realnih brojeva u matricu A2. m1 i m2 moraju biti manji od 101. Naći determinanante obih matrica (D1=det(A1) i D2=det(A2) ). Naći i ispisati X=D1/D2. U slučaju da je D2=0 ispisati poruku "X nije definiran". Zadatak 3.24. Razraditi algoritam i napisati C program koji će učitati dva prirodna broja m i n (oba moraju biti manja od 21), učitati m*n realnih brojeva u matricu A i n*m realnih brojeva u matricu B. Pomnožiti matrice A i B (naći C=A*B), svesti matricu C na gornju trokutastu i ispisati tu matricu. Zadatak 3.25. Razraditi algoritam i napisati C program koji će naći rješenje sistema linearnih jednadžbi koristeći Gauss-Jordanovu redukciju. Program treba učitati prirodni broj m (manji od 51) koji određuje broj jednadžbi u sistemu. Iza toga program treba učitati m*(m+1) koeficijenata jednadžbi. Na pr. ako se sistem sastoji od 3 jednadžbe (m=3) zadane kao -3x1 + x2 + x3 = 2 -6x1 + 4x2 + 4x3 = 14 3x1 + x2 + 3x3 = 10 matrica koja opisuje sistem imat će 3 reda i 4 stupca i glasit će:
36

-3 1 1 2 -6 4 4 14 3 -1 3 10 Algortimom vrlo sličnim onom prikazanom u primjeru 3.5 svest će se ova matrica na reducirani oblik (gornju trokutastu) -3 1 1 2 0 2 2 10 0 0 4 12 Razlika u algoritmu ovdje i u primjeru 3.5 je samo u tome što računske operacije s članovima matrice moraju obuvaćati i m+1. stupac tj. članove sa desne strane jednadžbe (jednažbu množimo tako, da obje strane pomnožimo istim brojem). Iz dobivene reducirane matrice dobivaju se nepoznanice ("unatrag" od x3 prema x1) tako da je x3 = 12/4 = 3 (Slijedi iz zadnjeg reda reducirane matrice) x2 = (10-2*x3)/2 = (10-6)/2 = 2 (iz drugog reda ) x1 = (2-x3-x2)/-3 = (2-3-2)/-3 =1 (iz prvog reda ) Razraditi algoritam i napisati C program koji će za učitane koeficijente jednadžbi naći i ispisati rješenja x1 do xm. Ako zadana matrica nije regularna, ispisati poruku da sistem nema rješenja. Primjer 3.6. Invertiranje matrice. Kvadratnu matricu A možemo invertirati (ako je regularna) i dobiti B=inv(A) sa svojstvom da je A*B=I (I je jedinična matrica, matrica kojoj su svi članovi osim dijagonalnih jednaki nuli dok su dijagonalni članovi jednaki 1). Algoritam invertiranja matrice sastoji se u tome da se operacije slične kao kod Gauss-Jordanove redukcije primjene istovremeno na zadanu matricu i na jediničnu matricu. Od zadane matrice A i odgovarajuće jedinične matrice načinimo blok matricu A;I. Primjenom Gaussovih elementarnih transformacija nad recima blok matrice A;I ista se može svesti na oblik I;B gdje je I ponovno jedinična matrica a B inverzna matrica matrice A. Ovdje prikazan algoritam invertira matricu od n redaka i stupaca na opisan način. Algoritamsko rješenje: Definiraj matricu A od 50 redaka i 100 stupaca Učitaj broj redaka i stupaca n zadane matrice Učitaj zadanu matricu u prvih n stupaca matrice A Svedi preostalih n stupaca matrice A na jediničnu /*U svakom od prvih n stupaca (k=0 do n-1) svedi članove ispod i iznad dijagonale na 0 a dijagonalni član svedi na 1*/ Za svaki k=0 do n-1 učini slijedeće Ako je dijagonalni član A[k,k] jednak nuli tada /* Dijagonalni član je 0; pronađi član u k-tom stupcu različit od nule i zamijeni redove. Ako takvog nema ispiši poruku da matrica nema inverznu*/ Ako je k=n-1 ispiši poruku da matrica nema inverznu i prekini dalje računanje
37

Postavi i=k Sve dok je A[i,k]=0 i i<=n povećaj i za 1 Ako je i>n ispiši poruku da matrica nema inverznu i prekini dalje računanje. /* Član u i-tom redu je različit od nule; zamijeni i-ti i k-ti redak */ Za svaki j=k do 2*n-1 učini slijedeće Postavi z=A[k,j] Postavi A[k,j]=A[i,j] Postavi A[i,j]=z Nastavi sa slijedećim j Kraj ako je A[k,k]=0 /* Podijeli redak sa dijagonalnim članom */ Postavi xm=A[k,k] Za svaki j=k do 2 x n-1 podijeli A[k,j] s xm /*Svedi na nulu članove van dijagonale K-tog stupca */ Za svaki i=0 do n-1 učini slijedeće Ako je i != k tada čini slijedeće Postavi xm=A[i,k] Za svaki j=k do 2 x n-1 učini slijedeće Od A[i,j] odbij A[k][j]*xm Nastavi sa slijedećim j Kraj ako je i !=j Nastavi sa slijedećim i Nastavi sa slijedećim k /*Ispis invertirane matrice */ Za svaki i=0 do n-1 učini slijedeće Za svaki j=n+1 do 2 x n-1 ispiši A[i,j] Nastavi sa slijedećim i Rješenje u C-u /* UCITAJ ZADANU MATRICU (BROJEVE U SVAKI REDAK I STUPAC) */ #include <stdio.h> main() { float A[50][100],z,xm; int n,i,j,k; printf("\nInvertiranje matrice\n"); printf("\nMolim broj redaka matrice "); scanf("%d",&n); printf("\nMolim podatke za matricu u %d3 redaka i stupaca\n",n); for(i=0;i<=n-1;i++) for(j=0;j<=n-1;j++) scanf("%f",&A[i][j]); /* Nacini jedinicnu maticu od n+1. do 2n-tog stupca */ for (i=0;i<=n-1;i++) for(j=n;j<=2*n-1;j++) if (i==j-n) A[i][j]=1;
38

else A[i][j]=0; /* Iteracija za svaki stupac: svodjenje na nulu clanova ispod dijagonale for (k=0;k<=n-1;k++) { if (A[k][k]==0) {for (i=k;A[i,k]==0 && i<=n-1;i++); if(i>n-1) { printf("\nMatrica nema inverznu\n"); return 1; } /* Zamijeni i-ti i k-ti redak */ for (j=k;j<=2*n-1;j++) { z=A[k][j]; A[k][j]=A[j][k]; A[j][k]=z; } } /* Podijeli redak s dijagonalnim članom */ xm=A[k][k]; for (j=0;j<=2*n-1;j++) A[k][j]/=xm; /* Svedi na 0 članove van dijagonale k-tog stupca */ for (i=0;i<=n-1;i++) if (i!=k) { xm=A[i][k]; for (j=k;j<=2*n-1;j++) A[i][j]-=A[k][j]*xm; } } /* Ispisi inverznu matricu */ printf("\nInverzna matrica je \n"); for (i=0;i<=n-1;i++) {for (j=n;j<=2*n-1;j++) printf("%7.2f",A[i][j]); printf("\n"); } return 0; } Komentar rješenja:

*/

Algoritam je, kao što je već rečeno, vrlo sličan algoritmu svođenja matrice na gornju trokutastu. Ovdje samo koristimo matricu A od n redaka i 2*n stupaca. Lijevi dio ove matrice sadrži zadanu matricu, desni dio, od n+1-og do 2*n-tog stupca je sveden početno na jediničnu matricu i to tako da se svi članovi svedu na nulu osim onih kod kojih je broj reda i (koji poprima vrijednosti od 1 do n) jednak broju j-n (j ide od n do 2*n-1). Ti članovi postaju 1 (na pr. u prvom redu za i=0 u n+1. stupcu za j=n član postaje jednak 1). Sve računske operacije se obavljaju na cijeloj matrici (ne samo na zadanoj, nego i na proširenom dijelu). Svođenje na nulu obavlja se tako, da se najprije tekući (k-ti) redak podijeli sa dijagonalnim članom. (Varijabla xm služi zato, da se sačuva vrijednost dijagonalnog člana nakon što smo ga podijelili sa samim sobom i sveli na 1, jer s njim treba dijeliti i ostale članove retka).
39

Svodenje članova na nulu obavlja se odbijanjem reaka i iznad i ispod dijagonale a preskače se samo redak u kojem je dijagonalni član jednak 1. Zadatak 3.26. Razraditi algoritam i napisati C program kojemu će se zadati matrica A od 12 redaka i stupaca. Program treba naći i ispisati inv(A*A) (invertiranu matricu od kvadrata matrice A). Formate učitavanja izabrati proizvoljno. Dobivena matrica treba biti ispisana u 12 redaka sa po 12 brojeva od kojih svaki zauzima 9 mjesta od kojih su dvije znamenke decimale. Zadatak 3.27. Razraditi algoritam i napisati C program koji će učitati matricu A od 8 redaka i stupaca, naći B=inv(A) i naći i ispisati C1=A*B i C2=B*A. Kakve moraju biti matrice C1 i C2 ? Formate ispisa izabrati proizvoljno. Zadatak 3.28. Razraditi algoritam i napisati C program koji će učitati prirodne brojeve m1 i m2 i matrice A i B. Matrica A ima m1 redaka i stupaca dok matrica B ima m2 redaka i stupaca. Naći i ispisati C=inv(A/det(B)) (podijeliti svaki član matrice A sa determinantom od B i dobivenu matricu invertirati). Zadatak 3.29. Razraditi algoritam i napisati C program koji će učitati prirodni broj m, m*m realnih brojeva u matricu A i m realnih brojeva u vektor B. Naći i ispisati C=inv(A)*B.

40

4. ZADACI S FUNKCIJAMA C omogućava, pored korištenja ugrađenih (prevodiočevih) funkcija i jednostavno definiranje i korištenje funkcija koje korisnik sam definira kao zasebnu programsku cjelinu. Funkcije se zbog toga nazivaju vanjskim programskim strukturama. Funkcija se aktivira ("poziva") tako da se navedene njeno ime i parametri. Parametri se pišu u zagradi iza imena funkcije. Program u kojem se funkcija koristi i koji se naziva pozivajući program, razmjenjuje podatke s funkcijom na dva načina: preko globalnih varijabli koje su tako definirane da vrijede i u pozivajućem programu i u svim funkcijama koje se iz njega pozivaju; drugi način je razmjena podataka preko parametara: pri pozivu funkcije parametre u obliku izraza, najčešće samo varijabli, pišu se u obliku popisa (jedan ili više podataka odvojenih zarezima) koji se stavlja iza imena funkcije. Time je omogućena općenitost korištenja jednom priređene funkcije. Funkcija se "napravi" tj. definira tako da se navede tip funkcije, njeno ime i u zagradi tip i imena parametara. Na primjer, definicija funkcije može biti oblika: float fun1(float x, float z , int n). Poziv ovakve funkcije ima oblik fun1(a,b,k). Simbolička imena parametara u pozivu i definiciji funkcije ne moraju biti jednaka, ali njihovi tipovi se moraju podudarati. Zato u ovom primjeru parametri a i b trebaju pri pozivu biti realni (tipa float) a parametar k treba biti cjelobrojan (tipa int). U ovom dijelu navodimo tipične primjere i zadatke za korištenje funkcija Primjer 4.1. Nalaženje nultočke funkcije f(x)=a*x*x-b*exp(x) metodom tangente (Newton-Raphsonaova metoda): Nultočka funkcije f(x) tj. rješenje jednadžbe f(x)=0 postiže se numeričkom metodom tangente na način prikazan na slici 4.1. U početno proizvoljno odabranoj točki x1 povuče se tangenta na krivulju y=f(x) u točki (x1,f(x1)). Ta tangenta siječe os x u točki x2 koja je bliže nultočki (sjecištu krivulje s osi x) od prethodne točke. Svaka naredna točka dobiva se iz prethodne pomoću izraza

xi = xi + 1 −
f(x)

f (x) f '( x )

xi+1 xi
Slika 4.1.

x

41

(f ' (x) je derivacija funkcije f(x) u točki x ). Uzastopnim ponavljanje ovog postupka dolazimo do neke točke x dovoljno blize nultočki u kojoj je apsolutna vrijednost funkcije manja od dozvoljene pogreške. Za numeričko rješavanje ovog problema potrebno je pored funkcije i njene derivacije (koje ćemo zadati odgovarajućim funkcijama) definirati početni x, dozvoljenu pogrešku (na pr. eps) i maksimalan broj iteracija koje će pogram izvoditi u nastojanju da nađe zadovoljavajuće rješenje. Algoritam i C program izgledat će ovako: Algoritam rješenja: Definiraj funkciju f(x) Definiraj derivaciju zadane funkcije kao df(x) Učitaj koeficijente a i b Učitaj početni x, dozvoljenu grešku eps i broj iteracija n Postavi i=1 Sve dok je i<=n i abs(f(x))>eps učini slijedeće Nađi x=x-f(x)/df(x) Povečaj i za 1 Kraj sve dok Ako je i<=n tada Ispiši rezultate: x,f(x) i i U suprotnom ispiši poruku da rješenje nije nađeno

42

Rješenje u C-u: # include <stdio.h> # include <math.h> float a,b; /* Globalne varijable */ float f(float x) /* Funkcija f(x) kojoj se trazi nultocka */ { return(a*x*x-exp(b*x)); } float df(float x) /* Derivacija zadane funkcije */ { return(2*a*x-b*exp(b*x)); } main() /* Glavni program */ { float x,eps; int n,i; printf("\nNewton-Raphsonova metoda\n\n"); printf("Molim koeficijenta a i b "); scanf ("%f%f",&a,&b); /* Ucitaj podatke */ printf("Molim početni x, grešku eps i broj iteracija n \n"); scanf("%f%f%d",&x,&eps,&n); for (i=1;i<=n && fabs(f(x))>eps;i++) /* Iterativno traži rješenje */ x-=f(x)/df(x); if (i<=n) /* Ispisi rezultate */ printf("\nNultocka funkcije je %9.3f , iznos funkcije je %9.3f, iteracija %3d",x,f(x),i-1); else printf("Rjesenje nije nadjeno"); } Komentar rješenja: Funkcijama f(x) i df(x) definirali smo funkciju i njenu derivaciju. Varijable a i b su globalne varijable, zajedničke za obje funkcije i glavni program, dok je x parametar koji se predaje funkcijama pri pozivu iz glavnog programa. Nakon učitavanja zadanih koeficijenata a i b i parametara računa (x, eps i n) sam račun je krajnje jednostavan. On se obavlja iterativno, najviše n puta ili dok se dobije rješenje sa zadanom točnošću. U svakoj iteraciji nalazi se nova vrijednost varijable x tako da se stara vrijednost te varijable umanji za omjer funkcije i njene derivacije na mjestu stare vrijednosti varijable x. Zadatak 4.1. Napisati C program koji će metodom tangente naći nultočku funkcije f(x)=a*ln(x)+b*x. Učitati dozvoljenu pogrešku dok broj itracija postaviti na 100 a početni x na 0.5. Također učitati parametre a i b. Zadatak 4.2. Napisati C program koji će učitati cijele brojeve k, m i n i realne brojeve x1 i x2. Program treba izračunati i ispisati vrijednosti funkcije f(x)=exp(-n*x)*sin(m*x) za k vrijednosti varijable x tako da je početna vrijednost varijable x=x1 a konačna vrijednost x=x2.
43

Zadatak 4.3. Razraditi algoritam i napisati C program koji će naći sjecište krivulja f1(x)=ln(a*x) i f2(x)=b*sin(x). Brojeve a i b učitati kao realne varijable a i b. Uputa: koristiti metodu tangente i naći nultočku funkcije f(x)=f1(x)-f2(x). Zadatak 4.4. Put koji pređe neko tijelo funkcija je vremena zadana izrazom s(t)=a*t**2+b*ln(t+1)ln(c*t+1)/ln(t+1). Napisati C program koji će učitati parametre a, b i c (u realne varijable a, b i c) i vrijeme t0 (u cjelobrojnu varijablu t0) i naći i ispisati pređeni put s i brzinu v za svaki t od 0 do t0 u koraku po 1. Uputa: Brzina v(t) je derivacija puta s(t) po vremenu t. Derivaciju računati približno numerički po izrazu v(t)=(s(t+dt)-s(t))/dt uzimajući dt dovoljno malenim (na pr. dt=t/100). Zadatak 4.5. Kondenzator kapaciteta C puni se iz istosmjernog izvora napona U0 preko otpornika otpora R. Napon na kondenzatoru vremenski raste po relaciji uc = U 0 (1 − e
− t RC

) dok napon na otporniku opada po izrazu ur(t)=U0-uc(t)

Napisati C program koji će učitati vrijednost kapaciteta C u mikrofaradima, otpora R u kiloohmima i napona U0 u voltima te naći i ispisati vrijednosti napona na kondenzatoru i otporniku za t od 0 do 3*R*C u koraku po R*C/10. Zadatak 4.6. Krivulja y=f(x) zadana je parametarski izrazima y(t)=sin(a*t+f), x(t)=sin(b*t) (Tako definirane krivulje zovu se Lissajousove krivulje). Napisati C program koji će učitati podatke a, b i f (u realne varijable a, b i f) te naći i ispisati koordinate zadane krivulje u 100 točaka za t=0 do 2*π(π=3.14159). Zadatak 4.7. Napisati C program koji će koristiti funkcije i računati i ispisivati vrijednosti funkcija f1(x)= sin(x)/x i f2(x)=f1(x)^x. (znak ^ označava potenciranje). Varijabla x treba poprimiti vrijednosti od početnog 1 do učitanog xmin (xmin<1) tako da se svaki naredni x smanji za učitanu vrijednost xkor (xkor<0.1). Ispis treba imati oblik (ako je xkor=0.02): Funkcije f1(x)=sin(x)/x i f2(x)=(sin(x)/x)^x x 1.00 0.98 i t.d. sin(x)/x 0.84147 0.84744 (sin(x)/x)^x 0.84147 0.85025

44

Primjer 4.2. Površina ispod krivulje y=f(x) u intervalu od x1 do x2 može se približno računati trapeznom metodom tako, da se cijela površina aproksimira određenim brojem trapeza. Slika 4.2 prikazuje to načelo. Površina pojedinog trapeza je Pi=dx*(f(xi)+f(xi+dx))/2 Kada se površine svih n trapeza zbroje dobiva se ukupna površina P=dx*(f(x1)/2+f(x2)/2+S) gdje je S suma ordinata y(xi) za svaki xi od x1+dx do x2-dx. To proizlazi zbog toga što se pri računanju svih površina ordinate f(xi) uzimaju dva puta, kao zadnja stranica i-tog trapeza i prva stranica i+1. trapeza, dok su f(x1) i f(x2) stranice 1. i posljednjeg trapeza. Napisati C program koji će naći površinu ispod krivulje y=a*x*abs(sin(b*x)) u intervalu od zadanog x1 do zadanog x2. Aproksimirati površinu pomoću n trapeza. Parametre a i b učitati kao realne brojeve a broj trapeza n kao cijeli broj.
f(x)

0

x1

xi

xi+1

x2 x

Slika 4.2

45

Algoritam rješenja: Definiraj funkciju f(x)=a*x*abs(sin(b*x)) Učitaj parametre a i b, broj trapeza n i početak i kraj intervala x1 i x2 Nađi dx=(x2-x1)/n Postavi S=(f(x1)+f(x2))/2 Za svaki x=x1+dx do x2-dx povečaj S za f(x) Izračunaj p=dx*S Ispiši p Rješenje u C-u: /*Povrsina ispod krivulje trapeznom metodom */ #include <stdio.h> #include <math.h> float a,b; float f(float x) { return(a*x*fabs(sin(b*x))); } main() { int n; float x,x1,x2,dx,S,p; printf("\n Površina ispod krivulje trapeznom metodom\n\n"); printf("\nMolim zadajte parametre a i b i broj točaka n\n"); scanf("%f %f %d",&a,&b,&n); printf("\n\nMolim zadajte početetak i kraj intervala x1 i x2\n"); scanf("%f %f",&x1,&x2); dx=(x2-x1)/n; S=(f(x1)+f(x2))/2; for (x=x1+dx;x<=x2-dx;x+=dx) S+=f(x); p=S*dx; printf("\nPovršina je %8.4f",p); return 0; } Komentar rješenja: Algoritam je napravljen prema opisanoj metodi. Suma S se postavlja početno na (f(x1)+f(x2))/2 a zatim se u petlji u kojoj se x povečava za dx od x1+dx do x2-dx ta suma povečava za vrijednost funkcije u točki x. Dobivena suma se pomnoži s dx da bi se dobila površina. Rješenje u C-u točno slijedi algoritam, jedino je "obogaćeno" ispisima naslova i poruka pri upisu podataka. Prikazani algoritam je samo pojednostavljena trapezna metoda. Ispravnije bi bilo rastavljati površinu u svakoj narednoj iteraciji na dvostuko veći broj trapeza (a početi s jednim trapezom) i ponavljati račun
46

tako dugo, dok se izračunate površine u zadnje dvije iteracije zanemarivo malo razlikuju. Slično se radi i metodom parabole ili Simpsonovom metodom. Kako su ti algoritmi nešto složeniji i spadaju u područje numeričke matematike, nećemo ih ovdje navoditi. Zadatak 4.8. Napisati C program koji će trapeznom metodom naći i ispisati površinu kruga učitanog polumjera r. Uputa: Računati površinu ispod četvrtine kruga za x=0 do r. Koristiti funkciju f(x)=sqrt(r*r-x*x). Broj trapeza izabrati proizvoljno. Zadatak 4.9. Napisati C program koji će učitati parametre a i b i trapeznom metodom naći površinu elipse kojoj sa a i b osi. (vidjeti uputu iz prethodnog zadatka). Zadatak 4.10. Napon na nekom potrošaču mijenja se vremenski po funkciji u(t)=e-bt*sin(a*t) dok je otpor potrošača ovisan o naponu po funkciji r(u)=r0+ln(1+abs(u)/10) Napisati C program koji će učitati parametre a, b i r0 te početno i krajnje vrijeme t1 i t2 i naći i ispisati energiju utrošenu na potrošaču u vremenskom intervalu t1 do t2. Uputa: energija je vremenski integral napona i struje pa treba naći površinu ispod krivulje f(t)=u*u/r u intervalu t1 do t2. Zadatak 4.11. Brzina nekog tijela mijenja se po funkciji v(t)=a*t+b*sin(c*t) Napisati C program koji će učitati parametre a, b i c i vremena t1 i t2 te naći pređeni put s u intervalu t1 do t2. Uputa: put je integral brzine pa treba naći poršinu ispod krivulje v(t). Primjer 4.3. Napisati C glavni program i funkciju srvr. Glavni program koristi vektor v od 100 elemenata. S tipkovnice treba učitati podatak n i n realnih brojeva kojima treba popuniti vektor v. Funkcija srvr treba naći srednju vrijednost brojeva smještenih u vektor v. Funkciji se predaju parametri: vektor v i broj n koji daje broj članova u vektoru. U glavnom programu treba ispisati vrijednost koju daje funkcija srvr. Algoritam rješenja: Glavni program: Definiraj vektor v od 100 realnih brojeva Učitaj broj n Ako je n>100 tada Ispiši poruku da je broj podataka prevelik Prekini dalji rad Za svaki i=0 do n-1 učitaj i-ti element vektora v Ispiši vrijednost funkcije Srvr(n,v) Funkcija Srvr:
47

Postavi s=0 Za svaki i=0 do n-1 povećaj s za v[i] Vrati vrijednost s/n pozivajućem programu Rješenje u C-u: /*Srednja veijednost podataka u vektoru */ #include <stdio.h> float srvr(float v[],int n) { int i; float s; s=0; for (i=0;i<=n-1;i++) s+=v[i] ; return(s/n); } main() { int i,n; float v[100]; printf("\n Srednja vrijednost podataka u vektoru\n\n"); printf("\nMolim zadajte broj podataka N u vektoru (N<=100)\n"); scanf("%d,",&n); printf("\n\nMolim zadajte %d brojeva\n",n); for (i=0;i<=n-1;i++) scanf("%f",&v[i]); printf("\nSrednja vrijednost je %8.4f",srvr(v,n)); return 0;} Komentar rješenja: Algoritam rješenja je vrlo jednostavan (vidi zadatke 1.1. i 2.1). Vektor v je u pozivajućem programu definiran kao realni vektor od 100 članova. Taj vektor je ujedno i parametar funkcije, no u definiciji funkcije srvr naznačen je bez broja elemenata (samo kao v[]) jer je sav prostor za njega osiguran u pozivajućem programu. Zadatak 4.12. Napisati cjelobrojnu funkciju vsr kojoj se predaju parametri A i m. A je realni vektor od m članova. Funkcija treba naći broj članova vektora A koji su veći od srednje vrijednost svih članova tog vektora. Zadatak 4.13. Napisati realnu funkciju vodx kojoj se predaju parametri V,m i x. V je realni vektor s m popunjenih elemenata a x je realan broj. Funkcija vodx treba vratiti vrijednost najmanjeg broja u
48

vektoru V koji je veći od x. Ako u vektoru V ne postoji broj veći od x funkcija vodx treba vratiti vrijednost -1000. Zadatak 4.14. Napisati funkciju Skalp kojoj se predaju parametri V1, V2 i m. V1 i V2 su realni vektori a m je cijeli broj. Funkcija nalazi skalarni produkt vektora V1 i V2 od m elemenata. Zadatak 4.15. Napisati funkciju FMAX kojoj se predaju parametri V i m. m je cijeli broj a V cjelobrojni vektor. Funkcija treba naći najveći broj u vektoru V od m elemenata. Zadatak 4.16. Napisati cjelobrojnu funkciju prost(x) koja poprima vrijednost -1 ako x nije prirodan broj (x je realna varijabla!), 0 ako je x prirodan ali nije prost broj i 1 ako je x prost broj. Zadatak 4.17. Napisati funkciju Cser s parametrima C, n i ω. C je vektor od n elemenata u koji predstavljaju vrijednosti kapaciteti serijski spojenih kondenzatora. Funkcija nalazi impedanciju serijskog spoja ovih n kondenzatora pri kružnoj frekvenciji ω. Napomena: Kapacitet Cs serijskog spoja kondenzatora dat je izrazom 1 1 1 1 = + +....+ Cs C1 C2 Cn a impedancija Z tog serijskog spoja je Z=

1 ωC s

Primjer 4.4 Napisati C glavni program i funkcije SUMR i RELF. Glavni program treba učitati cjelobrojne podatke u matricu Mat od 30 redaka i stupaca u kojoj je popunjeno m redaka i n stupaca. Iza toga program treba naći relativne podatke u postocima u odnosu na sumu svakog retka matrice i te podatke ispisati u obliku matrice realnih brojeva (na dvije decimale). Ako je suma retka jednaka 0, relativni podatak postaviti na 0. Napisati i koristiti cjelobrojnu funkciju SUMR koja ima cjelobrojne parametre M, red i nstup i koja nalazi sumu red-tog retka matrice M (u retku ima nstup cijelih brojeva). Napisati i koristiti i realnu funkciju RELF koja ima cjelobrojne parametre M, i, j i tot. Ta funkcija nalazi relativni podatak u i-tom retku i j-tom stupcu matrice M u odnosu na sumu toga retka koja je data parametrom tot. Na pr. ako je zadana matrica 23 76 53 13 4 11 0 0 0 0 0 15 onda treba ispisati matricu relativnih podataka u postocima u obliku: 15.13 50.00 34.87
49

46.43 0.00 0.00 Algoritam rješenja: a. Glavni program:

14.29 0.00 0.00

39.28 0.00 100.00

Definiraj cjelobrojnu matricu Mat od 30 redaka i stupca Učitaj broj redaka m i stupaca n popunjenih u matrici Mat Za svaki i=0 do m-1 učini Za svaki j=0 do n-1 učitaj Mat[i][j] Za svaki i=0 do m-1 učini Za svaki j=0 do n-1 ispiši 100*RELF(Mat,i,j, SUMR(Mat,i,n))

50

b. Funkcija SUMR Definiraj funkciju SUMR s njenim parametrima M, red i nstup (M je cjelobrojna matrica [30][30], red i nstup su cjelobrojni skalari) Postavi sr=0 Za svaki j=0 do nstup-1 povećaj sr za M[red][j] Vrati podatak sr pozivajućem programu c. Funkcijski potprogram RELF Definiraj realnu funkciju RELF s parametrima M, i, j i tot (M je cjelobrojna matrica, ostali parametri su cjelobrojni skalari)) Ako je tot različito od 0 vrati M[i][j]/tot u pozivajući program U suprotnom vrati 0 u pozivajući program Rješenja u C-u: /*Relativni podaci u odnosu na sumu reda matrice #include <stdio.h> /*Funkcija nalaženja sume reda */ int SUMR(int M[30][30], int red,int nstup) { int sr,j; sr=0; for (j=0;j<=nstup-1;j++) sr+=M[red][j]; return(sr); } /* Funkcija nalaženja relativnog podatka */ float RELF(int M[30][30],int i,int j,int tot) { if (tot!=0) return 1.0*M[i][j]/tot; else return 0; } */

/* Glavni program */ main() { int Mat[30][30],i,j,m,n; printf("\n Relativni podaci u matrici u odnosu na sumu retka\n\n"); printf("\nMolim zadajte broj redaka M i stupaca N matrice (N,M<=30\n"); scanf("%d %d,",&m,&n); printf("\n\nMolim zadajte %d cijelih brojeva u %d redaka\n",n,m); for (i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) scanf("%d",&Mat[i][j]); printf("\n\nRelativni podaci u odnosu na sumu reda matrice su:\n\n"); for (i=0;i<=m-1;i++) { for (j=0;j<=n-1;j++) printf("%9.3f",100*RELF(Mat,i,j,SUMR(Mat,i,n))); printf("\n"); }
51

return 0; } Komentar rješenja: Algoritam zadatka je jednostavan i već u ranijim primjerima prikazivan pa ga nećemo posebno obrazlagati. Ono što treba uočiti i u algoritmu i u C programima su imena varijabli. Glavni program poziva funkciju RELF s argumentima Mat, i, j, i SUMR(Mat,i,n), dok se ti isti podaci u definiciji funkcije RELF zovu M, i, j i tot. Simbolička imena parametara u pozivu i definiciji ne moraju biti ista no njihov tip i oblik mora biti u oba slučaja jednak. To je ovdje i zadovoljeno. Sva četiri parametra su cjelobrojna, prvi od njih je matrica od 30 redaka i stupaca. U glavnom programu u pozivu funkcije RELP kao zadnji parametar koristi se funkcija SUMR. Ispis po recima postiže se na taj način, da se nakon ispisanog reda (kraj unutarnje petlje po j) daje se na ispis znak "\n" nakon kojeg započinje ispis u novom retku. U funkciji RELP izraz koji se vraća napisan je u obliku 1.*M[i][j]/tot. Realna konstanta 1. potrebna je da bi se cijeli izraz računao u realnoj aritmetici i dao realni rezultat. Zadatak 4.18. Napisati C program koji će učitati realne podatke u matricu X od 20 redaka i stupaca. Koristeći funkciju XMIN s parametrima X, i i program treba naći i ispisati najmanji broj u svakom retku matrice X. Funkcija XMIN poprima najmanju vrijednost u i-tom retku matrice X. Zadatak 4.19. Napisati C program koji će učitati m1 podataka u vektor V1 i m2 podataka u vektor V2. Oba vektora mogu imati najviše 100 članova. Koristeći funkciju PRODMM s parametrima V1, m1, V2 i m2) program treba naći i ispisati umnožak najmanjih brojeva iz vektora V1 i V2. Zadatak 4.20. Zadan je slijedeći C program : /* Ispis najmanjeg i najvećeg dijagonalnog člana matrice */ #include <stdio.h> main() { float A[20][20]; int i,j; for (i=0;i<=19;i++) for (j=0;j<=19;j++) scanf("%f",&A[i][j]); printf("Najmanji dijagonalni član je %8.2f",Dimin(A)); printf("Najveci dijagonalni član je %8.2f",Dimax(A)); return 0; } Napisati funkcije Dimin i Dimax (koje se koriste u printf naredbama ovog programa) a koje nalaze najmanji odnosno najveći dijagonalni član matrice A. Zadatak 4.21. Zadan je slijedeći C program:
52

/* Usporedba dvaju vektora */ #include <stdio.h> main() { float v1[100],v2[100]; int i,m; printf("\nBroj brojeva u vektorima molim "); scanf("%f",&m); printf("\n Parove realnih brojeva za vektore v1 i v2 molim"); for (i=0;i<=m-1;i++) scanf("%f%f",v1[i],v2[i]); if (USP(v1,v2,m)) printf ("\nVektori su jednaki"); else printf("\nVektori su razliciti"); return 0; } Napisati funkciju USP koji će poprimiti cjelobrojnu vrijednost 1 ako su svi članovi vektora v1 i v2 međusobno jednaki, a vrijednost 0 ako nisu jednaki. Primjer 4.5. Promjenjljivi parametri funkcije Prilikom poziva funkcije, predaju se funkciji parametri. Ti parametri mogu se predati kao imena tj. kao konstante i varijable ili kao izrazi. U takvom slučaju, koji je prikazan u prethodnim primjerima, pozvana funkcija dobiva "kopiju" parametra i promjena tog parametra u pozvanoj funkciji ne mijenje vrijednost "originalne" varijable u pozivajućem dijelu programa. Takva razmjena parametara zove se razmjene po imenu. Suprotno od toga, pri pozivu funkcije mogu se predati "originalne" vrijednosti parametara. U tom slučaju predaje se adresa samog podatka, pa promjena u pozvanoj funkciji uzrokuje promjenu tog parametra i u pozivajućem dijelu programa. Pri tome je u C jeziku sintaksa takva, da se pri pozivu funkcije ispred imena parametra stavlja znak & (što znači adresa) dok se u pozvanoj funkciji ispred imena tog parametra stavlja znak * što znači "na adresi". Na primjer ako želimo napraviti funkciju Swap koja zamjenjuje vrijednosti parametara x1 i x2, poziv funkcije će imati oblik: Swap(&x1,&x2); dok će sama funkcija izgledati ovako:

53

void Swap(float *a, float *b) { float x; x=*a; *a=*b; *b=x; } Ovako označavanje promjenjljivih parametara ne koristi se za parametre koji su vektori i matrice. Vektori i matrice uvijek se razmjenjuju po adresi (predaje se adresa početka te strukture podataka) pa se to ne treba posebno naznačiti. Slijedeći zadatak i rješenje prikazuju ove mogućnosti: Napisati C glavni program i funkciju Nmax koja je cjelobrojnog tipa i koja se poziva izrazom Nmax(V,m,&max). V je realni vektor od 100 elemenata u koji se u glavnom programu s tipkovnice učita m realnih brojeva. Kraj podataka s tipkovnice upisuje se znakom Ctrl Z. Funkcija Nmax nalazi najveći podatak max u vektoru V i s njim dijeli sve brojeve u vektoru. Vrijednost funkcije Nmax postaje jednaka broju koji pokazuje koliko puta se u vektoru V nalazi najveći broj max. Nakon toga u glavnom programu se podatak max i vrijednost funkcije Nmax ispisuju na ekran, a iza toga se ispisuje i tako promijenjeni vektor u izlaznu datoteku v1.dat. Algoritam rješenja a. Funkcija Nmax Definirati funkciju Nmax s parametrima V, m i max Postaviti max=V[0] /* Prvi podatak u vektoru na početku je najveći*/ Postaviti tmax=1 /* Broj pojavljivanja najveceg podatka */ Za svaki i=1 do m-1 činiti Ako je V[i]=max povečati tmax za 1 u suprotnom ako je V[i]>max činiti Postaviti max=V[i] Postaviti tmax=1 Kraj u suprotnom b. Glavni program Učitati prvi podatak u vektor V[0] Za svaki i=1 do 99 i dok ima podataka učitati podatak u V[i] Postaviti m=i-1 Postaviti n=Nmax(V,m,max) /* Pozvati Nmax funkciju */ Za svaki i=0 do m-1 činiti Podijeliti V[i] s n Ispisati V[i] Kraj za svaki i Ispisati max i n Rješenje u C-u: #include <stdio.h>
54

/* Primjer 4.5: promjenjljivi parametri funkcije */ int Nmax (float V[100], int m, float *max) { int i,tmax; *max=V[0]; tmax=1; for(i=1 ;i<m; i++) if(V[i]==*max) tmax++; else if(V[i]> *max) {tmax=1; *max=V[i]; } return(tmax); } main() { int i,n,m; float V[100]; float max; scanf( "%f", V); for(i=1; i<100 && !feof(stdin); i++) scanf( "%f",&V[i]); m=i-1; n=Nmax(V,m,&max); printf("\nVektor podijeljen s najvecim članom je \n"); for (i=0;i<m;i++) {V[i]/=max; printf("%8.6f\n",V[i]); } printf("Najveci podatak u vektoru je %8.3f i nalazi se u vektoru %3d puta\n",max,n); return 0; } Komentar rješenja: Funkcija Nmax mijenja vrijednost parametra V, no kako je to vektor prenosi se u funkciju adresa vektora na isti način kako se prenose i nepromjenjljivi parametri (nema znaka & uz ime parametra pri pozivu funkcije, niti znaka * pri definiciji funkcije). Prijenos parametra max obavlja se tako da se u pozivu funkcije napiše &max a u samoj funkciji koristi se oznaka *max za adresu podatka max koji je zajednički i pozivajućem glavnom programu i pozvanoj funkciji Nmax. Zato je max promjenjljivi parametar, njegova promjena u pozvanoj funkciji uzrokuje promjenu u pozivajućem dijelu programa. Podaci u vektoru V imaju indekse od 0 do m-1 (tj. ukupno m podataka). Prvi podatak je V[0] a zadnji V[m-1]. Algoritam nalaženja najvećeg broja jednak je kao u primjeru 1.1. Za nalaženje broja ponavljanja tog najvećeg broja, algoritam je nešto dopunjen. U glavnom programu podaci se učitavaju naredbom scanf sve do standardnog znaka kraja datoteke. Taj standardni znak kraja s tastatute je Ctrl z (istovremeno pritisnute tipke Ctrl i z). Zato se podaci učitavaju sa standardne ulazne datoteke, koja se
55

zove stdin i koja na definirani način reagira na Ctrl z tipku. Učitavanje u prvi element vektora V (koji ima indeks 0 pa je to V[0] ) može se obaviti tako da se pri pozivu scanf funkciije preda parametar V (bez indeksa). Kako je V vektor, predaje se njegova adresa, tj adresa njegovog prvog elementa. Kasnija učitavanja obavljaju se na mjesto različito od početka vektora pa se kao parametar predaje &V[i]. Učitavanje iz datoteke obavlja se fscanf funkcijom. U ovom primjeru uočava se petlja u kojoj se obavlja učitavanje sve dok ne dođe kraj podataka (ispituje se uvjet !feof(stdin) ). Zadatak 4.22. Napisati C glavni program koji će s tipkovnice učitati realne brojeve u vektor R. Napisati proceduru (funkciju tipa void) OTPOR koja je "praznog" tipa i kojoj se predaju realni parametri vektor R skalari rmin, rmax i rx te cijeli broj n. Parametri rmin,rmax i rx predaju se proceduri OTPOR po adresi. Vektor R ima n elemenata. Svaki element predstavlja vrijednost jednog od n otpornika spojenih paralelno. Funkcija nalazi najmanji otprornik rmin, najveći otpornik rmax i otpor paralelnog spoja ovih otprornika rx. Ako je rmin=0 postaviti rx=0. U suprotnom računati rx po izrazu 1/rx=1/R1 + 1/R2 + 1/R3 + .... + 1/Rn Zadatak 4.23. Napisati C proceduru (funkciju) PROST void ("praznog") tipa koja ima cjelobrojne parametre n0 i n i realni parametar xlmn. Parametri n i xlmn predaju se funkciji PROST po adresi. Funkcija nalazi najveći prosti broj n manji od zadanog n0 i njegov prirodni logaritam stavlja u parametar xlmn. (Vidi algoritam iz primjera 1.2). Napisati i glavni C program koji učitava n0 i ispisuje n i xlmn. Zadatak 4.24. Napisati C funkciju SRVF. Funkcija se poziva izrazom SRVF(x1,x2,z,n,&fmax). Funkcija računa srednju vrijednost matematičke funkcije date izrazom f(x)=sin(x)*cos(z*x) u intervalu od x1 do x2 uzimajući x u n jednako razmaknutih točaka. Ta funkcija treba također naći i najveću vrijednost zadane funkcije uzimajući u obzir iste točke. Tu najveću vrijednost funkcija stavlja u parametar fmax. Zadatak 4.25. Napisati C proceduru ULVEK koja je void ("praznog") tipa i kojoj se predaju parametri v1, v2 i n. v1 i v2 su realni vektori od po 200 realnih brojeva a n je broj popunjenih elemenata u njima. Funkcija iz pozivajućeg programa dobiva vrijednost parametra n. U slučaju da je n>200 funkcija ispisuje poruku "BROJ ELEMENATA VEKTORA PREVELIK" i vraća se u pozivajući program. U suprotnom funkcija učitava s tipkovnice n elemenata u oba vektora i zatim se vraća u pozivajući program. Primjer 4.6. Upotreba datoteka. Datoteke (skupovi podataka na vanjskoj memoriji - nosiocu podataka) mogu se iz C programa koristiti pomoću FILE tipa varijable. Taj tip je adresni, pa je njegova definicija oblika FILE *ime.
56

Ovdje je "ime" unutarnje ime datoteke na koje se pozivamo u programu pri radu s nekom datotekom. Naredni primjer prikazuje korištenje takve datoteke. Napisati C funkciju UMAT koja ima tri cjelobrojna parametra. Prvi parametar je matrica Mx od 21 retka i 11 stupaca, preostala dva parametra n1 i n2 su skalari koji pokazuju koliko je redaka i stupaca popunjeno u matrici Mx. Funkcija treba učitavati po dva cijela broja i1 i i2 iz pojedinog zapisa datoteke koja je spremljena na disku pod imenom "pr4_6.dat". Ako je zadovoljen uvjet i1<= n1 i i2 <= n2 povećati član u i1-om retku i i2-om stupcu matrice Mx za 1. U suprotnom preskočiti (ne koristiti) ove podatke. Nakon učitanih svih brojeva iz datoteke vratiti se u pozivajući program. (Na ovaj način dobiva se tablica frekvencija ili kontingencija često korištena u statističkim analizama). U glavnom programu treba s tipkovnice učitati podatke n1 i n2 te pomoću funkcije UMAT dobiti tablicu frekvencija u matrici Mx i ispisati tako dobivenu matricu. Algoritam rješenja: Definiraj funkciju UMAT s parametrima Mx, n1 i n2 Otvori datoteku "pr4_6.dat" kao ulaznu tekstualnu datoteku Ako ove datoteke nema tada čini Ispiši poruku da ne postoji tražena datoteka Vrati se u operacijski sustav Kraj Ako ove .. Sve članove matrice Mx svedi na 0 Učitaj podatke i1 i i2 iz datoteke Ponavljaj Ako je i1<=n1 i ako je i2 <=n2 povačaj Mx[i1][i2] za 1 Učitaj i1 i i2 iz datoteke Sve dok ne nastupi kraj datoteke Rješenje u C-u: /*Tabela frekvencija (kontingencije), podaci iz datoteke */ #include <stdio.h> #include <stdlib.h> void UMAT(int Mx[21][11], int n1,int n2) { int i,j; FILE *fin; fin=fopen("pr4_6.dat","rt"); if(!fin) {printf("\nNema datoteke ""pr4_6.dat"" "); exit(1); } for(i=0;i<=20;i++) for(j=0;j<=10;j++) Mx[i][j]=0; fscanf(fin,"%d %d",&i,&j);
57

do { if(i<=n1 && j<=n2) Mx[i][j]+=1; fscanf(fin,"%d %d",&i,&j); } while(!feof(fin)); } main() { int mat[21][11],red,stup,n,m; printf("\n Matrica frekvencija (kontingencije) \n\n"); n=m=0; while (n<1 || n>20 || m<1 || m>10) {printf("\nBrojeve popunjenih redaka (1 do 20) i stupaca (1do10) molim"); scanf("%d%d",&n,&m); } UMAT(mat,n,m); printf("\n\nMatrica kontingencije je: \n\n"); for (red=1;red<=n;red++) { for (stup=1;stup<=m;stup++) printf("%4d",mat[red][stup]); printf("\n"); } return 0; } Komentar rješenja: Funkcija UMAT definirana je s tri cjelobrojna parametra: matrica Mx i brojevi n1 i n2. Datoteka se "otvara" tj. priprema za korištenje funkcijom fopen. Ovoj funkciji se predaju dva znakovna parametra: prvi je vanjsko ime datoteke ("pr4_6.dat") koje treba biti poznato operacijskom sustavu. Drugi parametar ("rt") je pokazatelj načina pod kojim želimo korisiti datoteku. "rt" u ovom slučaju znači da datoteku želimo čitati ("r" od engl. "read") i da je to tekstualna datoteka (datoteka s čitljivim ASCII znakovima). Ako tražena datoteka ne postoji, funkcija fopen vraća vrijednost "NULL" koja ima logičko značenje "neistina". Zbog toga je uvjet (!fin) ispunjen, pa program ispisuje poruku i funkcijom "exit" vraća se u operacijski sustav prenoseći mu indikator završetka jednak 1. Taj indikator se može koristiti u operacijskom sustavu. Ako je datoteka "pr4_6.dat" ispravno otvorena, prelazi se na rad ovog programa (funkcije UMAT). U glavnom programu se najprije matrica Mx svodi na nulu, a zatim se učitavaju podaci n i m koji u glavnom programu označavaju broj popunjenih redaka i stupaca u matrici. U funkciji UMAT se nakon toga u petlji koja se obavlja sve dok ne dođe kraj datoteke učitavaju brojevi i1 i i2. Učitavanje iz datoteke obavlja se funkcijom "fscanf" kojoj je prvi parametar unutarnje ime datoteke (u ovom primjeru "fin"). Ako i1 i i2 zadovoljavaju postavljene uvjete element u i1-om retku i i2-om stupcu matrice povečava se za jedan. Ispitivanje kraja podataka u datoteci postiže se funkcijom "feof" koja daje vrijednost "lažno" ako nismo došli do kraja, a vrijednost "istinito" ako smo na kraju datoteke. Nakon učitanih svih podataka funkcija završava rad i vraća kontrolu pozivajućem programu. Ovdje nemamo iskaz "return" u funkciji jer ona ne poprima nikakvu vrijednost (ona je tipa "void" tj
58

"prazna") već se podaci u pozivajući program predaju preko parametra Mx. Ova matrica ispisuje se u glavnom programu. Uočite da imena parametara u glavnom programu i u funkciji UMAT nisu ista. Na sličan način kao što je ovdje prikazana upotreba ulazne datoteke, može se definirati i koristiti izlazna tekstualna datoteka. U takvu datoteku unose se podaci od njenog početka. Definicija izlazne datoteke slična je definiciji ulazne datoteke, ali se umjesto parametra "rt" upisuje "wt". Upis podataka u izlaznu tekstualnu datoteku obavlja se na način analogan pisanju na ekran samo se korisi fprintf funkcija (umjesto printf) u kojoj je prvi parametar unutarnje ime izlazne datoteke. Zadatak 4.26. Napisati C glavni program i funkciju IMAT kojoj se predaju parametri Mx, n1 i n2 i koji imaju isto značenje kao i u primjeru 4.6. Glavni program treba iz datoteke čije ime se zadaje preko tipkovnice učitati broj popunjenih redaka n1 i stupaca n2 matrice te n1 * n2 cijelih brojeva u matricu Mx. Funkcija IMAT treba ispisati na ekran podatke iz matrice Mx u n1 redaka i n2 stupaca i ispisati ukupan zbroj podataka (sumu svih članova) matrice. Primjer 4.7. Parametri iz operacijskog sustava Slično kao što se pozvanoj funkciji mogu predati parametri iz pozivajućeg programa, tako se i glavnom programu mogu predati parametri iz operacijskog sustava. U tom slučaju se naznačuje da glavni program prima dva parametra: prvi je cijeli broj, koji kazuje koliko je parametara predano programu a drugi je adresa znakovnog vektora u kojem su ti parametri kao znakovni podaci (nizovi). Opširnije objašnjenje o tim parametrima dato je u komentaru rješenja ovog primjera. Napisati glavni C program i procedure MULMAT, ISPMAT i PRENMAT. Glavni program dobiva iz operacijskog sustava kao prvi parametar ime datoteke iz koje treba čitati podatke. U prvom zapisu te datoteke su cjelobrojni podaci m i potenc (m mora biti manje od 101). U preostalih m zapisa datoteke je po m realnih brojeva. Te brojeve treba učitati u kvadratnu matricu X koja je definirana sa 100 redaka i stupaca. Proceduri MULMAT, koja je void ("praznog") tipa predaju se parametri X, Y i m. Ova procedura množi matricu X s matricom Y i rezultat se stavlja u matricu X. Broj redaka i stupaca određen je parametrom m. Proceduri PRENMAT koja je takodjer praznog tipa predaju se ista tri parametra kao i proceduri MULMAT. PRENMAT obavlja samo prijenos podataka iz matrice Y (drugi parametar) u matricu X (prvi parametar). Obje matrice imaju m popunjenih redaka i stupaca. Korištenjem navedenih procedura, glavni program nalazi i ispisuje potenciju učitane matrice. Algoritam rješenja: a. Glavni program: Definiraj matrice X, Y i Z sa 100 redaka i stupaca Ako je broj predanih parametara iz opreacijskog sustava jednak 1 tada: Ispiši poruku o pogreški Završi program s porukom 1 o pogreški Kraj Ako je... Otvori ulaznu datoteku s imenom datim u parametru Ako navedene datoteke nema tada
59

Ispiši poruku o pogreški Završi program s porukom 2 o pogreški Kraj Ako Učitaj m i potenc iz prvog zapisa datoteke Ako je m>0 i m<101 tada: Za svaki i=1 do m čini slijedeće: Za svaki j=1 do m učitaj podatak iz istog zapisa datoteke i u matricu X[i][j] Kraj za svaki i Pozovi proceduru PRENMAT(X,Y,m) Za svaki p=2 do potenc čini slijedeće: Pozovi proceduru MULMAT(X,Y,Z,m) Pozovi proceduru PRENMAT(Z,Y,M) Pozovi proceduru ISPMAT(Y,m) Kraj za svaki p Završi program s porukom 0 o pogreški U suprotnom /* Pogrešan m*/ Ispiši poruku o pogrešno zadanom broju m Završiu program s porukom 3 o pogreški Kraj Ako je m... b. Procedura MULMAT Definiraj proceduru MULMAT(A1,A2,A3,m) Za svaki i=0 do m-1 učini slijedeće Za svaki j=0 do m-1 učini slijedeće Postavi A3[i][j]=0 Za svaki k=1 do m povečaj A3[i][j] za A1[i][k]*A2[k][j] Kraj za svaki j Kraj za svaki i c. Funkcija PRENMAT Definiraj funkciju PRENMAT(A1,A2,m) Za svaki i=0 do m-1 učini Za svaki j=0 do m-1 postavi A2[i][j])=A1[i][j] d. Funkcija ISPMAT Definiraj proceduru ISPMAT(A,m) Za svaki i=0 do m-1 učini slijedeće Za svaki j=0 do m-1 ispiši A[i][j] u isti red ekrana Prijeđi na pisanje u novi red Rješenje u C-u: /* Potenciranje matrice uz koristenje procedura */ #include <stdio.h> #include <stdlib.h> void MULMAT(float A1[100][100], float A2[100][100],float A3[100][100], int m)
60

{int i,j,l; for (i=0;i<=m-1;i++) for (j=0;j<=m-1;j++) { A3[i][j]=0; for (l=0;l<=m-1;l++) A3[i][j]+=A1[i][l]*A2[l][j]; } } void PRENMAT(float A1[100][100], float A2[100][100], int m ) {int i,j; float x; for (i=0;i<=m-1;i++) for(j=0;j<=m-1;j++) A2[i][j]=A1[i][j]; } void ISPMAT(float A[100][100],int m) { int i,j; for (i=0;i<=m-1;i++) { for (j=0;j<=m-1;j++) printf("%8.3f",A[i][j]); printf("\n"); } } main(int npar,char *lpar[]) { float X[100][100],Y[100][100],Z[100][100]; int i,j,m,potenc; FILE *fin; printf("\n Potenciranje matrica \n\n"); if (npar==1) {printf("Ulazna datoteka nije zadana kao parametar programa"); exit(1); } fin=fopen(lpar[1], "rt"); if(!fin) {printf( "Nema ulazne datoteke %s", lpar[1]); exit(2); } fscanf(fin," %d %d",&m,&potenc); if(m>0 && m<101) for (i=0;i<=m-1;i++) for(j=0;j<=m-1;j++) fscanf(fin,"%f",&X[i][j]); PRENMAT(X,Y,m); for (i=2;i<=potenc;i++) {MULMAT(X,Y,Z,m); PRENMAT(Z,Y,m); } printf("\n\nPotencirana matrica je: \n\n"); ISPMAT(Y,m);
61

} else {printf("\nMatrica je prevelika!"); exit(3); } return 0; } Komentar rješenja: Glavni program (u C kodu napisan na kraju, iza funkcija) ima cjelobrojni parametar "npar" i znakovni parametar u obliku vektora "lpar". Oba parametra predaje operacijski sustav. U prvi parametar "npar" operacijski sustav stavlja broj riječi u naredbi kojom se program poziva. Na primjer: "prim4_7 podaci.dat" bila bi u Windows ili DOS-u naredba za poziv programa "prim4_7" uz parametar "podaci.dat". Kako naredba mora sadržavati barem ime programa, zbog toga je broj riječi u naredbi kojom se poziva program uvijek jedan ili veći. Ako se kao u ovom primjeru naredbom predaje jedan parametar tada "npar" poprima broj dva. Zato se u ovom primjeru ispituje da li je broj riječi veći od 1, te ako je to slučaj, ime datoteke se uzima iz prvog parametra. Parametre program dobiva u vektoru "lpar" i to tako da je u njegovoj nultoj poziciji (lpar[0]) prva riječ naredbe, u njegovoj prvoj poziciji (lpar[1]) druga riječ naredbe tj. prvi parametar, u drugoj poziciji je drugi parametar i tako dalje. Tako se u ovom primjeru ime datoteke zadaje kao prvi parametar pri pozivu programa iz operacijskog sustava. Prethodno se provjerava da li je taj parametar zadan, te ako nije, ispisuje se poruka i naredbom exit(1) obavlja se povratak u operacijski sustav. Pri tome se operacijskom sustavu predaje oznaka 1 kao oznaka pogreške koja je nastupila. Na analogan način završava se program i u slučaju kada nema zadane datoteke ili je zadana prevelika matrica. Množenje matrica vrši se po algoritmu iz primjera 3.4. U glavnom programu se učitana matrica X prenese u Y pozivom funkcije PRENMAT. Iterativnim pozivanjem funkcija MULMAT i PRENMAT (mijenjanjem i od 2 do potenc) vrši se uzastopno množenje i prijenos matrica. Funkcija MULMAT napravljen je po algoritmu iz primjera 3.4. Funkcija PRENMAT samo prenosi podatke iz jedne matrice (prvi parametar funkcije) u drugu matricu (drugi parametar funkcije). Dobiveni rezultat se ispisuje funkcijom ISPMAT. Zadatak 4.27. Napisati C glavni program i funkcije UM i IM. Glavni program učitava cijele brojeve m, n i k. Ako je m veće od nule pozivaju se funkcije UM i IM. Ako taj uvjet nije ispunjen, završava se program. Funkciji UM predaju se parametri A, m i n. A je matrica od 50 redaka i stupaca a m i n su broj redaka odnosno stupaca, koje treba učitati u matricu. Funkcija UM učitava m * n brojeva u matricu A. Funkciji IM se predaju parametri A, m i k. Ta funkcija ispisuje sumu k-tog stupca matrice. Zadatak 4.28. Napisati glavni C program, te funkcije EFREQ, SUMR, SUMS i SUMA. Glavni program koristi realnu matricu MAT od 9 redaka i stupaca u koju učita m * n realnih brojeva. Brojevi m i n dati su kao parametri pri pozivu glavnog programa i predstavljaju broj popunjenih redaka odnosno stupaca matrice. Oba ova broja moraju biti jednoznamenkasti brojevi. Realni brojevi kojima se popunjava matrica zadaju se s tipkovnice. Suma i-tog retka matrice nalazi se pomoću funkcije
62

SUMR(MAT,i,n). Na sličan naćin nalazi se suma stupca pomoću funkcije SUMS(MAT,j,m) i ukupna suma cijele matrice pomoću funkcije SUMA(MAT,m,n). Funkcija EFREQ nalazi tkzv. očekivane frekvencije. Funkciji se predaju parametri MAT,XMAT, m i n. XMAT je matrica istog tipa i oblika kao i matrica MAT. Član u i-tom redu i j-tom stupcu matrice XMAT nalazi se po izrazu

XMAT [i ][ j ] =

SUMR ( MAT , i, n) * SUMS ( MAT , j , m) SUMA( MAT , m, n)

(tj. očekivana frekvencija je umnožak sume reda i stupca podijeljena sa ukupnom sumom). Matricu očekivanih frekvencija XMAT ispisati u glavnom programu. Zadatak 4.29. Napisati glavni C program i proceduru SORT. Glavni program učitava realne brojeve iz datoteke čije ime se zadaje kao parametar pri pozivu programa. Brojevi iz datoteke učitavaju se u realni vektor v1. Broj popunjenih elemenata u vektoru v1 treba staviti u varijablu m. Proceduri SORT predaju se parametri v1, v2 i m. v2 je vektor istog tipa i oblika kao v1. Procedura SORT treba poredati po rastućem redoslijedu podatke iz vektora v1 i staviti ih u v2. Za sortiranje koristiti algoritam iz primjera 3.2. U glavnom programu ispisati vektor v2 u datoteku čije ime se zadaje kao drugi parametar . Zadatak 4.30. Koristeći proceduru SORT iz prethodnog zadatka, napisati glavni program i funkciju MEDIJ koja se poziva naredbom MEDIJ(v,m) i koja nalazi medijan tj. srednji član u sortiranom vektoru v. Ako je m paran, tada je MEDIJ aritmetička sredina od srednja dva člana. Ako je m neparan, tada je MEDIJ član u sredini (na m/2-om mjestu). Ulazna datoteka zadaje se kao parametar pri pozivu programa. Ako taj parametar nije zadan, treba učitavanje obaviti s tipkovnice. Rezultat tj. medijan ispisati na ekran.

63

5. RJEŠENJA ZADATAKA Zadatak 1.1. Učitaj n Sve dok n nije prirodan broj čini Ispiši poruku o pogrešno zadanom broju n Učitaj n Kraj sve dok Postavi s=0 Za svaki i=1 do n čini Učitaj x Povećaj s za x Kraj za svaki i Izračunaj s=s/n Ispiši s Zadatak 1.2. Postavi s=0 Postavi n=0 Učitaj x Sve dok je x različito od -99999 čini Povećaj s za x Povećaj n za 1 Učitaj x Kraj sve dok Izračunaj s=s/n Ispiši s Zadatak 1.3. Postavi s=0 Postavi n=0 Učitaj x Sve dok je x različito od 9 čini Ako je x>=2 i x<=5 tada Povećaj s za x Povećaj n za 1 Kraj ako je Učitaj x Kraj sve dok Izračunaj s=s/n Ispiši s

64

Zadatak 1.4. Postavi nf=1 Učitaj n Sve dok je n<0 ili n>33 čini Učitaj n Kraj sve dok Za svaki i=1 do n čini Pomnoži nf s i Kraj za svaki i Ispiši nf Zadatak 1.5. Učitaj m i n Sve dok je m<n ili n<1 čini Učitaj m i n Kraj sve dok Postavi br=1 Za svaki i=n+1 do m čini Pomnoži br s i Kraj sve dok Postavi nz=1 Za svaki i=1 do n čini Pomnoži nz s i Kraj sve dok Izračunaj povrh=br/nz Ispiši povrh Zadatak 1.6. Učitaj n1 i n2 Sve dok n1 nije prirodan broj ili n2 nije prirodan broj čini Učitaj n1 i n2 Kraj sve dok Ako je n2>n1 tada Postavi n=n1 Postavi n1=n2 Postavi n2=n1 Kraj ako je Ako je n1 paran Povećaj n1 za 1 Postavi s=0 Za svaki i=n1 do n2 u koraku po 2 Povećaj s za drugi korjen iz i Ispiši s

65

Zadatak 1.7. Učitaj n Sve dok je n<4 čini Ispiši poruku o pogrešno zadanom broju n Učitaj n Kraj sve dok Postavi k=n+1 Sve dok je 1 istinito čini /* Beskonačna petlja */ Izračunaj m=cjelobrojni dio od sqrt(k) Postavi ind=0 Postavi i=1 Sve dok je ind=0 i i<=m čini Povećaj i za 1 Ako je k djeljivo s i postavi ind=1 Kraj sve dok Ako je i>m tada Ispiši k, najmanji prosti broj veći od n Završi program Kraj ako je Povećaj k za 1 Kraj sve dok /* Kraj petlje */ Zadatak 1.8. Učitaj n Sve dok je n<11 čini Ispiši poruku o pogrešno zadanom broju n Učitaj n Kraj sve dok Postavi k=n-1 Sve dok je 1 istinito čini /* Beskonačna petlja */ Izračunaj m=cjelobrojni dio od sqrt(k) Postavi ind=0 Postavi i=1 Sve dok je ind=0 i i<=m čini Povećaj i za 1 Ako je k djeljivo s i postavi ind=1 Kraj sve dok Ako je i>m tada Ispiši k, najveći prosti broj manji od n Završi program Kraj ako je Smanji k za 1 Kraj sve dok /* Kraj petlje */ Zadatak 1.9.
66

Učitaj n1 i n2 Ako je n1>n2 tada Postavi n=n1 Postavi n1=n2 Postavi n2=n Kraj ako je Kraj sve dok Za svaki n=n1 do n2 čini Izračunaj m=cjelobrojni dio od sqrt(n) Postavi ind=0 Postavi i=1 Sve dok je ind=0 i i<=m čini Povećaj i za 1 Ako je k djeljivo s i postavi ind=1 Kraj sve dok Ako je i>m tada Ispiši n Kraj ako je Kraj za svaki n /* Kraj petlje */ Zadatak 1.10. Za svaki i1=1 do 1000 čini Za svaki i2=i1+1 do sqrt(1e6-i1*i1) čini Ako je sqrt(i1*i1+i2*i2) cijeli broj ispiši Pitagorine brojeve i1,i2 i i3 Kraj za svaki i2 Kraj za svaki i1

Zadatak 1.11. Učitaj n1 i n2 Ako je n1>n2 tada Postavi n=n1 Postavi n1=n2 Postavi n2=n Kraj ako je Ako je n1 neparan Povećaj n1 za 1 Za svaki i=n1 do n2 u koraku po 2 čini Rezultat=0 m1=1 Sve dok je Rezultat=0 čini /* Nadji da li je m1 prost broj */
67

Postavi m=drugi korjen iz m1 Postavi i1=2 Postavi Rezultat=1 Sve dok je Rezultat=1 i i1<= m čini Ako je m1 djeljivo s i1 postavi Rezultat=0 Povećaj i1 za 1 Kraj sve dok Ako je Rezultat=1 tada /* m1 je prost */ Postavi m2=i-m1 /* Sada nadji da li je m2 prost */ Postavi m= drugi korjen iz m2 Postavi i1=2 Sve dok je Rezultat=1 i i1<= m čini Ako je m2 djeljivo s i1 postavi Rezultat=0 Povećaj i1 za 1 Kraj sve dok Ako je Rezultat=1 tada /* I m2 je prost */ Ispiši m1 i m2 Kraj ako je Povećaj m1 za 2 Kraj sve dok je Rezultat=0 Kraj za svaki i=n1 do n2 u koraku po 2 Napomena: Rješenje će biti znatno jednostavnije uz upotrebu funkcija. Ako napravimo funkciju (kao u poglavlju 4) koja se naziva Prost(m) i koja poprima vrijednost 1 ako je parametar m prost broj (vrijednost funkcije je 0 ako m nije prost) tada cijeli algoritam glasi: Učitaj n1 i n2 Ako je n1>n2 tada Postavi n=n1 Postavi n1=n2 Postavi n2=n Kraj ako je Ako je n1 neparan Povećaj n1 za 1 Za svaki i=n1 do n2 u koraku po 2 čini Rezultat=0 m1=1 Sve dok je Rezultat=0 čini Postavi m2=i-m1 Postavi Rezultat=Prost(m1)*Prost(m2) Ako je Rezultat=1 tada Ispiši m1 i m2 Kraj ako je Povećaj m1 za 2 Kraj ako je Rezultat=0 Kraj za svaki i
68

Zadatak 1.12. Učitaj n i x Postavi xp=x Postavi s=1 Za svaki x=1 do n čini Postavi xfakt=1 Za svaki j=2 do i pomnoži xfakt s j Povećaj s za xp/xfakt Pomnoži xp s x Kraj za svaki x Zadatak 1.13. Učitaj a, b i c Ako je b*b-4*a*c<0 tada Ispiši poruku da nema realnih rješenja U suprotnom Postavi d=drugi korjen iz b*b-4*a*c Postavi x1=(-b+d)/(2*a) Postavi x2=(-b-d)/(2*a) Ispiši x1 i x2 Kraj ako je Zadatak 1.14. Učitaj a, b i c Sve dok je a>20 ili b>20 ili c>20 ili a+b>c čini Ispiši poruku o pogrešno zadanim brojevima Učitaj a, b i c Kraj sve dok Postavi s=(a+b+c)/2 Postavi p=sqrt(s*(s-a)*(s-b)*(s-c)) Ispiši s Zadatak 1.15. Učitaj broj n Sve dok je n>9 ili n<1 čini Ispiši poruku o pogrešno zadanom n Učitaj n Kraj sve dok Ako je n neparan (n mod 2 =1) povećaj n za 1 Postavi s=0
69

postavi m=0 Za svaki i=n do 2000 u koraku po 2 čini Ako i nije djeljivo s 13 (n mod 13 != 0) tada čini Povećaj s za i Povećaj m za 1 Kraj ako je Kraj za svaki i Postavi s=s/n Ispiši s Zadatak 1.16. Definiraj vektor v od 100 elemenata Za svaki i=0 do 99 učitaj v[i] Postavi imin=0 /* Početno je najmanji i najveći.. */ Postavi imax=0 /* ..broj na početnom mjestu vektora*/ Za svaki i=1 do 99 čini slijedeće/* Nadji mjesto najmanjeg i najvećeg*/ Ako je v[i]<v[imin] postavi imin=i Ako je v[i]>v[imax] postavi imax=i Kraj za svaki i /* Zamijeni mjesta najmanjeg i najvećeg */ Postavi x=v[imin] Postavi v[imin]=v[imax] Postavi v[imax]=x Za svaki i=0 do 99 ispiši v[i] /* Ispiši tako izmjenjeni vektor */ Zadatak 1.17. Definiraj vektore v1 i v2 od 500 elemenata Učitaj n Sve dok je n>500 ili n<1 čini slijedeće Ispiši poruku o pogrešno zadanom broju Učitaj n Kraj sve dok Postavi s=0 Za svaki i=0 do n-1 čini slijedeće Učitaj v1[i] i v2[i] Povećaj s za v1[i]*v2[i] Kraj za svaki i Ispiši s Zadatak 1.18. Definiraj vektore v1 i v2 od 500 elemenata Učitaj n Sve dok je n>500 ili n<1 čini slijedeće Ispiši poruku o pogrešno zadanom broju
70

Učitaj n Kraj sve dok Postavi s=0 Za svaki i=0 do n-1 učitaj v1[i] i v2[i] Za svaki i=0 do (n-1)/2 čini slijedeće /* Od početka do polovice.... */ Postavi x=v2[i] /*.... vektora obavi zamjenu */ Postavi v2[i]=v2[n-1-i] Postavi v2[n-1-i]=x Kraj za svaki i Postavi s=0 /* Nadji skalarni produkt */ Za svaki i=0 do n-1 povećaj s za v1[i]*v2[i] Ispiši s Zadatak 1.19. /* Medijan ucitanih brojeva */ Definiraj vektor v od 1000 elemenata Učitaj broj n Za svaki i=0 do n-1 učitaj v[i] Postavi m=n Postavi sortiran=FALSE Sve dok je sortiran=FALSE čini Postavi sortiran=TRUE Za svaki j=0 do m-2 učini slijedeće: Ako je v[j] > v[j+1] čini Postavi sortiran=FALSE /* Treba zamijeniti v[j] i v[j+1] */ Postavi x=v[j] Postavi v[j]=v[j+1] Postavi v[j+1]=x Kraj Ako je Nastavi sa slijedećim j Smanji m za 1 Kraj Sve dok /* Sada su brojevi sortirani, nadji medijan*/ Ako je n neparan postavi med=v[n/2] U suprotnom postavi med=(v[n/2-1]+v[n/2])/2 Ispiši med Zadatak 1.20. /*Medijan bez sortiranja */ Definiraj matricu v od 1000 redova i dva stupca Učitaj broj n Za svaki i=0 do n-1 učitaj v[i][0] Postavi m=n
71

Postavi iz=0 Postavi ul=1 Sve dok je m>2 čini slijedeće /* Nadji mjesto najmanje i najveceg podatka u iz-tom stupcu*/ Postavi min=0 Postavi max=0 Za svaki i=1 do m-1 čini slijedeće Ako je v[i][iz]>v[max][iz] postavi max=i Ako je v[i][iz]<v[max][iz] postavi min=i Kraj za svaki i /* Prebaci sve elemente osim najmanjeg i najveceg iz iz-tog u ul-ti stupac */ Postavi j=0 Za svaki i=0 do m-1 čini slijedeće Ako je i!=max i i!=min tada Postavi v[j][ul]=v[i][ul] Povećaj j za 1 Kraj ako je Kraj za svaki i Smanji m za 2 Postavi iz=abs(iz-1) Postavi ul=abs(ul-1) Kraj sve dok je m>2 Ako je m=1 ispiši v[1,iz] U suprotnom ispiši (v[1][iz]+v[2][iz])/2 Zadatak 1.21. Definiraj vektor Kocka od 6 elemenata Za svaki i=1 do 6 postavi Kocka[i-1]=0 Za svaki i=1 do 6000 učini slijedeće Postavi k=Rnd(6) Povećaj Kocka[k-1] za 1 Kraj za svaki i Za svaki i=1 do 6 ispiši i i Kocka[i-1] Zadatak 1.22. Učitaj n Postavi b=0 Za svaki i=1 do n učini slijedeće Postavi k1=Rnd(6) Postavi k2=Rnd(6) Ako je k1=k2 Povećaj b za 1 Kraj za svaki i Ispiši b*100/n
72

Zadatak 1.23. Definiraj vektor v od 201 elemenata Za svaki i=1 do 200 postavi v[i]=Rnd(1000) Postavi m=200 Postavi sortiran=FALSE Sve dok je sortiran=FALSE čini Postavi sortiran=TRUE Za svaki j=1 do m-1 učini slijedeće: Ako je v[j] > v[j+1] čini Postavi sortiran=FALSE /* Treba zamijeniti v[j] i v[j+1] */ Postavi x=v[j] Postavi v[j]=v[j+1] Postavi v[j+1]=x Kraj Ako je Nastavi sa slijedećim j Smanji m za 1 Kraj Sve dok /* Sada su brojevi sortirani, nadji medijan*/ Ako je n neparan postavi med=v[n/2+1] U suprotnom postavi med=(v[n/2]+v[n/2+1])/2 Ispiši med Zadatak 1.24. Rješenje sa sortiranjem Definiraj vektor slbr od 101 elemenata Za svaki i=1 do 100 postavi slbr[i]=Rnd(200) /* Sortiraj vektor slbr */ Postavi m=100 Postavi sortiran=FALSE Sve dok je sortiran=FALSE čini Postavi sortiran=TRUE Za svaki j=1 do m-1 učini slijedeće: Ako je slbr[j] > slbr[j+1] čini Postavi sortiran=FALSE /* Treba zamijeniti slbr[j] i slbr[j+1] */ Postavi x=slbr[j] Postavi slbr[j]=slbr[j+1] Postavi slbr[j+1]=x Kraj Ako je Nastavi sa slijedećim j Smanji m za 1
73

Kraj Sve dok /* Brojevi su sada sortirani, nadji broj njihovog ponavljanja */ Postavi b=1 Postavi sx=slbr[1] Postavi i=2 Sve dok je i<=100 čini slijedeće Sve dok je sx=slbr[i] i i<=200 čini slijedeće Povećaj b za 1 Povećaj i za 1 Kraj sve dok Ako je b>1 ispiši b i slbr[i-1] Postavi b=1 Kraj sve dok /* Rješenje bez sortiranja */ Definiraj vektor slbr od 101 elemenata Definira vektor b od 200 elemenata Za svaki i=1 do 100 postavi slbr[i]=Rnd(200) Za svaki i=0 do 199 postavi b[i]=0 Za svaki i=1 do 100 Povećaj b[slbr[i]] za 1 Za svaki i=0 do 199 učini slijedeće Ako je b[i]>1 ispiši i+1 i b[i] Kraj za svaki i Zadatak 1.25. Definiraj vektore b1 i b2 od 51 elemenata Učitaj broj n Sve dok je n>50 čini slijedeće Ispiši poruku o pogrešno zadanom n Učitaj broj n Kraj sve dok Za svaki i=1 do n učini slijedeše Učitaj b1[i] Postavi b2[i]=Rnd(2*n) Kraj za svaki i Postavi m1=1 Postavi m2=1 /* Nadji m1 i m2, mjesta najvecih podataka u b1 odn. b2 */ Za svaki i=2 do n čini slijedeće Ako je b1[i]>b1[m1] postavi m1=b1 Ako je b2[i]>b2[m2] postavi m2=b2 Kraj za svaki i /* Obavi zamjenu podataka na mjestima b1[m1] i b2[m2] */ Postavi x=b1[m1] Postavi b1[m1]=b2[m2] Postavi b2[m2]=x Za svaki i=1 do n ispiši b1[i] i b2[i]
74

Zadatak 1.26. Definiraj matricu M od 20 redaka i stupaca Za svaki i=0 do 19 čini Za svaki j=0 do 19 čini Učitaj M[i][j] Postavi s=0 Za svaki i=0 do 19 Povećaj s za M[i][i] Ispiši s Zadatak 1.27. Definiraj matricu x od 50 redaka i stupaca Učitaj m Sve dok je m>50 ili m<1 učini slijedeće Ispiši poruku o pogrešno zadanom m Učitaj m Kraj sve dok Za svaki i=0 do m-1 čini Za svaki j=0 do m-1 čini Učitaj x[i][j] Postavi p=1 Za svaki i=0 do m-1 pomnoži p s x[i][m-1-i] Ispiši p Zadatak 1.28. Definiraj matricu x od 50 redaka i stupaca Učitaj m i n Za svaki i=0 do m-1 čini Za svaki j=0 do n-1 čini Učitaj M[i][j] Za svaki i=0 do m-1 učini slijedeće Postavi rmax=x[i][0] Za svaki j=1 do n-1 učini slijedeće Ako je x[i][j]>rmax postavi rmax=x[i][j] Kraj za svaki j Ispiši rmax Kraj za svaki i Zadatak 1.29.
75

Definiraj matricu x od 100 redaka i stupaca Učitaj broj m Za svaki i=0 do m-1 čini Za svaki j=0 do m-1 učitaj x[i][j] /* U svakom retku nadji sumu apsolutnih vrijednosti clanova van dijagonale Za svaki i=0 do m-1 učini slijedeće Postavi s=0 Za svaki j=0 do m-1 učini slijedeće Ako je i!=j povećaj s za abs(x[i][j]) Kraj za svaki j /* Usporedi dobivenu sumu s dijagonalnim clanom */ Ako je s>=abs(x[i][i]) tada učini slijedeće Ispiši poruku da matrica nije dijagonalno dominantna Završi program Kraj ako je Kraj za svaki i Ispiši da je matrica dijagonalno dominantna Zadatak 1.30. Definiraj matrice A, B i C od 20 redaka i stupaca Učitaj brojeve m, n i k Ako je m>20 ili n>20 ili k>20 tada učini slijedeće Ispiši poruku o pogrešno zadanim dimenzijama matrice Završi program Kraj ako je /* Ucitaj podatke u matrice A i B */ Za svaki i=0 do m-1 čini slijedeće Za svaki j=0 do n-1 učitaj A[i][j] Kraj za svaki i Za svaki i=0 do n-1 čini slijedeće Za svaki j=0 do k-1 čini učitaj B[i][j] Kraj za svaki i /* Pomnozi matrice: nadji skalarni produkt i-tog retka i j-tog stupca za svaki redak matrice A svaki stupac matrice B */ Za svaki i=0 do m-1 učini slijedeće Za svaki j=0 do k-1 učini slijedeće Postavi C[i][j]=0 Za svaki l=0 do n-1 povećaj C[i][j] za A[i][l]*B[l][j] Kraj za svaki j Kraj za svaki i /* Ispiši maticu produkta C */ Za svaki i=0 do m-1 učini slijedeće Za svaki j=0 do k-1 ispiši C[i][j] Kraj za svaki i
76

*/

Zadatak 1.31. Definiraj matrice A, B i C od 30 redaka i stupaca Učitaj broj m Sve dok je m>30 ili m<1 čini slijedeće Ispiši poruku o pogrešno zadanoj veličini matrice Učitaj broj m Kraj sve dok Učitaj broj p Sve dok je p>10 ili p<1 čini slijedeće Ispiši poruku o pogrešnoj potenciji p Učitaj broj p Kraj ako je /* Ucitaj podatke u matricu A i postavi B=A */ Za svaki i=0 do m-1 čini slijedeće Za svaki j=0 do m-1 čini slijedeće Učitaj A[i][j] Postavi B[i][j]=A[i][j] Kraj za svaki j Kraj za svaki i Za svaki pot=2 do p učini slijedeće /* Pomnozi matrice: nadji skalarni produkt i-tog reda i j-tog stupca za svaki red matrice A svaki stupac matrice B */ Za svaki i=0 do m-1 učini slijedeće Za svaki j=0 do m-1 učini slijedeće Postavi C[i][j]=0 Za svaki l=0 do m-1 povećaj C[i][j] za A[i][l]*B[l][j] Kraj za svaki j Kraj za svaki i /* Prebaci matricu C u matricu B i ponovi množenje */ Za svaki i=0 do m-1 učini slijedeće Za svaki j=0 do m-1 postavi B[i][j]=C[i][j] Kraj za svaki i Nastavi sa slijedećim pot /* Ispiši potenciranu maticu C */ Za svaki i=0 do m-1 učini slijedeće Za svaki j=0 do m-1 ispiši C[i][j] Kraj za svaki i Zadatak 1.32. Definiraj matricu a od 50 redaka i stupaca Učitaj brojeve m i n /* Ucitaj podatke u matricu a */
77

Za svaki i=0 do m-1 čini slijedeće Za svaki j=0 do n-1učitaj a[i][j] Kraj za svaki i /* Učitaj brojeve l1, l2 i i ispitaj njihovu ispravnost */ Učitaj l1, l2 i i Ako je l1=l2 ili ako je i=1 i (l1>m ili l2>m) ili ako je i!=1 i (l1>n ili l2>n) tada učini slijedeće Ispiši poruku o pogrešno zadanim parametrima Za svaki i=0 do m-1 učini slijedeće Za svaki j=1 do n-1 ispiši a[i][j] Kraj za svaki i Završi program Kraj ako je /* Ako je i=1 zamijeni retke, u suprotnom zamijeni stupce */ Ako je i= 1 tada učini slijedeće Za svaki j=0 do n-1 učini slijedeće Postavi x=a[l1][j] Postavi a[l1][j]=a[l2][j] Postavi a[l1][j]=x Kraj za svaki j U suprotnom Za svaki i=0 do m-1 učini slijedeće Postavi x=a[i][l1] Postavi a[i][l1]=a[i][l2] Postavi a[i][l2]=x Kraj za svaki i /* Ispiši dobivenu matricu */ Za svaki i=0 do m-1 učini slijedeće Za svaki j=1 do n-1 ispiši a[i][j] Kraj za svaki I

78

Zadatak 2.1. #include<stdio.h> void main() { /* Aritmeticka sredina niza od N brojeva */ int n,i; float zbroj,broj,srednja; zbroj=0; n=0; while (n<=0) { scanf("%d",&n); if (n<=0) printf("Broj je zadan neispravno \n"); } for(i=1;i<=n;i++) { scanf("%f",&broj); zbroj=zbroj+broj; } srednja=zbroj/n; printf("Srednja vrijednost je %f",srednja); } Zadatak 2.2. #include<stdio.h> int main() { /* Aritmeticka sredina niza brojeva */ int brojac; float zbroj,x,sredn; brojac = zbroj =0; while (1) { scanf("%f",&x); if(x==99999) { sredn=zbroj/brojac; printf("Aritmeticka sredina ucitanih brojeva je %f \n",sredn); return 0; } zbroj+=x;
79

brojac++; } return 0; }

Zadatak 2.3. #include<stdio.h> void main() { /* Aritmeticka sredina niza brojeva */ int brojac; float zbroj,x,sredn; zbroj=brojac=0; while(1) { scanf("%f",&x); if(x==9) { sredn=zbroj/brojac; printf("Aritmeticka sredina ucitanih brojeva je %f \n",sredn); return; } if(x>=2 && x<=5) { zbroj+=x; brojac++; } } } Zadatak 2.4. #include<stdio.h> void main() { /* Program za izracunavanje N! */ int n,i; float pdkt; n=0; while(n<1 || n>33) { scanf("%d",&n); if(n<=1 || n>=33) printf("Broj nije unutar granice 1 do 33 \n"); } pdkt=1;
80

for(i=2;i<=n;i++) pdkt*=i; printf("Rezultat je: %f \n",pdkt); } Zadatak 2.5. #include<stdio.h> void main() { /* Izracunavanje binomnog koeficijenta */ int m,n,i,brojnik,nazivnik; printf("\nRacunanje m povrh n (m>n>0)"); m=0; while( m<1 || n<1 || n>m) { printf("\nMolim zadajte m i n "); scanf("%d%d",&m,&n); } brojnik=1; for(i=m;i>m-n;i--) brojnik*=i; nazivnik for(i=1;i<=n;i++) nazivnik*=i; brojnik/=nazivnik; printf("Binomni koeficijent je %d \n ",brojnik); } Zadatak 2.6. #include<stdio.h> #include<math.h> void main() { /* Suma drugih korjena neparnih brojeva izmedju n1 i n2 */ int m,n,pomoc,i; float suma,rdx; printf("\nMolim dva broja m i n (0<m<n) "); m=0; while(m<1 || n<1 || m>=n ) scanf("%d%d",&m,&n); if(m>n) { pomoc=n; n=m; m=pomoc; }
81

suma=0; if(m%2==0) m++; for(i=m;i<=n;i=i+2) { rdx=i; rdx=sqrt(rdx); suma+=rdx; } printf("Suma drugih korjena je %.3f",suma); } Zadatak 2.7. #include<stdio.h> void main() { /* Prebrojavanje brojeva koji imaju zadnju znamenku jednaku 3 */ int n=0,m; printf("\nUpisujte cijele brojeve (-1000 za kraj)\n"); scanf("%d",&m); while (m!=-1000) { if(m%10==3 || m%10==-3)n++; scanf("%d",&m); } printf("\n%4d brojeva ima zadnju znamenku 3 ",n); } Zadatak 2.8. #include<stdio.h> #include<math.h> void main() { /* Prebrojavanje brojeva koji imaju prvu znamenku jednaku m */ int m,n,k,ibr=0; char c; float x; do { printf("\nZadajte znamenku "); m=getchar()-'0'; } while (m>9 ); printf ("\nZadajte cijele brojeve (9999 za kraj) "); scanf("%d",&k); do {
82

n=log10 (k); /* Nadji prvu znamenku. To se moze obaviti i ovako:n=k; while(n>9) n/=10;..... */ n=k/pow(10,n); /*... n je prva znamenka */ if(n==m)ibr++; scanf("%d",&k); } while(k!=9999); printf("%d brojeva ima prvu znamenku jednaku %d ",ibr,m); } Zadatak 2.9. #include<stdio.h> void main() { /* Prebrojavanje brojeva koji imaju jednaku prvu i zadnju znamenku jednaku int ibr,i,m,n; float x; ibr=0; printf("\nZadajte 10 cijelih brojeva\n"); for(i=1;i<=10;i++) { scanf("%d",&m); n=m; while(n>9)n/=10; if(m%10==n) ibr++; } printf("Ucitano je %d brojeva sa jednakom prvom i zadnjom znamenkom",ibr); } Zadatak 2.10. #include<stdio.h> void main() { /* Pronalazenje prostih faktora broja */ int m,n,k; printf("\nZadajte cijeli broj\n"); scanf("%d",&m); printf("\nProsti faktori zadanog broja su\n"); n=m/2; for (k=2;k<=n;k++) { while(m%k==0) {printf("\n%3d",k); m/=k; }
83

*/

} } Zadatak 2.11. #include<stdio.h> #include<math.h> void main() { Pronalazenje prostih brojeva od 1 do 1000 */ int i,j,m; float x; for(i=1;i<=1000;i=i+1) { x=i; m=sqrt(x); for(j=2;j<=m;j++) if(i%j==0) break; if(i==2 || i%j!=0) printf("\n%3d",i); } } Zadatak 2.12. ***************01/09/03************ Pazi stdprn #include<stdio.h> #include<math.h> void main() { /* Tablica logaritama prirodnih brojeva od 1 do n */ /* Ispis na pisač, 60 redova po stranici */ int n=0,br=60,str=1,i,m; float x; printf("\nCijeli broj veci od 1 molim "); while (n<2) scanf("%d",&n); if (br==64) /*Ispis naslova */ { fprintf(stdprn, "\f Logaritmi prirodnih brojeva Str. %3d",str); fprintf(stdprn, "\n n Log10(n) Log(n) Log2(n)\n\n" ); str++; br=3; } for (i=1;i<=n;i++); { x=i; fprintf(stdprn,"\n%3d %7.4f %7.4f %7.4f",i,log10(x),log(x),log(x)/log(2)); } }
84

Zadatak 2.13. #include<stdio.h> #include<math.h> #include <stdlib.h> void main() { /* Tabela sinusa i dekadskog logaritma sinusa */ float x1,x2,dx,x,d,a; int str=1,br=64; FILE *pisac; pisac=stdprn; printf("\nUcitajte x1,x2,dx\n"); scanf("%f%f%f",&x1,&x2,&dx); d=(x2-x1)/50; if(x2<=x1 || dx>d) {printf("\nParametri su neispravno zadani"); exit(1); } for(x=x1;x<=x2;x+=dx) { a=sin(x); if (br==64) /*Ispis naslova */ { fprintf(pisac, "\f\n Tabela sinusa i njihovih logaritama fprintf(pisac, "\n x sin(x) Log(sin(x))\n\n" ); str++; br=3; } if(a<=0) fprintf(pisac,"\n%7.4f %7.4f **.****",x,a); else fprintf(pisac,"\n%7.4f %7.4f %7.4f",x,a,log10(a)); } fprintf(pisac,"\f"); } Zadatak 2.14. #include<stdio.h> #include<math.h> void main() { /* Goldbachovo pravilo: Rastavi parni broj u zbroj dva prosta broja */ char jprost,iprost; int n1,n2,m,i,j,l,ir;
85

Str. %3d",str);

float x,y; printf("\nMolim zadajte dva prirodna broja n1 i n2 (n1<n2) "); do {scanf("%d%d",&n1,&n2); if(n1>=n2 || n1<0) printf("Pogresno zadan interval.Ponovite"); } while(n1>=n2 || n1<0); if(n1%2!=0) n1++; // n1 postavi paran for(i=n1;i<=n2;i+=2) // Petlja za sve parne...... {printf("\n%4d",i); //..... brojeve u intervalu for(j=3;j<i;j+=2) // j je prvi pribrojnik { if(j<9)jprost=1; // j je prost broj else{ jprost=1; // Ustanovi da li je j ipak prost m=sqrt(j); for(l=3;l<=m;l+=2) if(j%l==0) {jprost=0; break; } } if (jprost) // j je prost { // Prvi pribrojnik je prost ir=i-j; // ir je drugi pribrojnik if (ir<9)iprost=1; // ir je isto prost else // Ustanovi da li je ir prost {iprost=1; m=sqrt(i); for(l=3;l<=m;l+=2) if(ir%l==0) {iprost=0; // ir nije prost break; } } } if(jprost && iprost) {printf("%4d%4d",j,ir); //ispisi par j,ir break; // Ispisano, idi na iduci i } } // Kraj petlje po j } // Kraj petlje po i } Zadatak 2.15. #include<stdio.h>
86

#include<math.h> void main() { /* Racunanje Pitagorinih brojeva k*k=i*i+j*j */ int i,j,k; float x,a; const tisucu=1000; for(i=1;i<=tisucu;i++) { for(j=i+1;j<=tisucu;j++) { x=i*i+1.*j*j; a=sqrt(x); k=a; if(k<=tisucu && k==a) printf("\n %4d %4d %4d",i,j,k); } } } Zadatak 2.16. #include<stdio.h> #include<math.h> void main() { /* Program koji izracunava sumu od N clanova reda 1+ x/1! + x*x/2! + pow(x,3/3!.... +pow(x,n)/n! */ int n,i; float x,a,suma=1,prod=1; scanf("%d",&n); scanf("%f",&x); for(i=1;i<=n;i++) { a=x/i; prod=prod*a; suma=suma+prod; } printf("suma = %f\n",suma); } Zadatak 2.17. #include<stdio.h> #include<math.h> void main() { /* Racunanje funkcije sin(x) razvojem u red s=x-pow(x,3)/3!+pow(x,5)/5!-+..... +pow(x,2*n+1)/(2*n+1)! */
87

int i,n; float x,a,prod,suma,skt; printf("\nZadajte kut (u radijanima) "); scanf("%f",&x); suma=prod=x; for(i=1;i<=19;i++) { n=2*i+1; prod=prod*x*x/((n-1)*n); suma=suma+prod*pow((-1),i); } printf("Izracunato: %8.5f; funkcija %8.5f; razlika: %E \n" ,suma,sin(x),fabs(suma-sin(x))); }

88

Zadatak 3.1. /* Program za izracunavanje srednje vrijednosti ucitanih brojeva */ /* Ispis brojeva vecih od srednje vrijednosti */ #include<stdio.h> #include<math.h> void main() { int iv[50],isum=0,i; float sred; for(i=0;i<=49;i++) {scanf("%d",&iv[i]); isum+=iv[i]; } sred=isum/50.; printf("\nBrojevi veci od srednje vrijednosti sr=%8.3f",sred," su:"); for(i=0;i<=49;i++) if(iv[i]>sred) printf("\n%d",iv[i]); } Zadatak 3.2. #include<stdio.h> #include<math.h> void main() {/* Skalarni produktoriginalnog i zamijenjenog vektora */ float v1[100],v2[100],skal,tmp; int m,i,k,l; printf("\nCijeli broj manji od 101 molim "); do {scanf("%d",&m); if(m>100) printf("\nBroj elemenata je prevelik.Ponovite"); } while(m>100); printf("\nUnesite vrijednosti vektora v1[i],v2[i]\n"); for(i=1;i<=m;i++) scanf("%f%f",&v1[i-1],&v2[i-1]); k=m/2; for(i=1;i<=k;i++) { l=m-i+1; tmp=v2[i-1]; v2[i-1]=v2[l-1]; v2[l-1]=tmp; } skal=0; for(i=1;i<=m;i++) skal=skal+v1[i-1]*v2[i-1];
89

printf("\nRezultat: %10.4f",skal); }

90

Zadatak 3.3. #include<stdio.h> #include<math.h> void main() { int m,i; float x[200],xmin,xmax; do {printf("\nUpisite broj elemenata vektora x "); scanf("%d",&m); if(m>201) printf("\nPogresno zadan broj elemenata vektora"); } while(m>200); printf("\nUnesite brojeve\n"); for(i=1;i<=m;i++) scanf("%f",&x[i-1]); xmin=x[0]; xmax=x[0]; for(i=1;i<m;i++) { if(x[i]<xmin) xmin=x[i]; if(x[i]>xmax) xmax=x[i]; } xmin=xmin*2; xmax=xmax/2; printf("\nClanovi veci od xmax/2 i manji od xmin*2 su:\n"); for(i=0;i<m;i++) if(x[i]>xmax && x[i]<xmin) printf("\n%7.2f ",x[i]); } Zadatak 3.4. /* Geometrijska sredina gs brojeva razlicitih od nule i ispis brojeva vecih od gs */ #include<stdio.h> #include<math.h> void main() { int k=0,i; float x,gs,v[50]; printf("\nZadajte 50 realnih brojeva\n"); for(i=1;i<=50;i++) { scanf("%f",&x);
91

if(x) { v[k]=fabs(x); k++; } } gs=1; for(i=1;i<=k;i++) gs*=v[i-1]; x=k; gs=pow(10,1/x*log10(gs)); /* k-ti korjen racunaj pomocu logaritma */ printf("\n%8.3f",gs); for(i=1;i<=k;i++) if(v[i-1]<gs) printf("\n%8.3f",v[i-1]); }

Zadatak 3.5. /* Poredak takmicara - "Insert Sort" */ #include<stdio.h> #include<math.h> void main() { int vsbr[200],sbr,i,j,m,l,ll; float vt[200],t; printf("\nUcitaj startni broj i postignuto vrijeme takmicara\n"); printf("Za kraj unesite startni broj 999 i proizvoljno vrijeme\n\n"); scanf("%d%f",&vsbr[0],&vt[0]); // Prvog stavi na prvo mjesto printf("\nTakmicar %3d vrijeme %8.3f 1. mjesto\n",vsbr[0],vt[0],i+1); scanf("%d%f",&sbr,&t); j=1; do { i=0; while(t>vt[i] && i<j)i++; // Nadji mjesto "i" za vrijeme "t" printf("\nTakmicar %3d vrijeme %8.3f %3d. mjesto\n",sbr,t,i+1); if(i!=j) // Takmicar nije zadnji for (l=j;l>i;l--) {vsbr[l]=vsbr[l-1];// Pomakni slabije za jedno mjesto vt[l]=vt[l-1]; } vt[i]=t; vsbr[i]=sbr; // Ubiljezi takmicara i vrijeme u tabele scanf("%d%f",&sbr,&t); j++; } while (sbr!=999); j--; // Svi takmicari prosli - ispisi konacni poredak
92

printf("\n\nKonacni poredak \nMjesto Broj Vrijeme\n"); for (i=0;i<=j;i++) printf("\n%6d %6d %10.3f",i+1,vsbr[i],vt[i]); } Zadatak 3.6. /* T spoj otpornika. Naci otpor u tockama 1 - 2 prema slici 3.1 */ #include<stdio.h> #include<math.h> void main() { int n,i; float ra[100],rb[100],r12; printf("\nZadajte parove otpora Ra i Rb, za kraj upisite 999 999\n\n"); n=0; do { scanf("%f%f",&ra[n],&rb[n]); n++; } while(ra[n-1]!=999); n=n-1; // "n" je broj parova otpornika r12=ra[n]+rb[n]; // Zadnja dva su spojena u seriju for(i=n-2;i>=0;i--) // Kod ostalih ra je spojen serijski.. r12=ra[i]+r12*rb[i]/(r12+rb[i]); // .. a rb paralelno s r12 printf("\nVrijednost otpora izmedju tocaka 1 i 2 je %10.4f ohma\n",r12); } Zadatak 3.7. /* Pronalazenje medijana sortiranjem ucitanog vektora */ #include<stdio.h> #include<math.h> void main() { char sortiran; int m,m1,i,is,j,xp,n; float x[100],rez; printf("\nPrirodan broj m manji od 200 molim "); do { scanf("%d",&m); if (m>199 || m<1) printf("\nPogresno zadan broj podataka m"); } while (m>201 || m<1); m1=m-1; printf("\n Upisujte %3d realnih brojeva\n ",m); for(i=0;i<m;i++) scanf("%f",&x[i]);
93

sortiran=0; while (!sortiran) { sortiran=1; for(j=0;j<m1;j++) if(x[j]>x[j+1]) { // Jos treba zamijeniti xp=x[j]; x[j]=x[j+1]; x[j+1]=xp; sortiran=0; // Zabiljezi da je jos bilo zamjena.... } m1--; // .. ali je broj neporedanih za 1 manji } n=m/2; if(n*2==m) rez=(x[n-1]+x[n])/2; // Paran broj clanova else rez=x[n]; // Neparan broj clanova printf("\nMedijan je jednak %10.3f",rez); } Zadatak 3.8. /* Vrijednost zaliha materijala vecih od 10% ukupnih zaliha */ #include<stdio.h> void main() { int sifra[300],i; float cijena[300],kolic[300],dsd,ukzlh; printf ("\nUpisujte 300 podataka (sifra cijena kolicina) o proizvodima\n"); ukzlh=0; for(i=0;i<300;i++) {scanf("%d%f%f",&sifra[i],&cijena[i],&kolic[i]); ukzlh+=cijena[i]*kolic[i]; } printf("\nIznos ukupnih zaliha iznosi %10.4f\n",ukzlh); printf("\nSifre proizvoda sa zalihama vecim od 10%% ukupnih zaliha\n"); /* %% radi formata! */ dsd=ukzlh/10; for(i=0;i<300;i++) if(cijena[i]*kolic[i]>dsd) printf("\n%4d",sifra[i]); } Zadatak 3.9. /* Racunanje rada iz komponenata vektora sile i puta */
94

#include<stdio.h> void main() { float sx[100],sy[100],fx[100],fy[100],w; int i; printf( "\nZadajte 100 parova za komponente puta i 100 parova za komponente sile\n"); for(i=0;i<100;i++) {scanf("%f%f",&sx[i],&sy[i]); scanf("%f%f",&fx[i],&fy[i]); } w=0.0; for(i=0;i<100;i++) w=w+sx[i]*fx[i]+sy[i]*fy[i]; printf("\nObavljeni rad je jednak %10.4f",w); } Zadatak 3.10. /* Tabeliranje podataka o studentima*/ #include<stdio.h> #include<math.h> void main() { int god,spol,a[5][3]; for (god=0;god<=4;god++) for (spol=0;spol<=2;spol++) a[god][spol]=0; printf("\nZadajte podatke o godini (1 do 4 i spolu [m=1][z=2];CtrlZ za kraj\n"); scanf("%d%d",&god,&spol); do { if(god<=4 && god>0 && (spol==1 || spol==2)) // Uzmi u obzir samo { // ispravne podatke a[god-1][spol-1]++; // Povecaj odgovarajuci element matrice za 1 a[4][spol-1]++; // Povecaj sumu stupca a[god-1][2]++; // Povecaj sumu retka a[4][2]++; // Povecaj ukupnu sumu } scanf("%d%d",&god,&spol); } while (!feof(stdin)); printf("Podaci o studentima po godinama\n"); printf("\nGod. muski zenski ukupno\n"); for(god=1;god<=5;god++) { if (god<=4) printf("\n%5d",god); else printf("\nUkup.");
95

for (spol=1;spol<=3;spol++) printf("%6d",a[god-1][spol-1]); } } Zadatak 3.11. /* Tabeliranje podataka o studentima - relativni podaci*/ #include<stdio.h> #include<math.h> void main() { int god,spol,a[5][2]; float x; for (god=0;god<=4;god++) for (spol=0;spol<=1;spol++) a[god][spol]=0; printf("\nZadajte podatke o godini (1 do 4 i spolu [m=1][z=2];CtrlZ za kraj\n"); scanf("%d%d",&god,&spol); do { if(god<=4 && god>0 && (spol==1 || spol==2)) // Uzmi u obzir samo { // ispravne podatke a[god-1][spol-1]++; // Povecaj odgovarajuci element matrice za 1 a[4][spol-1]++; // Povecaj sumu stupca } scanf("%d%d",&god,&spol); } while (!feof(stdin)); printf("Relativni podaci o studentima po godinama\n"); printf("\nGod. muski zenski \n"); for(god=1;god<=5;god++) { if (god<=4) printf("\n%5d",god); else printf("\nUkup."); for (spol=1;spol<=2;spol++) {if (a[4][spol-1]>0) x=1.*a[god-1][spol-1]/a[4][spol-1]; else x=0; printf("%7.2f%%",x); } } } Zadatak 3.12.
96

#include <stdio.h> #include <stdarg.h> #include <stdlib.h> void main() { int m,n,j,i; float a[30][30]; printf("\nZadajte broj redaka (m<30) i stupaca (n<30) matrice) "); scanf("%d%d",&m,&n); if (m>29||m<1||n>29||n<1) exit(1); printf("\nZadajte podatke za matricu (%3d redaka s %3d stupaca)\n ", m,n); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) scanf("%f",&a[i-1][j-1]); a[i-1][n]=0; } for(j=1;j<=n;j++) a[0][n]+=a[0][j-1]; printf("Ucitani i sumarni clan u 1. redu su:\n"); for(j=1;j<=n;j++) printf("%5d. %8.2f\n",j,a[0][j-1]); printf("\nUkupno %8.2f",a[0][n]); }

97

Zadatak 3.13. #include<stdio.h> void main() {/* Dijeljenje matrice s dijagonalnom clanom */ int i,j; float x[8][8],q; printf("\nZadajte 8 redaka s osam brojeva\n"); for(j=1;j<=8;j++) for(i=1;i<=8;i++) scanf("%f",&x[i-1][j-1]); for(i=1;i<=8;i++) if(x[i-1][i-1]!=0) { q=x[i-1][i-1]; for(j=1;j<=8;j++) x[i-1][j-1]/=q; } else {for(j=1;j<=8;j++) x[i-1][j-1]=0; x[i-1][i-1]=1; } printf("\nRezultat:\n"); for(i=1;i<=8;i++) {for(j=1;j<=8;j++) printf("%f ",x[i-1][j-1]); printf("\n"); } } Zadatak 3.14. #include<stdio.h> void main() { /* Promjene u matrici iznad i ispod dijagonale */ int i,j; float x,z[6][6]; printf("\nZadajte realni broj x\n"); scanf("%f",&x); printf("\nUpisite 6 redaka sa 6 realnih brojeva\n"); for(i=1;i<=6;i++) for(j=1;j<=6;j++) scanf("%f",&z[i-1][j-1]); for(i=1;i<=6;i++) for(j=1;j<=6;j++) if(i>j) z[i-1][j-1]/=x; if(i<j) z[i-1][j-1]*=x; printf("\nMatrica z nakon dijeljenja/mnozenja s x:\n"); for (i=1;i<=6;i++) {for(j=1;j<=6;j++)
98

printf("%8.2f",z[i-1][j-1]); printf("\n"); } }

99

Zadatak 3.15. #include<stdio.h> #include<math.h> void main() { int m,i,j; float x[50][50],y[50],z[50]; printf("\nZadajte cijeli broj manjiod 50 "); scanf("%d",&m); printf( "\nZadajte %2d redaka s %2d realnih brojevaza matricu\n",m,m); for(i=1;i<=m;i++) for(j=1;j<=m;j++) scanf("%f",&x[i-1][j-1]); printf("\nZadajte %2d realnih brojeva za vektor\n",m); for(i=1;i<=m;i++) scanf("%f",&y[i-1]); for(i=1;i<=m;i++) { z[i-1]=0.0; for(j=1;j<=m;j++) z[i-1]+=x[i-1][j-1]*y[j-1]; } printf("\nUmnozak matrice i vektora je\n"); for(i=1;i<=m;i++) printf("\n%f",z[i-1]); } Zadatak 3.16. /* Umnozak matrice i njene transponirane */ #include<stdio.h> void main() { int i,j,m,k; float a[40][40],b[40][40],c[40][40]; printf("\nZadajte cijeli broj manji od 40 "); scanf("%d",&m); for(i=1;i<=m;i++) // Ucitaj a matricu for(j=1;j<=m;j++) scanf("%f",&a[i-1][j-1]); for(i=1;i<=m;i++) // Transponiraj je u b matricu for(j=1;j<=m;j++) b[i-1][j-1]=a[j-1][i-1]; for(i=1;i<=m;i++) // Pomnozi matrice for(j=1;j<=m;j++) { c[i-1][j-1]=0.0; for(k=1;k<=m;k++) c[i-1][j-1]+=a[i-1][k-1]*b[k-1][j-1]; } printf("\nMatrica puta njena transponirana je:\n");
100

for(i=1;i<=m;i++) { for(j=1;j<=m;j++) printf("%8.2f ",c[i-1][j-1]); printf("\n"); } } Zadatak 3.17. /* Naci umnozak matrica a * a */ #include<stdio.h> void main() { int i,j,m,k; float a[40][40],b[40][40]; printf("\nZadajte prirodni broj m manji od 40 "); scanf("%d",&m); printf("\nZadajte %d puta %d realnih brojeva matrice \n",m,m); for(i=1;i<=m;i++) for (j=1;j<=m;j++)scanf("%f",&a[i-1][j-1]); // Pomnozi matricu sa samom sobom for(i=1;i<=m;i++) for(j=1;j<=m;j++) { b[i-1][j-1]=0.0; for(k=1;k<=m;k++) b[i-1][j-1]+=a[i-1][k-1]*a[k-1][j-1]; } // ispisi produkt printf("\nMatrica pomnozena sa samom sobom je:\n"); for(i=1;i<=m;i++) { for(j=1;j<=m;j++) printf("%8.2f ",b[i-1][j-1]); printf("\n"); } } Zadatak 3.18. /* Naci umnozak matrica x * x i pomnoziti zadnji stupac s y */ #include<stdio.h> void main() { int i,j,m,k; float x[40][40],z[40][40],y;
101

printf("\nZadajte prirodni broj m manji od 40 "); scanf("%d",&m); printf("\nZadajte %d puta %d realnih brojeva matrice \n",m,m); for(i=1;i<=m;i++) for (j=1;j<=m;j++)scanf("%f",&x[i-1][j-1]); printf("\nZadajte realni broj y "); scanf("%f",&y); // Pomnozi matricu sa samom sobom for(i=1;i<=m;i++) for(j=1;j<=m;j++) { z[i-1][j-1]=0.0; for(k=1;k<=m;k++) z[i-1][j-1]+=x[i-1][k-1]*x[k-1][j-1]; } // Pomnozi zadnji stupac matrice s x for (i=1;i<=m;i++)z[i-1][m-1]*=y; // ispisi produkt printf("\nMatrica pomnozena sa samom sobom i brojem x je:\n"); for(i=1;i<=m;i++) { for(j=1;j<=m;j++) printf("%8.2f ",z[i-1][j-1]); printf("\n"); } } Zadatak 3.19. /* Naci n-tu potenciju matrice a */ #include<stdio.h> void main() { int i,j,n,k,p; float a[5][5],b[5][5],c[5][5]; printf("\nZadajte potenciju n "); scanf("%d",&n); printf("\nZadajte 5 puta 5 realnih brojeva matrice \n"); for(i=1;i<=5;i++) for (j=1;j<=5;j++) {scanf("%f",&a[i-1][j-1]); b[i-1][j-1]=a[i-1][j-1]; } // Potenciraj matricu mnozeci je sa samom sobom n-1 puta for (p=2;p<=n;p++)
102

{ for(i=1;i<=5;i++) for(j=1;j<=5;j++) { c[i-1][j-1]=0.0; for(k=1;k<=5;k++) c[i-1][j-1]+=a[i-1][k-1]*b[k-1][j-1]; } // Prenesi matric c natrag u b matricu for (i=1;i<=5;i++) for (j=1;j<=5;j++) b[i-1][j-1]=c[i-1][j-1] ; } // ispisi potenciranu matricu printf("\nMatrica potencirana na potenciju %3d je:\n",n); for(i=1;i<=5;i++) { for(j=1;j<=5;j++) printf("%8.2f ",c[i-1][j-1]); printf("\n"); } } Zadatak 3.20. /* Svodjenje matrice na gornju trokutastu Gaussovom eliminacijom */ #include <stdio.h> void main() { float A[31][31],z; int n,i,j,k,sig,ind; printf("\nSvodjenje matrice na gornju trokutastu \n\n"); printf("\nMolim zadajte broj redaka i stupaca matrice A "); scanf("%d",&n); printf("\n Molim matricu A; (%2d x %2d brojeva)\n\n",n,n); for (i=1;i<=n;i++) {for (j=1;j<=n;j++) scanf("%f", &A[i][j]); } /* Ispisi pocetnu matricu */ printf("\nPocetna matrica je:\n"); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%8.3f",A[i][j]); printf("\n"); } /* Iteracija za svaki stupac: Svedi clanove ispod dijagonale na nulu*/
103

sig=1; /*Zabiljezi predznak koji se mijenja ako se zamijene redovi */ for (k=1;k<=n-1;k++) { if (A[k][k]==0) /* Dijagonalni clan je jednak nuli; */ {ind=0; for(i=k+1;i<=n && !ind;i++) /* Izvrsi zamjenu ako je moguca. */ if(A[i][k]!=0) {ind=1; /* Zamijeni i-ti i k-ti red */ for (j=k;j<=n;j++) {z=A[k][j]; A[k][j]=A[i][j]; A[i][j]=z; sig=-sig; } if (!ind) { printf("\nMatrica se ne moze svesti na gornju trokutastu"); return; } } } /* Podijeli clanove ispod dijagonale s dijagonalnim clanom */ /* i obavi odbijanje kako bi dobio 0 ispod dijagonale */ for (i=k+1;i<=n;i++) { z=A[i][k]/A[k][k]; for (j=k;j<=n;j++) A[i][j]-=z*A[k][j]; } /* Ispisi matricu u ovoj iteraciji */ printf("\nMatrica nakon %2d iteracije je:\n",j); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) printf("%8.3f",A[i][j]); printf("\n"); } } } Zadatak 3.21. /* Svodjenje transponirane matrice na gornju trokutastu */ #include <stdio.h> void main() { float A[8][8],B[8][8],z; int n,i,j,k,sig,ind; printf("\nTransponiranje i svodjenje matrice na gornju trokutastu \n\n");
104

printf("\n Molim matricu A; (8 x 8 brojeva)\n\n"); for (i=0;i<=7;i++) {for (j=0;j<=7;j++) scanf("%f", &A[i][j]); } /* Transponiraj matricu for(i=0;i<=7;i++) for(j=0;j<=7;j++) B[j][i]=A[i][j]; */

/* Iteracija za svaki stupac: Svedi clanove ispod dijagonale na nulu*/ sig=1; /*Zabiljezi predznak koji se mijenja ako se zamijene redovi for (k=0;k<=n-2;k++) { if (B[k][k]==0) /* Dijagonalni clan je jednak nuli; */ {ind=0; for(i=k;i<=7 && !ind;i++) /* Izvrsi zamjenu ako je moguca. */ if(B[i][k]!=0) {ind=1; /* Zamijeni i-ti i k-ti red */ for (j=k-1;j<=7;j++) {z=B[k][j]; B[k][j]=B[i][j]; B[i][j]=z; sig=-sig; } if (!ind) { printf("\nMatrica se ne moze svesti na gornju trokutastu"); return; } } } /* Podijeli clanove ispod dijagonale s dijagonalnim clanom */ /* i obavi odbijanje kako bi dobio 0 ispod dijagonale */ for (i=k;i<=7;i++) { z=B[i][k]/B[k][k]; for (j=k-1;j<=7;j++) B[i][j]-=z*B[k][j]; } } /* Ispisi rezultat */ for(i=0;i<=7;i++) {for(j=0;j<=7;j++) printf("%10.3f",B[i][j]); printf("\n"); } }

*/

105

Zadatak 3.22. /* Nalazenje determinante svodjenjm matrice na gornju trokutastu */ #include <stdio.h> main() { const osam=8; float A[8][8],B[8][8],z; int n,i,j,k,sig,ind; printf("\nNalazenje determinante svodjenje matrice na gornju trokutastu \n\n"); printf("\n Molim matricu A; (osam x osam brojeva)\n\n"); for (i=0;i<=osam-1;i++) {for (j=0;j<=osam-1;j++) scanf("%f", &A[i][j]); } /* Iteracija za svaki stupac: Svedi clanove ispod dijagonale na nulu*/ sig=1; /*Zabiljezi predznak koji se mijenja ako se zamijene redovi for (k=0;k<=osam-2;k++) { if (A[k][k]==0) /* Dijagonalni clan je jednak nuli; */ {ind=0; for(i=k;i<=osam-1 && !ind;i++) /* Izvrsi zamjenu ako je moguca. */ if(A[i][k]!=0) {ind=1; /* Zamijeni i-ti i k-ti red */ for (j=k-1;j<=osam-1;j++) {z=A[k][j]; A[k][j]=A[i][j]; A[i][j]=z; sig=-sig; } if (!ind) { printf("\nDetrminanta d= 0.00\n"); return 0; } } } /* Podijeli clanove ispod dijagonale s dijagonalnim clanom */ /* i obavi odbijanje kako bi dobio 0 ispod dijagonale */ for (i=k+1;i<=osam-1;i++) { z=A[i][k]/A[k][k]; for (j=k-1;j<=osam-1;j++) A[i][j]-=z*A[k][j]; } } /* Nadji determinantu kao umnozak dijagonalnih clanova gornje trokutaste matrice*/ z=sig; /* Umnozak je pocetno –1 ili 1 ovisno o broju zamjena redova*/
106

*/

for(i=0;i<=osam-1;i++) z*=A[i][i]; printf("\nDeterminanta d=%f8.2\n",z); return 0; } Zadatak 3.23. /* Omjer determinanti dviju matrica */ #include <stdio.h> void main() { float d1,d2,A1100][100],A2[100][100],z; int m1,m2,i,j,k,sig; printf("\nOmjer determinanti matrica A1 i A2 \n\n"); printf("\nBroj redaka matrice A1: "); scanf("%d",&m1); printf("\n Molim matricu A1; (%d x %d brojeva)\n\n",m1,m1); for (i=0;i<=m1-1;i++) {for (j=0;j<=m1-1;j++) scanf("%f", &A1[i][j]); } printf("\nBroj redaka matrice A2: "); scanf("%d",&m2); printf("\n Molim matricu A2; (%d x %d brojeva)\n\n",m2,m2); for (i=0;i<=m2-1;i++) for (j=0;j<=m2-1;j++) scanf("%f", &A2[i][j]); /* Matrica A1 */ /* Iteracija za svaki stupac: Svedi clanove ispod dijagonale na nulu*/ sig=1; /*Zabiljezi predznak koji se mijenja ako se zamijene redovi */ d1=1; for (k=0;k<=m1-2 && d1; k++) {if (A1[k][k]==0) /* Dijagonalni clan je jednak nuli; */ {d1=0; /* Ako d1 ostane 0, zamjena nije moguca */ for(i=k+1;i<=m1-1 && !d1; i++) /* Izvrsi zamjenu ako je moguca. */ if(A1[i][k]!=0) {d1=1; /* Zamijeni i-ti i k-ti red */ for (j=k;j<=m1-1;j++) {z=A1[k][j]; A1[k][j]=A2[i][j]; A1[i][j]=z; sig=-sig; }
107

} } /* Podijeli clanove ispod dijagonale s dijagonalnim clanom */ /* i obavi odbijanje kako bi dobio 0 ispod dijagonale */ if(d1) for (i=k+1;i<=m1-1;i++) { z=A1[i][k]/A1[k][k]; for (j=k;j<=m1-1;j++) A1[i][j]-=z*A1[k][j]; } } /* Nadju determinantu */ if(d1!=0) { d1=A1[0][0]*sig; for (i=1;i<=m1-1;i++) d1*=A1[i][i]; } /* Matrica A2 */ /* Iteracija za svaki stupac: Svedi clanove ispod dijagonale na nulu*/ sig=1; /*Zabiljezi predznak koji se mijenja ako se zamijene redovi */ d2=1; for (k=0;k<=m2-2 && d2; k++) {if (A2[k][k]==0) /* Dijagonalni clan je jednak nuli; */ {d2=0; /* Ako d2 ostane 0, zamjena nije moguca */ for(i=k;i<=m2-1 && !d2;i++) /* Izvrsi zamjenu ako je moguca. */ if(A2[i][k]!=0) {d2=1; /* Zamijeni i-ti i k-ti red */ for (j=k-1;j<=m2-1;j++) {z=A2[k][j]; A2[k][j]=A2[i][j]; A2[i][j]=z; sig=-sig; } } } /* Podijeli clanove ispod dijagonale s dijagonalnim clanom */ /* i obavi odbijanje kako bi dobio 0 ispod dijagonale */ if(d2) for (i=k+1;i<=m2-1;i++) { z=A2[i][k]/A2[k][k]; for (j=k;j<=m2-1;j++) A2[i][j]-=z*A2[k][j]; } } /* Nadji determinantu */
108

if(d2!=0) { d2=A2[0][0]*sig; for (i=1;i<=m2-1;i++) d2*=A2[i][i]; } /* Ispisi rezultat if(d2!=0) printf("\nx=%10.3f",d1/d2); else printf("\nx nije definiran"); } Zadatak 3.24. /* Mnozenje i svodjene matrice na gornju trokutastu */ #include <stdio.h> int main() { float A[20][20],B[20][20],C[20][20],z; int m,n,i,j,k; printf("\nMnozenje i svodjenje matrice na gornju trokutastu \n\n"); printf("\nBroj redaka i stupaca matrica A i B: "); scanf("%d%d",&m,&n); printf("\n Molim matricu A; (%d x %d brojeva)\n\n",m,n); for (i=0;i<=m-1;i++) {for (j=0;j<=n-1;j++) scanf("%f", &A[i][j]); } printf("\n Molim matricu B; (%d x %d brojeva)\n\n",n,m); for (i=0;i<=n-1;i++) for (j=0;j<=m-1;j++) scanf("%f", &B[i][j]); /* Mnozenje matrica for (i=0;i<=m-1;i++) for (j=0;j<=m-1;j++) {C[i][j]=0; for(k=0;k<=n-1;k++) C[i][j]+=A[i][k]*B[k][j]; } */ */

/* Svedi matricu C na gornju trokutastu */ /* Iteracija za svaki stupac: Svedi clanove ispod dijagonale na nulu*/ for (k=0;k<=m-2; k++) {if (C[k][k]==0) /* Dijagonalni clan je jednak nuli; */ for(i=k+1;i<=m-1; i++) /* Izvrsi zamjenu ako je moguca */ if(C[i][k]!=0) {
109

/* Zamijeni i-ti i k-ti red */ for (j=k;j<=m-1;j++) {z=C[k][j]; C[k][j]=C[i][j]; C[i][j]=z; } break; } if(C[k][k]==0) {printf("\nProdukt zadanih matrica se ne moze "); printf("svesti na gornju trokutastu.\n"); return 1; } /* Podijeli clanove ispod dijagonale s dijagonalnim clanom i obavi odbijanje kako bi dobio 0 ispod dijagonale */ for (i=k+1;i<=m-1;i++) { z=C[i][k]/C[k][k]; for (j=k;j<=m-1;j++) C[i][j]-=z*C[k][j]; } } /* Ispisi rezultat */ printf("\nProdukt matrica sveden na gornju trokutastu je:\n"); for(i=0;i<=m-1;i++) {for (j=0;j<=m-1;j++) printf("%10.3f",C[i][j]); printf("\n"); } return 0; } Zadatak 3.25. /* Rjesenje sustava linearnih jednadzbi */ #include<stdio.h> int main() { int n,m,i,j,k; float a[50][51],z,xm,s; printf("\nRjesavanje sustava linearnih jednadzbi\n"); printf("\nBroj jednadzbi/nepoznanica n (n<30) molim "); scanf("%d",&n); printf("\nKoeficijente svake od %2d jednadzbe (%2d broja) molim\n" ,n,n+1); for(i=0;i<=n-1;i++) for(j=0;j<=n;j++) scanf("%f",&a[i][j]);
110

/* Svedi matricu a na gornju trokutastu */ /* Iteracija za svaki stupac: Svedi clanove ispod dijagonale na nulu*/ for (k=0;k<=n-2; k++) {if (a[k][k]==0) /* Dijagonalni clan je jednak nuli; */ for(i=k+1;i<=n-1; i++) /* Izvrsi zamjenu ako je moguca */ if(a[i][k]!=0) { /* Zamijeni i-ti i k-ti red */ for (j=k;j<=m-1;j++) {z=a[k][j]; a[k][j]=a[i][j]; a[i][j]=z; } break; } if(a[k][k]==0) {printf("\nSustav nema rjesenja! "); return(1); } /* Podijeli clanove ispod dijagonale s dijagonalnim clanom */ /* i obavi odbijanje kako bi dobio 0 ispod dijagonale */ for (i=k+1;i<=n-1;i++) { z=a[i][k]/a[k][k]; for (j=k;j<=n;j++) a[i][j]-=z*a[k][j]; } } if(a[n-1][n-1]==0) /*Posljednji koeficijent je 0, rjesenje je parametarsko */ {printf("\nSustav ima parametarsko rjesenje!"); return 2; } a[n-1][n]/=a[n-1][n-1]; /* Nadji x[n-1] */ for (i=n-2;i>=0;i--) /* Nadji preostala rjesenja */ {s=0; for (j=i+1;j<=n-1;j++)s+=a[i][j]*a[j][n]; a[i][n]=(a[i][n]-s)/a[i][i]; } /* Ispisi rezultat */ for(i=0;i<=n-1;i++) printf("\n x%2d = %10.3f",i+1,a[i][n]); return 0; } Zadatak 3.26. #include<stdio.h> #include<math.h>
111

int main() { const k12=12; int i,j,k; float a[12][12],akv[12][24],z,xm; printf("\nZadajte kvadratnu matricu od 12 redaka/stupaca\n"); /* Ucitaj matricu */ for(i=0;i<=k12-1;i++) for(j=0;j<=k12-1;j++) scanf("%f",&a[i][j]); /* Pomnozi matricu sa samom sobom */ for(i=0;i<=k12-1;i++) for(j=0;j<=k12-1;j++) {akv[i][j]=0; for(k=0;k<=k12-1;k++) akv[i][j]+=a[i][k]*a[k][j]; } for(i=0;i<=k12-1;i++) /* Napravi jedinicnu matricu u drugom bloku matrice akv */ for(j=k12;j<=2*k12-1;j++) { akv[i][j]=0; if(i==(j-k12)) akv[i][j]=1; } for(k=0;k<=k12-1;k++) /* Iteracija za svodjenje pocetne matrice na jedinicnu i jedinice na inverznu */ { if(akv[k][k]==0) /* Zamijeni red ako je moguce */ {i=k+1; while (i<k12-1 && akv[i][k]==0)i++; if(akv[i][k]==0) /* Nemoguca zamjena redova */ {printf("\nMatrica nema inverznu\n"); return 1; } for (j=k;j<=2*k12-1;j++) /*Zamijeni i-ti i k-ti red */ {xm=akv[i][j]; akv[i][j]=akv[k][j]; akv[k][j]=xm; } } xm=akv[k][k]; /* Podijeli s dijagonalnim clanom */ for(j=0;j<=2*k12-1;j++) akv[k][j]=akv[k][j]/xm; for(i=0;i<=k12-1;i++) if(i!=k) /* Izvrsi redukciju svih redova osim tekuceg*/ {xm=akv[i][k]; for(j=k;j<=2*k12-1;j++) akv[i][j]-=akv[k][j]*xm; } } /* Ispisi invertiranu matricu */ printf("\nInverzna matrica kvadrata je \n");
112

for(i=0;i<=k12-1;i++) { for(j=k12;j<=2*k12-1;j++) printf("%9.2f",akv[i][j]); printf("\n"); } return 0; /* Uspjesni zavrsetak */ } Zadatak 3.27. #include<stdio.h> #include<math.h> int main() { int i,j,k; float a[8][8],aa[8][16],b[8][8],c1[8][8],c2[8][8],z,xm; printf("\nZadajte 8 redaka s osam brojeva matrice \n"); for(i=0;i<=7;i++) for(j=0;j<=7;j++) {scanf("%f",&aa[i][j]); /* Ucitaj matricu aa */ a[i][j]=aa[i][j]; /* Spremi kopiju u a */ aa[i][j+8]=0; if (i==j)aa[i][j+8]=1; /* Produzi je s jedinicnom*/ } /* Invertiraj matricu aa */ for(k=0;k<=7;k++) { if(aa[k][k]==0) /* Zamijeni redak ako je moguce */ {i=k+1; while (i<7 && aa[i][k]==0)i++; if(aa[i][k]==0) /* Nemoguca zamjena redova */ {printf("\nMatrica nema inverznu\n"); return 1; } for (j=k;j<=15;j++) /*Zamijeni i-ti i k-ti red */ {xm=aa[i][j]; aa[i][j]=aa[k][j]; aa[k][j]=xm; } } xm=aa[k][k]; /* Podijeli s dijagonalnim clanom */ for(j=0;j<=15;j++) aa[k][j]=aa[k][j]/xm; for(i=0;i<=7;i++) if(i!=k) /* Izvrsi redukciju svih redova osim tekuceg*/ {xm=aa[i][k]; for(j=k;j<=15;j++) aa[i][j]-=aa[k][j]*xm; }
113

} /* Prebaci inverznu matricu aa u b matricu for (i=0;i<=7;i++) for (j=8;j<=15;j++); b[i][j-8]=aa[i][j];

*/

/* Izracunaj c1=a*b i c2=b*a; Mora biti c1=c2=I (jedinicna matrica) */ for (i=0;i<=7;i++) for(j=0;j<=7;j++) {c1[i][j]=0; c2[i][j]=0; for(k=0;k<=7;k++) {c1[i][j]+=a[i][k]*b[k][j]; c2[i][j]+=b[i][k]*a[k][j]; } } printf("\n Matrica c1:\n"); for(i=0;i<=7;i++) { for(j=0;j<=7;j++) printf(" %9.2f ",c1[i][j]); printf("\n"); } printf("\n Matrica c2:\n"); for(i=0;i<=7;i++) { for(j=0;j<=7;j++) printf(" %9.2f ",c2[i][j]); printf("\n"); } return 0; } Zadatak 3.28. #include<stdio.h> int main() { int m1,m2,i,j,k,is; float a[30][60],b[30][30],z,xm,det; printf("\nNalazenje determinante i invertiranje matrice\n"); printf("\Zadajte velicine prve i druge matrice "); scanf("%d%d",&m1,&m2); printf("\Podatke prve matrice molim\n"); for(i=0;i<=m1-1;i++) for(j=0;j<=m1-1;j++) scanf("%f",&a[i][j]);
114

printf("\Podatke druge matrice molim\n"); for(i=0;i<=m2-1;i++) for(j=0;j<=m2-1;j++) scanf("%f",&b[i][j]); /* Nadji determinantu druge matrice svodeci je na dijagonalnu */ is=1; for(k=0;k<=m2-2;k++) { if(b[k][k]==0) { for(i=k+1;i<=m2-1;i++) if(b[i][k]!=0) break; if(i==m2) { printf("\nDeterminanta druge matrice je jednaka nuli.\n"); printf("Zadatak nema rjesenja\n"); return 1; } for(j=k;j<=m2-1;j++) /* Zamijeni redove */ { z=b[k][j]; b[k][j]=b[i][j]; b[i][j]=z; } is=-is; /* Promijeni predznak */ } for(i=(k+1);i<=m2-1;i++) { xm=b[i][k]/b[k][k]; for(j=k;j<=m2-1;j++) b[i][j]-=xm*b[k][j]; } if(b[m2-1][m2-1]==0) { printf("\nDeterminanta druge matrice je jednaka nuli.\n"); printf("Zadatak nema rjesenja\n"); return 1; } /* Sada je matrica svedena na gornju trokutastu */ det=is; /* Predznak determinante je is */ for(i=0;i<=m2-1;i++) det*=b[i][i]; /* Detrminanta je jednaka umnosku dijagonalnih clanova */ /* Podijeli drugu matricu determinantom i nadji inverznu */ for(i=0;i<=m1-1;i++) for(j=0;j<=m1-1;j++) a[i][j]/=det; /* Invertiraj podijeljenu matricu for(i=0;i<=m1-1;i++) { for(j=m1;j<=(2*m1-1);j++) { a[i][j]=0.0; */

115

if(i==j-m1) a[i][j]=1; } } for(k=0;k<=m1-1;k++) { if(a[k][k]==0) { for(i=k+1;i<=m1-1;i++) if(a[i][k]!=0.0) break; if(i==m1) { printf("\nPrva matrica nema inverznu.\n"); return 1; } for(j=k;j<=m1-1;j++) /* Zamijeni redove */ { z=a[k][j]; a[k][j]=a[i][j]; a[i][j]=z; } } /* Obavi redukciju */ xm=a[k][k]; for(j=0;j<=2*m1-1;j++) a[k][j]=a[k][j]/xm; for(i=0;i<=m1-1;i++) if(i!=k) {xm=a[i][k]; for(j=k;j<=2*m1-1;j++) a[i][j]-=a[k][j]*xm; } } printf("\nRezultat je \n"); for(i=0;i<=m1-1;i++) {for(j=m1;j<=2*m1-1;j++) printf(" %9.2f",a[i][j]); printf("\n"); } } return 0; } Zadatak 3.29. #include<stdio.h> #include<math.h> int main() { int m,i,j,k,l; float a[30][60],b[30],c[30],z,xm; printf("\nInvertiranje matrice i mnozenje s vektorom\n");
116

printf("\nZadajte velicinu (broj redaka) matrice "); scanf("%d",&m); printf("\nZadajte matricu(%2d redaka s %2d brojeva\n",m,m); for(i=0;i<=m-1;i++) for(j=0;j<=m-1;j++) scanf("%f",&a[i][j]); printf("\nZadajte vektor (%2d brojeva)",m); for(i=0;i<=m-1;i++) scanf("%f",&b[i]); /* Invertiraj matricu */ for(i=0;i<=m-1;i++) { for(j=m;j<=(2*m-1);j++) { a[i][j]=0.0; if(i==j-m) a[i][j]=1; } } for(k=0;k<=m-1;k++) { if(a[k][k]==0) { for(i=k+1;i<=m-1;i++) if(a[i][k]!=0.0) break; if(i==m) { printf("\nMatrica nema inverznu.\n"); return 1; } for(j=k;j<=m-1;j++) /* Zamijeni redove */ { z=a[k][j]; a[k][j]=a[i][j]; a[i][j]=z; } } /* Obavi redukciju */ xm=a[k][k]; for(j=0;j<=2*m-1;j++) a[k][j]=a[k][j]/xm; for(i=0;i<=m-1;i++) if(i!=k) {xm=a[i][k]; for(j=k;j<=2*m-1;j++) a[i][j]-=a[k][j]*xm; } } /* Pomnozi invertiranu matricu s vektorom */ for(i=0;i<=m;i++) {c[i]=0; for(k=0;k<=m-1;k++) c[i]+=a[i][m+k]*b[k]; }
117

printf("\nRezultat je \n"); for(i=0;i<=m-1;i++) printf("\n%9.2f",c[i]); printf("\n"); return 0; }

118

Zadatak 4.1. /* Nultocka funkcije f(x)=a*ln(x)+b*x */ #include <stdio.h> #include <math.h> float a,b; float f(float x) { return a*log(x)+b*x; } float df(float x) { return a/x+b; } int main() { float eps,x; int i; printf("\nNalazenje nultocke funkcije a*ln(x)+b*x metodom tangente\n"); printf("\nZadajte koeficijente a i b i gresku epsilon "); scanf("%f%f%f",&a,&b,&eps); x=0.5; i=1; do{ x-=f(x)/df(x); i++; if(x<=0) {printf("\nRjesenje se ne moze naci zbog x<=0 u iteraciji %2d\n" ,i); return 2; } } while (fabs(f(x))>eps && i<100); if (i==100) {printf("\nNultocka nije nadjena\n"); return 1; } printf("\nNultocka je %9.4f\n",x); return 0; } Zadatak 4.2. /* Vrijednosti funkcije f(x)=exp(-n*x)*sin(m*x) #include <stdio.h> #include <math.h> int m,n; float f(float x) */

119

{ return exp(-n*x)*sin(m*x); } int main() { float x1,x2,x,dx; int k; printf("\nNalazenje vrijednosti funkcije exp(-n*x)*sin(m*x)\n"); printf ("\nZadajte vrijednosti x1, x2 (realne) i k, m i n (cjelobrojne)\n"); scanf("%f%f%d%d%d",&x1,&x2,&k,&m,&n); dx=(x2-x1)/(k-1); for (x=x1;x<=x2;x+=dx) printf("\n%9.3f %10.4f",x,f(x)); return 0; } Zadatak 4.3. /* Sjeciste krivulja f1=ln(a*x) i f2=b*sin(x) #include <stdio.h> #include <math.h> float a,b; /*Globalne varijable */ float f(float x) { return log(a*x)-b*sin(x); } float df(float x) { return 1/x-b*cos(x); } int main() { float eps,x; int i; printf("\nNalazenje sjecista krivulja f1=ln(a*x) i f2=b*sin(x)\n"); printf("\nZadajte koeficijente a i b "); scanf("%f%f",&a,&b); x=0.5; eps=1e-3; i=1; do{ x-=f(x)/df(x);
120

*/

i++; if(a*x<=0) {printf("\nRjesenje se ne moze naci zbog a*x<=0 u iteraciji %2d\n" ,i); return 2; } } while (fabs(f(x))>eps && i<100); if (i==100) {printf("\nSjeciste nije nadjeno\n"); return 1; } printf("\nSjeciste je %9.4f\n",x); return 0; } Zadatak 4.4. /* Nalazenje brzine tijela iz funkcije puta #include <stdio.h> #include <math.h> float a,b,c; /* Globalne varijable */ */

float s(float t) /* Funkcija puta s ovisno o vremenu t */ { return a*t*t+b*log(t+1)-log(c*t+1)/log(t+2); } float v(float x) /* Brzina v kao funkcija vremena t je derivacija s(t)*/ { float dx; if(x!=0) dx=x/100; else dx=1e-3; return (s(x+dx)-s(x))/dx; } int main() { int t0; float t,put,brzina; printf("\nNalazenje puta i brzine\n"); printf("\nZadajte koeficijente a, b i c i vrijeme t0 "); scanf("%f%f%f%d",&a,&b,&c,&t0); for (t=0;t<=t0;t=t+1) {put=s(t); brzina=v(t); printf("\n%5.0f%9.3f%9.3f",t,put,brzina); } return 0;
121

}

Zadatak 4.5. /* Naponi na kondenzatoru i otporniku */ #include <stdio.h> #include <math.h> float R,C,U0; float uc(float t) /*Napon na kondenzatoru */ { return U0*(1-exp(-t/(R*C))); } float ur(float t) /* Napon na otporniku je U0 –uc(t) */ { return U0-uc(t); } int main() { float t; printf("\nNaponi na kondenzatoru i otporniku\n"); printf("\nZadajte vrijednost otpora R (kOhm) i kondenzatora C(uF) "); scanf("%f%f",&R,&C); printf("\nZadajte napon U0 (V) "); scanf("%f",&U0); R*=1e3; C*=1e-6; printf("\n Vrijeme N a p o n n a "); printf("\n (ms) kondenzatoru otporniku"); for (t=0;t<=3*R*C;t=t+R*C/10) printf("\n%7.2f %9.3f %9.3f",t*1e3,uc(t),ur(t)); return 0; } Zadatak 4.6. /* Lissajousove krivulje */ #include <stdio.h> #include <math.h> float a,b,f; float y(float t) { return sin(a*t+f); } float x(float t)
122

{ return sin(b*t); } main() { float t,Pi; Pi=4*atan(1.); printf("\nLissajousove krivulje\n"); printf("\nZadajte vrijednost amplituda a i b i fazu f (0 do 2*Pi) "); scanf("%f%f%f",&a,&b,&f); printf("\n Vrijeme x y "); for (t=0;t<=2*Pi;t+=2*Pi/99) printf("\n%7.2f%9.3f%9.3f",t,x(t),y(t)); return; } Zadatak 4.7. /* Funkcije sin(x)/x i( sin(x)/x)**2 */ #include <stdio.h> #include <math.h> float x,xmin,xkor; float f1(float x) { return sin(x)/x; } float f2(float x) { return f1(x)*f1(x); } main() { printf("\nFunkcija sin(x)/x i njen kvadrat\n"); printf("\nZadajte vrijednost xmin (xmin<1) i xkor (xkor<0.1) "); scanf("%f%f",&xmin,&xkor); printf("\n x sin(x)/x ( sin(x)/x) ** 2\n"); for (x=1; x>=xmin;x-=xkor) printf("\n%5.2f%9.5f%9.5f",x,f1(x),f2(x)); return; } Zadatak 4.8. /* Povrsina kruga trapeznom metodom #include <stdio.h> #include <math.h> */

123

float r; float circle(float x) { return sqrt(r*r-x*x); } main() {int n; float p,x,dx; printf("\nPovrsina kruga trapeznom metodom\n"); printf("\nZadajte polumjer r "); scanf("%f",&r); printf("\nZadajte broj trapeza n "); scanf("%d",&n); dx=r/n; p=circle(0)+circle(r); for (x=dx; x<=r-dx;x+=dx) p+=2*circle(x); p=2*p*dx; printf("\nPovrsina kruga polumjera %7.2f je %9.4f",r,p); return 0; } Zadatak 4.9. /* Povrsina elipse trapeznom metodom */ #include <stdio.h> #include <math.h> float a,b; float elipsa(float x) { return sqrt(b*b-pow(b/a*x,2)); } main() {int n; float p,x,dx; printf("\nPovrsina elipse trapeznom metodom\n"); printf("\nZadajte osi elipse a i b "); scanf("%f%f",&a,&b); printf("\nZadajte broj trapeza n "); scanf("%d",&n); dx=a/n; p=elipsa(0)+elipsa(a); for (x=dx; x<=a-dx;x+=dx) p+=2*elipsa(x); p=2*p*dx; printf("\nPovrsina elipse s osima %7.2f %7.2f je %9.4f",a,b,p); return 0;
124

} Zadatak 4.10. /* Elektricna energija racunata iz napona i otpora #include <stdio.h> #include <math.h> float a,b,R0,p; float u(float t) { return exp(-b*t)*sin(a*t); } float r(float t) { return R0+log(1+fabs(u(t)/10)); } float f(float t) { return u(t)*u(t)/r(t); } */

main() {int n; float t1,t2,t,dt,E; printf("\nEnerija na potrocasu racunata iz napona i otpora\n"); printf("\nZadajte parametre a, b i R0 "); scanf("%f%f%f",&a,&b,&R0); printf("\nZadajte vremenski interval (t1,t2) "); scanf("%f%f",&t1,&t2); printf("\nZadajte broj trapeza n "); scanf("%d",&n); dt=(t2-t1)/n; p=f(t1)+f(t2); for (t=t1+dt; t<=t2-dt;t+=dt) p+=2*f(t); p=2*p*dt; printf("\nEnergija na potrosacu je %9.4f",p); return; } Zadatak 4.11. /* Racunanje predjenog puta integriranjem trapeznom metodom funkcije brzine v(t) */ #include <stdio.h> #include <math.h> float a,b,c,t1,t2,dt,s; float v(float t)
125

{ return a*t+b*sin(c*t); } main() {int n; float t1,t2,t,dt,E; printf("\nPredjeni put u intervalu vremena (t1,t2)\n"); printf("\nZadajte parametre a, b i c: "); scanf("%f%f%f",&a,&b,&c); printf("\nZadajte vremenski interval (t1,t2): "); scanf("%f%f",&t1,&t2); dt=(t2-t1)/1000; s=v(t1)+v(t2); for (t=t1+dt; t<=t2-dt;t+=dt) s+=2*v(t); s=s*dt/2; printf("\nPredjeni put u zadanom intervalu je %9.4f",s); return 0; } Zadatak 4.12. /* Srednja vrijednost i-tog reda matrice A */ #include <stdio.h> /* Funkcija asr */ float asr(float A[20][20],int m, int n, int i) { float sr; int j; if(i>m) return 0; sr=0; for (j=1;j<=n;j++) sr+=A[i][j]; sr/=n; return sr; } /* Glavni program */ main () { float A[20][20]; int m,n,i,j; printf("\nm i n (oba manja od 20) molim: "); scanf("%d%d",&m,&n); printf("\nMatricu %2d * %2d molim\n",m,n); for (i=1;i<=m;i++) for (j=1;j<=n;j++) scanf("%f",&A[i][j]);
126

printf("\nSrednja vrijednost 3. reda je %8.3f",asr(A,m,n,3)); return 0; } Zadatak 4.13. /* Nadji najmanji broj u vektoru V koji je veci od x */ float vodx(float V[],int m, float x) { float xmin=V[0]; int i; for (i=1;i<m;i++) if(V[i]>x && V[i]<xmin) xmin=V[i]; if (xmin>x) return xmin; else return –1000; } Zadatak 4.14. /* Skalarni produkt vektora */ float skalp(float v1[],float v2[],int m) { float sum; int i; sum=0; for (i=0;i<m;i++) sum+=v1[i]*v2[i]; return sum; } Zadatak 4.15. /* Najveci broj u vektoru */ #include <stdio.h> float fmax(float v[],int m) { int i; float max; max=v[0]; for (i=1;i<m;i++) if(v[i]>max) max=v[i]; return max; } Zadatak 4.16. #include <stdio.h> /* Prost broj */
127

#include <math.h> int iprost(float x) { int i,m,n; if((n=x)!=x || x<0) return -1; m=sqrt(x); for (i=2;i<=m;i++) if(n%i==0) return 0; return 1; } Zadatak 4.17. /* Serijski spoj kondenzatora */ #include <stdio.h> float cser(float c[],int m, int o) { int i; float cs=0; for (i=1;i<=m;i++) cs+=1/c[i]; cs=1/cs; return 1/(cs*o); } Zadatak 4.18. /* Najmanji broj u svakom redu matrice */ #include <stdio.h> #define XX 20 float xmin(float M[XX][XX], int red) { int stup; float min; min=M[red][0]; for (stup=1;stup<=XX-1;stup++) if(M[red][stup]<min) min=M[red][stup]; return min; } void main() {float X[XX][XX]; int i,j; for (i=0;i<XX,i++) for(j=0;j<XX;j++) scanf(“%f”,&X[i][j]; for(i=0;i<XX;i++) printf(“\nNajmanji podatak u retku %2d matrice je %8.3f”,i+1,XMIN(X,i)); }
128

} Zadatak 4.19. /* Produkt najmanjih clanova vektora */ #include <stdio.h> float min(float V[], int m) { int i; float vmin; vmin=V[0]; for (i=1;i<=m-1;i++) if(V[i]<vmin) vmin=V[i]; return vmin; } float prodmm(float V1[], float m1, float V2[], float m2) { return min(V1,m1)*min(V2,m2); } main() { float vekt1[100],vekt2[100]; int i,m1,m2; m1=0; while(m1<=0 || m1>100) { printf("\nZadajte broj clnova u 1. vektoru (0<m<100) "); scanf("%d",&m1); } printf("\nZadajte %d realnih clanova 1. vektora\n",m1); for (i=0;i<=m1-1;i++) scanf("%f",&vekt1[i]); m2=0; while(m2<=0 || m2>100) { printf("\nZadajte broj clnova u 2. vektoru (0<m<100) "); scanf("%d",&m2); } printf("\nZadajte %d realnih clanova 2. vektora\n",m2); for (i=0;i<=m2-1;i++) scanf("%f",&vekt2[i]); printf("\nUmnozak najmanjih clanova vektora je %9.3f" ,prodmm(vekt1,m1,vekt2,m2)); return 0; } Zadatak 4.20.
129

/* Najmanji clan na dijagonali matrice */ float Dimin(float a[20][20]) {int i; float min; min=a[0][0]; for (i=1;i<=19;i++) if(a[i][i]<min) min=a[i][i]; return min; } /* Najveci clan na dijagonali matrice */ float Dimax(float a[20][20]) {int i; float max; max=a[0][0]; for (i=1;i<=19;i++) if(a[i][i]>max) max=a[i][i]; return max; } Zadatak 4.21. /* Jednakost dva vektora od m elemenata */ float usp(float v1[],float v2[],int m) {int i; for (i=0;i<=m-1;i++) if(v1[i]!=v2[i]) return 0; return 1; } Zadatak 4.22. /* Najveci i najmanji otpor i paraleni spoj n otpora */ void otpor(float r[], int n, float *rmin, float *rmax, float *rx) {int i,ind=1; *rmin=*rmax=r[0]; if (r[0]!=0) *rx=1/r[0]; else {*rx=0; ind=0;} for (i=1;i<=n-1;i++) {if (r[i]<*rmin)*rmin=r[i]; if (r[i]>*rmax)*rmax=r[i]; if(r[i]!=0) *rx+=1/r[i];
130

else ind=0; } *rx*=ind; if(rx>0)*rx=1/(*rx); } Zadatak 4.23. /* Najveci prost broj manji od zadanog broja */ #include <stdio.h> #include <math.h> int prost0(int n) { int i,m; m=sqrt(n); for (i=2;i<=m;i++) if (!(n%i)) return 0; return 1; } void prost(int n0,int *n, float *xlnn) { int i; for (i=n0-1;i>=2;i--) if (prost0(i)) { *n=i; *xlnn=log(i); return; } } main() { int n,n0; float xlnn; printf("\nZadajte prirodni broj n0 "); scanf("%d",&n0); prost(n0,&n,&xlnn); printf("\nNajveci prosti broj manji od %5d je %5d",n0,n); printf("\nNjegov prirodni logaritam je %8.4f",xlnn); return 0; } Zadatak 4.24. #include <stdio.h>
131

#include <math.h> float f(float x, float z) { return sin(x)*cos(z*x); } float SRVF(float x1, float x2, float z, int n, float *fmax) { float x,dx,s=0,max; dx=(x2-x1)/n; max=f(x1,z); for (x=x1;x<=x2;x+=dx) {s+=f(x,z); if(f(x,z)>max)max=f(x,z); } *fmax=max; return s; } main() {float x1,x2,z,fmax,sr; int n; printf("\nx1, x2, z i n molim "); scanf("%f%f%f%d",&x1,&x2,&z,&n); sr=SRVF(x1,x2,z,n,&fmax); printf("\nSrednja vrijednost i maksimum su %8.3f %8.3f",sr,fmax); return 0; }

132

Zadatak 4.25. #include <stdio.h> void ULVEK(float v1[], float v2[], int n) { int i; if (n>200) { printf("\nBroj elemenata vektora prevelik"); return; } for (i=0;i<=n-1;i++) scanf("%f%f",&v1[i],&v2[i]); } main() {float v1[200],v2[200]; int n; printf("\nN molim "); scanf("%d",&n); printf("\nElemente oba vektora molim\n"); ULVEK(v1,v2,n); return 0; } Zadatak 4.26. /* Ispis matrice funkcijom IMAT */ #include <stdio.h> void IMAT(int Mx[21][11], int n1, int n2) { int i,j; printf("\n"); for (i=0;i<=n1-1;i++) {for (j=0;j<=n2-1;j++) printf("%5d",Mx[i][j]); printf("\n"); } } int main() {int Mx[21][11],n1,n2; int i,j; FILE *fin; char imedat[20]; printf("\nIme datoteke: "); scanf("%s",imedat); fin=fopen(imedat,"r");
133

if(!fin) {printf("\nNema datoteke %s",imedat); return 1; } fscanf(fin,"%d %d",&n1,&n2); for (i=0;i<=n1-1;i++) for(j=0;j<=n2-1;j++) fscanf(fin,"%d",&Mx[i][j]); IMAT(Mx,n1,n2); return 0; } Zadatak 4.27. /* Ispis sume stupca pomocu funkcije */ #include <stdio.h> void UM(float M[50][50], int n1, int n2) { int i,j,c; char red[80]; for (i=0;i<=n1-1;i++) for (j=0;j<=n2-1;j++) scanf("%f",&M[i][j]); } void IM(float M[50][50],int n1,int stup) { int i; float s=0; for (i=0;i<=n1-1;i++) s+=M[i][stup-1]; printf("\nSuma %2d. stupca matrice je %8.3f",stup,s); } main() {float A[50][50]; int m,n,k; printf("\nZadajte cijele brojeve m, n i k (k=0 za kraj) "); scanf("%d%d%d",&m,&n,&k); do { UM(A,m,n); IM(A,m,k); printf("\nZadajte cijele brojeve m, n i k (k=0 za kraj) "); scanf("%d%d%d",&m,&n,&k); } while(k>0); return; }
134

Zadatak 4.28. /* Sume redaka i stupaca, ukupna suma i matrica ocekivanih frekvencija */ #include <stdio.h> float SUMR(float M[9][9], int red, int nstup) { int j; float s=0; for (j=0;j<=nstup-1;j++) s+=M[red][j]; return s; } float SUMS(float M[9][9], int stup, int nred) { int i; float s=0; for (i=0;i<=nred-1;i++) s+=M[i][stup]; return s; } float SUMA(float M[9][9], int nred, int nstup) { int i,j; float s=0; for (i=0;i<=nred-1;i++) for (j=0;j<=nstup-1;j++) s+=M[i][j]; return s; } void EFREQ(float M[9][9],float X[9][9],int m,int n) { int i,j; for (i=0;i<=m-1;i++) for (j=0;j<=n-1;j++) X[i][j]=SUMR(M,i,n)*SUMS(M,j,m)/SUMA(M,m,n); } int main(int nparam,char *pniz[]) {float MAT[9][9],XMAT[9][9]; int m,n,i,j; if (nparam<3) {printf("\nBroj redaka/stupaca nije zadan preko parametara\n"); return 1; } m=*pniz[1]-'0'; n=*pniz[2]-'0'; printf("\nZadajte matricu (%1d x %1d brojeva)\n",m,n); for (i=0;i<=m-1;i++)
135

for (j=0;j<=n-1;j++) scanf("%f",&MAT[i][j]); printf("\nSuma redaka je:\n"); for (i=0;i<=m-1;i++) printf("\n%8.3f",SUMR(MAT,i,n)); printf("\nSuma stupaca je:\n"); for (j=0;j<=n-1;j++) printf("\n%8.3f",SUMS(MAT,j,m)); printf("\nUkupna suma je %8.3f",SUMA(MAT,m,n)); EFREQ(MAT,XMAT,m,n); printf("\nMatrica ocekivanih frekvencija je: \n"); for (i=0;i<=m-1;i++) {for (j=0;j<=n-1;j++) printf("%8.3f",XMAT[i][j]); printf("\n"); } return 0; } Zadatak 4.29. /* Sortiranje podataka iz datoteke i njihov ispis u datoteku Ulazna i izlazna datoteka zadane su kao parametri programa */ #include <stdio.h> void SORT(float v0[], float v[], int n) { int i,sortiran; float vx; for (i=0;i<=n-1;i++) v[i]=v0[i]; do { sortiran=true; for (i=0;i<=n-1;i++) { if(v[i]>v[i+1]) { vx=v[i]; v[i]=v[i+1]; v[i+1]=vx; sortiran=false; } } n--; }
136

while (!sortiran); } int main(int nparam,char *pniz[]) {float v1[100],v2[100]; int m=0,i; FILE *fin,*fout; if (nparam<3) {printf("\nNisu zadane ulazna i izlazna datoteka\n"); return 1; } fin=fopen(pniz[1],"r"); if(!fin) {printf("\Ulazna datoteka %s se ne moze otvoriti\n",pniz[1]); return 1; } fout=fopen(pniz[2],"wt"); if(!fout) {printf("\Izlazna datoteka %s se ne moze otvoriti\n",pniz[2]); return 2; } fscanf(fin,"%f",&v1[m]); do { m++; fscanf(fin,"%f",&v1[m]); } while (!feof(fin)); SORT(v1,v2,m); printf("\n\nSortirani podaci su\n"); for (i=0;i<=m-1;i++) printf("\n%8.3f",v2[i]); return 0; } Zadatak 4.30. /* Sortiranje podataka iz datoteke i nalazenje medijana */ #include <stdio.h> void SORT(float v[], int n) { int i,sortiran; float vx; do { sortiran=true; for (i=0;i<=n-1;i++) {
137

if(v[i]>v[i+1]) { vx=v[i]; v[i]=v[i+1]; v[i+1]=vx; sortiran=false; } } n--; } while (!sortiran); } int main(int nparam,char *pniz[]) {float v1[100],medijan; int m=0,i; FILE *fin; if (nparam<2) fin=stdin; else { fin=fopen(pniz[1],"rt"); if(!fin) {printf("\Ulazna datoteka %s se ne moze otvoriti\n",pniz[1]); return 1; } } fscanf(fin,"%f",&v1[m]); do { m++; fscanf(fin,"%f",&v1[m]); } while (!feof(fin)); SORT(v1,m); if(m%2) medijan=v1[m/2+1]; else medijan=(v1[(m-1)/2]+v1[(m-1)/2+1])/2; printf("\n\nMedijan je %8.3f\n",medijan); return 0; }

138

Sign up to vote on this title
UsefulNot useful