OSNOVI PROGRAMIRANJA

OSNOVI PROGRAMIRANJA
M.Maric
Maj, 2013.
i
Contents
1 Uvod u programski jezik C
1.1 Osnovne karakteristike programskog jezika C . . .
1.2 Elementi programskog jezika C . . . . . . . . . . .
1.3 Indentifikatori . . . . . . . . . . . . . . . . . . . . .
1.4 Opsta struktura programa i domet indentifikatora
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
3
2 Tipovi podataka
2.1 Standardni tipovi . . . . . . . . . . .
2.1.1 Znakovni tip i cjelobrojni tip
2.1.2 Realni tip . . . . . . . . . . .
2.2 Nestandardni tip . . . . . . . . . . .
2.3 Zadavanje naziva tipa . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
5
6
6
6
6
3 Promjenjive
3.1 Elementarni ulaz-izlaz . . . .
3.1.1 Elementarni ulaz . . .
3.1.2 Elementarni izlaz . . .
3.2 Znakovni tip . . . . . . . . .
3.3 Cjelobrojni tip . . . . . . . .
3.4 Realni tip . . . . . . . . . . .
3.5 Enumeracije . . . . . . . . . .
3.6 Tip niza . . . . . . . . . . . .
3.7 Simbolicke konstante . . . . .
3.8 Realizacija logickog tipa . . .
3.9 Realizacija tipa stringa u Cu
3.10 Tip sloga . . . . . . . . . . .
3.11 Tip unije . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
7
7
8
8
9
9
10
11
11
11
12
12
4 Operatori i izrazi
4.1 Aritmeticki operatori . . . . . . . . . . .
4.2 Bocni efekat . . . . . . . . . . . . . . . .
4.3 Relacioni operatori . . . . . . . . . . . .
4.4 Logicki operatori . . . . . . . . . . . . .
4.5 Bit operatori . . . . . . . . . . . . . . .
4.6 Uslovni operator . . . . . . . . . . . . .
4.7 Operatori dodjele . . . . . . . . . . . . .
4.8 Konverzija tipa . . . . . . . . . . . . . .
4.9 Niz izraza . . . . . . . . . . . . . . . . .
4.10 Velicina podataka . . . . . . . . . . . . .
4.11 Prioritet i redoslijed primjene operatora
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
14
14
15
15
15
16
16
17
17
18
18
.
.
.
.
.
.
.
.
.
.
.
.
.
ii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Naredbe
5.1 Prosta naredba . . . .
5.2 Upravljacke strukture
5.2.1 Sekvenca . . .
5.2.2 Selekcije . . . .
5.3 Naredbe ciklusa . . . .
5.3.1 while ciklus . .
5.3.2 for ciklus . . .
5.3.3 do while . . . .
5.4 Naredbe skoka . . . .
5.4.1 goto . . . . . .
5.4.2 break; . . . . .
5.4.3 continue; . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
iii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
19
19
19
20
21
21
22
22
22
22
22
22
1
Uvod u programski jezik C
C iljna funkcija pascala je bila citljivost programa, da ga covjek moze razumjeti. Pouzdanost je time povecana, ali se nije vodilo racuna o brzini izvrsavanja
i zauzecu memorije programa.
C je prevljen da generise sto je moguce manje i sto je moguce brze programe.
U C-u se moramo potruditi da program bude sto citljiviji. Pod programom se
sada podrazumjeva izvorni kod (eng. source code). Sa razvojem programiranja
strukture podataka postaju bitne. Za pisanje sistemskih programa je koristen
asembler. U praksi se koristio ogroman broj operativnih sistema koji nisu imali
nikakve veze jedni s drugim. Tada se pojavila ideja da svi racunari imaju iste
komande operativnog sistema. Svaki racunar je imao drugaciji masinski jezik a
samim tim i drugaciji asembler.
Operativni sistem napisan na Paskalu bi bio veoma spor. Stoga se stvorila
potreba da postoji visi programski jezik kod kojeg je brzina izvsavanja bliska
asemblerskim.
1972. D. Ritchie je napravio programski jezik koji moze da bude zamjena
za asembler. To je bila osnovna namjena programskog jezika C. C ima sve
osobine viseg programskog jezika ali je blizi masini (programeri moraju imati
uvid u hardver). C je imao isti izvor kao i Pascal , to je bio ALGOL iz 1960-tih.
Razlog za polularnost C-a je zbog toga sto su personalni racunari imali jako
spore procesore i malo memorije.
1.1
Osnovne karakteristike programskog jezika C
C je zamisljen kao operatorski jezk. Npr. dodjela je u svim drugim programskim
jezicima naredba dok je u C-u to operator.
x:=y+1 Pascal-naredba
x=y+1 C-operator
Shodno tome u C-u se mora praviti razlika izmedju naredbe i izraza. Razlika je
u tome sto izraz obavezno ima vrijednost, dok je postojanje naredbe koja ima
vrijednost besmisleno.
Druga osobina C-a je da je slabo tipiviziran jezik. Tip je cvrsto vezan za
promjenjivu i ne moze se mjenjati. U C-u se mogu vrsiti operacije nad podacima
razlicitog tipa, Pascal to ne dozvoljava.
Na primjer Paskal dozvoljava samo jednu samo jednu interpretaciju ASCII
znakova, dok je u C-u znakove moguce shvatiti kao cjelobrojne vrijednosti.
C je poseban jos sto je kod njega drugaciji nacin realizacije logickog tipa, i
sve naredbe se specificno ponasaju.
Program je upustvo za rad racunaru. Kako su visi programski jezici
blizi covjeku nego racunaru tako mora da postoji neka veza izmedju koda programa na visem programskom jeziku (koji covjek pise) i masinskog jezika tj.
0 i 1 koje racunar razumije. Tu operaciju obavlja kompajler koji prevodi kod
programa sa viseg programskog jezika na masinski jezik.
Proceduralni programski jezici imaju 4 osobine i to:
1
ˆ kakve tipove podataka imaj
ˆ kakve naredbe ima
ˆ kako se prave podprogrami
Potprogram i procedura su sinonimi
1.2
Elementi programskog jezika C
Elementi programskog jezika su regulisani strogim pravilima od kojih se ne moze
odstupati, u opstem slucaju.
Skup simbola koji se miju koristiti prilikom pisanja programa su:
1. Velika i mala slova engleskog alfabeta
2. cifre 0-9
3. Specijalni znakovi
+ - * ? , ! == <= != << = > .
Format izvornog programa je slobodan. C ima ”rijecnik” tj rijeci koje su rezervisane. Kraj jedne naredbe u C-u se oznacava znakom ; na primjer
naredba1;naredba2;
Paskal je simbol ; koristio za ra razdvajanje naredbi
naredba1;naredba2
Komentari u C-u se ne kompajliraju i u C-u su komentari jako cesti jer nije
razumljiv kao Paskal. Postoje dvije vrste komentarisanja
/* Ovo je komentar koji
se proteze u vise linija izvornog koda*/
Za komentar u jednoj liniji se koristi
//komentar
U komentaru treba da stihu sta radu taj dio programa i kako radi i kako se
koristi
2
1.3
Indentifikatori
U C-u ono cemu se mora dodjeliti ime jesu
ˆ promjenjive
ˆ potprogrami (funkcije
ˆ tipovi
ˆ konstante mogu biti indentifikovane
U C-u u indentifikator mogu da udju slova i cifre s tim da indentifikator ne smije
pocinjati cifrom. Pored toga svaki programski jezik ima i skup konvencija tj opste prihvacen stil izrazavanja. Neke konvencije su toliko prihvacene da su prakticno dio programskog jezika. Stil programiranja na C-u je vrlo individualan.
Indentifikatori koji imaju sematniku moraju biti mnematicki. Indentifikator je
mnematican ako covjek u njemu moze prepoznati znacenje.
1.4
Opsta struktura programa i domet indentifikatora
Naredbe programa se nalaze u izvornoj datoteci, to je obican tekstuelni fajl
koji se moze procitati. Sav izvrsni kod se nalazi u potprogramiam Sadrzaj
potprograma u C-u i u Pascalu je u sustini isti.
Generalno domet inentifikatora jeste oblast izvornog koda gdje se taj indentifikator smije koristiti. Indentifikator se smije koristiti samo u dometu i ne
smije se koristiti prije nego sto je deginisan. Struktura programa u Paskalu je
jako ostra. U Cu je struktura znatno labavnija s tim sto se smije koristiti samo
ono sto je ranije definisano. Pocetak dometa indentifikatora je linija u kojoj
se nalazi definicija. Promenjive se definisu unutar potprograma i to su lokalne
promjenjive. Domet lokalne promjenjive pocinje njihovom definicijom i krajem
potprograma. Postoji mehanizam za sirenje dometa koji ce biti objasnjen pri
funkcijama.
Ulaz i izlaz podataka u Cu nisu naredbe vec se realizuju potprogramima.
Biblioteke u Cu genegerisu se zaglevljem, prepoznaju se po ekspanziji.h Pozivanje biblioteke nije nareba i nije namjenjena kompajleru vec predprocesorska
direktiva koje se prepoznaju tako sto pocinjiu sa # Primjer programa napisanog
na Cu
3
#include<stdio.h>
//mora se naci prije pozivanja biblotecnih funkcija
const double PI=3.145926;
/*Konstante se obiljezavaju velikim slovima, const
znaci da se radi o zakljucajnoj promjenjivoj
C nema glavni potprogram vec glavnu funkciju*/
double obimKruga(double r) //konvencija kamil
//notacije da ime pocinje malim slovom
//a svaka sledeca rijec velikim
{
return 2*r*PI;
}
int main(){
double poluprecnik,obim;
scanf("%lf",&poluprecnik);
obim=obimKruga(poluprecnik)
printf("Obim kruga je %lf",obim);
return 0;
}
4
2
Tipovi podataka
Postoje u svakom programskom jeziku pa i u Cu iako je on slabo tipiviziran
jezik. Svaki podatak mora da ima tip jer u memoriji imamo samo 0 i 1, pocevsi
od instrukcija, adresa pa i podataka pa moramo znati kako se ti bitovi interpretiraju, i koliko taj podatak zauzima memorije. Informaciju o tome daje tip
Tipovi podataka se dijele
ˆ OSNOVNI (Bazni, objasnjavaju sami sebe)
– standardni
1.
2.
3.
4.
znakovni
cjelobrojni
realni
void
– enumeracije (definise programer)
ˆ IZVEDENI (zahtjeva dodatna objasnjenja)
– niz
– slog
– pokazivac
– datoteka
– ...
2.1
Standardni tipovi
Znakovni, cjelobrojni i realni su familije tipova. C nije u prednosti u odnosu
na ostale prog. jezike sto se tice zadavanja tipova. Citavoj familiji tipova
spridruzuje se isti indentifikator
char
int
ali za realne:
float double
Posto postoje tri znakovna tipa i 9 cjelobrojnih C je uveo sistem indentifikatora
za blize definisanje tipova. Postoje dvije vrste indentifikatora
ˆ modifikatori duzine short i long
ˆ modifikator znaka signed i unsigned (nemaju smisla sa realnim tipovima
unsigned modifikator sluzi da svi bitovi budu ravnopravni.
5
2.1.1
Znakovni tip i cjelobrojni tip
1. char – osnovni tip
2. signed char
3. unsigned char
4. short [int] = short
1. unsigned short [int] = unsigned short
signed short [int] = short
2. int – osnovni cjelobrojni tip
3. unsigned [int]= unsigned
signed int = signed
4. long [int] = long
5. unsigned long [int]
signed long [int] = long
Postoji i tip long long sa svim modifikatorima. Tipicna primjena long long je
adresiranje datoteke.
2.1.2
Realni tip
1. float
2. double – osnovni tip
3. long double
2.2
Nestandardni tip
2.3
Zadavanje naziva tipa
U ceu postoji naredba za zadavanje novih tipova to je typedef
typedef opis ImeTipa;
Neki prevodioce dozvoljavaju da typedef koristi unutar funkcija, vecina to ne
dozvoljava. Za svaki novi tip tereba nova naredba typedef.
6
3
Promjenjive
Promjenjive u C-u se ponasaju isto kao i u Paskalu, njoj mora da bude dodjeljena
memorija te se mora znati interpretacija i broj bitova. Svaka promjenjiva mora
da ima tip. Pored toga mora imati i indentifikator(ime). U opstem slucaju se
definise
tip ime[=pv],ime2=[pv2],...,imek=[pvk];
npr:
int i;
int x,y=0;
Postoji mehanizam inicjalizaceije (zadavanje vrijednosti promjenjive pri definiciji) Jednom naredbom mozemo da definisemo vise promjenjivih ako su istog
tipa. Prilikom definisanja promjenjivih imamo dva modifikatra
ˆ const....... zakljucava vrijednost promjenjive i ona se ponasa kao konstanta.
ˆ volatile.... toj promjenjivoj se moze pristupiti i izvan programa
3.1
Elementarni ulaz-izlaz
Ulaz sa tastature i izlaz na ekran. Ulaz-izlaz je u Cu definisan pomocu funkcija,
kako je C slabo tipiviziran uneseni podatak se moze pretvoriti u mnogo sta.
Na primjer 127 u Paskalu se moze interpretirati samo kao 127(10), ali u Cu
mozeda se pretvori u 127(10) ili u 127(8) ili 127(16) ili u znak ciji je ASCII kod
127, pa Cov ulaz ne moze biti tako jednostavan kao paskalov i mora mu se reci
sta se to unosi sa tastature.
3.1.1
Elementarni ulaz
Funkcije za elementarni ulaz u Cu je scanf, ona se nalazi u zaglavlju
#include<stdio.h>
scanf("formatni_string",&p1,&p2,...,&pn);
U formatnom stringu se nalaze konerzione specifikacije (po jedna za svaku promjenjivu) Iza formatnog stringa se nalaze adrese promjenjivih.
Konverziona specifikacija se propoznaje zato sto se na pocetku nalazi %.
%[*][sirina][h(za short),l(za double),L(za long double] tip_konverzije
3.1.2
Elementarni izlaz
Elementarni izlaz se obavlja pomocu funkcije printf.
printf("formatni_string",izraz1,izraz2,...,izrazn)
7
Unutar formatnog stringa mozemo ispisivati slobodan tekst i konverzione specifikacije
%[flegovi][sirina][.preciznost][h, l, L] tip_konverzije
npr
_ _ _ 2 3 + fleg
2 3 _ _ _ - fleg
npr preciznost 8.3
3.2
Znakovni tip
Familija tipova cija je zajednicka rijec cha. Znakovne konstante se prikazuju
izmedju apostrofa npr
’a’ ’A’ ’+’ ’0’ ’1’
Upravljacki simboli se prikazuju pomocu eskejp sekvenci
’\0’
’\n’
’\b’
’\t’
’\a’
’\’’
’\"’
’\\’
’\?’
ASCII kod 0
prelazak na pocetak novog reda
pomjeranje za jedno mjesto ulijevo
tabulator
beep
’
"
\
?
Kada se eskejp sekvenca koristi unutar stringa tada se apostrofi ne pisu. Rjesenje
problema da znakovi koji jesu znakovi ali se ne mogu unjeti sa tastature je da
im se dodjeli cjelobrojna vrijednost. Tako se mogu vrsiti racunske operacije sa
znakovima. Za konverziju znaka ne trebaju funkcije, npr:
char c;
c=’M’;
c=77;
c=135;
Nacin upisa, odnosno ispisa se regulise formatnim stringovima.
3.3
Cjelobrojni tip
Osnovni indentifikator je int. Nema garancije sto se tice broja bita za predstavljanje. U izvornom kodu se cjelobrojne konstante prikazuju: 4321-50+124... C
ne dozvoljava vodecu nulu jer to znaci da je to oktalni broj npr 04321 Slicno
heksadecimalni brojevi se prikazuju 0x58AB. Heksadecimalni oblik sluzi za skraceno prikazivanje binarnih brojeva, odnosno za manipulaciju registrima. 432 kao
konstanta prevodiocu nije dovoljno pa su potrebni dodatni indentifikatori za npr
L431 postaje konstanta tipa long.
Ulazno-izlazne konverzije su:
8
%d int
%u unsigned
%o oktalni
%x heksadecimalni
%i znacii da ce se koristiti sifra 0
ili 0x za unos heksadecimalnih i oktalnih brojeva
3.4
Realni tip
Osnovni je double, postoje jos i float i long double. Konsante se prikazuju na
dva nacina:
1.352-0.5+22.6
.5
6.
sto je isto kao 0.5 6.0
Drugi nacin za prikaz je eksponencijalni
1E-6
-3.8e+8
1.2e-6
1.5 ce po deafoultu biti double tipa ako hocemo float stavljamo 1.5F, a ako
hocemo long 1.5L Konverzione speciifikacije
%f npr 121.5302
%e npr 1.215302E2
%g program na osnovu vrijednosti odlucuje kako ce biti prikazan
%lf za double
%Lf za long double
3.5
Enumeracije
Svrah uvodjenja enumeracija jeste povecanje razumljivosti programa, odnosno
povecanje pouzdanosti. Enumeracija je nesto sto je srodno imenovanim konstantama. Enumeracija omogucuje da upotrebimo konstante ponedeljak,utorak,...
a da im se dodjele cjelobrojne vrijednosti. Sluze za mnemoticko prikazimanje
konstanata. Sve enumeracije su clanovi familije cjelobrojnih tipova. Sintaksa
enumeracije je ta da se sve enumeracije oznacavaju kljucnom rijeci enum. Postoji vise nacina za rijesenje tog problema:
enum {NE,DA} log1,log2;
promjenjive se definisu zajedno sa enumeracijom. Drugi nacin je pomocu tzv
taga(priveska)
enum RGB {CRVENA,ZELENA,PLAVA};
.
.
.
enum RGB b1,b2
9
U puno ime enumeracije se ukljucuje i kljucna rijec enum. Treci nacin je
typedef enum{CRVENA,ZELENA,PLAVA} OsnBoje;
...
OsnBoje b1,b2;
Ekvivalentno je pisati
b1=ZELENA;
b1=1;
Clanovi enumeracije imaju vrijednost pocevsi od 0 pa nadalje u rastucem
redoslijedu kako su se navodili, moze im se promjeniti vrijednost npr:
enum XX{K1,K2=5,K3,K4=10,K5}
Vazno je napomenuti da K3 nema vrijednost 2 kao sto je ocekivano vec ima
vrijednost 6, zbog toga sto se nastavlja to povrcanje vrijednosti, analogno K5
ima vrijednost 11. Enumeracija ne sluzi za ulaz i izlaz.
3.6
Tip niza
Sluzi za gupisanje promjenjivih pod jednim imenom i da im se pristupa pomocu
indeksa. Niz ciji se tip ne zna nije definisan
tip ime_niza[duzina]
npr
int vek[50]
Niz u Cu se posmatra kao rezervisan memorijski prostor. Elementima se
pristupa preko indeksa npr vek[10], indeksi su obavezno cjelobrojni(unsigned)
vek[j] vek[k*2-i+1]
0<= index<= duzina-1
Primjenom indeksiranja u drugim programskim jezicima se vrse tri racunske
operacije, a u Cu posto je prvi indeks 0 samo dvije na taj nacin se dobija na
brzini. Indeksiranje je operator u Cu , operandi su ime niza i indeks. Prilikom
izvsavanja programa ne ispituje se da li je vrijednost indeksa van opsega. Ali
se pristupa lokaciji gdje bi se nalazio taj clan niza. Testiranje programa na Cu
traje duze,ali su zato programi brzi
Koncept visedimenzionih nizova(matrica) se tretira kao niz ciji su elementi
nizovi npr
double mtr[30][40];
mtr[i][j]; ////pristup
Nizovi u Cu mogu da se nicijalizuju npr
double n[5]={1.5,-0.8,3.5,0.0,10.5}
int p[]={0,-1,4,22}
inicijalizacija matrica izgleda:
={{...},{...},....,{...}}
10
3.7
Simbolicke konstante
Su efektivno imenovane konstante. Jedan nacin za realizaciju konstanti je zakljucavanje promjenjive. U paskalu ce poslije prevodjenja nestati ime zakljucane
promjenjive. U Cu zakljucana promjenjiva ne nestaje vec ce nas kompajler samo
upozoriti kada pokusamo da mijenjamo vrijednost te promjenjive.
Simbolicke konstante u Cu se realizuju upotrebom predprocesorske direktive
#define i ima oblik
#define IME vrijednost
npr
#define TRUE 1
Prilikom prevodjenja ce se destiti isto sto i u paskalu, predprocesor gdje god
naidje na IME zamjenice ga sa vrijednosti i to ce ici na prevodjenje.
Razlika izmedju simbolicke konstante i zakljucane promjenjive je u tome
sto simbolicka konstanta je konstanta u pravom smislu gdje pravila jezika zahtijevaju konstantu, npr duzina niza mora da bude konstanta zbog toga sto
prevodilac mora da rezervise memorijski prostor. Define dejstvuje svuda osim
unutar stringova.
3.8
Realizacija logickog tipa
Neopravdano je reci da C nema logicki tip. C ima poseban nacin za realizaciju
logickog tipa, nema posebne konstante TRUE i FALSE Realizacija logickog tipa
se razlikuje u tome da li se T ili !T ponasa kao operand ili kao rezultat operacije.
Kada je u pitanju rezultat operacije u ulozi tacnog je 1, a u ulozi netacnog je
0. Kada su u upitanju operandi tada je u ulozi netacnog 0, a u ulozi tacnog sve
razlicito od 0. Stil programiranja na Cu je drugaciji uglavnom zbog realizacije
logickog tipa
3.9
Realizacija tipa stringa u Cu
String je tekstuelni tip podataka. Trebalo je vremena da se shvati da je string
poseban tip podataka, a ne niz znakova. Npr u okviru stringova postoji KONKATEMACIJA
koja se koristi za spajanje dva stringa npr
abc+de->abcde
Operacija spajanja nizova ne postoji, tako da string nije podtip tipa niza.
U prvoj verziji Paskala realizacija stringa je bila pomocu niza. U kasnijim
verzijama je postojao poseban tip string.
U Cu string se realizuje kao specijalni znakovni niz. Znakovni niz u Cu moze
da se pojavi u ulozi znakovnog niza i u ulozi stringa. prva specificnost je da
postoje string konstante (string literali). String literal se koristi tako sto se stavi
izmedju znakova navoda
"Pera_Peric"
11
Koristi se samo za inicijalizaciju stringa jer dodjela nizu nije definisana, i
ne mogu da budu rezultati funkcija. Dodjela bi znacila da se jedan memorijski
prostor dodjeli drugom memorijskom prostoru.
Druga specificnost znakovnog niza kao stringa je da pitanje kraja stringa. C
na kraju stinga stavlja
0 (ASCII 0) talp da se naznaci da duzina stringa nije 30 vec neka druga npr
char ime[30]={’P’,’e’,’r’,’a’,’ ’,’P’,’e’,’r’,’i’,’c’}
Tada ovako inicjalizovan niz znakova se i ponasa kao niz znakova, ne bi mogle
da se vrse operacije koje su namjenjene za rad sa stringovima.
Postoji konverzion specifikacija %s. Posebni operatori za rad sa stringovima
u Cu ne postoje, sve moguce operacije za rad sa stringovima su realizovane kao
funkcije i nalaze se u
<string.h>
3.10
Tip sloga
To je osnovni izvedeni tip koji se davno pojavio u programiranju. Koriste se za
rad sa mnogo podataka i malo operacija nad njima.
Niz sluzi za grupisanje podataka istog tipa. Slogovi sluze za opisivanje entiteta. Elementi sloga mogu da budu razlicitog tipa. Realizacija sloga u Cu je
ista kao u Paskalu i koristi se kljucna rijecstructure. Mehanizam realizovanja
sloga se poklapa sa enumeracijom. Svi tipovi sloga imaju istu rijec struct. Isto
vazi za izbjegavanje pomocu taga i navodjenje promjenjivih odmah. Na primjer:
struct tck{
double x;
double y;
}
Koristenje slogova:
struct txk t1,t1={1.5,0.5}
x
y
1.3
-0.5
Ako nam u programu trebaju vrijednosti polja, koristi se operator
Na
primjer
t2.y ima osobine double promjenjive.
Nad slogovima jeste definisana naredba dodjele. Tako a ukoliko stavimo da
su nizovi dijelovi sloga nad njima ce se izvrsiti dodjela iako to treba izbjegavati.
3.11
.
Tip unije
Unija samo sintaksno lici na slog, ali je sasvim drugacija
struct stk{
char c;
12
int i;
double d;
};
union un{
char c;
int i;
double d;
};
Polja unije dijele istu memoriju
Za uniju se zauzima toliko memorije koliko treba za najvece polje. Svrha
unije da se i istu memoriju upisuju podaci razlicitog tipa. U toku programa
samo je ejdno polje aktuelno, prilicno je rizicno koristiti unije. Mogu da posluze
za reinterpretaciju bitova.
13
4
Operatori i izrazi
Kako je C operatorski jezik on ima preko 40 operatora(unarni,binarni, ternarni).
Postoje operatori u Cu koji nisu operatori u drugim programskim jezicima to
su indeksiranje, selektovanje, pokazivaci,svaki poziv funkcije,dodjela.
Mnogo operatora znaci da se mora rijesiti pitanje prioriteta npr a+b*c. Ako
hocemo da narusimo prioritet koristimo zagrade(). U Cu se operatori rasporedjuju na 15 nivoa prioriteta. Ako se operatori nalaze na istom nivou prioriteta
postoji podrazumjevani smje promjene s lijeva u desno. Neki operatori imaju
smjer sa desna ulijevo kao na primjer dodjela. Specificni operatori u Cu su
ti da se mijenja vrijednost operanda Primjena operatora uvijek generise
rezultat. Operatore grupisemo u sledece kategorije
ˆ adresni operatori
ˆ aritmeticki operatori
ˆ relacioni operatori
ˆ bit operatori
ˆ logicki operatori
ˆ operatori dodjele
ˆ , zapeta
4.1
Aritmeticki operatori
To su standardni operatori koji mogu biti unarni i binarni. Binarni aitmeticki
operatori su
ˆ + sabiranje
ˆ - oduzimanje
ˆ * mnozenje
ˆ // dijeljenje (koristi se i za cjelobrojno i za realno, a rezultat zavisi od operanada, tj. ako su oba operanda cjelobrojna onda se radi o cjelobrojnom
dijeljenju, u suprotnom o realnom)
Unarni aritmeticki operatori su: - + npr -x vrijednost operanda sa promjenom predznaka.
4.2
Bocni efekat
Bocni efekat je osobina operatora. Operator koji ima bocni efekat mijenja vrijednost jednog operanda, Taj operand mora biti LVALUE, odnosno promjenjive
i drugi elementi sa memorijom.
k++ postfiksni oblik, operand se prvo koristi, zatim se njegova vrijednost
povecava za 1
++k prefiksni oblik i ima uticaj na rezultat
14
4.3
Relacioni operatori
Relacioni operatori generisu rezultat u zavisnosti od istinitosti, tj 0 za netacno
i 1 za tacno. Relacioni operatori su:
== jednakost
!= nejednakost
<
<=
>
>=
Nije preporucljivo koristiti relacione operatore u obliku x¡y¡z, zato sto rezultat
ne mora biti tacan vec
(x<y)&&(y<z)
4.4
Logicki operatori
&& (Logicko I)
|| (Logicko ILI)
! (Logicka negacija(
Obicno su im operandi relacioni izrazi. Rade na uobicajen nacin sa operandima
tako sto 0 uzimaju kao logicku laz, a sve razlicito od 0 kao istinu. Kako su
realni proracuni priblizni, to moze da ima za posljedicu da rezultat koji treba
da bude 0 ali zbog zaokruzivanja moze da bude jako mali, i to ce logicki operatori
uzeti kao logicku istinu, stoga nije preporucljivo koristiti realne proracune kao
operande logickog operatora. α&&β Npr ako je α = 0 tada se β ne izracunava
sto ima za posljedicu ako je u beta izrazu neki operator sa bocnim efektom.
4.5
Bit operatori
Koriste se za manipulaciju sa bitovima kada C sluzi kao zamjena za asembler
& bit konjunkcija
| bit disjunkcija
~ prvi komplement
^ iskljucivo ili
<< pomjeraj(sift) ulijevo
>> sift udesno
Rezultat primjene bit operatora i logickih operatora nije isti. Bit operatori
se koriste sa cjelobrojnim tipovima . Na primjer ako u memoriji stoji
1001 1100
1100 0111
&1000 0100
15
Operatori pomjeraja nemaju bocni efekat. Ako u memoriji stoji
x-> 1011 0100
x<<2 1101 0000
Efektivno je siftovanje udesno isto sto i mnozenje sa 2ˆ
n gdje je n broj pozicija za siftovanje. Kada je u pitanju siftovanje udesno razlika je jedino u tome
sta ce se desitis a upraznjenim mjestoma. Ako je lijevi operand unsigned onda
se upraznjena mjesta popunjavaju 0. Ako je lijevi operand signed onda se popunjavaju najvisim bitom(bitom znaka). Najcesce se koriste unsigned zbog toga
sto su im svi bitovi ravnopravni
4.6
Uslovni operator
Ovaj operator nema bocnih efekata i on je ternarni operator. Ima oblik
izraz1?izraz2:izraz3
Kao i svaki drugi operator on generise rezultat. Rezultat ovog operatora je izraz2
ako je izraz1 razlicit od 0, a ako je izraz 1 jednak 0 tada je rezultat izraz3. Na
primjer ono sto bi u paskalu pisali naredbom ovdje mozemo elegantnije:
Pascal:
if a>b then y:=a
else y;=b;
C:
y=(a>b)?a:b;
4.7
Operatori dodjele
Dodjela kao takva u ostalim programskim jezicima je naredba. U Cu dodjele
imaju rezultat. Stvarna dodjela je operator sa bocnim efektom. Postoji 10+1
operator dodjele
- osnovni operator dodjele
LVRIJEDNOST=izraz
Lvrijednost je izraz koji satzi memoriju (promjenjiva, indeksiranje,pokazivac...).
Operand dodjele upisuje na memorijsku lokaciju LVALUE i rezultat dodjele je
ta vrijednost. Operatori dodjele imaju smjer s desna nalijevo. Npr visestruka
dodjela
a=b=c=d=1;
Ostali operatori dodjele:
αop = β ⇔ αβ
+=
-=
*=
/=
%=
&=
|=
^=
>>=
<<=
16
4.8
Konverzija tipa
Na primjer kada imamo situaciju realni+cjelobrojni... Direktno sabiranje iz
prakticnih razloga je nemoguce, zato sto se drugacije interpretiraju bitovi u
memoriji, i operacije se mogu vrsiti samo nad istim tipovima podataka. Ujednacavanje tipa se svodi da se vrijednost jedne promjenjive svede na tip vrijednosti druge promjenjive. Pri tome se poziva rutina programskog jezika koja
cita jednu vrijednost i formira tu istu vrijednost predstavljenu drugim tipom(na
primjer vrijednost inta ce se pretvoriti u realnu vrijednost).
C ima dva nacina za konverziju tipa
1. automatska (imlicitna)
2. eksplicitna (TYPE CAST).
Kod implikacione konverzije prevodilac odlucuje sta ce se u sta pretvarati.
TYPE CAST je ekplicitna konverzija kojom se jedna vrijednost konvertuje
u drugu na nas zahtjev.
Ako operator nije ni jedna od dodjela onda ce se se konvertovati:
1. long double
2. double
3. float
4. promocija (bez obzira na to da li je ejda ili oba operanda enum,short ili
char oni se pretvaraju u int)
5. long
6. int
unsigned tip nadjacava signed.
Za sve dodjele su praavila da se desni operand prilagodjava lijevom operandu.
Rezultat slozenijeg izraza sa dodjelama ce u tom slucaju biti slucajan.
TYPECAST nadjacava implicitnu konverziju. Izvodi se unarnim operatorom
(tip) izraz
int a
(long double) s
(float) (p+q)...
4.9
Niz izraza
To je nacin da se vise izraza grupise u jedan izraz. Izrazi se spajaju operatorom,
izraz1,izraz2,...,izrazn;
x=10,y+=x,y--,z*=y,z++;
ovo sve je jedan izraz
Redoslijed izvrsavanja je s lijeva u desno. Rezultat niza izraza je isti kao i
razultat zadnjeg izraza koji se izvrsi. U Cu niz izraza se rijetko koristi jer nema
veliku prakticnu primjenu.
17
4.10
Velicina podataka
U Cu postoji operator koji omogucuje da se odredi broj bajta koji se koriste za
neki tip. To je operator sizeof .Na primjer
sizeof(short)
Ne postoji garancija da na datom sistemu neki podatak ima tacno neki broj
bajta, na drugom ce imati mozda neki drugi broj... Zato velicina podatka nikada
ne smije biti konstanta size of ima dva oblika:
sizeof primjenjen na tip
sizeof(tip)
npr
sizeof(int)
sizeof(long double)
sizeof primjenjen na promjenjivu
sizeof y
4.11
Prioritet i redoslijed primjene operatora
PRIORITET TIP
15
2
14
1
!
13
2
12
2
11
2
10
2
9
2
8
2
7
2
6
2
5
2
4
2
3
3
2
2
1
2
*LD= s lijeva u desno
*DL=s desna u lijevo
OPERATORI
[ ]( ) . strelica
++ – *dereferenciranje &(adresa) (tip) sizeof
*/%
+pomjeraci
relacioni osim jednakosti i nejednakosti
== !=
& bitsko I
ˆ
bitsko
XOR
— bitsko OR
&& I
—— ILI
?: uslovni operator
sve dodjele
,
18
SMJER GRUPISANJA
LD
DL
LD
LD
LD
LD
LD
LD
LD
LD
LD
LD
DL
DL
LD
5
Naredbe
Postoje dvije grupe naredbi:
ˆ prosta naredba
ˆ upravljacke strukture
5.1
Prosta naredba
Kako je u drugim programskim jezicima dodjela naredba. U Cu je situacija
drugacija i prosta naredba je storogo definisana i izgleda
izraz;
Rezultat izraza se formira u predprocesoru i nestaje
y++;
z++;
x=1;
z+=6;
sin(t);
sin(t) prolazi prevodilac ali je efekat nista.
Posebna prosta naredba je prazna naredba ; koja nema nikakvo dejstvo
5.2
Upravljacke strukture
C ima uobicajen skup upravljackih struktura. Uglavnom su preuzete iz paskala.
Grupisemo ih u 4 grupe:
ˆ sekvenca
ˆ selekcije
ˆ ciklusi
ˆ naredbe skoka
5.2.1
Sekvenca
To je u sutini slozena naredba. Ono sto se nalazi izmedju. Sinonim za proceduralno programiranje je i sekvencijalno programiranje, jer je njena pojava
promjenila nacin programiranja. Nastala je u ALGOLU. Svha sekvence je da
od vise naredbi napravi jednu naredbu. npr:
C:
if(a>1) {x=1;y=2;}
FORTRAN:
IF (A.IE.1) GO TO 5
19
X=1
Y=2
5
Sekvenca se realizuje pomocu programskih zagrada . Niz izraza koristimo
kad od vise izraza hocemo izraz, a sekvencu kad od niza naredbi hocemo jednu
naredbu.
5.2.2
Selekcije
Postoje tri naredbe selekcije
ˆ IF naredba
if (izraz) naredba
Primjer
if(a>1) {x=1;y=2;}
if(x=y++*z--) t=0
ˆ IF ELSE naredba
if (izraz) naredba1
else naredba 2
koristi ze za izbor izmedju dcije alternative
ˆ Naredba visestrukog izbora
Na osnovu kriteruijuma bira se jedna od vise ponudjenih varijanata
switcj(cjelobrojni_izraz){
case a:case b:
niznaredbi1 [break;]
.
.
.
case n:
niznaredbin [break;]
Na primjer
20
switch(2*i-j+1){
case 5:case 13:
x=1;
y++;
z-=y; break;
case-3:
x=2;y*=6;break
case 10;
x=w;y--;break;
case -8:
x=0; break;
}
Nije osnovni oblik ove naredbe sa break ali se najcesce koristi Ako se iste
naredbe trebaju izvsiti vise puta onda se moze pisati
case5:case10:case123: ... :case n
Ako cjelobrojni izraz nema ni jednu od ponudjenih vrijednosti onda se
dodaje labela default.
5.3
Naredbe ciklusa
Smisao ciklusa je da covjek malim brojem naredbi racunaru zada veliki posao.
C ima tri vrste ciklusa. Osnovna razlika izmedju njih je u kontroli ciklusa
5.3.1
while ciklus
Opsti oblik ove naredbe je
while (izraz) naredba
Ako u trenutku pocetka ciklusa ne mozemo da izracunamo brojPponavljanja,
n−1
onda bi trebali koristiti while. na primjer proizvod dva niza s = i=0 a[i]b[i]
s=i=0;
while(i<n){
s+=a[i]*b[i];
i++;
}
(za ovo ipak je bolje koristiti dor ciklus ali nema veze) Tipican primjer koristenja
while je
21
e=t=i=1;
while(fabs(t)>eps){
t*=x/i++;
e+=t;
}
ili na drugi nacin
w=t=i=1;
while(fabs(t*=x/i++)>eps) e+=t;
5.3.2
for ciklus
U Paskalu je to iskljucivo brojacki ciklus. U Cu je to najopstiji moguci ciklus.
Svaki ciklus mora da ima startovanje(inicijalizaciju), provjeru kraja, tijelo
ciklusa i modifikaciju. Opsti oblik for ciklusa je
for(izraz1;izraz2;izraz3) naredba
na primjer
for(s=0,i=0;i<n;i++) s+=a[i]*b[i];
ili
for(s=0,i=0;i<n;s+=a[i]*b[i],i++);
5.3.3
do while
Do while je naredba ciklusa sa izlazom na dnuy ima opsti oblik:
do naredba while(izraz);
Minimalni broj izvrsavanja naredbe je jedan. Domen upotrebe je najredji tada
kada se provje kraja ne moze izvrsiti ako se naredba predhodno nije izvrsila.
5.4
Naredbe skoka
5.4.1
goto
5.4.2
break;
5.4.3
continue;
22