112
Programiranje u C-u i vježbe (radni nerecenzirani materijal ) Autori: Slavica Ćosović Bajić, Goran Trutanić

PDF-Programiranje Radni Materijal

Embed Size (px)

Citation preview

Page 1: PDF-Programiranje Radni Materijal

Programiranje u C-u i vježbe

(radni nerecenzirani materijal )

Autori: Slavica Ćosović Bajić, Goran Trutanić

Page 2: PDF-Programiranje Radni Materijal

» SADRŽAJ «

OSNOVE  PROGRAMIRANJA  I  VJEŽBE............................................................. 4 1. UVOD...........................................................................................................................

5

1.1 Nastanak programskog jezika C……………………………………………………. 5 1.2 C – jezik srednje razine……………………………………………………………... 5 1.3 Primjena programskog jezika C…………………………………………………….. 5 1.4 Kompiler, interpreter………………………………………………………………...

7

2. UVOD U PROGRAMIRANJE……………………………………………………..

8

3. TIPOVI PODATAKA………………………………………………………………. 11 3.1 Osnovni tipovi podataka……………………………………………………………. 11 3.2 Dodatni tipovi podataka…………………………………………………………….. 11 3.3 Oktalne i heksadecimalne konstante………………………………………………... 11 3.4 Znakovne( String) konstante………………………………………………………... 12 3.5 Kontrolni znakovi

12

4. KONSTANTE I VARIJABLE……………………………………………………... 13 4.1 Lokalne varijable……………………………………………………………………. 14 4.2 Globalne varijable…………………………………………………………………... 15 4.3 Modifikatori…………………………………………………………………………

16

5. OPERATORI……………………………………………………………………….. 17 5.1 Operator dodjeljivanja………………………………………………………………. 17 5.2 Aritmetički operatori………………………………………………………………... 17 5.3 Kombinacija aritmetičih operatora………………………………………………….. 17 5.4 Bit operatori………………………………………………………………………… 17 5.5 Operatori uspoređivanja (relacioni)……………………………………………….... 18 5.6 Logički operatori…………………………………………………………………….

18

6. IZRAZI………………………………………………………………………………

19

7. HEADER DATOTEKE (stdio.h, conio.h, math.h, string.h)………………………..

20

8. FUNKCIJE………………………………………………………………………….. 21 8.1 main ()…………………………………………………………………………….. 22 8.2 printf ()……………………………………………………………………………. 22 8.3 scanf ()……………………………………………………………………………..

23

9. NAREDBE ZA KONTROLU TIJEKA PROGRAMA…………………………... 25 9.1 Naredba if…………………………………………………………………………… 26 9.2 Nested if (ugnježđeni if)………………………………………………………….... 27 9.3 Naredba switch……………………………………………………………………… 30 9.4 for petlja…………………………………………………………………………….. 32 9.5 while petlja………………………………………………………………………….. 33 9.6 do while petlja………………………………………………………………………. 33 9.7 Continue…………………………………………………………………………….. 34 9.8 Break………………………………………………………………………………... 34

Page 3: PDF-Programiranje Radni Materijal

1

9.9 Return………………………………………………………………………………..

34

10. POLJE (indeksirana varijabla)…………………………………………………….. 35 10.1 Jednodimenzionalno polje………………………………………………………… 35 10.2 Dvodimenzionalno polje…………………………………………………………..

36

11. VJEŽBE: OSNOVE PROGRAMIRANJA……………………………………….

37

PROGRAMIRANJE  I  VJEŽBE…………………………………………………….. 58 12. POLJE………………………………………………………………………………

59

12.1 Višedimenzionalno polje…………………………………………………………... 59 12.2 Inicijalizacija polja…………………………………………………………………

59

13. POKAZIVAČI…………………………………………………………………….. 60 13.1 Jednostruka indirekcija……………………………………………………………. 60 13.2 Višestruka indirekcija……………………………………………………………... 62 13.3 Pokazivači na polja………………………………………………………………...

62

14. STRING (polje znakova)…………………………………………………………... 63 14.1 String konstante…………………………………………………………………… 63 14.2 Strcpy ( )…………………………………………………………………………… 63 14.3 Strcat ( )……………………………………………………………………………. 63 14.4 Strlen ( )………………………………………………………………………….... 64 14.5 NULL terminator…………………………………………………………………..

64

15. FUNKCIJE………………………………………………………………………… 65 15.1 Lokalne varijable…………………………………………………………………... 66 15.2 Formalni parametri (argumenti)………….………………………………………... 66 15.3 Globalne varijable…………………………………………………………………. 66 15.4 Poziv s vrijednošću………………………………………………………………... 67 15.5 Poziv adresom……………………………………………………………………... 67 15.6 Polje argument funkcije…………………………………………………………… 68 15.7 Funkcija vraća ne cijelobrojnu vrijednost…………………………………………. 69 15.8 Funkcija tipa void……………………………………………………………….… 69 15.9 Rekurzivna funkcija……………………………………………………………….. 70 15.10 Vrijeme izvršavanja………………………………………………………………

71

16. DATOTEKE……………………………………………………………………….. 72 16.1 Otvaranje datoteke………………………………………………………………… 72 16.2 Zatvaranje datoteke……………………………………………………………….. 72 17. DINAMIČKO ALOCIRANJE MEMORIJE……………………………………. 73 17.1 calloc………………………………………………………………………………. 73 17.2 malloc……………………………………………………………………………… 73 17.3 sizeof………………………………………………………………………………. 73 17.4 free…………………………………………………………………………………

73

Page 4: PDF-Programiranje Radni Materijal

2

18. VJEŽBE: PROGRAMIRANJE…………………………………………………...

74

19. ZADACI ZA VJEŽBANJE………………………………………………………..

94

20. ZAKLJUČAK………………………………………………………………………

110

21. LITERATURA……………………………………………………………………..

111

Page 5: PDF-Programiranje Radni Materijal

3

OSNOVE PROGRAMIRANJA I VJEŽBE  

Page 6: PDF-Programiranje Radni Materijal

4

1. UVOD Gradivo predmeta Osnove programiranja obuhvaća osnove programskog jezika C, sve naredbe za upravljanje tijekom programa , te korištenje jednodimenzionalnih polja. U prvom dijelu detaljnije su opisani tijek programa, način pisanja programa, naredbe i osnovne funkcije. Iza oblika funkcije ili naredbe slijedi primjer, a nakon njega navode se zadaci iz tog područja na koje se prelazi dvostrukim klikom na mišu.U drugom dijelu Programiranje obuhvećena su: višedimenzionalna polja, pokazivači, funkcije i datoteke. Iza rješenih primjera za ilustraciju oblika naredbe navode se zadatci na koje se može direktno pristupiti dvostrukim klikanjem miša. 1.1 Nastanak programskog jezika C

Kasne 60 - te godine 20. stoljeća bile su turboletno razdoblje za razvoj kompjutorskih sistema u Bell Telephone Laboratories. Tada je Ken Thompson u razdoblju od 1969. - 1970. kreirao B programski jezik . Denis Ritchie je 1971. na osnovi programskog jezika B počeo razvoj programskog jezika C na računalima DEC PDP-11 za upotrebu na UNIX operativnim sustavima. Denis Ritchie, Alan Snyder, Steven C. Johnson, Michael Lesk i Ken Thompson razvijali su program u razdoblju od 1972. - 1977. U tom razdoblju je količina rutina rasla zahvaljujući njima i svima ostalim u Bell Laboratories. Godine 1978. Brian Kernighan i Denis Ritchie napisali su knjigu tzv. White book koja je postala definicija jezika slijedećih godina. Do tada se smatralo da je C jezik povlašteni jezik dostupan samo određenoj skupini ljudi , te da je težak za korištenje. C nije izravno prešao sa UNIX-a na DOS, već je to išlo postupno. Najprije je prešao na operacijski sustav CP/M koji je tada bio dosta popularan, no zbog premalenih 8 bitnih procesora i samo 64k RAM nije polučio uspjeh. No ubrzo uvođenjem 16 bitnih procesora i razvojem tvrtki kao Microsoft i IBM, koristi se sve više u razvoju software-a.

Početkom 1983. godine osnovan je odbor ANSI X3J11 za standardiziranje jezika, a 1988. završena je prva standardizacija jezika koje podržava i većina današnjih prevoditelja. 1.2 C – jezik srednje razine

C - je jezik srednje razine jer sadrži i kombinirane elemente visokih jezika, i funkcionalnost asemblera ( strojnih jezika ). Često se C naziva jezik za građenje jer se programer prvo kreira funkcije a nakon toga ih slaže u program. Uz vlastite funkcije koje piše programer postoji velika biblioteka C funkcija . Tako se pomoću C-a može riješiti gotovo svaki problem. Visoka razina – prema [1] u jezik je ugrađeno sve što bi programer mogao trebati za pisanje

aplikacije. Srednja razina – prema [1] ima sve prednosti jezika visoke razine a također posjeduje

funkcionalnost jezika niske razine ( strojni jezik ). C ima mogućnost direktnog korištenja bit-ova, bytova i adresa

Niska razina – prema [1] daje samo pristup strojnim instrukcijama. Prednosti u odnosu na druge programske jezike prema [1] :

vrlo mali broj narebi ; kod je prenosiv, lako se prenosi s računala na računalo (uz različit procesor,

operativni sustav, ili oboje). Najčešče je potrebno aplikaciju kompilirati s C kompilerom pisanim za novi procesor. Na taj način stvara se ušteda u vremenu i novcu ;

Page 7: PDF-Programiranje Radni Materijal

5

sve funkcije koje koristimo u programu deklariraju se u pomoćnim datotekama koje nazivamo Header datoteke i naredbom icllude priključuju se na početku programa ;

operatori za direktno upravljanje stanja BIT-ova i BYTE-ova nazivaju se Bitwise.

Prikaz 1. Visoka, srednja i niska razina jezika primjeri 1.3 Primjena programskog jezika C

Prve primjene C jezika prema [1] bile su u sistemskom programiranju. Sistemsko programiranje odnosi se na klasu programa koji pokreću ili su dio operativnog sustava računala. Sistemski programi omogućavaju računalu obavljanje brojnih korisnih zadaća. Primjeri takvih zadaća su :

Operativni sustavi Jezični prevodioci Asembleri Editori teksta Network Drivers Modem Programs Baze podataka Interpreteri

Brojni su razlozi zbog kojih se C koristi za pisanje sistemskih programa. Prvi je razlog brzina izvođenja koja gotovo jednaka brzini izvođenja strojnih jezika. Drugi razlog je da je C zanimljiv programerima zbog mogućnosti rada s bitovima , bytovima i adresama s jedne i naredbama i mogućnostima jezika visoke razine s druge strane. Zbog velike popularnosti među programerima danas je C jezik opće namjene . Nakon što se jednom familijariziramo s C – om možemo slijediti precizan tijek i logiku programa te realizacije vlastitih modula. Listinzi C programa izgledaju jasno i čitljivo. Glavni je razlog žašto se jezik tako raširio je da je zgodan za korištenje ( ˝ it is simly fun to use ˝prema [1] ). C je strukturni jezik a strukturni jezici koriste blokove. Blok je skup naredbi koje su logički povezane. Strukturni jezici dozvoljavaju različite programerske mogućnosti, podržavaju koncepciju vlastitih funkcija s lokalnim varijablama. Lokalna varijabla je varijabla kojoj je vrijednost poznata samo u bloku gdje je definirana. C podržava iterativne naredbe za ponavljanje ( petlje) while , do while i for.

VISOKA ADA FORTRAN PASCAL COBOL MODULA-2 BASIC

SREDNJA C FORTH

NISKA MACRO ASSEMBLER ASSEMBLER

Page 8: PDF-Programiranje Radni Materijal

6

1.4 Kompiler, interpreter Prema [1] pojam kompiler i interpreter određuje način kako se program izvršava (

izvodi). Bilo koji programski jezik može teoretski biti compiliran ili interpretiran. Način izvođenja programa ne definira način kako je jezik napisan. Kompileri i interpreteri su sofisticirani programi koji operiraju na našem ulaznom ili SOURCE kodu. SOURCE kod je izvorni tekst programa koji ste napisali. Kompiler – prema [1] prvo pročita program, nakon toga program prevodi u objektni kod, oblik koji računalo direktno može izvršiti. Objektni kod povezuje izvorni kod s binarnim ili strojnim. Nakon kompiliranja izvorni ( SOURCE ) kod bitan za izvođenje programa. Kompilirani programi brže se izvode od interpretiranih programa. Interpreter – prema [1] čita source program liniju po liniju i izvodi instrukcije koje ta linija sadrži . Razlikuje se vrijeme prevođenja ( compile time ) od vremena izvođenja ( run time ). Razlikujemo četiri koraka za svaki novi C program:

1. Editiranje - pisanje i pohranjivanje izvornog koda 2. Kompiliranje ( prevođenje)- ako u programu ima formalnih pogrešaka , program

prevodilac će nam na njh ukazati a nakon ispravki program valja ponovo kompilirati. Postupak se ponavlja sve dok se ne dobije korektan izvorni kod.

3. Linkanje ( povezivanje ) programa sa potrebnim bibliotekama 4. Izvođenje ( execute )

Page 9: PDF-Programiranje Radni Materijal

7

2. UVOD U PROGRAMIRANJE Prvi korak u učenju novog programskog jezika je najteži jer su sve komponente jezika

međusobno povezane.Moramo stoga početi s općom idejom što C program sadrži uključujući neke osnovne kontrolne naredbe , oblike i funkcije. Time se omogućava razumjevanje primjera programa koji se pojavljuju kao ilustracija različitih mogućnosti C jezika . Za demonstraciju elemenata jezika u ovom dijelu daje se prikaz jednostavnijihh primjera C programa koje treba pažljivo proučiti. Ovdje se ne proučavaju svi detalji, ali su dati koncepti zajednički za sve C programe. Neki od koncepata kasnije se obrađuju detaljnije.

Primjer 1. Prvi C program

/* Moj prvi C program */ #include <stdio.h> main(){ printf("Ovo je moj prvi C program."); return 0; }

Ovo je moj prvi C program.

- Linija komentara - počinje s /* … a završava */ sve što je između kompajler ignorira

- Header files - sadržideklaracije funkcija koje su potrebne u programu stdio.h – sadrži deklaracije ulazno izlaznih funkcija -main() - funkcija koju svaki C program mora sadržavati.C program

započinje pozivom funkcije main(), a završava u većini slučajeva povratkom iz funkcije main().

- { - početak bloka - printf() - ispisuje poruku na ekranu, standardna funkcija printf()

ispisuje sve što se nalazi između navodnika. - ; - kraj naredbe

- } - kraj bloka

Page 10: PDF-Programiranje Radni Materijal

8

Primjer 2. Program deklarira cjelobrojnu varijablu value, zatim joj pridruži vrijednost 1023, te je ispisuje na zaslon

/* Program #2 */

#include <stdio.h> main() { int value = 1023; printf("Ovaj program ispisuje vrijednost %d", value) ; return 0; }

Ovaj program ispisuje vrijednost 1023

-int value - varijablu value deklarira kao cjelobrojnu .

- u C jeziku sve varijable prije upotrebe treba deklarirati. - = - znak pridruživanja - printf() - sadrži dva argumenta odvojena zarezom

- prvi argument je tekst u kome se nalazi format %d za ispis cjelobrojne vrijednosti

- drugi dio je ime cjelobrojne varijable value koja će se ispisati. na mjestu formata %d

Primjer 3a. Program pretvara galone u litre, 1galon = 3.7854 ≈ 4 litre jer se koriste cijeli brojevi.

/* Program pretvara galone u litre */ #include <stdio.h> main() { int galoni, litre; printf("Unesite kolicinu galona :") ; scanf("%d", & galoni) ; litre = galoni * 4 ; printf("%d l", litre); return 0; }

Unesite kolicinu galona : 3 12 l

- int galoni,litre - dvije cjelobrojne varijable

- imena odvajamo zarezom - * - množenje - scanf() - funkcija za unos vrijednosti sa tipkovnice

- prvi argument sadrži format %d (cjelobrojna vrijednost) - drugi argument je &galoni (ime cjelobrojne varijable koja se

učitava) a predhodi joj &adresni operator. - printf("%d l", litre); - sadrži dva argumenta odvojena zarezom

- prvi dio sadrži tekst i format koji počinje sa %d a što znači da ispisuje vrijednost int varijable

- drugi dio sadrži ime int varijable koja će se ispisati

Page 11: PDF-Programiranje Radni Materijal

9

Primjer 3b. Program pretvara galone u litre uz upotrebu floating-point brojeva.

/* Program pretvara galone u litre uz upotrebu floating-point brojeva */ #include <stdio.h> main() { float galoni, litre ; printf("Unesite kolicinu galona :") ; scanf("%f", & galoni) ; litre = galoni * 3.7845 ; /* naredba pridruživanja*/ printf("To je:""%f l", litre); return 0; } Unesite kolicinu galona : 3,4 11.356200 l - float - deklaracija realanih varijanti sa pomičnom točkom. - imena odvajamo zarezom - printf() - sadrži jedan argument za ispis teksta na zaslon - %f - format u printf()i scanf() funkciji koji omogućuje upis i ispis broja sa pomičnom točkom - scanf() - funkcija za unos vrijednosti sa tipkovnice - prvi argument sadrži format %f za učiavanje float varijable - drugi argument je adresni operator & i ime varijable koja se učitava - printf()- sadrži dva argumenta odvojena zarezom - prvi dio sadrži tekst i format koji počinje sa %f a što znači da ispisuje vrijednost float varijable - drugi dio sadrži ime varijable koja će se ispisati

Page 12: PDF-Programiranje Radni Materijal

10

3. TIPOVI PODATAKA Programski jezik C sadrži više tipova podaka, a prema ANSI standardu [1] osnovni

tipovi podataka su char (znakovni), int (cjelobrojni), float i doouble (realni) pri čemu se float i double razlikuju po veličini koju podatak može poprimiti te void podatak koji ne zauzima memorijski prostor( nema vrijednosti ).

Prilagođenjem moguće je primjeniti osnovne tipove podataka tako da bolje odgovaraju potrebama.

Konstante su podaci koji se ne mijenjaju tijekom izvođenja programa, podaci na koje program ne može utjecati.

3.3 Oktalne i heksadecimalne konstante Baza 8 0, 1, 2, 3, 4, 5, 6, 7 znamenke Baza 16 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

znamenke Primjer: int hex = 0 x FF /* 255 */ x iza nule int oct = 011 /* 9 */ počinje nulom

