Ohjelmoinnin peruskurssi Y1
CSE-A1111
28.9.2016
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 1 / 29
Mahdollisuus antaa luentopalautetta
I Goblinissa vasemmassa reunassa olevassa valikossa on valinta”Luentopalaute”. Tata kautta on mahdollisuus antaa nimettomanapalautetta luennosta.
I Tata kautta voit myos antaa palautetta, jos jokin asiaopetusmonisteessa on jaanyt epaselvaksi.
I Jos jokin asia on jaanyt palautteen perusteella epaselvaksi, palataansiihen mahdollisuuksien mukaan seuraavalla luennolla.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 2 / 29
Oppimistavoitteet: taman luennon jalkeen
I Tiedat, miten ohjelma voidaan jakaa pienempiin osiin kayttamallafunktioita.
I Osaat maaritella funktion.
I Osaat kutsua funktiota eli kirjoittaa muualle ohjelmaan kaskyn, jokasaa aikaan funktion suorittamisen.
I Tiedat, miten funktiolle voi antaa lahtotietoja parametrien avulla.
I Tiedat, miten funktio voi valittaa muulle ohjelmalle tiedonlaskemistaan arvoista tms. paluuarvojen avulla.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 3 / 29
Funktiot
I Tahan asti esitetyt ohjelmat ovat oleet hyvin lyhyita. Todellisessaelamassa tarvitaan kuitenkin ohjelmia, jotka ovat tuhansien taikymmenien tuhansien rivien mittaisia.
I Jos koko ohjelma muodostuu tuolloin yhdesta paaohjelmasta, on senrakenteen ja toiminnan hahmottaminen vaikeaa.
I Lisaksi ohjelmissa tehdaan usein sama asia monta kertaa (mutta eiheti perakkain niin, etta voitaisiin kayttaa toistokaskya). On tyolastakirjoittaa sama koodi monta kertaa.
I Ratkaisu: kaytetaan funktioita.
I Funktio on ohjelmakoodin osa, jolle on annettu oma nimi.
I Funktion nimea kayttamalla voidaan kutsua funktiota eli pyytaafunktiota suoritettavaksi muualta ohjelmasta.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 4 / 29
Funktioiden kayton etuja
I Ohjelmakoodi selkiytyy.
I Saman asian tekeva koodi joudutaan kirjoittamaan vain kerran.
I Ohjelman yllapito helpottuu.
I Ohjelman testaus helpottuu.
I Ohjelman kirjoittaminen ryhmatyona helpottuu.
I Ohjelman osia on helpompi kayttaa uudelleen toisissa ohjelmissa.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 5 / 29
Esimerkki: kolmioiden tulostus
I Halutaan kirjoittaa ohjelma, joka tulostaa seuraavan kuvion.
*
***
*****
*
***
*****
*
***
*****
I Kuvio muodostuu kolmiosta, joka piirretaan 3 kertaa. Kirjoitetaanfunktio yhden kolmion tulostamiseen.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 6 / 29
Esimerkin koodi
def tulosta_kolmio():
print(" * ")
print(" *** ")
print("*****")
def main():
tulosta_kolmio()
tulosta_kolmio()
tulosta_kolmio()
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 7 / 29
Toinen versio: kutsut toistokaskyn sisalla
def tulosta_kolmio():
print(" * ")
print(" *** ")
print("*****")
def main():
KERRAT = 3
for i in range(KERRAT):
tulosta_kolmio()
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 8 / 29
Parametrit
I Halutaan kirjoittaa ohjelma, jolle annetaan kuljettu matka ja aika(minuutit ja sekunnit erikseen) ja joka tulostaa sitten nopeudenkilometria kohti.
I Kilometrinopeuden laskeminen sopii hyvin omaksi funktioksi.
I Tarvitaan kuitenkin jokin tapa kertoa funktiolle, mika on kuljettumatka ja aika.
I Tama tieto voidaan valittaa parametrien avulla.
I Parametri on funktion otsikossa sulkujen sisalla annettu nimi, jota voikayttaa funktion sisalla kuin mita tahansa muuttujaa.
I Kun funktiota kutsutaan, maarataan parametrille tuleva alkuarvo.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 9 / 29
Kilometrinopeus, koodi
def laske_kilometrinopeus(matka, minuutit, sekunnit):
aika_sekunteina = minuutit * 60 + sekunnit
sekunnit_per_km = int(aika_sekunteina / matka)
km_min = sekunnit_per_km // 60
km_sek = sekunnit_per_km % 60
print("Nopeus on {:d} min {:d} s/km.".format(
km_min, km_sek))
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 10 / 29
Kilometrinopeus, 1. versio paaohjelmasta
I Lahtotiedot (matka ja kaytetty aika) on kirjoitettu suoraanpaaohjelmaan.
def main():
print("Matka on 5.8 km ja aika 32:46")
laske_kilometrinopeus(5.8, 32, 46)
print("Matka on 11.5 km ja aika 69:14")
laske_kilometrinopeus(11.5, 69, 14)
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 11 / 29
Kilometrinopeus, parempi paaohjelma
def main():
rivi = input("Anna matka kilometreina.\n")
kilometrit = float(rivi)
rivi = input("Anna ajan minuutit.\n")
min = int(rivi)
rivi = input("Anna ajan sekunnit.\n")
sek = int(rivi)
laske_kilometrinopeus(kilometrit, min, sek)
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 12 / 29
Viela parametreista
I Parametrit saavat funktion kutsussa annetut alkuarvot samassajarjestyksessa kuin parametrit ovat funktion otsikossa.
I Funktion kutsussa parametrina arvo voidaan antaa mina tahansalausekkeena, jonka arvo voidaan laskea, esimerkiksi:
I suoraan lukuarvoI muuttujaI monimutkaisempi lauseke
I Esimerkkeja
laske_kilometrinopeus(12.0, 55, 15)
laske_kilometrinopeus(kilometrit, min, sek)
laske_kilometrinopeus(2 * kilometrit, min, sek - 15)
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 13 / 29
Valitehtava
I Kirjoita funktio muuta_kiloiksi, joka saa parametrina massanpaunoina (kokonaisluku) ja muuttaa sen kilogrammoiksi. Yksi paunaon noin 0,453 kg. Funktio tulostaa massan kilogrammoina.
I Kirjoita myos paaohjelma, joka pyytaa kayttajalta massan paunoina jakutsuu kirjoittamaasi funktiota.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 14 / 29
Arvon palauttavat funktiot
I Usein on tarve saada tieto funktion laskemasta arvosta muualleohjelmaan.
I Esimerkki: halutaan kirjoittaa ohjelma, joka sieventaa annetunmurtoluvun.
I Murtolukua sievennettaessa tarvitaan osoittajan ja nimittajan suurinyhteinen tekija, syt. Sen laskeminen sopii hyvin omaksi funktioksi.
I Jotta funktiossa laskettua syt:ia voitaisiin kayttaa sievennyksessa,pitaa se saada jotenkin tietoon funktion ulkopuolelle.
I Funktio voi valittaa tiedon laskemastaan arvosta palauttamalla tamanarvon.
I Arvon voi palauttaa return-kaskylla. Sen suoritus aina paattaafunktion suorituksen.
I Palautetun arvon voi ottaa talteen siella, missa funktiota kutsuttiin.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 15 / 29
Arvon palauttaminen
I Arvo palautetaan return-kaskylla:
return lauseke
lauseke voi olla vakioarvo, muuttujan nimi tai monimutkaisempilauseke.
I Palautettu arvo voidaan ottaa sijoituskaskylla talteen siella, missafunktiota kutsuttiin:
muuttuja = funktio(parametrit)
I Palautetun arvon voi myos tulostaa suoraan esimerkiksiprint-kaskyssa:
print("Tulos on", funktio(parametrit))
I Palautettua arvoa voi myos kayttaa hyvaksi suoraan toisen lausekkeenarvoa laskettaessa:
uusi_tulos = 2 * funktio(parametrit) - 5
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 16 / 29
Huomaa
I Arvon palauttaminen ja arvon tulostaminen ovat taysin eri asiat.
I Arvon tulostaminen tarkoittaa sita, etta ohjelma tulostaa arvonnakyviin esimerkiksi kuvaruudulle.
I Arvon palauttaminen ei viela tulosta arvoa minnekaan nakyviin. Sevain valittaa funktion laskeman arvon kaytettavaksi sinne, missafunktiota kutsuttiin.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 17 / 29
Murtoluvun sieventaminen, koodi
I Kaytetaan sytin laskemiseen Euclideen algoritmia (toimii positiivisilleluvuille):
I Jos luvut ovat yhtasuuret, syt on kumpi tahansa luvuista.I Muussa tapauksessa vahennetetaan aina suuremmasta luvusta
pienempi, kunnes luvut ovat yhtasuuret.
def laske_syt(kokonaisluku1, kokonaisluku2):
luku1 = abs(kokonaisluku1)
luku2 = abs(kokonaisluku2)
while (luku1 != luku2):
if luku1 > luku2:
luku1 = luku1 - luku2
else:
luku2 = luku2 - luku1
return luku1
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 18 / 29
Murtoluvun sieventaminen, koodi jatkuu
def main():
print("Ohjelma sieventaa antamasi murtoluvun.")
syote = input("Anna osoittaja.\n")
osoittaja = int(syote)
syote = input("Anna nimittaja.\n")
nimittaja = int(syote)
if osoittaja == 0 or nimittaja == 0:
print("Ohjelma ei pysty sieventamaan lukua.")
else:
syt = laske_syt(osoittaja, nimittaja)
osoittaja = osoittaja // syt
nimittaja = nimittaja // syt
print("Sievennettyna: {:d}/{:d}".format(
osoittaja, nimittaja))
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 19 / 29
Valitehtava 2
I Muuta kirjoittamaasi funktiota muuta_kiloiksi niin, etta se ei itsetulosta massaa kilogrammoina, vaan palauttaa lasketun massan.
I Lisaa paaohjelmaan funktion muuta_kiloiksi paluuarvon tulostus.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 20 / 29
Sisakkaiset funktiokutsut
I Funktion kutsussa funktiolle voi antaa parametrina toisen funktionkutsun.
I Talloin sisempi funktio suoritetaan ensin. Sisemman funktionpaluuarvoa kaytetaan ulomman funktion parametrin arvona.
I Esimerkki (int ja input ovat Pythonin valmiita funktioita):
osoittaja = int(input("Anna osoittaja.\n"))
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 21 / 29
Totuusarvon palauttavat funktiot
I Funktio voi myos palauttaa totuusarvon True tai False
I Seuraava esimerkkiohjelma laskee kayttajan ian tamansyntymavuoden perusteella.
I Ohjelmaan on lisatty funktio onko_kelvollinen, joka tutkii, onkosille parametrina annettu syntymavuosi hyvaksytylla valilla 1900–2016.
I Funkton palauttamaa arvoa voitaisiin kayttaa esimerkiksi if-kaskynehdossa seuraavasti:
if onko_kelvollinen(syntymavuosi) == True:
I Vertailu arvoon True on kuitenkin tarpeeton, koska funktio itsessaanpalauttaa arvon True tai False. Sen vuoksi ehto voidaan kirjoittaalyhyemmin:
if onko_kelvollinen(syntymavuosi):
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 22 / 29
Ian laskeminen, koodi
NYKYINEN_VUOSI = 2016
def onko_kelvollinen(vuosi):
ALARAJA = 1900
if vuosi < ALARAJA or vuosi > NYKYINEN_VUOSI:
return False
else:
return True
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 23 / 29
Ian laskeminen, koodi jatkuu
def main():
print("Ohjelma laskee ikasi.")
syntymavuosi = int(input("Anna syntymavuotesi.\n"))
if onko_kelvollinen(syntymavuosi):
ika = NYKYINEN_VUOSI - syntymavuosi
print("Ikasi on", ika, "vuotta.")
else:
print("Virhe syntymavuodessa.")
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 24 / 29
Moduuli math
I Pythonissa on valmiina suuri joukko funktioita erilaisten toimintojentekemiseen.
I Suurin osa naista funktioista on jaettu moduuleihin. Yksi moduulisisaltaa tyypillisesti samaan asiaan liittyvia funktioita ja mahdollisestimyos vakioita.
I Yksi tarkea moduuli on math, joka sisaltaa joukon matemaattisiafunktioita seka vakiot math.pi ja math.e.
I Jotta moduulin vakioita tai funktioita voisi kayttaa, onohjelmatiedoston alkuun kirjoitettava
import math
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 25 / 29
Tarkeita math-moduulin funktioita
ceil(x) pienin kokonaisluku, joka on ≥ x.floor(x) suurin kokonaisluku, joka on ≤ x.sqrt(x) neliojuuriexp(x) e potenssiin x.log(x) luonnollinen logaritmi.log10(x) 10-kantainen logaritmi.cos(x) kosini.sin(x) sini.tan(x) tangentti.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 26 / 29
Esimerkki: toisen asteen yhtalon ratkaisu
I Kirjoitetaan ohjelma, joka ratkaisee toisen asteen yhtalonax2 + bx + c = 0
I Kaytetaan ratkaisukaavaa
x1,2 =−b ±
√b2 − 4ac
2a
I Ohjelma tulostaa vain reaalijuuret.
I Ratkaisujen lukumaaraa tutkitaan neliojuuren alla olevandiskriminantin arvon perusteella.
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 27 / 29
Toisen asteen yhtalo, koodi
import math
def ratkaise_yhtalo(a, b, c):
diskrim = b * b - 4 * a * c
if diskrim < 0:
print("Ei reaalijuuria.")
elif diskrim == 0:
x = -1.0 * b / (2 * a)
print("Yhtalon ratkaisu on {:.2f}.".format(x))
else:
x1 = (-1.0 * b + math.sqrt(diskrim) ) / (2 * a)
x2 = (-1.0 * b - math.sqrt(diskrim) ) / (2 * a)
print("Ratkaisut ovat {:.2f} ja {:.2f}.".format(
x1, x2))
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 28 / 29
Toisen asteen yhtalo, koodi jatkuu
def main():
print("Anna 2. asteen yhtalon kertoimet a, b ja c.")
eka_kerroin = int(input())
toka_kerroin = int(input())
vakio = int(input())
if eka_kerroin == 0:
print("Yhtalo ei ole toista astetta.")
else:
ratkaise_yhtalo(eka_kerroin, toka_kerroin, vakio)
main()
CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 29 / 29