fisher zbirka c

Upload: asmirr

Post on 30-Oct-2015

67 views

Category:

Documents


6 download

DESCRIPTION

ok

TRANSCRIPT

  • E L E K T R O T E H N I K I F A K U L T E T O S I J E K

    Darko Fischer

    Z B I R K A Z A D A T A K A I Z

    "C " P R O G R A M S K O G J E Z I K A

    ( Drugo izmijenjeno izdanje )

    Osijek, 1997.

  • 2

  • SADRAJ

    0. Uvod 1

    1. Algoritmi 7

    2. Jednostavni C zadaci 20

    3. Zadaci s indeksiranim varijablama 29

    4. Zadaci s funkcijama i procedurama 50

    5. Rjeenja zadataka 75

    3

  • 0. UVOD

    Ova skripta namijenjena su uenju C programskog jezika. Nastala su iz sline zbirke zadataka iz FORTRAN programskog jezika odakle je uzeta veina zadataka i svi primjeri. Programski jezik C standardno se koristi pod UNIX operacijskim sustavom te je kao takav jedan od najkoritenijih programskih jezika. Unato svojoj sveobuhvatnosti, osnovni dio ovog jezika je jednostavan i pregledan kako po sintaksi tako i po strukturi. Zbog toga i poetnici u programiranju mogu lako da savladaju osnove ovog jezika. Skripta su namijenjena poetnicima u C-u. Zbog toga su u primjerima i zadacima dati samo razmjerno jednostavni problemi. Primjeri su odabrani tako, da ukau na bitne i najee koritene elemente ovog programskog jezika. Time je obuhvaen samo vrlo mali dio mogunosti koje C prua, ali su obuhvaeni oni dijelovi, koji se najee koriste u rjeavanju matematikih i tehnikih problema. Nastojali smo na taj nain napraviti jednostavan udbenik to pristupaniji itaocu koji eli da se u poetnoj fazi upozna sa bitnim mogunostima ovog programskog jezika. U prvom dijelu dati su zadaci i primjeri koji se rjeavaju bez koritenja 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 moe izraditi program u bilo kojem programskom jeziku.

    Zadaci i primjeri su poredani tako, da se poinje sa sasvim jednostavnim problemima za ije rjeenje je dovoljno koristiti samo osnovne programske mehanizme. Dalji zadaci prikazuju sloenije probleme za ije rjeenje je potrebno koristiti i neke sloenije mehanizme, ali jo uvijek one, koji su tipini i zajedniki u svim programskim jezicima.

    Odabrani zadaci i primjeri zahtijevaju samo osnovno znanje iz matematike ili elektrotehnike.

    Primjeri su takoer odabrani tako da poslue 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 posluiti kao brzi uvid u sintaksu C jezika. Zbog toga su svi primjeri i zadaci podijeljeni u 4 dijela. U prvom dijelu trae se rjeenja algoritama. U primjerima toga dijela prikazali smo nain tekstualne razrade algoritma. Ta tehnika ne zahtijeva strogo definirana pravila izraavanja i zato moe koristiti poetnicima za lake razumijevanje logike kojom se moramo sluiti pri izradi programske podrke. Zadaci u drugom, treem i etvrtom poglavlju odnose se na izradu programa u C programskom jeziku. Kompleksnost zadataka se poveava od poetka prema kraju svakog poglavlja i to sa stajalita matematikog modela kao i sa stajalita potrebnih programskih tehnika koje treba koristiti pri rjeavanju.

    Tekst se sastoji od primjera i zadataka. Primjeri su zadaci uz koje je dato opirnije objanjenje i rjeenje. Primjere smo nastojali odabrati tako, da dobro ilustriraju temu u poglavlju u kojem su dati. Uz zadatke data su samo rjeenja bez obrazloenja. Ta rjeenja se nalaze na kraju, u poglavlju 5. itaoci koji ele saznati vie detalja o mogunostima C programskog jezika, trebaju se posluiti nekim udbenikom ili prirunikom za ovaj jezik i za neki odabrani njegov prevodilac. Neki mogui udbenici nvedeni su u popisu literature.

    4

  • 1. ALGORITMI

    Za izradu algoritma (razradu logike) programa posluiti emo se tekstualnim izraavanjem. Bez strogo definiranog pseudo jezika (kakav se esto koristi u udbenicima pri opisu algoritama), koristit emo se reenicama govornog jezika. Te reenice biti e "strukturirane" po odreenom pravilu (koje e biti jasno iz primjera) i biti e napisane tako, da e se moi pretvoriti u jednu ili vie naredbi C ili nekog drugog programskog jezika. Nauiti razraditi algoritam nekog problema, ili slobodnije reeno, nauiti "misliti" na nain kako to od nas raunalo "oekuje", osnovan je preduvjet za uspjeno programiranje u bilo kojem programskom jeziku. Savjetujemo, zato, posebno poetnicama u programiranju, da ovom poglavlju posvete temeljitu panju.

    Primjer 1.1

    Razraditi logiku programa koji e najprije uitati broj n. Ako broj n nije prirodan broj ispisati poruku o pogreki i ponoviti uitavanje. Uitavati redom, jedan za drugim, n brojeva x i nai i ispisati najvei od njih xmax.

    Rjeenje:

    Postavi n=0Sve dok n nije prirodan broj ini

    Uitaj broj nAko n nije prirodan broj ispii porukuo pogreno zadanom broju nKraj Sve dokUitaj prvi broj xmaxZa svaki i=2 do n ini slijedee

    Uitaj broj xAko je x > xmax postavi xmax=xKraj Za svaki

    Ispii xmax

    Komentar rjeenja:

    Prikazano rjeenje je jedno od vie moguih. Odabrano je upravo ovo, da bude pregledno i razumljivo. Reenice su pisane s glagolima u imperativu ("Uitaj", "Postavi"). To naglaava smisao reenice kojom korisnik (programer) nareuje automatu tj. raunalu da izvri zadanu radnju. "Uitaj broj n" je naredba raunalu da prihvati (s nekog ulaznog ureaja, tastature, diska) zadani podatak. Naredbe e se odvijati u redoslijedu kako su napisane ako samom naredbom nije drugaije nareeno. Oito je, da e se nakon naredbe "Uitaj 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 idua naredba ako je taj uvjet nije ispunjen, odnosno n je prirodan broj. Takoer se petlja (iteracija) "Za svaki i=2 do n ini slijedee" ponavlja n-1 puta da bi se nakon tih n-1 ponavljanja dobio najvei broj xmax koji se nakon obavljene iteracije ispisuje naredbom "Ispii xmax".

    5

  • Algoritam ne daje sasvim detaljno naznaku kako e se rijeiti svaka naredba. Tako druga naredba ispituje da li je n prirodan broj. Nain kako se to rjeava, ovisi o programskom jeziku. U C-u, gdje n moemo definirati kao cijeli broj, bit e dovoljno ispitati, da li je on vei od nule. Rjeenje ovog primjera u C-u dato je u primjeru 2.1.

    Zadatak 1.1. Razraditi logiku programa koji e najprije uitati broj n. Ako n nije prirodan broj, ispisati o tome poruku i ponoviti uitavanje. Uitati n brojeva i nai i ispisati njihovu aritmetiku sredinu.

    Zadatak 1.2. Razraditi logiku programa koji e uitavati jedan za drugim niz brojeva. Kraj niza brojeva oznaen je brojem -99999. Nai i ispisati aritmetiku sredinu uitanih brojeva (broj -99999 ne uzeti u obzir).

    Zadatak 1.3. Razraditi logiku programa koji e uitavati jedan za drugim niz brojeva. Kraj niza oznaen je brojem 9. Nai i ispisati aritmetiku sredinu uitanih brojeva uzimajui u obzir samo one brojeve koji su vei ili jednaki 2 i manji ili jednaki pet.

    Zadatak 1.4. Razraditi logiku programa koji e uitati broj n. Taj broj mora biti prirodan i manji od 34. Ako taj uvjet nije zadovoljen ponoviti uitavanje broja n. Izraunati i ispisati n! (faktorijel od n=1*2*3*..*(n-1)*n).

    Zadatak 1.5. Razraditi logiku programa koji e uitati brojeve m i n. Oba broja moraju bit prirodna i m mora biti vei od n. Ako taj uvjet nije ispunjen ponoviti uitavanje. Nai i ispisati binomni koeficijent b jednak m povrh n tj.

    ( )bm

    n m n=

    !! !

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

    6

  • Primjer 1.2.

    Uitati prirodan broj n. Nai da li je uitani broj prost ili ne i o tome ispisati odgovarajui tekst.

    Rjeenje: Uitaj broj nAko je n < 4 ini

    Ispii poruku da je n prost broj"Zaustavi dalji raunKraj Ako je

    Ako je n paran iniIspii poruku da n nije prost broj jer je djeljiv s 2Zaustavi dalji raunKraj Ako je

    Postavi m = drugi korjen iz nZa svaki i=3 do m u koraku po 2 uini slijedee:

    Ako je n djeljivo s i iniIspii poruku da n nije prost jer je djeljiv s iZaustavi dalji raunKraj Ako je

    Kraj Za svaki iIspii poruku da je n je prost broj

    Komentar rjeenja:

    Broj je prost ako nije djeljiv ni sa jednim brojem osim s 1 i samim sobom. Uitani broj n (za koji pretpostavljamo da je prirodan), ako je vei od 1 i manji od 4 je prost broj (2 ili 3). Ako je n paran (i vei 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 veim od m). Naredbom za iteraciju "Za svaki i=3 do m u koraku po 2" i poprima vrijednosti neparnih brojeva jer je se i poveava za 2 u svakoj narednoj iteraciji.

    Zadatak 1.7. Razraditi logiku programa koji e najprije uitati broj n. Broj n mora biti prirodan i vei od 3. Ako taj uvjet nije ispunjen, ispisati poruku o pogreki i ponoviti uitavanje. Nai i ispisati namanji prosti broj vei od n.

    7

  • Zadatak 1.8. Razraditi logiku programa koji e uitati broj n koji mora biti vei od 10. Ako taj uvjet nije ispunjen, ispisati poruku o pogreki i prekinuti rad programa. Nai i ispisati najvei prosti broj manji od n.

    Zadatak 1.9. Razraditi logiku programa koji e uitati brojeve n1 i n2. Ako je n1 vee od n2, zamijeniti njihove vrijednosti. Nai i ispisati sve proste brojeve u intervalu n1 do n2.

    Primjer 1.3.

    Simetrian kvadrat je prirodan broj koji je kvadrat drugog prirodnog broja i ije znamenka su simetrine. 121 je takav broj jer je 121=11x11. Razraditi logiku programa koji e nai sve simetrine kvadrate od 10 do 10000.

    Rjeenje:

    Za svaki i=4 do 100 uini slijedeePostavi j=i*iPostavi k = cjelobrojni dio od log(j)+1 /* Ovim k daje broj znamenaka broja j */Postavi m=kPostavi k=k/2Za svaki l=1 do k uini slijedee

    Postavi i1= cjelobrojni dio od j/10**(m-1) /* i1 je prva znamenka broja j */Izraunaj i2=ostatak djeljenja j s 10 /* i2 je zadnja znamenka broja j */Ako je i1 razliito od i2 nastavi sa slijedeim i iteraciju po iIzraunaj (u cjelobrojnoj aritmetici) j = (j-i1*10**(m-1))/10/* Ovim smo broju j "odrezali" 1. i posljednju znamenku */

    Smanji m za 2Kraj Za svaki l

    Ispii broj i*i jer je on simetrian kvadratKraj Za svali i

    Komentar rjeenja:

    Trae se simetrini kvadrati brojeva od 10 do 10000, pa je dovoljno ispitivati kvadrate svih prirodnih brojeva od 4 do 100. Prvom naredbom zapoinjemo iteraciju po i od 4 do 100. S j smo oznaili kvadrat broja i tj. j je broj koji treba ispitati na simetrinost. Broj k je broj znamenaka broja j i nalazimo koristei njegov dekadski logaritam. Tekst izmeu znakova /* i */ slui 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 simetrinost (u svakom ispitivanju usporeujemo 2 znamenke, 1. i zadnju, pa imamo k/2 ispitivanja). i1 i i2 su prva i posljednja znamenka broja j. Njih dobivamo nalaenjem ostatka odnosno dijeljenjem u cjelobrojnoj

    8

  • aritmetici. U ovoj aritmetici rezultat svakog dijeljenja je cijeli broj (npr. 5/2 je 2). Ako je i1 razliito od i2, broj j sigurno nije simetrian pa prelazimo na idui broj tj. uzet emo slijedei 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 postiemo opet naredbom cjelobrojne aritmetike. Tako dobiveni broj ima sada dvije znamenke manje od prethodnog, pa zato smanjujemo m za 2. Ako smo zavrili iteraciju po l i svi i1 i i2 su bili meusobno jednaki, ispitivani broj je simetrian. 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 nai i ispisati sve Pitagorine brojeve manje od 1000.

    Zadatak 1.11. Svaki paran broj moe se prikazati kao suma dvaju prostih brojeva (tkzv. Goldbachovo pravilo). Razraditi logiku programa koji e najprije uitati 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 uitati prirodan broj n i realan broj x. Program treba nai i ispisati sumu prvih n lanova niza s=1+x/1!+x**2/2!+..+x**n/n! (** oznaava potenciranje).

    Zadatak 1.13. Razraditi logiku programa koji e uitati realne brojeve a, b i c i nai i ispisati rjeenja x1 i x2 kvadratne jednadbe a*x**2 + b*x + c = 0. Ako jednadba nema realnih rjeenja (b*b-4*a*c c. Ako ti uvjeti nisu zadovoljeni, ispisati odgovarajuu poruku i ponovo uitati brojeve a, b i c. Ako su brojevi ispravno zadani, nai povrinu p trokuta sa stranicama a, b i c. Koristiti Heronovu formulu p=sqrt(s*(s-a)*(s-b)*(s-c)). (Sa sqrt je oznaen drugi korjen izraza u zagradi, a s=(a+b+c)/2).

    Zadatak 1.15. Razraditi logiku programa koji e uitati broj n. Taj broj mora biti vei od nule i manji od 10. Ako taj uvjet nije ispunjen, ispisati odgovarajuu poruku i ponoviti uitavanje. Nai i ispisati srednju vrijednost svih parnih brojeva od n do 2000 ali ne uzimajui u obzir one parne brojeve, koji su djeljivi sa 13.

    9

  • Primjer 1.4.

    Razraditi logiku programa koji e najprije uitati broj n, koji mora biti prirodan broj manji od 1000. Ako n ne zadovaljava postavljeni uvjet, ispisati poruku i ponoviti uitavanje. Ako n zadovoljava postavljeni uvjet, uitati n brojeva, poredati ih (sortirati) po rastuem redoslijedu i ispisati tako poredane brojeve.

    Rjeenje:

    Definiraj vektor (jednostupastu matricu) v od 999 brojevaPostavi n=0Sve dok n nije prirodan broj manji od 1000 ini

    Uitaj broj nAko je n > 999 ili n v[j+1] ini /* Treba zamijeniti v[j] i v[j+1] */Postavi sortiran=falsePostavi x=v[j]Postavi v[j]=v[j+1]Postavi v[j+1]=xKraj Ako je

    Kraj Za svaki jSmanji m za 1Kraj Sve dok

    /* Sada su brojevi sortirani, slijedi ispis */Za svaki i=0 do n-1 ispii v[i]

    Komentar rjeenja:

    Postupak poredanja podataka zove se sortiranje. Prikazani algoritam je tkzv. "Bubble sort". Sve brojeve (ili openito podatke) pohranimo (memoriramo) u matricu ili indeksiranu varijablu. Indeksirane varijable ili matrice predstavljaju skup podataka oznaen zajednikim imenom. Pojedini podatak u skupu odreen je imenom skupa i poloajem u skupu ili indeksom. Koristit emo dogovor da je poetni lan skupa odreen indeksom 0, pa prema tome indeksi u skupu od n elemenata poprimaju vrijednosti od 0 do n-1. Ako je skup razmjeten u jednoj dimenziji, tada govorimo o jednostupastoj matrici ili vektoru. Ako je skup razmjeten 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 poetku definiramo vektor od 999 elemenata. Zbog toga broj elemenata koji emo uitati i zatim

    10

  • sortirati ne moe biti vei od 999 . Nakon uitanog broja n ispitujemo njegovu ispravnost te ako je n ispravan, uitavamo n brojeva u vektor v. Nako toga slijedi samo sortiranje. Ono se svodi na usporeivanje j-tog i idueg, j+1 broja u vektoru v. Ako je naredni broj manji od prethodnog ( v[j+1] < v[j] ), izvrit emo njihovu zamjenu i zabiljeit pomou logike varijable "sortiran" da svi brojevi jo nisu poredani (true i false su logike konstante). Ovaj postupak ponavljamo tako dugo, dok sve brojeve ne poredamo i nakon prolaska kroz vektor dobijemo sortiran=true. Nakon svakog usporeivanja jo neporedanih brojeva u vektoru, njihov broj se smanjuje za 1. Zato broj m koji oznaava 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 uitati 100 brojeva u jednostupastu matricu (vektor) v, nai najmanji i najvei broj i zamijeniti njihova mjesta u vektoru. Tako dobiveni vektor ispisati.

    Zadatak 1.17. Razraditi logiku programa koji e uitati broj n, koji mora biti prirodan broj manji od 500. Ako taj uvjet nije zadovoljen ispisati odgovarajuu poruku i ponoviti uitavanje. Uitati n brojeva u vektor (jednostupastu matricu, indeksiranu varijablu) v1 i n brojeva u vektor v2. Nai i ispisati skalarni produkt uitanih vektora (skalarni produkt sp je suma produkata odgovarajuih lanova vektora tj.

    sp=[ ] [ ]v i v i

    i

    n

    =

    1

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

    Zadatak 1.18. Razraditi logiku programa koji e uitati prirodan broj n koji mora biti manji od 500. Ako taj uvjet nije ispunjen ispisati odgovarajuu poruku i ponoviti uitavanje. Uitati n elemenata u vektor v1 i n elemenata u vektor v2. Zamijeniti redoslijed elemenata u vektoru v2 tako da 0. element doe na n-1 mjesto, 1. na n-2. i t.d. Nai i ispisati skalarni produkt tako dobivenog vektora v2 i uitanog vektora v1.

    Zadatak 1.19. Medijan je statistiki 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 (raunajui n/2 cjelobrojno; npr. ako je n=17 tada je medijan lan poredanog niza s indeksom 8). Ako je n paran, tada je medijan aritmetika sredina n/2-1 i n/2 lana (npr. ako je n=28 tada je medijan aritmetika sredina lanova poredanog niza s indeksina 13 i 14). Razraditi logiku programa koji e uitati prirodan broj n, zatim uitati n brojeva u vektor v, poredati te brojeve po rastuem redoslijedu i nai i ispisati medijan. Koristiti algoritam sortiranja iz primjera 1.4.

    Zadatak 1.20. Razraditi logiku programa koji e nai medijan uitanog niza od n brojeva. Za razliku od zadatka 1.19. nai medijan bez sortiranja podataka, ve uzastopnim odbacivanjem najmanjeg i najveeg lana vektora sve dok u vektoru ne ostanu dva lana (ako je n paran) i tada je medijan aritmetika 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 sluajni broj koji je prirodan broj u intervalu 1 do n. Na pr. ako naznaimo "Postavi i= Rnd(34)" tada e i poprimiti vrijednost nekog (sluajnog) cijelog broja izmeu 1 i 34. Ponavljanjem ove naredbe, i e svaki puta poprimiti neku "sluajnu" vrijednost ali uvijek u istom intervalu (ako funkcija Rnd daje jednoliko rasporeene sluajne brojeve, tada e se pri vrlo velikom broju njenog pozivanja svaki broj pojaviti priblino jednako mnogo puta). Razraditi logiku programa koji e koristei Rnd funkciju simulirati izvlaenje lota (od brojeva 1 do 39 nasumce izvui 7).

    Rjeenje:

    Definiraj vektor loto od 39 elemenataZa svaki i=0 do 38 postavi loto[i]=i+1Postavi n=38Za svaki i=1 do 7 uini

    Postavi j= Rnd[n]Postavi k=loto[j]Ispii izvueni broj /* k je "izvueni" sluajni broj; on se ne moeponovo izvui, pa ga treba izbaciti iz tabele:na njegovo mjesto stavljamo zadnji, n-ti broj*/Postavi loto[j]=loto[n]Smanji n za 1Kraj Za svaki i

    Komentar rjeenja:

    U tabelu (vektor) loto stavili smo brojeve 1 do 39. S n=39 smo naznaili da u tabeli ima 39 brojeva. Iza toga zapoinjemo iteraciju koja e se obaviti 7 puta, jer emo izvui 7 brojeva. Nakon toga dobivamo sluajni broj j koji je izmeu 0 i n-1 (prvi puta n=39). Broj k koji je "izvuen" 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 izvlaenje smanjio za 1.

    Zadatak 1.21 Razraditi logiku programa koji e simulirati bacanje kocke. Baciti kocku 6000 puta i nai 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. Nai u koliko posto sluajeva su se na obje kocke pojavili isti brojevi.

    12

  • Zadatak 1.23. Razraditi logiku programa koji e koristei Rnd funkciju generirati 200 sluajnih brojeva u intervalu od 1 do 1000. Nai i ispisati medijan generiranih brojeva. Koristiti algoritam sortiranja iz primjera 1.4.

    Zadatak 1.24. Razraditi logiku programa koji e pomou Rnd funkcije postaviti 100 sluajnih brojeva u vektor slbr. Brojevi trebaju biti u intervalu od 1 do 200. Nai i ispisati sve one brojeve postavljene u vektor slbr koji su se pojavili dva ili vie puta.

    Zadatak 1.25. Razraditi logiku programa koji e uitati prirodan broj n koji mora biti manji od 50. Ako taj uvjet nije ispunjen, ispisati odgovarajuu poruku i ponoviti uitavanje. Uitati n brojeva u vektor b1 i generirati n sluajnih brojeva u intrevalu 1 do 2*n i te brojeve staviti u vektor b2. Nai najvei 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 uita brojeve m i n koji oznaavaju 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 uitati m i n. Uitati podatke (brojeve) u m redaka i n stupaca matrice a1 (ukupno m * n brojeva). Nai sumu svakog redka i svakog stupca matrice a1 i te sume staviti u posljednji redak (s indeksom 99) odnosno stupac matrice. Nai ukupnu sumu S svih elemenata matrice a1 i taj broj staviti u 100. redak i 100. stupac. Nai sve relativne podatke a[i][j]/S i njihove vrijednosti u postocima staviti u odgovarajue redke i stupce matrice a2. Ispisati matricu a2.

    Rjeenje:

    Definiraj matrice a1 i a2 od 100 redaka i stupaca.Ponavljaj

    Uitaj m i n.Ako je m > 99 ili n > 99 ispii poruku o pogreno zadanom m ili nSve dok je m>99 ili n>99

    Za svaki i=0 do m-1 uiniZa svaki j=0 do n-1 uitaj a1[i][j]

    Za svaki i=0 do 99 uini slijedee:Postavi a1[i][99]=0 /* Postavi na 0 zadnji redak i stupac */Postavi a1[99][i]=0Kraj Za svaki i

    Postavi S=0Za svaki i=0 do m-1 /* Nai sumu redka, sumu stupca i ukupnu sumu s */

    Za svaki j=0 do n-1 uiniPoveaj a1[i][99] za a1[i[j]Poveaj a1[99][j] za a1[i][j]

    13

  • Poveaj S za a1[i][j]Kraj Za svaki j

    Postavi a1[99][99]=S/* Relativne podatke stavi u matricu a2 i ispii je */Za svaki i=0 do m-1

    Za svaki j=0 do n-1 uiniPostavi a2[i][j]=a1[i][j]/a1[99][99]*100Ispii a2[i][j]Kraj Za svaki j

    Komentar rjeenja:

    Na poetku smo definirali matrice koje emo koristiti u algoritmu. Kod izrade rjeenja u programskom jeziku kakav je C, potrebno je definirati na poetku programa sve varijable no za bolju itljivost algoritma u njemu naznaujemo samo definicije vektora i matrica. Ako su m i n manji od 100, uitat emo podatke u m redaka i n stupaca matrice a1. Sluimo se konvencijom, da prvi indeks matrice oznaava redak, a drugi indeks stupac matrice tj. a1[i][j] oznaava element u i-tom redu i j-tom stupcu. Nakon uitavanja 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 poveavamo zadnji stupac svakog reda (a1[i][99] ) i zadnji redak svakog stupca (a1 [99][j] ) za svaki element matrice ( a1[i][j] ). Na isti nain 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 mnoimo sa 100. Rezultat stavljamo u matricu a2. Tako dobiveni rezultat konano 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. Uitati brojeve u svaki redak i stupac te matrice. Nai 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. Uitati broj m koji mora biti manji ili jednak 50. Ako taj uvjet nije zadovoljen ponoviti uitavanje broja m. Uitati m * m brojeva u m redaka i stupaca matrice. Nai 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. Uitati brojeve m i n koji odreuju broj popunjenih redaka (m) i stupaca (n) matrice. m i n moraju biti manji od 51. Ako taj uvjet nije zadovoljen ponoviti uitavanje brojeva m i n. Uitati brojeve u m redaka i n stupaca matrice. Nai i ispisati najvei 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

    14

  • apsolutne vrijednosti lana na glavnoj dijagonali. Razraditi logiku programa koji e koristiti kvadratnu matricu od 100 redaka (i stupaca), uitati broj m, uitati m * m brojeva u tu matricu i nai da li je matrica pozitivno definitna. O tome ispisati odgovarajuu poruku.

    Zadatak 1.30. Matrice se mnoe 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. Uitati 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 odgovarajuu poruku i zavriti program. Uitati podatke u prve dvije matrice i nai i ispisati produkt tih zadanih matrica.

    Zadatak 1.31. Kvadratna matrica se potencira tako da se obavi uzastopno mnoenje zadane matrice. Razraditi logiku programa koji e koristiti kvadratnu matricu od 30 redaka. Uitati broj popunjenih redaka i stupaca (m) te matrice. Taj broj mora biti manji od 31. Ako taj uvjet nije zadovoljen ispisati odgovarajuu poruku i ponoviti uitavanje tog broja. Uitati m*m brojeva u matricu. Uitati broj n koji mora biti cijeli broj manji od 10. Ako ovaj uvjet nije zadovoljen ponoviti uitavanje broja n. Nai i ispisati n-tu potenciju zadane matrice. Koristiti mnoenje matrica opisano u zadatku 1.30.

    Zadatak 1.32. Razraditi logiku programa koji e koristiti matricu a od 50 redaka i stupaca. Uitati brojeve m i n koji oznaavaju broj popunjenih redaka i stupaca matrice a. Uitati podatke (brojeve) u m redaka i n stupca matrice a. Uitati tri broja i, l1 i l2. l1 mora biti razliito od l2. Osim toga, ako je i=1, l1 i l2 moraju biti jednaki ili manji od m. Ako je i razliito od 1, l1 i l2 moraju biti jednaki ili manji od n. Ako ti uvjeti nisu zadovoljeni, ispisati odgovarajuu poruku i ispisati uitanu matricu. Ako su navedeni uvjeti zadovoljeni i ako je i=1, zamijeniti l1 i l2 redak uitane matrice. Ako je i razliito od 1, izvriti zamjenu l1-og i l2-og stupca matrice. Tako dobivenu matricu ispisati.

    15

  • 16

  • 2. JEDNOSTAVNI ZADACI U C PROGRAMSKOM JEZIKU.

    Kao to smo ve napomenuli svaki postavljeni primjer i zadatak ima vie moguih rjeenja u bilo kojem pa tako i u C programskom jeziku. Ovdje smo nastojali dati takva rjeenja, koja e za itaoca poetnika biti razumljiva i pregledna i nismo teili optimalnim rjeenjima po nekim drugim kriterijima. Napredni italac ima priliku da napravi i bolja rjeenja. 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 uitati broj n. Ako n nije prirodan ispisati poruku o pogreki i ponoviti uitavanje. Uitavati redom jedan za drugim n brojeva x i nai i ispisati najvei od njih xmax.

    Rjeenje: (Za algoritam ovog primjera vidi primjer 1.1.)

    /* Nalaenje najveeg broja xmax u skupu X od n lanova*/#include int main(){int i,n; /* Definiraj potrebne podatke */float x,xmax;printf("\nNalaenje najveeg broja u skupu\n\n" );printf("Molim zadajte broj elemenata u skupu: ");n=0;while (n

  • Komentar rjeenja:

    Sintaksa C-a ne zahtijeva pisanje svake naredbe u novom redu jer kraj naredbe ("reenice") zavrava s ";". Preglednosti radi ipak se najee pojedina naredba u C-u pie u zasebnom redu, pa su i ovdje prikazana rjeenja napravljena po ovom naelu. Komentari se u C-u piu izmeu znakova /* i */ i oni su i ovdje umetani da bi primjeri bili razumljiviji. Vitiaste zagrade (otvorena i zatvorena) slue da bi se njima oznaio blok naredbi koji se sintaktiki ponaa kao jedna naredba. To znai, da se takav blok moe nalaziti na mjestu, gdje se moe nalaziti i pojedina naredba. Preglednosti radi, u C programu su naredbe koje pripadaju istom bloku napisane pomaknute u desno za odreeni broj mjesta.

    Rjeenje ovog primjera, kao i sva ostala ovdje prikazana, poinju s #include naredbom. Tom naredbom naznauje se prevodiocu da ukljui u tekst naeg programa i odreene ve pripremljene dijelove koji se nalaze u standardnim C datotekama. Znakovi izmeu < > odreuju ime datoteke koja se ukljuuje. Naredba int main() je deklarativna naredba poetka glavnog programa. Rije int (kratica engl. integer, cijeli broj) znai da ovaj program vraa cjelobrojnu vrijednost programu od kojeg je pozvan. S obzirom da je ovo glavni program, njega poziva operacijski sustav, pa int ovdje znai da po zavretku 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 odreuje prijelaz u novi redak. Uitavanje broja n obavlja se iterativno pomou while petlje, koja se obavlja tako dugo, dok je uvjet u zagradi, u ovom sluaju n

  • Zadatak 2.3. Napisati C program koji e uitavati jedan za drugim niz brojeva. Kraj niza oznaen je brojem 9. Nai i ispisati aritmetiku sredinu uitanih brojeva uzimajui u obzir samo one brojeve koji su vei ili jednaki 2 i manji ili jednaki pet. Vidi zadatak 1.3.

    Zadatak 2.4. Napisati C program koji e uitati broj n. Taj broj mora biti prirodan i manji od 34. Ako taj uvjet nije zadovoljen ponoviti uitavanje broja n. Izraunati i ispisati n! (faktorijel od n=1*2*3*..*(n-1)*n). Vidi zadatak 1.4).

    Zadatak 2.5. Napisati C program koji e uitati brojeve m i n. m mora biti vee od n i oba broja moraju biti prirodna. Ako taj uvjet nije ispunjen ponoviti uitavanje. Nai i ispisati binomni koeficijent b jednak m povrh n tj.

    b mn m n

    =

    !! ( )! Vidi zadatak 1.5.

    Zadatak 2.6. Napisati C program koji e uitati dva broja N1 i N2. Oba broja trebaju biti prirodna. Ako taj uvjet nije ispunjen, ponoviti uitavanje. Ako je N2 < N1, zamijeniti N1 s N2. Nai i ispisati sumu drugih korjena svih neparnih brojeva od N1 do N2. Vidi zadatak 1.6.

    Primjer 2.2.

    Napisati C program koji e uitati cijeli broj n. Taj broj mora biti vei od 1 i manji od 100000. Ako ovaj uvjet nije ispunjen ispisati poruku "POGRENO ZADAN BROJ" i zavriti rad. Program treba nai i spisati sumu s svih znamenaka uitanog broja.

    Algoritam rjeenja:

    Uitaj broj nAko je n=

  • Rjeenje u C-u:

    /* Zbroj znamenaka cijelog broja */#include /* Standardna datoteka ulaza i izlaza*/#include /* 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

  • dijeljenjem brojs s 10 sve dok se ne dobije 0 te brojanjem koliko je bilo dijeljenja). s je suma koju poetno svodimo na nulu da bi je nakon toga u petlji poveavali za zadnju znamenku iz "preostalog" broja i to naredbom s+=zz.

    Zadatak 2.7. Napisati C program koji e uitavati niz cijelih brojeva. Zadnji broj u nizu, koji oznaava kraj niza je broj -1000. Nai i ispisati broj n koji pokazuje koliko je meu uitanim brojevima bilo onih, kod kojih je zadnja znamenka jednaka 3.

    Zadatak 2.8. Napisati C program koji e najprije uitati cijeli broj M. Taj broj mora biti vei od 0 i manji od 10. Ako taj uvjet nije zadovoljen, ispisati poruku "POGRENO ZADANA ZNAMENKA" i ponoviti uitavanje. Program dalje treba uitavati niz brojeva koji zavrava brojem 9999. Program treba nai i ispisati broj n koji pokazuje koliko je meu uitanim brojevima bilo onih kod kojih je prva znamenka jednaka M.

    Zadatak 2.9. Napisati C program koji e uitavati 300 prirodnih brojeva i nai i ispisati broj n koji pokazuje koliko je meu uitanim brojevima bilo takvih, kod kojih su prva i posljednja znamenka jednake.

    Primjer 2.3.

    Napisati C program koji e uitati cijeli broj n. Taj broj mora biti vei od 1 i manji od 10000. Ako ovaj uvjet nije ispunjen ispisati poruku "Pogreno zadan broj" i zavriti 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 xxn Log(n!)

    tampati 64 reda na svakoj stranici. Logaritam faktorijela ispisati na 4 decimalna mjesta

    Rjeenje:

    /* Ispis tabele logaritama faktorijela */#include #include 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

  • {printf("\nPogreno zadan broj!");return 1;}

    br=64;str=1;for (x=1;x

  • Zadatak 2.10. Napisati C program koji e s tastature uitati prirodni broj i nai i ispisati sve proste faktore toga broja.

    Zadatak 2.11. Napisati C program koji e nai i ispisati sve proste brojeve od 1 do 10000 (algoritam nalaenja 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 uitanog 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 slijedeeg sadraja: Logaritmi prirodnih brojeva Str. xxxn 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. Uitani brojevi x1, x2 i dx moraju zadovoljavati slijedee uvjete: x2>x1 i dx

  • 3. ZADACI S INDEKSIRANIM VARIJABLAMA

    U C-u, kao i u ostalim viim programskim jezicima, moemo koristiti skupove podataka koje nazivamo indeksiranim varijablama, poljima ili matricama. Svaki takav skup odreen je svojim jedinstvenim imenom a podatak unutar skupa odreen je s jednim ili vie 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 odreen je imenom vektora i jednim indeksom (koji se pie u uglatoj zagradi) Na pr. ako je v jednodimenzionalna indeksirana varijabla tj. vektor, tada v[5] oznaava njen element s indeksom 5. Prvi element ima indeks 0 pa v[5] daje podatak u 6. retku vektora. Takoer v[i] oznaava element s ideksom i vektora v. Ako je a matrica tj. dvodimenzionalna indeksirana varijabla, tada A[4][5] oznaava 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. Uitati 100 realnih brojeva u vektor v. Nai najmanji i najvei element u vektoru v, zamijeniti njihova mjesta i ispisati tako dobiveni vektor. Pri ispisu ispisati po 8 elemenata u istom redu.

    Alogoritam rjeenja:

    Definiraj vektor v od 100 elemenataZa svaki i=0 do 99 uitaj v[i]Postavi imin=0Postavi imax=0Za svaki i=1 do 99 uini slijedee

    Ako je v[i] < v[imin] postavi imin=iAko je v(i) > v[imax] postavi imax=iKraj Za svaki i

    Postavi vx=v[imin]Postavi v[imin]=v[imax]Postavi v[imax]=vxZa svaki i=0 do 99 ispii v[i]

    Rjeenje u C-u

    /* Nai najmanji i najvei broj u vektoru i zamijeniti ih */#include int main(){ float v[100],vx;

    24

  • int i,imin,imax;for (i=0;i
  • Zadatak 3.3. Napisati C program koji e koristiti vektor x od 200 elemenata. Uitati broj m koji mora biti manji od 201 i vei od nule. Ako taj uvjet nije zadovoljen ispisati poruku "Pogreno zadan broj elemenata vektora" i prekinuti rad. Ako je m ispravan, uitati m realnih brojeva u vektor x. Nai najmanji i najvei lan xmin i xmax vektora. Nai i ispisati sve lanove vektora koji su vei od xmax/2 i manji od xmin*2. Ispis treba imati izgled:

    lanovi vei od xmax/2 i manji od xmin*2 su: xxxxxx.xxxxxxxx.xx

    Zadatak 3.4. Napisati C program koji e koristiti vektor y od 50 elemenata. Uitati 50 realnih brojeva. Ako je uitani broj negativan, staviti ga u vektor s promjenjenim predznakom. Ako je uitani broj jednak nuli ne staviti ga u vektor. Nai 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 takmiara odrediti mjesto koje je on zauyeo na temelju postignutog rezultata (vremena) t. Svaki takmiar ima svoj startni broj s. Napisati C program koji e uitavati podatke o startnom broju takmiara i o njegovom postignutom vremenu t i ispisati poruku:

    Takmiar xxx, vrijeme xxxx.xx ; xxx. mjesto

    Kada su uitani svi podaci (kada je takmienje zavreno) program treba ispisati redoslijed svih takmiara. Taj ispis treba imati izgled:

    Br. Takm. Vrijeme

    1 xxx xxxx.xx 2 xxx xxxx.xx

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

    26

    1

    RaRb

    2

    Slika 3.1

  • vertikalnim granama. Predvidjeti mogunost do 100 otpora Ra i Rb. Nai i ispisati vrijednost otpora mjerenog na tokama 1 i 2. Formate uitavanja i ispisa izabrati proizvoljno.

    Primjer 3.2.

    Sortiranje (poredanje) podataka. Napisati C program koji e najprije uitati 100 brojeva u vektor v, a nakon toga poredati te brojeve po rastuem redoslijedu i tako poredane brojeve ispisati.

    Algoritam rjeenja:

    Definiraj vektor v od 100 elemenataZa svaki i od 0 do 99 uitaj v[i]Postavi Sortiran=falsePostavi m=100Sve dok je Sortiran=false ini slijedee:

    Za svaki j=0 do m-2 uini slijedee:Postavi sortiran=trueAko 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]=vxPostavi Sortiran=falseKraj Ako je..

    Kraj za svaki jSmanji m za 1Kraj Sve dok je Sortiran=false

    Za svaki i=0 do 99 ispii v[i]

    Rjeenje u C-u:

    /* Sortiranje brojeva u vektoru v - Bubble Sort */# include int main(){float v[100],vx;int i,j,Sortiran,m;for (i=0;i

  • v[j]=v[j+1];v[j+1]=vx;Sortiran=false;}

    m--;}

    for (j=0;j

  • Primjer 3.3.

    Podaci o broju proizvedenih dijelova na nekom stroju biljee se automatski u datoteke na disku. Pohranjeni podaci sadre: 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 odgovarajuim naslovom i opisom iznad pojedinog stupca i ispred pojedinog reda. Koristiti tabelu u obliku dvodimenzionalne indeksirane varijable TAB.

    Algotitam rjeenja:

    Definiraj tabelu TAB od 13 redaka i 7 stupacaZa svaki i=0 do 12 uini

    Za svaki j=0 do 6 postavi TAB[i][j]=0Otvori datoteku proizvod.datSve dok ne nastupi kraj datoteke proizvod.dat ini

    Uitaj podatke STROJ, DAN i KOMADA iz zadane datotekeAko je DAN>0 i DAN0 i STROJ

  • filin=fopen("proizvod.dat","r");if(filin==NULL) {printf("Nema datoteke proizvod.dat"); return 1; }for (i=0;i
  • Zadatak 3.10. Napisati C program koji e uitavati podatke o godini upisa (GOD) i spolu (SPOL) studenata. GOD je cijeli broj koji moe biti od 1 do 4. Spol je cijeli broj koji moe biti 1 (muki) ili 2 (enski). Uitane podatke treba tabelirati i dobivenu tabelu ispisati tako, da njen izgled bude slijedei:

    PODACI O STUDENTIMA PO GODINAMAMUKI ENSKI UKUPNO

    1. GOD. xxxx xxxx xxxx2. GOD. xxxx xxxx xxxx3. GOD. xxxx xxxx xxxx4. GOD. xxxx xxxx xxxxUKUPNO: xxxx xxxx xxxx

    Zadatak 3.11. Uitavati 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

    MUKI ENSKI

    1. GOD. xxx.xx% xxx.xx%2. GOD. xxx.xx% xxx.xx%3. GOD. xxx.xx% xxx.xx%4. GOD. xxx.xx% xxx.xx%UKUPNO: xxx.xx% xxx.xx%

    Zadatak 3.12. Napisati C program koji e koristiti matricu A od 30 redaka i stupaca. Uitati cijele brojeve m i n koji oba moraju biti manji od 30. Ako taj uvjet nije ispunjen, zavriti program. Uitati m * n realnih brojeva u m redaka i n stupaca matrice A. Nai 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.xx2 xxxxx.xx .. ........ .. ........UK: xxxxx.xx

    Zadatak 3.13. Napisati C program koji e uitati 64 realna broja u matricu X od 8 redaka i stupaca. U svakom retku matrice, u kojem je dijagonalni lan razliit od nule, podijeliti sve lanove retka (ukljuujui 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.

    31

  • Zadatak 3.14. Napisati C program koji e najprije uitati realni broj X a zatim uitati 36 realnih brojeva u 6 redaka i stupaca matrice Z. Podijeliti sve lanove ispod dijagonale u matrici Z sa X. Pomnoiti 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.

    Mnoenje matrica: Dvije matrice A i B mogu se pomnoiti tj. moe se nai 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 uitati broj redaka m matrice A, broj stupaca n matrice A i broj stupaca k matrice B. Iza toga program treba uitati m*n realnih brojeva u matricu A i k*n brojeva u matrice B te nai i ispisati matricu C=A*B.

    Algoritam rjeenja:

    Definiraj matrice A, B i C od 30 redaka i stupacaSve dok je m>30 ili n>30 ili k>30 ini slijedee

    Uitaj m (broj redaka) i n (broj stupaca) matrice A i k (broj stupaca) matrice B.Ako su m ili n ili k vei od 30 spii poruku o pogreno zadanim m, n ili kKraj sve dok...

    /* Uitaj brojeve u matricu A */Za svaki i=0 do m-1 i svaki j=0 do n-1 uitaj A[i][j]/* Uitaj brojeve u matricu B */Za svaki i=0 do n-1 i za svaki j=0 do k-1 uitaj B[i][j]/* Mnoenje matrica: Nai 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 slijedee

    Za svaki j=0 do k-1 uini slijedeePostavi C[i][j]=0Za svaki l=0 do n-1 poveaj C[i][j] za A[i][l]*B[l][j]Ispii C[i][j]Kraj za svaki j

    Krak za svaki i

    Rjeenje u C-u:

    /* Mnoenje matrica C=A*B */#include int main()

    32

  • {float A[30][30],B[30][30],C[30][30];int m,n,k,i,j,l;/* Uitaj 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 veliina matrice, ponovite!");}

    /* UITAJ MATRICU A */printf("\nMatricu A molim\n");for (i=0;i

  • i m realnih brojeva u vektor Y. Nai i ispisati vektor Z=X*Y. Koristiti algoritam mnoenja iz prethodnog primjera.

    Zadatak 3.16. Razraditi algoritam i napisati C program koji e koristiti matrice A, B i C od po 40 redaka i stupaca. Uitati 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). Nai i ispisati C=A*B.

    Zadatak 3.17. Razraditi algoritam i napisati C program koji e uitati prirodan broj m, m*m realnih brojeva u matricu A i nai i spisati matricu A*A.

    Zadatak 3.18. Razraditi algoritam i napisati C program koji e uitati prirodan broj m, m*m realnih brojeva u matricu X i realni broj y. Nai matricu Z kao kvadrat matrice X. Pomnoiti svaki lan zadnjeg stupca matrice Z s y. Uitati m realnih brojeva u vektor V i nai i ispisati Z*V. Formate ispisa izabrati proizvoljno.

    Zadatak 3.19. Razraditi algoritam i napisati C program koji e uitati 25 realnih brojeva u matricu A koja ima 5 redaka i stupaca. Uitati jednoznamenkasti prirodan broj n i nai 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 moe se svesti na oblik gornje trokutaste matrice koristei slijedee elementarne transformacije nad recima matrice: bilo koji redak moe se pomnoit brojem razliitim od nule; bilo koja dva retka mogu zamijeniti svoja mjesta; bilo koji redak prethodno pomnoen nekim brojem moe se dodati nekom drugom retku. Raunski postupak kojim se matrica svodi na oblik gornje trokutaste matrice naziva se Gaussova metoda eliminacije. Ovdje emo promatrati samo regularne matrice jer je openit postupak sloeniji. Razraditi algoritam i napisati C program koji e uitati broj n a zatim n * n realnih brojeva u matricu A te svesti matricu na gornju trokutastu i ispisatu je na ekran.

    Algoritam rjeenja:

    Definiraj matricu AUitaj broj redaka i stupaca n matrice AUitaj n * n brojeva u matricu APostavi s=1

    34

  • /* U svakom stupcu k od 1. do n-1. svedi lanove ispod dijagonalnog na nulu */Za svaki k=0 do n-2 uini slijedee

    Ako je dijagonalni lan A[k][k] jednak nuli tada ini/* Dijagonalni lan je jednak nuli, pronai lan u k-tom stupcu ispod dijagonale koji je razliit od 0. Ako takvog nema matrica nije regularna i ne

    moe se svesti na gornju trokutastu */Postavi i=k+1Sve dok je i

  • printf("\nMolim podatke za matricu u %d redaka i stupaca\n",n);for(i=0;i
  • do predzadnjeg (k ide od 0 do n-2) jer u zadnjem stupcu vie nema lanova ispod dijagonalnog. Ako je dijagonalni lan jednak nuli pa nije mogue s njim dijeliti, pronalazi se redak ispod dijagonale koji u tom (k-tom) stupcu ima vrijednost razliitu od nule pa se ti reci zamijene i varijabli s se promijeni predznak. Ako takav redak ne postoji i zamjena nije mogua, matrica se ne moe svesti na gornju trokutastu pa se ispisuje odgovarajua poruka i zavrava dalje raunanje. Za dijagonalni lan razliit od nule obavlja se mnoenje 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), moe se dogoditi da je zadnji dijagonalni lan jednak nuli. Tada se matrica opet ne moe svesti na gornju trokutastu pa se ispisuje odgovarajua poruka. Program napisan u C-u tono slijedi dati algoritam. Uitavanje i ispis matrice A obavljen je pomou iteracija tako da i pri uitavanju i pri ispisu imamo prikazanu matricu u n redaka i stupaca.

    Zadatak 3.20. Razraditi algoritam i napisati C program koji e uitati prirodan broj n i n*n realnih brojeva u matricu A a zatim svesti matricu na gornju trokutastu. Ispisati poetnu 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 uitati 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 ispie 8 10-znamenkastih brojeva s tri decimalna mjesta.

    Zadatak 3.22. Determinanta matrice je broj koji se dobiva odreenim raunskim operacijama s lanovima matrice. Jedan od naina raunanja determinante je svoenje matrice na gornju trokutastu i nalaenje produkta dijagonalnih lanova. Napisati C program koji e uitati prirodni broj M i M*M realnih brojeva u matricu A a zatim nai i ispisati determinantu od A.

    Zadatak 3.23. Razraditi algoritam i napisati C program koji e uitati prirodan broj m1 i m1*m1 realnih brojeva u matricu A1, uitati prirodan broj m2 i m2*m2 realnih brojeva u matricu A2. m1 i m2 moraju biti manji od 101. Nai determinanante obih matrica (D1=det(A1) i D2=det(A2) ). Nai i ispisati X=D1/D2. U sluaju da je D2=0 ispisati poruku "X nije definiran".

    Zadatak 3.24. Razraditi algoritam i napisati C program koji e uitati dva prirodna broja m i n (oba moraju biti manja od 21), uitati m*n realnih brojeva u matricu A i n*m realnih brojeva u matricu B. Pomnoiti matrice A i B (nai C=A*B), svesti matricu C na gornju trokutastu i ispisati tu matricu.

    Zadatak 3.25. Razraditi algoritam i napisati C program koji e nai rjeenje sistema linearnih jednadbi koristei Gauss-Jordanovu redukciju. Program treba uitati prirodni broj m (manji od 51) koji odreuje broj jednadbi u sistemu. Iza toga program treba uitati m*(m+1) koeficijenata jednadbi. Na pr. ako se sistem sastoji od 3 jednadbe (m=3) zadane kao -3x1 + x2 + x3 = 2-6x1 + 4x2 + 4x3 = 14

    37

  • 3x1 + x2 + 3x3 = 10matrica koja opisuje sistem imat e 3 reda i 4 stupca i glasit e:-3 1 1 2-6 4 4 143 -1 3 10

    Algortimom vrlo slinim 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 raunske operacije s lanovima matrice moraju obuvaati i m+1. stupac tj. lanove sa desne strane jednadbe (jednabu mnoimo tako, da obje strane pomnoimo 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 uitane koeficijente jednadbi nai i ispisati rjeenja x1 do xm. Ako zadana matrica nije regularna, ispisati poruku da sistem nema rjeenja.

    Primjer 3.6. Invertiranje matrice.

    Kvadratnu matricu A moemo invertirati (ako je regularna) i dobiti B=inv(A) sa svojstvom da je A*B=I (I je jedinina 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 sline kao kod Gauss-Jordanove redukcije primjene istovremeno na zadanu matricu i na jedininu matricu. Od zadane matrice A i odgovarajue jedinine matrice nainimo blok matricu A;I. Primjenom Gaussovih elementarnih transformacija nad recima blok matrice A;I ista se moe svesti na oblik I;B gdje je I ponovno jedinina matrica a B inverzna matrica matrice A. Ovdje prikazan algoritam invertira matricu od n redaka i stupaca na opisan nain.

    Algoritamsko rjeenje:

    Definiraj matricu A od 50 redaka i 100 stupacaUitaj broj redaka i stupaca n zadane matriceUitaj zadanu matricu u prvih n stupaca matrice ASvedi preostalih n stupaca matrice A na jedininu/*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 uini slijedee

    Ako je dijagonalni lan A[k,k] jednak nuli tada

    38

  • /* Dijagonalni lan je 0; pronai lan u k-tom stupcu razliit od nule i zamijeni redove. Ako takvog nema ispii poruku da matrica nema inverznu*/

    Ako je k=n-1 ispii poruku da matrica nema inverznu i prekini dalje raunanjePostavi i=kSve dok je A[i,k]=0 i in ispii poruku da matrica nema inverznu i prekini dalje raunanje./* lan u i-tom redu je razliit od nule; zamijeni i-ti i k-ti redak */Za svaki j=k do 2*n-1 uini slijedee

    Postavi z=A[k,j]Postavi A[k,j]=A[i,j]Postavi A[i,j]=zNastavi sa slijedeim 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 uini slijedee

    Ako je i != k tada ini slijedeePostavi xm=A[i,k]Za svaki j=k do 2 x n-1 uini slijedee

    Od A[i,j] odbij A[k][j]*xmNastavi sa slijedeim j

    Kraj ako je i !=jNastavi sa slijedeim i

    Nastavi sa slijedeim k/*Ispis invertirane matrice */Za svaki i=0 do n-1 uini slijedee

    Za svaki j=n+1 do 2 x n-1 ispii A[i,j]Nastavi sa slijedeim i

    Rjeenje u C-u

    /* UCITAJ ZADANU MATRICU (BROJEVE U SVAKI REDAK I STUPAC) */#include 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

  • for (i=0;i
  • ti) redak podijeli sa dijagonalnim lanom. (Varijabla xm slui zato, da se sauva vrijednost dijagonalnog lana nakon to smo ga podijelili sa samim sobom i sveli na 1, jer s njim treba dijeliti i ostale lanove retka). Svodenje lanova na nulu obavlja se odbijanjem reaka i iznad i ispod dijagonale a preskae 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 nai i ispisati inv(A*A) (invertiranu matricu od kvadrata matrice A). Formate uitavanja 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 uitati matricu A od 8 redaka i stupaca, nai B=inv(A) i nai 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 uitati 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. Nai 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 uitati prirodni broj m, m*m realnih brojeva u matricu A i m realnih brojeva u vektor B. Nai i ispisati C=inv(A)*B.

    41

  • 4. ZADACI S FUNKCIJAMA

    C omoguava, pored koritenja ugraenih (prevodioevih) funkcija i jednostavno definiranje i koritenje 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 piu u zagradi iza imena funkcije. Program u kojem se funkcija koristi i koji se naziva pozivajui program, razmjenjuje podatke s funkcijom na dva naina: preko globalnih varijabli koje su tako definirane da vrijede i u pozivajuem programu i u svim funkcijama koje se iz njega pozivaju; drugi nain je razmjena podataka preko parametara: pri pozivu funkcije parametre u obliku izraza, najee samo varijabli, piu se u obliku popisa (jedan ili vie podataka odvojenih zarezima) koji se stavlja iza imena funkcije. Time je omoguena openitost koritenja jednom prireene 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 moe biti oblika: float fun1(float x, float z , int n). Poziv ovakve funkcije ima oblik fun1(a,b,k). Simbolika 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 tipine primjere i zadatke za koritenje funkcija

    Primjer 4.1.

    Nalaenje nultoke funkcije f(x)=a*x*x-b*exp(x) metodom tangente (Newton-Raphsonaova metoda): Nultoka funkcije f(x) tj. rjeenje jednadbe f(x)=0 postie se numerikom metodom tangente na nain prikazan na slici 4.1. U poetno proizvoljno odabranoj toki x1 povue se tangenta na krivulju y=f(x) u toki (x1,f(x1)). Ta tangenta sijee os x u toki x2 koja je blie nultoki (sjecitu krivulje s osi x) od prethodne toke. Svaka naredna toka dobiva se iz prethodnepomou izraza

    x x f xf x

    i i= + 1( )'( )

    xi+1 xi x

    f(x)

    Slika 4.1.

    42

  • (f ' (x) je derivacija funkcije f(x) u toki x ). Uzastopnim ponavljanje ovog postupka dolazimo do neke toke x dovoljno blize nultoki u kojoj je apsolutna vrijednost funkcije manja od dozvoljene pogreke. Za numeriko rjeavanje ovog problema potrebno je pored funkcije i njene derivacije (koje emo zadati odgovarajuim funkcijama) definirati poetni x, dozvoljenu pogreku (na pr. eps) i maksimalan broj iteracija koje e pogram izvoditi u nastojanju da nae zadovoljavajue rjeenje. Algoritam i C program izgledat e ovako:

    Algoritam rjeenja:

    Definiraj funkciju f(x)Definiraj derivaciju zadane funkcije kao df(x)Uitaj koeficijente a i bUitaj poetni x, dozvoljenu greku eps i broj iteracija nPostavi i=1Sve dok je ieps uini slijedee

    Nai x=x-f(x)/df(x)Poveaj i za 1Kraj sve dok

    Ako je i

  • Rjeenje u C-u:

    # include # include 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 poetni x, greku eps i broj iteracija n \n");scanf("%f%f%d",&x,&eps,&n);for (i=1;ieps;i++) /* Iterativno trai rjeenje */

    x-=f(x)/df(x);if (i

  • Zadatak 4.2. Napisati C program koji e uitati cijele brojeve k, m i n i realne brojeve x1 i x2. Program treba izraunati i ispisati vrijednosti funkcije f(x)=exp(-n*x)*sin(m*x) za k vrijednosti varijable x tako da je poetna vrijednost varijable x=x1 a konana vrijednost x=x2.

    Zadatak 4.3. Razraditi algoritam i napisati C program koji e nai sjecite krivulja f1(x)=ln(a*x) i f2(x)=b*sin(x). Brojeve a i b uitati kao realne varijable a i b. Uputa: koristiti metodu tangente i nai nultoku funkcije f(x)=f1(x)-f2(x).

    Zadatak 4.4. Put koji pree 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 uitati parametre a, b i c (u realne varijable a, b i c) i vrijeme t0 (u cjelobrojnu varijablu t0) i nai i ispisati preeni 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 raunati priblino numeriki po izrazu v(t)=(s(t+dt)-s(t))/dt uzimajui 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

    u U ect

    RC=

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

    Napisati C program koji e uitati vrijednost kapaciteta C u mikrofaradima, otpora R u kiloohmima i napona U0 u voltima te nai 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 izrazimay(t)=sin(a*t+f), x(t)=sin(b*t) (Tako definirane krivulje zovu se Lissajousove krivulje). Napisati C program koji e uitati podatke a, b i f (u realne varijable a, b i f) te nai i ispisati koordinate zadane krivulje u 100 toaka za t=0 do 2*pi (pi =3.14159).

    Zadatak 4.7. Napisati C program koji e koristiti funkcije i raunati i ispisivati vrijednosti funkcija f1(x)= sin(x)/x i f2(x)=f1(x)^x. (znak ^ oznaava potenciranje). Varijabla x treba poprimiti vrijednosti od poetnog 1 do uitanog xmin (xmin

  • Primjer 4.2.

    Povrina ispod krivulje y=f(x) u intervalu od x1 do x2 moe se priblino raunati trapeznom metodom tako, da se cijela povrina aproksimira odreenim brojem trapeza. Slika 4.2 prikazuje to naelo. Povrina pojedinog trapeza je Pi=dx*(f(xi)+f(xi+dx))/2 Kada se povrine svih n trapeza zbroje dobiva se ukupna povrina 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 raunanju svih povrina 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 nai povrinu ispod krivulje y=a*x*abs(sin(b*x)) u intervalu od zadanog x1 do zadanog x2. Aproksimirati povrinu pomou n trapeza. Parametre a i b uitati kao realne brojeve a broj trapeza n kao cijeli broj.

    x1 x2 xxi xi+1

    f(x)

    0

    Slika 4.2

    46

  • Algoritam rjeenja:

    Definiraj funkciju f(x)=a*x*abs(sin(b*x))Uitaj parametre a i b, broj trapeza n i poetak i kraj intervala x1 i x2Nai dx=(x2-x1)/nPostavi S=(f(x1)+f(x2))/2Za svaki x=x1+dx do x2-dx poveaj S za f(x) Izraunaj p=dx*SIspii p

    Rjeenje u C-u:

    /*Povrsina ispod krivulje trapeznom metodom */#include #include 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 Povrina ispod krivulje trapeznom metodom\n\n");printf("\nMolim zadajte parametre a i b i broj toaka n\n");scanf("%f %f %d",&a,&b,&n);printf("\n\nMolim zadajte poetetak 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

  • raun tako dugo, dok se izraunate povrine u zadnje dvije iteracije zanemarivo malo razlikuju. Slino se radi i metodom parabole ili Simpsonovom metodom. Kako su ti algoritmi neto sloeniji i spadaju u podruje numerike matematike, neemo ih ovdje navoditi.

    Zadatak 4.8. Napisati C program koji e trapeznom metodom nai i ispisati povrinu kruga uitanog polumjera r. Uputa: Raunati povrinu 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 uitati parametre a i b i trapeznom metodom nai povrinu elipse kojoj sa a i b osi. (vidjeti uputu iz prethodnog zadatka).

    Zadatak 4.10. Napon na nekom potroau mijenja se vremenski po funkciji u(t)=e-bt*sin(a*t) dok je otpor potroaa ovisan o naponu po funkciji r(u)=r0+ln(1+abs(u)/10) Napisati C program koji e uitati parametre a, b i r0 te poetno i krajnje vrijeme t1 i t2 i nai i ispisati energiju utroenu na potroau u vremenskom intervalu t1 do t2. Uputa: energija je vremenski integral napona i struje pa treba nai povrinu 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 uitati parametre a, b i c i vremena t1 i t2 te nai preeni put s u intervalu t1 do t2. Uputa: put je integral brzine pa treba nai porinu 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 uitati podatak n i n realnih brojeva kojima treba popuniti vektor v. Funkcija srvr treba nai srednju vrijednost brojeva smjetenih 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 rjeenja:

    Glavni program:

    Definiraj vektor v od 100 realnih brojevaUitaj broj nAko je n>100 tada

    Ispii poruku da je broj podataka prevelikPrekini dalji rad

    Za svaki i=0 do n-1 uitaj i-ti element vektora vIspii vrijednost funkcije Srvr(n,v)

    Funkcija Srvr:

    48

  • Postavi s=0Za svaki i=0 do n-1 poveaj s za v[i]Vrati vrijednost s/n pozivajuem programu

    Rjeenje u C-u:

    /*Srednja veijednost podataka u vektoru */#include float srvr(float v[],int n){ int i;float s;s=0;for (i=0;i

  • vektoru V koji je vei od x. Ako u vektoru V ne postoji broj vei 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 nai najvei 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 krunoj frekvenciji . Napomena: Kapacitet Cs serijskog spoja kondenzatora dat je izrazom 1 1 1 1

    1 2C C C Cs n= + + +....

    a impedancija Z tog serijskog spoja je Z=sC

    1

    Primjer 4.4

    Napisati C glavni program i funkcije SUMR i RELF. Glavni program treba uitati cjelobrojne podatke u matricu Mat od 30 redaka i stupaca u kojoj je popunjeno m redaka i n stupaca. Iza toga program treba nai 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 matrica23 76 5313 4 110 0 00 0 15

    onda treba ispisati matricu relativnih podataka u postocima u obliku:

    15.13 50.00 34.8746.43 14.29 39.28

    50

  • 0.00 0.00 0.000.00 0.00 100.00

    Algoritam rjeenja:

    a. Glavni program:

    Definiraj cjelobrojnu matricu Mat od 30 redaka i stupcaUitaj broj redaka m i stupaca n popunjenih u matrici MatZa svaki i=0 do m-1 uini

    Za svaki j=0 do n-1 uitaj Mat[i][j]Za svaki i=0 do m-1 uini

    Za svaki j=0 do n-1 ispii 100*RELF(Mat,i,j, SUMR(Mat,i,n))

    51

  • 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=0Za svaki j=0 do nstup-1 poveaj sr za M[red][j]Vrati podatak sr pozivajuem 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 razliito od 0 vrati M[i][j]/tot u pozivajui programU suprotnom vrati 0 u pozivajui program

    Rjeenja u C-u:

    /*Relativni podaci u odnosu na sumu reda matrice */#include /*Funkcija nalaenja sume reda */int SUMR(int M[30][30], int red,int nstup){ int sr,j;sr=0;for (j=0;j

  • return 0;}

    Komentar rjeenja:

    Algoritam zadatka je jednostavan i ve u ranijim primjerima prikazivan pa ga neemo posebno obrazlagati. Ono to treba uoiti 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. Simbolika imena parametara u pozivu i definiciji ne moraju biti ista no njihov tip i oblik mora biti u oba sluaja 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 postie se na taj nain, da se nakon ispisanog reda (kraj unutarnje petlje po j) daje se na ispis znak "\n" nakon kojeg zapoinje ispis u novom retku. U funkciji RELP izraz koji se vraa napisan je u obliku 1.*M[i][j]/tot. Realna konstanta 1. potrebna je da bi se cijeli izraz raunao u realnoj aritmetici i dao realni rezultat.

    Zadatak 4.18. Napisati C program koji e uitati realne podatke u matricu X od 20 redaka i stupaca. Koristei funkciju XMIN s parametrima X, i i program treba nai 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 uitati m1 podataka u vektor V1 i m2 podataka u vektor V2. Oba vektora mogu imati najvie 100 lanova. Koristei funkciju PRODMM s parametrima V1, m1, V2 i m2) program treba nai i ispisati umnoak najmanjih brojeva iz vektora V1 i V2.

    Zadatak 4.20. Zadan je slijedei C program :

    /* Ispis najmanjeg i najveeg dijagonalnog lana matrice */#include main(){float A[20][20];int i,j;for (i=0;i

  • Zadatak 4.21. Zadan je slijedei C program:

    /* Usporedba dvaju vektora */#include 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

  • void Swap(float *a, float *b) { float x;x=*a;*a=*b;*b=x;}Ovako oznaavanje promjenjljivih parametara ne koristi se za parametre koji su vektori i matrice. Vektori i matrice uvijek se razmjenjuju po adresi (predaje se adresa poetka te strukture podataka) pa se to ne treba posebno naznaiti. Slijedei zadatak i rjeenje prikazuju ove mogunosti: 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 uita m realnih brojeva. Kraj podataka s tipkovnice upisuje se znakom Ctrl Z. Funkcija Nmax nalazi najvei 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 najvei 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 rjeenja

    a. Funkcija NmaxDefinirati funkciju Nmax s parametrima V, m i maxPostaviti max=V[0] /* Prvi podatak u vektoru na poetku je najvei*/Postaviti tmax=1 /* Broj pojavljivanja najveceg podatka */Za svaki i=1 do m-1 initi

    Ako je V[i]=max poveati tmax za 1u suprotnom

    ako je V[i]>max initi Postaviti max=V[i] Postaviti tmax=1 Kraj u suprotnom

    b. Glavni programUitati prvi podatak u vektor V[0]Za svaki i=1 do 99 i dok ima podataka uitati podatak u V[i]Postaviti m=i-1Postaviti n=Nmax(V,m,max) /* Pozvati Nmax funkciju */Za svaki i=0 do m-1 initi

    Podijeliti V[i] s nIspisati V[i]Kraj za svaki i

    Ispisati max i n

    Rjeenje u C-u:

    #include

    55

  • /* 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 *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

  • uitavaju sa standardne ulazne datoteke, koja se zove stdin i koja na definirani nain reagira na Ctrl z tipku. Uitavanje u prvi element vektora V (koji ima indeks 0 pa je to V[0] ) moe 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 uitavanja obavljaju se na mjesto razliito od poetka vektora pa se kao parametar predaje &V[i]. Uitavanje iz datoteke obavlja se fscanf funkcijom. U ovom primjeru uoava se petlja u kojoj se obavlja uitavanje sve dok ne doe kraj podataka (ispituje se uvjet !feof(stdin) ).

    Zadatak 4.22. Napisati C glavni program koji e s tipkovnice uitati 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, najvei otpornik rmax i otpor paralelnog spoja ovih otprornika rx. Ako je rmin=0 postaviti rx=0. U suprotnom raunati 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 najvei 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 uitava n0 i ispisuje n i xlmn.

    Zadatak 4.24. Napisati C funkciju SRVF. Funkcija se poziva izrazom SRVF(x1,x2,z,n,&fmax). Funkcija rauna srednju vrijednost matematike funkcije date izrazom

    f(x)=sin(x)*cos(z*x)

    u intervalu od x1 do x2 uzimajui x u n jednako razmaknutih toaka. Ta funkcija treba takoer nai i najveu vrijednost zadane funkcije uzimajui u obzir iste toke. Tu najveu 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 pozivajueg programa dobiva vrijednost parametra n. U sluaju da je n>200 funkcija ispisuje poruku "BROJ ELEMENATA VEKTORA PREVELIK" i vraa se u pozivajui program. U suprotnom funkcija uitava s tipkovnice n elemenata u oba vektora i zatim se vraa u pozivajui program.

    Primjer 4.6. Upotreba datoteka.

    57

  • Datoteke (skupovi podataka na vanjskoj memoriji - nosiocu podataka) mogu se iz C programa koristiti pomou FILE tipa varijable. Taj tip je adresni, pa je njegova definicija oblika FILE *ime. Ovdje je "ime" unutarnje ime datoteke na koje se pozivamo u programu pri radu s nekom datotekom. Naredni primjer prikazuje koritenje 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 uitavati 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

  • Mx[i][j]=0;fscanf(fin,"%d %d",&i,&j);do

    { if(i

  • Nakon uitanih svih podataka funkcija zavrava rad i vraa kontrolu pozivajuem programu. Ovdje nemamo iskaz "return" u funkciji jer ona ne poprima nikakvu vrijednost (ona je tipa "void" tj "prazna") ve se podaci u pozivajui program predaju preko parametra Mx. Ova matrica ispisuje se u glavnom programu. Uoite da imena parametara u glavnom programu i u funkciji UMAT nisu ista.

    Na slian nain kao to je ovdje prikazana upotreba ulazne datoteke, moe se definirati i koristiti izlazna tekstualna datoteka. U takvu datoteku unose se podaci od njenog poetka. Definicija izlazne datoteke slina je definiciji ulazne datoteke, ali se umjesto parametra "rt" upisuje "wt". Upis podataka u izlaznu tekstualnu datoteku obavlja se na nain 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 znaenje kao i u primjeru 4.6. Glavni program treba iz datoteke ije ime se zadaje preko tipkovnice uitati 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

    Slino kao to se pozvanoj funkciji mogu predati parametri iz pozivajueg programa, tako se i glavnom programu mogu predati parametri iz operacijskog sustava. U tom sluaju se naznauje 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). Opirnije objanjenje o tim parametrima dato je u komentaru rjeenja 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 uitati 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 mnoi matricu X s matricom Y i rezultat se stavlja u matricu X. Broj redaka i stupaca odreen 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. Koritenjem navedenih procedura, glavni program nalazi i ispisuje potenciju uitane matrice.

    Algoritam rjeenja:

    a. Glavni program:Definiraj matrice X, Y i Z sa 100 redaka i stupacaAko je broj predanih parametara iz opreacijskog sustava jednak 1 tada:

    Ispii poruku o pogrekiZavri program s porukom 1 o pogrekiKraj Ako je...

    60

  • Otvori ulaznu datoteku s imenom datim u parametruAko navedene datoteke nema tada

    Ispii poruku o pogrekiZavri program s porukom 2 o pogrekiKraj Ako

    Uitaj m i potenc iz prvog zapisa datotekeAko je m>0 i m

  • #include void MULMAT(float A1[100][100], float A2[100][100],float A3[100][100], int m){int i,j,l;for (i=0;i
  • printf("\n\nPotencirana matrica je: \n\n");ISPMAT(Y,m);

    }else{printf("\nMatrica je prevelika!");exit(3);}

    return 0;}

    Komentar rjeenja:

    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 rijei 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 sadravati barem ime programa, zbog toga je broj rijei u naredbi kojom se poziva program uvijek jedan ili vei. 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 rijei vei od 1, te ako je to sluaj, 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 pogreke koja je nastupila. Na analogan nain zavrava se program i u sluaju kada nema zadane datoteke ili je zadana prevelika matrica.

    Mnoenje matrica vri se po algoritmu iz primjera 3.4. U glavnom programu se uitana matrica X prenese u Y pozivom funkcije PRENMAT. Iterativnim pozivanjem funkcija MULMAT i PRENMAT (mijenjanjem i od 2 do potenc) vri se uzastopno mnoenje 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 uitava cijele brojeve m, n i k. Ako je m vee od nule pozivaju se funkcije UM i IM. Ako taj uvjet nije ispunjen, zavrava 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 uitati u matricu. Funkcija UM uitava 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 uita m * n realnih brojeva.

    63

  • 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 pomou funkcije SUMR(MAT,i,n). Na slian nain nalazi se suma stupca pomou funkcije SUMS(MAT,j,m) i ukupna suma cijele matrice pomou funkcije SUMA(MAT,m,n). Funkcija EFREQ nalazi tkzv. oekivane 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

    ),,(),,(*),,(]][[

    nmMATSUMAmjMATSUMSniMATSUMRjiXMAT =

    (tj. oekivana frekvencija je umnoak sume reda i stupca podijeljena sa ukupnom sumom). Matricu oekivanih frekvencija XMAT ispisati u glavnom programu.

    Zadatak 4.29. Napisati glavni C program i proceduru SORT. Glavni program uitava realne brojeve iz datoteke ije ime se zadaje kao parametar pri pozivu programa. Brojevi iz datoteke uitavaju 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 rastuem 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. Koristei 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 aritmetika 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 uitavanje obaviti s tipkovnice. Rezultat tj. medijan ispisati na ekran.

    64

  • 5. RJEENJA ZADATAKA

    Zadatak 1.1.

    Uitaj n Sve dok n nije prirodan broj ini Ispii poruku o pogreno zadanom broju n Uitaj n Kraj sve dok Postavi s=0 Za svaki i=1 do n ini Uitaj x Poveaj s za x Kraj za svaki i Izraunaj s=s/n Ispii s

    Zadatak 1.2.

    Postavi s=0 Postavi n=0 Uitaj x Sve dok je x razliito od -99999 ini Poveaj s za x Poveaj n za 1 Uitaj x Kraj sve dok Izraunaj s=s/n Ispii s

    Zadatak 1.3.

    Postavi s=0 Postavi n=0 Uitaj x Sve dok je x razliito od 9 ini Ako je x>=2 i x

  • Zadatak 1.4.

    Postavi nf=1 Uitaj n Sve dok je n33 ini Uitaj n Kraj sve dok Za svaki i=1 do n ini Pomnoi nf s i Kraj za svaki i Ispii nfZadatak 1.5.

    Uitaj m i n Sve dok je m

  • Zadatak 1.7.

    Uitaj n Sve dok je n

  • Uitaj 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 Izraunaj m=cjelobrojni dio od sqrt(n) Postavi ind=0 Postavi i=1 Sve dok je ind=0 i im tada Ispii 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 ispii Pitagorine brojeve i1,i2 i i3 Kraj za svaki i2 Kraj za svaki i1

    Zadatak 1.11.

    Uitaj n1 i n2 Ako je n1>n2 tada Postavi n=n1 Postavi n1=n2 Postavi n2=n Kraj ako je Ako je n1 neparan Poveaj 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 */

    68

  • Postavi m=drugi korjen iz m1 Postavi i1=2 Postavi Rezultat=1 Sve dok je Rezultat=1 i i1
  • Zadatak 1.12.

    Uitaj 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 pomnoi xfakt s j Poveaj s za xp/xfakt