of 282 /282
Predrag S. Stanimirović Osnove programiranja 1. OSNOVNI ELEMENTI PROGRAMSKIH JEZIKA....................................................5 1.1. Pseudojezik kao opšti model viših programskih jezika................................................................................5 1.2. Azbuka jezika....................................................................................................................................................6 1.3. Identifikatori i rezervisane reči.......................................................................................................................7 1.4. Konstante.........................................................................................................................................................8 1.5. Promenljive.......................................................................................................................................................9 1.6. Komentari.........................................................................................................................................................9 1.7. Struktura programa.......................................................................................................................................10 1.7.1. Struktura programa u Pascal-u.................................................................................................................10 1.7.2. Struktura programa u C............................................................................................................................10 2. TIPOVI PODATAKA................................................................................................11 Statička i dinamička tipizacija......................................................................................................................13 2.1. Koncept slabih tipova....................................................................................................................................13 2.2. Koncept jakih tipova podataka.....................................................................................................................14 2.3. Ekvivalentnost tipova.....................................................................................................................................15 2.4. Elementarni tipovi podataka.......................................................................................................................15 2.4.1. Celobrojni tipovi (Integer ili int)..............................................................................................................16 2.4.2. Realni tip (float ili real)............................................................................................................................17 2.4.3. Logički tip podataka.................................................................................................................................17 2.4.4. Znakovni tipovi........................................................................................................................................17 2.4.5. Nabrojivi tip podataka..............................................................................................................................19 2.4.6. Intervalni tip podataka..............................................................................................................................20 2.5. Elementarni tipovi podataka u nekim jezicima...........................................................................................20 2.5.1. Tipovi podataka u jeziku C.......................................................................................................................20 Celobrojni tipovi u C....................................................................................................................................21 Realni tipovi podataka u C...........................................................................................................................22 Tip char.........................................................................................................................................................23 Konverzija tipova podataka i kast.................................................................................................................24 Vrste konverzije tipova.................................................................................................................................25 Konstante......................................................................................................................................................25 Sizeof operator..............................................................................................................................................26 Osnovne aritmetičke operacije ....................................................................................................................26 Operacije poređenja i logičke operacije.......................................................................................................28 2.5.2. Standardni tipovi podataka u Pascal-u.....................................................................................................29 Celobrojni tip (Integer).................................................................................................................................29 Tip realnih brojeva (Real).............................................................................................................................30 Znakovni tip podataka (Char).......................................................................................................................30 2.6. Diskretni tipovi podataka u programskim jezicima..................................................................................31 2.6.1. Nabrojivi tipovi u programskim jezicima.................................................................................................31 Pascal............................................................................................................................................................31 Programski jezik C.......................................................................................................................................31 2.6.2. Podintervalni tipovi..................................................................................................................................31 1

17375446 Osnove Programiranja Predrag Stanimirovi

Embed Size (px)

Text of 17375446 Osnove Programiranja Predrag Stanimirovi

Predrag S. Stanimirovi

Osnove programiranja

1. OSNOVNI ELEMENTI PROGRAMSKIH JEZIKA....................................................51.1. Pseudojezik kao opti model viih programskih jezika................................................................................5 1.2. Azbuka jezika....................................................................................................................................................6 1.3. Identifikatori i rezervisane rei.......................................................................................................................7 1.4. Konstante.........................................................................................................................................................8 1.5. Promenljive.......................................................................................................................................................9 1.6. Komentari.........................................................................................................................................................9 1.7. Struktura programa.......................................................................................................................................10 1.7.1. Struktura programa u Pascal-u.................................................................................................................10 1.7.2. Struktura programa u C............................................................................................................................10

2. TIPOVI PODATAKA................................................................................................11Statika i dinamika tipizacija......................................................................................................................13 2.1. Koncept slabih tipova....................................................................................................................................13 2.2. Koncept jakih tipova podataka.....................................................................................................................14 2.3. Ekvivalentnost tipova.....................................................................................................................................15 2.4. Elementarni tipovi podataka.......................................................................................................................15 2.4.1. Celobrojni tipovi (Integer ili int)..............................................................................................................16 2.4.2. Realni tip (float ili real)............................................................................................................................17 2.4.3. Logiki tip podataka.................................................................................................................................17 2.4.4. Znakovni tipovi........................................................................................................................................17 2.4.5. Nabrojivi tip podataka..............................................................................................................................19 2.4.6. Intervalni tip podataka..............................................................................................................................20 2.5. Elementarni tipovi podataka u nekim jezicima...........................................................................................20 2.5.1. Tipovi podataka u jeziku C.......................................................................................................................20 Celobrojni tipovi u C....................................................................................................................................21 Realni tipovi podataka u C...........................................................................................................................22 Tip char.........................................................................................................................................................23 Konverzija tipova podataka i kast.................................................................................................................24 Vrste konverzije tipova.................................................................................................................................25 Konstante......................................................................................................................................................25 Sizeof operator..............................................................................................................................................26 Osnovne aritmetike operacije ....................................................................................................................26 Operacije poreenja i logike operacije.......................................................................................................28 2.5.2. Standardni tipovi podataka u Pascal-u.....................................................................................................29 Celobrojni tip (Integer).................................................................................................................................29 Tip realnih brojeva (Real).............................................................................................................................30 Znakovni tip podataka (Char).......................................................................................................................30 2.6. Diskretni tipovi podataka u programskim jezicima..................................................................................31 2.6.1. Nabrojivi tipovi u programskim jezicima.................................................................................................31 Pascal............................................................................................................................................................31 Programski jezik C.......................................................................................................................................31 2.6.2. Podintervalni tipovi..................................................................................................................................31

1

Predrag S. Stanimirovi

Osnove programiranja

2.7. Anonimni tipovi..............................................................................................................................................31 2.8. Upotreba typedef iskaza u C.........................................................................................................................32

3. ULAZ I IZLAZ PODATAKA.....................................................................................323.1. Ulaz i izlaz u jeziku PASCAL........................................................................................................................32 3.2. Ulaz i izlaz podataka u jeziku C....................................................................................................................35 3.2.1. Funkcije printf() i scanf().........................................................................................................................35 3.2.3. Direktive pretprocesora u C......................................................................................................................38

4. OSNOVNE UPRAVLJAKE STRUKTURE..........................................................394.1. Sekvenca naredbi i blok.................................................................................................................................40 4.1.1. Globalne i lokalne promenljive................................................................................................................41 4.2. Struktura selekcije.........................................................................................................................................42 4.2.1. If-then struktura........................................................................................................................................43 4.2.2. If-then-else struktura................................................................................................................................44 4.2.3. Operator uslovnog prelaza u C.................................................................................................................49 4.3. Struktura viestruke selekcije.......................................................................................................................50 4.3.1. Viestruka selekcija u Pascal-u.................................................................................................................52 4.3.2. Viestruka selekcija u C............................................................................................................................53 4.4. Programske petlje...........................................................................................................................................56 4.4.1. Programske petlje u Pascal-u....................................................................................................................59 4.4.2. Programske petlje u C .............................................................................................................................62 While naredba u C........................................................................................................................................62 Primena while ciklusa u obradi teksta u C...................................................................................................65 Do-while naredba u C...................................................................................................................................66 For naredba u C............................................................................................................................................66 4.5. Formalizacija repetitivnih iskaza..................................................................................................................69 4.6. Nasilni prekidi ciklusa....................................................................................................................................71 4.7. Naredbe za bezuslovno grananje..................................................................................................................72 4.7.1. Oznake (labele).........................................................................................................................................72

5. POTPROGRAMI....................................................................................................755.1. Funkcije...........................................................................................................................................................77 5.1.1. Funkcije u jeziku Pascal...........................................................................................................................77 5.1.2. Poziv i definicija funkcija u C..................................................................................................................78 Return naredba..............................................................................................................................................79 Prototip funkcije...........................................................................................................................................80 5.1.3. Makroi u jeziku C.....................................................................................................................................84 5.2. Procedure........................................................................................................................................................85 5.2.1. Procedure u jeziku Pascal.........................................................................................................................85 Liste parametara............................................................................................................................................86 5.3. Prenos argumenata.........................................................................................................................................87 5.3.1. Prenos po vrednosti (Call by Value).........................................................................................................87 Poziv po vrednosti u C..................................................................................................................................88

2

Predrag S. Stanimirovi

Osnove programiranja

5.3.2. Prenos po rezultatu (Call by Result).........................................................................................................89 5.3.3. Prenos po vrednosti i rezultatu (Call by Value-Result)............................................................................89 5.3.4. Prenos po referenci (Call by Reference)..................................................................................................89 Reference (upuivai)...................................................................................................................................91 Poziv po adresi pomou pokazivaa u C......................................................................................................92 Prenos po referenci koristei reference u C++.............................................................................................95 Vraanje viestrukih vrednosti......................................................................................................................96 Vraanje viestrukih vrednosti po referenci..................................................................................................98 Predavanje po referenci, zbog efikasnosti....................................................................................................99 5.4. Globalne promenljive kao parametri potprograma..................................................................................105 Primeri........................................................................................................................................................108 5.5. Rekurzivni potprogrami..............................................................................................................................110 5.5.1. Primeri rekurzivnih funkcija u C............................................................................................................113 5.6. Implementacija potprograma......................................................................................................................116 5.7. Scope rules (domen vaenja).......................................................................................................................118 5.8. Memorijske klase u C...................................................................................................................................119 5.8.1. ivotni vek objekata.........................................................................................................................121 5.8.2. Vrste objekata po ivotnom veku.....................................................................................................121 Statiki i automatski objekti.......................................................................................................................121

6. STRUKTURNI TIPOVI PODATAKA.....................................................................1226.1. Polja u programskim jezicima....................................................................................................................122 6.1.1. Anonimne definicije strukturnih tipova..................................................................................................123 Pimeri upotrebe nizova u Pascalu...............................................................................................................124 6.2. Jednodimenzionalni nizovi u C...................................................................................................................132 6.3. Veza izmeu nizova i pointera u C..............................................................................................................136 6.3.1. Pointerska aritmetika..............................................................................................................................138 6.4. Viedimenzionalna polja..............................................................................................................................139 6.4.1. Viedimenzionalni nizovi u Pascal-u......................................................................................................139 6.4.2. Viedimenzionalni nizovi u C.................................................................................................................143 6.4.3. Pokazivai i viedimenzionalni nizovi u C............................................................................................149 6.5. STRINGOVI ................................................................................................................................................150 6.5.1. Stringovi u Pascal-u................................................................................................................................150 Operacije nad stringovima u Pascalu..........................................................................................................151 6.5.2. Stringovi u C...........................................................................................................................................163 Inicijalizacija i obrada stringova.................................................................................................................163 Testiranje i konverzija znakova..................................................................................................................164 Uitavanje i ispis stringova........................................................................................................................166 Standardne funkcije za rad sa stringovima u C..........................................................................................169 6.6. Zapisi.............................................................................................................................................................171 6.7. Strukture i nabrojivi tipovi u c...................................................................................................................177 6.7.1. lanovi strukture....................................................................................................................................177 6.7.2 Strukturni tipovi i pokazivai u C...........................................................................................................179 6.7.3. Definicija strukturnih tipova pomou typedef........................................................................................182 6.7.4. Unije.......................................................................................................................................................190

