C za 21 dan
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š
ć
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
ć
i
ÆÆÆ
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;
}

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.
U
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
č
eš
ć
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);

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.
Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti