Valinta – perustehtävät
Tehtävä 1.
a) Kokeen läpipääsyraja on 50 pistettä. Oppilaan pistemäärä tallennetaan muuttujaan pisteet. Luo ohjelma, joka tarkistaa pisteet-muuttujan arvon ja tulostaa ”Päästiin läpi.”, kun se on suurempi tai yhtä suuri kuin läpipääsyraja. Muutoin ohjelma tulostaa ”Uusintaan meni.”



Koodi:
lpr = 50
pisteet = 50
if pisteet >= lpr:
print("Päästiin läpi!")
else:
print("Uusintaan meni.")
Tulosteet:
Päästiin läpi!
Uusintaan meni.
b) Koe arvioidaan nyt arvosanoilla A, B, C, D, E ja F, jossa F on hylätty. (Kyseessä lienee kaiketi ulkomaalainen koe.) Arvosanat annetaan lineaarisesti pisteiden mukaan. Jos oppilas saa 90–100 pistettä, hänelle annetaan arvosanaksi A. Jos 80–89, B. Jos 70–79, C. Jos 60–69, D. Jos 50–59, E. Jos alle 50, F ja koe hylätään. Kirjoita ohjelma, joka tulostaa oikean arvosanan pisteiden mukaan.

Tulosteet:
A
B
C
D
E
F
Koodi:
pisteet = 100
if pisteet >= 90:
print("A")
elif pisteet >= 80:
print("B")
elif pisteet >= 70:
print("C")
elif pisteet >= 60:
print("D")
elif pisteet >= 50:
print("E")
else:
print("F")
c) Ohjelma vaatii nyt syötteenä oppilaan nimen ja kokeesta saadun pistemäärän. Lisää ohjelmaan päivitys, jotta tuloste vastaa seuraavaa esimerkkitulostetta:
Pekka sai kokeesta 78 pistettä, joten arvosanaksi tuli C

Esimerkkituloste:



Koodi:
nimi = input("Syötä oppilaan nimi: ")
pisteet = int(input("Syötä oppilaan pisteet: "))
if pisteet >= 90:
print(nimi, "sai kokeesta", pisteet, "pistettä, joten arvosanaksi tuli A")
elif pisteet >= 80:
print(nimi, "sai kokeesta", pisteet, "pistettä, joten arvosanaksi tuli B")
elif pisteet >= 70:
print(nimi, "sai kokeesta", pisteet, "pistettä, joten arvosanaksi tuli C")
elif pisteet >= 60:
print(nimi, "sai kokeesta", pisteet, "pistettä, joten arvosanaksi tuli D")
elif pisteet >= 50:
print(nimi, "sai kokeesta", pisteet, "pistettä, joten arvosanaksi tuli E")
else:
print(nimi, "sai kokeesta", pisteet, "pistettä, joten arvosanaksi tuli F")
Esimerkkituloste:
Henkka sai kokeesta 65 pistettä, joten arvosanaksi tuli D
Tehtävä 2.
a) Kehonrakentajat rakastavat proteiinia. Se kuitenkin maksaa suhteellisen paljon. Tee ohjelma, joka kysyy syötteenä tuotteen hinnan ja proteiinin määrän grammoina. Jos hinta on kolme (3.0) tai vähemmän senttiä grammalta, voidaan todeta proteiinin hinnan olevan siedettävällä tasolla ja tulostaa ”Hyvän hintaista.” Muutoin tulostetaan ”Pakko maksaa.”





Koodi:
hinta = float(input("Syötä tuotteen hinta sentteinä: "))
proteiini = float(input("Syötä proteiinin määrä grammoina: "))
if hinta/proteiini <= 3.0:
print("Hyvän hintaista.")
else:
print("Pakko maksaa.")
Tulosteet:
Hyvän hintaista.
Pakko maksaa.
b) Aina ei päästä noinkaan alhaisiin lukemiin. Lisätään siis ehtoja hinnan tarkasteluun. Jos proteiinin hinnaksi saadaan alle neljä (4.0) senttiä grammaa kohden, voidaan tulostaa ”Vieläkin siedettävää.” Jos alle viisi (5.0) snt/g, tulostetaan ”Raha riittää vielä.” Jos alle kuusi (6.0) snt/g, tulostetaan ”Alkaa olla kallista.” Jos yli kuusi (6.0) snt/g, tulostetaan ”Tässähän köyhtyy.”








