05. Ciklusi - naredbe iteracije - petlje

 

CIKLUSI - naredbe iteracije (petlje)

Petlje omogućavaju da se iskaz ili iskazni blok izvršavaju kontrolisani broj puta uzastopno.

 

while petlja - uslov na početku

while petlja funkcioniše na taj način što se blok instrukcija unutar nje izvršava sve dok je uslov za ostanak u petlji, koji se nalazi na ulasku u petlju, ispunjen. U slučaju da uslov na samom početku nije ispunjen, petlja se ne izvršava ni jednom. Opšti oblik petlje izgleda ovako:

[inicijalizacija;]
while(uslov_ostanka){
telo_petlje;
}

Pre ulaska u petlju vrši se inicijalizacija promenljivih koje će biti korišćene bilo u uslovu, bilo u telu petlje. U telu petlje se mora nalaziti kod koji će baratati sa promenljivama koje formiraju uslov za ostanak u petlji.

int i=1;
while(i<=10){
System.out.println(i++);
}

štampa brojeve od 1 do 10 na standardni izlaz.

U slučaju inicijalizacije i sa bilo kojim brojem većim od 10 petlja se ne bi izvršavala i na izlazu ne bi smo dobili ništa.

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje

 

do-while petlja - uslov na kraju

Za razliku od prethodne petlje koja je imala uslov na svom početku, do-while petlja ima uslov na kraju. Izvršava se sve dok je uslov ispunjen. Znači, telo petlje će se sigurno izvršiti bar jednom. Opšti oblik petlje izgleda ovako:

[inicijalizacija]
do {
telo_petlje
[iteracija]
} while (uslov);

Primer (daje isti rezultat kao i prethodni):

int i=1;
do {
System.out.println(i++);
}while (i<=10);

Međutim, za int i=12; na izlazu bi smo dobili 12.

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje

 

for petlja

Primarna svrha for petlje je da se telo petlje izvršava određeni broj puta. Opšti oblik petlje je:

for( inicijalizacija; uslov; iteracija){
telo_petlje;
}

For petlja je najkompaktnija i najčešće korišćena petlja. Unutar zaglavlja petlje se nalazi kod za inicijalizaciju (najčešće brojača petlje, često i deklaraciju), uslov terminacije (prekida) petlje (ovo je logički iskaz koji se proverava na početku svakog prolaska kroz petlju) i kod za iteraciju (obično se koristi za inkrementiranje brojača, mada to nije pravilo). Ukoliko uslov na početku nije ispunjen telo petlje se neće izvršiti nijednom. Primeri:

for(int i=0; i<10; i++){
System.out.println(i);
}

