Friday, May 1, 2020

Prvi razred - lekcija 5 - Ponavljanje naredbi

Понављање наредби дати број пута

Размислимо како бисмо написали програм који десет пута исписује Zdravo. На основу онога што смо до сада научили можемо десет пута навести наредбу print("Zdravo").
1
print("Zdravo")
2
print("Zdravo")
3
print("Zdravo")
4
print("Zdravo")
5
print("Zdravo")
6
print("Zdravo")
7
print("Zdravo")
8
print("Zdravo")
9
print("Zdravo")
10
print("Zdravo")
11
(здраво_десет_пута_1)
Приметимо да је овај програм било напорно откуцати (чак иако смо користили технику копирања и лепљења). Ако сада замислимо да желимо да корисник прво унесе број колико пута жели да се испише поздрав, тада је јасно да тај програм не можемо испрограмирати на овај начин, већ су нам потребне мало напредније технике програмирања. Решење долази у облику петљи, тј. наредби које омогућавају да се нека наредба или неки блок наредби понове више пута. За почетак размотримо наредбу којом постижемо да се нешто понови дати број пута. Најједноставнији начин да то урадимо је да употребимо наредбу облика for i in range(n):. Наредни програм 10 пута исписује поруку Zdravo, коришћењем петље for.
1
for i in range(10):        # ponovi 10 puta:
2
    print("Zdravo")        #    ispiši tekst "Zdravo"
3
(здраво_десет_пута)
Након петље можемо исписати и додатну поруку (у овом примеру то је порука Doviđenja).
1
for i in range(10):        # ponovi 10 puta:
2
    print("Zdravo")        #    ispiši tekst "Zdravo"
3
print("Doviđenja")         # ispiši tekst "Doviđenja"
4
(здраво_десет_пута_2)
Приметимо да је испис поруке Zdravo био увучен, јер се понавља, док испис поруке Doviđenja није био увучен јер се не понавља више пута. Ако бисмо увукли обе наредбе исписа, онда би се обе понављале 10 пута, што није оно што желимо.
1
for i in range(10):        # ponovi 10 puta:
2
    print("Zdravo")        #    ispiši tekst "Zdravo"
3
    print("Doviđenja")     #    ispiši tekst "Doviđenja"
4
(здраво_десет_пута_3)
Увежбајмо овај облик понављања кроз још неколико једноставних примера.

Обими 5 троуглова

Напиши програм који израчунава обиме пет једнакостраничних троуглова чије дужине страница корисник уноси.
1
for i in range(5):                                # ponovi 5 puta:
2
    a = int(input("Unesi dužinu stranice:"))      #   učitaju dužinu stranice
3
    O = 0                                         #   izračunaj obim - ispravi ovaj red
4
    print(O)                                      #   ispiši obim
5
(обими_пет_троуглова)
Приметимо да су све наредбе у телу петље увучене у односу на петљу, али и да су међусобно поравнате, што мора увек бити случај (у супротном се добија порука да програм није исправан).

Поздрави сваког ученика

Напиши програм који учитава неколико имена ученика и сваког појединачно поздравља.
1
n = int(input("Unesi broj učenika: "))           # učitaj broj učenika n
2
for ???:                                         # ponovi n puta:
3
    ime = input("Kako se zoveš?")                #    unesi ime učenika - ispravi ovaj red
4
    print("Zdravo, ti se zoveš:", ime)           #    pozdravi učenika
5
(поздрав_ученицима)
Примети да овај пут уместо константне вредности унутар range треба навести променљиву n, што значи да ће се петља извршавати различит број пута (у зависности од броја n који корисник уноси). Такође, примети да променљива ime не чува број него текст. Приликом уноса вредности употребили смо само input(...), а не int(input(...)), нити float(input()), јер након уноса текста није потребно из њега прочитати ни целобројну ни реалну бројевну вредност (чему служе функције int и float).

Опсег бројева - range

Размотримо сада детаљније како функционише петља for i in range(n): којом смо постизали да се нешто понови n пута. Током извршавања такве петље променљива i редом узима вредности 012 итд., све до вредности n-1. На пример, ако је n једнако 3, тада ће се тело петље извршити пет пута и у првом извршавању тела петље променљива i ће имати вредност 0, у другом вредност 1, а у трећем вредност 2. Позив range(n), дакле, формира колекцију бројева 0, 1, 2, ..., n-1 из које затим бројачка променљива i узима редом једну по једну вредност. Осим са једним, функцију range могуће је позвати и са два и са три параметра. Када се наведу два аргумента a и b, врши се набрајање свих елемената из интервала целих бројева [a, b-1], док се у случају када се наведу три аргумента ab и k врши набрајање сваког k-тог елемента тог интервала. Дакле,
  • позив range(n) гради колекцију 1, 2, ..., n-1;
  • позив range(a, b) гради колекцију a, a+1, ..., b-1;
  • позив range(a, b, k) гради колекцију a, a+k, a+2k, ..., a+nk, где је последњи број одабран тако да буде последњи у овом низу који је строго мањи од k.
