65
Osnovi Programiranja 1 – MI Glava IV: Kontrola toka Visoka ICT Škola – Osnovi programiranja 1

OP1 Kontrola Toka

Embed Size (px)

DESCRIPTION

kontrola toka

Citation preview

Page 1: OP1 Kontrola Toka

Osnovi Programiranja 1 – MI

Glava IV: Kontrola toka

Visoka ICT Škola – Osnovi programiranja 1

Page 2: OP1 Kontrola Toka

2

Naredbe

Naredba je osnovna jedinica obrade u programu

Proste naredbe ne mogu da se podele na manje delove koji su takođe naredbe

Složene naredbe su strukture narebi (upravljačke strukture) koje određuju redosled izvršavanja naredbi u strukturi. Dele se na: ◦ sekvence

◦ selekcije

◦ cikluse (petlje)

Upravljačke naredbe ne vrše obradu, već prenose tok upravljanja na neko drugo mesto (skokovi)

Page 3: OP1 Kontrola Toka

3

Naredbe

Deklarativne naredbe – deklarisanje

tipova podataka

Izvršne naredbe

Page 4: OP1 Kontrola Toka

4

Prosta naredba

Opšti oblik je

izraz;

Prazna naredba se koristi kada sintaksa

jezika zahteva naredbu, a nije potrebna

nikakva obrada

;

Page 5: OP1 Kontrola Toka

5

Sekvenca (blok)

Niz naredbi koje se izvršavaju jedna za drugom

Opšti oblik sekvence je

{

naredba1

naredba2

...

naredbaN

}

Može da se piše i u jednom redu

{ naredba1 naredba2 ... naredbaN }

Može da bude prazna { }

Page 6: OP1 Kontrola Toka

6

Primer sekvence

int a, b;

...

{

int t;

t = a;

a = b;

b = t;

}

ili u jednom redu

{ t=a; a=b; b=t; }

Page 7: OP1 Kontrola Toka

7

Doseg identifikatora (oblast važenja)

Oblast važenja je deo programa u kojem identifikator može da se koristi

Blokovski doseg za identifikatore deklarisane unutar bloka: identifikator može da se koristi od mesta gde je deklarisan do kraja bloka u kojem je deklarisan

Primer { int x = 5;

double y = x / 2.;

printf("x=%d, y=%f\n", x, y);

}

Page 8: OP1 Kontrola Toka

8

Uklapanje dosega

Unutar jednog bloka (spoljašnji) može da se nalazi drugi blok (unutrašnji)

U unutrašnjem bloku mogu da se koriste identifikatori definisani u spoljašnjem bloku, oni su globalni za unutrašnji blok

Identifikatori definisani u unutrašnjem bloku su lokalni za taj blok, i ne mogu da se koriste izvan njega

U unutrašnjem bloku se može definisati identifikator koji ima isto ime kao i identifikator iz spoljašnjeg bloka, i na taj način identifikator iz spoljašnjeg bloka postaje nevidljiv u unutrašnjem bloku

Page 9: OP1 Kontrola Toka

9

Primer uklapanja dosega

{

double x = 0.5;

printf("x=%f\n", x);

{

int x=0;

{

int a=1, b=2;

x = a * b;

}

printf("x=%d\n", x);

}

printf("x=%f\n", x);

}

x=0.500000

x=2

x=0.500000

Page 10: OP1 Kontrola Toka

10

Selekcije

if-else

switch

Page 11: OP1 Kontrola Toka

11

Osnovna selekcija if-else Uslovno izvršavanje jedne od dve moguće naredbe

Opšti oblik

if(uslov)

naredba1

else

naredba2

uslov je izraz logičkog tipa

naredba je jedna naredba ili blok naredbi

deo else nije obavezan

Izvršavanje ◦ ako uslov vrati vrednost true izvršava se naredba1

◦ inače se izvršava naredba2 (ako else deo postoji)

Page 12: OP1 Kontrola Toka

12

Primeri za if if(a < b) a = 0;

else b = 0;