3.1 Osnovni tipovi podataka Tip podataka: Broj bita: Vrijednosti od do

char 8 -127 do 128 int 16 -32 768 do 32 767

float 32 3.4e-38 do 3.4e38 double 64 1.7e-308 do 1.7e+308

3.2 Dodatni tipovi podataka Tip podataka: Broj bita: Vrijednosti od do

unsingned char 8 0 do 255 signed char 8 -128 do 127 unsigned int 16 0 do 65.535

signed int 16 -32 768 do 32 767 short int 16 -32 768 do 32 767

unsigned short int 8 0 do 65535 signetdshort int 8 -32 768 do 32 767

long int 32 -2147483648 do 2147483647 signed long int 32 -2147483648 do 2147483647

unsingnet long int 32 0 do 4294967295 long double 128 1.7e-308 do 1.7e+308

Page 13: PDF-Programiranje Radni Materijal

11

3.4 Znakovne( String) konstante Niz znakova. Piše između dvostrukih navodnih znakova.

Primjer 4.: #include <stdio.h>

main() {

printf("%s %s %s ", "Ovo", "je", "proba"); return 0;

}

Ovo je proba

%s – konstanta za ispis stringa 3.5 Kontrolni znakovi Kod Značenje \n novi red \b backspace \r carriage return \t tab \” dvostruki navodnik \’ jednostruki navodnik \0 nula \\ backslash \ˇ vertikalni tabulator \a alarm \N oktalna konstanta \xN heksadecimalna konstanta \b pomiče kursor u lijevo za

jedan znak \f ide na početak nove

stranice (form feed) \r ide na početak tekuće

linije (carriage return)

Page 14: PDF-Programiranje Radni Materijal

12

4. KONSTANTE I VARIJABLE Konstante su prema [4] nepromjenjive veličine , podaci koji su za vrijeme obrade konstantni. Konstante mogu biti brojčane ( dekadske, oktalne, heksadekadske ) i nebrojčane. Nebrojčane se konstante pišu između navodnika koji ne ulaze u njihovu duljinu i neće se vidjeti na ispisu. Kada se u kodu pojavljuju brojčane konstante, prevoditelj ih pohranjuje u formatu nekog od osnovni tipova S brojevima koji sadrže decimalnu točku ili slovo e (E) prevoditelj barata kao s podacima tipa double dok sve ostale brojeve tretira kao int. Za specificiranje konstanti mogu se koristiti i sufiksi – posebni znakovi za eksplicitno određivanje tipa brojčane konstante. Varijabla je imenovani dio memorije. Deklarirati varijablu [4] znači imenovati je i jednoznačno odrediti njezin tip.To je postupak imenovanja i dodjele memorijskog prostora varijabli cjelobrojnoj najmanje 16, znakovnoj 8, logičkoj 1 a eralnoj 32 bita. Znak jednakosti je operator pridruživanja. Lijeva strana ( ime varijable) je adresa a desna vrijednost je sadržaj. Djeluje tako da se desna vrijednost preslika u sadržaj na adresi lijevo pri čemu se prekriva sadržaj koji se do tada tamo nalazio.Definirati varijablu znači inicijalizirati je ( zadati joj početnu vrijednost ) pridružiti joj vrijednost ( sadržaj ). Imena varijabli nazivaju se identifikatori . Identifikator je ime varijable koje jednoznačno određuje objekt. Dozvoljeni znakovi za sastavljanje imena varijable su mala i velika slova engleske abecede, znamenke 0 do 9 i znak za podcrtavanje ( underscore ). Na početku ne smije biti broj a znak za podcrtavanje niti na početku niti na kraju. Proizvoljan je broj znakova identifikatora, međutim računalo najčešče kontrolira 31 znak ( The ANSI standard : A Summary for the C Programmer. http:// www.ericgiguere.com/articles/ansi-c-summary.html ). Memorijski prostor se varijablama dodjeljuje u skladu s deklaracijom tipa Duljina ovisi i o duljini kompjutorske riječi Tako će ¸16 bitno računalo za int brojeve trebati jednu 16 bitnu riječ, za long int i float 2 riječi ( 32 bita ), za dvostruke realne ( double ) 4 riječi ( 64 bita ) a za dvostruko dugačke realne ( long double ) trebati prostor od 5 kompjutorskih riječi ( 80 bitova ). Moramo paziti prilikom upotrebe malih i velikih slova, jer nemaju isto značenje Primjer=1 i primjer=1. Sve varijable koje se koriste moraju se deklarirati.

Inicijalizacija varijabli tip varijable_ime= konstanta ;

char ch = ‘a’ ; int prvi = 0 ;

float bla = 123.23F ;

Page 15: PDF-Programiranje Radni Materijal

13

4.1 Lokalne varijable Lokalne varijable deklariraju se unutar funkcije prilikom ulaska, a gube se kod izlaska. Poznate su unutar funkcije (bloka).

Primjer 5. #include <stdio.h> #include <conio.h>

func(); void main() { int x; x = 10; func(); printf("%d\n", x); getch(); } func() { int x; x = -199; printf("%d\n", x); return 0; }

-199 10

- <conio.h> - Header datoteka conio.h u uvom slučaju zbog funkcije

getch()

- inicijalizacija - inicijalizacija varijable x, u prvom slučaju unutar funkcije main(), a u drugom slučaju funkcije func()

-getch() - funkcija za čitanje znakova sa tipkovnice , u našem slučaju

sliku izlaznog zaslona dok ne pritisnemo neku tipku.

Page 16: PDF-Programiranje Radni Materijal

14

4. 2 Globalne varijable Globalna varijabla daje mogućnost zadržavanja vrijednosti unutar vremena izvršavanja programa. Deklarira se na početku programa, prije main() funkcije. Vrijednosti globalne varijable može se pristupiti iz bilo koje funkcije. U programu koji slijedi varijabla br je globalna i deklarirana je prije main() funkcije . Unatoč tome što br nije deklarirana u main() niti u func1() obje funkcije mogu je koristiti. Primjer 6. #include <stdio.h> int br; func1(); func2(); void main() { int i; br=10; for (i=0; i<10; i++) func1(); } func1() { printf("broj:%d ", br); func2(); return 0; } func2() { int br; return 0; }

broj:10 broj:10 broj:10 broj:10 broj:10 broj:10 broj:10 broj:10 broj:10 broj:10

- int br - inicijalizacija globalne varijable koja vrijedi u funkciji main(), func1() i func2()

- int i - lokalna varijabla Ako globalna i lokalna varijabla imaju isto ime tada se unutar funkcije gdje je lokalna varijabla deklarirana pojavljuje lokalno, a ne utječe na globalnu varijablu.

Page 17: PDF-Programiranje Radni Materijal

15

4.3 Modifikatori Primjer 7.: Razlika između signed i unsigned #include <stdio.h> void main() { int i; /* signed integer */ unsigned int j; /* unsigned integer */ j = 60000; i = j; printf("%d %u", i, j); }

-5536 60000

- int i - signed integer - unsigned int - unsigned integer

Varijabla tipa char može se koristiti na mjestu int kao u primjeru 7a za kontrolnu varijablu petlje koja ispisuje slova abecede na zaslon u obrnutom redoslijedu. ASCII ( američki standardni kod za razmjenu informacija) je kod za prikazivanje engleskih znakova u obliku brojeva.Svakom je znaku pridružen broj od 0 do 127. Primjer 7a..For petlja za ispis slova abecede na zaslon u obrnutom redoslijedu. (A je zapisano u računalu kao broj a vrijednosti rastu u smjeru A do Z. #include <stdio.h> void main() { char slovo; for(slovo='Z'; slovo>='A'; slovo--) printf("%c", slovo); }

ZYXWVUTSRQPONMLKJIHGFEDCBA

Page 18: PDF-Programiranje Radni Materijal

16

5. OPERATORI Operatori su [4] su znakovi koji određuju neku akciju Brojni operatori omogućavaju

rukovanje brojevima ili tekstom.Aritmetički operatori omogućavaju izvođenje aritmetičkih operacija. Logički opeatori omogućavaju ispitivanje točnosti / netočnosti nekog izraza ili tvrdnje a relacioni se operatori upotrebljavaju za uspoređivanje jedne vrijednosti s drugom. Operator je znak ili riječ koja određuje vrstu akcije. Akcija je postupak koji želimo izvršti. Operand je podatak koji sudjeluje u akciji a izraz je sažeta uputa računalu, odnosno prikaz akcije koju želimo izvršiti pomoću operanada.

5.1 Operator dodjeljivanja = dodjeljivanje

5.2 Aritmetički operatori - oduzimanje + zbrajanje * množenje / dijeljenje

% Modul ( ostatak int dijeljenja ) -- dekrament ++ inkrement

5.3 Kombinacija aritmetičih operatora kratica ekvivalent

+= x + = 2 ; x = x + 2 ; -= x - = 2 ; x = x – 2 ; *= x * = 2 ; x = x * 2 ; /= x / = 2 ; x = x / 2 ;

%= x % = 2 ; x = x % 2 ; -- x + = 2 ; x = x + 2 ;

5.4 Bit operatori

& I | ili ^ ekskluzivni ili ~ komplement

<< shift lijevo >> shift desno

Page 19: PDF-Programiranje Radni Materijal

17

5.5 Operatori uspoređivanja( relacioni ) > veće od

>= veće ili jednako < manje od

<= manje ili jednako == jednako != različito

5.6 Logički operatori

&& konjukcija (AND) || disjunkcija (OR) ! negacija (NOT)

Page 20: PDF-Programiranje Radni Materijal

18

6. IZRAZI Izraz je sažeta uputa računalu, odnosno prikaz akcije koju želimo izvršiti pomoću

operanada. Konstante, varijable, operateri i zagrade čine izraz.

Konverzija na isti tip prema gore, ovisno o najvišem operateru char ch; int i; float f; double d; result = ( ch / i ) + ( f * d ) – ( f + i ) ; ↓ ↓ ↓ ↓ ↓ ↓ int double double ↓ ↓

↓ double ↓ ↓ ↓ double

Cast operatori Određuju tip izraza, unarni operator.

( type ) izraz char int float double

Cast operator float u bloku koji slijedi osigurava ispis decimala. { int i ; for ( i = 1 ; i <= 100 ; ++i ) printf ("%d / 2 je %f / 2 \ n ", i , ( float ) i / 2); }

Razmak i zagrade

Povećava se čitljivost izraza. x = 10 / y * ( 127 / x );

x = ( y / 3 ) – (( 34 * temp ) & 127 );

Dodatne zagrade ne izazivaju pogreške i ne usporavaju izvršavanje izraza.

Page 21: PDF-Programiranje Radni Materijal

19

7. HEADER DATOTEKE

stdio.h Sadrži deklaracije ulazno izlaznih funkcija.

#include <stdio.h>

printf() Ispis znakova na ekranu scanf() Unos znakova sa tipkovnice

conio.h

Sadrži deklaracije funkcija za brisanje zaslona te unos znaka sa zaslona. #include <conio.h>

clrscr() Briše ekran getch() Unos znaka sa tipkovnice

math.h

Sadrži deklaracije matematičkih funkcija. #include <math.h>

sqrt(x) x pox(x,y) yx fabs(x) apsolutna vrijednost exp(x) xe

sin(x) cos(x) tan(x) log(x) log10(x) asin(x) acos(x) atag(x) sinh(x) cosh(x) tanh(x) ceil(x)

string.h

Sadrži deklaracije znakovnih funkcija. #include <string.h>

toupper() Pretvara mala slova u velika tolower() Pretvara velika slova u mala.

Page 22: PDF-Programiranje Radni Materijal

20

8. FUNKCIJE C program je skup jedne ili više funkcija. Za pisanje programa potrebno je prvo

napisati funkcje a nakon toga ih treba složiti zajedno. Funkcija u C-u [ 4 ] je podprogram tj. logički samostalan dio programa koji predstavlja djelomično rješenje problema. Funkcija može ali ne mora imati parametre. Parametri su vrijednosti koje se proslijeđuju funkciji iz okoline, čime joj se omogućava da prilikom svakog poziva, pomoću istih naredbi radi s različitim vrijednostima.Parametri mogu biti stvarni ( argumenti ) i formalni. Argument je vrijednost koja se funkciji proslijeđuje prilikom poziva . Ukoliko se radi o vrijednosti koju funkcija vraća okoliniiz koje je pozvana ( izlaz ) argument nazivamo rezultatom funkcije. Formalni parametar je slobodna varijabla ( za vrijeme izvođenja funkcije nalazi se na rezervnoj memorijskoj lokaciji ) kojoj se u trenutku poziva pridružuje vrijednost argumenta.

Opći oblik fukcije

funkcija_ime ( lista parametara ) { ... tijelo funkcije }

Svaka funkcija ima : - Ime koje se koristi za poziv, daje se proizvoljno, uvjet da nije rezervirano u jeziku (main() i naredbe)

- Iza funkcije slijedi zagrada da bi se funkcija razlikovala od varijable.Ukoliko funkcija ne treba parametre tada se lista parametara ostavlja prazna ali se moraju staviti zagrade

- parametari se dijele na stvarne( argumente ) i fomalne koji se uvijek pojavljuju u paru i istog su tipa.Ukoliko ih ima više redoslijed se mora podudarati.

{ - Početak funkcije - Tijelo funkcije – naredbe između lijeve i desne vitice - sadrži naredbe

koje definiraju rad funkcije } - Kraj funkcije i povrat na pozivnu proceduru

Funkcija može ali i ne mora vraćati podatke na pozivnu rutinu, ukoliko ne vraća podatke

mora se deklarirati kao tip void.

Page 23: PDF-Programiranje Radni Materijal

21

8.2 printf() Opći oblik:

printf(“kontrolni string ili polje znakova”,argument )

Kontrolni string sadrži znakove ( tekst ) koji se ispisuju na zaslonu ili naredbe formata . Formati i argumenti pridružuju se s lijeva na desno. Primjer 8a. #include <stdio.h> void main() { printf(“Ovo je string %d”, 100); }

Ovo je string 100

Primjer 8b. #include <stdio.h> void main() { printf(“Ovo je malo slovo %c, ovo je veliko slovo %c .”, ‘a’, ‘A’); } Ovo je malo slovo a, ovo je veliko slovo A.

8.1 main() Funkcija main() je glavna funkcija i ona je satavni dio jezika. Ako je ispred riječ void funkcija ne vraća vrijednost .Za slučaj kada piše int main() funkcija vraća int a int vraća i ako piše samo main(). U tom slučaju u tijelu funkcije mora pisati npr.naredba return 0 . Opći oblik

void main( ) { ... tijelo funkcije } ili int main( ) { ... tijelo funkcije return 0; } ili main( ) { ... tijelo funkcije return 0; }

Page 24: PDF-Programiranje Radni Materijal

22

Primjer 8c. #include <stdio.h> void main() { printf(“Ovo je malo slovo %c, ovo je veliko slovo %c .”, ‘a’, ‘A’); } Ovo je malo slovo a, ovo je veliko slovo A. Postoji mogućnost ispisa u novi red, na novu stranicu, a za to se koristi posebni kontrolni znak.

Primjer 8d. Kako uz pomoć \n preći u drugi red

#include <stdio.h> void main() { printf("jedan\n"); printf("dva\n"); printf("tri"); printf("cetri"); }

jedan dva tri cetri

Dvostrukim klikom na pojedini zadatak ide se direktno na primjer ( za ilustraciju primjene objašnjenih naredbi )

8.3 scanf() Opći oblik:

scanf(“”,argument list);

Scanf() je ulazna funkcija za učitavanje vrijednosti varijable. U prvi argument upisuje se format ovisno od tipa podatka koji se učitava prema tabeli formata u nastavku.

Primjer 9. #include <stdio.h> void main() { char poruka[20]; printf(" Unesite poruku \n"); scanf("%s",poruka); printf(" \nVasa poruka je %s ",poruka); }

Unesite poruku programiranje Vasa poruka je programiranje

Page 25: PDF-Programiranje Radni Materijal

23

Formati za učitavanje i ispisivanje %c znakovi %d cjelobrojne vrijednosti %i cjelobrojne vriednosti %e eksponencijalni prikaz %E eksponencijalniprikaz %f realne vrijednosti %g realne vrijednosti %G realne vrijednosti %o oktalne vrijednosti %s stringovi %u cjelobrojne vrijednosti(unsigned) %x heksadecimalne vrijednosti (mala slova) %X heksadecimalne vrijednosti (velika slova) %p prikaz pointera %% ispis znaka %

Page 26: PDF-Programiranje Radni Materijal

24

9. NAREDBE ZA KONTROLU TIJEKA PROGRAMA

Selekcije

if Uvijet je bilo koji izraz koji sadrži kombinaciju varijabli ili konstanti, ako je istinit izvrši se naredba 1, a ako nije istinit naredba 2.

switch Testira varijablu i niz integer ili character konstanti. Ako niti jedan nije ispunjen izvršava se default.

Iteracije

for

Petlja se izvodi dok je uvjet istinit, kad uvjet postane neistinit izvršava se naredba koja slijedi.

while

Nareba ili blok naredbi izvoditi će se dok je logički uvijet istinit.

do while

Uvjet se testira na kraju petlje pa će se naredba izvesti barem jedanput.

Skoka

break

Način vraćanja vrijednosti iz funkcije. Bilo koja vrijednost varijable unutar zagrada ili vrijednost izraza biti će vraćen na početnu funkciju.

continue

Način vraćanja vrijednosti iz funkcije. Bilo koja vrijednost varijable unutar zagrada ili vrijednost izraza biti će vraćen na početnu funkciju.

return

Upotrebom returna prenose se podaci iz aktivne funkcije u pozivajuću , a ujedno se i završava aktivna funkcija.

Page 27: PDF-Programiranje Radni Materijal

25

9.1 Naredba if  Opći oblik:

if ( uvjet ) naredba1; else naredba2;

Uvijet je bilo koji izraz koji sadrži kombinaciju varijabli ili konstanti, ako je istinit izvrši se naredba 1, a ako nije istinit naredba 2. if bolk if ( uvjet ) { blok 1 } else { blok 2 } Primjer 10. Program čita dva različita broja te ih uspoređuje. #include <stdio.h> void main() { int a, b; printf(" Unesite dva razlicita broja 1.,2.\n "); scanf("%d ,%d", &a, &b); if (a>b) printf("%d\n Prvi broj je veci" ); else printf("\n Drugi broj je veci"); } Unesite dva razlicita broja 1.,2. 3,5 Drugi broj je veci - if - početak if naredbe

- a>b - uvijet, ako je a>b izvodi se naredba 1, a ako je a<b naredba 2 - naredba 1 - izvodi se ako je uvijet istinit - naredba 2 - izvodi se ako uvijet nije ispunjen

Page 28: PDF-Programiranje Radni Materijal

26

9. 2 Nested if (ugnježđeni if) Opći oblik

if ( i ) { if ( j ) naredba 1; if ( k ) naredba 2; /* ovaj if */ else naredba 3; /* pripada ovom else */ } else naredba 4; /* pridružena je if ( i ) */

Primjer 11. Magični broj #include <stdio.h> #include <stdlib.h> void main() {

int magicni, pokusaj; magicni=rand(); /* nasumice odabere broj */ printf(" Vas pokusaj: "); scanf("%d", &pokusaj ); if (pokusaj==magicni)

{ printf(" **tocno** "); printf("\n %d Magicni broj je\n", magicni);

} else{

printf(" ...zao mi je krivo..."); if (pokusaj>magicni) printf("\n Vas pokusaj je prevelik.\n"); else printf("\n Vas pokusaj je premalen. \n"); }

} Vas pokusaj: 4 ...zao mi je krivo... Vas pokusaj je premalen.

- <stdlib.h> - Header datoteka iz koje u ovom slučaju koristimo rand(). - magicni=rand() - varijabli magični pridružujemo nasumice generiran broj. - if - početak naredbe if. - (pokusaj==magicni) - početni uvjet. - prvi blok naredbi - izvršava se ako je početni uvijet ispunjen. - drugi blok naredbi - izvršava se ako pčetni uvijet nije ispunjen. - ugnježđeni if - početak nove if naredbe unutar drugog bloka naredbi prve

if nardbe. - (pokusaj>magicni) - uvijet ugnježđene if naredbe. - prva naredba - izvršava se ako je uvjet ugnježđene if naredbe ispunjen. - druga naredba - izvršava se ako uvjet ugnježđene if naredbe nije ispunjen.

Page 29: PDF-Programiranje Radni Materijal

27

9.3 Naredba switch  Opći oblik:

switch ( variable ) { case konstanta 1 : blok naredbi; break; case konstanta 2 : blok naredbi; break; … default : blok naredbi; }

Testira varijablu i niz integer ili character konstanti. Ako niti jedan nije ispunjen izvršava se default. - switch za razliku od if testira samo jednakost - u istoj switch naredbi ne može biti dva case-a s istom vrijenosti - switch je brži od niza if-ova - dijelovi naredbi pridruženi svakom case-u nisu blokovi Primjer 12. #include <stdio.h> void main() { int i; for(i=0; i<5; i++){ switch(i) { case 0: printf(" 1\n"); break; case 1 : printf(" 2\n"); case 2 : printf(" 3\n"); case 3 : printf(" 4\n"); case 4 : printf(" 5\n"); } printf("\n"); } }

1 2 3 4 5 3 4 5 4 5 5

- switch(i) - početak switch naredbe, i varijabla će biti uvijet - case konstanta 1 - prvi uvijet ako je ispunjen izvršava se naredba iza njega - break - nakon što se izvrši naredba vraća na switch - case konstanta 2 - slijedeći uvjet ako je ispunjen izvršava se naredba ia, pošto

nema break naredbe izvržiti će sei naredbe iza ostalih case do povrata na switch();

Page 30: PDF-Programiranje Radni Materijal

28

Primjer 12a. #include <stdio.h> void main() { int i; clrscr(); printf("Unesite broj 2 za parne i 5 za neparne\n"); scanf("%d",&i); switch(i) { case 1 : break; case 2 :printf("parni"); break; case 5 : printf("neparni"); } } Unesite broj 2 za parne i 5 za neparne 5 neparni Ne moraju sve case konstante biti ispunjene, možemo ispuniti samo one koje su nam potrebne.

Primjer 12b. Višestruki switch

#include <stdio.h> void main() { int a,b; printf("0 ili 1\n"); scanf("%d",&a); switch(a) { case 0 :printf("\n%d",a); break; case 1 : printf("\n1 ili 2\n"); scanf("%d",&b); switch(b){ case 1 :printf("\n%d",b); break; case 2 :printf("\n%d,%d",a,b); } } }

0 ili 1 1 1 ili 2 2 1,2

Kao blok naredbi unutar prvog switch-a može se dodati još switch naredbi sa drugim uvjetima.

Page 31: PDF-Programiranje Radni Materijal

29

9.4 for petlja  Opći oblik:

for ( inicijalizacija; uvjet; increment ) naredba;

Petlja se vrti sve dok je uvjet istina, kad uvjet postane laž izvršava se naredba koja sljedi Inicijalizacija – naredba pridruživanja, postavlja vrijednost kontrolne varijable. Uvjet – određuje kad će se izaći iz petlje. Increment – definia kako se kontrolna varijabla mjenja pri svakom ponavljanju petlje. Primjer 13. Ispis brojeva od 100 do –95 s dekrementom 5. #include <stdio.h> void main() { int i; for (i=100 ; i>-100 ; i=i-5 ) printf("%d" , i); } 100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25 20 15 10 5 0 -5 -10 -15 -20 -25 -30 -35 -40 -45 -50 -55 -60 -65 -70 -75 -80 -85 -90 -95

- for - početak for petlje - i=100 - inicializacija varijable i - uvijet - dok je uvijet ispunjen for petlja će izvršavati naredbu. - korak - za koliko će se u svakom prolazu kroz petlju u ovom primjeru

umanjiti varijabla i - naredba - izvršava se kada je uvijet ispunjen

for bolk

for ( inicijalizacija; uvjet; korak ) { blok naredbi }

Primjer 13a. Program ispisuje vrijednosti drugog korijena brojeva od 1 do 100. #include <stdio.h> #include <math.h> void main() { int broj; double korijen; for (broj=1 ; broj<100 ; broj++ ){ korijen = sqrt((double)broj) ; printf("%d %f \n", broj, korijen) ; } }

1 1.000000 2 1.414214 3 1.732051 4 2.000000 5 2.236068 .... 95 9.746794 96 9.797959 97 9.848858 98 9.899495 99 9.949874

- math.h - Header datoteka koja sdrži matematičke funkcije u ovom slučaju drugi korijen sqrt

- for - početak for petlje - broj=1 - inicijalizacija varijable broj - broj<100 - petlja vrti dok je varijabal broj manja od 100 - broj++ - korak , inkrement varijable broj za 1 - blok naredbi - naredbe koje se izvršavaju dok je uvjet u petlji istinit.

Page 32: PDF-Programiranje Radni Materijal

30

Primjer 13c. #include <stdio.h> main() { int x, y; x = 10; for(y=10; y!=x; ++x) printf("%d", y); /* printf naredba se neće izvršiti */ }

Pošto uvijet nije ispunjen naredba unutar for petlje neće se izvršiti. Primjer 13d. Nedostaje increment #include <stdio.h> void main() { int x; for(x=0; x!=123; ){ printf(" Unesite broj: "); scanf("%d", &x); } }

Unesite broj: 2 Unesite broj: 3 Unesite broj: 4 Unesite broj: 3 Unesite broj: 3 Unesite broj: 123

Primjer 13e. Nedostaje inicijalizacija #include <stdio.h> void main() { x = 0; for ( ; x < 10 ; ) { printf ( “%d”, x ); ++ x; } Inicijalizacija je provedena prije for petlje. Primjer 13f. Beskonačna petlja #include <stdio.h> void main() { for ( ; ; ) { … } Primjer 13g. Petlja za vremensko kašnjenje #include <stdio.h> main() {

for ( x = 0; x < 1000; x ++ ); }

