P. 1
c-fesb

c-fesb

|Views: 249|Likes:
Published by Ljubomir Susnja

More info:

Published by: Ljubomir Susnja on Nov 13, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

01/09/2013

pdf

text

original

Sections

FAKULTET ELEKTROTEHNIKE, STROJARSTVA I BRODOGRADNJE SVEUČILIŠTE U SPLITU

(UVOD U) RAČUNALA I PROGRAMIRANJE
Laboratorijske vježbe

Listopad, 2010.

KATEDRA ZA MODELIRANJE I INTELIGENTNE RAČUNALNE SUSTAVE (KaMIS) Laboratorij za robotiku i inteligentne sustave (LaRIS)

Predavanja: dr. sc. Mirjana Bonković, red. prof. dr. sc. Ranko Goić, doc. mr. sc. Ana Kuzmanić Skelin Laboratorijske vježbe: Maja Braović, mag. ing. Bruno Batarelo, dipl. ing. Ante Denić, dipl. ing.

Dodatna literatura za kolegij (Uvod u) Računala i programiranje: 1. Gottfried, B.: "Schaum's Outline Series: Programming with C", Second Edition, McGraw-Hill, 1996. 2. Vulin, R.: "Zbirka riješenih zadataka iz C-a", Školska knjiga, Zagreb, 2003. 3. Parlante, N.: "Essential C", 2003, http://cslibrary.stanford.edu/101/EssentialC.pdf. 4. Materijali dostupni preko MIT OpenCourseWare projekta: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/.

2

VJEŽBA 1 Povijest programskog jezika C Programski jezik C nastao je 1972. godine u Bell laboratorijima, kao rezultat rada računalnog znanstvenika Dennisa Ritchiea. On je prvi kreirao i primijenio programski jezik C.

Slika 1.1. Računalni znanstvenici Ken Thompson (lijevo) i Dennis Ritchie (desno) [1]. Većina bitnih ideja i koncepata koji su korišteni prilikom razvijanja programskog jezika C došlo je iz programskog jezika BCPL (engl. Basic Combined Programming Language), ali samo posredno, preko programskog jezika B kojega je razvio Ken Thompson 1970. godine za prvi UNIX sustav na DEC PDP računalu (engl. Digital Equipment Corporation Programmed Data Processor). Dennis Ritchie i Ken Thompson su 1983. godine nagrađeni Turingovom nagradom (za teoretski rad na području generičkih operacijskih sustava te za implementaciju operacijskog sustava UNIX), što je jedna od najvećih počasti koju računalni znanstvenici mogu dobiti. Zašto C? Programski jezik C je inicijalno dizajniran za implementaciju sistemskog softvera (jezgra UNIX sustava je gotovo u potpunosti napisana u C-u), ali danas se upotrebljava kao jezik opće namjene. To znači da se pomoću njega mogu implementirati ne samo operacijski sustavi, već i računalne igre, driveri, različite aplikacije i sl. Iako danas sve popularniji postaju objektno-orijentirani programski jezici (npr. Java ili C#), C se još uvijek često koristi jer programeru omogućuje veću kontrolu nad programom i obično se takvi programi izvršavaju brže nego njihovi ekvivalenti napisani u nekom od objektno-orijentiranih jezika. C jezik bi se mogao nazvati jezikom niže razine sa stajališta objektno-orijentiranog programera, ali sa stajališta programera koji piše programe u Asembleru (engl. Assembly language) ili (teoretski) u strojnom jeziku (npr. 00010110 01010111 11111000 10000001), bio bi shvaćen kao jezik više 3

source code). Slika 1. 4 . Datoteke u kojima se nalazi objektni kod i biblioteke koje su specificirane u njemu se povezuju u jedinstvenu datoteku pomoću poveznika (engl. te imaju ekstenziju . i može ih biti više od jedne. Datoteke u kojima se nalazi objektni kod sadrže kod razumljiv računalu (strojni kod). 2. Važno je napomenuti da je prevođenje izvornog koda u strojni kod jednosmjeran proces. tj. Datoteke u kojima se nalazi izvorni kod imaju ekstenziju . 3. compiler). Programer napiše izvorni kod programa (engl. Prevoditelj u objektni kod posebno prevede svaku datoteku u kojoj se nalazi izvorni kod. Ta jedinstvena datoteka naziva se izvršna datoteka. Proces kreiranja izvršne datoteke.2.o. linker).c (ako su napisane u C-u). strojni kod se gotovo nikad u potpunosti ne može uspješno prevesti natrag u izvorni kod. Izrazi "jezik niže razine" te "jezik više razine" su dosta relativni i obično jako vezani uz kontekst u kojemu se koriste. i ima ekstenziju . Izvorni kod se prevodi u objektni kod pomoću prevoditelja (engl.obj ili . Kako do izvršne datoteke? Proces stvaranja izvršne datoteke sastoji se od 3 koraka: 1.razine.exe.

Deklaracije svih ovih (i mnogih drugih) funkcija nalaze se u datoteci standard input/output header. Uz ovu naredbu mora stajati parametar oblika <ime_datoteke. te kako bi programeri mogli koristiti već unaprijed isprogramirana rješenja za učestale probleme.. U ovome slučaju funkcija main() vraća nulu. itd. Nakon svake naredbe stavlja se točka zarez ('. i često se nazivaju standardnim bibliotekama.h>. Linija koda int main() kaže da funkcija main() vraća cijeli broj (engl. na početku svakog C programa može se nalaziti više #include naredbi. Ona označava kraj jedne naredbe i početak druge. integer). Prvi program u C-u Slijedeći program je najmanji i najjednostavniji program koji se može napisati u C-u. 5 . za otvaranje i zatvaranje tekstualnih datoteka.').h> #include . } Sve naredbe koje započinju znakom # nazivaju se predprocesorske naredbe. to obično znači da su sve naredbe u njoj uspješno izvršene). U programima se najčešće koriste naredbe za ispis znakova na ekran. Naredba #include se koristi kada se u programu koji se piše trebaju koristiti unaprijed isprogramirane funkcije (posebni dijelovi programskog koda o kojima će biti više govora kasnije). a ne samo jedna. Naravno. int main() { Naredbe napisane u C-u. za unos znakova sa tipkovnice. Program ne radi ništa. Jedina razlika između ove funkcije i svih ostalih jest što će se funkcija main() uvijek izvesti prije svih ostalih funkcija.Ukratko o C programima Opći oblik C programa izgleda ovako: #include <stdio.h (engl.h>. Unutar vitičastih zagrada piše se kod programa.. Takve datoteke imaju ekstenziju . return 0.. Funkcije se koriste kako bi se povećala preglednost programa. Ostale se funkcije moraju pozvati iz funkcije main() da bi se uopće mogle izvršiti. U programskim jezicima često se nailazi na koncept funkcije. i zato se na početku gotovo svakog C programa nalazi naredba #include <stdio. Funkcija main() je glavna funkcija u C jeziku. Na kraju programa se pomoću naredbe return može specificirati vrijednost koju će funkcija vratiti. header file). te koji može primati određene argumente i vratiti određeni argument (ako funkcija vrati nulu. Funkcija je dio programa koji ima svoje ime.. Taj parametar definira ime datoteke u kojoj se nalaze prototipovi ili deklaracije funkcija koje će se koristiti u programu.

h>. to znači da će kursor nakon ispisa teksta na ekran prijeći u novu liniju. U računarstvu se tradicionalno za takav tekst uzima rečenica "Hello World!". Tekst se piše unutar navodnika.h> void main() { } Program također ne radi ništa. varijable su imena koja koristimo za memorijske lokacije na kojima se nalaze vrijednosti s kojima 6 .. Varijable Varijable su memorijske lokacije čija se vrijednost tijekom izvođenja programa može promijeniti. Upotrebu naredbe printf() omogućuje predprocesorska naredba #include <stdio. U biblioteci <stdio. tj. onda bi se gornji program mogao napisati u slijedećem (ekvivalentnom) obliku: #include <stdio.").h> int main() { return 0. } Ako nije potrebno da funkcija vraća neku vrijednost.#include <stdio. a ako se nakon teksta još doda i znak '\n'. bio bi program koji na ekran ispisuje nekakav tekst.h> int main() { printf("Hello World!\n"). se koristi za ispis teksta na ekran računala.h> se nalazi prototip naredbe printf(). Hello World! Najjednostavniji program napisan u bilo kojem programskom jeziku (osim onih programa koji ne rade ništa). Slijedeći program na ekran ispisuje "Hello World!": #include <stdio. } Naredba printf("Neki tekst.. return 0.

što je bitna stvar ako se želi povećati čitljivost 7 . varijabla6 = 7 // a = A // b = A --> u ASCII tablici.radimo. 1 bajt za znak ili 4 bajta za cijeli broj). prije bilo koje izvršne naredbe. int varijabla4 = varijabla1. Na primjer. float varijabla2 = 2. Kaže se da se varijable deklariraju. i to najčešće na početku funkcije. underscore) uvažava se kao slovo. Za razliku od deklaracije varijable. char a = 'A'. varijabla6. char varijabla3 = 'c'. varijabla4.3. int varijabla5. Znak podcrte '_' (engl. // varijabla4 = 5 // varijabla5 = 7. Ovo znači da je deklariran memorijski prostor (imena 'a') u koji će se spremiti cijeli broj. integer) – cijeli broj short – kraći oblik cijelog broja long – duži oblik cijelog broja float (engl. float varijabla3. Varijable moraju biti prijavljene prije upotrebe. character) – znakovni tip int (engl. char varijabla6. char b = 65. te se deklarira potrebna količina memorije (npr. pri čemu prvi znak mora uvijek biti slovo. varijabla2. floating point) – realni broj double – realni broj dvostruke točnosti Različiti tipovi varijabli zauzimaju različite količine memorije. ovako se deklarira cjelobrojna varijabla a: int a. varijabla5. Primjeri deklaracije varijabli: int varijabla1. varijabla5 = varijabla6 = 7. definicija varijable bi varijabli pridružila i neku vrijednost. određuje se da li će varijabla sadržavati znak ili broj). Postoje različiti tipovi varijabli: • • • • • • char (engl. Deklaracijom se varijabli pridružuju ime i tip (npr. Na primjer: int varijabla1 = 5. znak 'A' je predstavljen sa brojem 65 Imena varijabli sastoje se od slova i znamenki.

Operatori u C-u Aritmetički operatori: +. /. y). int $varijabla.h> void main() { int x. int const. > (veće). ++varijabla).programa. jedan je int. x = (int) y. printf("x = %d\n". Relacijski operatori se koriste kod usporedbi. == (jednako). } // prvi znak ne smije biti broj // nisu dozvoljeni razmaci // znak '$' nije dozvoljen – samo slova. <= (manje ili jednako). -. čitav će izraz dobiti konačnu vrijednost po točno određenim pravilima. brojke ili '_' // const je ključna riječ (unaprijed rezervirana) 8 . int druga_varijabla. Ako u programskom kodu naiđemo na operator čiji su operandi različitog tipa (npr. != (nije jednako). Programeri varijablama obično daju imena u nekom od slijedećih formata: int varijabla. Njihova bitna karakteristika je da mogu biti korišteni kao sufiks operatori (npr. a drugi float). te modul operator % (ostatak dijeljenja). int trecaVarijabla. Operator konverzije tipova: cast. Primjeri neispravnih imena varijabli: int 1varijabla. Primjer: #include <stdio. Općenita formula glasi: (tip) izraz. Operatori uvećavanja (inkrementiranja) i umanjivanja (dekrementiranja): ++ i --. *. varijabla++) ili kao prefiks operatori (npr. Relacijski operatori: < (manje). int prva varijabla. char y = 'A'. Cast operator pretvara izraz bilo kojeg tipa u željeni tip. Logički operatori: && (i) i || (ili). >= (veće ili jednako).