if(a > b)

{

t=c; c=a; a=t;

}

else

{

t=c; c=b; b=t;

}

if(a > b) { t=a; a=b; b=t; }

Page 13: OP1 Kontrola Toka

13

Uklapanje selekcije if-else

if(uslov1)

if(uslov2)

naredba1

else

naredba2

Deo else se uvek odnosi na poslednji

if ispred njega

Page 14: OP1 Kontrola Toka

14

Primer za uklapanje selekcije if-

else if(i == 10)

{

if(j < 20) a = b;

if(k > 100) c = d;

else a = c; // ovaj else se odnosi na uslov if(k >

100)

}

else a = d; // ovaj else se odnosi na uslov if(i ==

10)

Page 15: OP1 Kontrola Toka

15

if else if

if(uslov1)

naredba1;

else if(uslov2)

naredba2;

else if(uslov3)

naredba3;

else if(uslov4)

naredba4;

else

naredba5;

if(uslov1)

naredba1;

else

if(uslov2)

naredba2;

else

if(uslov3)

naredba3;

else

if(uslov4)

naredba4;

else

naredba5;

Page 16: OP1 Kontrola Toka

16

Naredba switch

Grananje u više putanja zavisno od vrednosti izraza

Opšti oblik switch(izraz)

{

case vrednost1:

niz_naredbi1

case vrednost2:

niz_naredbi2

...

default: niz_naredbiD

...

case vrednostN:

niz_naredbiN

}

Page 17: OP1 Kontrola Toka

17

Naredba switch izraz je celobrojni izraz

Svaka od vrednosti je celobrojna konstanta

Ne sme se ponoviti ista vrednost u istom switch

Sa break se završava switch

Ako ne postoji break nastavlja se izvršavanje sledećeg

case

Deo default je opcioni i označava mesto na koje se skače

ako vrednost izraza nije jednaka nijednoj od vrednosti u

oznakama case

Page 18: OP1 Kontrola Toka

18

Prekidanje naredbe switch

Naredba switch se može prekinuti naredbom break, i taj oblik naredbe switch se češće koristi

switch(izraz)

{

case vrednost1: niz_naredbi1;

break;

case vrednost2: niz_naredbi2;

break; ...

default: niz_naredbiN;

break; ...

case vrednostN: niz_naredbiN;

break; }

Page 19: OP1 Kontrola Toka

19

Primer za switch

switch(i + j * k)

{

case 0: printf("Unesite 3 cela broja:");

scanf("%d%d%d", &i, &j, &k);

case 7:

case 3:

case 5: a = i + j * k;

b = i – j / k;

default: c = a * b;

case 12: printf("Rezultati su: %d %d %d", a, b, c

);

}

Page 20: OP1 Kontrola Toka

20

Uklopljena naredba switch switch (izraz_spoljasnjeg_switch)

{

case 1:

switch (izraz_unutrasnjeg_switch)

{

case 0: a=0;

break;

case 1: b=0;

break;

}

break;

case 2:

...

}

Page 21: OP1 Kontrola Toka

21

Poređenje if i switch

switch proverava samo jednakost, a

if proizvoljan logički izraz

switch je efikasniji od ugnježdenih if

else if

Page 22: OP1 Kontrola Toka

22

Ciklusi (petlje)

Izvršavanje (ponavljanje) jedne naredbe ili

bloka naredbi potreban broj puta, zavisno

od uslova

Naredbe ciklusa (petlje)

◦ while

◦ do while

◦ for

Page 23: OP1 Kontrola Toka

23

Petlja while

Opšti oblik while petlje

while(uslov)

telo_petlje

uslov je proizvoljan logički izraz

telo_petlje je jedna naredba (može biti i prazna naredba) ili blok naredbi

telo_petlje se ponavlja sve dok uslov ima vrednost true

while petlja je sa izlazom na vrhu, ako uslov ima vrednost false pri prvoj proveri, ne ulazi se u petlju, tj. telo_petlje se ne izvršava nijednom

Page 24: OP1 Kontrola Toka

