Sadržaj 

                  learnig C in 21                                                                    

GooRoo   

Sadržaj 

                  learnig C in 21                                                                    

GooRoo   

 

a

 
 

Î

 Sadržaj: 

Í

 

 

Æ

Uvod 

Æ

Kratki istorijski razvoj: 

Æ

POJEDINA

Č

NO O JEZICIMA 

Æ

Uvod II 

 

LEKCIJA   1,2&3 ....................................................................................11 

Getting Started with C,  
The Components of a C Program,  
Storing Data: Variables and Constants 

Æ

Izgled C Programa: 

Æ

Funkcija Varijabla 

Æ

Prototip

 

funkcije 

Æ

Printf() 

Æ

Scanf() 

Æ

return: 

Æ

Typedef 

Æ

#define 

Æ

const 

Æ

literal 

 

LEKCIJA   4 ............................................................................................15 

Statements, Expressions, and Operators 

Æ

izraz (expression) 

Æ

C operatori 

Æ

Operator pridruživanja 

Æ

C-ovi unarni matemati

č

ki operatori: 

Æ

C-ovi binarni matemati

č

ki operatori: 

Æ

Pretho

đ

enje (prednja

č

enje) C-ovih matemati

č

kih operatora. 

Æ

C-ovi relacioni operatori 

Æ

If iskaz (statement) 

Æ

Redosljed pretho

đ

enja C relacionih operatora. 

Æ

3 C-ova logi

č

ka operatora 

Æ

Upotreba C-ovih logi

č

kih operatora: 

Æ

Stvarni primjeri u koodu za C-ove logi

č

ke operatore: 

Æ

Primjeri složenih operatora pridruživanja: 

Æ

Prioritet operatora: 

 

LEKCIJA   5 ............................................................................................22 

Functions: The Basics 

Æ

Definisanje funkcije 

Æ

Ilustracija funkcije: 

Æ

Kako funkcije rade: 

Æ

Prototip funkcije: 

Æ

Definisanje funkcije (Function Definition): 

Æ

Primjeri prototipa funkcije (Function Prototype Examples): 

Æ

Primjeri definicije funkcije (Function Definition Examples): 

Æ

Prednosti strukturalnog programiranja 

Æ

Planiranje struktuiranog programa: 

Æ

Pisanje funkcije 

Æ

Zaglavlje funkcije: 

Æ

Povratni tip funkcije (The Function Return Type): 

Æ

 Ime funkcije: 

Æ

 Lista parametara: 

Æ

 Zaglavlje funkcije: 

Æ

 Parametar 

Æ

 Argument 

Æ

 Svaki put kada se funkcija zove, argumenti su proslije

đ

eni funkcijskim 

parametrima!!!! 

Å

 

Æ

 Tijelo funkcije: 

Æ

 Lokalne varijable: 

Æ

 Tri pravila upravljaju upotrebu varijabli u funkciji: 

Æ

 Funkcijski iskazi (statements) 

Æ

 Vra

ć

anje vrijednosti (return) 

Æ

 Prototip funkcije: 

Æ

 Proslje

đ

ivanje argumenta funkciji: 

Æ

Pozivanje funkcije: 

Æ

 Rekurzija: 

 

LEKCIJA   6 ............................................................................................33 

Basic Program Control 

Æ

 Nizovi (Arrays): osnove 

Æ

  FOR iskaz 

Æ

 Gnijez

đ

enje for iskaza 

Æ

While iskaz 

Æ

 do...while petlja 

Æ

 Ugnijez

đ

ene petlje 

 
 
 
 
 
 
 
 

 
LEKCIJA   7 ....................................................................................42 

Osnove Input-a i Output-a 

Æ

 Prikazivanje informacija na ekranu (on-screen) 

Æ

 Printf() funkcija 

Æ

 printf() Format Strings 

Æ

 Naj

č

ć

e korišteni escape sequences (izlazne sekvence): 

Æ

 printf() Escape Sequences 

Æ

 printf() konverzioni specifikatori 

Æ

 printf() Funkcija 

Æ

 Prikazivanje poruka sa puts() 

Æ

 puts() Funkcija 

Æ

 Unošenje numeri

č

kih vrijednosti sa scanf() 