Ovi operatori nisu jednaki! Miješanje ovih dvaju operatora je jedna od najčešćih grešaka u programiranju! Ovakva se greška naziva logička greška. Neke od najčešće korištenih funkcija u C-u Neke od najčešće korištenih funkcija u C-u su: printf("%d". argument) scanf("%d". Operatori za manipulaciju bitovima (bitznačajni operatori): • & binarno I (AND) • | binarno ILI (OR) • ^ binarno ekskluzivno ILI (XOR) • ~ jedinični komplement (NOT) • << pomak u lijevo (SHIFT LEFT) • >> pomak u desno (SHIFT RIGHT) Operatori dodjele vrijednosti. Većina binarnih operatora ima odgovarajući operator dodjele vrijednosti po pravilu: izraz1 operator= izraz2. i prevoditelj vas na nju neće upozoriti. a to je 65. a *= b je samo kraći način zapisa izraza a = a * b. Napomena: obratite pozornost na operator dodjele vrijednosti (=) i operator uspoređivanja dviju vrijednosti (==).ISPIS PROGRAMA: x = 65 U gornjem primjeru. &argument) getchar() putchar() toupper(c) tolower(c) ispisuje znak ili niz znakova na ekran prihvaća znak ili niz znakova unesenih sa tipkovnice prihvaća samo jedan znak sa tipkovnice ispisuje samo jedan znak na ekran pretvara mala slova u velika pretvara velika slova u mala 9 . Operator '==' uspoređuje dvije varijable i vraća nulu ili jedinicu. a = 3. ovisno o tome jesu li te varijable jednake. To je ekvivalentno izrazu: izraz1 = (izraz1) operator (izraz2). Na primjer. Operator '=' nekoj varijabli dodjeljuje neku vrijednost. a *= b je ekvivalentno izrazu a = a * b. varijabli x se dodjeljuje ASCII vrijednost varijable y (odnosno znaka A). npr.

com/express/Downloads/. Otvoriti će se prozor koji vas pita želite li skinuti aplikaciju sa interneta.).. Na linku http://www. Otiđite na web stranicu http://www. 5. Pričekajte dok se aplikacija ne instalira (ovo će malo potrajati..microsoft. Integrated Development Environment ili IDE). 2.microsoft. Da biste instalirali MS Visual Studio Express 2010. To je IDE koji se koristi u edukacijske i nekomercijalne svrhe. Pojaviti će se ovakav prozor: 10 .DODATAK Microsoft (MS) Visual Studio 2010 Express Svi programi opisani u vježbama iz kolegija (Uvod u) Računala i programiranje mogu se izvršavati u MS Visual Studio integriranoj razvojnoj okolini (engl. Pokrenite skinutu aplikaciju i slijedite postupak instalacije. IDE je razvojna okolina unutar koje programeri pišu i testiraju svoje programe. 4. Napomena: program koji ste sačuvali je samo aplikacija koja će pokrenuti skidanje MS Visual Studio 2010 Express sa interneta. Kliknite OK. 3.com/express/Downloads/ može se pronaći Microsoft Visual Studio 2010 Express. 6. Odaberite Visual C++ 2010 Express. Odaberite engleski jezik. Pokrenite aplikaciju. slijedite ove upute: 1.

3. slijedite ove upute: 1. Odaberite ime novog projekta (npr. 4. 2. 11 . prviProjekt) i kliknite OK. Pod Application Settings odaberite Console application i Empty project. Kliknite na File --> New --> Project. Odaberite Win32 Console Application. te deselektirajte Precompiled header.Da biste mogli napisati i pokrenuti prvi program u C-u. Otvoriti će se novi prozor imena Win32 Application Wizard.

cpp). Desnim klikom miša kliknite na datoteku imena Source Files. Sa lijeve strane možete vidjeti nekoliko datoteka. Novoj datoteci dodijelite neko ime (npr. Kliknite Add.5. Otvoriti će se upravo kreirana tekstualna datoteka. mojPrviProgram). te odaberite Add --> New Item. Odaberite C++ File (. Kliknite Finish. Otvoriti će se ovakav prozor: 6. 12 .

Ta funkcija čeka na unos znaka sa tipkovnice. prozor sa tekstom Hello World! bi se zatvorio čim bi se program izvršio (gotovo trenutačno). Kliknite Debug --> Build Solution. 9.7. Otvoriti će se slijedeći prozor: 10. 13 . U datoteku upišite slijedeći programski kod: #include <stdio. getchar().h> void main() { printf("Hello World!\n"). } /* program čeka unos znaka sa tipkovnice */ Na kraju programa nalazi se poziv funkcije getchar(). Da se u programu ne nalazi ova linija koda. te ne biste uspjeli vidjeti rezultate programa. 8. pa zatim Debug --> Start Debugging. Vaš program će se izvršiti. Pritisnite Enter da bi zatvorili prozor. Alternativno možete pritisnuti F7 (Build Solution) i F5 (Start Debugging).

Oni označavaju početak i kraj komentara.1. slovo. Popularnost im je pala nakon što su u programiranje uvedeni jednoredni komentari "uvezeni" iz programskog jezika C++. Prednost ovakvih komentara je što programer ne mora paziti na završetak komentara. prevoditelj zanemaruje sve što se nalazi unutar znakova '/*' i '*/'. Komentari su posebno važni kod velikih programa (sa više tisuća linija koda). Njihova zadaća jest da promijene značenje određenih znakova ili simbola (Tablica 2. Na primjer.1). te iza kojih slijedi neki drugi znak. jer programski kod postaje pregledniji i razumljiviji. ili niz brojeva (ako se koristi oktalni ili heksadecimalni zapis).h> void main() { printf("Hello World!\n"). Escape nizovi koji se najčešće koriste u C-u: Tablica 2. backslash). Escape nizovi Znak zvono (upozorenje) Escape niz \a ASCII 007 14 . znak 'n' se tretira na jedan način kada predstavlja ime varijable. a nedostatak je taj što su ograničeni na jedan redak. } /* ispisuje "Hello World!" na ekran */ Prilikom prevođenja programa. // komentar Gornji komentar je jednoredi komentar.VJEŽBA 2 Komentari u C-u #include <stdio. Escape nizovi Kombinacije znakova koje započinju sa znakom '\' (engl. a na drugi način kada se ispred njega nalazi znak '\'. nazivaju se escape nizovi. /* ovo je komentar */ /* i ovo je komentar */ Ovakva vrsta komentara se danas sve rijeđe koristi.

Tablica 2. audible alert) backspace vodoravni tabulator okomiti tabulator novi red ili LF (engl. conversion character). return 0. } // deklariramo cjelobrojnu varijablu a // varijabli a pridružujemo vrijednost 10 // na ekran ispisujemo vrijednost varijable a // funkcija vraća nulu U gornjem se primjeru koristi znak %d. Kada se ispred nekih određenih slova (Tablica 2.. a). On označava tip ili format znaka koji se ispisuje na ekran ili učitava sa tipkovnice (npr. float.). printf("%d\n". int.(engl. Carriage Return) navodnik jednostruki navodnik (apostrof) upitnik backslash null znak \b \t \v \n \f \r \" \' \? \\ \0 008 009 011 010 012 013 034 039 063 092 000 Znakovi pretvorbe #include <stdio. onda slovo predstavlja znak pretvorbe (engl..2. bell code.h> int main() { int a.2) nalazi znak '%'. Znakovi pretvorbe Znak pretvorbe c d e f g i podatak je znak podatak je decimalna cjelobrojna vrijednost s predznakom podatak je realna vrijednost u eksponencijalnoj formi podatak je realna vrijednost bez eksponencijalne forme podatak je realna vrijednost podatak se zapisuje u najkraćoj mogućoj formi (ili f ili e) podatak je decimalna cjelobrojna vrijednost s predznakom Značenje 15 . Line Feed) nova stranica CR (engl. a = 10.