24

Primer za while petlju int n = 5; // Za n=0 petlja se ne bi izvršila nijednom

while(n > 0)

{

printf("Vrednost n je %d\n", n);

n--;

}

Vrednost n je 5

Vrednost n je 4

Vrednost n je 3

Vrednost n je 2

Vrednost n je 1

Page 25: OP1 Kontrola Toka

25

Primeri za while petlju: zbir n

brojeva int s=0, i=1;

while(i<n)

{

s += i;

i++;

}

int s=0, i=1; while(i<n) { s += i; i++; }

int s=0, i=1; while(i<n) { s += i++; }

int s=0, i=1; while(s+=i++, i<=n) ; // Nije

lepo

int s=0, i=1; while(++i<n) { s += i; }

Page 26: OP1 Kontrola Toka

26

Petlja do while Opšti oblik do while petlje

do

telo_petlje

while(uslov);

uslov je proizvoljan logički izraz

telo_petlje je jedna naredba ili blok naredbi

do while petlja je sa izlazom na dnu: ◦ telo_petlje se izvršava jednom a posle toga se

proverava uslov

◦ ako uslov ima vrednost true, telo_petlje se izvršava ponovo, a ako je vrednost false izlazi se iz petlje

Page 27: OP1 Kontrola Toka

27

Primer za do while

int n = 5; // Za n=0 petlja bi se izvršila jednom

do

{

printf("Vrednost n je %d\n", n);

n--;

}

while(n > 0);

Vrednost n je 5

Vrednost n je 4

Vrednost n je 3

Vrednost n je 2

Vrednost n je 1

Za n=0 rezultat bi bio

Vrednost n je 0

Page 28: OP1 Kontrola Toka

28

Kraće napisan primer za do

while int n = 5;

do

printf("Vrednost n je %d\n", n);

while(--n > 0);

Vrednost n je 5

Vrednost n je 4

Vrednost n je 3

Vrednost n je 2

Vrednost n je 1

Page 29: OP1 Kontrola Toka

29

do while petlja: zbir kvadrata n

brojeva int s=0, i=1;

do

{

s += i * i;

i++;

}

while(i<n);

int s=0, i=1; do { s+=i*i; i++; } while(i<n);

int s=0, i=1; do s+=i*i; while(++i<n);

int s=0, i=1; do ; while (s+=i*i, i++<=n);

//Loše

Page 30: OP1 Kontrola Toka

30

Generalizovani ciklus sa izlazom na vrhu: for

U praksi su česte petlje sa sledećom

strukturom

◦ postavljanje početne vrednosti jedne ili više

promenljivih pre ulaska u petlju

◦ ispitivanje da li treba izvršavati sadržaj petlje pre

svakog prolaska kroz petlju

◦ menjanje vrednosti jedne ili više promenljivih na

kraju svakog prolaska kroz petlju

Page 31: OP1 Kontrola Toka

31

Petlja for

inicijalizacija je izraz ◦ izvršava se samo jednom na početku pre ulaska u petlju ◦ obično inicijalizuje jednu ili više promenljivih petlje

uslov je logički izraz, proverava se pre izvršavanja tela petlje ◦ ako je vrednost true izvršava se telo petlje ◦ ako je false ne izvršava se telo petlje i izlazi se iz petlje ◦ obično zavisi od upravljačke promenljive petlje

telo_petlje je jedna naredba ili blok naredbi iteracija je izraz ◦ izvršava se posle tela petlje ◦ obično menja jednu ili više upravljačkih promenljivih petlje

Petlja se nastavlja proverom uslova i izvršavanjem tela petlje i iteracije sve dok je uslov tačan

Page 32: OP1 Kontrola Toka

32

Načini pisanja for petlje for(inicijalizacija; uslov; iteracija) naredba

for(inicijalizacija; uslov; iteracija)

naredba

for(inicijalizacija; uslov; iteracija) {

naredba1

...

naredbaN

}

for(inicijalizacija; uslov; iteracija)