3

Predrag S. Stanimirovi

Osnove programiranja

6.8. Nabrojivi tip podataka u c...........................................................................................................................191 6.9. Zapisi sa varijantama...................................................................................................................................193 6.9.1. Naredba with u Pascal-u.........................................................................................................................198 6.10. Skupovi........................................................................................................................................................199 6.11. Datoteke.......................................................................................................................................................204 6.11.1. Datoteke u jeziku Pascal.......................................................................................................................205 Datoteni tipovi podataka...........................................................................................................................205 Povezivanje datotene promenljive sa datotekom......................................................................................206 Kreiranje datoteka.......................................................................................................................................206 Kreiranje datoteka.......................................................................................................................................207 Tekstualne datoteke.....................................................................................................................................216 Standardne datoteke INPUT i OUTPUT....................................................................................................220 Direktni pristup datotekama.......................................................................................................................220 6.11.2. Pristup datotekama u c..........................................................................................................................226 Otvaranje i zatvaranje datoteka..................................................................................................................226 Funkcije fgetc() i fputc().............................................................................................................................228 fputc............................................................................................................................................................228 Funkcije fprintf() i fscanf().........................................................................................................................230 Funkcija feof()............................................................................................................................................231 fclose, _fcloseall.........................................................................................................................................234 feof..............................................................................................................................................................234 Binarne datoteke.........................................................................................................................................234 Direktni pristup datotekama.......................................................................................................................236

7. DINAMIKE STRUKTURE PODATAKA..............................................................2367.1. Statike i dinamike strukture podataka...................................................................................................236 7.2. Pokazivai u jeziku Pascal..........................................................................................................................237 7.2.1. Dinamike promenljive..........................................................................................................................237 7.2.2. Pokazivake promenljive........................................................................................................................237 7.3. Dinamike strukture podataka u jeziku Pascal........................................................................................238 7.3. Dinamike strukture podataka u C............................................................................................................261 8.3.1. Nizovi i dinamika alokacija memorije u C...........................................................................................262 7.3.2. Jednostruko povezane liste.....................................................................................................................267 7.3.3. Stekovi....................................................................................................................................................268 7.3.4. Ureene povezane liste...........................................................................................................................274 8.3.5. Vanija svojstva pokazivaa...................................................................................................................275 7.3.5. Binarno stablo.........................................................................................................................................279 7.4. Pointeri na funkcije u C...............................................................................................................................281 Literatura.............................................................................................................................................................282

4

Predrag S. Stanimirovi

Osnove programiranja

1. Osnovni elementi programskih jezika1.1. Pseudojezik kao opti model viih programskih jezikaZa definiciju pseudojezika kao opteg modela viih programskih jezika neophodno je obuhvatiti sledee etiri fundamentalne komponente: (1) Tipovi i strukture podataka koje pseudojezik podrava: - statiki skalarni tipovi, - statiki strukturirani tipovi, - dinamiki tipovi sa promenljivom veliinom, - dinamiki tipovi sa promenljivom strukturom. (2) Osnovne kontrolne strukture koje se primenjuju u pseudojeziku: - sekvenca, - selekcije, - ciklusi, - skokovi. (3) Operacije ulaza i izlaza podataka: - ulaz/izlaz podataka za ulazno-izlazne ureaje i datoteke, - konverzija tekstualnog i binarnog formata podataka. (4) Tehnike modularizacije programa: - nezavisne funkcije i procedure, - interne funkcije i procedure, - rekurzivne funkcije i procedure. Razni tipovi podataka neophodni su u programskim jezicima da bi podraavali razne tipove objekata koje sreemo u matematikim modelima. Podaci mogu biti skalarni ili strukturirani. Podatak je strukturiran ukoliko se sastoji od vie komponenti koje se nalaze u precizno definisanom odnosu. Primer strukturiranog objekta je pravougaona matrica realnih brojeva kod koje svaki element predstavlja komponentu koja se nalazi u odreenom odnosu sa ostalim komponentama. Podatak je skalaran ukoliko se ne sastoji od jednostavnijih komponenti. Jedan od skalarnih tipova podataka na svim programskim jezicima je celobrojni tip podataka. Lako je uoiti da za svaki tip podataka postoje operacije koje za njih vae, a ne vae za druge tipove podataka. Tako je na primer inverzija matrice operacija koja se ne primenjuje na celobrojne skalare, na isti nain kao to se operacija celobrojnog deljenja dva skalara ne moe primeniti na matrice. Osnovne kontrolne strukture su izuzetno vana komponenta svakog programskog jezika. Pomou njih se odreuje redosled izvravanja operacija koje raunar obavlja. Osnovni tipovi kontrolnih struktura su sekvenca kod koje se instrukcije obavljaju onim redosledom kojim su napisane u programu, i strukture sa grananjima, ciklusima i skokovima. Grananja se koriste za izbor jednog od vie paralelnih programskih segmenata, ciklusi realizuju ponavljanje nekog niza instrukcija, a skokovi slue za kontrolisani izlaz iz petlji, iz programa (kraj rada) i za realizaciju pojedinih osnovnih kontrolnih struktura.

5

Predrag S. Stanimirovi

Osnove programiranja

Da bi se omoguilo komuniciranje raunara sa spoljnim svetom potrebne su instrukcije ulaza i izlaza podataka. Pri tome podaci mogu da se uitavaju sa tastatura ili iz datoteka i da se prenose na ekrane, tampae, ili u datoteke. Pod datotekom (file) podrazumevamo osnovnu organizaciju podataka koja obuhvata proizvoljan broj manjih jednoobrazno strukturiranih celina koje se nazivaju zapisi. Svaki zapis sadri podatke o jednoj jedinici posmatranja. Na primer, zapis moe sadrati strukturirane podatke o motornom vozilu (tip, godina proizvodnje, snaga motora, vlasnik, itd.), dok skup veeg broja ovakvih zapisa predstavlja datoteku motornih vozila. Alfanumeriki podaci (slova, cifre i specijalni znaci) se uvaju u tekst datotekama, a numeriki podaci mogu da se uvaju bilo u tekstualnoj bilo u kompaktnoj binarnoj formi. Za sve podatke postoji format kojim se odreuje njihova struktura, a pri nekim prenosima podataka moe se automatski vriti i konverzija formata. Ako bi programi bili formirani kao neprekidni nizovi instrukcija, onda bi kod velikih programa bilo nemogue razumevanje naina rada celine, i na taj nain bilo bl znatno oteano odravanje programa. Zbog toga su mehanizmi modularizacije programa od vitalnog znaaja za uspeh nekog programskog jezika. Pod modularizacijom programa podrazumevamo razbijanje programa na manje (najee nezavisne) celine kod kojih su precizno definisani ulazni i izlazni podaci, kao i postupak kojim se na osnovu ulaznih podataka dobijaju izlazni podaci. U ovu grupu spadaju nerekurzivne i rekurzivne funkcije i procedure. Prilikom definicije jezika polazi se od osnovnog skupa znakova, azbuke jezika koja sadri sve zavrne simbole (terminalne simbole) jezika. Nad azbukom jezika definiu se ostali elementi jezika, konstante, rezervisane rei, identifikatori od kojih se dalje grade druge sloene sintaksne kategorije kao to su na primer opisi, upravljake naredbe i slino.

1.2. Azbuka jezikaAzbuka jezika predstavlja osnovni skup simbola (znakova) od kojih se grade sve sintaksne kategorije jezika. Broj znakova azbuke se obino razlikuje od jezika do jezika i kree se od najmanje 48 do 90 znakova. Azbuka programskog jezika obino obuhvata skup velikih i malih slova engleske abecede, skup dekadnih cifara i odreeni skup specijalnih znakova. Dok je kod starijih programskih jezika bilo uobiajeno da se koriste samo velika slova (na primer FORTRAN IV), danas se skoro redovno dozvoljava i ravnopravno korienje malih slova abecede. Azbuke programskih jezika se najvie razlikuju po skupu specijalnih znakova koje obuhvataju. Narednih nekoliko primera azbuka programskih jezika to ilustruje. Azbuka jezika Pascal:slovo: "A" | " B " | " C " | " D " | "E"| " F " | " G " | " H" | " l " | " J " | " K " | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y"| "Z"| "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k"| "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | cifra: "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" specijalni znak: "+" | "-" | "*" | "/" | "=" | ""| "["| "]" | "." | "," | ";" | ":" | "^" | "(" | ")" | "'" | "" | "=" | ":=" | ". ." | rezervisana re: "AND" | "ARRAY" | "BEGIN" | "CASE" | "CONST" | "DIV"| "DOWNTO" | DO" | "ELSE" | "END" | " F I L E" | " FO R" | "FU NCTION" | "GOTO" | " IF" | "IN" | "LABEL" | "MOD" | "NIL" | "NOT" | "OF" | "OR" | "PACKED" | "PROCEDURE" | "PROGRAM" | "RECORD" | "REPEAT" | "SET" | "THEN" | "TO" | "TYPE" | "UNTIL" | "VAR" | "WHILE" |"WITH"

Azbuka jezika Cvelika slova: A | B| C | D| E| F|G|H|I|J|K|L|M|N|0| P|Q| R|S|T|U|V|W|X|Y|Z cifre: 0 |1 |2|3|4|5|6|7|8|9 specijalni znaci: + | - | * | / |= | ( | ) | { \ } \ [ | ] \ < | > | ' | " | ! | # | \ | % | & | | | | _ | ^ | | ~ \ , \ ; | : | ? znak blanko mala slova: a | b | c | d | e| f|g|h| i| j| k|l|m|n|o|p|q|r|s| t|u| v|w|x|y|z

6

Predrag S. Stanimirovi

Osnove programiranja

Azbuka jezika Adavelika slova: A | B| C | D| E| F|G|H|I|J|K|L|M|N|0| P|Q| R|S|T|U|V|W|X|Y|Z cifre: 0 |1 |2|3|4|5|6|7|8|9 specijalni znaci: " | # | & | ' | ( | ) | * | + | , | - | / | : | ; | < | = | > | _ | / znak blanko mala slova: a | b | c | d | e| f|g|h| i| j| k|l|m|n|o|p|q|r|s| t|u| v|w|x|y|z drugi specijalni znaci: ! | $ | % | @ | [ | ] |^| ' | { | } | ~

Danas se obino skup specijalnih znakova azbuke programskog jezika standardizuje i svodi na skup znakova meunarodnog standardnog koda ISO7 (ASCII kod).b | ! | " | $ | % | & | ' | ( | ) | * | + | , | - | . | / | : | ; | < | = | > | ? | @ | [ | ] | \ | ^ ili _ | ` | { | } | ~