. b).1. string) null znak ('\0') se automatski dodaje na kraj stringa podatak je decimalna vrijednost bez predznaka podatak je heksadecimalna vrijednost. oktalnom ili heksadecimalnom brojevnom sustavu o s u x [. niz brojeva).h> void main() { 16 . Ako je niz veći od minimalne duljine. } Funkcija printf() dozvoljava korištenje ograničenja na minimalnu duljinu niza koji se upisuje (npr. bez vodeće nule podatak je niz znakova (engl. zaokruživanje broja na određeni broj decimala iza decimalne točke). Primjer: #include <stdio. bez vodećeg 0x podatak je niz znakova koji može sadržavati razmake Funkcija printf() Funkcija printf() se koristi za ispis znakova na ekran računala. float b = 5. Funkcija printf() također dozvoljava specifikaciju točnosti nekog broja (npr.] podatak je oktalna vrijednost. a). onda ograničenje nema nikakvog utjecaja na ispis niza.podatak može biti zapisan u dekadskom. // na ekran ispisujemo vrijednost cjelobrojne varijable a printf("Vrijednost varijable a = %d\n". . // program čeka na unos znaka sa tipkovnice getchar(). Primjer: #include <stdio. // na ekran ispisujemo vrijednost realne varijable b printf("Vrijednost varijable b = %f\n". U programerskim krugovima ta je situacija poznata pod imenom "override".h> void main() { int a = 5.

printf("%13g\n\n". printf("%. b). printf("%. printf("%13e\n". // sa tipkovnice se učitava realni broj i sprema se u varijablu b 17 . b). printf("%6g\n". &a). a).678. float b = 345. printf("%3d\n". a).30e\n". float b. } getchar().4f\n".int a = 12345. printf("%16e\n\n". b).h> void main() { int a. b). b). Primjer: #include <stdio. ISPIS PROGRAMA: Funkcija scanf() Funkcija scanf() se koristi za učitavanje znakova sa tipkovnice. b). printf("%10d\n\n". // sa tipkovnice se učitava cijeli broj i sprema se u varijablu a scanf("%d".

&b. funkcija scanf() omogućava postavljanje ograničenja na duljinu niza koji se učitava sa tipkovnice. Da bi funkcija scanf() mogla nekoj varijabli promijeniti vrijednost. onda &ime_varijable predstavlja adresu te varijable.scanf("%f". &b). a.h> void main() { int a. osim ako ih ne pokupi neka druga scanf() funkcija. b. Primjer: #include <stdio. } Unos: 1 2 3 Ispis: a = 1 b = 2 c = 3 Unos: 123 456 789 Ispis: a = 123 b = 456 c = 789 Unos: 123456789 Ispis: a = 123 b = 456 c = 789 Unos: 1234 5678 9 Ispis: a = 123 b = 4 c = 567 Napomena: preostala dva znaka će biti ignorirana. najprije mora znati na kojoj se memorijskoj adresi ta varijabla nalazi. printf("a = %d b = %d c = %d\n". 18 . c). &c). scanf("%3d %3d %3d". b. Kada se ispred imena varijable nalazi znak &. c. Kao i funkcija printf(). &a. } getchar().

printf("\nSizeof(int) = %d". sizeof(double)). printf("\nSizeof(unsigned long) = %d\n". sizeof(float)). double. Kako komentirate rezultate? Rješenje: #include <stdio. unsigned int. } ISPIS PROGRAMA: Zadatak 2. Ispišite vrijednosti varijabli i veličinu memorije koju zauzimaju. byte) za sve standardne tipove programskog jezika C (char.1. sizeof(unsigned int)). printf("\nSizeof(short) = %d". Napišite program u kojem deklarirate integer i char varijablu. unsigned short. Objema pridijelite vrijednost znakovne konstante (primjerice 'c'). printf("\nSizeof(double) = %d". long. printf("\nSizeof(float) = %d".h> void main() 19 . sizeof(unsigned short)). sizeof(short)). printf("\nSizeof(unsigned int) = %d". sizeof(unsigned long)). Napišite program koji ispisuje zauzeće memorije u bajtovima (engl.h> void main () { printf("Sizeof(char) = %d". Rješenje: #include <stdio. Koristite funkciju sizeof(). getchar().2. printf("\nSizeof(long) = %d". printf("\nSizeof(unsigned short) = %d". sizeof(int)). sizeof(long)). sizeof(char)). unsigned long). short. float. int.ZADACI Zadatak 2.

h> void main() { int a = 5. Rješenje: #include <stdio. } Zadatak 2. a za drugi 5 mjesta. printf("vrijednost (i) = %d\n". 20 . int b = 2. Primjer cjelobrojnog i realnog dijeljenja. 'z'. sizeof(int)). Napišite program koji ispisuje znakove 'z' i 'Z'. sizeof(char)). char n = 'c' .h> void main() { printf("Slova:\n%3c\n%5c\n". ISPIS PROGRAMA: Zadatak 2. } getchar(). n).3. printf("vrijednost (n) = %c\n". Kako komentirate rezultate programa? #include <stdio. printf("sizeof(int) = %d\n". printf("vrijednost (n) = %c\n". i). i). printf("sizeof(char) = %d\n".{ int i = 'c'. 'Z'). s tim da su za prvi znak rezervirana 3 mjesta za ispis na ekran.4. getchar(). n). printf("vrijednost (n) = %d\n".

0/2. printf("Popravljeno : 5. printf("Unesite cijeli broj: "). &x). getchar().0/2. Rješenje: #include <stdio.0 = %f i 5.0 = %f\n".0. 5.h> void main() { int x. printf("Za varijable moramo uvesti cast-ing : %f\n". x). printf("Unijeli ste broj: %d\n". Napišite program za unos cijelog broja sa tipkovnice. Neka program ispiše kvadrat tog broja. ISPIS PROGRAMA: Zadatak 2. Napišite program za unos cijelog broja sa tipkovnice. getchar().5. } Zadatak 2. scanf("%d". getchar().6. printf("Uzrok problema : 5/2 = %f\n". 5/2).0). float c = a/b. Rješenje: #include <stdio. 5.int d = 5/2. printf("Moze i : 5/2. vrši se cjelobrojno dijeljenje jer su i a i b cijeli brojevi } printf("c = %f\n".0/2).h> 21 .c). 5/2. // cjelobrojno dijeljenje – rezultat je 2 // Iako je c float. (float)a/(float)b).0/2 = %f \n".

scanf("%d".\n".void main() { int a. printf("Kvadrat broja a je %d. b). printf("Unesite varijablu a.\n"). // sa tipkovnice se učitava varijabla a // u varijablu b ide vrijednost kvadrata broja a } 22 . getchar(). b = a * a. getchar(). &a). b.

Napišite program za unos realnog broja. oduzimanja. Neka program ispiše kvadrat i korijen tog broja. množenja i dijeljenja.DOMAĆI RAD Zadatak 2.8. Napišite program za unos dva realna broja. square root) i definirana je u biblioteci <math.7.9.h>. Napomena: funkcija za računanje korijena je sqrt() (engl. Napišite program koji za proizvoljni radijus računa opseg kruga. Neka program ispiše rezultat njihovog zbrajanja. Zadatak 2. Zadatak 2. 23 .

3.DODATAK ASCII tablica Tablica 2. ASCII tablica 24 .

else printf("Vrijednost varijable b = %d.\n".1. Najčešće se koriste u svrhu grananja programa. 25 . int b = 3.\n". Jedna od najčešće korištenih naredbi za kontrolu toka je if-else konstrukcija.h> void main() { int a = 7. b). tj.1: #include <stdio.VJEŽBA 3 Naredbe kontrole toka Naredbe kontrole toka svoje djelovanje zasnivaju na logičkim izrazima. Grafički prikaz grananja Primjer (if-else konstrukcija): Programsko rješenje za grananje prikazano na slici 3. odabira jedne od nekoliko mogućih radnji. if (a > b) printf("Vrijednost varijable a = %d. If-else konstrukcija općenito ima slijedeću sintaksu: if (logički izraz) naredba1 if (logički izraz) naredba 1 else naredba2 Slika 3. a). getchar().

Umjesto if-else konstrukcije ponekad se može koristiti uvjetni operator. Opći oblik: logički_izraz ? izraz_1 : izraz_2.h> void main() { int a = 7. while i do-while.} ISPIS PROGRAMA: Vrijednost varijable a = 7. Opći oblik programske petlje for: for (inicijalizacija. Program bi u ovom slučaju ispitao vrijednost logičkog izraza. a ako je jednaka nuli izvršio bi se izraz 2. postavlja varijablu b na jedinicu. a ako nije. postavlja varijablu b na nulu. jer ima tri elementa. Zatim ispisuje vrijednost varijable b. uvjet. b). promjena vrijednosti) { blok naredbi } 26 . printf("b = %d \n". } ISPIS PROGRAMA: b=1 Programske petlje Programske petlje se koriste kada se više puta želi ponoviti ista naredba ili blok naredbi. te ako je ta vrijednost jednaka jedinici izvršio bi se izraz 1. Primjer (uvjetni operator): Program provjerava da li je varijabla a veća od nule. Uvjetni operator je ternarni operator. Ako jest. getchar(). U programskom jeziku C postoje tri petlje: for. #include <stdio. int b. (a > 0) ? b = 1 : b = 0.

#include <stdio. Opći oblik programske petlje do-while: do { blok naredbi } while (uvjet). 27 . for (a = 0. a++) printf("%d\n". a). while (a > -1) { printf("%d\n". } getchar(). a). a--. a < 10.h> void main() { int a = 9. } } getchar().Primjer (for petlja): Program ispisuje brojeve od 0 do 9. Opći oblik programske petlje while: while (uvjet) { blok naredbi } Primjer (while petlja): Program ispisuje brojeve od 9 do 0. #include <stdio.h> void main() { int a.

Primjer (do-while petlja): Program ispisuje brojeve od 0-9. getchar(). 28 . } while (a < 10).h> void main() { int a = 0. pa tek nakon prvog izvršavanja provjerava uvjet. a). a++. } Petlje for i while se ne moraju uopće izvršiti (ako uvjet nije ispunjen). #include <stdio. do { printf("%d\n". ali petlja do-while je specifična po tome što se ona uvijek izvrši barem jedan put.

Rješenje: #include <stdio. b).1. Napišite program koji prihvaća i uspoređuje bilo koja dva cijela broja unesena sa tipkovnice. getchar(). getchar(). if (a > b) printf("%d > %d \n". Napišite program koji ispisuje sumu svih brojeva od 1 do 10. a.ZADACI Zadatak 3.2. printf("Unesite prvi broj: "). printf("Unesite drugi broj: ").h> void main() { int i. i++) suma = suma + i. &a). } Zadatak 3. a. i <= 10. 29 . int suma = 0. for (i = 1. b). else printf("%d = %d \n".h> void main() { int a. Rješenje: #include<stdio. Neka se na ekran ispiše rezultat usporedbe tih brojeva. int b. scanf("%d". a). scanf("%d". else if (a < b) printf("%d > %d \n". b. &b).

&a). Program zatim treba ispisati: "Prva varijabla je (ispisati vrijednost). if (b < a) uvjet=0. } getchar(). Zahtjev za unos druge varijable se ponavlja (koristite while petlju) sve dok korisnik ne unese cijeli broj koji je manji od prvog broja. } 30 . s tim da druga varijabla mora biti manja od prve. } printf("Prva varijabla je %d.printf("Suma je %d. int b. a druga je %d. Druga varijabla je manja od prve. scanf("%d"." Rješenje: #include<stdio. printf("Upisite vrijednost prve varijable: "). a druga je (ispisati vrijednost). b).\n". while (uvjet) // ponavlja se sve dok je uvjet jednak jedinici { printf("Upisite vrijednost druge varijable tako da bude MANJA od prve: "). Zadatak 3.h> void main() { int a. Napišite program koji od korisnika traži da unese dvije varijable (tipa int). suma). &b). scanf("%d". getchar(). Druga varijabla je manja od prve. a. int uvjet = 1. getchar().3.\n".

int suma = 0. while (i) printf("%d\n". while (i) printf("%d\n". suma).h> void main() { int i = 5.h> void main() { int i = 5. i++) printf("%d\n".h> void main() { int i.> 2) uvjet = 0. } . while (uvjet) { if (i-.4. i--). } } Rješenja: a) 0 1 2 3 4 d) Izlaz B b) 4 3 2 1 0 e) 4 c) 5 4 3 2 1 f) 4 31 printf("%d\n".i). } f) #include <stdio. if (--i > 4) i = i + 3.Zadatak 3. c) #include <stdio. i = i + 2. } d) #include <stdio. else printf("Izlaz B\n").h> void main() { int i = 5. if (i < 5) printf ("Izlaz A\n"). i). } e) #include <stdio. for (i = 0. printf("%d\n". } b) #include <stdio. i < 5.h> void main() { int i = 5. Što je rezultat izvođenja slijedećih programa? Ispišite sve međurezultate do cilja! a) #include <stdio. --i). suma = suma + i. int uvjet = 1.h> void main() { int i = 5.

a pri svakom pokušaju računalo daje informaciju da li je broj veći.5 i 3.6: U programiranju ne postoje stvarno slučajni brojevi. Napomena: koristite standardne biblioteke <stdlib. izlazi se iz programa. uz ispis pogođenog broja te ukupnog broja pokušaja. kubove i korijene prvih 20 prirodnih brojeva. Napomena: funkcija za računanje korijena je sqrt (engl.8.DODATNI ZADACI Zadatak 3. Generator pseudoslučajnih brojeva će za istu ulaznu vrijednost uvijek generirati iste pseudoslučajne brojeve. te funkcije srand() i rand().7. Ako je broj pogođen. Napišite program koji ispisuje rješenja kvadratne jednadžbe.6. Ako se ne koristi srand(). square root) i nalazi se u standardnoj biblioteci <math.h>. Podsjetnik: ax bxc=0 2 x= −b± b2 −4ac 2a 32 . već samo pseudoslučajni. Zadatak 3.5. Funkcija srand() postavlja inicijalnu vrijednost za generator slučajnih brojeva koji je implementiran u funkciji rand(). Broji se broj pokušaja. manji ili pogođen. Zadatak 3. Napomena vezana uz zadatke 3. Napišite program za pogađanje broja generiranog od strane računala. DOMAĆI RAD Zadatak 3.h>. rand() će izgenerirati uvijek isti niz pseudoslučajnih brojeva [2].h> i <time. Neka korisnik unese koeficijente kvadratne jednadžbe. Napišite program koji generira i ispisuje deset slučajnih brojeva. Napišite program koji pomoću for petlje ispisuje kvadrate.

. default: ..VJEŽBA 4 Naredba switch-case Ako u izvornom kodu postoji posebno dugačak lanac if-else naredbi.. . a ako unese '2'. Opći oblik naredbe switch-case: switch (izraz) { case 'vrijednost izraza 1': . } // izvršava se ako nijedan drugi uvjet nije zadovoljen Primjer (switch-case naredba): Program dozvoljava unos jednoznamenkastog cijelog broja sa tipkovnice. printf("Unesite cijeli broj: ").\n"). printf("Uneseni broj je neparan.. ako korisnik unese broj '1'. Naredba switch-case je preglednije zapisana if-else naredba.\n"). izvrši se neka druga naredba. scanf("%d". neparan ili jednak nuli. break. &a).. 33 . #include <stdio... switch (a) { case 0: case 1: case 3: case 5: case 7: case 9: printf("Uneseni broj je jednak nuli. break. te obaviještava korisnika o tome je li uneseni broj paran. break. izvrši se jedna naredba.. Najčešće se koristi za stvaranje izbornika (engl. Na primjer. menu) [3]. dobra je praksa takve naredbe zamijeniti sa naredbom switch-case. case 'vrijednost izraza 2': .h> void main() { int a.

printf("Uneseni broj je paran.h> void main() { ime_labele: .h> void main() 34 .\n"). Napomena: naredba break se koristi za prekid izvršavanja neke petlje.programski kod. Naredba goto Naredba goto je naredba bezuvjetnog skoka. goto ime_labele. Izvršavanjem naredbe goto program se grana na zadanu programsku liniju [3]..case 2: case 4: case 6: case 8: break. } Primjer (goto naredba): #include <stdio. Ovakva je situacija poznata pod imenom "propadanje" kroz switch-case naredbu (engl.. break. Slično. Opći oblik: #include <stdio. naredba continue se koristi za prekid jedne iteracije neke petlje. getchar(). } getchar().. To znači da će se za sve te case naredbe izvršiti isti blok programskog koda (prvi na koji program naiđe tijekom izvođenja). default: printf("Dozvoljen je unos samo jednoznamenkastih brojeva.. te skok na iduću iteraciju. fallthrough).\n"). } Primijetite da je nakon više case naredbi izostavljena naredba break. break.