{

naredba1

...

naredbaN

}

Page 33: OP1 Kontrola Toka

33

Način pisanja

Smatra se lošim programerskim stilom

ako se u jedan ili više delova petlje: inicijalizacija, uslov,

iteracija, stavljaju radnje koje se ne

odnose na opsluživanje petlje

Page 34: OP1 Kontrola Toka

34

Primeri za for

for(i=pocetak; i<kraj; i+=korak) {...}

for(i=pocetak; i<kraj; i++) {...}

for(i=pocetak; i>=kraj; i--) {...}

for(s=0, i=1; i<=n; i++) s+=i*i;

for(s=0, i=1; i<=n; s+=i*i, i++) ; // Loše

for(s=0, i=1; i<=n; i++) s+=i;

for(s=0, i=1; i<=n; s+=i++) ; // Može

Page 35: OP1 Kontrola Toka

35

Primer za for

int n;

for(n=5; n>0; n--)

printf("Vrednost n je %d\n", n);

Vrednost n je 5

Vrednost n je 4

Vrednost n je 3

Vrednost n je 2

Vrednost n je 1

Page 36: OP1 Kontrola Toka

36

Deklaracija promenljive unutar

for petlje

Upravljačka promenljiva petlje se često

deklariše unutar petlje u delu inicijalizacija

Takva promenljiva postoji samo unutar

petlje

for(int n=5; n>0; n--)