for(int i=0; i<10;){
System.out.println(i++);

for(int i=0; i<10;System.out.println(i++));

koji na glavni izlaz štampaju brojeve od 0 do 9.

U ovom primeru je vredna pažnje još i deklaracija promenljive i u zaglavlju petlje. Ta promenljiva je privremena promenljiva, a blok u kome je definisana je blok u kome se nalazi for petlja. Primer izračunavanje faktroijela brojeva do n i sume brojeva do n

int n=10, //računa vrednosti do ovog broja
faktorijel=1;// neutralni elem za *
for( int i=1; i<n; i++){
faktorijel=1;
for (int faktor=2;faktor<=i;faktor++)
faktorijel*=faktor;
System.out.print(i+”!=“+faktorijel+”; “);
}

Na izlazu:

1!=1; 2!=2; 3!=6; 4!=24; 5!=120; 6!=720; 7!=5040; 8!=40320; 9!=362880;

int n=10, suma=0;
for( int i=0; i<n; i++){
suma+=i;
System.out.print(i+” - “+suma+”: “);
}

Izlaz :

0 - 0: 1 - 1: 2 - 3: 3 - 6: 4 - 10: 5 - 15: 6 - 21: 7 - 28: 8 - 36: 9 - 45:

Operator zarez (razlikovati ga od razdelnika zarez koji služi da odvoji definicije) se koristi samo u kontrolnim izrazima petlje for prilikom inicijalizacije i pri izvršavanja delova koraka kontrolnog izraza.

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje

 

break i continue

Tok petlje se može kontrolisati i pomoću break i continue. Iskaz break izlazi iz petlje, bez izvršavanja ostalih naredbi unutar petlje. Iskaz continue zaustavlja izvršavanje tekućeg koraka i vraća se na početak petlje kako bi počeo novi korak.

Rezervisana reč goto (bezuslovni skok) prisutna u programskim jezicima od samog početka, nastala je kao posledica kontrole programa u mašinskom jeziku. U asemblerskom kodu koji generiše svaki prevodilac kontrola programa se sastoji iz mnogo skokova. Međutim, skok na nivou izvornog koda je na vrlo lošem glasu (i napad na ovakvo programiranje popularni sport). Naravno, problem nije u korišćenju naredbi goto, već u njenom prečestom korišćenju. Iako je rezervisana u Javi, ona se ne koristi i ne postoji naredba goto.

U Javi postoji način da se izađe iz petlje koji koristi isti mehanizam kao i goto, a to je oznaka (label). Oznaka je identifikator i koristi se samo neposredno pre iteracionog iskaza (petlje). Oznaku treba stavljati pre petlje samo ako unutar petlje postoji još jedna petlja ili iskaz izbora (switch). break i continue uobičajeno prekidaju samo trenutnu petlju, ali kada se koriste sa oznakom one prekidaju sve petlje do nivoa gde se nalazi oznaka:

oznaka1:
spoljna-petlja {
unutrasnja-petlja{
//...
break; // 1
//...
continue; // 2
//...
continue oznaka1; // 3
//...
break oznaka1; // 4
}
}

U slučaju 1, break prekida unutrašnju petlju a spoljašnja se nastavlja. U slučaju 2, continue se vraća na početak unutrašnje petlje.

U slučaju 3 prekidaju se i unutrašnja i spoljašnja petlja sve do oznake1, a zatim se nastavljaju petlje počev od spoljašnje (od petlje koja se nalazi neposredno iza oznake). U slučaju 4, vrši se prekid obe petlje do oznake1 i ne ulazi se ponovo u petlju. Ona stvarno prekida obe petlje.

Oznake se koriste jedino kod ugneždenih petlji kada je potrebno napraviti break ili continue u više nivoa ugnežđivanja.

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje

 

Vežbe

Z5.1. Sume i srednje vrednosti
Izračunati zbir i srednju vrednost:
a) prvih n prirodnih brojeva
b) brojeva koji se nalaze između prirodnih brojeva n i m, m>n
c) brojeva između n i m koji nisu deljivi sa 3

Z5.2. Faktorijel
a) n!
b) n!!

a)

Scanner ul=new Scanner(System.in);
int P=1,n;
System.out.print("Unesi n :");
n=ul.nextInt();
for(int i=n;i>1;i--) P*=i;
System.out.println("Faktorjel od "+n+" je "+P+".");

možemo u ciklusu i da koristimo n kao brojač

for(;n>1;n--) P*=n;
System.out.println("Faktorjel je "+P+".");

b) n!!=n*(n-2)*(n-4)*...

for(int i=n;i>1;i-=2) P*=i;
System.out.println("Dvostruki faktorjel od "+n+" je "+P+".");

Z5.3. Sume i srednje vrednosti
Napisati program koji za unetih n brojeva računa:
a) zbir (i srednju vrednost)
b) zbir pozitivnih brojeva (i srednju vrednost)
c) zbir neparnih brojeva (i srednju vrednost)
d) zbir pozitivnih i deljivih sa 3 (i srednju vrednost)
e) koliko ima pozitivnih brojeva deljivih sa 7 (i srednju vrednost)