eto se pored osnovnog skupa specijalnih znakova koriste i sloeni simboli, obino dvoznaci, kao na primer: | ** | >= | | =< | < | := | -> | /* | */ | U nekim programskim jezicima (FORTRAN), zbog nedovoljnog broja odgovarajuih znakova umesto specijalnih znakova koriste se posebne simbolike oznake .EQ., .NE., .GT., .GE., .LT., .LE., kojima se oznaavaju relacije jednako, razliiti, vee, vee ili jednako, manje i manje ili jednako, redom.

1.3. Identifikatori i rezervisane reiIdentifikatori su uvedene rei kojima se imenuju konstante, promenljive, potprogrami, programski moduli, klase, tipovi podataka i slino. U svim programskim jezicima postoji slina konvencija za pisanje identifikatora. Identifikatori su nizovi koji se obino sastoje od slova i cifara i obavezno zapoinju slovom. Ovo ogranienje omoguava jednostavniju implementaciju leksikog analizatora i razdvajanje identifikatora od drugih sintaksnih kategorija (numerikih i znakovnih konstanti na primer). U nekim jezicima dozvoljeno je da se i neki specijalni znaci pojave u okviru identifikatora. Najee je to crtica za povezivanje "_" kojom se postie povezivanje vie rei u jedan identifikator. Na primer, u jeziku C crtica za povezivanje se moe koristiti na isti nain kao i slova, to znai da identifikator moe da zapone ovim znakom. Slede primeri nekih identifikatora:ALFA A B1223 Max_vrednost PrimerPrograma

U jeziku C velika i mala slova se razlikuju. Programski jezik PASCAL ne razlikuje velika i mala slova. Dobra je programerska praksa da identfikatori predstavljaju mnemonike skraenice. Nizovi znakova azbuke koji u programu imaju odreeni smisao nazivaju se lekseme. Leksema moe da bude i samo jedan znak. Re jezika ije je znaenje utvreno pravilima tog jezika naziva se rezervisana re. Rezervisane rei mogu da budu zabranjene, kada se ne mogu koristiti kao identifikatori u programu. Takav je sluaj u programskom jeziku C. Meutim, i u jezicima u kojima je to dozvoljeno ne preporuuje se korienje kljunih rei kao identifikatora jer moe da smanji preglednost programa, a u nekim sluajevima da dovede i do ozbiljnih greaka u programu. Poznat je, na primer, sluaj greke sa DO naredbom koji je doveo do pada letilice iz satelitskog programa Geminy 19. U programu za upravljanje letilicom stajala je DO naredba napisana kao:DO 10 I = 1. 10

umesto ispravnog kodaDO 10 I = 1, 10.

Greka pri prevoenju meutim nije otkrivena jer je leksiki analizator ovu liniju kda protumaio kao naredbu dodeljivanjaD010I = 1.10

7

Predrag S. Stanimirovi

Osnove programiranja

u kojoj se promenljivoj D010I dodeljuje vrednost 1.10. Greka je otkrivena tek u fazi izvravanja programa kada je prouzrokovala pad letilice. Rezervisane rei jezika C:auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, voatile, while.

U poreenju sa ostalim programskim jezicima, C poseduje mali broj slubenih rei. Kod nekih programskih jezika (COBOL) postoje kategorije obaveznih rei i kategorija neobaveznih rei. Obavezne rei ne smeju da budu izostavljene iz naredbe u kojoj je po sintaksi definisana njihova upotreba i na osnovu njih kompilator analizira i prevoi naredbu, dok neobavezne rei imaju samo dokumentacioni karakter i upotrebljavaju se da dopune naredbu i njen tekst priblie govornom jeziku. Razmotrimo sledei primer definicije naredbe READ kojom se ita slog datoteke:READ ime-datoteke [NEXT] RECORD [INTO ime-podatka] AT END iskaz

Rei READ, NEXT, INTO i END su obavezne prilikom pisanja odgovarajuih delova naredbe, njima je odreena sintaksa naredbe, odnosno koristi ih sintaksni analizator pri prevoenju naredbe. Rei RECORD i AT su neobavezne, ali se mogu koristiti da bi se poveala jasnoa naredbe.

1.4. KonstanteBilo koji niz znakova u programu, posmatran nezavisno od njegovog logikog znaenja, nad kojim se mogu izvravati odreena dejstva (operacije) naziva se podatak. Deo podatka nad kojim se mogu izvravati elementarne operacije naziva se element podatka. Elementu podatka u matematici priblino odgovara pojam skalarne veliine. Podatak je ureeni niz znakova kojim se izraava vrednost odreene veliine. Veliina koja u toku izvravanja programa uvek ima samo jednu vrednost, koja se ne moe menjati, naziva se konstanta. Kao oznaka konstante koristi se ona sama. U nekim programskim jezicima (Pascal, Ada, C) postoji mogunost imenovanja konstante. Konstantama se dodeljuju imena koja se u programu koriste umesto njih. Na taj nain nastaju simbolike konstante. Tipovi konstanti koje se mogu koristiti u odreenom programskom jeziku odreeni su tipovima podataka koje taj jezik predvia. U jeziku C se koristi vie vrsta konstanti i to su: - celobrojne konstante; - relane konstante; - karakteri: 'a', 'b', ... ; - stringovi: sekvence karaktera izmeu navodnika. Osim ovih tipova konstanti, u jeziku Pascal se mogu koristiti i logike konsatnte. Slede neki primeri razliitih vrsta konstanti: Celobrojne dekadne konstante: 1; 50; 153; +55; -55 Realne konstante u fiksnom zarezu: 3.14; 3.0; -0.314; -.314; +.314 Realne konstante u pokretnom zarezu:3.14E0; -0.314E1; -.314E+0; +.314E-2

(FORTRAN, Pascal, Ada, C) (FORTRAN)

Realne konstante dvostruke tanosti:3.14D0; -3,14D1; +.314D2

Kompleksne konstante:

8

Predrag S. Stanimirovi

Osnove programiranja

(3.14, 0.13);(0, -23) 3.14+0.13 I

(FORTRAN) (MATHEMATICA)0XAA; 0X11

Oktalne konstante (C): 0567; 0753; 0104 Heksadecimalne konstante (C): 0X1F; Logike konstante: true; false.TRUE.; .FALSE.

Long konstante (C): 123L; 527L;321L;+147L (Pascal, Ada) (FORTRAN) (Pascal, Ada, C) (Pascal, C) (COBOL) (MATHEMATICA) (MATHEMATICA)

Znakovne konstante: 'A'; 'B' String konstante: "Beograd"; "Alfa 1" Simbolike konstante: ZERO; ZEROS; SPACEPi, E

Racionalni brojevi: 2/3;

-4/5

Poznate simbolike konstante u paketu MATHEMATICA imaju svoja posebna, rezervisana imena: Pi 3.14159 E e2.71828 Degree /180: faktor konverzije stepena u radijane I i= 1 Infinity

1.5. PromenljiveVeliine ije se vrednosti menjaju u toku izvravanja programa nazivaju se promenljive. Promenljivoj se u programu dodeljuje ime, i u svakom trenutku ona je definisana svojom vrednou. Kaemo da je svaka promenljiva u programu povezana sa tri pojma: imenom - identifikatorom promenljive. referencom - pokazivaem koji odreuje mesto promenljive u memoriji i vrednou - podatkom nad kojim se izvravaju operacije. Veza izmeu imena, reference i vrednosti promenljive moe se predstaviti sledeim dijagramom:

ime referenca vrednost Ovaj dijagram u sluaju imenovane konstante dobija oblik:

ime

vrednost

Na primer naredbu dodeljivanja X:=3.141592 itamo: X dobija vrednost 3.141592, pri emu imamo u vidu da je X simboliko ime memorijske lokacije gde se u toku izvravanja programa pamti vrednost 3.141592. Pri tome je potrebno imati na umu sledee pojmove: vrednost 3.141592, koja predstavlja vrednost promenljive X, adresu memorijske lokacije u kojoj se pamti vrednost 3.141592, ime promenljive X, identifikator koji se u datom programu koristi kao ime promenljive koja ima datu brojnu vrednost.

1.6. KomentariU svim programskim jezicima postoji mogunost proirenja izvrnog koda programa komentarima kojima se kod dodatno pojanjava. Ovi komentari se u toku prevoenja programa ignoru od strane9

Predrag S. Stanimirovi

Osnove programiranja

kompilatora i ne ulaze u sastav izvrnog koda koji se generie prevoenjem programa. Meutim komentari su veoma vaan deo programa kojim se podeava njegova dokumentarnost, i bitno utiu na efikasnost analize programa. Konvencija za zapisivanje komentara se razlikuje od jezika od jezika. Slede primeri komentara u nekim programskim jezicima:{Komentari se u Pascal-u zapisuju izmeu velikih zagrada.} -- Komentari u jeziku Ada zapoinje sa dve crtice i mogu -- da se nau bilo gde u programu. /* Ovo je primer komentara u jeziku C */ // Kratak C komentar u okviru jednog reda (* Komentar u PASCAL-u i jeziku MATHEMATICA *)

1.7. Struktura programaGlobalna struktura programa zavisi od toga da li jezik zahteva deklaraciju tipova promenljivih kao i da li su u jeziku zastupljeni stariji koncepti sa implicitnim definicijama tipova promenljivih ili je zastupljen noviji koncept sa eksplicitnim definicijama.

1.7.1. Struktura programa u Pascal-uProgrami u Pascal-u se sastoji iz sledeih elemenata, redom: - odeljak deklaracija obeleja, - odeljak definicija konstanti, - odeljak definicija tipova, - odeljak deklaracija promenljivih, - odeljak deklaracija procedura i/ili funkcija, i - izvrni deo programa obuhvaen izmeu begin i end. Primer. Struktura programa u Pascal-u,program Primer (input, output); {Zaglavlje programa} const n = 10; {Opis konstanti} type {Definicije tipova} Vektor = array[l..10] of integer; var {Deklaracije promenljivih}; a, b : integer; v : Vektor; begin {Poetak tela samog programa} {...} end. {Kraj glavnog programa}

1.7.2. Struktura programa u CProgrami pisani u C jeziku imaju strukturu bloka, ali se za ograniavanje bloka koriste vitiaste zagrade umesto zagrada begin i end. Zastupljen je takoe stariji koncept bloka, poznat iz jezika Algol 60 i PL/1, gde se opisi elemenata koji pripadaju jednom bloku nalaze unutar zagrada { i }, za razliku od novijeg koncepta koji smo imali u primerima iz Pascal-a, kod kojih opisi elemenata bloka prethode zagradi begin kojom se otvara blok. Svaki blok u C-u takoe moe da sadri opise promenljivih i funkcija. C program se moe nalaziti u jednom ili vie fajlova. Samo jedan od tih fajlova (glavni programski modul) sadri funkciju main kojom zapoinje izvrenje programa. U programu se mogu koristiti funkcije iz standardne biblioteke. U tom sluaju se moe navesti direktiva pretprocesora oblika#include .

10

Predrag S. Stanimirovi