Æ

 scanf() Funkcija 

 
 

LEKCIJA   8 ....................................................................................51 

Using Numeric Arrays   

Æ

 Multidimenzionalni nizovi 

Æ

 Imenovanje i deklaracija nizova 

Æ

 Inicijalizacija nizova 

Æ

 Inicijalizacija multidimenzionalnih nizova 

Æ

 Maximalna veli

č

ina niza 

 

LEKCIJA   9 ....................................................................................59 

Razumijevanje pointera 

Æ

 Memorija vašeg kompjutera 

Æ

 Kreiranje pointer-a 

Æ

 Pointeri i jednostavne varijable 

Æ

 Deklaracija pointera 

Æ

 Inicijalizacija pointera 

Æ

 KoriŠtenje pointera 

Æ

 Pointer tipovi varijabli 

Æ

 Pointeri i nizovi 

Æ

 Ime niza kao pointer 

Æ

 Smještanje elemenata niza 

Æ

 Pointer Arithmetic 

Æ

 Inkrementiranje pointera 

Æ

 Dekrementiranje pointera 

Æ

 Ostale manipulacije pointerima 

Æ

 Oprez s pointerima (Pointer Cautions) 

Æ

 Notacija indexa niza i pointera 

Æ

 Proslje

đ

ivanje niza funkcijama 

 

LEKCIJA 10 ....................................................................................70 

Characters and Strings 

Æ

 char tip podataka 

Æ

 Upotreba Character varijabli 

Æ

 Korištenje (upotreba) stringova 

Æ

 Nizovi karaktera 

Æ

 Inicijalizacija karakternog niiza 

Æ

 Stringovi i pointeri 

Æ

 Stringovi bez nizova 

Æ

 Alokacija string prostora pri kompilaciji 

Æ

 malloc() Funkcija 

Æ

Korištenje  malloc() Funkcije 

Æ

 Prikazivanje stringova i karaktera 

Æ

   puts()   

ÅÅÅ

 Funkcija 

Æ

 printf() Funkcija 

Æ

 

Č

itanje string-ova sa tastature 

Æ

 Unošenje string-ova koriste

ć

ÆÆÆ

   gets()   

ÅÅÅ

 funkciju 

Æ

 gets() Funkcija 

Æ

 Unošenje string-a korištenjem scanf() funkcije 

 

LEKCIJA 11 ....................................................................................84 

Structures 

Å

 

Æ

 Jednostavne strukture 

Æ

 Definisanje i deklaracija struktura 

Æ

 Postoje dva na

č

ina da se deklariše struktura: 

Æ

 Pristupanje 

č

lanovima struktura 

Æ

   struct    

Å

 Klju

č

na rije

č

 

Æ

  Više – Komplexne strukture 

Æ

 Strukture koje sadrže strukture 

Æ

 Strukture koje sadrže niizove 

Æ

 Niizovi struktura 

Æ

 strcpy() bibliote

č

na funkcija kopira jedan string u drugi string.  

Å

 

Æ

 Inicijaliziranje struktura 

Æ

 Strukture i Pointeri 

Æ

 Pointeri kao 

č

lanovi strukture 

Æ

 Pointeri na Strukture 

Æ

 Pointeri i nizovi struktura 

Æ

   Proslje

đ

uju

ć

i strukture kao argumente funkciji   

Å

 

Æ

   Unije   

Å

 

Æ

 Definisanje, deklarisanje i inicijalizacija Unija 

Æ

 Pristupanje 

č

lanovima unije 

Æ

   union   

Å

 Klju

č

na rije

č

 

Æ

 typedef i Strukture 

 
 

 

GuruGru    production    

Æ

    Learning C                                                                                                  use it       GooRoo

 

Learnin C by Guru                                               ******                                      narated and produced by GooRoo

 

 

249

LEKCIJA 18: 

Î

          Getting More from Functions   

Í

 

 

 
Kao što znate do sada, funkcije su centralne za 

C

 programiranje. Danas 

ć

ete nau

č

iti još neke na

č

ine 

kako da koristite funkcije u vašim programima, uklju

č

uju

ć

i: 

 

  Upotreba pointera kao argumenata na funkcije 

 Proslje