Scanner ul=new Scanner(System.in);
int n, BR, Sa=0, Sb=0, Sc=0, Sd=0, brA=0, brB=0, brC=0, brD=0, brE=0;
double SrVa, SrVb, SrVc, SrVd;
System.out.print("Unesi n :");
n=ul.nextInt();
for(int i=1; i<=n; i++){
BR=ul.nextInt();
Sa+=BR; brA++; //a svi, brA ovde nije neophodan
if(BR>0){Sb+=BR;brB++;}//b pozitivni
if(BR%2==1){Sc+=BR;brC++;}//c neparni
if(BR>0 && BR%3==0){Sd+=BR;brD++;}//d pozitivni i deljivi sa 3
if(BR>0 && BR%7==0){brE++;}//e broj pozitivni i deljivih sa 7
}
SrVa=1.0*Sa/brA;
SrVb=1.0*Sb/brB;
SrVc=1.0*Sc/brC;
SrVd=1.0*Sd/brD;
System.out.println("a) Suma = "+Sa+", srednja vrednost = "+SrVa);
System.out.println("b) Suma = "+Sb+", srednja vrednost = "+SrVb);
System.out.println("c) Suma = "+Sc+", srednja vrednost = "+SrVc);
System.out.println("d) Suma = "+Sd+", srednja vrednost = "+SrVd);
System.out.println("e) broj je = "+brE);

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje

Z5.4.
Kao prethodni, samo što se celi brojevi unose sa tastature sve dok se ne unese 0.

Može kao prethodni sa izmenom for petlje

System.out.print("Unesi broj :");
BR=ul.nextInt();
for(; BR!=0;){
Sa+=BR; brA++; //a svi
if(BR>0){Sb+=BR;brB++;}//b pozitivni
if(BR%2==1){Sc+=BR;brC++;}//c neparni
if(BR>0 && BR%3==0){Sd+=BR;brD++;}//d pozitivni i deljivi sa 3
if(BR>0 && BR%7==0){brE++;}//e broj pozitivni i deljivih sa 7
BR=ul.nextInt();
}

Z5.5.
Koliko najmanje prirodnih brojeva (1,2,3,...) treba sabrati pa da zbir bude veći od unetog prirodnog broja K.

Scanner ul=new Scanner(System.in);
int K, br=0, S=0;
System.out.print("Unesi K: ");
K=ul.nextInt();
while (S<K) {
S+=++br;
System.out.println("br="+br+", S="+S);
}
System.out.println("Da bi zbir bio veći od "+K+" potrebno je sabrati "+br+" brojeva.");

Z5.6. Najmanji
Preko standardnog ulaza se unosi:
a) n brojeva,
b) brojevi sve dok se ne unese 0,
Odrediti najmanji uneti broj i najmanji po apsolutnoj vrednosti.

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje

Z5.7.
Za uneti prirodni broj n izračunati:
a) S=1*1+2*2+3*3+...+n*n (suma kvadrata)
b) R=1/1+1/2+1/3+...+1/n (suma recipročnih vrednosti)

Z5.8.
Izračunati prvih n članova niza oblika:
a) 5, 10, 20, 40, 80...
b) 15, -25, 35, -45, 55...

Z5.9.
Za uneto n, izračunati zbir:
a) S=1+1*2+1*2*3+1*2*3*4+...+1*2*...*n
b) S=1+1+2+1+2+3+1+2+3+4+...+1+2+...+n

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje

Z5.10.
Koliko najmanje brojeva oblika
a) 1, 1*2, 1*2*3, 1*2*3*4,
b) 1, 1+2, 1+2+3, 1+2+3+4,
treba sabrati da bi se premašio uneti broj K.

Z5.11.
Izračunati sumu prvih n članova niza oblika: 3, 4, 7, 11, 18, 29, 47...

Z5.12.
Unosi se n prirodnih brojeva. Odrediti najmanju razliku po apsolutnoj vrednosti između dva susedna elementa.

Nazad na početak: 05. Ciklusi - naredbe iteracije - petlje