2 ehtolauseet ja toisto

Luvun 2 tehtävissä tutkitaan toistoa laskemalla lukujonoihin liittyviä esimerkkejä. Ehtolauseita tutkitaan esimerkiksi tehtävässä 2.8, jossa sanallinen tehtävänanto.

Ehtolauseet

Ohjelman täytyy joskus suorittaa komentoja vain, jos jokin ehto täyttyy. Silloin käytetään if-rakennetta.

In [38]:
# Testaa ohjelman tulostetta muuttamalla muuttujan x arvoa:
x = 10

# Tarkistetaan, onko muuttujan x arvo 10? Jos ehto toteutuu, niin suoritetaan sisennetty lohko
if x == 10:
    x = x + 2
    print("Muuttujan x arvo if-ehdon sisällä :", x)
# muuttujan x arvoksi asetaan 2-kertaa suurempi arvo
x = 2 * x
print("Muuttujan x arvo ohjelman lopussa:", x)
Muuttujan x arvo if-ehdon sisällä : 12
Muuttujan x arvo ohjelman lopussa: 24

Ylläolevan koodia koodia vastaa "Jos x on yhtä suuri kuin kymmenen, lisää siihen kaksi ja tulosta x. Lopuksi joka tapauksessa kerro x kahdella."

Pythonissa if-lauseen syntaksissa on sana if, sen jälkeen jokin ehto ja kaksoispiste. If-lauseen sisällä olevat komennot sisennetään neljällä välilyönnillä.

If-lausetta voi jatkaa elif- ja else-rakenteilla. Else ei ota mitään ehtoa, vaan sen jälkeen tuleva koodi suoritetaan, jos if:n jälkeistä ei suoriteta.

In [39]:
x = 10
if x > 10:
    print("x on suurempi kuin 10")
else:
    print("x on pienempi tai yhtä suuri kuin 10")
x on pienempi tai yhtä suuri kuin 10

If-else-rakenne on siis joko-tai-rakenne. Aina jompi kumpi suoritetaan.

Elif on lyhenne sanoista else if. Se toimii samalla if-else-rakenne, mutta sitä on helpompi ketjuttaa.

In [41]:
x = -1

if x > 10:
    print("x on suurempi kuin kymmenen")
else:
    if x < 0:
        print("x on negatiivinen")
x on negatiivinen

tarkoittaa samaa kuin

In [42]:
if x > 10:
    print("x on suurempi kuin kymmenen")
elif x < 0:
    print("x on negatiivinen")
x on negatiivinen

Esimerkki if-elif-else -ketjusta. Alla oleva ohjelma laskee pisteet-muuttujan arvosta yo-arvosanan.

In [43]:
pisteet = 80

if pisteet < 28:
    print("I")
elif pisteet < 40:
    print("A")
elif pisteet < 52:
    print("B")
elif pisteet < 64:
    print("C")
elif pisteet < 75:
    print("M")
elif pisteet < 90:
    print("E")
else:
    print("L")
E

Yhdessä if-rakenteessa on oltava yksi if, niin monta elif:iä kuin tarvitaan ja korkeintaan yksi else. Jos elseä käytetään, sen täytyy olla aina viimeisenä. Esimerkiksi seuraava ohjelma ei ole sallittu:

In [1]:
x = 0
if x == 0:
    print("x on 0")
else:
    print("x ei ole 0")
elif x < 0:
    print("x on negatiivinen")
  File "<ipython-input-1-8d99fa1200a8>", line 6
    elif x < 0:
       ^
SyntaxError: invalid syntax

Yllä olevan esimerkin oikea rakenne:

In [44]:
x = 1
if x == 0:
    print("x on 0")
elif x < 0:
    print("x on negatiivinen")
else:
    print("x ei ole 0")
x ei ole 0

Tee ohjelma, joka kysyy käyttäjältä luvun ja kertoo onko luku pariton vai parillinen.

In [45]:
# Kirjoita ohjelma tähän
luku = 5
# jaollisuus tutkitaan % operaattorilla. Se kertoo jakojäännöksen
if luku % 2 == 0:
    print("Luku on parillinen")
else:
    print("Luku on pariton")
Luku on pariton

Tehtävä 2.1

Toteuta lipunmyyntiohjelma, joka ottaa syötteenä iän ja tulostaa lipun hinnan. Hinnasto:

Ikä Hinta
Alle 7 0€
7-17 1.40€
18-69 2.80€
70 tai yli 1.40€
In [46]:
ikä = 18