Osnove programiranja

esta je direktiva oblika #include kojom se ukljuuju funkcije iz fajla stdio.h (standard input/output header). Glavni program, main(), takoe predstavlja jednu od funkcija. Opis svake funkcije se sastoji iz zaglavlja i tela funkcije. U ovom sluaju, zaglavlje funkcije je najjednostavnije, i sadri samo ime funkcije i zagrade (). Iza zaglavlja se navodi telo funkcije koje se nalazi izmeu zagrada { i }. Izmeu ovih zagrada se nalaze operatori koji obrazuju telo funkcije. Svaki prost operator se zavrava znakom ';' a sloeni operator se pie izmeu zagrada { i }. U jeziku C sve promenljive moraju da se deklariu. Opti oblik jednostavnog programa je:void main() { }

2. TIPOVI PODATAKAJedan od najznaajnijih pojmova u okviru programskih jezika je pojam tipa podataka. Atribut tipa odreuje skup vrednosti koje se mogu dodeljivati promenljivima, format predstavljanja ovih vrednosti u memoriji raunara, skup osnovnih operacija koje se nad njima mogu izvravati i veze sa drugim tipovima podataka. Na primer, promenljivoj koja pripada celobrojnom tipu mogu se kao vrednosti dodeljivati samo celi brojevi iz odreenog skupa. Nad tako definisanim podacima mogu se izvravati osnovne aritmetike operacije sabiranja, oduzimanja, mnozenja, deljenja, stepenovanja, kao i neke specifine operacije kao to je odreivanje vrednosti jednog broja po modulu drugog. Koncept tipova podataka prisutan je, na neki nain, ve kod simbolikih asemblerskih jezika gde se za definiciju tipa koriste implicitne definicije preko skupa specijalnih znakova kojima se odreuju podaci razliitog tipa. Neka je zadat skup T sainjen od n proizvoljnih apstraktnih objekata: T:={v1,...,vn}, n>1. Ukoliko su svi objekti istorodni, u smislu da se u okviru nekog programskog jezika na njih moe primenjivati jedan odreeni skup operatora, onda se T naziva tip podataka, Ako za promenljive x i y uvek vai xT i yT onda su one tipa T. To u okviru programa formalno definiemo iskazomDEFINE x, y : T.

Vrednost je bilo koji entitet kojim se moe manipulisati u programu. Vrednosti se mogu evaluirati, zapamtiti u memoriji, uzimati kao argumenti, vraati kao rezultati funkcija, i tako dalje. Razliiti programski jezici podravaju razliite tipove vrednosti. Jedna od klasifikacija osnovnih tipova podataka prikazana je na slici.

11

Predrag S. Stanimirovi

Osnove programiranja

