Materijali/Čas 03

Čas 03 · Poređenja i jednostavan if/else

Program bira između dve putanje

Dijagram toka prvi put dobija grananje. Uslov proveravamo na konkretnom podatku, izvršavamo samo odgovarajuću granu i proveravamo program primerima oko granice.

MAPA ČASA

Ulaz → uslov → jedna grana → izlaz → provera

1
ulaz
2
uslov
3
izabrana grana
4
izlaz
5
provera

Na kraju je dovoljno da:

  • Napiši uslov pomoću operatora poređenja.
  • Razlikuj dodelu = od poređenja ==.
  • Poveži romb dijagrama toka sa if/else grananjem.
  • Prati samo granu čiji je uslov tačan.
  • Napiši i proveri mali C program sa jednom odlukom.

01 · KORAK

Uslov je pitanje sa dva moguća odgovora

Program često mora da odluči šta radi dalje. Uslov je pitanje koje za konkretne podatke može da bude tačno ili netačno.

Uslov broj >= 0 nije zauvek tačan ili netačan. Za broj 7 je tačan, za broj -3 je netačan, a za broj 0 je tačan jer operator >= uključuje i granicu.

broj >= 0
poeni >= 51
broj % 2 == 0
Proveri konkretan podatakZa broj = -4, broj = 0 i broj = 9 odredi vrednost uslova broj >= 0. Kod svakog odgovora pokaži koji deo uslova si proverila.
Uvek proveravaj granicuAko uslov sadrži >= ili <=, granična vrednost pripada tačnoj grani. Kod poeni >= 51, broj 51 prolazi.

02 · KORAK

Operator govori kakvo poređenje pravimo

Koristimo > i < za strogo veće ili manje, >= i <= kada uključujemo granicu, == za jednakost i != za različitost.

Znak = ima drugi posao: njime upisujemo vrednost u promenljivu. Zato x = 5 menja x, dok x == 5 proverava da li x već ima vrednost 5.

x = 5;        /* dodela */
x == 5        /* poređenje */
x != 5        /* x nije 5 */
Napiši uslov, ne celu rečenicuNapiši C uslove za: godine su najmanje 18; broj je različit od nule; poeni su manji od 51; broj je paran.
Najopasnija sitna greškaU uslovu jednakosti pišemo ==. Jedno = nije skraćena verzija poređenja, nego dodela.

03 · KORAK

if izvršava naredbu samo kada je uslov tačan

Program prvo izračuna uslov u zagradi. Ako je uslov tačan, izvršava telo if-a. Ako nije tačan, preskače ga i nastavlja posle zatvorene vitičaste zagrade.

Jednostavan if koristimo kada postoji posebna radnja samo u jednom slučaju, a u drugom ne moramo da uradimo ništa.

if (broj < 0) {
    broj = -broj;
}
printf("%d\n", broj);
Prati obe mogućnostiOdredi izlaz za broj = -8 i broj = 8. Objasni kada se dodela broj = -broj izvršava, a kada se preskače.
Uslov nije isto što i teloUslov bira da li se telo izvršava. Naredbe između { i } pripadaju telu if-a.

04 · KORAK

if/else bira tačno jednu od dve grane

Ako je uslov tačan, izvršava se if grana i else grana se preskače. Ako je uslov netačan, if grana se preskače i izvršava se else grana.

Program ne izvršava obe grane. Posle izabrane grane tok se ponovo spaja i program nastavlja dalje.

if (broj % 2 == 0) {
    printf("Paran\n");
} else {
    printf("Neparan\n");
}
Čitaj redom kojim računar radiZa ulaze 14, 9 i 0 prvo izračunaj broj % 2, zatim vrednost uslova i tek onda napiši koju granu program izvršava.
else nema svoj uslovelse znači svi slučajevi u kojima prethodni if uslov nije tačan.

05 · KORAK

Romb u dijagramu predstavlja istu odluku

U romb upisujemo pitanje ili uslov. Iz romba izlaze dve strelice, obično označene sa DA i NE, i svaka vodi svojoj radnji.

Kada dijagram prevodimo u C, sadržaj romba ide u zagrade posle if. Putanja DA postaje if grana, a putanja NE else grana.

Prevedi dijagram u kodNacrtaj dijagram koji učitava broj i prikazuje da li je deljiv sa 5. Zatim napiši odgovarajući if/else u C-u.
Oznake na strelicama su deo rešenjaBez DA i NE nije jasno koja putanja odgovara tačnom, a koja netačnom uslovu.

06 · KORAK

Jedan znak odlučuje šta se dešava na granici

Za prolaz od 51 poena uslov mora da bude poeni >= 51. Uslov poeni > 51 pogrešno odbacuje tačno 51 poen.

Najbrže otkrivamo ovakvu grešku sa tri probna podatka: neposredno ispod granice, tačno na granici i neposredno iznad nje.

50  → ne prolazi
51  → prolazi
52  → prolazi
Izaberi testove pre pokretanjaProgram daje popust od 20 godina naviše. Napiši uslov i tri ulaza koja proveravaju granicu. Uz svaki napiši očekivanu granu.
Dobri testovi nisu nasumičniPrimeri oko granice proveravaju baš mesto na kojem se > i >= razlikuju.

07 · KORAK

Kod sa odlukom proveravamo po delovima

Najpre proveri unos i promenljive. Zatim pročitaj uslov kao pitanje, odredi šta se dešava na granici i proveri koje naredbe pripadaju kojoj grani.

Česte greške su = umesto ==, ; odmah posle if uslova, pogrešan operator na granici i zamenjeni ispisi u granama.

if (broj % 2 = 0); {
    printf("Neparan\n");
} else {
    printf("Paran\n");
}
Popravi sa razlogomU prikazanom kodu pronađi greške. Za svaku prvo reci kako menja tok programa, pa tek onda napiši ispravku.
Ne popravljaj sve odjednomPosle svake ispravke ponovo pročitaj ceo uslov i obe grane. Tako znaš da ispravke zajedno i dalje daju traženo ponašanje.

08 · KORAK

Vežbaonica služi za proveru programa sa papira

Zadaci Časa 03 idu od ispravke jednog uslova do programa koji izdvaja cifre i zatim bira veću. Prva dva možeš da rešiš na papiru tokom časa, pa da ih kratko proveriš na računaru.

Kod preostalih zadataka najpre napiši uslov i glavne C naredbe bez gledanja rešenja. Tek zatim otvori trag ili proveru na sajtu.

Redosled za radNa času uradi zadatke 1 i 2. Posle časa završi sve zadatke Časa 03 koje još nisi uradila.
Papir je prvi nacrt programaNije potrebno da svaki zadatak odmah kucaš. Ako kod na papiru možeš da pročitaš red po red i proveriš ulazima, već si uradila glavni deo posla.

ZATVARANJE

Završna provera bez gledanja

  1. Koju vrednost može da ima uslov u programu?
  2. Koja je razlika između = i ==?
  3. Kada se izvršava if grana, a kada else grana?
  4. Kako romb u dijagramu toka prelazi u C kod?
  5. Koja tri ulaza bi izabrala da proveriš uslov sa granicom?