if ikä < 7:
    print("Hinta on 0 euroa")
elif ikä < 18:
    print("Hinta on 1.40 euroa")
elif ikä < 70:
    print("Hinta on 2.80")
else:
    print("Hinta on 1.40€")
Hinta on 2.80

Silmukat

Silmukoilla voi toistaa komentoja. Pythonissa on kahdenlaisia silmukoita. For-silmukat ovat hyviä listan läpikäymiseen, mutta while-silmukat ovat usein parempia. Niitä käytetään, jos toistojen määrä ei ole tiedossa etukäteen.

Silmukoiden jälkeen ohjelman suoritus jatkuu normaalisti rivi riviltä.

In [47]:
# tuodaan math-kirjaston funktiot käyttöön
import math

summa = 0

for i in range(6):
    # sqrt on neliöjuuri
    print("Neliöjuuri luvusta", i, "on", math.sqrt(i))
Neliöjuuri luvusta 0 on 0.0
Neliöjuuri luvusta 1 on 1.0
Neliöjuuri luvusta 2 on 1.4142135623730951
Neliöjuuri luvusta 3 on 1.7320508075688772
Neliöjuuri luvusta 4 on 2.0
Neliöjuuri luvusta 5 on 2.23606797749979

Ylläolevassa esimerkissä print(i) ajettiin kymmenen kertaa.

While-silmukka toimii melkein kuin if. Esimerkki:

In [48]:
luku = 1

while luku < 100000:
    print(luku)
    luku = luku * 2
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536

While-silmukassa runkoa eli silmukan sisällä olevaa koodia ajetaan niin kauan kun ehto on tosi.

Tehtäviä:

Tehtävä 2.2

Aritmeettinen lukujono alkaa 5, 8, 11...

a) Luettele lukujonon 30 ensimmäistä jäsentä.

In [49]:
a = 5
# differenssi eli kahden jäsenen peräkkäisen ero
d = 3

for i in range(30):
    print(i + 1, ". on", a)
    a = a + d
1 . on 5
2 . on 8
3 . on 11
4 . on 14
5 . on 17
6 . on 20
7 . on 23
8 . on 26
9 . on 29
10 . on 32
11 . on 35
12 . on 38
13 . on 41
14 . on 44
15 . on 47
16 . on 50
17 . on 53
18 . on 56
19 . on 59
20 . on 62
21 . on 65
22 . on 68
23 . on 71
24 . on 74
25 . on 77
26 . on 80
27 . on 83
28 . on 86
29 . on 89
30 . on 92

b) Mikä on sadan ensimmäisen jäsenen summa?

In [50]:
a = 5
d = 3
summa = 0

for i in range(30):
    print(i + 1, ". on", a)
    # muuttujan summa arvoon lisätään luku a ja tallennetaan uusi arvo muuttujan summa arvoksi
    summa = summa + a
    # voit kirjoittaa yllä olevan rivin muodossa: summa += a
    a = a + d
print(summa)
1 . on 5
2 . on 8
3 . on 11
4 . on 14
5 . on 17
6 . on 20
7 . on 23
8 . on 26
9 . on 29
10 . on 32
11 . on 35
12 . on 38
13 . on 41
14 . on 44
15 . on 47
16 . on 50
17 . on 53
18 . on 56
19 . on 59
20 . on 62
21 . on 65
22 . on 68
23 . on 71
24 . on 74
25 . on 77
26 . on 80
27 . on 83
28 . on 86
29 . on 89
30 . on 92
1455

c) Kuinka moni jonon jäsenistä on pienempi kuin 500?

In [51]:
a = 5
d = 3

määrä = 0

while a < 500:
    print(a)
    a = a + d
    määrä = määrä + 1


print("Lukuja oli", määrä)
5
8
11
14
17
20
23
26
29
32
35
38
41
44
47
50
53
56
59
62
65
68
71
74
77
80
83
86
89
92
95
98
101
104
107
110
113
116
119
122
125
128
131
134
137
140
143
146
149
152
155
158
161
164
167
170
173
176
179
182
185
188
191
194
197
200
203
206
209
212
215
218
221
224
227
230
233
236
239
242
245
248
251
254
257
260
263
266
269
272
275
278
281
284
287
290
293
296
299
302
305
308
311
314
317
320
323
326
329
332
335
338
341
344
347
350
353
356
359
362
365
368
371
374
377
380
383
386
389
392
395
398
401
404
407
410
413
416
419
422
425
428
431
434
437
440
443
446
449
452
455
458
461
464
467
470
473
476
479
482
485
488
491
494
497
Lukuja oli 165

