MAPA ČASA
Početne vrednosti → uslov → telo → promena → ponovna provera → rezultat
1
početak
2
uslov
3
telo petlje
4
promena
5
povratak na uslov
6
rezultat
Na kraju je dovoljno da:
- Prati sve promene promenljivih kroz while i for petlju, uključujući vrednost posle izlaska.
- Napiši petlju koja ide unapred, unazad ili određenim korakom.
- Razlikuj brojač, zbir i proizvod i pravilno ih postavi pre petlje.
- Koristi do-while za unos koji mora bar jednom da se izvrši i while kada broj ponavljanja nije unapred poznat.
- Prepoznaj beskonačnu petlju, pogrešnu granicu i pogrešnu promenu brojača i nacrtaj povratnu strelicu u dijagramu toka.
01 · KORAK
while ponavlja telo dok je uslov tačan
Petlja ima početnu vrednost, uslov, telo i promenu koja približava izlasku. Posle tela program se vraća na uslov; telo se nikada ne izvršava automatski još jednom.
Kada uslov postane netačan, izvršavanje se nastavlja prvom naredbom posle petlje. Zbog toga pratimo i poslednju vrednost brojača, ne samo ono što je prikazano.
int i = 1;
while (i <= 5) {
printf("%d ", i);
i = i + 1;
}
printf("\nPosle: %d\n", i);
Prati proveru pre svakog prolazaNapiši redom vrednost i, rezultat uslova i ispis za svaki prolaz. Zatim objasni zašto je posle petlje i jednako 6.
Uslov se proverava pre telaAko je početna vrednost već učinila uslov netačnim, while telo se neće izvršiti nijednom. To je važna razlika u odnosu na do-while.
02 · KORAK
Povratna strelica pretvara odluku u petlju
U dijagramu toka romb proverava uslov. DA vodi kroz telo i promenu, a povratna strelica ponovo ulazi u isti romb. NE izlazi iz petlje.
Tabela praćenja ima po jedan red za jedan završen prolaz. U njoj odvojeno zapisujemo vrednosti pre tela, promene u telu i novu vrednost za sledeću proveru.
int i = 3;
while (i <= 12) {
printf("%d ", i);
i = i + 3;
}
Nacrtaj tok i tabeluNacrtaj dijagram petlje i tabelu za i = 3, 6, 9 i 12. U dijagramu jasno označi gde se i povećava i kojom strelicom se vraća na uslov.
Promena pripada teluAko povratna strelica preskoči promenu i, uslov će stalno proveravati istu vrednost i petlja se neće završiti.
03 · KORAK
Početak, smer, korak i granica moraju da se slažu
Petlja koja ide naviše koristi promenu koja povećava brojač i uslov sa gornjom granicom. Petlja koja ide naniže smanjuje brojač i proverava donju granicu.
Operator <= uključuje granicu, a < je isključuje. Korak ne mora biti 1: može biti 2, 3 ili neka druga vrednost, ali mora voditi ka izlasku.
int i = 10;
while (i >= 2) {
printf("%d ", i);
i = i - 2;
}
Promeni petlju bez nagađanjaNapiši petlju za 7, 10, 13, 16 i 19, zatim petlju za 20, 15, 10, 5 i 0. Za svaku odredi početak, uslov i promenu.
Najpre napiši očekivani nizPrve dve vrednosti otkrivaju korak, a poslednja vrednost otkriva da li granica pripada petlji. Tek tada piši uslov.
04 · KORAK
for okuplja kontrolu brojača u jednom redu
for je prirodan kada unapred znamo početak, uslov i promenu brojača. Ta tri dela stoje u zaglavlju, ali telo se izvršava istim redosledom kao kod odgovarajuće while petlje.
Prvo se izvršava početak, zatim se proverava uslov. Posle svakog prolaza izvršava se promena, pa se uslov ponovo proverava.
for (int i = 1; i <= n; i = i + 1) {
printf("%d %d\n", i, i * i);
}
Prevedi u oba smeraPrepiši for kao while bez promene ispisa. Zatim napiši for koji ide od N do 1 i prikazuje samo brojeve deljive sa 3.
for nije druga vrsta ponavljanjaVećina jednostavnih for petlji može direktno da se prepiše kao while. Razlika je u tome gde su raspoređeni početak, uslov i promena.
05 · KORAK
Akumulator čuva rezultat svih prethodnih prolaza
Promenljiva zbir počinje od 0 jer dodavanje nule ne menja rezultat. U svakom prolazu novi član se dodaje na vrednost koja već sadrži prethodne članove.
Kod proizvoda početna vrednost je 1. Kada bismo proizvod postavili na 0, svaki sledeći rezultat bi ostao 0.
int zbir = 0;
for (int i = 1; i <= n; i = i + 1) {
zbir = zbir + i;
}
printf("%d\n", zbir);
Prati staru i novu vrednostZa n = 5 napravi tabelu sa kolonama i, stari zbir i novi zbir. Zatim napiši petlju koja računa proizvod brojeva od 1 do N.
Rezultat se najčešće prikazuje posle petljeIspis unutar petlje pokazuje delimične rezultate. Ispis posle petlje pokazuje konačan zbir ili proizvod. To nisu isti zahtevi.
06 · KORAK
Brojač i zbir odgovaraju na različita pitanja
Brojač se povećava za 1 kada pronađemo traženi podatak. Zbir se povećava za vrednost tog podatka. U istoj petlji možemo da vodimo obe promenljive.
Uslov unutar petlje ne upravlja brojem prolaza; on bira šta se radi u trenutnom prolazu. Spoljašnja petlja i dalje prolazi kroz sve vrednosti.
int koliko = 0, zbir = 0;
for (int i = 1; i <= n; i = i + 1) {
if (i % 2 == 0) {
koliko = koliko + 1;
zbir = zbir + i;
}
}
Odvoji dve ulogeZa n = 10 odredi koliko i zbir. Zatim promeni pravilo tako da se obrađuju brojevi deljivi sa 3 ali ne i sa 2.
Ne povećavaj brojač u svakom prolazuAko koliko povećavaš izvan if-a, dobićeš ukupan broj prolaza, a ne broj vrednosti koje ispunjavaju uslov.
07 · KORAK
do-while izvršava telo pre prve provere
do-while je koristan kada unos mora da se zatraži bar jednom. Posle tela se proverava da li unos treba ponoviti.
Tačka-zarez posle while uslova je obavezni deo do-while sintakse. Uslov obično opisuje neispravno stanje koje zahteva novi unos.
do {
printf("Unesi ocenu 5-10: ");
scanf("%d", &ocena);
} while (ocena < 5 || ocena > 10);
Napiši uslov za ponavljanjePrati unose 3, 11 i 8. Zatim napiši do-while koji prihvata samo oznaku 0 ili 1.
Uslov govori kada se ponavljaZa dozvoljene ocene 5-10 petlja se ponavlja dok je ocena manja od 5 ili veća od 10. Kada je unos ispravan, uslov mora postati netačan.
08 · KORAK
while obrađuje podatke do granične vrednosti, a petlja u petlji pravi mrežu
Kada ne znamo koliko će podataka biti uneto, posebna vrednost može označiti kraj. Ako je 0 oznaka kraja, prvo učitamo broj, obrađujemo ga dok nije 0 i na kraju svakog prolaza učitamo sledeći.
Kod ugnježdenih petlji spoljašnja petlja određuje red, a unutrašnja prolazi kroz sve kolone tog reda. Za svaki jedan prolaz spoljašnje petlje unutrašnja kreće ispočetka.
scanf("%d", &broj);
while (broj != 0) {
zbir = zbir + broj;
scanf("%d", &broj);
}
for (int red = 1; red <= 3; red++) {
for (int kolona = 1; kolona <= 4; kolona++)
printf("*");
printf("\n");
}
Prepoznaj ko upravlja čimZa ulaze 4, -2, 7, 0 odredi zbir i broj obrađenih podataka. Zatim odredi koliko se puta izvršava unutrašnji printf za mrežu 3 × 4.
Granična vrednost se ne obrađujeNula samo zaustavlja petlju. Pošto se uslov proverava pre tela, ona se ne dodaje u zbir niti ulazi u broj obrađenih podataka.
09 · KORAK
Petlju proveravaj na granicama i na najmanjem slučaju
Kod svake petlje proveri početnu vrednost, uslov, smer promene i da li promena zaista vodi ka izlasku. Zatim prati najmanji dozvoljeni ulaz i jednu vrednost odmah pored granice.
Zadaci Časa 05 pokrivaju ispravljanje petlje, korake, zbir, brojanje, faktorijel, cifre, do-while i ugnježdene petlje. Rešenje prvo napiši na papiru, a sajt koristi za proveru strukture.
int i = 1;
while (i < n) {
printf("%d ", i);
i = i - 1;
}
Rad na časuNa času uradi zadatke 1, 6 i 9. Ako ostane vremena, uradi 8 ili 10. Posle časa završi sve zadatke Časa 05 koje nisi uradila.
Tri pitanja otkrivaju većinu grešakaDa li petlja počinje na pravoj vrednosti? Da li uslov uključuje pravu granicu? Da li promena približava uslov netačnom rezultatu?
ZATVARANJE
Završna provera bez gledanja
- Koja četiri dela moraš da proveriš kada čitaš petlju?
- Kako znaš da li granica N pripada petlji?
- Kada je for prirodniji od while petlje?
- Zašto se zbir najčešće postavlja na 0, a proizvod na 1?
- Po čemu se do-while razlikuje od while petlje?
- Kako biraš probne ulaze za petlju koja radi sa ciframa broja?