Professional Documents
Culture Documents
Fisher Zbirka C PDF
Fisher Zbirka C PDF
Darko Fischer
ZBIRKA ZADATAKA IZ
"C " P R O G R A M S K O G J E Z I K A
Osijek, 1997.
2
SADRŽAJ
0. Uvod 1
1. Algoritmi 7
2. Jednostavni C zadaci 20
5. Rješenja zadataka 75
3
0. UVOD
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.
4
1. ALGORITMI
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".
5
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
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.
m!
b=
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
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.
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:
Komentar rješenja:
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*b-4*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:
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
10
sortirati ne 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 j-tog 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.
n
∑ v1[ i] ⋅ v 2[ i]
sp= i =1 = 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:
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.
12
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.
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:
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
14
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.
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
16
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.
17
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.
18
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.
m!
b=
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
19
Rješenje u C-u:
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=n-n/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
20
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!)
Rješenje:
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.
22
Zadatak 2.10. Napisati C program koji će s tastature učitati prirodni broj i naći i ispisati sve proste
faktore toga broja.
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.
23
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:
Rješenje u C-u
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).
25
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 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:
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:
Kada su učitani svi podaci (kada je takmičenje završeno) program treba ispisati redoslijed svih
takmičara. Taj ispis treba imati izgled:
1 xxx xxxx.xx
2 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
1
Ra
Slika 3.1
Rb
26
vertikalnim 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.
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:
Rješenje u C-u:
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).
28
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:
Rješenje u C-u:
Komentar rješenja:
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:
MUŠKI ŽENSKI
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.
31
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:
Rješenje u C-u:
/* 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
33
i m realnih brojeva u vektor Y. Naći i ispisati vektor Z=X*Y. Koristiti algoritam množenja iz
prethodnog primjera.
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:
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
34
/* 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
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);
35
printf("\nMolim podatke za matricu u %d redaka i stupaca\n",n);
for(i=0;i<=n-1;i++)
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:
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 10-
znamenkastih 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
37
3x1 + x2 + 3x3 = 10
matrica koja opisuje sistem imat će 3 reda i 4 stupca i glasit će:
-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.
Algoritamsko rješenje:
38
/* 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
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
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-
40
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). 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.
41
4. ZADACI S FUNKCIJAMA
Primjer 4.1.
f(x)
xi+1 xi x
Slika 4.1.
42
(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:
43
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));
}
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.
44
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.
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.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):
x sin(x)/x (sin(x)/x)^x
45
Primjer 4.2.
0 x1 xi xi+1 x2 x
Slika 4.2
46
Algoritam rješenja:
Rješenje u C-u:
Komentar rješenja:
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
47
račun 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:
Funkcija Srvr:
48
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:
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
49
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.
1 1 1 1
= + +....+
Cs C1 C2 Cn
1
a impedancija Z tog serijskog spoja je Z=
ω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
Algoritam rješenja:
a. Glavni program:
51
b. Funkcija SUMR
Rješenja u C-u:
/* 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");
}
52
return 0;
}
Komentar rješenja:
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.
Napisati funkcije Dimin i Dimax (koje se koriste u printf naredbama ovog programa) a koje nalaze
najmanji odnosno najveći dijagonalni član matrice A.
53
Zadatak 4.21. Zadan je slijedeći C program:
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.
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:
54
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>
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<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
56
učitavaju sa standardne ulazne datoteke, koja se 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
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.
f(x)=sin(x)*cos(z*x)
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.
57
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.
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:
Rješenje u C-u:
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.
59
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
"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.
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...
60
Otvori ulaznu datoteku s imenom datim u parametru
Ako navedene datoteke nema tada
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:
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.
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
pomoću funkcije 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
(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.
64
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
65
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
66
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.
67
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.
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 */
68
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
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
69
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
70
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.
Zadatak 1.17.
Zadatak 1.18.
Zadatak 1.19.
Zadatak 1.20.
Zadatak 1.21.
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
73
Zadatak 1.23.
Zadatak 1.24.
Rješenje sa sortiranjem
Zadatak 1.25.
Zadatak 1.27.
Zadatak 1.28.
Zadatak 1.29.
76
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.
Zadatak 1.32.
79
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;
80
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;
81
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;
}
82
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 );
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;
84
}
}
}
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;
#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));
}
}
85
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 Str. %3d",str);
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;
86
int n1,n2,m,i,j,l,ir;
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);
Zadatak 2.15.
87
#include<stdio.h>
#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()
{
88
/* 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)! */
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)));
}
89
Zadatak 3.1.
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];
90
printf("\nRezultat: %10.4f",skal);
}
91
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.
Zadatak 3.5.
Zadatak 3.6.
Zadatak 3.7.
m1=m-1;
printf("\n Upisujte %3d realnih brojeva\n ",m);
for(i=0;i<m;i++) scanf("%f",&x[i]);
94
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.
Zadatak 3.9.
95
/* Racunanje rada iz komponenata vektora sile i puta */
#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];
Zadatak 3.10.
Zadatak 3.11.
97
Zadatak 3.12.
#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]);
}
98
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++)
99
printf("%8.2f",z[i-1][j-1]);
printf("\n");
}
}
100
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.
Zadatak 3.17.
for(i=1;i<=m;i++)
for (j=1;j<=m;j++)scanf("%f",&a[i-1][j-1]);
Zadatak 3.18.
Zadatak 3.19.
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];
}
for (p=2;p<=n;p++)
103
{
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];
}
Zadatak 3.20.
Zadatak 3.21.
105
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];
/* Ispisi rezultat */
for(i=0;i<=7;i++)
{for(j=0;j<=7;j++) printf("%10.3f",B[i][j]);
printf("\n");
}
}
106
Zadatak 3.22.
Zadatak 3.23.
/* 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;
}
108
}
}
/* 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 */
109
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 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];
}
Zadatak 3.25.
111
/* 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>
112
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;
}
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;
}
114
}
/* 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];
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");
}
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]);
115
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;
}
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;
117
printf("\nInvertiranje matrice i mnozenje s vektorom\n");
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;
}
}
119
Zadatak 4.1.
Zadatak 4.2.
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.
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);
121
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.
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;
122
}
Zadatak 4.5.
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)
123
{
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.
Zadatak 4.8.
Zadatak 4.9.
Zadatak 4.10.
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.
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.
/* 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]);
127
printf("\nSrednja vrijednost 3. reda je %8.3f",asr(A,m,n,3));
return 0;
}
Zadatak 4.13.
Zadatak 4.14.
Zadatak 4.15.
Zadatak 4.16.
Zadatak 4.17.
Zadatak 4.18.
Zadatak 4.19.
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.
130
/* 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;
}
Zadatak 4.21.
Zadatak 4.22.
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];
131
else ind=0;
}
*rx*=ind;
if(rx>0)*rx=1/(*rx);
}
Zadatak 4.23.
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>
132
#include <math.h>
float f(float x, float z)
{
return sin(x)*cos(z*x);
}
133
Zadatak 4.25.
#include <stdio.h>
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.
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");
134
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.
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;
}
135
Zadatak 4.28.
Zadatak 4.29.
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.
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;
}
139