summaryrefslogtreecommitdiff
path: root/python/problems/while_and_if/ifclause_sl.html
blob: c1f9134c5d581d762349b77b01fb2a0e68e0ffb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
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>