Page 33: PDF-Programiranje Radni Materijal

31

9.5 while petlja  Opći oblik:

while (logički uvjet) naredba ;

Broj izvršavanja while petlje određen je logičkim uvijetom .Naredba ili blok naredbi izvršavati će se dok je logički uvjet istinit. Logički uvjet se ispituje prilikom ulaska u petlju te na početku svakog prolaza kroz petlju.

Primjer 14. Ispis zankova. #include <stdio.h> void main() {

char ch; ch = 1; while(ch!=0){ printf("%c", ch); ch++; }

} ����� ¤����¶§�������- !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^ _`abcdefghijklmnopqrstuvwxyz{|}~�ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘę źČş« »___¦¦ÁÂĚŞ¦¦++Żż++--+-+Ăă++--¦-+¤đĐĎËďŇÍÎě++__ŢŮ_ÓßÔŃńňŠšŔÚŕŰýÝ_´-˝˛ˇ˘§÷¸°¨·űŘř_

- while - pošetak funkcije i postavljanje uvijeta, dok je uvijet ispravan izvršavaju se naredbe u bloku.

- blok naredbi - izvršavaju se dok je uvijet ispravan

Page 34: PDF-Programiranje Radni Materijal

32

9.6 do while petlja Opći oblik:

do { naredbe; } while (uvjet);

Slična je while petlji s razlikom što se logički uvijet ispituje na kraju petlje što znači da će naredba ili blok naredbi biti izvršeni barem najmanje jednom. Primjer 15. #include <stdio.h> void main() { int broj; do { scanf("%d", &broj); } while(broj!=100); }

1 2 99 100

- do - početak petlje - blok naredbi - izvršavju se naredbe i nakon toga se provjerava uvijet, ako

je uvijet nezadovoljava vraća se na početak dok se uvijet ne zadovolji

- uvijet - dok se uvijet ne ispuni ne izlazi iz petlje

9.7 continue  Opći oblik:

continue

Način vraćanja vrijednosti iz funkcije. Bilo koja vrijednost varijable unutar zagrada ili vrijednost izraza biti će vraćen na početnu funkciju.

Primjer 16.

#include <stdio.h> void main()

{ int x; for(x=0; x<=100; x++){ if(x%2)continue; printf("%d", x); } }

0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100

Page 35: PDF-Programiranje Radni Materijal

33

9.8 Break  Opći oblik:

break

Zaustavlja petlju u kojoj se nalazi. Upotrebom u naredbi switch djeluje samo na naredbu switch, ali ne i na petlju u kojoj se nalazi.

Primjer 17. #include <stdio.h> void main() { int t, brojac; for(t=0; t<5; t++){ brojac = 1; for( ; ; ){ printf("%d", brojac); brojac++; if(brojac==10)break; } } }

12345678912345678912345678 9123456789123456789

- break - program izlazi iz for petlje u kojoj i ide na prvu for

petlju.

9.9 Return  Opći oblik:

return (x);

Upotrebom returna prenose se podaci iz aktivne funkcije u pozivajuću, a ujedno se i završava aktivna funkcija. Primjer 17. #include <stdio.h> main() { int t; for (t = 0; t<10;t ++){ printf(" R"); return; } }

R

Page 36: PDF-Programiranje Radni Materijal

34

10. POLJE (indeksirana varijabla ) Polje je [4] složena jedno ili višedimenzionalna podatkovna struktura sastavljena od

određenog broja istovrsnih elemenata-članova. Polja pripadaju statičkim podacima što znači da im se odmah dodjeljuje kompletan memorijski prostor.

Jednodimenzionalno polje možemo zamisliti kao linearni niz podataka isto tipa i identifikatora. U pravilu indeks je redni broj elementa koji ga jednoznačno određuje. Indeks prvog člana je nula. Naime računalo će ostale članove koje dohvaćamo kombinacijom identifikatora i pripadajućeg indeksa, pronalaziti tako da početnoj adresi doda onoliko memorijskih lokacija, koliko je član udaljen od početka polja. Korištenje identifikatora bez indeksa ima efekt pokazivača – njime se dohvaća početna tkzv. nulta dresa polja. Definirati polje znači pridružiti članovima početni sadržaj.

10.1 Jednodimenzionalno polje Opći oblik:

tip var_ime[vel];

Tip podatka slijedi identifikator nakon toga u uglatoj zagradi navodi se maksimalan broj članova polja. U naredbi inicijalizacije može se izostaviti jer će se dimenzija polja odrediti po broju vrijednosti pisanih u vitičastoj zagradi. int i [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ili int i [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; i[0] = 1 i[9] = 10 Primjer 18 a. Upisuje u polje x vrijednosti 0 do 9

t x[t] 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8

#include <stdio.h> main ( )

{ int x[10]; int t; for (t = 0; t<10;t ++) x[t] = t; }

9 9

- int x[10]; - inicijalizacija jednodomenzionalnog polja od 10 članova - popunjavanje polja - pomoću for petlje popunjavamo dio po dio polja

Page 37: PDF-Programiranje Radni Materijal

35

10.2 Dvodimenzionalno polje Opći oblik:

tip var_ime [red][stup];

Prema [4] dvodimenzionalno polje zamišljamo kao mrežu redaka i stupaca. Članovi dvodimenzionalnog polja dohvaćaju se pomoću dvaju indeksa prvi nadređen je indeks retka , a drugi podređen je indeks stupca. Prilikom deklaracije indeksi se navode iza identifikatora svaki u svojoj zagradi. Ukoliko se polju žele pridružiti početne vrijednosti ( inicijalizacija ) tada se to izvodi pomoću vitičaste zagrade s desne strane operatora pridruživanja. U memoriji se dvodimenzionalnom polju dodjeljuje prostor kao da je jednodimenzionalno. Na primjer polju num[3][4] biti će dodjeljen memorijski prostor kao za jednodimenzionalno polje s 12 elemenata. Redoslijed zapisa je po redcima. Primjer 18b: Upisuje brojeve 1 do 12 u polje num [3][4] #include <stdio.h> void main( ) { int t,i,broj[3][4]; for (t = 0; t<3; ++ t) for (i = 0; i<4; ++ i) broj [t][i] = (t*4) + i + 1; }

t i

broj 0 1 2 3 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12

Page 38: PDF-Programiranje Radni Materijal

36

11. VJEŽBE: OSNOVE PROGRAMIRANJA

Zadatak 1.1 Unesi naziv i površinu neke zemlje sa tipkovnice, a zatim ih ispiši na ekranu. #include <stdio.h> void main(){ char zemlja[20]; float povrsina; printf("\nUnesi naziv zemlje->"); scanf("%s",zemlja); printf("\nUnesi povrsinu zemlje->"); scanf("%f",&povrsina); printf("\n%s ima povrsinu %7.0f kvadratnih kilometara.", zemlja,povrsina); return; } Unesi naziv zemlje->Hrvatska Unesi povrsinu zemlje->56610 Hrvatska ima povrsinu 56610 kvadratnih kilometara.

Zadatak 1.2

Unesi decimalni broj u slobodnom formatu sa čvrstim zarezom (%f) i zatim ga ispiši ga u definiranom formatu sa čvrstim zarezom (npr. %6.2f) te u eksponencijanom obliku (%e). Mijenjajući format ispisa podatka provjerite kako postavke formata utječu na oblik ispisa. #include <stdio.h> #include <math.h> #include <conio.h> int main(){ float broj; printf("Unesi decimalni broj u formatu sa čvrstim zarezom ->"); scanf("%f",&broj); printf("\nDec. broj %f u formatu sa čvrstim zarezom ispisuje se kao =%6.2f,"// "\n a u eksp. obliku se ispisuje kao =%.3e!",broj,broj,broj); getch(); return 0; } Unesi decimalni broj u formatu sa Ŕvrstim zarezom ->24.56 Dec. broj 24.559999 u formatu sa Ŕvrstim zarezom ispisuje se kao = 24.56, a u eksp. obliku se ispisuje kao =2.456e+01!

Page 39: PDF-Programiranje Radni Materijal

37

Zadatak 1.3 Unesi katete pravokutnog trokuta i izračunaj hipotenuzu, te kutove trokuta u stupnjevima. #include <conio.h> #include <stdio.h> #include <math.h> int main(){ float a,b,c,alfa,beta; printf("Unesi katete pravokutnog trokuta a,b="); scanf("%f,%f",&a,&b);

c=sqrt(a*a+b*b); alfa=asin(a/c); beta=asin(b/c); printf("\na=%5.1f b=%5.1f c=%5.1f",a,b,c); printf("\n%20s alfa=%4.1f beta=%4.1f stupnjeva.","Kutevi u trokutu su:", alfa* 180/3.14, beta*180/3.14); printf("\nProvjera, alfa+beta=%4.1f stupnjeva.",(alfa+beta)*180/3.14); getch(); return 0; } Unesi katete pravokutnog trokuta a,b=3,4 a= 3.0 b= 4.0 c= 5.0 Kutevi u trokutu su: alfa=36.9 beta=53.1 stupnjeva. Provjera, alfa+beta=90.0 stupnjeva.

Zadatak 1.4

Izračunaj vrijednosti polinoma x^3+2x^2+3x+4 pomoću funkcije POW. Vrijednost x unesi sa tipkovnice. #include <conio.h> #include <stdio.h> #include <math.h> int main() { double x,y; printf("Unesi vrijednost x="); scanf("%lf",&x); y=pow(x,3)+2*pow(x,2)+3*x+4; printf("\nZa x=%5.1f, polinom x^3+2x^2+3x+4 ima vrijednost %5.1f !",x,y); getch(); return 0; } Unesi vrijednost x=4 Za x= 4.0, polinom x^3+2x^2+3x+4 ima vrijednost 112.0 !

Page 40: PDF-Programiranje Radni Materijal

38

Zadatak 1.5 Napravi program koji računa površinu kružnog isječka. Polumjer kružnice i kut u stupnjevima unesite sa tipkovnice odvojene razmakom. #include <conio.h> #include <stdio.h> #include <math.h> int main(){ float r,alfa,povrsina; printf("Unesi vrijednost polumjera i kut u stupnjevima ="); scanf("%f %f",&r,&alfa); povrsina=r*r*3.14 *alfa/360; printf("\nZa r=%5.1f i alfa=%5.1f, %25s=%10.2e!",r,alfa,"površina kružnog isječka je",povrsina); getch(); return 0; } Unesi vrijednost polumjera i kut u stupnjevima =10 40 Za r= 10.0 i alfa= 40.0, povrsina kruznog isjecka je= 3.49e+01!

Zadatak 1.6

Napravi program koji računa kapacitet pločastog kondenzatora. Radi jednostavnosti razmak elektroda unesi u metrima, a površinu ploča u kvadratnim metrima. Kapacitet izrazi u mikrofaradima. #include <stdio.h> #include <math.h> #include <conio.h> int main(){ double epsilon0=8.854e-12; float epsilonr=1,razmak,povrsina,kapacitet; printf("\nDiel. konst. vakuuma je%10.3e!",epsilon0); printf("\nUnesi relativnu dielektričnu konstantu ="); scanf("%f",&epsilonr); printf("\nUnesi razmak i povrsinu ploča odvojeno zarezom ="); scanf("%f,%f",&razmak,&povrsina); kapacitet=epsilon0*epsilonr*povrsina/razmak*1e+06; printf("\nKapacitet kondezatora je%10.3e mikrofarada!",kapacitet); getch(); return 0; } Diel. konst. vakuuma je 8.854e-12! Unesi relativnu dielektriŔnu konstantu =6 Unesi razmak i povrsinu ploŔa odvojeno zarezom =0.002,0.09 Kapacitet kondezatora je 2.391e-03 mikrofarada!

Page 41: PDF-Programiranje Radni Materijal

39

Zadatak 2.1 Z 2_1. Izračunajte zbroj prvih n prirodnih brojeva. n zadajte sa tipkovnice. U zadatku ne treba provjeravati da li trenutni zbroj prelazi raspon prikaza odabrane vrste broja. Pokušajte odgovoriti kakav bi bio rezultat da se to dogodi. #include <stdio.h> #include <conio.h> int main(){ int n,i,suma=0; printf("\nUnesi prirodni broj n="); scanf("%d",&n); for (i=1;i<=n;i++) suma+=i; printf("\nSuma prvih %4d prirodnih brojeva je %7d",n,suma); getch(); return 0; } Unesi prirodni broj n=4 Suma prvih 4 prirodnih brojeva je 10

Zadatak 2.2

Izračunajte produkt prvih n prirodnih brojeva (n!). n zadajte sa tipkovnice. Pokušajte odgovoriti zašto se ovisno o veličini odabranog broja za rezultat dobije 0 ili negativan broj. #include <stdio.h> #include <conio.h> int main(){ int n,i,faktorijel=1; printf("\nUnesi prirodni broj n="); scanf("%d",&n); for (i=1;i<=n;i++) faktorijel*=i; printf("\nProdukt prvih %4d prirodnih brojeva je %7d",n,faktorijel); getch(); return 0; } Unesi prirodni broj n=3 Produkt prvih 3 prirodnih brojeva je 6

Page 42: PDF-Programiranje Radni Materijal

40

Zadatak 2.3 Ispišite članove geometrijskog niza i izračunajte njegovu sumu. Prvi član niza, njegov kvocijent i broj članova niza zadajte sa tipkovnice. #include <stdio.h> #include <conio.h> int main(){ float prvi,clan,q,suma; int i,broj; printf("\nUnesi prvi član niza i kvocijent="); scanf("%f,%f",&prvi,&q); printf("\nUnesi broj članova niza="); scanf("%d",&broj); suma=prvi; clan=prvi; printf("\n\nNiz je: %5.2f,",prvi); for (i=1;i<broj;i++){ clan*=q; suma+=clan; printf(" %5.2f,",clan); } printf("\nKvocijent niza je %5.2f",q); printf("\nSuma prvih %3d članova niza je %7.2f",broj,suma); getch(); } Unesi prvi član niza i kvocijent=2,3 Unesi broj članova niza=3 Niz je: 2.00, 6.00, 18.00, Kvocijent niza je 3.00 Suma prvih 3 članova niza je 26.00

Page 43: PDF-Programiranje Radni Materijal

41

Zadatak 2.4 Unesite tekst sa tipkovnice (do 80 znakova)malim slovima. Unešeni tekst ispišite tako da ispisujete svako treće slovo teksta velikim slovima. #include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> int main(){ char tekst[80]; int i,duljina; printf("\nUnesite tekst malim slovima ="); gets(tekst); duljina=strlen(tekst); printf("\nDuljina teksta je %2d slova",duljina); getch(); printf("\nTekst sa ispisanim svakim 3. slovom velikim je: "); for (i=0;i<duljina;i=i+3) printf("%c",toupper(tekst[i])); getch(); return 0; } Unesite tekst malim slovima =abcdefghijklmnoprstuvz Duljina teksta je 22 slova Tekst sa ispisanim svakim 3. slovom velikim je: ADGJMPTZ

Zadatak 2.5

Izračunajte vrijednosti funkcije exp. Vrijednosti argumenta neka su cijeli brojevi u intervalu. [-10,10]. #include <stdio.h> #include <conio.h> #include <math.h> int main(){ int i; for (i=-10;i<=10;i++) printf("\nZa x=%3d exp(x)=%10.2e. ",i,exp(i)); getch(); return 0; } Za x=-10 exp(x)= 4.5e-05. Za x= -9 exp(x)= 1.2e-04. Za x= -8 exp(x)= 3.4e-04. Za x= -7 exp(x)= 9.1e-04. .... Za x= 8 exp(x)= 3.0e+03. Za x= 9 exp(x)= 8.1e+03. Za x= 10 exp(x)= 2.2e+04.

Page 44: PDF-Programiranje Radni Materijal

42

Zadatak 2.6 Ispišite prvih n prim brojeva, n zadajte sa tipkovnice. #include <stdio.h> #include <math.h> int main(){ int i,j,n; printf("Zadaj krajnji broj="); scanf("%d",&n); printf("\n Prim brojevi do %4d su :\n%4d, ",n,1); for (i=1;i<=n;i++) for (j=2;j<i;j++){ if(i%j==0) break; if (j==i-1) printf("%4d, ",i); } return 0; } Zadaj krajnji broj=20 Prim brojevi do 20 su : 1, 3, 5, 7, 11, 13, 17, 19,

Zadatak 3.1

Unesite tekst sa tipkovnice (do 80 znakova). Izbrojite broj riječi u rečenici. #include <stdio.h> #include <conio.h> #include <string.h> int main(){ char tekst[80]; int duljina, i, br_rijeci=0; printf("Unesite recenicu: "); gets(tekst); duljina=strlen(tekst); if (tekst[0]!=' ') br_rijeci++; for (i=1;i<duljina;i++) if (tekst[i-1]==' ' && tekst[i]!=' ') br_rijeci++; printf("\nBroj riječi u rečenici je: %5d.",br_rijeci); return 0; } Unesite recenicu: Osnove programiranja Broj riječi u rečenici je: 2.

Page 45: PDF-Programiranje Radni Materijal

43

Zadatak 3.2 Unesite tekst sa tipkovnice (do 80 znakova). Izbrojite koliko je velikih slova, malih slova i brojeva u tekstu. #include <stdio.h> #include <conio.h> #include <string.h> int main(){ char tekst[80]; int duljina, i, br_vel=0, br_mal=0, br_br=0, br_ostalo=0; printf("Unesite tekst:"); gets(tekst); duljina=strlen(tekst); for (i=0;i<duljina;i++){ if (tekst[i]>='A' && tekst[i]<='Z') br_vel++; else if (tekst[i]>='a' && tekst[i]<='z') br_mal++; else if (tekst[i]>='0' && tekst[i]<='9') br_br++; else br_ostalo++; } printf("\nVelikih slova ima: %5d.",br_vel); printf("\nMalih slova ima: %5d.",br_mal); printf("\nBrojeva ima: %5d.",br_br); printf("\nPreostalo je : %5d znakova."),"br"; return 0; } Unesite tekst:Programiranje , vijezba 3 Velikih slova ima: 1. Malih slova ima: 19. Brojeva ima: 1. Preostalo je : 4 znakova.

Page 46: PDF-Programiranje Radni Materijal

44

Zadatak 3.3 Napišite program koji pretvara cijeli broj upisan u bazi.B (2, 8 ili 16) u decimalni broj. #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> int main(){ char tekst[20],ch_znam; int baza, duljina, znamenka,rezultat=0,i; printf("Unesite cijeli broj: "); gets(tekst); duljina=strlen(tekst); printf("Unesite bazu: "); scanf("%d",&baza); if (!(baza==2 || baza ==8 || baza==16)){ printf("Nije upisana ispravna baza - prekid programa"); getch(); exit(0); } for (i=0;i<duljina;i++){ /* Dohvat znamenke i ispitivanje ispravnosti */ ch_znam=tekst[i]; if (ch_znam>='0' && ch_znam<='9') znamenka=ch_znam-48; /* else if (baza==16 && (ch_znam=='A' || ch_znam=='a')) znamenka=10; */ /* else if (baza==16 && (ch_znam=='B' || ch_znam=='b')) znamenka=11; */ /* else if (baza==16 && (ch_znam=='C' || ch_znam=='c')) znamenka=12; */ /* else if (baza==16 && (ch_znam=='D' || ch_znam=='d')) znamenka=13; */ /* else if (baza==16 && (ch_znam=='E' || ch_znam=='e')) znamenka=14; */ /* else if (baza==16 && (ch_znam=='F' || ch_znam=='f')) znamenka=15; */ /* Gornjih šest if naredbi može biti riješeno jednom/* else if (baza==16 && toupper(ch_znam)>='A' && toupper(ch_znam)<='F') znamenka=toupper(ch_znam)-65+10; else {printf("\nUnešeni broj je neispravan"); getch(); exit(0); } if (znamenka>baza){printf("\nUnešena %d. znamenka veća ili jednaka bazi",i+1); getch(); exit(0); } /* printf("\nZnamenka je %d",znamenka); */ /* Stvarna konverzija */ rezultat+=znamenka*pow(baza,duljina-1-i); } printf("\nDecimalni broj je: %8d",rezultat); getch(); return 0; } Unesite cijeli broj: e Unesite bazu: 16 Decimalni broj je: 14

Page 47: PDF-Programiranje Radni Materijal

45

Zadatak 3.4 Napišite program koji ispisuje tablicu ASCII koda počev od znaka razmaka (ASCII kod je 32 dekadski) do znaka sa kodom 127 (dekadski). Znakovi sa kodom manjim od 32 su kontrolni znakovi i ne mogu se ispisivati. Ispišite tablicu tako da prvo ispišete zaglavlje stupaca tablice u kojem su decimalni brojevi 32, 48, 64, 80, 96, 112. Ispod toga ispišite u zaglavlju iste brojeve u heksadekadskom formatu. U recima tablice ispišite prvo dekadske brojeve od 0 do 15, a zatim heksadekadske ekvivalente tih brojeva te napokon ASCII kodove znaka u %c formatu. Kodove znakova ispisujete po 6 u retku pozionirano ispod vodoravnog zaglavlja tablice. Uočite da su kodovi malih slova za 32 dekadski (odnosno 20 heksadekadski) veći od kodova istih velikih slova. #include<stdio.h> #include<conio.h> int main(){ int i, j=0; char kod=32; // moglo se staviti i kod=' '; clrscr(); printf("\nTablica ASCII koda \n\n"); printf ("\t\t 32 48 64 80 96 112 dekadski"); printf ("\n\t\t 20 30 40 50 60 70 heksadekadski"); printf("\n"); for(i=0;i<=15;i++){ printf("\n\t%2d %2x",i,i); for(j=0;j<=5;j++){ if (j==0) printf(" %4c",kod); if (j==1) printf("%4c",kod+16); if (j==2) printf("%4c",kod+32); if (j==3) printf("%4c",kod+48); if (j==4) printf("%4c",kod+64); if (j==5) printf("%4c",kod+80); } kod=kod+1; } getch(); return 0; } Tablica ASCII koda 32 48 64 80 96 112 dekadski 20 30 40 50 60 70 heksadekadski 0 0 0 @ P ` p 1 1 ! 1 A Q a q 2 2 " 2 B R b r 3 3 # 3 C S c s 4 4 $ 4 D T d t 5 5 % 5 E U e u 6 6 & 6 F V f v 7 7 ' 7 G W g w 8 8 ( 8 H X h x 9 9 ) 9 I Y i y 10 a * : J Z j z

