Osnovi Programiranja 1 – MI
Glava IV: Kontrola toka
Visoka ICT Škola – Osnovi programiranja 1
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)
3
Naredbe
Deklarativne naredbe – deklarisanje
tipova podataka
Izvršne naredbe
4
Prosta naredba
Opšti oblik je
izraz;
Prazna naredba se koristi kada sintaksa
jezika zahteva naredbu, a nije potrebna
nikakva obrada
;
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 { }
6
Primer sekvence
int a, b;
...
{
int t;
t = a;
a = b;
b = t;
}
ili u jednom redu
{ t=a; a=b; b=t; }
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);
}
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
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
10
Selekcije
if-else
switch
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)
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; }
13
Uklapanje selekcije if-else
if(uslov1)
if(uslov2)
naredba1
else
naredba2
Deo else se uvek odnosi na poslednji
if ispred njega
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)
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;
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
}
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
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; }
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
);
}
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:
...
}
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
22
Ciklusi (petlje)
Izvršavanje (ponavljanje) jedne naredbe ili
bloka naredbi potreban broj puta, zavisno
od uslova
Naredbe ciklusa (petlje)
◦ while
◦ do while
◦ for
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
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
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; }
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
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
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
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
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
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
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
}
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
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
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
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);
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
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
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++;
}
40
Beskonačna for petlja
for( ; ; ) {
// ...
if(uslov)
break;
// ...
}
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
42
Trajnost podataka
Prema intervalu vremena u kojem podaci
postoje u toku izvršavanja programa
podaci mogu biti:
◦ prolazni
◦ trajni
◦ privremeni
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;
...
}
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
45
Primeri korišćenja modifikatora
{
register int t=0;
auto int a;
...
}
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
47
Primer definisanja statičkih podataka
{
static int t=0; //
Inicijalizacija je suvišna
static int a;
...
}
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
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
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
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
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
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;
}
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.
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
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;
...
}
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.
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
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;
...
}
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
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
62
Primer za goto
for(...){
for(...){
for(...){
...
if(propast) goto greska;
...
}
}
}
greska: // obrada greške
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
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.
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");
}
}