Koodi:
hinta = float(input("Syötä tuotteen hinta sentteinä: "))
proteiini = float(input("Syötä proteiinin määrä grammoina: "))
if hinta/proteiini <= 3.0:
print("Hyvän hintaista.")
elif hinta/proteiini < 4.0:
print("Vieläkin siedettävää.")
elif hinta/proteiini < 5.0:
print("Raha riittää vielä.")
elif hinta/proteiini < 6.0:
print("Alkaa olla kallista.")
else:
print("Tässähän köyhtyy.")
Tulosteet:
Hyvän hintaista.
Vieläkin siedettävää.
Raha riittää vielä.
Alkaa olla kallista.
Tässähän köyhtyy.
c) Inflaatio alkaa vaikuttaa myös proteiinin hintaan. Taloustieteilijät ovat todenneet, että alle viisi senttiä grammaa kohden on hyvä hinta proteiinille (mutta mitäpä he aiheesta tietäisivät…) Muuta ohjelmaa siten, että kaikkiin ”hintaluokkiin” lisätään 2 senttiä grammaa kohden. Lisää lisäksi tuloste ”Uskomaton diili!”, jos hinta jossain tuotteessa on alle neljä (4.0) snt/g.







Koodi:
hinta = float(input("Syötä tuotteen hinta sentteinä: "))
proteiini = float(input("Syötä proteiinin määrä grammoina: "))
if hinta/proteiini < 4.0:
print("Uskomaton diili!")
elif hinta/proteiini < 5.0:
print("Hyvän hintaista.")
elif hinta/proteiini < 6.0:
print("Vieläkin siedettävää.")
elif hinta/proteiini < 7.0:
print("Raha riittää vielä.")
elif hinta/proteiini < 8.0:
print("Alkaa olla kallista.")
else:
print("Tässähän köyhtyy.")
Tulosteet:
Uskomaton diili!
Hyvän hintaista.
Vieläkin siedettävää.
Raha riittää vielä.
Alkaa olla kallista.
Tässähän köyhtyy.
Tehtävä 3.
a) Keittokirjassa on ohje, johon tarvitaan yksi unssi (n. 28,3 g) kaakaojauhetta. Kirjoita ohjelma, joka ottaa syötteenä määrän teelusikallisia (n. 5 g) ja tulostaa ”Liian vähän.”, jos niiden yhteenlaskettu määrä ei ylitä yhtä unssia. Muussa tapauksessa tulostetaan ”Riittää jo!”




Koodi:
lusikat = int(input("Syötä teelusikallisten määrä: "))
if lusikat*5 < 28.3:
print("Liian vähän.")
else:
print("Riittää jo!")
Tulosteet:
Liian vähän.
Riittää jo!
b) Liikaa kaakaojauhetta ei toki ole koskaan hyvä. Jos lisätyn kaakaojauheen määrä ylittää yhden unssin enemmällä kuin 50 %:lla, lisää ohjelmaan tulosteena suhde, jolla muita aineksia pitäisi lisätä, jotta reseptiä ei muokata liikaa seuraavan esimerkkitulosteen mukaisesti:
Muita aineksia tulisi lisätä ainakin 59,0106007067 %.





Koodi:
lusikat = int(input("Syötä teelusikallisten määrä: "))
if lusikat*5 < 28.3:
print("Liian vähän.")
elif lusikat*5 > 28.3*1.5:
print("Muita aineksia tulisi lisätä ainakin", (lusikat*5/28.3)*100 - 100, "%")
else:
print("Riittää jo!")
Tulosteet:
Liian vähän.
Muita aineksia tulisi lisätä ainakin 59.010600706713774 %
Riittää jo!
Tehtävä 4.
a) Kirjoita ohjelma, joka kysyy salasanaa ja syötettäessä oikea salasana tulostaa ”Tervetuloa!” Jos syötetään väärä salasana, tulostetaan ”Pääsy evätty.”




Koodi:
s = input("Syötä salasana: ")
if s == "salasana":
print("Tervetuloa!")
else:
print("Pääsy evätty.")
Tulosteet:
Tervetuloa!
Pääsy evätty.
b) Lisää ohjelmaan toiminnallisuus myös käyttäjätunnuksen syöttämiseksi. Ohjelman tulee edelleen tarkistaa kirjautumistietojen oikeellisuus ja tulostaa ”Väärä käyttäjätunnus tai salasana!”, jos joko käyttäjätunnus tai salasana on virheellinen.