Page 48: PDF-Programiranje Radni Materijal

46

11 b + ; K [ k { 12 c , < L \ l | 13 d - = M ] m } 14 e . > N ^ n ~ 15 f / ? O _ o ⌂

Zadatak 3.5

Načinite program koji ispituje da li se točka sa koordinatama zadanim sa tipkovnice nalazi na kružnici, unutar kružnice ili van nje. #include <stdio.h> #include <conio.h> #include <math.h> int main(){ float x1,y1,xs,ys,r,udaljenost; printf("\n Unesi koordinate središta kružnice, a zatim i polumjer,"// "\n separator unosa neka je razmak xs ys r ="); scanf("%f %f %f",&xs,&ys,&r); printf("\n Unesi koordinate točke razdvojene zarezom x,y ="); scanf("%f,%f",&x1,&y1); // Sljedi provjera gdje se nalazi točka // Udaljenost je varijabla kojom se po Pitagorinom poučku // određuje udaljenost točke od središta kružnice udaljenost=sqrt(pow((x1-xs),2)+pow((y1-ys),2)); printf ("\nUdaljenost točke od središta kružnice je : %6.2f", udaljenost); if (udaljenost>r) printf("\nTočka se nalazi izvan kružnice"); else if (udaljenost<r) printf("\nTočka se nalazi unutar kružnice"); else printf("\nTočka se nalazi na kružnici"); getch(); return 0; } Unesi koordinate središta kružnice, a zatim i polumjer, separator unosa neka je razmak xs ys r =0 0 5 Unesi koordinate točke razdvojene zarezom x,y =0,5 Udaljenost točke od središta kružnice je : 5.00 Točka se nalazi na kružnici

Page 49: PDF-Programiranje Radni Materijal

47

Zadatak 4.1 Napravite program za izračunavanje trigonometrijskih funkcija. Kut zadajte u stupnjevima. Za izbornik koristite naredbu switch. #include <stdio.h> #include <conio.h> #include <math.h> int main(){ float kut,kutrad; int izbor; do { printf("\nIzaberite funkciju: 1. Sinus"); printf("\n 2. Kosinus "); printf("\n 3. Tangens "); printf("\n 4. Kotangens "); printf("\n 5. Kraj "); printf("\n\t\t\t\t"); scanf("%d",&izbor); if (izbor !=5) { printf("\nUnesi kut u stupnjevima: "); scanf("%f",&kut); kutrad=kut*3.14/180;} switch (izbor){ case 1: printf("Sinus od %4.1f stupnjeva je %4.3f", kut, sin(kutrad)); getch(); break; case 2: printf("Kosinus od %4.1f stupnjeva je %4.3f", kut, cos(kutrad)); getch(); break; case 3: printf("Tangens od %4.1f stupnjeva je %6.2f", kut, tan(kutrad)); getch(); break; case 4: printf("Kotangens od %4.1f stupnjeva je %6.2f", kut, 1/tan(kutrad)); getch(); break; } } while (izbor!=5); return 0; } Izaberite funkciju: 1. Sinus 2. Kosinus 3. Tangens 4. Kotangens 5. Kraj 2 Unesi kut u stupnjevima: 48 Kosinus od 48.0 stupnjeva je 0.669

Page 50: PDF-Programiranje Radni Materijal

48

Zadatak 4.2 Napravite program koji računa broj samoglasnika u rečenici. Za ispitivanje koristite naredbu switch. #include <stdio.h> #include <conio.h> #include <string.h> int main(){ char tekst[80], slovo; int duljina, i; int br_a=0, br_e=0, br_i=0, br_o=0, br_u=0; printf("\nUnesi rečenicu: "); gets(tekst); duljina=strlen(tekst); for (i=0;i<duljina;i++){ slovo=tekst[i]; switch (slovo){ case 'A': case 'a': br_a++; break; case 'E': case 'e': br_e++; break; case 'I': case 'i': br_i++; break; case 'O': case 'o': br_o++; break; case 'U': case 'u': br_u++; break; } } printf("\nSlova a ima %d.",br_a); printf("\nSlova e ima %d.",br_e); printf("\nSlova i ima %d.",br_i); printf("\nSlova o ima %d.",br_o); printf("\nSlova u ima %d.",br_u); getch(); return 0; } Unesi rečenicu: Osnove programiranja, c jezik Slova a ima 3. Slova e ima 2. Slova i ima 2. Slova o ima 3. Slova u ima 0.

Page 51: PDF-Programiranje Radni Materijal

49

Zadatak 4.3 Napravite program za pogađanje broja znakova u rečenici. Broj pogađanja ograničite na pet. #include <stdio.h> #include <conio.h> #include <string.h> int main(){ char tekst[80]; int br_pok=1, br_char=0, duljina; printf("\nUnesi recenicu: "); gets(tekst); duljina=strlen(tekst); while (br_pok<=5 && br_char!=duljina){ printf("\nPogodi broj znakova u recenici ="); scanf("%d",&br_char); if (br_char<duljina) printf("\nPremalo!"); else if (br_char>duljina)printf("\nPrevise!"); br_pok++; } if (br_char!=duljina) printf("\nNiste pogodili, ima tocno %d znakova",duljina); else printf ("\nPogodili ste u %d pokusaja",br_pok-1); getch(); return 0; } Unesi recenicu: Programski jezik C. Pogodi broj znakova u recenici =5 Premalo! Pogodi broj znakova u recenici =19 Pogodili ste u 2 pokusaja

Page 52: PDF-Programiranje Radni Materijal

50

Zadatak 4.4 Unesite sa tipkovnice cjelobrojnu kvadratnu matricu sa najviše 10x10 članova. Zatim generirajte novu matricu tako da u unešenoj matrici pozitivne članove zamijenite sa +1, a negativne članove sa -1. Ispišite novu matricu. #include <stdio.h> #include <conio.h> int main(){ int mat[10][10],d,i,j; do{ printf("Unesite veličinu matrice(do 10x10 članova):"); scanf("%d",&d); if(d>10)printf("\nPreveliki broj\n"); }while(d>10); //Unos matrice for(i=0;i<d;i++) for(j=0;j<d;j++){ printf("mat[%d][%d]= ",i+1,j+1); scanf("%d",&mat[i][j]); } printf("\nIspis unešene matrice !\n"); for(i=0;i<d;i++){ printf("\n"); for(j=0;j<d;j++) printf("%3d ",mat[i][j]); } //Zamjena članova for(i=0;i<d;i++) for(j=0;j<d;j++){ if(mat[i][j]>0) mat[i][j]=+1; if(mat[i][j]<0) mat[i][j]=-1; } printf("\n\nIspis generirane matrice !\n"); for(i=0;i<d;i++){ printf("\n"); for(j=0;j<d;j++) printf("%3d ",mat[i][j]); } getch(); return 0; } Unesite veličinu matrice(do 10x10 članova):3 mat[1][1]= 1 mat[1][2]= 2 mat[1][3]= 3 mat[2][1]= 0 mat[2][2]= -1 mat[2][3]= -2 mat[3][1]= 3

Page 53: PDF-Programiranje Radni Materijal

51