a neki je jezici čak i zabranjuju. Sve što se može napraviti sa naredbom goto. } getchar(). budući da ona najčešće smanjuje preglednost i razumljivost programskog koda. if (i == 0) { i = 1. Scotty! Beam me up. Scotty!\n"). // start je ime labele // program skače na labelu start } ISPIS PROGRAMA: Beam me up.{ int i = 0. Scotty! Većina programera izbjegava korištenje goto naredbe. goto start. može se napraviti i sa standardnim petljama u C-u. start: printf("Beam me up. U programskim jezicima više razine ova se naredba gotovo nikad ne koristi. 35 .

4f\n". operator1. scanf("%d %c %d". char operator1. &broj1.h> void main() { int broj1 = 0. break.broj2. broj2. broj2. Koristite naredbu switch-case. case '-': rezultat = broj1 . broj2 = 0. oduzimanja. switch (operator1) { case '+': rezultat = broj1 + broj2. &operator1.1. printf("%d %c %d = %.4f\n". Rješenje: #include <stdio. a program ispisuje rezultat tog izraza. Napišite program koji oponaša rad jednostavnog kalkulatora koji podržava operacije zbrajanja. case '/': if (broj2 == 0) { printf("Greska: dijeljenje sa nulom!\n"). break.4f\n". break. primjerice 9 * 5. printf("%d %c %d = %. broj1. broj2. case '*': rezultat = broj1 * broj2. broj1. broj1. operator1. &broj2). float rezultat. } else { rezultat = (float)broj1 / broj2. break. množenja i dijeljenja. printf("%d %c %d = %. operator1. Korisnik programu zadaje izraz. 36 .ZADACI Zadatak 4. printf("Unesite izraz: \n"). rezultat). rezultat). rezultat).

&y). &x. i++) printf("%d ".h> void main () { int x. program treba ispisati odgovarajuću poruku. operator1. Rješenje: #include <stdio.4f\n". } default: printf("Nepoznata operacija!\n"). scanf("%d %d". te zatim ispisuje tri broja koja se nalaze između njih.2. y. } getchar(). for (i = x + 1. i).x) < 4) { printf("Brojevi su nedovoljno udaljeni!\n"). rezultat). break. broj2. } Zadatak 4. broj1. printf("Unesite dva cijela broja: "). } else { } 37 .printf("%d %c %d = %. getchar(). } else { printf("Brojevi unutar zadanih granica: "). break. oznaka: if (y >= x) { if ((y . i < x + 4. i. Napišite program koji od korisnika traži da unese dva cijela broja. Ako je udaljenost brojeva manja od tri.

getchar(). x = y.3.h> void main() { int broj = 0. int brojac = 10. suma += broj.4.// ako je y > x zamijenimo im vrijednosti int t = x. } Zadatak 4. &broj). Napišite program koji računa n-tu faktorijelu. prosjek). Napišite program u kojem korisnik unosi deset cijelih brojeva (koristite for petlju). int suma = 0. for (i = 0. y = t. 38 . getchar(). i ne može biti veći od 12. } Zadatak 4. Napomena: n se unosi pomoću scanf() funkcije. getchar(). } prosjek = (float)suma/brojac. a program vraća njihovu aritmetičku sredinu. i < brojac. scanf ("%d". float prosjek = 0. printf("Prosjecna vrijednost ovih deset unesenih brojeva iznosi: %f\n". int i. goto oznaka. i++) { printf("Unesite broj: "). } getchar(). Rješenje: #include <stdio.

c). if ((a > 12) || (a < 0)) printf("Niste unijeli ispravan broj.Rješenje: #include <stdio. i++) faktorijela = faktorijela * i. getchar(). Zadatak 4. } printf("%d! = %d\n". } getchar(). } 39 . printf("Unesite pozitivni cijeli broj manji od 13: "). &a). int faktorijela = 1. c. i <= a.h> void main() { int a. Napišite program koji ispisuje cijelu ASCII tablicu. Rješenje: #include <stdio. a. i.5. else if (a == 0) printf("0! = 1\n"). faktorijela).%c\n". c++) printf("%d . c < 128. for(c = 0. getchar(). scanf("%d".\n").h> void main() { int c. else { for (i = 1.

Zadatak 4. Napišite program koji ispisuje sve vrijednosti funkcije y = 15 * x + 76. na ekran ispisuje: * ** *** **** Zadatak 4.9. Koristite switch-case naredbu. (x(in) = x(cm) / 2. Zadatak 4.6. Napišite program koji. program ispisuje "Izvrstan". Ako korisnik unese broj izvan intervala [1. Na primjer. 40 . Napišite program koji zadanu vrijednost duljine u centimetrima pretvara u inche.DODATNI ZADACI Zadatak 4.8.7. program treba ispisati odgovarajuću poruku.54). ako korisnik unese 5. za sve cijele parne brojeve x iz intervala [-7.10. Napišite program koji za učitanu ocjenu ispisuje njezin opis.5]. uz pomoć petlji. 7]. Napišite program koji ispisuje sve parne brojeve iz intervala od 0 do 100. DOMAĆI RAD Zadatak 4.

array). } getchar(). char text[80]. a ime bilo kojeg polja predstavlja adresu prvog elementa u nizu. 5. Polja ili nizovi u programiranju su slični vektorima i matricama u matematici. Primjer deklaracije polja: int x[100]. float n[12]. Polje u memoriji zauzima kontinuirani niz memorijskih lokacija [2]. Polja mogu biti višedimenzionalna. to se radi pomoću indeksiranja. 0. 2. 6.25. printf("%d ". -0. 8. char boja[5] = {'P'.VJEŽBA 5 Polja Kolekcija varijabli istog tipa i zajedničkog imena zove se polje ili niz (engl. 'A'. Primjer: #include <stdio. 'V'. 17}.50. 0. 8. a[0]). 0. 4. Opći oblik glasi: tip ime_polja[izraz]. Ako se želi pristupiti članu nekog niza.h> void main() { int a[] = {1. Primjer inicijalizacije polja: int znamenke[10] = {1. 0}. a deklaracijom polja rezervira se memorija potrebna za njegove članove. 9}. 4. gdje je izraz pozitivni cijeli broj. a[4]). // ispisujemo vrijednost prvog člana niza // ispisujemo vrijednost posljednjeg člana niza // niz od 100 cijelih brojeva // niz od 80 znakova // niz od 12 realnih brojeva ISPIS PROGRAMA: 1 17 41 . 3. float x[6] = {0. 7. 'A'}. 'L'. printf("%d". 7.

string terminator). Ovako to izgleda u memoriji: D X[0] = 'D' X[1] = 'a' X[2] = 'l' X[3] = 'm' X[4] = 'a' X[5] = 'c' X[6] = 'i' X[7] = 'j' X[8] = 'a' X[9] = '\0' Programski kod: #include <stdio. a l m a c i j a \0 42 .Polja znakova Polje znakova (engl. Oznaka kraja niza se računa kao jedan znak. znakovni niz mora imati mjesta za deset znakova. Primjer (polje znakova): Program pohranjuje znakovni niz "Dalmacija" u jednodimenzionalno znakovno polje X. } ISPIS PROGRAMA: Znakovni niz glasi: Dalmacija.\n". Budući da riječ "Dalmacija" ima devet slova. printf("Znakovni niz glasi: %s. X). string) je polje koje se sastoji od niza znakova i koje završava oznakom kraja niza '\0' (engl. getchar().h> void main() { char X[10] = "Dalmacija".

. 6. Grafički prikaz dvodimenzionalnog polja X redak 0 redak 1 redak 2 redak 3 stupac 0 X[0][0] X[1][0] X[2][0] X[3][0] stupac 1 X[0][1] X[1][1] X[2][1] X[3][1] stupac 2 X[0][2] X[1][2] X[2][2] X[3][2] stupac 3 X[0][3] X[1][3] X[2][3] X[3][3] stupac 4 X[0][4] X[1][4] X[2][4] X[3][4] stupac 5 X[0][5] X[1][5] X[2][5] X[3][5] stupac 6 X[0][6] X[1][6] X[2][6] X[3][6] Opći oblik: tip_polja ime_polja [dimenzija_1] [dimenzija_2] .. [dodatne_dimenzije] Primjer deklaracije polja: float tablica[50][50]. Primjer inicijalizacije polja: int a[2][3] = {{1.. int i. 7. 5. 12} }. [dimenzija_n] tip_polja ime_polja [broj_redaka] [broj_stupaca] . j. 6}}. Grafički prikaz dvodimenzionalnog polja: Tablica 5.. i. 3}. polje[i][j]). 8}. i < 3. Primjer (dvodimenzionalno polje): Program ispisuje dvodimenzionalno polje od tri retka i četiri stupca.Višedimenzionalna polja Višedimenzionalna polja su skupovi jednodimenzionalnih polja. j. Primjer nekog višedimenzionalnog polja bila bi matrica. 2. char stranica[24][80]. static double zapisi [x][y][z]. {4. 43 . 4}. {5. {9.1. 3. #include <stdio. j < 4. for (i = 0. 10. 2. j++) printf("Polje [%d][%d] = %d\n".h> void main() { int polje[3][4] = { {1. i++) for (j = 0. 11.

ISPIS PROGRAMA: 44 .} getchar().

h> void main() { int i = 0. niz[i] = a. te ih ispisuje na ekran korištenjem for petlje.ZADACI Zadatak 5. polje[i]). } Zadatak 5. int polje[7]. i+1). i < 7. i++) { printf("Unesite %d. } printf("\n").h> void main() { int i. for (i = 0. Rješenje: #include <stdio. 45 . i < 10. broj: ". &a). int niz[10]. i++) { polje[i] = 0.1.2. int a. Napišite program koji jednodimenzionalno polje od sedam članova inicijalizira na nulu. } getchar(). Napišite program koji učitava niz od deset cijelih brojeva. printf("polje[%d] = %d\n". scanf("%d". Rješenje: #include <stdio. i. for (i = 0.

for (i = 0; i < 10; i++) printf("%d. broj: %d\n", i+1, niz[i]); getchar(); getchar();

}

Zadatak 5.3. Napišite program koji učitava znakovni niz sa tipkovnice i zatim ga ispisuje na ekran. Rješenje: #include <stdio.h> void main() { char niz[80]; printf("Unesite znakovni niz: "); scanf("%s", niz); printf("Upisali ste niz: %s.\n", niz); getchar(); getchar(); // alternativno: gets(niz);

}

Zadatak 5.4. Napišite program za zbrajanje matrica dimenzija 3x3. Matrice inicijalizirajte na proizvoljne vrijednosti unutar programskog koda. Primjer zbrajanja matrica [4]:

Rješenje: #include <stdio.h> void main() { int A[3][3] = {{1, 3, 2}, {1, 0, 0}, {1, 2, 2}}; int B[3][3] = {{0, 0, 5}, {7, 5, 0}, {2, 1, 1}}; int C[3][3]; 46

int i, j; // zbrajanje matrica for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) C[i][j] = A[i][j] + B[i][j]; printf("Rezultat zbrajanja matrica:\n"); for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) { printf("[%d][%d] = %d", i, j, C[i][j]); printf("\n"); } getchar(); getchar(); } ISPIS PROGRAMA:

47

DODATNI ZADACI Zadatak 5.5. Napišite program koji učitava dva niza znakova i ispituje da li su ti nizovi jednaki. Kraj učitavanja niza određen je oznakom za prijelaz u novi redak ('\n'). Zadatak 5.6. Napišite program koji učitava redak teksta i pretvara mala slova u velika. Redak mora biti ograničen na 80 znakova. Napomena: za pretvaranje malih slova u velika koristite funkciju toupper() iz biblioteke <ctype.h>, a za unošenje retka funkciju gets(). DOMAĆI RAD Zadatak 5.7. Napišite program koji učitava ime i prezime korisnika, dob i godinu rođenja, te ispisuje te informacije na ekran. Zadatak 5.8. Napišite program u kojem korisnik unosi niz od deset cijelih brojeva, a program ispisuje njihovu aritmetičku sredinu. Zadatak 5.9. Napišite program za zbrajanje matrica. Elemente matrice unosi korisnik, a svaka matrica može imati najviše 20 redaka i stupaca. Napomena: zbrajati se mogu samo matrice istih dimenzija.