Tipovi podataka su podeljeni u dve osnovne grupe: statiki tipovi i dinamiki tipovi. Pod statikim tipovima (ili tipovima sa statikom strukturom podrazumevamo tipove podataka kod kojih je unapred i fiksno definisana unutranja struktura svakog podataka, a veliina (t.j. memorijska zapremina) fiksno se definie pre (ili u vreme) izvravanja programa koji koristi podatke statikog tipa. Statiki tipovi podataka obuhvataju skalarne i strukturirane podatke. Pod skalarnim tipovima podrazumevamo najprostije tipove podataka ije su vrednosti skalari, odnosno takve veliine koje se tretiraju kao elementarne celine i za koje nema potrebe da se dalje razlau na komponente. U tom smislu realne i kompleksne brojeve tretiramo kao skalare u svim programskim jezicima koji ih tretiraju kao elementarne celine (neki jezici nemaju tu mogunost pa se tada kompleksni brojevi tretiraju kao struktura koja se razlae na realni i imaginarni deo; na slian nain mogao bi se realni broj razloiti na normalizovanu mantisu i eksponent). Pod strukturiranim tipovima podataka podrazumevamo sve sloene tipove podataka koji se realizuju povezivanjem nekih elementarnih podataka u precizno definisanu strukturu. U ulozi elementarnih podataka obino se pojavljuju skalari ili neke jednostavnije strukture. Kompozitna vrednost ili struktura podataka (data structure) jeste vrednost koja je komponovana iz jednostavnijih vrednosti. Kompozitni tip jeste tip ije su vrednosti kompozitne. Programski jezici podravaju mnotvo kompozitnih vrednosti: strukture, slogove, nizove, algebarske tipove, objekte, unije, stringove, liste, stabla, sekvuencijalni fajlovi, direktni fajlovi, relacije, itd. Skalarni tipovi podataka mogu biti linearno ureeni ili linearno neureeni. Linearno ureeni tipovi podataka su tipovi kod kojih se vrednosti osnovnog skupa T preslikavaju na jedan interval iz niza celih brojeva, t.j. za svaki podatak xT zna se redni broj podatka. Stoga svaki podatak izuzev poetnog ima svog prethodnika u nizu, i slino tome, svaki podatak izuzev krajnjeg ima svog sledbenika u nizu. Pod dinamikim tipovima podataka podrazumevamo tipove podataka kod kojih se veliina i/ili struktura podataka slobodno menja u toku obrade. Kod dinamikih tipova sa promenljivom veliinom podrazumevamo da je struktura podataka fiksna, ali se njihova veliina dinamiki menja tokom obrade tako da se saglasno tome dinamiki menjaju i memorijski zahtevi. Na primer, dopisivanjem novih zapisa u sekvencijalnu datoteku veliina datoteke raste uz neizmenjenu strukturu. Kod dinamikih

12

Predrag S. Stanimirovi

Osnove programiranja

tipova sa promenljivom strukturom unapred je fiksno definisan jedino princip po kome se formira struktura podataka dok se sama konkretna struktura i koliina podataka u memoriji slobodno dinamiki menjaju.

Statika i dinamika tipizacijaPre izvrenja bilo koje operacije, moraju se proveriti tipovi operanada da bi se spreila greka u tipu podataka. Na primer, pre izvrenja operacije mnoenja dva cela broja, oba operanda moraju biti proverena da bi se osiguralo da oni budu celi brojevi. Slino, pre izvrenja neke and ili or operacije, oba operanda moraju biti proverena da bi se osiguralo da oni budu tipa boolean. Pre izvrenja neke operacije indeksiranja niza, tip operanda mora da bude array (a ne neka prosta vrednost ili slog). Ovakva provera se naziva proverom tipa (type checks). Provera tipa mora da bude izvrena pre izvrenja operacije. Meutim, postoji izvestan stepen slobode u vremenu provere: provera tipa se moe izvriti ili u vremenu kompilacije (compile-time) ili u vremenu izvrenja programa (at run-time). Ova mogunost lei u osnovi vane klasifikacije programskih jezika na statiki tipizirane (statically typed) i dinamiki tipizirane (dynamically typed). U nekom ststiki tipiziranom jeziku, svaka varijabla i svaki izraz imaju fiksni tip (koji je ili eksplicitno postavljen od strane programera ili izveden od strane kompajlera). Svi operandi moraju biti proverenog tipa (type-checked) u vremenu kompilovanja programa (at compile-time). U dinamiki tipiziranim jezicima, vrednosti imaju fiksne tipove, ali varijable i izrazi nemaju fiksne tipove. Svaki put kada se neki operand izraunava, on moe da proizvede vrednost razliitog tipa. Prema tome, operandi moraju imati proveren tip posle njihovog izraunavanja, ali pre izvrenja neke operacije, u vremenu izvrenja programa (at run-time). Mnogi jezici visokog nivoa su statiki tipizirani. SMALLTALK, LISP, PROLOG, PERL, i PYTHON jesu primeri dinamiki tipiziranih jezika. S druge strane, moderni funkcionalni jezici (kao ML, HASKELL, MATHEMATICA) uzdravaju se od takvih ogranienja: oni omoguavaju da sve vrednosti, ukljuujui i funkcije, imaju slinu obradu. Na osnovu toga kako je postavljen koncept tipova podataka, programski jezici mogu da se svrstaju u dve grupe: na programske jezike sa slabim tipovima podataka i na jezike sa jakim tipovima podataka.

2.1. Koncept slabih tipovaU sluaju jezika sa slabim tipovima podataka informacija o tipu promenljive koristi se, i korektna je samo na mainskom nivou, u fazi izvrenja programa. Ovako postavljen koncept podrazumeva sledee mogunosti: (1) Operacija koja se od strane kompilatora prihvati kao korektna, na nivou izvornog koda programa, moe da bude potpuno nekorektna. Razmotrimo sledei primer:char c; c = 4;

Promenljiva c definisana je da pripada tipu char, to podrazumeva da joj se kao vrednosti dodeljuju znaci kao podaci. Meutim umesto korektnog dodeljivanja c = '4', promenljivoj c je dodeljena vrednost broja 4 kao konstante celobrojnog tipa. Kod jezika sa slabim tipovima podataka kompilator ne otkriva ovu greku i informaciju o tipu koristi samo na mainskom nivou kada promenljivoj c dodeljuje vrednost jednog bajta memorijske lokacije u kojoj je zapisana konstanta 4. Oigledno je da ovako postavljen koncept tipova moe da dovede do veoma ozbiljnih greaka u izvravanju programa koje se ne otkrivaju u fazi kompilovanja programa. (2) Koncept slabih tipova podrazumeva odreeni automatizam u transformaciji tipova podataka u sluaju kada se elementi razliitih tipova nalaze u jednom izrazu ija se vrednost dodeljuje promenljivoj odreenog tipa. Razmotrimo sledei primer:float x, y; int i, j, k;

13

Predrag S. Stanimirovi i = x; k = x-j ;

Osnove programiranja

Promenljive x i y su realne (tipa float), a i, j i k celobrojne (tipa int). Naredbom i=x; vri se dodeljivanje vrednosti tipa float promenljivoj celobrojnog tipa. Kod jezika sa slabim tipovima ovo dodeljivanje je dozvoljeno iako se pri tome x svodi na drugi format i pravi greka u predstavljanju njegove vrednosti. Kod ovako postavljenog koncepta tipova, da bi se napisao korektan program potrebno je tano poznavati mehanizme transformacije tipova. U drugoj naredbi iz primera (k = x-j;) od broja x koji je tipa float treba oduzeti broj j, tipa int i rezultat operacije dodeliti promenljivoj tipa int. Da bi smo bili sigurni u korektnost rezultata potrebno je da znamo redosled transformacija koje se pri tome izvravaju, odnosno da li se prvo x prevodi u int i onda izvrava oduzimanje u skupu celih brojeva i vrednost rezultata dodeljuje promenljivoj tipa int ili se j prevodi u tip float, izvrava oduzimanje u skupu realnih brojeva, a zatim rezultat prevoi u tip int i dodeljuje promenljivoj k. Koncept slabih tipova podataka doputa puno slobode kod zapisivanja izraza u naredbama dodeljivanja; meutim cena te slobode je nejasan program sa skrivenim transformacijama, bez mogunosti kontrole i korienja informacije o tipu u fazi kompilovanja programa.

2.2. Koncept jakih tipova podatakaKoncept jakih tipova podataka obuhvata nekoliko osnovnih principa: Tip podataka odreuju sledei elementi: - skup vrednosti, - format registrovanja podataka, - skup operacija koje se nad podacima mogu izvravati, - skup funkcija za uspostavljanje veza sa drugim tipovima podataka. Sve definicije tipa moraju da budu javne, eksplicitne. Nisu dozvoljene implicitne definicije tipova. Objektu se dodeljuje samo jedan tip. Dozvoljeno je dodeljivanje vrednosti samo odgovarajueg tipa. Dozvoljene su samo operacije obuhvaene tipom. Tip je zatvoren u odnosu na skup operacija koji obuhvata. Ove operacije se mogu primenjivati samo nad operandima istog tipa. Meoviti izrazi nisu dozvoljeni. Dodeljivanje vrednosti raznorodnih tipova mogue je samo uz javnu upotrebu funkcija za transformaciju tipa. U sledeim primerima date su naredbe koje po ovom konceptu nisu dozvoljene:var x: real; i: integer; c: char; i := A c := 10 { { { { x je realnog tipa } i je celobrojnog tipa } c je znakovnog tipa } nekorektno, promenljivoj celobrojnog tipa dodeljuje se znakovna vrednost } { nekorektno, promenljivoj znakovnog tipa dodeljuje se celobrojna vrednost }

Koncept jakih tipova poveava pouzdanost, dokumentarnost i jasnou programa. Kako se zahteva eksplicitna upotreba operacija za transformaciju tipa, onda je nedvosmisleno jasno da je odreena transformacija na nekom mestu namerna i potrebna. Ovaj koncept omoguava da se informacija o tipu moe koristiti u fazi kompilovanja programa i na taj nain postaje faktor pouzdanosti programa. Izbor izmeu statike i dinamike tipizacije je pragmatian: Statika tipizacija je efikasnija. Dinamika tipizacija zahteva (verovatno ponovljenu) proveru tipova u vremenu izvrenja programa (run-time type checks), to usporava izvrenje programa. Statika tipizacija zahteva jedino proveru tipa u vremenu kompilacije programa (compile-time type checks),

14

Predrag S. Stanimirovi

Osnove programiranja

ija je cena minimalna (i izvrava se jedanput). Osim toga, dinamika tipizacija primorava sve vrednosti da budu etiketirane (tagged) (da bi se omoguila provera u vreme izvrenja), a ovakvo oznaavanje poveava upotrebu memorijskog prostora. Statika tipizacija ne zahteva ovakvo oznaavanje. Statika tipizacija je sigurnija: kompajler moe da proveri kada program sadri greke u tipovima. Dinamika tipizacija ne omoguava ovakvu sigurnost. Dinamika tipizacija obezbeuje veliku fleksibilnost, to je neophodno za neke aplikacije u kojima tipovi podataka nisu unapred poznati. U praksi vea sigurnost i efikasnost statike tipizacije imaju prevagu nad veom fleksibilnou dinamike tipizacije u velikoj veini aplikacija. Veina programskih jezika je statiki tipizirana.

2.3. Ekvivalentnost tipovata ekvivalentnost tipova oznaava zavisi od programskog jezika. (Sledea diskusija podrazumeva da je jezik statiki tipiziran.) Jedna mogua definicija ekvivalentnosti tipova jeste strukturna ekvivalentnost (structural equivalence): T1 T2 ako i samo ako T1 i T2 imaju isti skup vrednosti. Strukturna ekvivalentnost se tako naziva zato to se ona moe proveriti poreenjem struktura tipova T1 i T2. (Nepotrebno je, a u optem sluaju i nemogue, da se prebroje sve vrednosti ovih tipova.) Kada kompilator jezika sa jakim tipovima podataka treba da obradi naredbu dodeljivanja oblika:x := izraz

on vri dodeljivanje samo u sluaju ekvivalentnosti tipa promenljive sa leve strane dodeljivanja i rezultata izraza na desnoj strani naredbe, osim u sluaju kada je na desnoj strani celobrojni izraz a na levoj strani promenljiva nekog realnog tipa. Primer. Sledei program u PASCAL-u je korektan:program primer; var i:integer; u:real; begin readln(i); u:=i; end.2 i = 2

writeln('i = ',i,' u = ',u);

Na primer, za vrednost 2 promenljive i dobija se:u = 2.0000000000E+00

Prilikom kompilovanja sledeeg programa prijavljuje se sintaksna greka type mismatch.program primer; var i:integer; u:real; begin readln(u); end.

i:=u;

writeln('i = ',i,' u = ',u);

Eksplicitnom ekvivalentnou tipova postie se vea pouzdanost jezika. U ovom sluaju nisu potrebne posebne procedure po kojima bi se ispitivala strukturna ekvivalentnost. Meutim, kada je potrebno vrednost promenljive ili izraza dodeliti promenljivoj koja mu ne odgovara po tipu ovaj koncept zahteva korienje funkcija za transformisanje tipova.

2.4. Elementarni tipovi podatakaU okviru svakog programskog jezika, sistem tipova podataka zasniva se na skupu osnovnih tipova podataka nad kojima se dalje definiu izvedeni tipovi, podtipovi, strukturni tipovi i specifini apstraktni tipovi podataka. Skup osnovnih tipova podataka se obino svodi na tipove podataka za rad

15

Predrag S. Stanimirovi

Osnove programiranja

sa elementarnim numerikim podacima (celi i realni brojevi), znakovnim podacima (pojedinani znaci ASCII koda) i logikim vrednostima (true i false).

2.4.1. Celobrojni tipovi (Integer ili int)Kardinalni tip podataka (tip CARDINAL)Podaci kardinalnog tipa pripadaju jednom intervalu nenegativnih celih brojeva (cardinals ili unsigned integers): T:={0,1,...,m} Kod b-bitnih binarnih maina podrazumeva se da je m = 2b-1, a kod d-cifrenih decimalnih maina na slian nain se podrazumeva m = 10d -1. Na primer, kod 16 bitnih binarnih maina T := {0, 1,..., 65535}. Kardinalni tip podataka se primenjuje u sluajevima kada se eli spreiti pojava i upotreba negativnih brojeva. Podrazumeva se da se kod tipa CARDINAL mogu koristiti aritmetiki izrazi koji obuhvataju operacije +, -, * i / pod uslovom da su svi argumenti tipa CARDINAL.

Celobrojni tip podataka (tip INTEGER)Podaci celobrojnog tipa pripadaju jednom lntervalu celih brojeva koji obuhvata pozitivne i negativne brojeve i koji se obino oznaava na sledei nain:T := {minint, minint+1, ... , -1, 0, 1, ,.. , maxint-1, maxint } .

Ovde je najmanji broj oznaen sa minint, a najvei sa maxint (od engl. maximum integer i minimum integer) pri emu ove veliine nisu fiksne ve zavise od implementacije i prema tome variraju od raunara do raunara. Od nekoliko naina binarnog kodiranja celih brojeva izdvojiemo metod potpunog komplementa koji se najee sree u praksi. Kod ovog postupka brojevi se binarno predstavljaju pomou sledee nbitne rei:n-1 S 3 2 1 0

Bit najstarijeg razreda oznaen sa S (sign) predstavlja predznak broja. Ako je S=0 onda je je broj nenegativan, a ako je S=1 onda je broj negativan. Nula se oznaava sa nulama u svim bitovima: 0000 0000 0000 0000 Obino postoji osnovni (standardni) tip INTEGER ili int, koji se zavisno od realizacije odnosi na odreeni opseg celih brojeva. Nekad je to opseg koji odgovara formatu jedne polurei ili formatu jedne rei. U odnosu na ovaj osnovni celobrojni tip eto postoji mogunost definisanja i drugih celobrojnih tipova koji se odnose na neki krai ili proireni format. U sledeoj tabeli je opisan tip INTEGER u Pascal-u. Tip operacije Operacija Operator * / mod div + + < >= = mnoenje Multiplikativne deljenje ostatak deljenja operacije celobrojno deljenje Aditivne sabiranje operacije oduzimanje

Unarne operacije

Relacije

plus minus manje manje ili jednako vee vee ili jednako 16 jednako nejednako

Predrag S. Stanimirovi

Osnove programiranja

2.4.2. Realni tip (float ili real)Promenljive ovih tipova uzimaju za svoje vrednosti podskupove skupa realnih brojeva. U programskim jezicima postoji vie vrsta podataka realnog tipa, koji se razlikuju po tanosti predstavljanja podataka. Realni tip podataka obuhvata jedan konaan podskup racionalnih brojeva ograniene veliine i tanosti. Naravno, moe se odmah postaviti pitanje zbog ega se koriste nazivi "realni tip" i "realni broj" za neto to u optem sluaju nije u stanju da obuhvati ni iracionalne brojeve ni beskonane periodine racionalne brojeve. Ipak, to je terminologija koja je prihvaena u praksi i opravdava se time to je REAL tip podataka koji se najblie pribliava pojmu realnog broja. Sa druge strane, lako je razumeti da su sve memorijske lokacije konane duine, pa stoga i brojni podaci koji se u njih smetaju moraju biti konane duine i tako po prirodi stvari otpadaju iracionalni brojevi. Potrebe prakse nisu na ovaj nain ni malo ugroene jer se dovoljna tanost rezultata moe postii i sa veliinama konane duine. Tip REAL najee obuhvata brojne vrednosti iz sledeih podintervala brojne ose:-maxreal -minreal 0 minreal maxreal

Ovde minreal oznaava najmanju apsolutnu vrednost veu od nule, koja se moe predstaviti na raunaru, a maxreal predstavlja najveu apsolutnu vrednost koja se moe predstaviti na raunaru. Realni brojevi iz intervala (-minreal, minreal) se zaokruuju i prikazuju kao 0, realni brojevi iz intervala (- , -maxreal) i (maxreal, + ) ne mogu se predstaviti u memoriji raunara, a - i + se kodiraju specijalnim kodovima.

2.4.3. Logiki tip podatakaLogiki tipovi podataka postoje kao osnovni tipovi podataka u svim novijim jezicima. Obino nose naziv LOGICAL (FORTRAN) ili BOOLEAN (Pascal, Ada). Obuhvataju samo dve vrednosti true i false, nad kojima su definisane osnovne logike operaclje not, and, or i xor. Takoe, vai i ureenost skupa vrednosti ovog tipa tako da je false < true. Izrazi u kojima se primenjuju logike promenljive i konstante nazivaju se logiki izrazi. Ako se logike konstante oznaavaju sa false i true onda podrazumevamo da svi izrazi moraju biti sainjeni striktno od logikih veliina. Ha primer, izraz z := (x>0) and ( (y=1) or (y0) + 2*(y>0) + (z>0) , koji je takoe besmislen kod logikih konstanti false i true, u sluaju numerikog kodiranja T={0,1} redovno ima i smisla i upotrebnu vrednost kao generator veliina 0,1,2,3,4,5,6,7.

2.4.4. Znakovni tipoviKorisnik raunara komunicira sa raunarom preko ulaznih i izlaznih ureaja i tu je bitno da se pojavljuju podaci u formi koja je itljiva za oveka. To znai da se komuniciranje obavlja pomou znakova iz odreene azbuke koja redovno obuhvata abecedno poreana velika i mala slova, cifre,

17

Predrag S. Stanimirovi

Osnove programiranja

specijalne znake i kontrolne znake. Pod specijalnim znacima se podrazumevaju svi oni znaci koji se javljaju na tastaturama i mogu odtampati, ali nisu ni slova ni cifre (na tastaturi sa kojom je pisan ovaj tekst specijalni znaci su ! # S % & *()_-+=:"; '?,/.). Pod kontrolnim znacima podrazumevaju se znaci koji se ne mogu odtampati (ili prikazati na ekranu terminala), ve slue za upravljanje radom ulazno/izlaznog ureaja (na primer tampaa). U ovu grupu spadaju specijalni znaci za pomeranje papira, znak koji izaziva zvuni signal na terminalu i drugi). Da bi se znaci razlikovali od simbolikih naziva promenljivih obino se umeu izmeu apostrofa (na nekim programskim jezicima umesto apostrofa se koriste znaci navoda). Tako se, na primer, podrazumeva da A predstavlja simboliki naziv promenljive, dok 'A' predstavlja binarno kodirano prvo slovo abecede. U praksi se primenjuje nekoliko metoda za binarno kodiranje znakova. Najpoznatiji metod je ameriki standard ASCII (American Standard Code for Information Interchange). Ovim smenama su neki manje vani znaci iz skupa ASCII znakova zamenjeni sa specifinim jugoslovenskim znacima (na pr., umesto ASCII znakova \ | { } [ ] ~ @ i ^ u jugoslovenskoj varijanti se pojavljuju znaci i ). Neki terminali imaju mogunost podesivog izbora skupa znakova tako da korisnik moe po potrebi izabratl ameriku ili jugoslovensku varijantu skupa ASCII znakova. Prva 32 znaka u ASCII skupu su kontrolni znaci. Nekl od njlh imaju jedinstvenu interpretaciju kod svih ureaja, a kod nekih interpretacija se razlikuje od ureaja do ureaja. Ovde pominjemo sledee: BEL LF FF CR ESC (Bell) = zvuni signal (Line Feed) = prelazak u naredni red (Form Feed) = prelazak na narednu stranu (Carriage /Return) = povratak na poetak reda (Escape) = prelazak u komandni reim

ESC znak je posebno znaajan. Veina savremeriih terminala i tampaa predstavljaju male raunare sa lokalnom memorijom i procesorom, sposobne da se prilagoavaju brojnim zadacima i radnim reimima. Kada u nizu znakova koje raunar alje u pravcu terminala ili tampaa naie ESC (binarno 0011011) onda dotini periferni ureaj to interpretira kao znak da slede neke komande koje podeavaju parametre ureaja ili izazivaju neke druge efekte, a ne znaci koje trebja prikazati. Stoga komande koje se u toku rada dostavljaju perifernim ureajima imaju oblik sekvence znakova koja poinje sa ESC i ima za svaku komandu tano odreenu duinu. Takva komandna sekvenca se u argonu naziva "escape sekvenca". Oblici komandnih sekvenci i njihova upotreba opisani su u prirunicima za upotrebu svakog perifernog ureaja. U ovoj oblasti za sada nema standardizacije. Skup ASCII znakova je baziran na sedmobitnim znacima, pa prema tome obuhvata ukupno 128 znakova. Kako se radi o linearno ureenom skupu svaki znak ima svoj redni broj i ti brojevi su u opsegu od 0 do 127. Funkcija koja za svaki znak daje njegov redni broj (ordinal number) oznaava se sa ord. Argument ove funkcije je tipa CHARACTER, a vrednost funkcije je tipa CARDINAL. Za sluaj ASCII skupa imamo da vai sledee: ord('0') = 48, ord('A') = 65. ord('a')=97. Inverzna funkcija funkciji ord, koja od rednog broja znaka formira znak, (character) je funkcija chr: chr(48) = '0', chr(65) = 'A', chr(97) = 'a' . Ako je c promenljiva tipa CHARACTER, a n promenljiva tipa CARDINAL onda vai chr(ord(c) ) = c , ord(chr(n) ) = n . Treba jasno uoiti razllku izmeu cifre 0 i znaka '0'. Cifra 0 je u sistemu sa punim komplementom i na 16-bitnoj maini kodirana sa 0000 0000 0000 0000, dok je znak '0' sedmobitnl podatak koji se u ASCII skupu kodira sa 0110000. Ako nije drugalje dogovoreno podrazumeva se da se sa promenljivima znakovnog tipa ne mogu obavljati aritmetike operacije. Meutim, mogua je primena relacionih operatora. Za znakovne promenljive ili konstante cl i c2 se podrazumeva da vai cl < c2 onda i samo onda ako ord(cl) < ord(c2); umesto operatora < moe se koristiti i bilo koji drugi relacioni operator.

18

Predrag S. Stanimirovi

Osnove programiranja

U programima kojima se vri obrada tekstova esto se primenjuju sledei izrazi: ord(c) ord('0' ) chr(n +ord('0')) ord(c) - ord('@' ) chr(ord(c) - ord('a') - ord('A')) chr(ord(c) - ord('a') + ord('A')) znak koji odgovara cifri c redni broj velikog slova u abecedi malo slovo koje odgovara velikom slovu c veliko slovo koje odgovara malom slovu c brojna vrednost numerikog znaka c

2.4.5. Nabrojivi tip podatakaNabrojivim tipom podataka definie se konaan linearno ureen skup proizvoljnih medusobno razliitih objekata. Svaki objekt moe pripadati samo jednom nabrojivom tipu podataka. U definiciji ovog tipa mora se eksplicitno navesti lista koja sadri identifikatore svih objekata pore]ane onim redom kojim su objekti linearno ureeni. Pored toga treba naznaiti da je u pitanju specifian tip, pa se to postie specifikatorom TYPE kao u sledeim primerima:TYPE glas = (bas,bariton,tenor,alt,mezzo_sopran,sopran); TYPE tempo = (largo,adagio,andante,moderato,allegro,vivace,presto); TYPE gudaki_instruinent = (kontrabas,elo,viola,violina ); TYPE mesec = (jan,feb,mar,apr,maj,jun,jul,aug,sep,okt,nov,dec); TYPE dan = (pon,uto,sre,et,pet,sub,ned); TYPE boja = (crno, belo);

Za svaki od navedenih primera vai sledea linearna uredenost, na primer: bas < bariton < tenor < alt < mezzo_sopran < sopran , ord(bas) = 0, ord(bariton) = 1, ... , ord(sopran) = 5 , succ(bas) = bariton , pred(tenor) = bariton , Prikazani tip boja sadri samo dva elementa, pa to sugerie da bi se i logiki tip podataka mogao definisati sa TYPE logical = {false, true}. Meutim, zbog rasprostranjenosti primene promenljivih logikog tipa podrazumeva se da je tip LOGICAL predefinisan, t.j. automatski ukljuen u spisak raspoloivih tipova podataka. Prema tome, ostaje da se nabrojivi tip podataka koristi u sluajevima kada je potrebno definisati specifine tipove podataka. Definicija promenljivih nestandardnog tipa formulie se u programima pomou uobiajenog DEFINE iskaza, na primer: DEFINE m1,m2,m3 : mesec; d1,d2 : dan; b,c,d : boja . Treba uoiti da se u sluajevima programskih jezika kod kojih ne postoji nabrojivi tip podataka mogu formirati ekvivalentna programska reenja bazirana na nekom od postojeih tipova podataka; na pr., dani u nedelji se mogu kodirati kardinalnim brojevima 1,2,3,4,5,6,7 i sa njima se mogu obavljati traene operacije. Nabrojivi tip podataka, kao i svaki specifini tip podataka, ima dve prednosti u odnosu na reenja bazirana na kodiranju pomou nekog drugog tipa podataka. Pre svega, podaci se ne moraju kodirati (i kasnija dekodiratil ve se oznaavaju svojim originalnim identifikatorijna, pa su programska reenja blia problemu koji se reava, t.j. itljiva su i razumljiva. Druga pogodnost se ogleda u tome to se uz svaki tip podataka podrazumeva da postoje ugraeni mehanizmi zatite koji u svim etapama rada sa datim podacima proveravaju da li su podaci ispravnog tipa, da li su unutar ili izvan dozvoljenog opsega podataka, da li su operatori koji se na njih primenjuju regularni, da li u izrazima meovitog tipa uestvuju ispravne kombinacije veliina razliitog tipa i tome slino. Svi ovi mehanizmi doprinose preglednosti, bezbednosti i optem kvalitetu programa, ali oigledno nisu uvek neizostavno potrebni, jer se njihovo dejstvo moe simulirati i skromnijim sredstvima.

19

Predrag S. Stanimirovi

Osnove programiranja

2.4.6. Intervalni tip podatakaZa svaki linearno ureeni tip podataka moe se definisati poseban tip podataka koji predstavlja jedan interval u nizu kojim je definisan posmatrani osnovni linearno ureeni tip. Pri tome osnovni linearno ureeni tip moe biti predefinisan ili posebno definisan kao specifini tip. Sintaksno se interval oznaava sa poetnim i krajnjim elementom razdvojenim sa dva znaka take:TYPE naziv_intervala = poetni_element .. krajnji_element

Broj elemenata obuhvaenih intervalnim tipom je N = 1 + ord(krajnji_e1ement) - ord(poetni_element). Karakteristini primeri intervalnog tipa podataka su sledei: TYPE TYPE TYPE TYPE TYPE bajt = 0 . . 255 cifra = ' 0' . . '9' veliko_slovo = 'A' .. 'Z' ma1o_s1ovo = ' a' .. 'z' radni_dan = pon .. pet Interval osnovnog tipa CARDINAL Interval osnovnog tipa CHARACTER Interval osnovnog tipa CHARACTER Interval osnovnog tipa CHARACTER Interval osnovnog tipa dan.

Osnovni ciljevi uvoenja intervalnog tipa podataka su uteda memorije (na pr. tip bajt se stvarno moe smestiti u jedan osmobitni bajt umesto da se koristi nekoliko bajtova koliko zauzimaju veliine tipa CARDINAL ili INTEGER), a takoe i uvoenje kontrole opsega vrednosti i ispravnosti operatora u vreme izvravanja programa.

2.5. Elementarni tipovi podataka u nekim jezicimaIako skoro svi programski jezici podravaju tipove Boolean, Character, Integer, i Float tipove mogu se uoiti neke raznolikosti: Ne razlikuju svi programski jezici tip Boolean. Na primer, C++ poseduje tip koji se naziva bool, ali su njegove vrednosti u stvari mali integeri; usvojena je konvencija da 0 predstavlja false a svaka druga celobrojna vrednost predstavlja. Ovakva konvencija je uvedena u C. Ne razlikuju svi programski jezici tip Character. Na primer, C, C++, i JAVA imaju tip char, ali su njegovevrednosti upravo mali integeri; ne pravi se razlika izmeu nekog karaktera i njegove unutranje reprezentacije. Neki jezici podravaju ne jedan, ve nekoliko celobrojnih tipova podataka. Na primer, programski jezik JAVA podrava tipove byte {128,...,+127}, short {32 768,...,+32 767}, int {2147483648,...,+2147483647}, i long {9223372036854775808,...,+9223372036854775807}. C i C++ takoe poseduju raznolikost celobrojnih tipova, ali su oni definisani u implementaciji. Neki jezici podravaju ne jedan, ve nekoliko realnih tipova podataka. Na primer, C, C++, i JAVA obezbeuju tipove float i double, od kojih drugi obezbeuje vei opseg i preciznost.

2.5.1. Tipovi podataka u jeziku CProgramski jezik C se svrstava u jezike sa slabim tipovima podataka iako su eksplicitne definicije tipa obavezne. Mogu se koristiti samo unapred definisani tipovi podataka uz mogunost da im se daju pogodna korisnika imena i na taj nain povea dokumentarnost programa. Mehanizam tipa je opti i odnosi se i na funkcije i na promenljive. Tipovi podataka u jeziku C mogu se globalno podeliti na osnovne i sloene (struktuirane). Osnovni tipovi podataka su celobrojni (int), realni (float), znakovni (char), nabrojivi (enumerated) i prazan (void). Ovi tipovi podataka se koriste u graenju sloenih tipova (nizova, struktura, unija, itd.). U sledeoj tabeli su prikazani osnovni tipovi podataka ovog jezika sa napomenom o njihovoj uobiajenoj primeni.

20

Predrag S. Stanimirovi

Osnove programiranja

Tip char signed char enum int unsigned int short int long unsigned long float double long double

Memorija u bajtovima 1 1 2 2 2 2 4 4 4 8 10

Opseg 0 do 255 -128 do 127 -32.768 do 32.767 -32.768 do 32.767 0 do 65.535 -32.768 do 32.767 -2.147.483.648 do 2.147.483.647 0 do 4.294.967.295 3.4*10-38 do 3.4*1038 1.7*10-308 do 1.7*10308 3.4*10-4932

Namena PC skup znakova i mali brojevi ASCII skup znakova i veoma mali brojevi Ureeni skup vrednosti Mali brojevi, kontrola petlji Veliki brojevi i petlje Mali brojevi, kontrola petlji Veliki brojevi Astronomska rastojanja Naune aplikaije (tanost na 6 decimala) Naune aplikaije (tanost na 16 decimala) Naune aplikaije (tanost na 19 decimala)

do 3.4*10

4932

U C-u postoji skup operatora za rad sa binarnim sadrajima koji su prikazani u tabeli koja sledi.Operator && || ^ >> =1 '); readln(n); writeln; znak:=1; for i:=1 to n-1 do znak:=-znak; s:=sqrt(4*n); for i:=n-1 downto 1 do begin s:=sqrt(4*i+znak*s); znak:=-znak; end; writeln('Rezultat = ',s:20:18); until false; end.

Primer. Sledei program izraunava stepen realnog broja X na stepen Y, gde je Y nenegativni ceo broj.

61

Predrag S. Stanimirovi

Osnove programiranja

program Stepenovanje; var Eksponent, Y : Integer ; Osnova, Rezultat, X : Real ; begin Read(X, Y); Rezultat := 1; Osnova := X; Eksponent := Y; while Eksponent > 0 do begin while not Odd(Eksponent) do begin Eksponent := Eksponent div 2 ; Osnova := Sqr(Osnova) end; Eksponent:= Eksponent-1; Rezultat := Rezultat*Osnova end; Writeln(Rezultat) end.

Primer. Izraunavanje parcijalne sume harmonijskog reda H(N) = 1+1/2 +1/3 + ... + 1/N, koristei While iteraciju.program WhilePrimer; var N:Integer; H:Real; begin Read(N); H := 0; while N>0 do begin H := H+1/N ; N := N-1 end; writeln(H) end.

Primer. Isti primer, uraen pomou Repeat iteracije.program RepeatPrimer; var N: Integer; H: Real; begin read(N); H := 0 repeat H := H + 1/N; N := N-1 until N = 0; writeln(H) end.

Gornji program se ponaa ispravno za N>0. Razmotrite ta se deava ukoliko je N , na); Hanoj(n-1, preko, na, sa); end end;

Osnove programiranja

Prema staroj indijskoj legendi, posle stvaranja sveta je Bog Brama (Brahma) postavio tri dijamantska stuba i na prvi postavio 64 zlatna prstena razliitih prenika tako da svaki naredni bude manji od prethodnog. Svetenici hrama moraju da prebacuju te prstenove sa prvog na trei stub koristei pri tome drugi, all samo jedan po jedan i to tako da se vei prsten ne moe nai iznad manjeg. Kad svi prstenovi budu prebaeni na trei stub nastupie kraj sveta. Ovde ce biti prikazan primer programa koji vri ovu operaciju prebacivanja i koji ne zavisi od broja prstenova. Meutim uobiajeno je da se ovaj primer izvodi za manji broj krugova 3 do 5 ve samim tim to je najmanji broj potrebnih poteza 2n - 1. Za sluaj sa 64 kruga dolazimo do broja od 18.446.744.073.709.551.615 poteza. U opstem sluaju, meutim, problem se sastoji u tome da se n prstenova prebaci sa prvog stuba (1) na trei stub (3) preko drugog stuba (2). Cilj je, dakle, ostvarljiv u tri "koraka". Sve prstenove osim najveeg (n-tog), prebaciti na drugi stub, koristei trei stub. Zatim n-ti prsten prebaciti na trei stub, a onda na njega staviti pomonu gomilu sa drugog stuba, koristei prvi stub kao pomoni. Da bi se ovo izvelo potrebno je ceo postupak izvesti za n -1 prsten, a za to je potrebno izvriti istu proceduru za n 2 prstena itd. Tako dolazimo do rekurzije. Procedura se poziva za naprimer Hanoj(3,1,3,2). Razmotriemo jo primer rekurzivnog potprograma za generisanje svih moguih permutacija bez ponavljanja skupa sa n elemenata P(n), dat kao prethodni primer. Primer. Potprogram za generisanje permutacija.procedure P(niz: array[l..10] of integer; n,duz:integer); var i,j,pom:integer; begin for j := 1 to n do if n > 1 then begin P(niz, n-1, duz); for i := 1 to n-1 do niz[i] := niz[i+1]; niz[n] := pom; end else for i := 1 to duz do print(niz[i]); end;

Reenje dato u ovom potprogramu pored klasine rekurzije sadri i iteraciju, to dovodi do toga da njegovo izvravanje ima veoma zanimljiv tok, to se dobro vidi na grafu poziva (sledea slika). Karakteristino je da je ovo vie rekurzivan algoritam. Uoljivo je takoe da on generie sve permutacije bez ponavljanja generiui neke od njih vie puta, tampajui ih pritom samo jednom.

112

Predrag S. Stanimirovi

Osnove programiranja

5.5.1. Primeri rekurzivnih funkcija u CPrimer. Jedmostavni primeri rekurzivnih funkcija.#include void fun1(int); void fun2(int); void fun3(int); void main() { printf("\n fun1(5)\n"); printf("\n fun2(5)\n"); printf("\n fun3(5)\n"); } void fun1(int n) { printf("%2d",n); void fun2(int n) { if(n) fun2(n-1); void fun3(int n) { printf("%2d",n); if(n) fun3(n-1); }Test primeri: fun1(5) 5 4 3 2 1 0 fun2(5) 0 1 2 3 4 5 fun3(5) 5 4 3 2 1 0 0 1 2 3 4 5

fun1(5); fun2(5); fun3(5);

if(n) fun1(n-1); printf("%2d",n);

return; return; }

}