mat[3][2]= -4 mat[3][3]= 5 Ispis unešene matrice ! 1 2 3 0 -1 -2 3 -4 5 Ispis generirane matrice ! 1 1 1 0 -1 -1 1 -1 1

Zadatak 4.5

Napravite program za ispis i pomicanje male loptice po ekranu. Lopticu pomičite tipkama w (gore), a (lijevo), s (dolje) i d (desno). #include<stdio.h> #include<conio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<ctype.h> void main(){ int n,v=1,h=1; char izbor; printf("Pomicete malu lopticu tipkama:"); printf("\n\n\n w (gore)"); printf("\na s d (lijevo)(dolje)(desno) "); printf("\n\n\n\n i x za izlaz"); getch(); do{ gotoxy(h,v); printf(" ## "); gotoxy(h,v+1); printf(" #### "); gotoxy(h,v+2); printf(" ## "); n=0; izbor = getch(); switch (toupper(izbor)) { case 'S': v++; break; case 'W': v--; break; case 'A': h--; break; case 'D': h++; break; case 'X': exit(0); default: n=5; }

Page 54: PDF-Programiranje Radni Materijal

52

if (v>20) v=1; if (v<1) v=20; if (h>40) h=1; if (h<1) h=40; } while (n!=100); return ; } ## #### ## Pomicete malu lopticu tipkama: w (gore) a s d (lijevo)(dolje)(desno)

Zadatak 5.1

Napišite program koji unešeni niz cijelih brojeva sortira poveličini mjehuričastom metodom. #include <stdio.h> #include <conio.h> #include <stdlib.h> int main(){ int niz[20], kolicina, i, j, temp; char linija[20]; do { printf("\nUnesi veličinu niza cijelih brojeva :"); gets(linija); kolicina=atoi(linija); } while (kolicina>20); for(i=0;i<=kolicina-1;i++){ printf("\nUnesi %d. član niza: ",i+1); gets(linija); niz[i]=atoi(linija); } printf("\nNesortirani niz je : "); for(i=0;i<=kolicina-1;i++) printf("%d, ",niz[i]); /*Sortiranje mjehurićastom metodom !*/ for(i=0;i<=kolicina-2;i++) for(j=i+1;j<=kolicina-1;j++) if (niz[i]>niz[j]){ temp=niz[i]; niz[i]=niz[j]; niz[j]=temp; } printf("\nSortirani niz je : "); for(i=0;i<=kolicina-1;i++) printf("%d, ",niz[i]); getch(); return 0; } Unesi velicinu niza cijelih brojeva :2

Page 55: PDF-Programiranje Radni Materijal

53

Unesi 1. clan niza: 2 Unesi 2. clan niza: 1 Nesortirani niz je : 2, 1, Sortirani niz je : 1, 2,

Zadatak 5.2

Napišite program koji pretvara cijeli dekadski broj u binarni. #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <math.h> int main(){ int bin_broj[30], baza=2, broj; int bin_znam, br_znam=0, i, kvoc; /* double br_pom; printf("Unesite cijeli dekadski broj: "); scanf("%d",&broj); /* Broj bin. znamenki za prikaz je dualni logaritam od broja koji se prikazuje */ /* br_pom=log(broj)/log(2); /* /* br_znam=(int)br_pom; /* /* if (br_znam<br_pom) br_znam+=1; */ /* Sljedi drugi nacin racunanja potrebnog broja znamenaka */ kvoc=broj; do { kvoc/=baza; br_znam++; } while (kvoc!=0); printf("\nZa prikaz dekadskog broja %5d, treba %5d binarnih znamenaka.",broj, br_znam); i=br_znam-1; kvoc=broj; do { bin_znam=kvoc%baza; kvoc/=baza; bin_broj[i]=bin_znam; i--; } while (kvoc!=0); printf("\nBinarni broj je:"); for (i=0;i<br_znam;i++) printf("%d",bin_broj[i]); getch(); return 0; } Unesite cijeli dekadski broj: 12 Za prikaz dekadskog broja 12, treba 4 binarnih znamenaka. Binarni broj je:1100

Page 56: PDF-Programiranje Radni Materijal

54

Zadatak 5.3 Napišite program koji učitava cjelobrojnu kvadratnu matricu reda n te izračunajte aritmetičku sredinu dijagonalnih članova. #include <stdio.h> #include <conio.h> #define MAX 20 int main(){ int i,j,n,mat[MAX][MAX]; float sred=0.; printf("\nUnesi velicinu cjelobrojne kvadratne matrice nxn: "); scanf("%d",&n); printf("\nUnesi elemente matrice:\n\n"); for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("\tM[%d][%d]= ",i+1,j+1); scanf("%d",&mat[i][j]); if(i==j) sred += mat[i][j]; } } sred /= n; printf("\nUnesena je matrica:\n\n"); for(i=0;i<n;i++){ printf("\n"); for(j=0;j<n;j++){ printf("\t%d",mat[i][j]); } } printf("\n\nAritmeticka sredina dijagonalnih clanova je %f", sred); getch(); return 0; } Unesi velicinu cjelobrojne kvadratne matrice nxn: 2 Unesi elemente matrice: M[1][1]= 2 M[1][2]= 3 M[2][1]= 4 M[2][2]= 5 Unesena je matrica: 2 3 4 5 Aritmeticka sredina dijagonalnih clanova je 3.500000

Page 57: PDF-Programiranje Radni Materijal

55

Zadatak 5.4 Napišite program koji učitava niz otpornika koji sačinjavaju paralelni spoj otpornika i izračunajte ekvivalentni otpor. #include <stdio.h> #include <conio.h> #define MAX 20 int main(){ int n,i; float R[MAX],Ruk=0; printf("\nUnesi broj otpornika u paralelnom spoju: "); scanf("%d",&n); printf("\nUnesi otpornike redom:\n\n"); for(i=0;i<n;i++){ printf("\nR%d= ",i+1); scanf("%f",&R[i]); } /* Računanje ekvivalentnog otpora paralele */ for(i=0;i<n;i++) Ruk+=1/R[i]; Ruk=1/Ruk; printf("\n\nEkvivalentan otpor paralelnog spoja je %f", Ruk); getch(); return 0; } Unesi broj otpornika u paralelnom spoju: 3 Unesi otpornike redom: R1= 1 R2= 2 R3= 3 Ekvivalentan otpor paralelnog spoja je 0.545455

Page 58: PDF-Programiranje Radni Materijal

56

Zadatak 5.5 Napišite program koji izračunava vrijednost polinoma. Polinom zadati sa tipkovnice i računati ga koristeći funkciju poly. #include <stdio.h> #include <conio.h> #include <math.h> int main(){ int n, i; double pol[10], x, y; clrscr(); printf("\nUnesi potenciju polinoma (do 9. stupnja): "); scanf("%d",&n); printf("\nUnesi koeficijente polinoma počev od slobodnog člana:\n\n"); for(i=0;i<=n;i++){ printf("\nKoeficijent uz x^%d= ",i); scanf("%lf",&pol[i]); } printf("\nUnesi vrijednosti argumenta x = "); scanf("%lf",&x); y=poly(x,n,pol); printf("Za argument %lf, vrijednost polinoma je %lf", x, y); getch(); return 0; } Unesi potenciju polinoma (do 9. stupnja): 2 Unesi koeficijente polinoma počev od slobodnog člana: Koeficijent uz x^0= 3 Koeficijent uz x^1= 4 Koeficijent uz x^2= 5 Unesi vrijednosti argumenta x = 5 Za argument 5.000000, vrijednost polinoma je 148.000000

Page 59: PDF-Programiranje Radni Materijal

57

PROGRAMIRANJE I VJEŽBE  

Page 60: PDF-Programiranje Radni Materijal

58

12. POLJE

12.1 Višedimenzionalno polje Opći oblik:

tip var_ime [red][stup].......[str N];

Polje s tri ili više dimenzija ne koriste se često zbog memorijskih ograničenja. Program može vrlo brzo doći izvan memorije Primjer 1. #include <stdio.h> void main(){ int t[10][10][10],i; for(i=0;i<10;i++){ t[i][0][0]=i; printf("%d",t[i][0][0]); } }

0123456789

12.2 Inicijalizacija polja Opći oblik:

tip var_ime [red][stup].......[str N]={niz}

U naredbi inicijalizacije može se izostaviti maksimalan broj elemenata polja jer će se dimenzija polja odrediti po broju vrijednosti pisanih u vitičastoj zagradi. Ako je polje višedimenzionalno tada će redoslijed pridruživanja početnih vrijednosti odrediti redoslijed zapisa u memoriji. Primjer 2. #include <stdio.h> void main(){ int t[]={10,11,34,56,2,7,9,10,45,57}; int i; for(i=0;i<10;i++) printf(" %d",t[i]); }

10 11 34 56 2 7 9 10 45 57

Page 61: PDF-Programiranje Radni Materijal

59

13. POKAZIVAČI Pokazivač je prema [4] objekt , odnosno varijabla kojoj će se pridružiti adresa nekog

drugog objekta. Znak (*) u deklaraciji se piše ispred identifikatora i ima funkciju dereferenciranja ( dereferencing operator ) koji označava da se radi o pokazivačkoj varijabli.

13.1 Jednostruka indirekcija

Znak (*) u deklaraciji se piše ispred identifikatora i ima funkciju dereferenciranja ( dereferencing operator ) koji označava da se radi o pokazivačkoj varijabli.

Opći oblik: tip *ime_varijable Primje 3a. #include <stdio.h> void main() { int b; int * adresa; int vrijednost; b=3200; adresa=&b; vrijednost= * adresa; printf( "b je : %d\n" ,vrijednost); }

b je : 3200

int b; int * adresa; b=3200; u ovim naredbama varijabla je definirana , a pokazivač deklariran ali još nije usmjeren. Rezultat je alokacija, a ne inicijalizacija pokazivača. adresa = & b; Nakon toga pokazivač se može koristiti kako slijedi vrijednost= * adresa; printf( "b je : %d\n" ,vrijednost); U tom slučaju dohvaća se vrijednost objekta čija mu je adresa pridružena.

POKAZIVAČ

ADRES A

VARIJABLA

VRIJEDNOST

Page 62: PDF-Programiranje Radni Materijal

60

Primjer 3b. Inkrement i dekremet #include<stdio.h> void main() { int *p,broj ; p=&broj; *p=100; printf("%d,broj"); (*p)++; printf("%d,broj"); (*p)++; printf("%d,broj"); }

100 101 100

Postupak pridruživanja adrese objekta pokazivaču naziva se postupkom usmjeravanja , pri čemu je važno da pokazivač i objekt , osim u iznimnim slučajevima budu istog tipa. Pomoću znaka ( & ) tzv. operatora adrese pokazivaču ćemo pridružiti adresu objekta, usmjeriti.ga adresa = & b; Nakon toga pokazivač se može koristiti na razne načine. vrijednost= * adresa; printf( "b je : %d\n" ,vrijednost); Pokazivač se može koristiti u kombinaciji sa zvjezdicom i nakon deklaracije . U tom slučaju dohvaća se vrijednost objekta čija mu je adresa pridružena. Znak zvjezdica (*) sada je u funkciji tzv. operatora indirekcije ( engl. indirection operator ) .Pokazivač kojem u naredbi prethodi operator indirekcije može utjezati na promjenu vrijednosti objekta kao u primjeru 3b. Ovdje se u promjeni vrijednosti objekta koristi inkrement i dekrement Napokon pokazivaču se može pridružiti vrijednost nekog drugog pokazivača- preusmjeriti ga. U tom slučaju - budući

da se radi o klasičnom postupku pridruživanja , identifikator se koristi bez zvjezdice.

Page 63: PDF-Programiranje Radni Materijal

61

13.2 Višestruka indirekcija

Pokazivač na pokazivač u naredbi deklaracije ima dvije zvjezdice ispred identifikatora.

Opći oblik:

tip **ime_varijable

Primjer 4.Dvostruka indirekcija. #include<stdio.h> void main() { int x,*p,**q; x=10; p=&x; q=&p; printf("%d",**q); }

10

13.3 Pokazivači na polja char str[80]; char *p1; p1=str; Pointer p1 postavljen je na prvu adresu polja str. Želi li se pristupiti 5 elementu polja pišemo str[4] ili *(p1+4) ili (str+4)++ Osim pomoću indeksa elementu polja može se pristupiti pomoću identifikatora polja bez naznake indeksa . Identifikator polja ( ime polja ) ima značenje pokazivača na prvi element. Primjer 5. pokazivaču se može pridružiti vrijednost nekog drugog pokazivača #include <ctype.h> void main() { char s[10]= "Dobar dan" ; char *p; int i; p=s; for(i=0;p[i]; i++) printf("%c" ,toupper(p[i])); }

DOBAR DAN

POKAZIVAČ

ADRES A

POKAZIVAČ

ADRES A

VARIJABLA

VRIJEDNOST

Page 64: PDF-Programiranje Radni Materijal

62

14. STRING ( polje znakova )

14.1 String konstante Ako se string konstanta upotrebljava u bilo kojem izrazu, tretira se kao pokazivač na prvi znak u stringu. Primjer 6. #include<stdio.h> void main() { char *s; s=“ Zabavno je koristiti pokazivace ”; printf(s); }

Zabavno je koristiti pokazivace

14.2 strcpy ( ) Opći oblik: strcpy (ulazni, izlazni ); Kopira sadržaj stringa izlazni u ulazni. Primjer 7. # include <stdio.h> # include <string.h> void main ( ) { char str [80]; strcpy (str, “bok”); printf (“%s”,str); }

bok

14.3 strcat ( ) Opći oblik:

strcat (s1,s2);

Funkcija dodaje string s2 na kraj s1; s2 je nepromijenjen. Oba stringa moraju završavati nul znakom ( ASCI 0 ). Primjer 8. # include <stdio.h> # include <string.h> void main ( ) { char s1[80],s2[80]; strcpy(s1,"Programiranje je "); printf("\n%s\n",s1); gets (s2); strcat(s1,s2); printf("%s",s1); }

Programiranje je zabavno Programiranje je zabavno

Page 65: PDF-Programiranje Radni Materijal

63

14.4 strlen ( ) Opći oblik:

strlen (s);

Funkcija vraća duljinu stringa s. Primjer 9. # include <stdio.h> # include <string.h> void main ( ) { char str [80]; printf (“Unesite znakove:”); gets (str); printf (“%d”, strlen (str)); }

Unesite znakove: programiranje 13

14.5 NULL terminator proba u for petlji je string str[i]. Radi jer je to ne nula vrijednost. Petlja se zaustavlja kad dostigne nul-terminator. To je pravi trenutak jer označava kraj polja znakova. Primjer 10. Pretvaranje malih slova u velika. # include <stdio.h> # include <string.h> # include <ctype.h> void main ( ) { char str [80]; int i; strcpy (str, “Ovo je proba”); for (i = 0; str[i]; i ++) str[i] = toupper (str[i]); printf (“%s”,str); }

OVO JE PROBA

Page 66: PDF-Programiranje Radni Materijal

64

15. FUNKCIJE C program je skup jedne ili više funkcija. Za pisanje programa potrebno je prvo

napisati funkcje a nakon toga ih treba složiti zajedno.Funkcija u C-u je logički samostalan dio programa .

Funkcija može ali ne mora imati parametre. Parametri su vrijednosti koje se proslijeđuju funkciji iz okoline, čime joj se omogućava da prilikom svakog poziva, pomoću istih naredbi radi s različitim vrijednostima.Parametri mogu biti stvarni ( argumenti ) i formalni. Argument je vrijednost koja se funkciji proslijeđuje prilikom poziva . Ukoliko se radi o vrijednosti koju funkcija vraća okolini iz koje je pozvana ( izlaz ) argument nazivamo rezultatom funkcije. Formalni parametar je slobodna varijabla ( za vrijeme izvođenja funkcije nalazi se na rezervnoj memorijskoj lokaciji ) kojoj se u trenutku poziva pridružuje vrijednost argumenta.

Opći oblik fukcije

funkcija_ime ( lista parametara ) { ... tijelo funkcije }

Svaka funkcija ima : - Ime koje se koristi za poziv, daje se proizvoljno, uvjet da nije rezervirano u jeziku (main() i naredbe)

- Iza funkcije slijedi zagrada da bi se funkcija razlikovala od varijable.Ukoliko funkcija ne treba parametre tada se lista parametara ostavlja prazna ali se moraju staviti zagrade

- parametari se dijele na stvarne( argumente ) i fomalne koji se uvijek pojavljuju u paru i istog su tipa.Ukoliko ih ima više redoslijed se mora podudarati.

{ - Početak funkcije - Tijelo funkcije – naredbe između lijeve i desne vitice - sadrži

naredbe koje definiraju rad funkcije } - Kraj funkcije i povrat na pozivnu proceduru

Funkcija može ali i ne mora vraćati podatke na pozivnu rutinu, ukoliko ne vraća

podatke mora se deklarirati kao tip void.

Opći oblik

tip ime_ funkcije(tip ime_varijabe1, tip ime_varijabe2,..., tip ime_varijabeN) { tijelo funkcije }

- tip - ako postoji određuje tip podataka koji funkcija vraća, ako ne

postoji funkcija vraća integer. - tip ime_varijable - poprima vrijenost argumenta , mora se pisati tip i ime - () - zagrade moraju biti zatvorene i ako je lista parametara

prazna.

Page 67: PDF-Programiranje Radni Materijal

65

15.1 Lokalne varijable Deklariraju se unutar funkcije. Varijable mogu biti lokalne u bloku. Poznate su unutar svoje funkcije (bloka), tj. doseg je ograničen na funkciju (blok). Kreiraju se ulaskom u blok, a gube se kod izlaza. Primjer 11. #include <stdio.h> void f1(); void main() { char str[]="Ovo je string iz main()"; printf("%s\n",str); f1(); printf("%s\n",str); } void f1() { char str[80]; printf("Unesite nesto:"); gets(str); printf("%s\n",str); }

Unesite nesto:bok bok Ovo je string iz main()

Ako se drugačije ne odredi, lokalne varijable pohranjuju se na stack. Činjenica da je stack dinamičan i da mijenja memorijalno područje objašnjava zašto lokalne varijable ne mogu zadržati vrijednost između poziva funkcije.

15.2 Formalni parametri( argumenti )Parametri mogu biti stvarni ( argumenti ) i formalni. Moraju biti istog tipa kao argumenti, i po broju ih ima jednako. Argument je vrijednost koja se funkciji proslijeđuje prilikom poziva 15.3 Globalne varijable Globalna varijabla daje mogućnost zadržavanja vrijednosti unutar vremena izvršavanja programa. Deklarira se na početku programa, prije main() funkcije. Vrijednosti globalne varijable može se pristupiti iz bilo koje funkcije. Ako nije nužno ne koriste se zbog:

- zauzimaju memoriju za cijelo vrijeme izvođenja programa, a ne samo kad ih trebamo - funkcija se poziva na nešto izvan sebe same

Primjer 11a. Opći: Specifični: Mul(int x,int y) { return(x*y); } /* Vraća vrijednost bilo koja dva broja */

int x,y; mul() { return (x*y);} /* Nalazi produkt globalnih n (x*y);}

Page 68: PDF-Programiranje Radni Materijal

66

15.4 Poziv s vrijednošću Ova metoda pridružuje vrijednost argumenta formalnom parametru. Primjer 12. #include <stdio.h> void main() { int t=10; printf("%d %d",funkcija(t),t); } funkcija(int x) { x=x*x; return (x); }

100 10

Vrijednost argumenta 10, pridružuje se parametru x. Nakon pridruženja x=x*x jedino se mijenja lokalna varijabla x. Varijabla t korištena u pozivu, imat će i dalje vrijednost 10.

15.5 Poziv adresom Adresa argumenta pridružuje se formalnom parametru. Unutar funkcije adresa se koristi za pristup stvarnom argumentu. Primjer 13. #include <stdio.h> void main (){ int x,y; x=10; y=20; printf("Unesite pocetne vrijednosti x i y :%d %d\n",x,y); zamjeni(&x,&y); printf("Zamjenjene vrijednosti x i y :%d %d\n",x,y); } zamjeni(int *x,int *y){ int temp; temp = *x; *x = *y; *y=temp; } Pocetne vrijednosti x i y :10 20 Zamjenjene vrijednosti x i y :20 10 U ovom primjeru, varijabli x je pridružena vrijednost 10, a varijabli y vrijednost 20. Funkcija zamjeni() pokazivačima *x i *y pridružuje adrese x i y .

Page 69: PDF-Programiranje Radni Materijal

67

15.6 Polje argument funkcije Polje je argument u funkcijama u primjerima koji slijede. Primjer 14a. Polje istog tipa i veličine kao u pozivnoj funkciji. #include <stdio.h> void main(){ int t[10],i; for(i=0;i<10;i++) t[i]=i; prikaz(t); } prikaz(int broj[10]){ int i; for(i=0; i<10;i++) printf(“%d”,broj[i]); }

0123456789

Primjer 14b. Deklaracija polja bez dimenzije. #include <stdio.h> void main(){ int t[10],i; for(i=0;i<10;i++) t[i]=i; prikaz(t); } prikaz (int broj[]){ int i; for(i=0; i<10;i++) printf(“%d”,broj[i]); }

0123456789

Primjer 14c. Deklaracija polja kao pokazivač. #include <stdio.h> void main(){ int t[10],i; for(i=0;i<10;i++) t[i]=i; prikaz(t); } prikaz (int *broj){ int i; for(i=0; i<10;i++) printf(“%d”,broj[i]); }

0123456789

Page 70: PDF-Programiranje Radni Materijal

68

15.7 Funkcija vraća ne cijelobrojnu vrijednost Funkcija vraća double vrijednost.

Primjer 15. #include <stdio.h> double opseg(); double povrsina(); void main(){ double r; printf(“Unesite polumjer :”); scanf(“%lf”,&r); printf(“%lf\n”,opseg(r)); printf(“%lf\n”,povrsina(r)); } double opseg(double r) { return r*2*3.1416; } double povrsina(double r) { return r*r*3.1416; }

Unesite polumjer :1 6.283200 3.141600

15.8 Funkcija tipa void Funkcije koje ne vraćaju vrijednost. Primjer 16. #include <stdio.h> void okomito(char *str); main() { char i[]="znak"; okomito(i); } void okomito(char *str){ while (*str) printf("%c\n",*str++); }

z n a k

Prije upotrebe mora se deklarirati, ako ne onda će vratiti integer. Dobro je sve funkcije koje ne vraćaju vrijednost deklarirati kao void.

Page 71: PDF-Programiranje Radni Materijal

69

15.9 Rekurzivna funkcija Funkcija je rekurzivna ako naredba u tijelu funkcije zove samu sebe. Ponekad se koristi naziv cirkularna definicija. Primjer 17a. Klasičan primjer rekurzije je funkcija factr (), koja računa faktorijele od integera. Faktorijel od broja n je produkt svih brojeva od 1 do n. 3! = 1*2*3 = 6. Primjer daje rekurzivnu i nerekuzivnu verziju funkcije. factr (int n) { int answer; if(n==1) return (1) answer = factr (n-1) * n; return (answer); } fact(int n) { int t,answer; answer=1; for(t=1;t<=n;t++) answer=answer*(t); return (answer); } Kada funkcija zove sama sebe, nove lokalne varijable i parametri alociraju prostor na stock – u, a kod funkcije izražava se s ovim novim varijablama od starta. Rekurzivni poziv ne pravi novu kopiju funkcije, samo su argumenti novi. Nedostaci:

- Rekurzivne verzije većinu rutina izvršavaju sporije od integriranog ekvivalenta, zbog dodatnih poziva funkcije

- Zbog spremanja parametara funkcije i lokalnih varijabli na stock, svaki novi poziv kreira novu kopiju varijabli, moguće je da stock "ušeta" na druge podatke ili memorijske lokacije s programom

- Rekurzivne funkcije kreiraju jasnije i jednostavnije verzije brojnih algoritama od integriranih verzija (QUICKSORT algoritam teško je implementirati na interativni način)

- Ljudima je bliži rekurzivni način razmišljanja od integriranog - Kod pisanja rekurzivne funkcije mora postojati naredba if koja vraća vrijednost iz

funkcije kada nema rekurzivnog poziva. Ako nema if – a, iz jednom pozvane funkcije nećemo se nikad vratiti.Ubaciti kontrolni printf () zbog kontrole izvšavanja.

Page 72: PDF-Programiranje Radni Materijal

70

Primjer 17b. Ispisuje znakove na zaslon obrnutim redoslijedom. #include <stdio.h> void obrnuto(char *s); void main() { char str[]="Ovo je proba"; obrnuto(str); } void obrnuto(char *s) { if(*s) obrnuto(s+1); printf("%c",*s); }

aborp ej ovO

Funkcija prvo provjerava dali je dostignut kraj stringa. Ako nije zove samu sebe s slijedećim znakom. Kad se nađe nula poziv se nastavlja i znakovi se ispisuju u reverznom slijedu.

15.10 Vrijeme izvršavanja Primjer 18. U glavnoj funkciji. Pozivom funkcije #include <stdio.h> void main() { int x; for(x=1;x<11;x++); printf(“%d”,x*x); }

#include <stdio.h> void main() { int x; for(x=1;x<11;x++); printf(“%d”,sqr(x)); } sqr(int a){ return a*a; }

Ukupno linija: 222 Ukupno linija :225 U programima gdje je potrebno brže izvođenje koristi ne kreiramo funkcije već se koristimo metodom u liniji jer se vrijeme troši na: - pozivne funkcije troše vrijeme - pridruživanje argumenata parametrima također troši vrijeme kao i njihov smještaj na stock

Page 73: PDF-Programiranje Radni Materijal

71

16. DATOTEKE

Da bi se moglo čitati ili pisati u datoteku moramo koristiti file pointere. File pointere pokrećemo naredbom:

FILE *fp;

16.1 Otvaranje datoteke Opći oblik

FILE *fopen ( char *ime_datoteke, char *nacin );

- ime_datoteke - niz znakova naziv datoteke koju želimo otvoriti - način - način otvavranja

-znak- -način otvaranja- r otvara datoteku za čitanje w otvara datoteku za pisanje a nadopunjuje datoteku

16.2 Zatvaranje datoteke Osnovni oblik

int fclose (FILE *fp);

- ime_datoteke - niz znakova naziv datoteke koju želimo zatvoriti Primjer 19. Otvaranje, čitanje i zatvaranje datoteke

#include <stdio.h> #define dat 80 void main ( void ) { FILE *f; char buffer[dat]; f = fopen ( "c:\\proba.txt", "r" ); if ( f == NULL ) printf ( "Ne mogu pronaci datoteku\n" else { while ( fgets ( buffer, dat, f ) != NULL ) printf ( "%s", buffer ); if ( fclose ( f ) == EOF ) printf ( "Ne mogu je zatvoriti datoteku" ); }

Moja prva datoteka.

Page 74: PDF-Programiranje Radni Materijal

72

17. DINAMIČKO ALOCIRANJE MEMORIJE Dinamički se alocira memorijski prostor za varijable tijekom izvođenja programa.

17.1 calloc Opći oblik

void *calloc(size_t nmemb, size_t size);

Ova funkcija koristi se za alokaciju prostora za pohranu varijable dok se program izvršava. Funkcija prima dva argumenta koji određuju broj elemenata za koje rezerviramo prostor u memoriji i veličinu svakog elementa u byte-ovima. Funkcija vraća pokazivač na karakter koji je alociran u prostoru za pohranu koji je inicijaliziran nulama.

17.2 malloc Opći oblik

void *malloc(number_of bytes );

Funkcija je slična funkciji calloc ali ima jedan argument koji određeje broj bajtova koje alociramo u memoriji. char *cp; cp = malloc(100); Alocira 100 baytova na početak adrese cp.

17.3 sizeof Opći oblik

sizeof (tip ili varijabla );

Vraća memorijsku veličinu dane varijable. Trebalo bi ga koristiti zajedno sa funkcijom calloc, tako da je alocirana samo potrebna memorija, a ne točno određena veličina. int *ip; ip = (int *) malloc(100*sizeof(int)); Ako dodamo to na primjer ispred u ovom slučaju se zauzme točno onoliko memorije koliko treba.

17.4 free Opći oblik

free()

Kada nam varijable više nisu potrebne, prostor koji je dodjeljen treba vratiti sistemu.

Page 75: PDF-Programiranje Radni Materijal

73

18. VJEŽBE: PROGRAMIRANJE Zadatak 6.1

6_1. Napišite program koji za unešeni niz cijelih brojeva između 1 i 100 provjerava koliko je unešeno brojeva djeljivih sa 3. Koristite pokazivače i dinamičko alociranje memorije. Unesite najviše do 10 brojeva, a za raniji kraj unosa upišite '0' (ako unosite manje od 10 brojeva). #include<stdio.h> #include<stdlib.h> #include<conio.h> int main(){ int *b, broj,unos=0, djeljivo=0 ,i; clrscr(); if ((b = (int *) malloc(10*sizeof(int))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1);} while (unos<10){ printf("\nUnesi broj: "); scanf("%d",&broj); if (broj==0) break; *(b+unos)=broj; unos++;} printf("Unijeli ste %d brojeva i to:\n",unos); for (i=0;i<unos;i++) printf("%d, ",*(b+i)); for (i=0;i<unos;i++){ if(*(b+i)%3==0)djeljivo++;} printf("\nUkupno ste unijeli %3d brojeva djeljivih sa 3",djeljivo); // free(b); getch(); return 0; } Unesi broj: 5 Unesi broj: 6 Unesi broj: 7 Unesi broj: 8 Unesi broj: 9 Unesi broj: 0 Unijeli ste 5 brojeva i to: 5, 6, 7, 8, 9, Ukupno ste unijeli 2 brojeva djeljivih sa 3

Page 76: PDF-Programiranje Radni Materijal

74

Zadatak 6.2 Napišite program koji zbraja dvije učitane matrice. Koristite pokazivače i dinamičko alociranje memorije. #include<stdio.h> #include<stdlib.h> #include<conio.h> int main(){ double *a, *b, *c, temp; int n,m,i,j; clrscr(); printf("\nUnesi broj redaka matrice : "); scanf("%d",&m); printf("\nUnesi broj stupaca matrice : "); scanf("%d",&n); /* Dinamičko alociranje memorije */ if ((a = (double *) malloc(m*n*sizeof(double))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1); } if ((b = (double *) malloc(m*n*sizeof(double))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1); } if ((c = (double *) malloc(m*n*sizeof(double))) == NULL) { printf("\nNema dovoljno memorije za alociranje spremnika"); exit(1); } printf("\nUnesi prvu matricu : \n"); for(i=0;i<m;i++) for(j=0;j<n;j++){ printf("\ta[%d][%d]= ",i+1,j+1); scanf("%lf",&temp); *(a+i*n+j)=temp; } printf("\nUnesi drugu matricu : \n"); for(i=0;i<m;i++) for(j=0;j<n;j++){ printf("\tb[%d][%d]= ",i+1,j+1); scanf("%lf",&temp); *(b+i*n+j)=temp; } /* Zbrajanje matrica clan po clan */ for(i=0;i<m;i++)

Page 77: PDF-Programiranje Radni Materijal

75

for(j=0;j<n;j++) *c++=*a++ + *b++; /* Usmjeravanje pokazivača na prvu lokaciju */ for(i=0;i<m;i++) for(j=0;j<n;j++){ a--; b--; c--;} /* Ispis rezultirajuce matrice */ printf("Zbroj unesenih matrica je : "); for(i=0;i<m;i++) for(j=0;j<n;j++) printf("%s%6.1lf", j==0? "\n\t" : " ",*c++); //free(a); free(b); free(c); getch(); return 0; } Unesi broj redaka matrice : 2 Unesi broj stupaca matrice : 2 Unesi prvu matricu : a[1][1]= 1 a[1][2]= 2 a[2][1]= 3 a[2][2]= 4 Unesi drugu matricu : b[1][1]= 1 b[1][2]= 2 b[2][1]= 3 b[2][2]= 4 Zbroj unesenih matrica je : 2.0 4.0 6.0 8.0

Page 78: PDF-Programiranje Radni Materijal

76

Zadatak 6.3 Unesi tekst sa tipkovnice, a zatim unesi slovo čiju prvu pojavu u unešenom tekstu tražite. Ako je slovo pronađeno ispišite njegov položaj riječi. Koristite pokazivače. #include <stdio.h> #include <conio.h> #include <string.h> int main(){ char tekst[80], slovo, *pok; int brojac=0; clrscr(); printf("Unesite tekst : "); gets(tekst); printf("\nUnesite slovo : "); slovo=getche(); pok=tekst; while (*pok){ if (*pok==slovo) break; brojac++; pok++; } if(brojac==strlen(tekst)) printf("\nSlovo nije nađeno u rijeci! "); else printf("\nSlovo se prvi puta pojavljuje na %3d. mjestu u rijeci!", brojac+1); getch(); return 0; } Unesite tekst : Pozdrav Unesite slovo : o Slovo se prvi puta pojavljuje na 2. mjestu u rijeci!

Page 79: PDF-Programiranje Radni Materijal

77

Zadatak 6.4 Unesite rečenicu sa tipkovnice, a zatim unesite riječ čiju pojavu u unešenom tekstu tražite. Ako je riječ pronađena ispišite njen položaj u rečenici. Koristite pokazivače. Uočite, ako se riječ ponavlja u rečenici rješenje će ukazivati na početno slovo zadnje upisane riječi. #include <stdio.h> #include <conio.h> #include <string.h> int main(){ char tekst[80], rijec[30], *pok_tekst, *pok_temp, *pok_rijec; int nalaz=0, brojac=0, polozaj=0; clrscr(); printf("Unesite tekst : "); gets(tekst); printf("\nUnesite rijec : "); gets(rijec); pok_tekst=tekst; while (*pok_tekst){ pok_rijec=rijec; pok_temp=pok_tekst; while (*pok_rijec){ if (*pok_tekst != *pok_rijec) break; else if (*(pok_rijec+1)=='\0'){nalaz=1; polozaj=brojac+1;} pok_rijec++; pok_tekst++;; } brojac++; pok_tekst=++pok_temp; } if (nalaz==1) printf("\nRijec je nadjena i pocinje od %d. slova! ", polozaj); else printf("\nRijec nije nadjena! "); getch(); return 0; } Unesite tekst : ovo je prvi prvi tekst. Unesite rijec : prvi Rijec je nađena i počinje od 13. slova!

Page 80: PDF-Programiranje Radni Materijal

78

Zadatak 6.5 Unesite tekst sa tipkovnice. Iz teksta izdvojite novi niz zadan položajem početnog i krajnjeg znaka koji izdvajate. Ispišite izdvojeni niz. Koristite pokazivače. #include <stdio.h> #include <conio.h> int main(){ char tekst[80], niz[80],*pok_tekst, *pok_niz; int i, poc, kraj; clrscr(); printf("Unesite tekst : "); gets(tekst); printf("\nUnesite polozaj pocetnog znaka = "); scanf ("%d", &poc); printf("\nUnesite polozaj krajnjeg znaka = "); scanf ("%d", &kraj); pok_tekst=tekst; pok_niz=niz; for (i=0;i<=kraj-poc;i++) *(pok_niz+i)=*(pok_tekst+poc-1+i); *(pok_niz+kraj-poc+1)='\0'; printf("\nOvo je novi niz :"); puts(niz); getch(); return 0; } Unesite tekst : Programiranje Unesite polozaj pocetnog znaka = 1 Unesite polozaj krajnjeg znaka = 8 Ovo je novi niz :Programi

Page 81: PDF-Programiranje Radni Materijal

79

Zadatak 7.1 Napišite program za ispis tablice prirodnih brojeva u zadanom intervalu i njihovih logaritama. Za ispis linija u zaglavlju napravi funkciju. #include <stdio.h> #include <conio.h> #include <math.h> void crtice(void); int main(){ int broj, poc_broj=1, kraj_broj=20; while(poc_broj>0 && kraj_broj>0){ clrscr(); crtice(); printf("\n\tBroj\t\tLogaritam"); crtice(); for(broj=poc_broj; broj<=kraj_broj; broj++) printf("\n\t %d\t\t %f",broj,log10((double)broj)); crtice(); printf("\nUnesi interval :"); scanf("%d,%d",&poc_broj, &kraj_broj); } return 0; } void crtice(void){ int i; printf("\n"); for(i=1; i<46; i++)printf("-"); } --------------------------------------------- Broj Logaritam --------------------------------------------- 1 0.000000 2 0.301030 3 0.477121 4 0.602060 5 0.698970 6 0.778151 7 0.845098 8 0.903090 9 0.954243 10 1.000000 11 1.041393 12 1.079181 13 1.113943 14 1.146128 15 1.176091 16 1.204120 17 1.230449 18 1.255273 19 1.278754 20 1.301030 --------------------------------------------- Unesi interval :