Koodi:
k = input("Syötä käyttäjätunnus: ")
s = input("Syötä salasana: ")
if k == "Käyttäjät" and s == "salasana":
print("Tervetuloa!")
else:
print("Väärä käyttäjätunnus tai salasana!")
Tulosteet:
Tervetuloa!
Väärä käyttäjätunnus tai salasana!
c) Kirjautumistiedoista ei juuri ole hyötyä, jos ei ole toiminnallisuutta, johon pääsyä yritetään rajoittaa. Lisää ohjelmalle toiminnallisuudeksi salaisen viestin tulostus. Jos syötetään oikeat kirjautumistiedot, kysy käyttäjältä salaista viestiä, jonka ohjelma lopuksi tulostaa.






Koodi:
k = input("Syötä käyttäjätunnus: ")
s = input("Syötä salasana: ")
if k == "Käyttäjät" and s == "salasana":
print("Tervetuloa!")
v = input("Syötä salainen viesti: ")
print(v)
else:
print("Väärä käyttäjätunnus tai salasana!")
Tulosteet:
Tervetuloa!
Salainen viesti
Väärä käyttäjätunnus tai salasana!
d) Lisää ohjelmaan toinen käyttäjä. Hänen käyttäjätunnuksensa on ”KoodiVilho” ja salasana ”TaikaHiiri123”. Lisää hänelle myös salaiseksi viestiksi ”Osaan koodata.”







Koodi:
k = input("Syötä käyttäjätunnus: ")
s = input("Syötä salasana: ")
if k == "Käyttäjät" and s == "salasana":
print("Tervetuloa!")
v = input("Syötä salainen viesti: ")
print(v)
elif k == "KoodiVilho" and s == "TaikaHiiri123":
print("Tervetuloa!")
print("Osaan koodata.")
else:
print("Väärä käyttäjätunnus tai salasana!")
Tulosteet:
Tervetuloa!
Salainen viesti
Osaan koodata.
Väärä käyttäjätunnus tai salasana!
e) Lisää ohjelmaan jokaiselle käyttäjätunnukselle oma tervetuloviesti seuraavan esimerkin mukaisesti:
Tervetuloa KoodiVilho!







Koodi:
k = input("Syötä käyttäjätunnus: ")
s = input("Syötä salasana: ")
if k == "Käyttäjät" and s == "salasana":
print("Tervetuloa", k+"!")
v = input("Syötä salainen viesti: ")
print(v)
elif k == "KoodiVilho" and s == "TaikaHiiri123":
print("Tervetuloa", k+"!")
print("Osaan koodata.")
else:
print("Väärä käyttäjätunnus tai salasana!")
Tulosteet:
Tervetuloa Käyttäjät!
Salainen viesti
Tervetuloa KoodiVilho!
Osaan koodata.
Väärä käyttäjätunnus tai salasana!
Tehtävä 5.
a) Suomi on kylmä maa ja täällä ulkolämpötila on usein nollan alapuolella. Kirjoita ohjelma, joka tulostaa ”Kylmä on.”, kun muuttujan lämpötila arvo on alle 0. Jos ollaan plussan puolella, tulostetaan ”Ihan hyvä keli.”



Koodi:
lämpötila = 3
if lämpötila < 0:
print("Kylmä on.")
else:
print("Ihan hyvä keli.")
Tulosteet:
Ihan hyvä keli.
Kylmä on.
b) Lämpötila vaihtelee vuodenaikojen mukaan melko paljon. Ero voi olla jopa 60 astetta tai enemmän! Lisää ohjelmaan tulosteeksi ”Kesäkelit!”, kun lämpötilan arvo on 15 tai enemmän, ”Aika laittaa villapaita.”, kun arvo on -10:n ja -20:n välillä ja ”Nyt on talvi!”, kun arvo on vähemmän kuin -20.






Koodi:
lämpötila = 3
if lämpötila >= 15:
print("Kesäkelit!")
elif lämpötila >= 0:
print("Ihan hyvä keli.")
elif lämpötila >= -10 and lämpötila < 0:
print("Kylmä on.")
elif lämpötila >= -20 and lämpötila < -10:
print("Aika laittaa villapaita.")
elif lämpötila < -20:
print("Nyt on talvi!")
Tulosteet:
Kesäkelit!
Ihan hyvä keli.
Kylmä on.
Aika laittaa villapaita.
Nyt on talvi!
c) Lisää mahdollisuus lämpötilan syöttämiseen. Tulostuksen tulee edelleen olla oikeellinen joka lämpötilan kohdalla.