printf("Vrednost n je

%d\n", n);

Page 37: OP1 Kontrola Toka

37

Više upravljačkih promenljivih for

petlje U inicijalizaciji se može deklarisati i inicijalizovati

više upravljačkih promenljivih petlje U iteraciji se može menjati više promenljivih Izrazi u inicijalizaciji i iteraciji se razdvajaju

zarezima

for(int a=1, b=4; a<b; a++, b--)

printf("a = %d\nb = %d", a, b);

a = 1 b = 4 a = 2 b = 3

Page 38: OP1 Kontrola Toka

38

Uslov ne zavisi od upravljačke promenljive for petlje

bool kraj = false;

for(int i=0; !kraj; i++)

{

printf("i je %d", i);

if(i == 5)

kraj = true;

}

i je 0 i je 1 i je 2 i je 3 i je 4 i je 5

Page 39: OP1 Kontrola Toka

39

for petlja bez inicijalizacije i

iteracije Delovi for petlje inicijalizacija ili iteracija, ili oba

dela, mogu da se izostave

boolean kraj = false;

int i = 0;

for( ; !kraj; ) {

printf("i je %d", i);

if(i == 5)

kraj = true;

i++;

}

Page 40: OP1 Kontrola Toka

40

Beskonačna for petlja

for( ; ; ) {

// ...

if(uslov)

break;

// ...

}

Page 41: OP1 Kontrola Toka

41

Ugneždene for petlje

for(int i=0; i<5; i++)

{

for(int j=i; j<5; j++)

printf("%d", i);

printf("\n");

}

00000 1111 222 33 4

Page 42: OP1 Kontrola Toka

42

Trajnost podataka

Prema intervalu vremena u kojem podaci

postoje u toku izvršavanja programa

podaci mogu biti:

◦ prolazni

◦ trajni

◦ privremeni

Page 43: OP1 Kontrola Toka

43

Prolazni podaci Stvaraju se naredbom za definisanje ◦ dodeljuje im se prostor u memoriji

◦ inicijalizator se svaki put izvršava

◦ imaju slučajnu vrednost ako nisu inicijalizovani

◦ uništavaju se pri napuštanju dosega njihovog identifikatora

Primer

{

int t=0;

int a;

...

}

Page 44: OP1 Kontrola Toka

44

Modifikatori za prolazne podatke

Dodaju se na početku naredbe za definisanje auto

◦ može se dodati da bi se naglasila prolaznost podataka, i zato se prolazni podaci nazivaju i automatski podaci

register

◦ sugeriše prevodiocu da se podaci smeste u brze procesorske registre

◦ koriste se npr. za promeljive koje se koriste u najdubljoj petlji kad postoji nekoliko uklopljenih petlji

◦ nije sigurno da će prevodilac to i uraditi

Page 45: OP1 Kontrola Toka

45

Primeri korišćenja modifikatora

{

register int t=0;

auto int a;

...

}

Page 46: OP1 Kontrola Toka

46

Trajni podaci

Stvaraju se prilikom prvog pozivanja naredbe za definisanje

Inicijalizatori se izvršavaju samo jednom

Ako inicijalizatori ne postoje promenljive imaju početnu vrednost nula

Uništavaju se pri završavanju programa

Da bi podatak postao trajni, na početak naredbe za definisanje dodaje se modifikator static

Ovi podaci se zovu i statički podaci

Page 47: OP1 Kontrola Toka

47

Primer definisanja statičkih podataka

{

static int t=0; //

Inicijalizacija je suvišna

static int a;

...

}

Page 48: OP1 Kontrola Toka

48

Privremeni podaci

Služe za odlaganje međurezultata složenih

izraza

Stvara ih prevodilac tako da programer ne

zna za njihovo postojanje

Uništavaju se automatski kad više nisu

potrebni

Page 49: OP1 Kontrola Toka

49

Razlika dosega i trajnosti podatka

Doseg određuje deo programa u kojem podatak može da se koristi

Trajnost određuje vreme koliko dugo podatak postoji

Trajni podaci postoje i kad se izvršavaju delovi programa izvan njihovog dosega, ali u tim delovima programer ne može da ih koristi

Za privremene podatke doseg i trajnost se u izvesnom smislu poklapaju

Page 50: OP1 Kontrola Toka

50

Mesto definisanja podataka

Podatke je najbolje definisati najbliže

mestu gde se koriste

◦ npr. unutar najmanjeg bloka koji obuhvata sva

mesta na kojima se podatak koristi

Tipovi podataka, npr. definisani sa

typedef, obično se koriste u većem

delu programa

◦ definišu se u *.h fajlu ili na početku fajla

Page 51: OP1 Kontrola Toka

51

Naredbe skoka

Služe za prekidanje izvršavanja redosleda naredbi i nastavljanje na definisanom mestu, tj. služe za preskakanje naredbi

◦ break

◦ continue

◦ return

Naredbe skoka nemaju strukturu, pa nisu upravljačke strukture

Naredbe skoka ne vrše nikakvu obradu pa nisu proste naredbe

Page 52: OP1 Kontrola Toka

52

Naredba break

Služi za iskakanje iz upravljačke strukture

◦ preskakanje preostalih naredbi unutar naredbe switch i skakanje na prvu

naredbu iza naredbe switch

◦ prevremeni završetak petlje (for, while,

do) i skakanje na prvu naredbu iza naredbe

uobičajeno je da se iz petlje izlazi na osnovu uslova

Prekida samo jednu upravljačku strukturu

Page 53: OP1 Kontrola Toka

53

Selekcija alternativnih grana int godina, mesec, broj_dana;

...

switch(mesec)

{

case 1: case 3: case 5: case 7:

case 8: case 10: case 12:

broj_dana = 31; break;

case 4: case 6: case 9: case 11:

broj_dana = 30; break;

case 2:

broj_dana = 28 + (godina%4==0 && godina%100!=0

|| godina%400==0); break;

default:

broj_dana = -1; break;

}

Page 54: OP1 Kontrola Toka

54

Izlazak iz for petlje sa break for(int i=0; i<100; i++)

{

if(i == 5)

break; // prekidanje petlje kad je i=5

printf("i: %d\n", i);

}

printf("Petlja je završena.\n");

i: 0

i: 1

i: 2

i: 3

i: 4

Petlja je završena.

Page 55: OP1 Kontrola Toka

55

Izlazak iz while petlje sa break int i=0;

while(i<100)

{

if(i == 5) break; // prekidanje petlje kad je i=5

printf("i: %d\n", i);

i++;

}

printf("Petlja je završena.\n");

i: 0

i: 1

i: 2

i: 3

i: 4

Petlja je završena

Page 56: OP1 Kontrola Toka

56

break u uklopljenim strukturama for(int i=0; i<9; i++)

{

switch(i)

{

case 0: printf("i = 0\n");

case 1:

case 2: printf("i < 3\n"); break;

case 3:

case 4: printf("i < 5\n"); break;

default: printf("i >= 5\n");

}

int n = 0;

...

}

Page 57: OP1 Kontrola Toka

57

break u uklopljenim strukturama

for(int i=0; i<3; i++) {

printf("i = %d; j:", i);

for(int j=0; j<100; j++) {

if(j == 10) break; // prekida unutrašnju petlju za j=10

printf(" %d", j);

}

printf("\n");

}

printf("Petlja je završena.\n");

• break prekida samo najdublje ugnježdenu petlju u kojoj

se nalazi

i = 0; j: 0 1 2 3 4 5 6 7 8 9

i = 1; j: 0 1 2 3 4 5 6 7 8 9

i = 2; j: 0 1 2 3 4 5 6 7 8 9

Petlja je završena.

Page 58: OP1 Kontrola Toka

58

Naredba continue Opšti oblik

petlja { ... continue; ... }

Služi za preskakanje naredbi do kraja tela petlje i na prelazak na naredbe za opsluživanje tela petlje ◦ u while i do while petljama posle continue

se prelazi na proveru uslova

◦ u for petlji posle continue se prelazi na iteraciju

Page 59: OP1 Kontrola Toka

59

Naredba continue Naredba continue se obično nalazi

unutar naredbe if ili switch, inače se

naredbe iza continue nikad ne bi

izvršavale Primer

petlja

{

...

if(uslov)

continue;

...

}

Page 60: OP1 Kontrola Toka

60

Primer za continue for(int i=0; i<10; i++)

{

printf("%d ", i);

if(i%2 == 0)

continue;

printf("\n");

}

0 1

2 3

4 5

6 7

8 9

Page 61: OP1 Kontrola Toka

61

Skok sa proizvoljnim odredištem Opšti oblik naredbe goto je:

goto oznaka;

Oznaka je odredište skoka ◦ piše se po pravilima pisanja za identifikator

◦ oznaka ima funkcijski doseg

Naredba na koji se skače obeležava se oznakom koja se piše ispred naredbe

oznaka: naredba

Odredište skoka može biti na bilo kojem mestu ◦ uskakanje u blok nije zabranjeno, ali treba smatrati kao

da jeste

◦ naredba goto se može koristiti npr. da se prekine više uklopljenih struktura

Page 62: OP1 Kontrola Toka

62

Primer za goto

for(...){

for(...){

for(...){

...

if(propast) goto greska;

...

}

}

}

greska: // obrada greške

Page 63: OP1 Kontrola Toka

63

Naredba return Opšti oblik

tip ime_metode(lista_parametara) {

...

if(uslov) return [vrednost];

...

}

Služi za izlazak iz metode

Posle naredbe return kontrola se vraća pozivaocu metode

Naredba if je se najčešće piše ako naredba return nije poslednja naredba u metodi, inače se naredbe iza naredbe return nikad ne bi izvršavale

vrednost ne postoji ako je tip metode void, inače postoji

Page 64: OP1 Kontrola Toka

64

Primer za return

class PrimerZaReturn {

public static void main(String args[]) {

boolean t = true;

System.out.println("Pre naredbe return.");

if(t) return; // povratak pozivaocu

System.out.println("Ovo se ne izvršava.");

}

}

Pre naredbe return.

Page 65: OP1 Kontrola Toka

65

Primer: provera da li je broj prost class ProstBroj {

public static void main(String args[]) {

int broj = 14;

boolean prost_broj = true;

for(int i=2; i < broj/2; i++) {

if((broj % i) == 0) {

prost_broj = false;

break;

}

}

if(prost_broj) System.out.println("Prost");

else System.out.println("Nije prost");

}

}