đ

ivanje pointera tipa void funkcijama 

  Korištenje funkcija sa varijabilnim brojem argumenata 

 Vra

ć

anje pointera od funkcije 

 
 

ÎÎÎÎ

 Proslje

đ

ivanje pointera funkcijama 

 

Æ

 Default

-ni metod za proslje

đ

ivanje argumenta funkciji je 

po vrijednosti

Proslje

đ

ivanje po vrijednosti (passing by value) zna

č

i da je funkciji proslje

đ

ena kopija vrijednosti 

argumenta. 
Ovaj metod ima tri koraka: 
 

1. 

Procjenjuje se izraz argumenta.  

2. 

Rezultat je kopiran na 

stack

, privremeni smještajni prostor u memoriji. 

3. 

Funkcija vra

ć

a argumentovu vrijednost sa 

stack

-a.  

 
Kada je varijabla proslje

đ

ena funkciji po vrijednosti, funkcija ima pristup vrijednosti varijabli, ali ne i 

oreginalnoj kopiji varijable. Kao rezultat, kood u funkciji ne može promijeniti (modifikovati) oreginalnu 
varijablu. Ovo je glavni razlog zašto je proslje

đ

ivanje po vrijednosti default-ni metod proslje

đ

ivanja 

argumenata: Podaci izvan funkcije su zašti

ć

eni od nepažljive (inadvertent) modifikacije. 

 
Proslje

đ

ivanje argumenata po vrijednosti je mogu

ć

e sa osnovnim tipovima podataka (

char

int

long

float

, i 

double

) i 

struct

urama.  

 

ÆÆ

 Postoji još jedan na

č

in proslje

đ

ivanja argumenta funkciji, ipak: proslje

đ

ivaju

ć

i pointer  varijabli 

argumenta, radije nego vrijednost same varijable. Ovaj metod proslje

đ

ivanja argumenta se naziva 

proslje

đ

ivanje po referenci 

(passing by reference). 

 
Kao što ste nau

č

