Professional Documents
Culture Documents
Programski jezik C
www.maturski.org
O programskom jeziku C
C programski jezik spada u proceduralne programske jezike koji je razvijen u ranim 70-im
godinama 20. stoljea. Autor ovog programskog jezika je Dennis Ritchie, no znaajan
doprinos nastanku C-a dali su Ken Thompson kao autor programskog jezika B i Martin
Richards, autor programskog jezika BCPL. Dennis Ritchie je stvorio ovaj programski jezik za
rjeavanje praktinih problema kodiranja sistemskih programa i jezgre operativnog sistema
UNIX, koji je praktiki u cijelosti napisan u C-u.
Programski jezik C dosta se mijenjao tokom godina te je u vie navrata neformalno i formalno
standardiziran. Prva vanija verzija poznata je pod nazivom "K&R C", to je engl. kratica
prezimena dvaju autora najpoznatijeg C prirunika "The C Programming Language", a to su
Brian Kernighan i Dennis Ritchie. Prvo izdanje te vrlo saeto i precizno pisane knjige koje
datira iz 1978. godine ujedno je de facto standardiziralo jezik u 70-ima. Drugo izdanje iz
1988. godine opisuje "ANSI C", standard kojeg je 1983. godine definirao ameriki nacionalni
institut za standardizaciju, a koji je i danas najbolje podran. Aktualni ISO/IEC standard
skraeno poznat kao "C99" podrava u cijelosti samo jedan manji dio komercijalnih
proizvoaa softvera.
Mnogobrojni problemi vezani prije svega za upravljanje memorijom koje programer mora
sam eksplicitno kodirati razlog su da je danas veina novih korisnikih aplikacija napisana u
nekom modernijem jeziku koji ima ugraeno automatsko upravljanje memorijom (engl.
garbage collection), ne doputa izravan rad s memorijom pomou pokazivaa te ima podrku
za upravljanje kodom odnosno njegovom okolinom za vrijeme njegova izvoenja. Danas se
relativno rijetko ukazuje potreba za pisanjem novih korisnikih aplikacija izravno u C-u, pa
ak i u vrlo malim sistemima kao to su primjerice mobilni telefoni. Glavno podruje njegove
upotrebe su sistemski programi na strani posluitelja (engl. servers), programi prevoditelji
(engl. compilers) i jezgre operativnih sistema (engl. operating system kernels), gdje je potreba
za najveom moguom brzinom izvoenja, efikasnom kontrolom resursa i izravnom
kontrolom hardvera od primarne vanosti.
Programiranje u programskom jeziku (ovdje za programski jezik C) sastoji se od nekoliko
koraka: pisanja programa u nekom tekstualnom editoru, prevoenja u strojni jezik, startanja
programa.
Program napisan u editoru mora imati ekstenziju ".c" (toka, potom malo slovo c), npr.
program.c
Tekst editor koji e se koristiti u ovom predmetu je kate.
Mikroprocesor i drugi logiki sklopovi raunala imaju svoj vlastiti programski jezik koji se
naziva strojni jezik, a sastoji se od nizova binarnih rijeci koje predstavljaju instrukcije
logikim sklopovima i podatke koje treba obraditi. Program napisan u strojnom jeziku
nazivamo izvrsni program ili izvrsni kod budui da ga raunalo moe neposredno izvriti.
Strojni jezik je odreen arhitekturom raunala, a definira ga proizvoa hardwarea. Izvrsni
program je strojno zavisan, sto znaci da se kod napisan na jednom raunalu moe izvravati
jedino na raunalima istog tipa. Pisanje instrukcija u binarnom kodu posve je nepraktino pa
su razvijeni simboliki jezici u kojima su binarne instrukcije zamijenjene mnemonikim
oznakama. Programer unosi program napisan u mnemonikim oznakama u tekstualnu
datoteku pomou editora teksta i zatim poziva program koji mnemonike oznake prevodi u
binarne instrukcije strojnog jezika. Program koji vri konverziju naziva se asembler (eng.
assembler) a sam se programski jezik naziva asemblerski jezik ili jednostavno asembler.
Program napisan u asemblerskom jeziku nazivamo izvorni program (eng. source code).
Pisanje programa time postaje dvostepeni proces koji cine pisanje izvornog programa i
prevoenje izvornog programa u izvrsni program. Programer se tako oslobaa mukotrpnog
pisanja binarnih instrukcija te se dobiva do odreene mjere strojna neovisnost izvornog
programa.
return 0;
}
i dobili bismo posve isti ispis.
Izvravanje funkcije zavrava naredbom return. Kad funkcija vraa neku
vrijednost u pozivni program ta se vrijednost navodi u return naredbi. Funkcija
main vraa nulu pa je stoga zadnja naredba return 0;
Funkcija main mora biti prisutna u svakom programu. Kada na komandnoj
liniji otipkamo
./a.out
operacijski sustav poziva funkciju main. Zatim se redom izvravaju naredbe
unutar funkcije main sve dok se ne doe do return naredbe. Ona operacijskom
sustavu vraa cjelobrojnu vrijednost koja ima znaenje izlaznog
statusa. Nula se interpretira kao uspjeni zavretak programa, a svaka druga
vrijednost signalizira zavretak uslijed greke.
U C-u je potrebno deklarirati sve varijable koje se u programu koriste.
Preciznije, unutar svake funkcije (ovdje unutar funkcije main) sve varijable
koje funkcija koristi treba deklarirati prije prve izvrne naredbe.
Deklaracija se sastoji od tipa varijable koji slijede imena varijabli odvojena
zarezima. Deklaracija kao i svaka druga naredba u programu zavrava
znakom toka-zarez. U deklaraciji
int n,fakt;
imena varijabli koje se deklariraju su n i fakt, a njihov tip je int. Tip
int predstavlja cjelobrojnu varijablu koja moe biti pozitivna i negativna.
Granice u kojima se moe kretati varijabla tipa int ovise o raunalu i danas
je to najee od -214748347 do 214748348. Pored varijabli tipa int postoje
jo dvije vrste cjelobrojnih varijabli. To su varijable tipa short i varijable
tipa long. Razlika je u tome da short pokriva manji raspon cijelih brojeva i
zauzima manje memorijskog prostora, dok long pokriva vei raspon i treba
vie memorijskog prostora. Varijable realnog tipa (tzv. brojevi s pokretnim
zarezom) pojavljuju se u dvije forme: brojevi jednostruke preciznosti float i
brojevi dvostruke preciznosti double. Konano, postoje i varijable tipa chart
u kojima se pamte znakovi.
Tipovi varijabli:
chart jedan znak,
short \kratki" cijeli broj,
int cijeli broj,
long \dugi" cijeli broj,
float realan broj jednostruke preciznosti,
double realan broj dvostruke preciznosti.
Pored ovih tipova podataka koje nazivamo osnovnim, postoje jo i sloeni
tipovi podataka kao to su strukture, polja, unije te pokazavatelji kao posebni
osnovni tip podatka.
Prva izvrna naredba u programu je naredba pridruivanja
n=1;
Znak jednakosti je operator pridruivanja. On vrijednost konstante ili varijable
na desnoj strani pridruuje varijabli na lijevoj strani. Nakon te naredbe
vrijednost varijable n postaje jednaka 1.
zbrajanje
oduzimanje
mnoenje
dijeljenje
Operator
+
*
Primjer
a+b
a-b
a*b
a/b
Naredba:
for(i=1;i<=n;i=i+1)
{
....
}
je for petlja. Ona djeluje na sljedei nain. Prvo se varijabla i inicijalizira
tako to joj se pridrui vrijednost 1 (i=1). Inicijalizacija se izvri samo
jednom. Zatim se testira izraz
i<=n;
Ako je rezultat testa istinit izvravaju se naredbe iz tijela petlje (naredbe u
vitiastim zagradama). Nakon toga se izvrava naredba
i=i+1;
i kontrola programa se vraa na testiranje istinitosti izraza i<=n. Petlja
zavrava kad izraz koji se testira postane laan. Program se tada nastavlja
prvom naredbom iza tijela petlje.
for-petlja iz naeg primjera moe se zapisati pomou while-petlje na
ovaj nain:
i=1;
while(i<=n)
{
suma=suma+1.0/(i*(i+1));
i=i+1;
}
Naredbe oblika i=i+1 i i=i-1 kojima se broja poveava, odnosno
smanjuje
za jedan sreu se vrlo esto pa za njih postoji kraa notacija:
n=n+1
n=n-1
je ekvivalentno s
je ekvivalentno s
n++,
n--.
for(i=1;i<=n;i++)
suma=suma+1.0/(i*(i+1));
Operatore inkrementiranja i dekrementiranja moemo primijeniti na
cjelobrojne
i realne varijable. Uoimo jo da smo vitiaste zagrade oko tijela
for-petlje mogli ispustiti jer se tijelo sastoji samo od jedne naredbe. To
vrijedi za sve vrste petlji.
Svaka petlja sadri u sebi jedan ili vie brojaa kojim se kontrolira odvijanje
petlje. Broja je potrebno na poetku inicijalizirati i zatim ga u svakom
prolazu petlje poveavati (ili smanjivati). Pelja se zaustavlja testiranjem
brojaa. U while petlji jedino testiranje brojaa ulazi u zagrade nakon
kljune rijei while. Inicijalizaciju moramo staviti izvan petlje, a promjenu
brojaa negdje unutar petlje. U for petlji sva tri elementa dolaze u
zagradama
iza kljune rijei for, u obliku
for(inicijalizacija brojaa; test; promjena brojaa)
{
.........
}
Inicijalizacija, test i promjena brojaa odvajaju se znakom toka-zarez (;).
Naredba if-else
Naredbe if-else nam u programskom jeziku omoguavaju korake u programiranju koji bi bez
tih naredbi bilo nemogue uiniti.
Naredba if - else koristi se za donoenje odreenih odluka. Formalna sintaksa jest
if(izraz)
naredba1
else
naredba2
pri emu je else neobavezan. Izraz se provjerava. Ako je istinit (ima vrijednost koja nije nula),
izvrava se naredba1. Ako nije istinit (ima vrijednost nula) i ako postoji else dio, izvrava se
naredba2.
Kako if testira brojevnu vrijednost nekog izraza, mogua su odreena skraenja koda.
Primjerice
dovoljno je napisati
if(izraz)
umjesto:
11
if(izraz!=0)
Katkad je ovaj nain pisanja ipak zgodniji i itljiviji.
Na prvi pogled, malo je nejasno to se dogaa u sluaju kad if - else konstrukcija nema else
dijela
(jer je neobavezan). Postoji pravilo, potpuno intuitivno, koje pridruuje else najbliem
prethodnom if-u koji
nema else. Npr. u
if(n>0)
if(a>b)
z=a;
else
z=b;
else se pridruuje unutranjem if-u, to zorno pokazuje i uvuenost redova. Ako to nije eljeni
raspored, morate iskoristiti vitiaste zagrade kako bi pojasnili prevoditelju to zapravo elite
if(n>0){
if(a>b)
z=a;
}
else
z=b;
esta je greka:
if(n>0)
for(i=0;i<n;i++)
if(s[i]>0){
printf("...");
return i;
}
else /* pogreno */
printf("greska - n je negativno\n");
Uvuenost redova pokazuje to programer eli, ali prevoditelj else pridruuje unutranjem ifu.
Ovakve greke nije lako nai. Zato je topla preporuka koritenje vitiastih zagrada kad je to
mogue, a ne
kad se moe.
Osim toga primijetite da postoje toka-zarez nakon z=a u
if(a>b)
z=a;
else
z=b;
Gramatiki gledano, naredba ide kao posljedica if, a naredbu moramo okonati s tokazarezom.
12
Konstrukcija
if(izraz)
naredba
else
if(izraz)
naredba
else
if(izraz)
naredba
else
if(izraz)
naredba
else
naredba
je toliko esta da o tomu ne treba troiti rijei. Ovaj niz if naredbi predstavlja najopenitiji
nain pisanja viesmjernog grananja. Izrazi se raunaju po redu. Ako je bilo koji izraz istinit
pridruena naredba se izvrava, ime se zavrava itava konstrukcija. Kao i uvijek, naredbom
se podrazumijeva ili jedna naredba ili vie njih omeenih vitiastim zagradama. Zadnja else
naredba ne obavlja nijedan od gornjih sluajeva, ali izvodi sluajeve koji se izvravaju
kad nijedan od uvjeta nije zadovoljen. Ponekad takvi, podrazumijevani sluajevi, ne rade
nita, pa tada zadnji else nije ni potreban. Meutim, ipak je dobro ostaviti else, te pomou
njega traiti nemogue greke.
13
LITERATURA:
www.maturski.org
14
15