Page 82: PDF-Programiranje Radni Materijal

80

Zadatak 7.2 Napišite program za ispis tablice prirodnih brojeva 1 do 7 i njihovih faktorijela. Za ispis linija u zaglavlju te račun faktorijela napravite funkciju. #include <stdio.h> #include <conio.h> #include <math.h> void crtice(void); int faktorijel(int); int main(){ int broj; clrscr(); crtice(); printf("\n\tBroj\t\tFaktorijel"); crtice(); for(broj=1; broj<=7; broj++) printf("\n\t %d\t\t %d",broj,faktorijel(broj)); crtice(); getch(); return 0; } void crtice(void){ int i; printf("\n"); for(i=1; i<46; i++)printf("-"); } int faktorijel(int broj){ int i, fakt=1; for (i=1;i<=broj;i++) fakt*=i; return fakt; } --------------------------------------------- Broj Faktorijel --------------------------------------------- 1 1 2 2 3 6 4 24 5 120 6 720 7 5040 ---------------------------------------------

Page 83: PDF-Programiranje Radni Materijal

81

Zadatak 7.3 Napišite program za provjeru da li je unešeni tekst palindrom. Za provjeru para znakova napravite funkciju. #include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> int provjera_znakova(char, char); int main(){ char tekst[80]; int duljina, brojac=0, i; clrscr(); printf("Unesite tekst koji ispitujete :"); gets(tekst); duljina=strlen(tekst); for (i=0;i<duljina;i++) brojac+=provjera_znakova(tekst[i],tekst[duljina-i-1]); if (brojac==duljina) printf ("\nRijec je palindrom !"); else printf ("\nRijec nije palindrom !"); getch(); return 0; } int provjera_znakova(char p, char q){ if (toupper(p)==toupper(q)) return 1; else return 0; } Unesite tekst koji ispitujete :programiranje Rijec nije palindrom !

Page 84: PDF-Programiranje Radni Materijal

82

Zadatak 7.4 Napišite funkciju koja iz zadanog niza izdvaja podniz odreden položajem pocetnog i krajnjeg znaka u nizu. Niz deklarirajte pokazivacem. U funkiji formirajte novi niz i vratite pokazivac na njega. U glavnoj funkciji unesite izvorni niz te položaj pocetnog i krajnjeg znaka novog niza (to su argumenti funkcije) i ispišite novoformirani niz. #include <stdio.h> #include <conio.h> #include <stdlib.h> char * midstr(char *, int, int); int main(){ char *orig_niz, *novi_niz; int poc, kraj; clrscr(); orig_niz=(char *) malloc(30*sizeof(char)); printf("Unesite niz : "); gets(orig_niz); printf("\nUnesite položaj pocetnog znaka = "); scanf ("%d", &poc); printf("\nUnesite položaj krajnjeg znaka = "); scanf ("%d", &kraj); novi_niz=midstr(orig_niz, poc, kraj); printf("\nNovi niz je :"); puts(novi_niz); getch(); return 0; } char * midstr(char *orig_niz,int poc,int kraj){ char *novi_niz; int i; novi_niz=(char *) malloc((kraj-poc+1+1)*sizeof(char)); for (i=0;i<=kraj-poc;i++) *(novi_niz+i)=*(orig_niz+poc-1+i); *(novi_niz+kraj-poc+1)='\0'; // printf("\nIspis novog niza u funciji:"); // puts(novi_niz); return novi_niz; } Unesite niz : popokatepetl Unesite polo₧aj pocetnog znaka = 3 Unesite polo₧aj krajnjeg znaka = 5 Novi niz je :pok

Page 85: PDF-Programiranje Radni Materijal

83

Zadatak 7.5 Napišite funkciju koja dohvaća realni broj zapisan kao string od najviše 20 znakova i vraća njegovu vrijednost (funkcija identična funkciji atof). #include <stdio.h> #include <conio.h> #include <string.h> #include <math.h> double alfa2float(char[20]); int main(){ char tekst[20]; double iznos; clrscr(); printf("\nUnesi broj: "); gets(tekst); iznos=alfa2float(tekst); printf("\nUneseni broj je: %f",iznos); getch(); return 0; } double alfa2float(char str_broj[20]){ double iznos=0; int duljina, d_cijeli_dio, d_realni_dio, i; duljina=strlen(str_broj); for (i=0;i<duljina;i++){ if(str_broj[i]=='.') {d_cijeli_dio=i; d_realni_dio=duljina-i-1; printf("\nCijeli dio je dug %4d.", d_cijeli_dio); printf("\nRealni dio je dug %4d.", d_realni_dio); }} for (i=0;i<d_cijeli_dio;i++) iznos+=(str_broj[i]-48)*pow(10,d_cijeli_dio-i-1); for (i=0;i<d_realni_dio;i++) iznos+=(str_broj[d_cijeli_dio+1+i]-48)*pow(10,-(i+1)); return iznos; } Unesi broj: 5 Uneseni broj je: 5

Page 86: PDF-Programiranje Radni Materijal

84

Zadatak 8.1 Napišite funkciju koja izračunava koordinate sjecišta dva pravca. Ulazni argumenti neka su koeficijenti smjera i odsječci na y osi pravaca. #include <stdio.h> #include <conio.h> int presjek(float, float, float, float, float *, float *); int main(){ float k1, l1, k2, l2, xs, ys; int paralelni; clrscr(); printf("\nUnesi koef. smjera i odsjecak na y osi 1. pravca: "); scanf("%f,%f",&k1,&l1); printf("\nUnesi koef. smjera i odsjecak na y osi 2. pravca: "); scanf("%f,%f",&k2,&l2); paralelni=presjek(k1, l1, k2, l2, &xs, &ys); if (paralelni==1) printf ("\nPravci su paralelni!"); else printf("Sjecište pravaca je točka (%5.2f,%5.2f).",xs,ys); getch(); return 0; } int presjek(float koef1, float ods1, float koef2, float ods2, float *xsjec, float *ysjec){ int paralelni; if (koef1==koef2) return paralelni=1; *xsjec=-(ods2-ods1)/(koef2-koef1); *ysjec=koef1*(*xsjec)+ods1; return paralelni=0; } Unesi koef. smjera i odsjecak na y osi 1. pravca: 2,3 Unesi koef. smjera i odsjecak na y osi 2. pravca: 5,3 Sjecište pravaca je tocka (-0.00, 3.00).

Page 87: PDF-Programiranje Radni Materijal

85

Zadatak 8.2 Napišite funkciju koja kut u radijanima pretvara u stupnjeve, minute i sekunde. #include <stdio.h> #include <conio.h> #include <math.h> void rad2stup(float, int *, int *, int *); int main(){ float kut_rad; int stup, min, sek; clrscr(); printf("\nUnesi kut u radijanima: "); scanf("%f",&kut_rad); rad2stup(kut_rad, &stup, &min, &sek); printf("Kut ima %4d stupnjeva, %4d minuta i %4d sekundi!",stup,min,sek); getch(); return 0; } void rad2stup(float kut_rad, int *stup, int *min, int *sek){ float kut_stup, temp; kut_stup=kut_rad*180/M_PI; *stup=kut_stup; temp=(kut_stup-*stup)*60; *min=temp; *sek=(temp-*min)*60; } Unesi kut u radijanima: 23 Kut ima 1317 stupnjeva, 48 minuta i 10 sekundi!

Page 88: PDF-Programiranje Radni Materijal

86

Zadatak 8.3 Zadane su dvije stranice kosokutnog trokuta i kut u vrhu nasuprot jedne od stranica. Napišite funkciju koja izračunava preostale stranice i kuteve u trokutu. ##include <stdio.h> #include <conio.h> #include <math.h> void trokut(float, float, float, float *, float *, float *); int main(){ float a, b, c, alfa, beta, gama; clrscr(); printf("\nUnesi stranice a i b: "); scanf("%f,%f",&a, &b); printf("\nUnesi kut alfa (u stupnjevima): "); scanf("%f",&alfa); alfa=alfa*M_PI/180; trokut(a, b, alfa, &c, &beta, &gama); printf("\nStranice trokuta su: %5.2f, %5.2f i %5.2f", a,b,c); printf("\nKutevi trokuta su: %5.2f, %5.2f i %5.2f", alfa*180/M_PI, beta*180/M_PI, gama*180/M_PI); getch(); return 0; } void trokut(float a, float b, float alfa, float *c, float *beta, float *gama){ *beta=asin(b*sin(alfa)/a); *gama=M_PI-(alfa+*beta); *c=a*sin(*gama)/sin(alfa); } Unesi stranice a i b: 20,10 Unesi kut alfa (u stupnjevima): 24 Stranice trokuta su: 20.00, 10.00 i 28.72 Kutevi trokuta su: 24.00, 11.73 i 144.27

Page 89: PDF-Programiranje Radni Materijal

87

Zadatak 8.4 Napišite program koji zbraja ili oduzima dvije realne matrice sa mxn članova. Za unos, računanje i ispis matrica koristiti funkcije. Koristiti pokazivače umjesto polja. #include <stdio.h> #include <stdlib.h> #include <math.h> #include <conio.h> void unosm(float *,int,int,char); void ispism(float *,int,int,char); void racun(float *,float *,float *,int,int,int); int main(){ int m,n,k; char *pom,ch; float *a, *b ,*c; clrscr(); printf("\nUnesi dimenzije matrica (mxn):\n\n"); printf("\tUnesi m: "); gets(pom); m=atoi(pom); printf("\tUnesi n: "); gets(pom); n=atoi(pom); a=(float *) malloc(m*n*sizeof(float)); b=(float *) malloc(m*n*sizeof(float)); c=(float *) malloc(m*n*sizeof(float)); unosm(a,m,n,'A'); unosm(b,m,n,'B'); printf("\n\nIzaberi '+' za zabrajanje ili '-' za oduzimanje: "); ch=getch(); switch(ch){ case '+': k=1; break; case '-': k=-1; break; } racun(a,b,c,m,n,k); ispism(a,m,n,'A'); ispism(b,m,n,'B'); ispism(c,m,n,'C'); getch(); return 0; } void unosm(float *mat,int m,int n, char c){ int i,j; char *pom; printf("\n\nUnesi matricu %c:\n\n",c); for(i=0; i<m; i++){ for(j=0; j<n; j++){ printf("%c[%d][%d]= ",c,i,j);

Page 90: PDF-Programiranje Radni Materijal

88

gets(pom); *mat++=atof(pom); } } } void ispism(float *mat,int m,int n, char c){ int i,j; printf("\n\nMatrica %c:\n",c); for(i=0; i<m; i++){ printf("\n"); for(j=0; j<n; j++){ printf("\t%f",*mat++); } } } void racun(float *a,float *b,float *c,int m,int n,int k){ int i,j; for(i=0;i<m;i++) for(j=0;j<n;j++) *c++=*a++ +k**b++; } Unesi dimenzije matrica <mxn>: Unesi m:

Page 91: PDF-Programiranje Radni Materijal

89

Zadatak 8.5 Napišite funkciju koja vraća pokazivač na najveći član cjelobrojnog polja. U glavnom programu unijeti polje te pozvati funkciju i ispisati najveći član. #include <stdio.h> #include <stdlib.h> #include <conio.h> int * najveci(int, int *); int main(){ int *polje, n, i, *pok_najveci; clrscr(); printf("\nUnesi broj clanova polja n: "); scanf("%d",&n); polje=(int *) malloc(n*sizeof(int)); printf("\nUnesi clanove polja: "); for (i=0;i<n;i++){ printf("\n%d. član = ",i+1); scanf("%d",polje+i); } printf("\nIspis polja: "); for (i=0;i<n;i++){ printf("\npolje[%d]= %4d",i+1,*(polje+i)); } pok_najveci=najveci(n,polje); printf("\nNajveći član je %4d!", *pok_najveci); getch(); return 0; } int * najveci(int n, int *polje){ int i, *naj; naj=polje; for (i=0;i<n;i++) if (*(polje+i)>*naj) naj=polje+i; return naj; } Unesi broj clanova polja n: 3 Unesi clanove polja: 1. član = 2 2. član = 3 3. član = 4 Ispis polja: polje[1]= 2 polje[2]= 3 polje[3]= 4 Najveći clan je 4! Zadatak 9.1 Napišite rekurzivnu funkciju koja će izračunati n!

Page 92: PDF-Programiranje Radni Materijal

90

#include <stdio.h> #include <conio.h> long faktorijel(int); int main(){ int n; clrscr(); printf("\nZadaj broj n: "); scanf("%d",&n); if (n>=0){ printf("\n%d! = %ld",n,faktorijel(n)); } getch(); return 0; } long faktorijel(int n){ if (n==0) return 1; return n* faktorijel(n-1); } Zadaj broj n: 3 3! = 6

Zadatak 9.2 Napišite rekurzivnu funkciju koja će izračunati zbroj prvih n prirodnih brojeva. #include <stdio.h> #include <conio.h> int zbroj(int); int main(){ int n; clrscr(); printf("\nZadaj broj n: "); scanf("%d",&n); printf("\nZbroj prvih %d prirodnih brojeva je %d!", n,zbroj(n)); getch(); return 0; } int zbroj(int n){ if (n==0) return 0; return n+zbroj(n-1); } Zadaj broj n: 44 Zbroj prvih 44 prirodnih brojeva je 990 !

Page 93: PDF-Programiranje Radni Materijal

91

Zadatak 9.3 Napišite rekurzivnu funkciju koja će prikazati binarno zadani decimalni broj. #include <stdio.h> #include <conio.h> void dec2bin(int); int main(){ int n; clrscr(); printf("\nZadaj prirodni broj n: "); scanf("%d",&n); printf("\nBinarni zapis broja %d je ", n); dec2bin(n); getch(); return 0; } void dec2bin(int n){ if (n>=1){ dec2bin(n/2); printf("%d",n%2); } } Zadaj prirodni broj n: 3 Binarni zapis broja 3 je 11

Page 94: PDF-Programiranje Radni Materijal

92

Zadatak 9.4 Napišite rekurzivnu funkciju koja izračunava sumu neparnih brojeva do zadanog (u glavnoj funkciji) prirodnog broja n. U glavnoj funkciji ispišite rezultat. #include <stdio.h> #include <conio.h> int sumanep(int); int main(){ int broj, suma; clrscr(); printf("\nUnesi prirodan broj :"); scanf("%d",&broj); if (broj%2==0) broj--; suma=sumanep(broj); printf("\nSuma neparnih brojeva do %d je %d !",broj,suma); getch(); return 0; } int sumanep(n){ if (n==1) return 1; else return n + sumanep(n-2); } Unesi prirodan broj :9 Suma neparnih brojeva do 9 je 25 !

Page 95: PDF-Programiranje Radni Materijal

93

19. ZADACI ZA VJEŽBANJE Zadatak v.1

Unesite kordinate vrhova trokuta.Izracunajte duljine stranica trokuta i ispisite ih, te odredite da li je trokut raznostranican,istokracan ili istostraničan. U zadatku ne treba provjeravati da li zadani vrhovi čine trokut kada se spoje točke. #include <stdio.h> #include <math.h> #include <conio.h> void main(){ float ax,ay,bx,by,cx,cy,a,b,c; printf("\nUnesi kordinate trokuta"); printf("\nUnesi kordinate tocke A"); printf("\nX,Y= ");scanf("%f,%f",&ax,&ay); printf("\nUnesi kordinate tocke B"); printf("\nX,Y= ");scanf("%f,%f",&bx,&by); printf("\nUnesi kordinate tocke C"); printf("\nX,Y= ");scanf("%f,%f",&cx,&cy); //ispis stranica c=sqrt(pow((ax-bx),2)+pow((ay-by),2)); printf("\nDuljina stranice c je->%f",c); b=sqrt(pow((ax-cx),2)+pow((ay-cy),2)); printf("\nDuljina stranice b je->%f",b); a=sqrt(pow((cx-bx),2)+pow((cy-by),2)); printf("\nDuljina stranice a je->%f",a); // usporedivanje if((a!=b)&&(a!=c)&&(b!=c)) printf("\nTrokut je raznostranican"); else if((a==b)&&(b==c)) printf("\n Trokut je istostranican!!!"); else printf("\nTrokut je istokracan!!!"); getch(); }

Unesi kordinate trokuta Unesi kordinate tocke A X,Y= 1,0 Unesi kordinate tocke B X,Y= -1,0 Unesi kordinate tocke C X,Y= 0,3 Duljina stranice c je->2.000000 Duljina stranice b je->3.162278 Duljina stranice a je->3.162278 Trokut je istokracan!!!

Page 96: PDF-Programiranje Radni Materijal

94

Zadatak v.2 Unesite koordinate središta te polumjer kruga. Izracunajte koordinate presjecista kruznice i y osi. Ako presjeciste ne postoji ispisite poruku. #include<stdio.h> #include<conio.h> #include<math.h> void main(){ float y1,y2,p,q,r; printf("\nUnesite kooordinate sredista (p,q): "); scanf("%f,%f",&p,&q); printf("\nUnesite polumjer kruga: "); scanf("%f",&r); if((r*r-p*p)<0){ printf("\nPresjeciste ne postoji!!!"); } else if((r*r-p*p)>0){ y1=q+sqrt(r*r-p*p); y2=q-sqrt(r*r-p*p); printf("\nPresjeciste se nalazi u tocki (0,%5.2f) i tocki (0,%5.2f).",y1,y2); } else if((r*r-p*p)==0){ printf("\nDodirna tocka je u (0,%5.2f).",q); } getch(); } Unesite kooordinate sredista (p,q): 0,0 Unesite polumjer kruga: 5 Presjeciste se nalazi u tocki (0, 5.00) i tocki (0,-5.00).

Page 97: PDF-Programiranje Radni Materijal

95

Zadatak v.3 Unesite koordinate prve točke (x1,y1) i druge točke (x2,y2). Odredite koeficijent smjera pravca koji prolazi tim točkama kao i jednadžbu pravca. Zatim zadajte treću točku (x3,y3) i provjerite da li leži na pravcu.

#include <stdio.h> #include <conio.h> #include <math.h> int main(){ float x1,y1,x2,y2,k,l,x,y,g,m; printf ("\nUnesi koordinate 1. tocke X1,Y1= "); scanf ("%f,%f",&x1,&y1); printf ("\nUnesi koordinate 2. tocke: X2,Y2= "); scanf ("%f,%f",&x2,&y2); k = (y2-y1)/(x2-x1); l = y1-(k*x1); printf("\n\nJednadzba pravca je: y = %5.2f * X + %5.2f", k,l); printf ("\n\nUnesite koordinate 3. tocke X3,Y3= "); scanf ("%f,%f",&x,&y); g = y - y1; m = k*(x-x1); if (g==m) printf ("\aTocka lezi na pravcu!!!"); else printf ("\n\aTocka ne lezi na pravcu!!!"); getch(); return 0; }