ili Dana 9, (“Understanding Pointers"), proslje

đ

ivanje po referenci je jedini na

č

in da 

prosljedite niz ka funkciji; proslje

đ

ivanje niza po vrijednosti nije mogu

ć

e. 

Sa ostalim tipovima podataka, ipak vi možete koristiti bilo koji metod. 
Ako vaš program koristi velike strukture, njihovo proslje

đ

ivanje po vrijednosti može prouzrokovati da 

nestane prostora na stack-u. 
Pored ove opaske, proslje

đ

ivanje argumenta po referenci, umjesto po vrijednosti, obezbje

đ

uje kako 

prednosti tako i nedostatke: 
 

 Prednost 

proslje

đ

ivanja po referenci je da funkcija može modifikovati (mijenjati) vrijednost 

varijablu argumenta. 

 Nedostatak 

proslje

đ

ivanja po referenci je da funkcija može modifikovati (mijenjati) vrijednost 

varijablu argumenta. 

 
“Ša ba?”, možda se pitate. “

Prednost koja je ujedno i nedostatak??

” DA. Sve zavisi od situacije. 

Ako je vašem programu potrebno da funkcija modifikuje varijablu argumenta, proslje

đ

ivanje po 

referenci je prednost. 
Ako ne postoji takva potreba, ona je nedostatak zbog mogu

ć

nosti nepažljive modifikacije. 

 
Možda se pitate zašto ne koristite povratnu vrijednost funkcije za modifikovanje varijable argumenta.  
Vi možete uraditi to, naravno, kako je pokazano u sljede

ć

em primjeru: 

x = half(x); 

int half(int y) 

return y/2; 

background image

GuruGru    production    

Æ

    Learning C                                                                                                  use it       GooRoo

 

Learnin C by Guru                                               ******                                      narated and produced by GooRoo

 

 

251

ANALIZA: 

Ovaj program demonstrira razliku izme

đ

u proslje

đ

ivanja varijabli po vrijednosti i njihovo 

proslje

đ

ivanje po referenci. 

Linije 

5

 i 

6

 sadrže prototipe za dvije funkcije koje su pozivane u ovom programu. Primjetite da linija 

5

 

opisuje tri argumenta tipa 

int

 za 

by_value()

 funkciju, ali se 

by_ref()

 razlikuje u liniji 

6

 zato što zahtjeva 

tri pointera na varijable tipa 

int

 kao argumente. 

Zaglavlja funkcija, za ove dvije funkcije u linijama 

26

 i 

33

 slijede isto format kao i prototipi. Tijela dviju 

funkcija su sli

č

na, ali ne i ista. Obje funkcije pridružuju 

0

 na tri varijable koje su proslje

đ

ene njima. 

by_value()

 funkciji, 

0

 se pridružuje direktno na varijable. U 

by_ref()

 funkciji, korišteni su pointeri, 

tako da varijable moraju biti dereferencirane (razvezane (odvojene)). 
 
Svaka funkcija se poziva jednom od 

main()

-a. Prvo, trima varijablama, koje se proslje

đ

uju, su 

pridružene vrijednosti razli

č

ite od 

0

 u liniji 

10

Linija 

12

 printa tri vrijednosti na-ekran. 

Linija 

15 

poziva prvu od dvije funkcije, 

by_value()

Linija 

17

 printa ponovo tri varijable. 

Primjetite da se one nisu promjenile. 

by_value()

 je primila varijable po vrijednosti, tako da nije mogla 

promjeniti njihov oreginalan sadržaj. 
Linija 

20

 poziva 

by_ref()

, i linija 

22

 printa vrijednosti ponovo. Ovaj put, sve vrijednosti su promijenjene 

na 

0

Proslje

đ

ivanje varijabli po referenci je dalo 

by_ref()

 pristup na stvarni sadržaj u varijablama. 

 
Vi možete napisati funkciju koja prima (prihvata) neke argumente po referenci i ostale po vrijednosti. 
Samo zapamtite da ih držite pravo unutar funkcije, koriste

ć

i indirektni operator(

*

) (operator indirekcije) 

da razdvojite argumente proslje

đ

ene po referenci. 

 
 
 

NE

 proslje

đ

ujte velike koli

č

ine podataka po vrijednosti ako nije neophodno. Može vam nestati 

prostora na stack-u. 

PROSLJE

Đ

UJTE

 varijable po vrijednosti ako ne želite da se oreginalna vrijednost promjeni. 

NE

 zaboravite da varijabla proslje

đ

ena po referenci treba biti pointer. Tako

đ

e, koristite 

indirektni operator da razdvojite (dereferencirate) varijable u funkciji. 
 
 
 

ÎÎÎÎ

 Pointeri Tipa void 

 
Vidjeli ste da je klju

č

na rije

č

 

void

 korištena da navede ili da funkcija ne uzima argumente ili da ne 

vra

ć

a vrijednost. 

 
Klju

č

na rije

č

 

void

 tako

đ

e može biti korištena za kreiranje svojstvenog (generic) pointera 

ÆÆÆ

 pointer 

koji može pokazivati na objekat bilo kojeg tipa podataka. 

ÅÅÅ

 

 
Na primjer, iskaz: 
 

 void 

*x; 

 
deklariše 

x

 kao svojstveni (generic) pointer.  

x

 pokazuje na nešto; samo još niste naveli na šta. 

 
Naj

č

ć

a upotreba pointeera tipa 

void

 je u deklaraciji parametara funkcije. Vi možda želite da kreirate 

funkciju koja može raditi sa razli

č

itim tipovima argumenata. Vi ga možete proslijediti jednom kao tip 

int

, sljede

ć

i put tip 

float

, itd. Deklarišu

ć

i da funkcija uzima 

void

 pointer kao argument, vi se ne 

ograni

č

avate na prihvatanje samo jednog tipa podataka. Ako deklarišete funkciju da uzima 

void

 

pointer kao argument, vi možete proslijediti funkciji pointer na bilo šta. 
 
 
 
 
 

GuruGru    production    

Æ

    Learning C                                                                                                  use it       GooRoo

 

Learnin C by Guru                                               ******                                      narated and produced by GooRoo

 

 

252

Evo jednostavnog primjera: Vi želite funkciju koja prihvata numeri

č

ku varijablu kao argument i dijeli je 

sa 

2

, vra

ć

aju

ć

i odgovor u varijabli argumenta. Tako da, ako varijabla 

x

 drži vrijednost 

4

, nakon poziva 

do 

half(x)

, varijabla 

x

 je jednaka sa 

2

. Zato što želite da modifikujete argument, vi ga proslje

đ

ujete po 

referenci. Zato što želite da koristite funkciju sa bilo kojim od 

C

-ovih numeri

č

kih tipova podataka, vi 

deklarišete funkciju da uzima 

void

 pointer: 

 

 

void half(void *x); 

 
Sad možete pozvati funkciju, proslje

đ

uju

ć

i joj bilo koji pointer kao argument.  

Ipak, postoji još jedna stvar koju trebate. Iako možete proslijediti 

void

 pointer bez da znate na koji tip 

podataka on pokazuje, vi ne možete razdvajati (dereferencirati) pointer. Prije nego što kood u funkciji 
može uraditi nešto sa pointerom, on mora da zna njegov tip podataka.  
Ovo radite sa 

ÆÆÆ

   

typecast 

  

ÅÅÅ

, što nije ništa više nego na

č

in kako da kažete programu da 

tretira ovaj void pointer kao pointer na 

type

. Ako je 

x void

 pointer, vi 

typecast

 kako slijedi: 

 

 (type 

*)x 

 
Ovdje, 

type

 je odgovaraju

ć

i tip podataka. Da kažete programu da je 

x

 pointer na tip 

int

, napišite: 

 

 

 (int *)x 

 
Da radvojite pointer  

Æ

  tj. da pristupite 

int

-u na koji pokazuje 

x

 

Æ

 napišite: 

 
 *(int 

*)x 

 
 

typecast

s se detaljnije rade Dana 20. 

Vra

ć

aju

ć

i se na oreginalnu temu (proslje

đ

ivanje 

void

 pointera funkciji), možete vidjeti da, da koristite 

pointer, funkcija mora da zna tip podataka na koji on pokazuje. U slu

č

aju funkcije koju vi pišete da 

podijelite njen argument sa dva, postoje 

č

etiri mogu

ć

nosti za type: 

int

long

float

 i 

double

. S 

dodatkom na 

void

 pointer na varijablu koja se dijeli sa dva, vi morate re

ć

i funkciji tip varijable na koju 

pokazuje 

void

 pointer. 

Možete modifikovati definiciju funkcije kako slijedi: 
 

 

void half(void *x, char type); 

 
Na osnovu tipa argumenta, funkcija prebacuje 

void

 pointer 

x

 na odgovaraju

ć

i tip. Onda pointer može 

biti razdvojen (dereferenciran), i vrijednost varijable na koju pokazuje može biti korištena. Kona

č

na 

(finalna) verzija funkcije je pokazana u Listingu 

18.2

 
Listing 18.2. Korištenje void pointera da se proslijede razli

č

iti tipovi podataka funkciji. 

1: /* Upotreba pointera tipa void. */ 

2: 

3: #include <stdio.h> 
4: 
5: void half(void *x, char type); 
6: 

7: main() 
8: { 
9:     /* Inicijaliziraj jednu varijablu od svakog tipa. */ 
10: 
11:     int i = 20; 

12:     long l = 100000; 
13:     float f = 12.456; 
14:     double d = 123.044444; 
15: 
16:     /* Prikazi njihove inicijalne vrijednosti. */ 

17: 
18:     printf(" %d", i); 
19:     printf(" %ld", l); 

20:     printf(" %f", f); 

background image

GuruGru    production    

Æ

    Learning C                                                                                                  use it       GooRoo

 

Learnin C by Guru                                               ******                                      narated and produced by GooRoo

 

 

254

 
Možda mislite da bi potreba za proslje

đ

ivanjem varijable na koju pokazuje (pointed-to variable) mogla 

funkciju u

č

initi manje flexibilnom. Funkcija bi bila uopštenija kada ne bi morala znati tip podataka 

objekta na koji se pokazuje (pointed-to data object), ali tako ne radi 

C

.  

Vi uvijek morate prebaciti (cast) 

void

 pointer na navedeni tip prije nego što razdvojite 

(dereferencirate). Uzimaju

ć

i ovaj pristup, vi pišete samo jednu funkciju. Ako ne koristite 

void

 pointer, 

morali biste napisati 

č

etiri posebne funkcije 

Æ

 po jednu za svaki tip podataka. 

 
Kada trebate funkciju koja može da radi sa razli

č

itim tipovima podataka, vi 

č

esto možete napisati 

makro

 umjesto funkcije. Primjer koji je upravo predstavljen 

Æ

 u kojem je posao koji je odradila 

funkcija relativno jednostavan 

Å

 bi bio dobar kandidat za 

makro

. (Dan 21 pokriva makroe). 

 
 
 

PREBACITE

 

(cast) 

   

void

 pointer kada koristite vrijednost na koju on pokazuje. 

NE

 pokušavajte da inkrementirate ili dekrementirate 

void

 pointer. 

 
 
 

ÆÆÆ

 Funkcije koje imaju varijabilan broj argumenata 

 
Vi ste koristili nekoliko bibliote

č

nih funkcija, kao što su 

printf()

 i 

scanf()

, koje uzimaju varijabilan broj 

argumenata. Vi možete pisati vlastite funkcije koje uzimaju varijabilnu listu argumenata.  
Programi koji imaju funkcije sa varijabilnim argumentnim listama  moraju uklju

č

ivati file zaglavlja 

ÆÆÆ

   

STDARG.H

   

ÅÅÅ

 
Kada deklarišete funkciju koja uzima varijabilnu listu argumenata, vi prvo listate fixne parametre 

Æ

 

one koji su uvijek prisutni (mora postojati bar jedan fixni parametar). Onda uklju

č

ite (include) ellipsis 

(

) na kraju liste parametara da indicirate da se nula ili više dodatnih argumenata proslje

đ

uje funkciji. 

Tokom ove diskusije, sjetite se razlike izme

đ

u parametara i argumenta, kao što je objašnjeno Dana 5, 

“Functions: The Basics”. 
 

Æ

 

Kako funkcija zna koliko joj je argumenata proslje

đ

eno na navedeni poziv (specific call)??? 

VI JOJ KAŽETE. Jedan od fixnih parametara obavještava funkciji ukupni broj argumenata. Na primjer, 
kada koristite 

printf()

 funkciju, broj konverzionih specifikatora u format stringu govori funkciji koliko 

dodatnih argumenata da o

č

ekuje. Preciznije, jedan od funkcijskih fixnih argumenata može biti broj 

dodatnih argumenata.  
Primjer kojeg 

ć

ete vidjeti uskoro koristi ovaj pristup, ali prvo treba da pogledate alate koje 

C

 

obezbje

đ

uje za rad sa varijabilnom listom argumenata. 

 
Funkcija tako

đ

e mora znati tip od svakog argumenta u varijabilnoj listi.  

U slu

č

aju za 

printf()

, konverzioni specifikatori indiciraju tip svakog argumenta. U ostalim slu

č

ajevima, 

kao što je sljede

ć

i primjer, svi argumenti u varijabilnoj listi su istog tipa, tako da nema problema. 

Da kreirate funkciju koja prihvata razli

č

ite tipove u varijabilnoj listi argumenata, vi morate smisliti 

(razviti (devise)) metod proslje

đ

ivanja informacija o tipovima argumenata. Na primjer, vi možete 

koristiti karakterni kood, kao što je bilo ura

đ

eno za funkciju 

half()

 u Listingu 

18.2

 
Alati za korištenje varijabilne liste argumenata su definisani u 

STDARG.H

. Ovi alati su koriste unutar 

funkcije da dobiju (retrieve) argumente u varijabinoj listi. 
Oni su kako slijedi: 
 

va_list 

Pointer tipa podataka (A pointer data type). 

va_start() 

Makro korišten za inicijalizaciju argumentne liste. 

va_arg() 

Makro korišten da dobije (retrieve) svaki argument, u povratku, iz varijabilne liste. 

va_end() 

Makro korišten za “

č

is

ć

enje” kada su dobijeni (retrieved ) svi argumenti. 

 
 
 
 

Želiš da pročitaš svih 316 strana?

Prijavi se i preuzmi ceo dokument.

Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.

Slični dokumenti