printf("%2d",n);

return;

Primer. Rekurzivno izraunavanje faktorijela.#include long fact(short); void main() { short n; long rezultat; scanf("%d",&n); rezultat = fact(n); printf("Faktorijel od %d = %ld\n", n,rezultat); } long fact(short n) { if(n1 .

#include long fib(short); void main() { short n; scanf("\n %d", &n); printf("%d-ti clan Fibonacijevog niza = %ld\n", }

n,fib(n));

long fib(short n) { if(n='0' && chy)?x:y; case 'm': return (x>y)?y:x; } } void main() { cout%c",tekuci->inf); tekuci=tekuci->sledeci; } printf("\n"); } void main() { LCVOR *pocetak, *novi; char ch; pocetak=NULL; printf("Unesi sadrzaj liste:\n"); while((ch=getchar())!='\n') { novi=(LCVOR *)malloc(sizeof(LCVOR)); novi->inf=ch; novi->sledeci=pocetak; pocetak=novi; } printf("Sadrzaj liste:\n"); pisi(pocetak); }

Napomena. U jeziku C++ moe se koristiti tip cvor deklarisan pomou strukturetypedef struct cvor { TIP inf; cvor *sledeci; } LCVOR;

U programu se zatiom moe koristizi tip cvor umesto tipa LCVOR.

7.3.3. StekoviStek je takva struktura podataka iz koje se prvi uzima vor koji je poslednji ugraen. To znai da se sa stekom manipulie prema LIFO principu (Last In First Out). Svaki vor mora da sadri najmanje dva elementa: jedan element za uvanje informacija, i jedan pokaziva na sledei vor steka. Odgovarajua struktura je data sledeim deklaracijama:typedef struct cvor { TIP inf; struct cvor *sledeci; } SCVOR;

268

Predrag S. Stanimirovi SCVOR *vrh;

Osnove programiranja

Pokaziva vrh pokazuje na vrh steka, u kome se nalazi vor koji je poslednji ugraen u stek, tj. vor koji se prvi uzima iz steka. Naredbomvrh=NULL;

konstruie se prazan stek. Funkcija kojom se postavlja novi vor u steku (push) je oblikavoid push(char ch, SCVOR **pvrh) { SCVOR *novi; novi = (SCVOR *)malloc(sizeof(SCVOR)); /* rezervise memoriju */ novi->inf = ch; /* postavlja karakter u polju inf */ novi->sledeci = *pvrh; /* pokazivac cvora je stari vrh */ *pvrh=novi; /* vrh steka postaje novi cvor */ }

Sledea slika prikazuje postavljanje novog elementa na vrh steka.

Funkcija kojom se uzima vor (iz vrha) steka (pop) moe se napisati na sledei nain:void pop(char *ch, SCVOR **pvrh) { SCVOR *pomocni; *ch =(*pvrh)->inf; pomocni=*pvrh; *pvrh = (*pvrh)->sledeci; free(pomocni); }

Princip uzimanja elementa sa steka je relativno prost zadatak pri kom se mora uraditi sledee: a) Uzeti sadraj vora koji se nalazi na vrhu steka. b) Premestiti da pokaziva vrha steka pokazuje na vor koji sledi odmah iza vora na koji trenutno pokazuje pokaziva vrha steka; c) vor steka iji je sadraj preuzet vie ne bi trebalo da se nalazi u steku, odnosno listi, pa treba da bude izbrisan.

