Luvun 2 tehtävissä tutkitaan toistoa laskemalla lukujonoihin liittyviä esimerkkejä. Ehtolauseita tutkitaan esimerkiksi tehtävässä 2.8, jossa sanallinen tehtävänanto.
Ohjelman täytyy joskus suorittaa komentoja vain, jos jokin ehto täyttyy. Silloin käytetään if-rakennetta.
# 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)
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.
x = 10
if x > 10:
print("x on suurempi kuin 10")
else:
print("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.
x = -1
if x > 10:
print("x on suurempi kuin kymmenen")
else:
if x < 0:
print("x on negatiivinen")
tarkoittaa samaa kuin
if x > 10:
print("x on suurempi kuin kymmenen")
elif x < 0:
print("x on negatiivinen")
Esimerkki if-elif-else -ketjusta. Alla oleva ohjelma laskee pisteet-muuttujan arvosta yo-arvosanan.
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")
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:
x = 0
if x == 0:
print("x on 0")
else:
print("x ei ole 0")
elif x < 0:
print("x on negatiivinen")
Yllä olevan esimerkin oikea rakenne:
x = 1
if x == 0:
print("x on 0")
elif x < 0:
print("x on negatiivinen")
else:
print("x ei ole 0")
Tee ohjelma, joka kysyy käyttäjältä luvun ja kertoo onko luku pariton vai parillinen.
# 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")
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€ |
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€")
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ä.
# 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))
Ylläolevassa esimerkissä print(i) ajettiin kymmenen kertaa.
While-silmukka toimii melkein kuin if. Esimerkki:
luku = 1
while luku < 100000:
print(luku)
luku = luku * 2
While-silmukassa runkoa eli silmukan sisällä olevaa koodia ajetaan niin kauan kun ehto on tosi.
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
b) Mikä on sadan ensimmäisen jäsenen summa?
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)
c) Kuinka moni jonon jäsenistä on pienempi kuin 500?
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ä)
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".
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)
Laske kaikkien nelinumeroisten seitsemällä jaollisten lukujen summa.
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)
Tehtävän voi ratkaista myös seuraavasti
summa2 = 0
for i in range(1000, 9999 + 1):
if i % 7 == 0:
summa2 = summa2 + i
print(summa2)
Tutki, kuinka monta geometrisen lukujonon 3, 9, 27, 81, ... jäsentä on laskettava yhteen, että summan arvo ylittää 9999?
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ä)
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.
# 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")
Kunnan väkiluku kasvoi 1.2%ia vuodessa. Vuonna 2015 kunnassa oli 24500 asukasta. Tutki minä vuonna kunnan asukasluku ylittää 30 000 asukkaan rajan.
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)
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.
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, "€")
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ä.
a = 120 + 15
d = 15
for i in range(10):
print(a)
a = a + d
b) Onko luku 12 455 lukujonon jäsen?
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")
c) Mistä jäsenestä alkaen lukujonon jäsenet ovat suurempia kuin 1000?
a = 120 + 15
d = 15
laskuri = 1
while a <= 1000:
print(a,laskuri)
laskuri = laskuri + 1
a = a + d
print(a, laskuri)
Jaa luku 29282 alkutekijöihin
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