48

prolaz algoritma: • • • • (0 1 2 3 8) --> (0 1 2 3 8) (0 1 2 3 8) --> (0 1 2 3 8) (0 1 2 3 8) --> (0 1 2 3 8) (0 1 2 3 8) --> (0 1 2 3 8) // 0 < 1 --> nema zamjene // 1 < 2 --> nema zamjene // 2 < 3 --> nema zamjene // 3 < 8 --> nema zamjene Iako je niz bio sortiran na kraju drugog prolaza algoritma. Na primjer. U slijedećem primjeru prikazan je način rada bubble sort algoritma. Napomena: podebljani brojevi su oni koji se trenutno uspoređuju. ali ujedno i najsporijih. a u najgorem slučaju O(n2) operacija (u ovom slučaju 25). Vrijeme se poistovjećuje s brojem operacija koje odgovarajući program treba obaviti [5]. Ovo je jedan od najjednostavnijih. Drugim riječima. u najboljem slučaju bi mu bilo potrebno O(n) operacija (u ovom slučaju 5). prolaz algoritma: • • • • (0 1 3 2 8) --> (0 1 3 2 8) (0 1 3 2 8) --> (0 1 3 2 8) (0 1 3 2 8) --> (0 1 2 3 8) (0 1 2 3 8) --> (0 1 2 3 8) // 0 < 1 --> nema zamjene // 1 < 3 --> nema zamjene // 3 > 2 --> zamjena // 3 < 8 --> nema zamjene 3. Order(n)). Ulazni niz brojeva: (0 8 1 3 2). Kako se n povećava. i u slučaju da je prvi broj veći od drugog. algoritama za sortiranje. zamjenjuje im mjesta. za ulazni niz brojeva (0 8 1 3 2). Algoritam u svakom koraku uspoređuje dva susjedna broja. Da bi bubble sort algoritam uspio sortirati taj niz. i izražava se kao funkcija oblika O(n) (engl. Analiza bubble sort algoritma Pod analizom algoritma podrazumijeva se procjena vremena izvršavanja tog algoritma. 1. Upravo zbog ovog 49 .VJEŽBA 6 Bubble sort algoritam Bubble sort algoritam je algoritam za sortiranje članova nekog niza. prolaz algoritma: • • • • (0 8 1 3 2) --> (0 8 1 3 2) (0 8 1 3 2) --> (0 1 8 3 2) (0 1 8 3 2) --> (0 1 3 8 2) (0 1 3 8 2) --> (0 1 3 2 8) // 0 < 8 --> nema zamjene // 8 > 1 --> zamjena // 8 > 3 --> zamjena // 8 > 2 --> zamjena 2. algoritmu je potreban jedan prolaz bez ijedne zamjene da bi bio siguran da je algoritam sortiran. n bi bio jednak pet. najgore vrijeme izvršavanja algoritma eksponencijalno raste. algoritam se je morao još jednom izvršiti da bi "znao" da je niz sortiran.

u najgorem slučaju O(nlogn) – ali su ipak nešto kompliciraniji.problema. bubble sort algoritam nije dobar za sortiranje nizova sa velikim brojem podataka. 50 . Drugi algoritmi kao što su heap sort i mergesort imaju puno bolje vrijeme izvršavanja – u najboljem slučaju O(n).