Primer. Napisati program koji koji koristi funckije push i pop i manipulie stekom u ijim su vorovima sadrani karakteri.#include #include

269

Predrag S. Stanimirovi typedef char TIP; typedef struct cvor { TIP inf; struct cvor *sledeci; } SCVOR;

Osnove programiranja

void push(char ch, SCVOR **pvrh) { SCVOR *novi; novi = (SCVOR *)malloc(sizeof(SCVOR)); /* rezervise memoriju */ novi->inf=ch; /* postavlja karakter u polju inf */ novi->sledeci=*pvrh; /* pokazivac cvora je stari vrh*/ *pvrh=novi; /* vrh steka postaje novi cvor */ } void pop(char *ch, SCVOR **pvrh) { SCVOR *pomocni; *ch=(*pvrh)->inf; pomocni=*pvrh; *pvrh=(*pvrh)->sledeci; free(pomocni); } void pisi(SCVOR **pvrh) { char ch; while(*pvrh!=NULL) { pop(&ch,pvrh); putchar(ch); } } void main() { SCVOR *vrh; char ch; vrh=NULL; printf("\nUnesi sadrzaj steka\n"); while((ch=getchar())!='\n') push(ch, &vrh); printf("Sadrzaj steka je:\n"); pisi(&vrh); printf("\n"); }