Unesi koordinate 1. tocke X1,Y1= 0,0 Unesi koordinate 2. tocke: X2,Y2= 2,2 Jednadzba pravca je: y = 1.00 * X + 0.00 Unesite koordinate 3. tocke X3,Y3= 5,5 Tocka lezi na pravcu!!!

Page 98: PDF-Programiranje Radni Materijal

96

Zadatak v.4 Unesite do 20 prirodnih brojeva sa tipkovnice i odredite koji je najmanji, a koji najveći broj u tom nizu. Ispišite niz i granične vrijednosti.

#include <stdio.h> #include <conio.h> int main(){ int niz[20], najm, najv, d, i; clrscr(); do{ printf("Upišite broj elemenata niza (do 20 članova):"); scanf("%d",&d); if(d>20)printf("\nPreveliki niz pokusaj ponovo\n"); }while(d>20); for(i=0;i<d;i++){ printf("\nUpiši %d. clan niza : ",i+1); scanf("%d",&niz[i]); } najm=niz[0]; najv=niz[0]; for(i=0;i<d;i++){ if(najm>niz[i]) najm=niz[i]; if(najv<niz[i]) najv=niz[i]; } printf("\nNiz je:"); for(i=0;i<d;i++){ printf("%d ,",niz[i]); } printf("\nNajmanji član niza je %d, a najveci član niza je %d.", najm, najv); getch(); return 0; }

UpiÜite broj elemenata niza (do 20 clanova):5 UpiÜi 1. clan niza : 5 UpiÜi 2. clan niza : 7 UpiÜi 3. clan niza : 3 UpiÜi 4. clan niza : 1 UpiÜi 5. clan niza : 9 Niz je:5 ,7 ,3 ,1 ,9 , Najmanji clan niza je 1, a najveci clan niza je 9.

Page 99: PDF-Programiranje Radni Materijal

97

Zadatak v.5 Unesite prvi clan aritmetickog niza i njegovu razliku. Zatim unesite broj clanova niza za koji se traži suma niza. Ispišite sumu i taj niz.

#include <stdio.h> #include <conio.h> void main(){ float prvi_cl, razlika, broj_cl, suma=0, i, clan; printf("Unesite prvi clan aritmetickog niza: "); scanf("%f", &prvi_cl); printf("\nUnesite razliku: "); scanf("%f", &razlika); printf("\nUnesite broj clanova niza: "); scanf("%f", &broj_cl); printf("\nClanovi niza su: \n"); clan=prvi_cl; for (i=0; i<broj_cl; i++){ suma+=clan; printf("%6.3f, ",clan); clan+=razlika; } printf("\n a suma niza je: %6.3f!", suma); getch(); }

Unesite prvi clan aritmetickog niza: 0 Unesite razliku: 2 Unesite broj clanova niza: 5 Clanovi niza su: 0.000, 2.000, 4.000, 6.000, 8.000, a suma niza je: 20.000!

Page 100: PDF-Programiranje Radni Materijal

98

Zadatak v.6 Zadajte koeficijent smjera i odsječak na y osi nekog pravca. Zatim odredite drugi pravac koji je okomit na prvi pravac i prolazi točkom (x1,y1) koju unesite sa tipkovnice.

#include <stdio.h> #include <conio.h> void main(){ float k1, l1, k2, l2, x1, y1; clrscr(); printf("Unesite keficijent smjera i odsječak pravca na y osi: "); scanf("%f,%f",&k1,&l1); k2=-1/k1; printf("\nUnesite koordinate točke kojom prolazi okomit pravac (x1,y1)="); scanf("%f,%f",&x1,&y1); l2=-k2*x1+y1; printf("\nPravac okomit na pravac y=%4.2fx + %4.2f je:\n}",k1,l1); printf("\ny=%4.2fx + %4.2f !}",k2,l2); getch(); }

Unesite keficijent smjera i odsjecak pravca na y osi: 1,2 Unesite koordinate tocke kojom prolazi okomit pravac (x1,y1)=1,3 Pravac okomit na pravac y=1.00x + 2.00 je: } y=-1.00x + 4.00 !}

Page 101: PDF-Programiranje Radni Materijal

99

Zadatak v.7 Unesite tekst sa tipkovnice, a zatim odredite koliko ima suglasnika u zadanom tekstu.

#include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h> int main(){ char tekst[80], slovo; int duljina, i; int br_samog=0, br_pun=0, br_br=0, br_razmak=0, br_sug; clrscr(); printf("\nUnesi rečenicu: "); gets(tekst); duljina=strlen(tekst); for (i=0;i<duljina;i++){ slovo=toupper(tekst[i]); if (slovo=='A'||slovo=='E'||slovo=='I'||slovo=='O'||slovo=='U') br_samog++; if (tekst[i]==' ') br_razmak++; if (tekst[i]>=48 && tekst[i]<=57) br_br++; if (tekst[i]==','||tekst[i]=='.'||tekst[i]=='!'||tekst[i]=='?') br_pun++; } br_sug = duljina - br_samog - br_br - br_razmak - br_pun; printf("\nU tekstu ima : "); printf("\n%3d samoglasnika!",br_samog); printf("\n%3d brojeva!",br_br); printf("\n%3d razmaka!",br_razmak); printf("\n%3d ostalih znakova!",br_pun); printf("\n%3d suglasnika!",br_sug); getch(); return 0; }

Unesi recenicu: Ovo je recenica. U tekstu ima : 7 samoglasnika! 0 brojeva! 2 razmaka! 1 ostalih znakova! 6 suglasnika!

Page 102: PDF-Programiranje Radni Materijal

100

Zadatak v.8 Napišite izbornik za kalkulator koji izvršava četiri osnovne aritmetičke operacije +,-,* i /, sa dva broja #include <stdio.h>

#include <conio.h> int main(){ char izbor; float x, y; do { clrscr(); printf("Izaberite: 1. Zbrajanje"); printf("\n 2. Oduzimanje"); printf("\n 3. Množenje"); printf("\n 4. Dijeljenje"); printf("\n 5. Kraj"); printf("\n "); izbor=getche(); if (izbor!='5'){ printf("\n\nUnesi argumente x,y= "); scanf("%f,%f",&x,&y);} switch(izbor){ case '1': printf("%6.2f + %6.2f = %6.2f", x,y,x+y); getch(); break; case '2': printf("%6.2f - %6.2f = %6.2f", x,y,x-y); getch(); break; case '3': printf("%6.2f * %6.2f = %6.2f", x,y,x*y); getch(); break; case '4': printf("%6.2f / %6.2f = %6.2f", x,y,x/y); getch(); break; } } while (izbor!='5'); return 0; }

Izaberite: 1. Zbrajanje 2. Oduzimanje 3. Mno₧enje 4. Dijeljenje 5. Kraj 2 Unesi argumente x,y= 3,5 3.00 - 5.00 = -2.00

Page 103: PDF-Programiranje Radni Materijal

101

Zadatak v.9 Napišite izbornik za izračun površine geometrijskih likova: kvadrata, pravokutnika i trokuta. Kao elementi za izračun unose se duljine stranica likova. #include <stdio.h> #include <conio.h> #include <math.h> int main(){ char izbor; float a, b, c, s, max; do { clrscr(); printf("Povrsina : 1. Kvadrata"); printf("\n 2. Pravokutnika"); printf("\n 3. Trokuta"); printf("\n 4. Kraj"); printf("\n "); izbor=getche(); switch(izbor){ case '1': printf("\nUnesi stranicu kvadrata a= "); scanf("%f",&a); printf("\nPovrsina kvadrata je %6.2f",a*a); getch(); break; case '2': printf("\nUnesi stranice pravokutnika a,b= "); scanf("%f,%f",&a,&b); printf("\nPovrsina pravokutnika je %6.2f",a*b); getch(); break; case '3': printf("\nUnesi stranice trokuta a,b,c= "); scanf("%f,%f,%f",&a,&b,&c); // Ispitivanje da li stranice čine trokut s=(a+b+c)/2; max=a; if (max<b) max=b; if (max<c) max=c; if (max>=s){ printf("\nStranice ne čine trokut!"); getch(); break;} printf("\nPovrsina trokuta je %6.2f",sqrt(s*(s-a)*(s-b)*(s-c)) ); getch(); break; } } while (izbor!='4'); return 0; }

Page 104: PDF-Programiranje Radni Materijal

102

Povrsina : 1. Kvadrata 2. Pravokutnika 3. Trokuta 4. Kraj 3 Unesi stranice trokuta a,b,c= 3,4,5 Povrsina trokuta je 6.00 Zadatak v.10

Napišite program koji ce za unesenu pravokutnu matricu mxn, izracunati zbroj elemenata svakog reda i stupca matrice. #include<stdio.h> #include<conio.h>

int mat[100][100],i,k,j,m,n,suma,suma2; int main(){ printf("...broj redova: "); scanf("%d",&m); printf("...broj stupaca: ");scanf("%d",&n); for(i=0;i<m;i++) for(j=0;j<n;j++){ printf("\t[%d][%d]=",i+1,j+1); scanf("%d",&mat[i][j]); }

printf("\nMATRICA je:\n"); for(i=0;i<m;i++){ printf("\n"); for(j=0;j<n;j++) printf("\t%d",mat[i][j]); } printf("\n"); for(i=0;i<m;i++){ for(j=0;j<n;j++){ suma+=mat[i][j]; } printf("\n%3d. red= ",i+1); printf("%4d",suma); suma=0; } printf("\n"); for(i=0;i<n;i++){ for(j=0;j<m;j++){ suma2+=mat[j][i]; } k++; printf("\n%3d. stupac= ",k); printf("%4d",suma2); suma2=0; } getch(); return 0; }

Page 105: PDF-Programiranje Radni Materijal

103

...broj redova: 3

...broj stupaca: 2 [1][1]=1 [1][2]=2 [2][1]=3 [2][2]=4 [3][1]=5 [3][2]=6 MATRICA je: 1 2 3 4 5 6 1. red= 3 2. red= 7 3. red= 11 1. stupac= 9 2. stupac= 12

Page 106: PDF-Programiranje Radni Materijal

104

Zadatak v.11 Unesite cijeli broj sa tipkovnice kao string od najviše 10 znakova. Zatim izračunajte i ispišite taj broj ne koristeći funkciju atoi. #include <stdio.h> #include <conio.h> #include <string.h> #include <math.h> int main(){ char tekst[10]; int duljina, broj=0, i; clrscr(); do {printf("\nUnesi cijeli broj kao string (najviše 10 znakova)!"); gets(tekst); duljina=strlen(tekst);} while (duljina>10); for (i=0;i<duljina;i++){ broj+=(tekst[i]-48)*pow(10,duljina-i-1); } printf("\nBroj je %d!", broj); getch(); return 0; }

Unesi cijeli broj kao string (najviÜe 10 znakova)!1258 Broj je 1258!

Page 107: PDF-Programiranje Radni Materijal

105

Zadatak v.12 Napišite funkciju koja izračunava volumen i oplošje kugle. U glavnoj funkciji zadajte polumjer i ispišite rezultate. #include <stdio.h> #include <conio.h> #include <string.h> #include <math.h> void kugla(int radius, float *oplosje, float *volumen){ *volumen=4*pow(radius,3)*M_PI/3; *oplosje=4*pow(radius,2)*M_PI; } int main(){ float radius, volumen, oplosje; printf("\n Unesi radius: "); scanf("%f", &radius); kugla(radius,&oplosje,&volumen); printf("\n Oplosje je %.2f a volumen %.2f !",oplosje,volumen); getch(); return 0; }

Unesi radius: 5 Oplosje je 314.16 a volumen 523.60 !

Page 108: PDF-Programiranje Radni Materijal

106

Zadatak v.13 Napišite funkciju koja iz zadanog niza izdvaja podniz određen položajem početnog i krajnjeg znaka u nizu. Niz deklarirajte pokazivačem. U funkiji formirajte novi niz i vratite pokazivač na njega. U glavnoj funkciji unesite izvorni niz te položaj početnog i krajnjeg znaka novog niza (to su argumenti funkcije) i ispišite novoformirani niz.

#include <stdio.h> #include <conio.h> #include <stdlib.h> char * midstr(char *, int, int); int main(){ char *orig_niz, *novi_niz; int poc, kraj; clrscr(); orig_niz=(char *) malloc(30*sizeof(char)); printf("Unesite niz : "); gets(orig_niz); printf("\nUnesite položaj početnog znaka = "); scanf ("%d", &poc); printf("\nUnesite položaj krajnjeg znaka = "); scanf ("%d", &kraj); novi_niz=midstr(orig_niz, poc, kraj); printf("\nNovi niz je :"); puts(novi_niz); getch(); return 0; } char * midstr(char *orig_niz,int poc,int kraj){ char *novi_niz; int i; novi_niz=(char *) malloc((kraj-poc+1+1)*sizeof(char)); for (i=0;i<=kraj-poc;i++) *(novi_niz+i)=*(orig_niz+poc-1+i); *(novi_niz+kraj-poc+1)='\0'; // printf("\nIspis novog niza u funciji:"); // puts(novi_niz); return novi_niz; }

Unesite niz : izdvajanje Unesite polo₧aj pocetnog znaka = 4 Unesite polo₧aj krajnjeg znaka = 6 Novi niz je :vaj

Page 109: PDF-Programiranje Radni Materijal

107

Zadatak v.14 Napišite rekurzivnu funkciju koja izračunava sumu prirodnih brojeva djeljivih sa tri do zadanog (u glavnoj funkciji) prirodnog broja n. U glavnoj funkciji ispišite rezultat. #include <stdio.h> #include <conio.h> int suma3(int); int main(){ int broj, suma; clrscr(); printf("\nUnesi prirodan broj :"); scanf("%d",&broj); if (broj%3==2) broj-=2; else if (broj%3==1) broj--; suma=suma3(broj); printf("\nSuma brojeva djeljivih sa tri do %d je %d !",broj,suma); getch(); return 0; } int suma3(n){ if (n==3) return 3; else return n + suma3(n-3); }

Unesi prirodan broj :9 Suma brojeva djeljivih sa tri do 9 je 18 !

Zadatak v.15 Načinite funkciju koja za unesenu cjelobrojnu matricu izračunava koliko je pozitivnih, negativnih i nul članova. U glavnom programu ispište rezultat!

#include<stdio.h> #include<conio.h> void rez(int mat[100][100],int m, int n, int *poz,int *neg,int *nul){ int i,j; for(i=0;i<m;i++){ for(j=0;j<n;j++){ if(mat[i][j]>0) *poz+=1; if(mat[i][j]<0) (*neg)++; if(mat[i][j]==0)(*nul)++;}} } int main(){ int i,j,m,n,mat[100][100],poz=0,neg=0,nul=0; printf("Broj redova je: ");scanf("%d",&m); printf("\nBroj stupaca je: ");scanf("%d",&n); for(i=0;i<m;i++) for(j=0;j<n;j++){ printf("\nmat[%d][%d]=",i+1,j+1);

Page 110: PDF-Programiranje Radni Materijal

108

scanf("%d",&mat[i][j]); } for(i=0;i<m;i++){ printf("\n\n"); for(j=0;j<n;j++){ printf("\t%d",mat[i][j]); } } rez(mat,m,n,&poz,&neg,&nul); printf("\n\n"); printf("Pozitvnih članova je %d, negativnih %d i nula %d !",poz,neg,nul); getch(); return 0; }

Broj redova je: 3 Broj stupaca je: 2 mat[1][1]=1 mat[1][2]=-1 mat[2][1]=0 mat[2][2]=-2 mat[3][1]=3 mat[3][2]=-4 1 -1 0 -2 3 -4 Pozitvnih clanova je 2, negativnih 3 i nula 1 !

Page 111: PDF-Programiranje Radni Materijal

109

20. ZAKLJUČAK C programski jezik razvijen u firmi AT&T radi razvoja operativnog sistema na računaru DEC PDP 11. Na osovnu tih istraživanja razvijen je Unix. Prvu definiciju jezika dali su Kernigen i Viči 1978., a 1989. na osnovu brojnih verzija C jezika američki institut za standarde objavio je standard ANSI C. C je postao popularan zbog niza prednosti, napravili su ga sami programeri, nema puno ključnih riječi, modularan je, može zamijeniti assembler,…..

Programski jezik C++ je viši programski jezik koji je razvijen za objektno orijentirano programiranje i bio je prvotno razvijen u Bell Labs (Bell laboratorijima pod rukovodstvom Bjarne Stroustrupa tokom 1980-tih kao proširenje programskom jeziku C, te mu je originalno ime bilo "C with classes". Zbog velike potražnje za objektno orijentiranim jezicima te izrazitim sposobnostima, standard za programski jezik C++ ratificiran je 1998. u standardu ISO/IEC 14882.

U proteklih desetak godina, jezik C++ postao je najrasprostranjeniji objektno orijentirani programski jezik. Njegova popularnost zasnovana je uglavnom na raširenosti jezika C, iz kojeg je C++ evoluirao. Međutim, jezik C++ ne predstavlja jednostavnu “nadogradnju” jezika C, kako većina laika smatra. Principi objektno orijentiranog pristupa iziskuju od programera potpuno drugačiji način razmišljanja nego u proceduralnom C-u. Koliko god se “C-veteranima” to činilo suvišnim, današnji složeni programski zadaci, a posebice programiranje za interaktivna sučelja poput Windows-a, iziskuju objektno orijentirani pristup.

Četiri su važna svojstava jezika c++koja ga čine objektno orjentiranim: 1.enkapsulacija (encapsulation) 2.skrivanje podataka (data hiding) 3.nasljeđivanje (inheritance) 4.polimorfizam (polymorphism) Sva svojstva doprinose ostvarenju takozvane objektno orjentirane paradigme programiranja.

Page 112: PDF-Programiranje Radni Materijal

110

21.LITERATURA [1] Herbert Schildt :ANSI C Made Easy,Copyright 1989 McGraw-Hill

[2] Dr.sc.Jadranka Mičić:Programiranje vježbe Programski jezik C,Zagreb 2000

[3] Mr.Goran Trutanić :Programiranje vježbe ,www.tvz.hr

[4] Dr.sc. Nina Lipljin : Programiranje/1, TIVA Tiskara, Varaždin, 2004.