int n. } } printf("\nSortirani niz:\t "). printf("Koliko brojeva zelite unijeti? "). niz[j] = temp. i < n. i++) printf("%d ".h> void main () { int niz[20]. i++) scanf("%d". } 51 . else if (n == 1) printf("Nije potrebno sortirati niz od samo jednog clana. for (i = 0. Rješenje: #include <stdio. j. Napišite program koji u niz sprema maksimalno 20 cijelih brojeva koje unosi korisnik. for (i = 0. &n).ZADACI Zadatak 6. Program sortira brojeve po veličini i ispisuje sortirani niz. niz[i]). else { printf("\nUpisite clanove niza:\t "). int temp.\n"). j++) { if (niz[i] > niz[j]) { temp = niz[i]. i < n-1. Koristite bubble sort algoritam. for (i = 0. &niz[i]). i < n. if ((n <= 0) || (n > 20)) printf("Morate unijeti broj u rasponu od 1 do 20. j < n.\n"). i++) for (j = i+1. scanf("%d". int i. niz[i] = niz[j].1.

float max. scanf("%f". godina[i]). min. i++) prosjecnaTemperatura = prosjecnaTemperatura + godina[i]. } for (i = 0. 52 . getchar(). minimalnu i prosječnu godišnju temperaturu. float prosjecnaTemperatura = 0. i < 12.2. i. Ispišite maksimalnu. i < 12. i++) { printf("Temperatura za mjesec broj %d: \t". int i. &godina[i]). Pomoću for petlje unesite prosječne mjesečne temperature za jednu godinu.2f\n". i < 12. for (i = 0. getchar(). i+1). Rješenje: #include <stdio. } printf("\n"). } ISPIS PROGRAMA: Zadatak 6.h> void main() { float godina[12].printf("\n"). i++) { printf("Temperatura za mjesec broj %d: \t %. for (i = 0.

i++) { if (max < godina[i]) max = godina[i]. } printf("Maksimalna temperatura: \t %. Napišite program koji učitava proizvoljni broj znakova. min). getchar(). puts("Unesite neki niz znakova:").2f\n".prosjecnaTemperatura = prosjecnaTemperatura / 12. int ostaliZnakovi = 0. while ((znak = getchar()) != '\n') { 53 . Kraj učitavanja niza određen je oznakom za prijelaz u novi redak ('\n').h> void main() { int slova = 0. i < 12. i++) { if (min > godina[i]) min = godina[i]. te ispisuje koliko ima slova. for (i = 1. printf("Minimalna temperatura: \t %. int znak. max). } Zadatak 6. Za unos znakova koristite funkciju getchar().2f\n".3. Rješenje: #include <stdio.2f\n". printf("Prosjecna temperatura: \t %. max = godina[0]. for (i = 1. i < 12. getchar(). int brojevi = 0. } min = godina[0]. prosjecnaTemperatura). brojeva i ostalih znakova.

54 .h> void main() { int slova = 0. while ((znak = getchar()) != '\n') { if ((islower(znak)) || (isupper(znak))) slova++. else if (znak >= '0' && znak <= '9') brojevi++. } printf("Slova: %d\n". else if (isdigit(znak)) brojevi++. puts("Unesite neki niz znakova:"). } getchar(). isdigit(). Koristite funkcije getchar().4. printf("Ostali znakovi: %d\n". int ostaliZnakovi = 0. Uključite biblioteku <ctype. brojevi). printf("Ostali znakovi: %d\n". else ostaliZnakovi++.h> #include <ctype. slova). int brojevi = 0. brojeva i ostalih znakova. slova). Rješenje: #include <stdio.h>. Zadatak 6. printf("Brojevi: %d\n". printf("Brojevi: %d\n". else ostaliZnakovi++. Zadatak je sličan prethodnome. brojevi). te ispisuje koliko ima slova. ostaliZnakovi). ostaliZnakovi). Napišite program koji učitava proizvoljni broj znakova. int znak. } printf("Slova: %d\n".if ((znak >= 'a' && znak <= 'z') || (znak >= 'A' && znak <= 'Z')) slova++. isupper() i islower().

55 .} getchar().

56 .6. te ih u obrnutom redoslijedu sprema u novi niz. Kraj unosa određen je oznakom za prijelaz u novi redak ('\n'). DOMAĆI RAD Zadatak 6. Napišite program koji dozvoljava unos proizvoljnog broja znakova (koristite while petlju i funkciju getchar() za unos znakova). program treba ispisati odgovarajuću poruku. Napomena: prazna mjesta se također broje kao znakovi. te ispisuje samo one koji su parni.7.5. Zadatak 6. Ako u nizu ne postoji nijedan parni broj. Program treba ispisati taj novi niz. Napišite program koji učitava niz od deset cijelih brojeva. Napišite program koji za neku predefiniranu riječ broji koliko ona ima samoglasnika.DODATNI ZADACI Zadatak 6. te tu informaciju ispisuje na ekran.8. Program treba ispisati ukupan broj unesenih znakova. Zadatak 6. Napišite program koji učitava niz od deset cijelih brojeva.

njena vrijednost se preslika u formalni argument u pozvanoj funkciji. } Napomena: lista argumenata može biti i prazna.. tj... koristi se i naziv parametri. Ta naredba također vraća programski tok na mjesto odakle je funkcija pozvana. 57 . Kako funkcija prenosi podatke? Kada se pozove neka funkcija. ona će napraviti kopije argumenata koji su joj predani.) { . Također. tip2 argument2. točno definirane zadaće. funkcija prihvaća skup argumenata (jedan ili više). U isto vrijeme funkcija će osigurati memorijski prostor za eventualnu povratnu vrijednost. jer predstavljaju samo preslike podataka koji su u funkciju poslani iz pozivnog dijela programa. Prijenos argumenata u funkciju Kada se šalje neka varijabla kao stvarni argument u funkciju. Svaki C program sastoji se od jedne ili više funkcija. U pravilu. . Po povratku iz funkcije programski tok nastavlja se tamo odakle je funkcija bila pozvana. Informacija se iz funkcije vraća u pozivni dio programa preko naredbe return. Takav način proslijeđivanja argumenata funkciji nazivamo proslijeđivanjem preko vrijednosti (engl. Ovakav način proslijeđivanja ima svoje prednosti i nedostatke..VJEŽBA 7 Funkcije Funkcija je programski modul koji obavlja neke specifične. a tip povratne informacije može biti void. call by value). Argumenti se unutar funkcije nazivaju i formalnim argumentima. Funkcija izvede programiranu radnju svaki put kad je "pozvana" iz bilo kojeg dijela programa. Argumente koji su u funkciju poslani nazivamo stvarnim argumentima ili parametrima. pri čemu se jedna mora zvati main(). Ako se iz funkcije main() poziva neka druga funkcija. od stvarnih argumenata (parametara) će napraviti formalne. posredno ili neposredno. a vraća samo jednu vrijednost. Sve se ostale funkcije. ili se prije funkcije main() mora nalaziti prototip te funkcije (tijelo funkcije se onda može nalaziti poslije funkcije main()). Od main() funkcije program počinje obradu. Prednost je u tome što argument kroz funkciju ne mijenja svoju vrijednost. pozivaju iz funkcije main(). onda se ta funkcija mora ili definirati prije funkcije main(). Opći oblik: tip_povratne_informacije ime_funkcije (tip1 argument1.

58 . Kako je polje predstavljeno početnom adresom polja. Ako se pak koristi proslijeđivanje preko adrese. Ovakav način proslijeđivanja argumenta funkciji nazivamo proslijeđivanjem preko adrese (engl.1. call by reference). njegova vrijednost se preslika u formalni argument u pozvanoj funkciji. stvarni argumenti mogu biti promijenjeni. ako se koristi proslijeđivanje preko vrijednosti. stvarni argumenti ostaju nepromijenjeni. Kada se šalje polje kao stvarni argument u funkciju.a nedostatak je u tome što se na ovaj način preko argumenata ne može prenijeti informacija natrag iz funkcije. Slika 7. Ukratko. preslikana vrijednost početne adrese pristupa istim podacima. Grafički prikaz prijenosa argumenata u funkciju. Ovakav način proslijeđivanja podrazumijeva da je svaka promjena argumenta u funkciji vidljiva i u dijelu programa koji je funkciju pozvao.

} Rješenje (2. z = x + y. return z. b).h> int zbroji (int. način): #include <stdio. scanf("%d". rezultat). Rješenje (1. getchar(). getchar(). rezultat = zbroji(a. broj: "). int rezultat. z = x + y. } int zbroji (int x. int b. a. Napišite program koji iz funkcije main() poziva funkciju zbroji() i prosljeđuje joj dva proizvoljna cijela broja. način): #include <stdio. printf("Unesite 2.ZADACI Zadatak 7. Funkcija zbroji() mora vratiti rezultat zbrajanja ta dva broja. return z. int). // definicija funkcije zbroji() // prototip funkcije zbroji() 59 .h> int zbroji (int x. int y) { int z.1. scanf("%d". &b). b. printf("Unesite 1. void main() { int a. broj: "). printf("%d + %d = %d\n". int y) { int z. &a).

getchar(). scanf("%d". brojac++) aritmeticka_sredina = aritmeticka_sredina + a[brojac]. &b). b. int b.h> float aritmetickaSredina(int a[]) { float aritmeticka_sredina = 0. Rješenje: #include <stdio. rezultat). i. broj: "). 60 . broj: ").2. scanf("%d". aritmeticka_sredina = aritmeticka_sredina / 10. brojac < 10. printf("Unesite 2. printf("%d + %d = %d\n". Napišite program koji učitava niz od deset cijelih brojeva. &a). int rezultat. int brojac. } Zadatak 7. printf("Unesite 1. for (brojac = 0. a. te zatim proslijeđuje taj niz funkciji koja vraća aritmetičku sredinu članova niza. getchar().} void main() { int a. return aritmeticka_sredina. } void main() { int niz[10]. float rezultat. rezultat = zbroji(a. b).

4f. printf("Aritmeticka sredina clanova niza je %. } printf("\n"). scanf("%c".3.for (i = 0. } void main() { char maloSlovo. i+1).32. &maloSlovo). Rješenje: #include <stdio. velikoSlovo.h> int malo_u_veliko (char x) { int rezultat. printf("Veliko slovo: %c\n". if ((maloSlovo >= 'a') && (maloSlovo <= 'z')) { velikoSlovo = malo_u_veliko(maloSlovo). i < 10. return rezultat. // velika i mala slova su u ASCII tablici udaljeni za 32 znaka rezultat = x . } 61 . printf("Unesite neko malo slovo: "). i++) { printf("Unesite %d. } Zadatak 7. te ga pretvara u veliko slovo pomoću funkcije malo_u_veliko(). Napišite program koji učitava malo slovo. getchar(). getchar(). clan niza: \t". rezultat). &niz[i]). scanf("%d". rezultat = aritmetickaSredina(niz). velikoSlovo).\n".

62 . getchar().else printf("Niste unijeli malo slovo. } getchar().\n").

Zadatak 7. minute i sekunde. Napišite program koji za deset predefiniranih brojeva računa aritmetičku sredinu. ako korisnik unese 3670. sve dok se ne unese 0. Napišite program u kojem korisnik unosi brojčani iznos u kunama. Program treba ispisati koliko je na ispitu bilo pozitivnih (prolaznih). a koliko negativnih (nedovoljnih) ocjena.4. te kolika je bila prosječna ocjena ispita.DODATNI ZADACI Zadatak 7. a program preračunave sekunde u sate. Na primjer. te traži najveći broj u nizu.6.26 kuna). Zadatak 7. 63 . program treba ispisati: 1 sat. Napišite program u kojem korisnik unosi broj sekundi.7. Ocjene izvan dopuštenog raspona ocjena od 1 do 5 se zanemaruju.5. Napišite program u koji korisnik unosi ocjene ispita. DOMAĆI RAD Zadatak 7. a program preračunava kune u eure (1 euro = 7. 1 minuta i 10 sekundi. Preračunavanje se mora obaviti u posebnoj funkciji.

govorimo o imenima varijabli koje koristimo. već ostaju sačuvane u memoriji. Njihov doseg seže od mjesta definicije kroz ostatak programa. Promjena globalne varijable u bilo kojoj funkciji biti će vidljiva u svakom dijelu programa. Registarske varijable Registarske varijable se najčešće koriste za ubrzavanje programskog koda. Lokalne varijable ne zadržavaju vrijednost nakon što programski tok ode iz funkcije u kojoj je varijabla definirana. Ako im se pokuša pristupiti iz neke druge funkcije. Doseg je dio programa unutar kojeg se neka varijabla može koristiti. Statičke varijable Doseg statičkih varijabli. program će javiti grešku. To znači da se statičke varijable ne uništavaju nakon izlaska programskog toka iz neke funkcije.VJEŽBA 8 Doseg funkcije Kada govorimo o dosegu funkcije. Inicijalizacija globalne varijable mora biti inicijalizirana konstantom. kao i doseg lokalnih varijabli. globalne varijable nisu vezane za neku funkciju. a nikako izrazom. Ako programski tok izađe iz funkcije. Čak štoviše. seže samo unutar funkcije u kojoj su definirane. Dvije lokalne varijable u različitim funkcijama s istim imenima nezavisne su jedna od druge. Statičke varijable se označavaju sa ključnom riječi static. statička će varijabla dobiti onu vrijednost koju je imala na izlazu iz funkcije. Globalne (vanjske) varijable Suprotno lokalnim varijablama. To su varijable koje se ne 64 . Sve varijable su lokalne ako se to drugačije ne navede. pa se opet vrati u nju. Varijable se mogu podijeliti na: • • • • lokalne (automatske) globalne (vanjske) statičke registarske Lokalne (automatske) varijable Lokalne (automatske) varijable su prijavljene unutar neke funkcije i vidljive su jedino u toj funkciji. katkad povezuju ne samo funkcije nego i cjelokupni program.

već tijekom čitavog izvođenja programa ostaju u registrima. // da pokušamo ovdje ispisati vrijednost varijable b. #include <stdio.h> void main () { int brojac1 = 1. brojac2).). brojac1).. program bi javio grešku // varijabla b ovdje više ne postoji } Primjer 2. Primjer 1. Označavaju se sa ključnom riječi register. #include <stdio. // brojac2 vise ne postoji // deklariran u UNUTARNJEM bloku brojac2 = %d". brojac1. } while(.moraju spremati i čitati iz memorije. do { int b = 1.. biti će dostupne samo u tome pod-bloku. do { // deklariran u VANJSKOM bloku int brojac2 = 0. printf("\nbrojac1 = %d } while (++brojac1 <= 8). Pokušaj pristupa nekoj od njih izvan tog programskog bloka uzrokovati će grešku.. getchar(). 65 ..h> void main() { int a = 0. printf("\nbrojac1 = %d\n".. Lokalne varijable definirane unutar programskog bloka Ako se lokalne varijable definiraju unutar nekog programskog pod-bloka.programski kod. ++brojac2. ..

++brojac. getchar(). do { int brojac = 0. } while (++brojac <= 8). brojac). printf("brojac = %d\n". } ISPIS PROGRAMA: // ovo je druga varijabla nazvana brojac // ovo se odnosi na UNUTARNJI brojac // ovo mijenja VANJSKI brojac // deklariran u VANJSKOM bloku 66 . #include <stdio. printf("brojac = %d\n".} ISPIS PROGRAMA: Primjer 3. brojac).h> void main() { int brojac = 0.

test(). x). a).ZADACI Zadatak 8.h> void test() { // funkcija test() ne vidi varijablu a // ako se varijabla a pokuša koristiti u ovoj funkciji. printf("Funkcija main(): %d\n". x). void test() { printf("Funkcija test(): %d\n". program će javiti grešku } printf("Funkcija test(): ovdje ne postoji varijabla a\n").h> int x = 7.1. } ISPIS PROGRAMA: Funkcija main(): 2 Funkcija test(): ovdje ne postoji varijabla a // a je lokalna varijabla u funkciji main() Zadatak 8. test(). (Globalne varijable) Proučite i objasnite kako radi slijedeći program: #include <stdio. (Lokalne varijable) Proučite i objasnite kako radi slijedeći program: #include <stdio.2. a = 2. vidljiva u svim funkcijama 67 . getchar(). void main() { int a. } void main() { printf("Funkcija main(): %d\n". } // x je globalna varijabla. getchar().

} ISPIS PROGRAMA: // lokalna varijabla i 68 . } void main() { int i. i++) test().h> int brojac = 1.ISPIS PROGRAMA: Funkcija main(): 7 Funkcija test(): 7 Zadatak 8. i < 10. \t a = %d\n". printf("%d.3. for (i = 0. poziv funkcije test(). (Statičke varijable) Proučite i objasnite kako radi slijedeći program: #include <stdio. brojac. brojac++. // statička varijabla a a = a + 2. a). getchar(). // globalna varijabla brojac void test() { static int a = 0.

Napišite program koji. generira i ispisuje: 1 232 34543 4567654 567898765 67890109876 7890123210987 890123454321098 90123456765432109 DOMAĆI RAD Zadatak 8. Napomena: Fibonaccijev niz je niz brojeva koji započinje sa nulom i jedinicom. Zadatak 8. Napomena: prosti brojevi ili prim-brojevi su svi prirodni brojevi djeljivi bez ostatka samo s brojem 1 i sami sa sobom. a program ispisuje sve proste brojeve koji se nalaze unutar zadanog intervala...5. a svaki slijedeći broj je zbroj prethodna dva. Napišite program koji ispisuje prvih 10 znamenki Fibonaccijevog niza (koristite while ili for petlju). pomoću petlji.7. a veći od broja 1. 69 . Zadatak 8.6. Napišite program u kojem korisnik unosi dva cijela broja.4.DODATNI ZADACI Zadatak 8. Napišite program koji računa sumu svih brojeva od 1 do 100 koji su djeljivi sa 5. Prvih nekoliko znamenki Fibonaccijevog niza: 0 1 1 2 3 5 8 13 21 34 55 89 144 .

Primjeri primjene AND. Tablica istine za ~ operator a 0 1 ~a 1 0 Tablica 9.VJEŽBA 9 Bitznačajni operatori Bit je najmanja jedinica informacije. ili 0 ili 1. Tablica istine za &. a bitznačajni operatori (engl. Bitznačajni operatori: • • • • • • & | ^ ~ << >> binarno I (AND) binarno ILI (OR) binarno ekskluzivno ILI (XOR) jedinični komplement (NOT) pomak u lijevo (SHIFT LEFT) pomak u desno (SHIFT RIGHT) Tablica 9. iako ovo nije formalno pravilo [6]. Bitznačajni operatori se najčešće koriste u kriptografiji i u sažimanju podataka. 70 . a nule jedinice). OR i XOR operatora Primjer (AND): 0010 & 1010 0010 Primjer (OR): 0010 | 1010 1010 Primjer (XOR): 0010 ^ 1010 1000 Jedinični komplement (~) je unarni operator koji se koristi za inverziju bitova nekog operanda (jedinice postaju nule. ^ i | operatore a 0 0 1 1 b 0 1 0 1 a&b 0 0 0 1 a^b 0 1 1 0 a|b 0 1 1 1 Tablica 9. bitwise operators) se koriste za manipulaciju bitovima (odnosno za programiranje na najnižoj mogućoj razini).2.3. Operand se najčešće predstavlja u oktalnoj ili u heksadecimalnoj formi.1.

Primjer: a = 0110 1101 1011 0111 ~a = 1001 0010 0100 1000 (dekadski brojevni sustav – 28087) (dekadski brojevni sustav – 37448)

Bitznačajni pomak u lijevo odgovara množenju operanda sa potencijama broja dva. Na primjer, ako operand pomaknemo za jedno mjesto u lijevo dobiti ćemo isti rezultat kao da smo ga pomnožili sa 2. Primjeri: a = 0110 1101 1011 0111 a << 6 = 0110 1101 1100 0000 a = 0000 a << 1 = 0000 a << 2 = 0000 a << 3 = 0001 a << 4 = 0010 0010 0100 1000 0000 0000 (dekadski brojevni sustav – 28087) (dekadski brojevni sustav – 28096)

(dekadski brojevni sustav – 2) (dekadski brojevni sustav – 4) (dekadski brojevni sustav – 8) (dekadski brojevni sustav – 16) (dekadski brojevni sustav – 32)

Bitznačajni pomak u desno odgovara cjelobrojnom dijeljenju operanda sa potencijama broja dva. Na primjer, ako operand pomaknemo za jedno mjesto u desno dobiti ćemo isti rezultat kao da smo ga podijelili sa 2. Primjeri: a = 0110 1101 1011 0111 a >> 6 = 0000 0001 1011 0110 a = 0100 a >> 1 = 0010 a >> 2 = 0001 a >> 3 = 0000 a >> 4 = 0000 Maskiranje bitova Bitznačajni operator I (AND) se najčešće koristi za maskiranje bitova. Maskiranje bitova je proces važan za računalnu sigurnost, grafiku i kriptografiju. Primjer: a = 0110 1101 1011 0111 maska = 0000 0000 0000 1111 rezultat = 0000 0000 0000 0111 (dekadski brojevni sustav – 28087) (dekadski brojevni sustav – 15) (dekadski brojevni sustav – 7) 0000 0000 0000 1000 0100 (dekadski brojevni sustav – 28087) (dekadski brojevni sustav – 438)

(dekadski brojevni sustav – 64) (dekadski brojevni sustav – 32) (dekadski brojevni sustav – 16) (dekadski brojevni sustav – 8) (dekadski brojevni sustav – 4)

71

#include <stdio.h> void main() { unsigned n = 0x6db7; unsigned maska = 0xF;

// dekadski brojevni sustav - 28087 // dekadski brojevni sustav – 15

// korištenje znaka '#' uzrokuje pojavu znakova '0x' ispred keksadecimalnog broja printf("Vrijednost od n (n = %#x), maskirana sa %#x, je: %#x\n", n, maska, n & maska); } getchar();

72

ZADACI Zadatak 9.1. Napišite program u kojem korisnik unosi neki cijeli broj, a program ispisuje njegov binarni ekvivalent. Rješenje: #include <stdio.h> void main() { int x, i, n, b; printf ("Unesite jedan cijeli broj: "); scanf ("%d", &x); // sizeof(int) vraća broj bajtova koje zauzima int // 8 * sizeof(int) vraća broj bitova koje zauzima int n = 8 * sizeof(x); printf ("Binarni kod je: "); for (i = n-1; i >= 0; i--) { b = (x & (01 << i)) != 0; printf ("%d", b); } printf("\n"); getchar(); getchar(); // od MSB do LSB (od 31. do 0. bita)

}

Pretpostavimo da korisnik unese broj 2 (binarno 00000000 00000000 00000000 00000010). Promotrimo što točno radi linija koda: b = (x & (01 << i)) != 0; U prvom prolazu for petlje, i = 31. Dakle: b = (00000000 00000000 00000000 00000010 & (01 << 31)) != 0; Kada se broj 01 pomakne za 31 mjesto ulijevo, ostaje samo 00. Dakle: b = (00000000 00000000 00000000 00000010 & (00)) != 0; 73

// 13 // 10 // AND for (i = 0. U predzadnjem prolazu for petlje. i = 1. pa je čitav izraz jednak logičkoj nuli. MSB bit ima vrijednost nula." prvo izvrši usporedba (0) != 0. i++) printf("%d". tako da čitavo polje zapravo predstavlja neki binarni broj.1. 0 != 0 nije točno. bit sa težinskom vrijednošću jedan jednak je jedinici. rezultat[i]). rezultat logičke operacije AND je također jednak nuli: 00000000 00000000 00000000 00000010 & 00 = 0. Napomena: != ima veći prioritet od =. pa se tek onda rezultat usporedbe dodijeli varijabli b.0}. Dakle: b = (0) != 0. // OR 74 . Zadatak 9. i++) rezultat[i] = a[i] & b[i].0. int rezultat[4]. // ispisujemo rezultat logickog AND printf("Rezultat AND operacije: ").1. ostane 10. int b[4] = {1.1}. i < 4.Ako je bilo koji od operanada jednak nuli. int i. Kada se broj 01 pomakne za 1 mjesto ulijevo.h> void main() { int a[4] = {1. OR i XOR operatora nad članovima tih nizova. Elementi nizova mogu biti samo binarne znamenke. Rješenje: #include <stdio. Zato se u izrazu "b = (0) != 0. i < 4.2. Dakle: b = (00000000 00000000 00000000 00000010 & (01 << 1)) != 0.0. for (i = 0. Budući da je izraz (00000000 00000000 00000000 00000010 & (10)) != 0 istinit. Napišite program u kojemu su definirana dva cjelobrojna niza. Dakle: b = (00000000 00000000 00000000 00000010 & (10)) != 0. Pokažite djelovanje AND.

&n). // ispisujemo rezultat logickog OR printf("\nRezultat OR operacije: "). i++) rezultat[i] = a[i] ^ b[i]. // ispisujemo rezultat logickog XOR printf("\nRezultat XOR operacije: "). Korisnik unosi redni broj bita čiju vrijednost želi saznati. ((x & (01 << n)) != 0)). i++) rezultat[i] = a[i] | b[i]. rezultat[i]). getchar(). i < 4. } 75 . i < 4. for (i = 0. scanf ("%d". rezultat[i]). ovisno o tome koji se bit nalazi na mjestu kojeg je specificirao korisnik. // dekadski isto 2 printf("Unesite oznaku bita ciju vrijednost zelite procitati: \n"). for (i = 0. i < 4.h> void main () { int x = 0x2. getchar(). int n. i < 4. else printf("Bit na %d. getchar(). Napišite program i definirajte neki cijeli broj u heksadecimalnom obliku. mjestu ima vrijednost: %d \n".for (i = 0. if ((n < 0) || (n >= 32)) printf("Odabrali ste nepostojeci bit!!!\n"). } Zadatak 9.3. i++) printf("%d". Rješenje: #include <stdio. i++) printf("%d". n. // XOR for (i = 0. getchar(). i program vraća nulu ili jedinicu.

Napišite program u kojem korisnik unosi neki cijeli broj.5. Binarni ekvivalent se sprema u niz binarni_ekvivalent[32].4. Napišite program koji za predefinirani cijeli broj ispisuje težinsku vrijednost svakog bita koji je jednak jedinici. 1 23=8 2 0 2 =4 1 2 =2 1 1 2 =1 0 76 . za cijeli broj 11 (binarno 1011). program bi trebao ispisati 1. a program ispisuje njegov binarni ekvivalent. Na primjer.DODATNI ZADACI Zadatak 9. DOMAĆI RAD Zadatak 9. 2 i 8. Postavite sve bitove binarnog ekvivalenta na nulu (koristite XOR operaciju).

uzima se jedinica.DODATAK Pretvaranje iz dekadskog brojevnog sustava u binarni brojevni sustav 15610=? 2 Prvi način (broj u dekadskom brojevnom sustavu se dijeli sa 2. Rješenje bi bilo: 1001 1100. a ostatak dijeljenja se zapisuje u poseban stupac): 156 : 2 = 78 78 : 2 = 39 39 : 2 = 19 19 : 2 = 9 9:2=4 4:2=2 2:2=1 1:2=0 0 0 1 1 1 0 0 1 Rješenje se dobije tako da se ostaci dijeljenja sa 2 napišu obrnutim redoslijedom. ali 64 ne "stane" u 28) (32 je iduća niža potencija broja 2. za binarnu znamenku se uzima nula. Pretvaranje iz binarnog brojevnog sustava u dekadski brojevni sustav 100111002 =?10 MSB 1 2 =128 7 6 LSB 0 2 =64 5 0 2 =32 4 1 2 =16 1 2 =8 3 1 2 =4 2 1 0 2 =2 0 2 0=1 1⋅1280⋅640⋅321⋅161⋅81⋅40⋅20⋅1=1281684=156 77 . ali 32 ne "stane" u 28) (16 je iduća niža potencija broja 2) (8 je iduća niža potencija broja 2) (4 je iduća niža potencija broja 2) (2 je iduća niža potencija broja 2) (1 je iduća niža potencija broja 2) Napomena: ako je rezultat oduzimanja negativan. Drugi način (promatraju se potencije broja 2): 156 – 128 = 28 28 – 64 = -36 28 – 32 = -4 28 – 16 = 12 12 – 8 = 4 4–4=0 0 – 2 = -2 0 – 1 = -1 1 0 0 1 1 1 0 0 (128 je najveća potencija broja 2 koja "stane" u broj 156) (64 je iduća niža potencija broja 2. Ako je rezultat pozitivan.

Pretvaranje iz dekadskog brojevnog sustava u oktalni brojevni sustav 15610=? 8 156 najprije podijelimo sa najvećom potencijom broja 8 koja "stane" u broj 156 (a to je 64). 156 : 16 = 9 12 : 1 = 12 (C) Rezultat: 9C. 156 : 64 = 2 28 : 8 = 3 4:1=4 Rezultat: 234. Pretvaranje iz heksadecimalnog brojevnog sustava u dekadski brojevni sustav 9C16=? 10 9∗16 12∗16 =14412=156 1 0 (ostatak 12) (ostatak 0) 16=16 0 1=16 1 78 . Pretvaranje iz oktalnog brojevnog sustava u dekadski brojevni sustav 234 8=? 10 2∗8 3∗8 4∗8 =128244=156 2 1 0 (ostatak 28) (ostatak 4) (ostatak 0) 64=8 8=81 0 1=8 2 Pretvaranje iz dekadskog brojevnog sustava u heksadecimalni brojevni sustav 15610=? 16 156 najprije podijelimo sa najvećom potencijom broja 16 koja "stane" u broj 156 (a to je 16).

79 . grupiranih tematski u “toolbox-ove”. prethodni izraz pozivamo tipkom gore. Naredbe u MATLABu se upisuju u posljednju.. Na primjer: >> (3^2+4*5)/ (9/2-8^3) <enter> izračunava vrijednost izraza 324⋅5 9 3 . lijevo i desno. dolje. te namijenjenih rješavanju problema vezanih za kontrolu i optimizaciju sustava. MATLAB korisniku pruža velik broj funkcija. prozor povijesti naredbi (engl.1) koji po default-u sadrži naredbeni prozor (engl. Otvoriti će se osnovni prozor MATLAB-a (Slika 10. Pokretanje MATLAB-a Na Windows Desktop-u kliknite na Start --> All Programs --> Matlab --> Matlab. Workspace). Current Directory) i prozor sa sadržajem radnog prostora (engl. MATrix LABoratory) je aplikacija i programski jezik (sličan C-u) za znanstvena istraživanja. aktivnu liniju naredbenog prozora koja počinje sa oznakom '>>'. Nardbe (i operacije) koje se upisuju u komandnu liniju izvršavaju se nakon pritiska na <enter>. −8 2 Pretraživanje i preuređivanje prethodno izvršenih izraza radimo sa 'tipkama-strelicama': gore. Neki od MATLAB-ovih toolbox-ova: • • • • • • • Partial Differential Equation Toolbox Statistics Toolbox Neural Network Toolbox Aerospace Toolbox Image Processing Toolbox Fuzzy Logic Toolbox .. kao i za obradu signala. Command Window). Osnovne operacije MATLAB koristi jednostavnu sintaksu. Na primjer. Command History).VJEŽBA 10 MATLAB MATLAB (engl. prozora tekućih datoteka (engl.

Ukoliko želimo vrijednosti dodijeliti ime (ime konstante). Primjer: pozovimo prethodni izraz i dodijelimo ga konstanti k: >> k = (3^2+4*5)/ (9/2-8^3) <enter> >> k = -0.0571 Ukoliko ne želimo konstantu ispisati na ekran. ali ostaje definirana u programu dok joj se ne dodijeli nova vrijednost.. na kraju izraza upisujemo točka-zarez . 80 .Slika 10. odnosno izraz. ispred izraza napišemo ime i stavljamo znak jednakosti. answer).1. Osnovni prozor MATLAB-a Primijetili ste da se rezultat ispisuje na pod nazivom ans (engl. >> k = (3^2+4*5)/ (9/2-8^3). >> Na taj način konstanta k se ne ispisuje na ekranu.

9. 13. MATLAB poznaje standardne matrične operacije i funkcije kao što su transponiranje. 15. slijedeće naredbe >> B' >> B^2 >> inv(B) >> det(B) određuju odgovarajuću transponiranu matricu B. Matrica je dvodimenzionalno polje brojeva. 7. ili A = [16. 4 15 14 1]. 6. 5 10 11 8.1] naziva se skalar. Napomena: prilikom množenja ili dijeljenja matrica treba voditi računa o uzajamnoj usklađenosti veličine matrica. množenje (*) i dijeljenje (množenje jedne matrice sa inverznom drugom matricom) (/). inverznu matricu B (inverzna matrica se može odrediti i sa B^(-1)) i determinantu matrice B.Matrice i operacije sa matricama Rješavanje nekih problema (pogotovo onih vezanih za matrice i općenito za matematiku). 2. oduzimanje (-). 14. 3. Ovime smo definirali matricu:  16 3 2 13  5 10 11 8   A=   9 6 7 12    4 15 14 1  Napomena: matrice je uobičajeno označavati velikim slovima. C-u). Matrične operacije i funkcije Nad matricama se primjenjuju matematičke operacije kao što su zbrajanje (oznaka je +). 81 . respektivno. 12. potenciranje. 4. Matrica se definira navođenjem njezinih redaka. Primjer definiranja matrice u MATLAB-u: A = [16 3 2 13. 5. 1]. 10. a matrica koja sadrži samo jedan stupac ili samo jedan redak naziva se vektor. i usput osnovni podatak za rad u MATLAB-u. 9 6 7 12. Dva retka se razdvajaju simbolom . nalaženje inverzne matrice i određivanje determinante. Matrica dimenzija [1. 8. puno je jednostavnije i brže u Matlabu nego u nekim drugom programskim jezicima (npr. 11. na kraju retka. kvadrat matrice B. Elementi redaka se razdvajaju zarezom ili praznim mjestom. Na primjer.

Posebne operacije sa matricama Ako su matrice A i B istih dimenzija. 2) >> h = D(3. Primjer: >> D = [9 8 7. % definiramo matricu D % izdvajamo treći stupac matrice D % izdvajamo prvi redak matrice D % izdvajamo prva dva elementa drugog stupca % izdvajamo drugi i treći element trećeg retka 82 . i ukoliko je ⊕ binarna operacija. 3 2 1]. 3) >> f = D(1. Karakteristične posebne operacije (element sa elementom) su: množenje redaka (. Izdvajanje stupaca (redaka) matrice Indeksiranje matrica./) i potenciranje redaka (. >> e = D(:. :) >> g = D(1:2. 6 5 4. 1 2 3]. Na primjer: >> help zeros prikazuje opis naredbe zeros. Varijable se iz MATLAB-ove memorije brišu naredbama clear ime_varijable ili clear all. tada je . te izračunali njihov umnožak.*B % A * B bi generiralo grešku U gornjem smo primjeru definirali matrice A i B. a drugi indeks na stupac.^). Naredbom clc se isprazni komandni ekran. 2:3) Napomene MATLAB razlikuje velika i mala slova. Informacije o pojedinim naredbama se mogu dobiti primjenom naredbe help. Prvi indeks se odnosi na redak. ⊕ posebna operacija koja se može primijeniti na matrice.*). >> B = [1 1 1. dijeljenje redaka (. >> A. 2 2 2]. Bilo koja linija napisana iza znaka '%' predstavlja komentar. odnosno izdvajanje vektora redka ili vektora stupca ili pojedinih elemenata vrši se korištenjem simbola dvotočke ':'. Primjer: >> A = [2 4 6.

Ako se korak eksplicitno ne navede. Dakle. od koeficijenta ispred najvišeg stupnja polinoma do slobodnog elementa. definirajmo vektor na intervalu [0. polinom 2x3 − x 23 se u MATLAB-u definira na slijedeći način: >> a = [2 -1 0 3] Napomena: primijetite da u zadanom polinomu koeficijent uz x ima iznos 0. 4]. Pa možemo zaključiti da je sintaksa ovakvog definiranja vektora: ime_vektora = prvi_element : korak : zadnji_element. 10 je srednji element koji predstavlja korak između dva elementa vektora. 2. >> v2 = [1. Korijeni polinoma se mogu odrediti primjenom naredbe roots. Na primjer. primjenom naredbe poly. Polinomi Polinomi se definiraju preko vektora koeficijenata polinoma. Na primjer. Na primjer: >> roots([1 5 6]) pronalazi korijene polinoma x 2 5x6. 83 . >> x = 0 : 10 : 100. 3. Inverzna naredba roots naredbe je poly. po defaultu iznosi jedan. Na primjer: >> poly([-2 -3]) čime iz zadanih korijena x1 = -2 i x2 = -3 dobivamo polinom x 2 5x6. dobivamo koeficijente polinoma. dok je 100 zadnji element.Vektori Matrica sa jednim retkom ili stupcem predstavlja vektor. rezultat je [0 10 20 30 40 50 60 70 80 90 100] i u konkretnom primjeru. Naime. Na primjer: >> v1 = [1 2 3 4]. 100] sa korakom 10. % matrica sa jednim retkom % matrica sa jednim stupcem MATLAB omogućava definiranje vektora čiji elementi imaju konstantan međusoban razmak. ukoliko znamo korijene polinoma. 0 je početni element vektora.

'opcije') Na primjer: >> x = -1 : 0. Korak u definiranju vektora elemenata je u ovom konkretnom slučaju 0. Alternative MATLAB-u Besplatne alternative MATLAB-u su Octave (http://sourceforge. i s ovim određujemo finoću i preciznost prikaza funkcije.Rješavanje sustava linearnih jednadžbi Rješavanje sustava jednadžbi obavlja se preko operacija sa matricama. 84 .01. Ax=B se može zapisati i na slijedeći način: Rješenje sustava Ax=B bilo bi jednako x =A−1 B .org/products/scilab/download).net/projects/octave/files/) i Scilab (http://www.01 : 1. Najčešće korištena naredba za grafički prikaz funkcija je plot. Pretpostavimo da tražimo rješenje Ax=B sustava. -8] >> X = inv(A)*B Crtanje funkcija MATLAB posjeduje različite funkcije za grafički prikaz dobivenih rezultata. >> plot(x.scilab. sa sintaksom: plot(x. 2 -5] >> B = [7. y. exp(x)+1) crta funkciju e x 1 za −1 ≤ x ≤ 1 u posebnom prozoru. Na primjer. rješenje sustava jednadžbi x + 3y = 7 i 2x – 5y = 8 bilo bi: >> A = [1 3.

B = [3. Definirajte matrice: Izdvojite: a) b) c) d) e) Rješenje: >> M = [-2 3 1.2. 3). 1). 5]. >> b = N(2. 3 3 3]. 2x3y−z=5 Rješenje: A = [1 2 0. :). >> c = O(2:3. 7 4 1]. 3). 1:2). 1 5 6. x = inv(A) * B ISPIS PROGRAMA: 15 -6 7 posljednji stupac matrice M. Zadatak 10. 2 3 2]. >> a = M(:. x 2y=3 2. -1 1 4. >> N = [2 4 8. -1 2 9.ZADACI Zadatak 10.1. prva dva elementa drugog reda matrice N drugi i treći element prvog stupca matrice O drugi redak matrice M prva dva elementa trećeg stupca zbroja matrica M + N 85 . >> O = [1 1 1. >> d = M(2. >> E = M + N. 2 2 2. 7. −x y4z=7 3. >> e = E(1:2. 2 3 -1]. Riješite sustav jednadžbi: 1.

y1. Neka graf funkcije y 1 bude iscrtan žutom bojom. a graf funkcije y 2 zelenom bojom. 7. 1 -1 0 0. Rješenje: y = [-3 4 0 -1 3]. 1 0 0 1]. 1. -1. Rješenje: x = -5 : 0.82767i -0.5.01 : 5. x.50000 0. x = inv(A) * B ISPIS PROGRAMA: -0.*x – 4.50000 Zadatak 10.34243 + 0. plot(x.48680 + 0. roots(y) ISPIS PROGRAMA (Octave): 1. Pronađite korijene polinoma y=−3x 44x3 −x3.01.^3 + 2. 'g') −x 1x 3=1 x 1− x 2=−1 x 2 x 3=1 x 1 x 4=3 86 .00000i 0. Riješite sustav jednadžbi: 4. 6.Zadatak 10.*x. B = [1.34243 – 0.00000i Zadatak 10. 5. 'y'.^2 + 3. Rješenje: A = [-1 0 1 0. Na istoj slici iscrtati grafove funkcija y 1=x 32x 2−4 i y 2=−5x 23.4. y2 = -5.50000 3. sa korakom 0.83832 + 0. y2.50000 0.82767i 0.3.5). 0 1 1 0. 3]. na intervalu (5. y1 = x.

6.02.Zadatak 10. y = exp(x). i neka sve točke na grafu budu označeve kružićima. Neka graf 1e 1 x bude zelene boje.5 : 5. ex Rješenje: x = -5 : 0. na intervalu (-5. Nacrtajte graf funkcije y= Rješenje: x = -5 : 0.5. Napomena: dodatne opcije za crtanje grafa funkcije objašnjene su u dodatku./(1 + exp(1. Nacrtajte graf funkcije y= 1 . '-og') 87 . sa korakom 0. na intervalu (-5.02 : 5. sa korakom 0.5). plot(y./(1 + x)))./(1 + x)))./(1 + exp(1.5).7. plot(y) ex 1e 1 1 x . y = exp(x). Zadatak 10.

Na istoj slici iscrtati grafove funkcija y 1= 88 .9. na intervalu (0. Zadatak 10.8. sa x x korakom 0.10). Neka graf funkcije y 1 bude iscrtan žutom bojom.DOMAĆI RAD Zadatak 10. a graf funkcije y 2 zelenom bojom. Pronađite korijene polinoma y=7x 4 4x 2−6x3.01. sinx cosx i y 2= .

DODATAK VJEŽBI 10 Grafovi U MATLAB-u se može specificirati tip linije kojom se iscrtava graf.2. Tablica 10.' 'none' Tip linije solid line (default) dashed line dotted line dash-dot line no line Tablica 10. te se mogu prikazati oznake za željene točke na grafu.' 'x' 'square' ili 's' 'diamond' ili 'd' '^' 'v' '>' '<' 'pentagram' ili 'p' 'hexagram' ili 'h''' 'none' Tip točke plus sign circle asterisk point cross square diamond upward-pointing triangle downward-pointing triangle right-pointing triangle left-pointing triangle five-pointed star (pentagram) six-pointed star (hexagram) no marker (default) 89 . Tipovi linija u MATLAB-u [7] Oznaka u MATLAB-u '-' '--' ':' '-. Oznake točaka na grafovima u MATLAB-u [7] Oznaka u MATLAB-u '+' 'o' '*' '.1.

naredbom plot(x. a točke na grafu bi bile označeve kružićima ('o').3. Tablica 10. '-.3. Predefinirane boje grafova u MATLAB-u [7] Oznaka u MATLAB-u r g b c m y k w Boja red green blue cyan magenta yellow black white Na primjer. I graf i kružići bi bili crvene boje ('r') [7].or') bi se iscrtao graf sa linijom tipa '-.Boje grafova U MATLAB-u postoji osam predefiniranih boja za grafove. Sve su prikazane u tablici 10. y. dash-dot line). 90 .' (engl.

Digital Equipment Corporation LF – Line Feed LSB – Least Significant Bit MATLAB – MATrix LABoratory MIT – Massachusetts Institute of Technology MSB – Most Significant Bit PDP .Basic Combined Programming Language CR – Carriage Return DEC .POPIS OZNAKA I KRATICA ASCII – American Standard Code for Information Interchange BCPL .Programmed Data Processor 91 .

[3] Vulin. B.LITERATURA [1] "Dennis Ritchie".: "Zbirka riješenih zadataka iz C-a". 1996. M. rujna 2010. skripta.: "Strukture podataka i algoritmi".org/wiki/Matrica_(matematika). 2007. web stranica posjećena 23. 2003.com/help/techdoc/ref/linespec.math. R. [5] Manger. rujna 2010.wikipedia. Sveučilište u Zagrebu. web stranica posjećena 18.html. http://www.wikipedia. 2004. Marušić. N.. 92 .: "Schaum's Outline Series: Programming with C". treće izdanje. Zagreb. http://web. http://hr..net/writings/C-srand. R. [6] Gottfried. [2] Lavicki-Šatović. Prirodoslovno matematički fakultet. Zagreb. Ž.mathworks. web stranica posjećena 15. Školska knjiga.pdf. web stranica posjećena 20. McGraw-Hill. [7] "LineSpec (Line Specification)".org/wiki/Dennis_Ritchie.pdf. [4] "Matrica (matematika)". rujna 2010. http://en.hr/nastava/spa/files/skripta. http://zvrba. rujna 2010. Second Edition. web stranica posjećena 19. rujna 2010. Vrba.: "Library funkcije za slučajne brojeve".

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->