Koodi:
lämpötila = int(input("Syötä lämpötila: "))
if lämpötila >= 15:
print("Kesäkelit!")
elif lämpötila >= 0:
print("Ihan hyvä keli.")
elif lämpötila >= -10 and lämpötila < 0:
print("Kylmä on.")
elif lämpötila >= -20 and lämpötila < -10:
print("Aika laittaa villapaita.")
elif lämpötila < -20:
print("Nyt on talvi!")
Tulosteet:
Kesäkelit!
Ihan hyvä keli.
Kylmä on.
Aika laittaa villapaita.
Nyt on talvi!
Tehtävä 6.
a) Kuten on aikaisemmin huomattu, valintalausekkeissa voi olla useampia ehtoja peräkkäin. Kun laitetaan ne saman ehtolausekkeen sisälle, vältytään useammilta ehtorakenteilta. Kirjoita ohjelma, joka ottaa syötteenä kokonaislukuarvon ja tee sille seuraavat toimenpiteet yhden ehtolauseen sisällä:
Varmista, että luku on suurempi kuin 15, mutta pienempi kuin 40.
Varmista lisäksi, että luku on parillinen.
Varmista, että luku ei ole tasan 20.
Tämän jälkeen tulosta luku.



Koodi:
luku = int(input("Syötä kokonaisluku: "))
if luku > 15 and luku < 40 and luku % 2 == 0 and luku != 20:
print(luku)
Tuloste:
Syötetty luku, jos sopii ehtoihin, esim. 30
b) Lisää ohjelmaan tulostus ”Luku ei ole kelvollinen.”, mikäli jokin ehdoista ei pidä paikkaansa.
Tässä todennäköisesti tarvitaan muitakin valintarakenteita.




Koodi:
luku = int(input("Syötä kokonaisluku: "))
if luku > 15 and luku < 40 and luku % 2 == 0 and luku != 20:
print(luku)
else:
print("Luku ei ole kelvollinen.")
Tuloste:
Jos on kelvollinen:
luku
Jos ei:
Luku ei ole kelvollinen.
c) Oikeellisen luvun määritelmää on nyt muutettu. Luvun tulee olla 15 ja 45 välillä, eikä se saa olla parillinen. Luvut 21, 23 ja 25 on kielletty.
Yritä saada mahdollisuuksien mukaan saada nämäkin yhden ehtolauseen sisälle.

Koodi:
luku = int(input("Syötä kokonaisluku: "))
if luku > 15 and luku < 45 and luku % 2 == 1 and luku != 21 and luku != 23 and luku != 25:
print(luku)
else:
print("Luku ei ole kelvollinen.")


Tuloste:
Jos on kelvollinen:
luku
Jos ei:
Luku ei ole kelvollinen.
Tehtävä 7.
a) Matematiikassa luvut voivat olla suljetuilla tai avoimilla väleillä. Kirjoita ohjelma, joka ottaa syötteenä liukuluvun ja tulostaa ”Välillä”, jos se on välillä [50:80[ ja ”Ulkona”, jos se on välin ulkopuolella.




Koodi:
luku = float(input("Syötä luku: "))
if luku >= 50 and luku < 80:
print("Välillä")
else:
print("Ulkona")
Tulosteet:
Välillä
Ulkona
b) Lisätään ohjelmaan tulostus ”Siellä päin”, jos luku on välillä [30:100]. Jos luku ei kuitenkaan ole tälläkään välillä, tulostetaan ”Aivan metikössä”.





Koodi:
luku = float(input("Syötä luku: "))
if luku >= 50 and luku < 80:
print("Välillä")
elif luku >= 30 and luku <= 100:
print("Siellä päin")
elif luku < 30 or luku > 100:
print("Aivan metikössä")
Tulosteet:
Välillä
Siellä päin
Aivan metikössä
c) Lisätään vielä tulostukseksi ”Ei sentään negatiivinen”, jos luku ei ole välin [0:100] ulkopuolella. Jos luku on tämän välin ulkopuolella, tulostetaan ”Ollaan hukassa”.