Primer. Definisana je strukturastruct stog {char *glava; struct stog *rep; };

i funkcija za formiranje novog vora u steku.#define novi(x) x=(struct stog *) malloc(sizeof(struct stog))

Uitavati stringove sve dok se ne unese string koji poinje znakom @. Od uitanih stringova formirati stek iji vorovi odgovaraju definisanoj strukturi. Ispisati sadraj steka kao i njegovu duinu./* Stek2.cpp: STOGOVI sa stringovima #include #include #include struct stog { char *glava; struct stog *rep; }; #define novi(x) x=(struct stog *) malloc(sizeof(struct stog)) */

void upis(struct stog **p); void ispis(struct stog *p); int duz(struct stog *p); void main() { struct stog *a; novi(a);upis(&a);

270

Predrag S. Stanimirovi printf("\n\nEVO ISPISA :\n");ispis(a); printf("Duzina steka je %d\n",duz(a)); }

Osnove programiranja

void upis(struct stog **p) { char w[50]; struct stog *rez,*priv; rez=NULL; printf("\n Po zelji daj clanove,za prekid kucati znak @ :\n"); gets(w); while(w[0]!='@') {novi(priv); priv->glava=(char *)malloc(sizeof(w)); strcpy(priv->glava,w); priv->rep=rez; rez=priv; gets(w); } *p=rez; } void ispis(struct stog *p) { if (p==NULL) {printf("P R A Z A N ");return;} while(p!=NULL) {printf("%s\n",p->glava);p=p->rep;}} int duz(struct stog *p) { int br=0; if (p==NULL) return(0); while(p!=NULL){ ++br;p=p->rep;} return(br); }

Primer. Izgraditi strukturu steka.#include #include struct stog { int glava; struct stog *rep; }; #define novi(x) x=(struct stog *)malloc(sizeof(struct stog)) void upis(struct stog **p); void ispis(struct stog *p); int duz(struct stog *p); void main() { struct stog *a,*b; novi(a); upis(&a); printf("\n EVO ISPISA :\n"); ispis(a); printf("Duzina joj je %d\n",duz(a)); novi(b); upis(&b); printf("DA "); ispis(b); } void upis(struct stog **p) { int x;struct stog *rez,*priv; rez=NULL; printf("\n Po zelji daj clanove:\n"); while((scanf("%d",&x))==1) { novi(priv); priv->glava=x; priv->rep=rez;rez=priv;} *p=rez;printf("Kraj\n"); } void ispis(struct stog *p) { if (p==NULL) {printf("P R A Z A N ");return; } while(p!=NULL) { printf("EVO %d\n",p->glava); } int duz(struct stog *p)

p=p->rep; }

271

Predrag S. Stanimirovi { int br=0; if (p==NULL) return(0); while(p!=NULL){ ++br;p=p->rep;} return(br); }

Osnove programiranja

Odgovarajua rekurzivna funkcija duz je definisana na sledei nain:int duz(struct stog *p) { int br=0; if(p==NULL) return(0); else return(1+duz(p->rep)); }

Primeri.#include #include struct stog {int glava; struct stog *rep; }; #define novi(x) x=(struct stog *)malloc(sizeof(struct stog)) void upis(struct stog **p); void ispis(struct stog *p); int duz(struct stog *p); struct stog *okret(struct stog *p); struct stog * dodaj(int x,struct stog *p); void main() { struct stog *a; novi(a); upis(&a); printf("\n\nEVO ISPISA :\n"); ispis(a); printf("Duzina joj je %d\n",duz(a)); a=okret(a); ispis(a); } void upis(struct stog **p) { int x;struct stog *rez,*priv; rez=NULL; printf("\n Za prekid dati ne-broj :\n"); while((scanf("%d",&x))==1) { novi(priv); priv->glava=x; priv->rep=rez; rez=priv; *p=rez; } void ispis(struct stog *p) { while(p!=NULL) { printf("%d\n",p->glava);p=p->rep;} } int duz(struct stog *p) { int br=0; while(p!=NULL){ ++br;p=p->rep; } return(br); } struct stog * dodaj(int x, struct stog *p) { struct stog * rez; novi(rez); rez->glava=x; rez->rep=p; return(rez); } struct stog *okret(struct stog *p) { struct stog *rez,*priv; priv=NULL; while(p!=NULL)

}

272

Predrag S. Stanimirovi

Osnove programiranja }

{ novi(rez); rez=dodaj(p->glava,priv); p=p->rep; priv=rez; return(rez); }

2. Data je strukturastruct stog { int glava; struct stog *rep;

}; Napisati funkcije:void upis(struct stog **p);

koja u strukturu steka pod nazivom stog postavlja cele brojeve, sve dok se ne uita vrednost koja nije ceo broj.void ispis(struct stog *p);

koja ispisuje sadraj steka.int duz(struct stog *p);

koja ispisuje sadraj steka.struct stog *okret(struct stog *p);

koja invertuje sadraj steka.struct stog * dodaj(int x,struct stog *p);

koja u stek p dodaje ceo broj x.char elem(int x,struct stog *p);

koja vraa vrednost 1 ako se x nalazi u steku p, inae vraa rezultat 0.char je_skup(struct stog *p);

koja vraa vrednost 1 ako sadraji vorova u strukturi p, ine skup (nema ponavljanja istih vrednosti), inae vraa rezultat 0.struct stog *oskup(struct stog *p);

koja na osnovu sadraja vorova u steku p gradi novi stek u ijim vorovima nema ponavljanja istih vrednosti. Napisati test program.#include #include struct stog { int glava; struct stog *rep; }; #define novi(x) x=(struct stog *) malloc(sizeof(struct stog)) void upis(struct stog **p); void ispis(struct stog *p); int duz(struct stog *p); struct stog *okret(struct stog *p); struct stog * dodaj(int x,struct stog *p); char elem(int x,struct stog *p); char je_skup(struct stog *p); struct stog *oskup(struct stog *p); void main() { struct stog *a; novi(a); upis(&a); printf("\n\nEVO ISPISA :\n"); ispis(a); printf("Duzina joj je %d\n",duz(a)); a=okret(a); ispis(a); printf("11 je elem : %d\n",elem(11,a)); printf("Skup je %d\n",je_skup(a)); a=oskup(a); printf("Njegov 'oskup' je \n "); ispis(a); } void upis(struct stog **p) 273

Predrag S. Stanimirovi

Osnove programiranja

{ int x;struct stog *rez=NULL,*priv; printf("\n Po zelji daj clanove,za prekid dati ne broj:\n"); while((scanf("%d",&x))==1) { novi(priv);priv->glava=x;priv->rep=rez;rez=priv;} *p=rez; } void ispis(struct stog *p) { if (p==NULL) {printf("P R A Z A N \n");return;} while(p!=NULL) {printf("%d\n",p->glava); p=p->rep;} } int duz(struct stog *p) { int br=0; while(p!=NULL){ ++br;p=p->rep;} return(br); } struct stog *dodaj(int x,struct stog *p) { struct stog * rez; novi(rez);rez->glava=x;rez->rep=p;return(rez); } struct stog *okret(struct stog *p) { struct stog *rez,*priv; if(p==NULL) return(NULL); priv=NULL; while(p!=NULL) { novi(rez);rez=dodaj(p->glava,priv); return(rez); } char elem(int x,struct stog *p) { if (p==NULL) return(0); while(p!=NULL) { if (x==p->glava) return(1); p=p->rep; } return(0); } char je_skup(struct stog *p) { if(p==NULL) return(1); else if (elem(p->glava,p->rep)) return(0); else return(je_skup(p->rep)); } struct stog *oskup(struct stog *p) { if (p==NULL) return(NULL); else if(elem(p->glava,p->rep)) return(oskup(p->rep)); else return(dodaj(p->glava,oskup(p->rep))); }

p=p->rep;priv=rez;

}

7.3.4. Ureene povezane listePonekad je potrebno da se vorovi liste urede u alfabetskom poretku na osnovu sadraja u informacionim vorovima. Jedan od naina za reenje ovog problema jeste upotreba funkcije kojom se sortiraju vorovi strukture pre ispisa njihovog sadraja. Bolji nain za dobijanje generisanje sortirane liste je da se svaki vor postavi na odgovarajue mesto u toku formiranja liste. Za prvi vor postoji samo jedna mogunost - moe se postaviti samo na poetak liste. Svaki od preostalih vorova se postavlja na osnovu poreenja sadraja informacuionih delova u vorovima. Pri postavljanju vora u

274

Predrag S. Stanimirovi

Osnove programiranja

listu neophodno je samo da se promeni sadraj elemenata za povezivanje sa susednim vorovima. Umetanje vora na odgovarajue mesto moe se realizovati rekurzivnom funkcijom umetni. Primer. Napisati program kojim se preko tastature unosi niz znakova. Unos znakova se prekida tasterom Enter. Uitani znakovi se ugrauju u sortiranu listu, i na taj nain sortiraju u neopadajuem poretku. Prikazati elemente sortirane liste razdvojene znakovima ->.#include #include typedef char TIP; typedef struct cvor { TIP inf; struct cvor *sledeci; } LCVOR; void pisi(LCVOR *tekuci) { if(tekuci!=NULL) { printf("->%c",tekuci->inf); printf("\n"); }

pisi(tekuci->sledeci);

}

void umetni(LCVOR *novi, LCVOR **lista) /* Rezultat je pokazivac na pocetak liste */ /* tj. pokaziv