diff options
author | Martin Možina <martin.mozina@fri.uni-lj.si> | 2016-10-11 14:39:50 +0200 |
---|---|---|
committer | Martin Možina <martin.mozina@fri.uni-lj.si> | 2016-10-11 14:39:50 +0200 |
commit | 29bc34810cb1d1fbd208f6b5f2dad73188ca7f12 (patch) | |
tree | 0501d9274c6f87aa8a0aa4d273c364f0923d9063 /python/problems/while_and_if/ifclause_sl.html | |
parent | 8fd61c5d99aee8bf08871d306f1392b1bebd97aa (diff) |
- new exercises on recursion
- added text (lectures) on conditions and loops
Diffstat (limited to 'python/problems/while_and_if/ifclause_sl.html')
-rw-r--r-- | python/problems/while_and_if/ifclause_sl.html | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/python/problems/while_and_if/ifclause_sl.html b/python/problems/while_and_if/ifclause_sl.html new file mode 100644 index 0000000..c1f9134 --- /dev/null +++ b/python/problems/while_and_if/ifclause_sl.html @@ -0,0 +1,330 @@ +<!DOCTYPE html> +<html lang="sl"> +<head> + <meta charset="utf-8" /> + <title></title> + <link rel="stylesheet" type="text/css" href="/css/codeq.css" /> + <link rel="stylesheet" type="text/css" href="../../style.css" /> +</head> +<body> + +<h2>Pogojni stavki</h2> + +<p> Sledijo zapiski predavanj prof. Demšarja. Najnovejšo verzijo zapiskov dobite na + <a href="https://ucilnica.fri.uni-lj.si/course/view.php?id=166">spletni + učilnici</a>.</p></p> + +<p>Začnimo s preprostim programom za izračun indeksa telesne teže.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi)</pre> + +<p>Želimo si, da bi program povedal še, ali je uporabnik slučajno + preobilen. Prvi, seveda napačni poskus, bi bil takšen.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +print("Potrebno bo shujšati!")</pre> + +<p>Program v tej obliki bi, v širši rabi, povzročal anoreksijo, saj vse po +vrsti pošilja na hujšanje. Zadnjo vrstico, izpis poziva k hujšanju, mora izvesti +le, če je <code>bmi</code> večji od 25 (ta meja namreč velja za mejo debelosti, +oziroma, politično korektno, prekomerne telesne teže).</p> + +<p>To storimo tako, da pred vrstico dodamo pogoj. Ta se glasi "če bmi > 25", +le v angleščini.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!")</pre> + +<p>Ne spreglejmo dveh pomembnih reči. Prva: na konec pogoja smo postavili + dvopičje. To ne služi le za okras: dvopičja ne smemo izpustiti. Python na + tem mestu <em>zahteva</em> dvopičje.</p> + +<p>Druga: za <code>if</code>-om sem vrstico nekoliko zamaknil. Obilajno je zamik + štiri presledke. Ni obvezno, a če boste uporabljali štiri presledke, boste + pisali enako kodo kot drugi. In nikoli nikoli ne uporabljajte tabulatorjev, + ti naredijo zmedo!</p> + +<p>Zamaknjenih vrstic bi lahko bilo še več. Vse se izvedejo le, če +je pogoj izpolnjen.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>Tako kot smo zastavili zdaj, se <code>print</code>a, ki sta zamaknjena, +izvedeta le, če je oseba preobilna. Zadnji <code>print</code> ni več znotraj +pogoja, zato se izvede v vsakem primeru, za suhe in debele.</p> + +<p>Program bi bil še bolj simpatičen, če bi tiste, ki niso predebeli, pohvalil. +</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +else: + print("Odlično, le še naprej jejte toliko kot doslej!") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>Pogojnemu stavku lahko sledi še + <code>else</code>, ki vsebuje tisto, kar naj se zgodi, če pogoj ni + izpolnjen.</p> + +<p>Znotraj pogojnih stavkov seveda lahko pišemo tudi druge reči, ne le +<code>print</code>ov. Takole: uporabniki programa se bodo pogosto zmotili in +namesto višine v metrih vpisali višino v centimetrih, zato jih bo program +obtožil težke anoreksije. To lahko popravimo preprosto tako, da program še pred +računanjem BMI preveri, ali je višina slučajno večja od, recimo, treh metrov. +V tem primeru sklepa, da je uporabnik podal višino v centimetrih, zato številko, +ki jo je vpisal uporabnik, deli s 100.</p> + +<p>Začetek programa tako postane takšen.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +if visina > 3: + visina = visina / 100 +bmi = teza / visina ** 2</pre> + +<p>Še ena estetska zadeva: za dvopičjem vedno pojdite v novo vrsto. Kot boste + zvedavi kmalu odkrili, Python sicer dovoli, da napišete tudi +<pre>if bmi > 25: print ("Potrebno bo shujšati")</pre> +vendar to vodi v nepregledne programe. To se ne dela.</p> + +<p>Tule pa je še nekaj primerov napačno zamikanih programov.</p> + +<pre>if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +else: + print("Odlično, le še naprej jejte toliko kot doslej!") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>Tretja vrstica mora imeti enak zamik kot druga, sicer Python ne more vedeti, + ali je še znotraj pogoja ali ne.</p> + +<pre>if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +else: + print("Odlično, le še naprej jejte toliko kot doslej!") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>Ne, tudi v to smer ne smemo. Tu se Python vpraša, zakaj je tretja vrstica + zamaknjena še bolj kot druga - smo pozabili še kakšen pogoj ali kaj?</p> + +<pre>if bmi > 25: +print("Potrebno bo shujšati!") +print("Da, gospod ali gospa, preveč vas je skupaj.") +</pre> + +<p>Blok za stavkom <code>if</code> mora biti zamaknjen.</p> + +<pre>if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") + else: + print("Odlično, le še naprej jejte toliko kot doslej!") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p><code>if</code> in <code>else</code> morata biti poravnana. Kmalu bomo videli +programe z več <code>if</code>i in <code>else</code>i; zamiki bodo potrebni, +da bomo vedeli, kateri <code>else</code> sodi h kateremu <code>if</code>.</p> + +<p>Če poskušamo zagnati kateregakoli od naštetih programov, bo Python javil + sintaktično napako. Za razliko od običajnih napak, ki jih boste delali, in + ko bodo programi naredili vsaj nekaj malega in potem crknili, ta ne bo niti + trznil, temveč kar takoj javil napako. Spodnji program pa je sintaktično + pravilen. Python ga lahko izvede. Najbrž pa to ni to, kar smo hoteli, saj + se zadnji <code>print</code> izvede le, če pogoj ni izpolnjen.</p> + +<pre>if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +else: + print("Odlično, le še naprej jejte toliko kot doslej!") + print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + + +<h2>Gnezdeni pogoji</h2> + +<p>Do sem vse lepo in prav, vendar: kaj bomo z anoreksičnimi? Program bi jim +mirno svetoval, naj še naprej jedo toliko kot doslej (torej: premalo). +Ne: pri takšnih, ki imajo BMI manjši od +18.5, moramo zastokati, naj vendar že začnejo jesti.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +else: + if bmi < 18.5: + print("Trlica!") + print("Zunaj so avtomati s sendviči in čokolado. Med pavzo si le postrezite!") + else: + print("Odlično, le še naprej jejte toliko kot doslej!") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>Vidimo? Znotraj <code>if</code>a ali <code>else</code>a smemo +ugnezditi nov pogoj. Zamikamo ga lepo naprej.</p> + +<p>Da bodo reči še nekoliko daljše (a poučnejše), dodajmo še en + <code>print</code>.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +else: + print("Predebeli ravno niste.") + if bmi < 18.5: + print("Trlica!") + print("Zunaj so avtomati s sendviči in čokolado. Med pavzo si le postrezite!") + else: + print("Odlično, le še naprej jejte toliko kot doslej!") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>Zdaj program vsem, ki niso predebeli, napiše dobro novico, da niso predebeli. +Šele nato se loti preverjanja, da niso slučajno presuhi.</p> + +<p>Tule mimogrede (prvič - a še velikokrat bomo) posvarimo pred ponavljanjem +kode. Gornji program bi lahko napisali tudi tako:</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") +else: + if bmi < 18.5: + print("Predebeli ravno niste.") + print("Trlica!") + print("Zunaj so avtomati s sendviči in čokolado. Med pavzo si le postrezite!") + else: + print("Predebeli ravno niste.") + print("Odlično, le še naprej jejte toliko kot doslej!") +print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>Ali celo tako.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") + print("Da, gospod ali gospa, preveč vas je skupaj.") + print("Pregled je končan, oglasite se spet čez dva tedna.") +else: + if bmi < 18.5: + print("Predebeli ravno niste.") + print("Trlica!") + print("Zunaj so avtomati s sendviči in čokolado. Med pavzo si le postrezite!") + print("Pregled je končan, oglasite se spet čez dva tedna.") + else: + print("Predebeli ravno niste.") + print("Odlično, le še naprej jejte toliko kot doslej!") + print("Pregled je končan, oglasite se spet čez dva tedna.")</pre> + +<p>To ni dobra ideja, ker je program daljši, manj pregleden, težje mu je + slediti, težje ga je spreminjati... Vedno se izogibajte ponavljanju. Več + o tem pa čez dva ali tri tedne.</p> + +<h2>Sicerče</h2> + +<p>Da se ne izgubimo, spet malo skrajšajmo program.</p> + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") +else: + if bmi < 18.5: + print("Trlica!") + else: + print("Odlično, le še naprej jejte toliko kot doslej!")</pre> + +<p>Pogojni stavki se nam lahko hitro zagnezdijo precej globoko in vrstice +zbežijo nekam daleč proti desni. (Da ne govorimo o tem, da pogojni stavki +niso niti približno edina reč, za katero bomo morali zamikati vrstice.) Ker +so situacija, kakršna je zgornja, kar pogoste, imajo nekateri programski jeziki +- in Python je med njimi - poleg <code>if</code> in <code>else</code> še +<code>elseif</code> oziroma <code>elif</code>. (Še ena rezervirana beseda!) +V Pythonu se uporablja slednja različica, <code>elif</code>. V gornjem programu +ga uporabimo takole: + +<pre>teza = float(input("Teža: ")) +visina = float(input("Telesna višina: ")) +bmi = teza / visina ** 2 +print("Indeks vaše telesne teže je", bmi) +if bmi > 25: + print("Potrebno bo shujšati!") +elif bmi < 18.5: + print("Trlica!") +else: + print("Odlično, le še naprej jejte toliko kot doslej!")</pre> + +<p>Program se zdaj prebere še lepše kot prej: če je BMI prevelik, pozovemo + k hujšanju, sicerče je premajhen, ozmerjamo dotično najstnico s trlico, + sicer pa izrečemo pohvalo.</p> + +<p>Po izkušnjah je <code>elif</code> za študente huda, nenavadna skušnjava: + nekateri ga pogosto uporabljajo namesto <code>else</code>a. Recimo, da bi + hoteli sprogramirati skrajšano pesimistično različico, po kateri so vsi, + ki niso debeluhi, trlice. Radi bi torej tole:</p> +<pre>if bmi > 25: + print("Potrebno bo shujšati!") +else: + print("Trlica!") +</pre> + +<p>Mnogi bi (iz meni neznanega razloga) naredili takole:</p> + +<pre>if bmi > 25: + print("Potrebno bo shujšati!") +elif bmi < 25: + print("Trlica!") +</pre> + +<p>Python ni pozabil <code>if</code>a in bo tudi, če napišemo le + <code>else</code>, čisto dobro vedel, kakšen je pogoj zanj. Drugi pogoj + je nepotreben; če <code>bmi</code> ni večji od 25, je pač očitno manjši.</p> + +<p>Torej: ne zamenjujte <code>else</code> brez potrebe z <code>elif</code>.</p> + +<p>Mimogrede, program ne izpiše ničesar za tiste, ki imajo BMI natančno +25. Drugi pogoj, če ga res hočemo imeti, bi se moral vprašati, ali je +<code>bmi</code> manjši <em>ali enak</em> 25.</p> + + + +</body> +</html> |