Tehtävä 2.3

Luettele kaikki luvut väliltä 1 - 50, mutta jos luku on jaollinen viidellä, tulosta luvun sijaan "foo". Jos luku on jaollinen seitsemällä, tulosta luvun sijaan "bar". Jos luku on jaollinen sekä viidellä että seitsemällä tulosta "foobar".

In [52]:
for luku in range(1, 50):
    if luku % 35 == 0:
        print("foobar")
    elif luku % 5 == 0:
        print("foo")
    elif luku % 7 == 0:
        print("bar")
    else:
        print(luku)
1
2
3
4
foo
6
bar
8
9
foo
11
12
13
bar
foo
16
17
18
19
foo
bar
22
23
24
foo
26
27
bar
29
foo
31
32
33
34
foobar
36
37
38
39
foo
41
bar
43
44
foo
46
47
48
bar

Tehtävä 2.4

Laske kaikkien nelinumeroisten seitsemällä jaollisten lukujen summa.

In [53]:
summa1 = 0
# ensimmäinen 7:lla jaollinen nelinumeroinen luku on 1001
# kaikki nelinumeroiset luvut ovat välillä 1000 - 9999
a = 1001
d = 7

while a < 10000:
    summa1 = summa1 + a
    a = a + d
print(summa1)
7071071

Tehtävän voi ratkaista myös seuraavasti

In [54]:
summa2 = 0
for i in range(1000, 9999 + 1):
    if i % 7 == 0:
        summa2 = summa2 + i
print(summa2)
7071071

Tehtävä 2.5

Tutki, kuinka monta geometrisen lukujonon 3, 9, 27, 81, ... jäsentä on laskettava yhteen, että summan arvo ylittää 9999?

In [55]:
a = 3
q = 3
summa = 0
määrä = 0

while summa < 9999:
    print("a", a, "summa", summa)
    summa = summa + a
    a = a * q
    määrä = määrä + 1

print("Summa on", summa)
print("Määrä on", määrä)
a 3 summa 0
a 9 summa 3
a 27 summa 12
a 81 summa 39
a 243 summa 120
a 729 summa 363
a 2187 summa 1092
a 6561 summa 3279
a 19683 summa 9840
Summa on 29523
Määrä on 9

Tehtävä 2.6

Ohjelma kysyy käyttäjältä suorakulmion leveyden ja korkeuden. Tämän jälkeen ohjelma kysyy haluatko laskea p=piirin vai a=pinta-alan ? Tämän jälkeen ohjelma tulostaa tiedon näytölle.

In [57]:
# Luetaan käyttäjän syöte komentoriviltä
h = float(input("Syötä h: "))
a = float(input("Syötä a: "))

operaatio = input("Lasketaanko piiri (p) vai pinta-ala (a)? ")

if operaatio == "p":
    print("Piiri on", 2 * h + 2 * a)
elif operaatio == "a":
    print("Pinta-ala on", h * a)
else:
    print("Virheellinen syöte")
Syötä h: 2.5
Syötä a: 4.5
Lasketaanko piiri (p) vai pinta-ala (a)? a
Pinta-ala on 11.25

Tehtävä 2.7

Kunnan väkiluku kasvoi 1.2%ia vuodessa. Vuonna 2015 kunnassa oli 24500 asukasta. Tutki minä vuonna kunnan asukasluku ylittää 30 000 asukkaan rajan.

In [77]:
a = 24500 # vuosi 2015
q = 1.012
vuosi = 2015

while a < 30000:
    print("Vuonna", vuosi, "kunnassa on", round(a), "asukasta")
    vuosi = vuosi + 1
    a = a * q
print(vuosi)
Vuonna 2015 kunnassa on 24500 asukasta
Vuonna 2016 kunnassa on 24794 asukasta
Vuonna 2017 kunnassa on 25092 asukasta
Vuonna 2018 kunnassa on 25393 asukasta
Vuonna 2019 kunnassa on 25697 asukasta
Vuonna 2020 kunnassa on 26006 asukasta
Vuonna 2021 kunnassa on 26318 asukasta
Vuonna 2022 kunnassa on 26634 asukasta
Vuonna 2023 kunnassa on 26953 asukasta
Vuonna 2024 kunnassa on 27277 asukasta
Vuonna 2025 kunnassa on 27604 asukasta
Vuonna 2026 kunnassa on 27935 asukasta
Vuonna 2027 kunnassa on 28270 asukasta
Vuonna 2028 kunnassa on 28610 asukasta
Vuonna 2029 kunnassa on 28953 asukasta
Vuonna 2030 kunnassa on 29300 asukasta
Vuonna 2031 kunnassa on 29652 asukasta
2032

