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
© Copyright 2024 Paperzz