summaryrefslogtreecommitdiff
path: root/python/problems/while_and_if/ifclause_sl.html
diff options
context:
space:
mode:
Diffstat (limited to 'python/problems/while_and_if/ifclause_sl.html')
-rw-r--r--python/problems/while_and_if/ifclause_sl.html330
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 &gt; 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>