Koodi:
luku = float(input("Syötä luku: "))
if luku >= 50 and luku < 80:
print("Välillä")
elif luku >= 30 and luku <= 100:
print("Siellä päin")
elif luku < 30 or luku > 100:
if luku >= 0 and luku <= 100:
print("Ei sentään negatiivinen")
elif luku < 0 or luku > 100:
print("Ollaan hukassa")
Tulosteet:
Välillä
Siellä päin
Ei sentään negatiivinen
Ollaan hukassa.
Tehtävä 8. Tässä mennään kurssin aiheiden ulkopuolella pikkasen.
a) Aina ei ole viisasta laittaa kaikkia ehtoja saman valintalausekkeen sisälle, sillä niiden pituus voi monimutkaisissa ehdoissa karata käsistä. Kirjoita ohjelma, joka ottaa syötteenä kokonaisluvun, jolle tehdään seuraavat tarkistukset:
Luvun tulee olla väliltä [60:80].
Luvun tulee olla pariton.
Luku ei saa olla 61, 65, 71, 75 tai 79.
Jos ehdot pätevät, ohjelma tulostaa luvun.

Koodi:
luku = int(input("Syötä kokonaisluku: "))
if luku >= 60 and luku <= 80 and luku % 2 == 1 and luku != 61 and luku != 65 and luku != 71 and luku != 75 and luku != 79: print(luku)

Tulosteena kelvollinen luku.
b) Ehtolauseita voi jakaa pienempiin osiin tekemällä useampia ehtolauseita. Erottele yllä mainitut ehdot erillisiksi sisäkkäisiksi ehtolauseiksi.

Koodi:
luku = int(input("Syötä kokonaisluku: "))
if luku >= 60 and luku <= 80:
if luku % 2 == 1:
if luku != 61 and luku != 65 and luku != 71 and luku != 75 and luku != 79:
print(luku)

Tulosteena kelvollinen luku
c) Useimmiten b-kohdan kaltaiset sisäkkäiset ehtorakenteet eivät ole suositeltavia, sillä koodista tulee sotkuisen näköistä ja on vaikea pysyä kärryillä, missä koodilohkossa oikeasti ollaan, jos kyseessä on monimutkaisempi ehtorakenne. Pythonin syntaksissa sisennys on oleellinen osa, mikä toisaalta pakottaa pitämään koodin suhteellisen siistinä siinä suhteessa (useissa ohjelmointikielissä sisennykset eivät ole pakollisia). Kuitenkin sisennyskin voi tehdä koodista vaikeaselkoisempaa. Jos sisennyksiä on käytetty paljon, saattaa koodia ymmärtääkseen tarvita viivoitinta.
Näistä syistä sisennyksien (tai sisäkkäisten ehtorakenteiden) liiallinen käyttö ei ole suositeltavaa, vaan ongelmat voi ratkaista muulla tavoin. Joskus ohjelman suorituksen voi lopettaa esimerkiksi jo ensimmäisen tarkistuksen kohdalla.
Kirjoita ohjelma siten, että ehtolauseet eivät ole sisäkkäin. Voit lopettaa ohjelman kulun lisäämällä exit() ehtolauseen jälkeen. Tällainen rakenne myöskin nopeuttaa ohjelman suorittamista, sillä exit():in tai muun vastaavan lauseen jälkeisiä rivejä ei suoriteta.

Koodi:
luku = int(input("Syötä kokonaisluku: "))
if not luku >= 60 and luku <= 80:
exit()
if not luku % 2 == 1:
exit()
if luku != 61 and luku != 65 and luku != 71 and luku != 75 and luku != 79:
print(luku)

Tulosteena kelvollinen luku
d) Tässä vaiheessa emme kuitenkaan turvaudu exit():in kaltaisiin lauseisiin, sillä ne eivät sisälly oppimäärään. Vaihtoehtona ehtojen peräkkäin laittamiselle voimme kaunistaa koodia sulkeiden avulla. Vaikka Pythonissa sisennys ja rivitys kuuluu olennaisesti syntaksiin, voimme muun muassa sulkeiden avulla kiertää tämän ja rivittää sulkeiden sisällä olevan koodin siten kuin haluamme.
Muuta ehto alkuperäisen muotoiseksi sulkeiden sisään ja rivitä se vähintään kolmelle riville erotellen eri tarkistuksia.


Koodi:
luku = int(input("Syötä kokonaisluku: "))
if (luku >= 60 and luku <= 80
and luku % 2 == 1
and luku != 61 and luku != 65
and luku != 71 and luku != 75
and luku != 79):
print(luku)
Tulosteena kelvollinen luku