Провери да ли ово разумеш тако што ћеш одговорити на наредних неколико питања.
Q-10: Који опсег садржи вредности 1, 2, 3 ?





Q-11: Колико вредности садржи опсег range(1, 10, 2) ?





О колекцијама података причаћемо детаљније у наредном поглављу. Нагласимо да је колекција range таква да се њени елементи не чувају истовремено у меморији, већ се током рада петље for гради један по један елемент ове колекције. У овом приручнику опсеге ћемо увек користити само у склопу петље for.
Илуструјмо употребу различитих облика функције range кроз наредних неколико задатака.

Испис бројева од 0 до 9

Употреби петљу да би се исписали бројеви од 0 до 9.
1
for i in range(0):    # ispravi ovaj red
2
    print(i)
3
(бројеви_од_0_до_9)

Испис бројева од a до b

Када се у позиву функције range наведе само један аргумент, онда бројање креће од нуле, међутим, када се наведу два аргумента a и b, тада бројање креће од a и завршава се са b-1.

Напиши програм који учитава два броја a и b и затим исписује све бројеве од a до b (укључујући и њих).
1
a = int(input("Odakle se broji: "))
2
b = int(input("Dokle se broji: "))
3
for i in range(0, 0):    # ispravi ovaj red
4
    print(i)
5
(бројеви_од_a_до_b)

Игра жмурке

Ако се у позиву функције range наведу три аргумента, трећи од њих одређује корак за који се у сваком кораку петље врши увећавање бројачке променљиве. На пример, range(1, 10, 2) означава да бројачка променљива креће од 1 и да се у сваком кораку увећава за 2, све док је строго мања од 10 тј. да редом узима вредности 1357 и 9.

У игри жмурке деца броје 5, 10, 15, итд., до 100. Напиши програм који исписује баш те бројеве.
1
for i in range(0, 100 + 1, 0):  # ispravi ovaj red
2
    print(i)
3
print("Полазим!")
4
(жмурке)

Аларм који звони на сваких 10 минута

Сат је навијен тако да између 8:00 и 10:30 звони на сваких 10 минута. Напиши програм који исписује времена у којима сат звони.
Задатак је много једноставније реализовати ако време представимо само помоћу минута. Зато дефинишемо функције конверзије сати и минута у минуте и минута у сате и минуте.
1
def u_minute(sat, minut):
2
    return 0     # ispravi ovaj red
3
4
def u_sate_i_minute(minuti):
5
    return (minuti // 1, minuti % 1)   # ispravi ovaj red
6
7
for minuti in range(u_minute(0, 0), u_minute(0, 0) + 1, 0):  # ispravi ovaj red
8
    (sat, min) = u_sate_i_minute(minuti)
9
    print(minuti, "m =", sat, "h", min, "m")
10
(сати_и_минути)

Условна петља

Као што смо видели петља for се користи да се неке наредбе понове одређен, познат број пута, да се бројачком променљивом прође кроз неку правилну серију бројева (узастопне бројеве или бројеве набројане са неким кораком, попут оних у примеру игре жмурке) или да се прође кроз све елементе листе, ниске или речника. У неким ситуацијама потребно је богатије контролисање понављања, тј. потребно је неке наредбе понављати све док је испуњен неки услов. За то се користи тзв. условна петља тј. петља while.
И петљу while можемо употребити да прођемо кроз серију правилно размакнутих бројева. Урадимо поново задатак са игром жмурке.

Жмурке - петља while

1
broj = 5                  # neka je broj = 5
2
while broj <= 100:        # dok je broj <= 100:
3
    print(broj)            #    ispisi broj
4
    broj = broj + 5        #    uvecaj broj za 5
5
(жмурке_while)
Приметимо да се у телу петље крије наредба broj = broj + 5 која проузрокује да се вредност променљиве broj промени тако што се њена текућа вредност увећа за пет (о промени вредности променљиве и наредбама овог облика више је речено у поглављу о променама вредности променљивих). Изврши овај програм корак по корак и пажљиво прати како се мењају вредности променљиве broj.
Петљу while употребљавамо када не знамо унаред колико пута треба извршити тело неке петље.

Цифре броја

Напиши програм који одређује и исписује цифре датог природног броја (већег од 1), кренувши од цифре јединица. На пример, ако корисник унесе број 1234, програм треба да испише 4, 3, 2, 1 (сваку цифру у посебном реду).
Раније смо видели да се последња цифра броја може одредити тако што се одреди остатак при дељењу тог броја са 10, а да се она може обрисати из броја тако што се пронађе целобројни количник тог броја са 10. Да би се одредиле све цифре броја, потребно је понављати одређивање, исписивање и брисање последње цифре броја, све док број не постане нула.
1
n = int(input("Unesi broj:"))
2
while n > 0:
3
    print(n % 10)
4
    n = n // 10
5
(цифре_броја_петља)
Изврши обавезно овај програм корак по корак и прати вредности променљивих. На пример, ако унесеш број 123, приликом првог уласка у петљу проверава се да ли је 123 > 0 и пошто јесте, исписује се 123 % 10 тј. 3, а број n се замењује са 123 // 10 тј. 12. Након тога се проверава да ли је 12 > 0 и пошто јесте, исписује се 12 % 10 тј. 2, а број n се замењује са 12 // 10 тј. 1. Након тога се проверава да ли је 1 > 0 и пошто јесте, исписује се 1 % 10 тј. 1, а број n се замењује са 1 // 10 тј. 0. На крају се проверава да ли је 0 > 0 и пошто није, петља се завршава. Дакле, програм исписује цифре 32 и 1, баш како је и тражено.

Исправан унос оцене

Напиши програм који од ученика тражи да унесе оцену, све док не унесе оцену која је исправна (цео број између 1 и 5).
На почетку ћемо тражити да корисник унесе оцену и затим ћемо исписивати поруку о грешци и тражити да се оцена уноси све док унета оцена не припада интервалу од 1 до 5.
1
ocena = int(input("Unesi ocenu od 1 do 5"))
2
while not (1 <= ocena and ocena <= 5):
3
    print("Ocena nije ispravna.")
4
    ocena = int(input("Unesi ocenu od 1 do 5"))
5
print("Ispravno  je uneta ocena", ocena)
6
(исправан_унос_оцене)
Препоручујемо ти да овај облик петље вежбаш и помоћу робота Карела, јер у задацима које смо вам припремили постоји велики број њих који захтевају употребу петље while.

Угнежђене петље

Тело петље могу да чине било које наредбе, па и наребе гранања, али и друге петље.

Таблица множења

Напиши програм који исписује таблицу множења бројева од 1 до n. На пример, за n=4 таблица треба да изгледа овако.
1*1=1 1*2=2 1*3=3 1*4=4
2*1=2 2*2=4 2*3=6 2*4=8
3*1=3 3*2=6 3*3=9 3*4=12
4*1=4 4*2=8 4*3=12 4*4=16
Основу решења овог задатка чини пролазак кроз све парове бројева од 1 до n. За то се користе угнежђена петља. Бројач спољашње петље одговара броју врсте тј. првом чиниоцу (у првој врсти је први чинилац увек 1, у другој 2, у трећој 3, у четвртој 4). Бројач унутрашње петље одговара броју колоне тј. другом чиниоцу (у првој колони је други чинилац увек 1, у другој 2, у трећој 3, у четвртој 4).
Обратимо пажњу да се цела унутрашња петља понавља n пута, по једном за сваку вредност бројача спољашње петље. Када се i постави на 1 тада j редом узима све вредности од 1 до 4. Након тога се се i постави на 2, а j из почетка узима све вредности од 1 до 4 и тако даље.
У телу унутрашње петље знају се вредности бројача i и j и лако можемо израчунати њихов производ и исписати одговарајућу једнакост. Штампање ћемо подесити тако да се не прави размак између делова (постављањем sep="") и тако да се не прелази у наредни ред, већ размак након штампе (постављањем end=" "). У нови ред ћемо прелазити након завршетка рада унутрашње петље (тако што ће последња наредба спољашње петље бити print()).
Наредни програм је скоро готов - прошири наредбу print тако да се израчунава и штампа одговарајући производ.
1
n = 5
2
for i in range(1, n+1):
3
    for j in range(1, n+1):
4
        print(i, "*", j, "=", end=" ", sep="")
5
    print()
6
(таблица_множења)

Домаћи задатак

Уради за домаћи наредних неколико задатака.

Сви парни бројеви прве стотине

Напиши програм који исписује све парне бројеве прве стотине.
1
for i in ???  # dopuni ovaj red
2
    print(i)
3
(парни_бројеви_прве_стотине)

Распродаја ципела

У току је распродаја ципела. Напиши програм који корисницима омогућава да израчунају снижену цену ципела које желе да купе. У петљи се уноси цена ципела и проценат снижења и исписује се снижена цена. Програм престаје са радом када се унесе цена 0.
Једна могућност је да учитамо цену на почетку провера, а затим да у петљи while проверавамо да ли је цена различита од нуле и ако јесте да израчунамо снижење и учитамо поново цену и проценат како бисмо се припремили за следећи корак.
1
cena = float(input("Unesi cenu cipela:"))
2
procenat = float(input("Unesi procenat sniženja:"))
3
while cena != 0:
4
    snizena_cena = ???  # izračunavamo sniženu cenu
5
    print("Snižena cena:", snizena_cena)
6
    ??? # učitavamo novu cenu i procenat
7
(снижене_цене_while1)
Још једно могуће решење се заснива на томе да направимо бесконачну петљу (петљу у while True: којој је услов увек испуњен), на чијем ћемо почетку учитавати цену и проценат. Ако је цена нула, петљу ћемо прекидати наредбом break, а у супротном ћемо израчунавати и исписивати снижени износ.
1
while True:
2
    cena = float(input("Unesi cenu cipela:"))
3
    procenat = float(input("Unesi procenat sniženja:"))
4
    if cena == 0:
5
        break
6
    snizena_cena = ???  # izračunavamo sniženu cenu
7
    print("Snižena cena:", snizena_cena)
8
(снижене_цене_while2)
 

No comments:

Post a Comment

Prvi Razred                                               Drugi razred