Tehtävä 2.8

Kännykkäliittymän A kuukausimaksu on 4 euroa ja puhelumaksu on 0.09 euroa/min. Liittymässä B ei ole kuukausimaksua, mutta puhelumaksu on 0.12 euroa/min. Tee ohjelma, joka kysyy käyttäjältä kuukauden puheaikaa, ja ilmoittaa käyttäjälle kumpi liittymä A vai B kannattaa valita ja mitä kuukauden puhelut maksavat.

In [61]:
minuutit = float(input("Montako minuuttia puhut kuussa? "))

print(minuutit)

a_hinta = 4 + 0.09 * minuutit
b_hinta = 0.12 * minuutit

if a_hinta < b_hinta:
    print("kannattaa valita a")
    print("hinta on", a_hinta, "€")
elif b_hinta < a_hinta:
    print("kannattaa valita b")
    print("hinta olisi", b_hinta, "€")
else:
    print("ei ole väliä mitä valitsee")
    print("hinnat olisivat", a_hinta, "€ ja", b_hinta, "€")
Montako minuuttia puhut kuussa? 130
130.0
kannattaa valita b
hinta olisi 15.6 €

Tehtävä 2.9

Tarkastellaan lukujonoa $a_n =15n + 120, n=1, 2,3\dots$ Kirjoita ohjelma, joka vastaa seuraaviin kysymyksiin:

a) Ohjelma tulostaa jonon 10 ensimmäistä jäsentä.

In [29]:
a = 120 + 15
d = 15
for i in range(10):
    print(a)
    a = a + d
135
150
165
180
195
210
225
240
255
270

b) Onko luku 12 455 lukujonon jäsen?

In [30]:
a = 120 + 15
d = 15

# tulostetaan jäseniä lukujonosta luvusta 12015 alkaen
while a <= 12455:
    a = a + d
    if a > 12000:
        print(a)
# tutkitaan onko luku 12455 jonon jäsen      
if (12455 - 135) % 15 == 0:
    print("On lukujonon jäsen")
else:
    print("Ei ole lukujonon jäsen")
    
12015
12030
12045
12060
12075
12090
12105
12120
12135
12150
12165
12180
12195
12210
12225
12240
12255
12270
12285
12300
12315
12330
12345
12360
12375
12390
12405
12420
12435
12450
12465
Ei ole lukujonon jäsen

c) Mistä jäsenestä alkaen lukujonon jäsenet ovat suurempia kuin 1000?

In [18]:
a = 120 + 15
d = 15


laskuri = 1

while a <= 1000:
    print(a,laskuri)
    laskuri = laskuri + 1
    a = a + d
print(a, laskuri)
135 1
150 2
165 3
180 4
195 5
210 6
225 7
240 8
255 9
270 10
285 11
300 12
315 13
330 14
345 15
360 16
375 17
390 18
405 19
420 20
435 21
450 22
465 23
480 24
495 25
510 26
525 27
540 28
555 29
570 30
585 31
600 32
615 33
630 34
645 35
660 36
675 37
690 38
705 39
720 40
735 41
750 42
765 43
780 44
795 45
810 46
825 47
840 48
855 49
870 50
885 51
900 52
915 53
930 54
945 55
960 56
975 57
990 58
1005 59

Tehtäviä 2.10

Jaa luku 29282 alkutekijöihin

In [18]:
n = 29282
jakaja = 2

# Käydään läpi kaikki lukua n pienemmät luvut

while jakaja < n + 1:
    
    # Kokeillaan, jakaako jakaja luvun n
    
    if n % jakaja == 0:
        
        # Jos jakaja on alkutekijä, tulostetaan se ja aloitetaan läpikäynti alusta
        
        print(jakaja, "on alkutekijä")
        n = n // jakaja
        jakaja = 2
    else:
        
        # Jos jakaja ei ole alkutekijä, siirrytään seuraavaan lukuun
        
        jakaja = jakaja + 1
        
2 on alkutekijä
11 on alkutekijä
11 on alkutekijä
11 on alkutekijä
11 on alkutekijä
In [ ]: