Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1
CSE-A1111
23.9.2015
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
1 / 30
Mahdollisuus antaa luentopalautetta
I
Goblinissa vasemmassa reunassa olevassa valikossa on valinta
”Luentopalaute”. Tätä kautta on mahdollisuus antaa nimettömänä
palautetta luennosta.
I
Jos jokin asia on jäänyt palautteen perusteella epäselväksi, palataan
siihen mahdollisuuksien mukaan seuraavalla luennolla.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
2 / 30
Oppimistavoitteet: tämän luennon jälkeen
I
I
Tiedät, miten ohjelma voidaan jakaa pienempiin osiin käyttämällä
funktioita, miten funktiolle voi antaa lähtötietoja parametrien avulla
ja miten funktio voi välittää tiedon laskemistaan arvoista tms.
paluuarvojen avulla.
Edelliseen luentoon verrattuna olet nähnyt enemmän esimerkkejä
funktioiden käytöstä eri tilanteissa, esimerkiksi
I
I
I
I
Osaat käyttää totuusarvon palauttavia funktiota.
Tiedät, miten voi käyttää avuksi Pythonin valmiina olevia
math-moduulin funktioita matemaattisten funktioiden arvojen
laskemiseen.
Osaat kirjoittaa funktioita, jotka palauttavat useamman kuin yhden
arvon.
Tiedät, miten kirjoitetaan ohjelma, jossa on tekstivalikko, josta
käyttäjä voi valita suoritettavaksi haluamansa toimenpiteen.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
3 / 30
Kertausta: funktio, parametri ja paluuarvo
I
Funktio on ohjelmakoodin osa, jolle on annettu oma nimi.
I
Ohjelmassa voidaan kutsua funktiota. Tällöin Python-tulkki siirtyy
suorittamaan funktion koodia. Kun funktion suoritus loppuu, palataan
takaisin sinne, missä funktiota kutsuttiin.
I
Funktiolle voidaan välittää tietoa funktion ulkopuolelta parametrien
avulla. Kun funktiota kutsutaan, kerrotaan, mitkä arvot parametreille
annetaan tällä suorituskerralla.
I
Funktio voi välittää tietoa laskemistaan tms. arvoista paluuarvon
avulla. Huomaa, että arvon palauttaminen (return) on eri asia kuin
tulostaminen (tehdään yleensä print-käskyllä).
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
4 / 30
Kertausta: arvon palauttaminen
I
Arvo palautetaan return-käskyllä:
return lauseke
lauseke voi olla vakioarvo, muuttujan nimi tai monimutkaisempi
lauseke.
I
Palautettu arvo voidaan ottaa sijoituskäskyllä talteen siellä, missä
funktiota kutsuttiin:
muuttuja = funktio(parametrit)
I
Palautetun arvon voi myös tulostaa suoraan esimerkiksi
print-käskyssä:
print("Tulos on", funktio(parametrit))
I
Palautettua arvoa voi myös käyttää hyväksi suoraan toisen lausekkeen
arvoa laskettaessa:
uusi_tulos = 2 * funktio(parametrit) - 5
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
5 / 30
Murtoluvun sieventäminen, koodi
I
Käytetään sytin laskemiseen Euclideen algoritmia (toimii positiivisille
luvuille):
I
I
Jos luvut ovat yhtäsuuret, syt on kumpi tahansa luvuista.
Muussa tapauksessa vähennetetään aina suuremmasta luvusta
pienempi, kunnes luvut ovat yhtäsuuret.
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
23.9.2015
6 / 30
Murtoluvun sieventäminen, 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
23.9.2015
7 / 30
Välitehtävä 1
I
Mitä seuraava funktio tekee?
def mysteeri(parametri):
RAJA = 50.0
KERROIN = 1.24
if parametri >= RAJA:
parametri = KERROIN * parametri
return parametri
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
8 / 30
Funktiokutsu toisen funktion sisällä
I
Funktiota voi kutsua myös toisen funktion sisältä.
I
Muutetaan edellistä esimerkkiä niin, että myös sievennyksestä
tehdään oma funktio, jonka sisältä kutsutaan funktiota laske_syt
I
Pääohjelmassa kutsutaan sievennyksen tekevää funktiota. Ohjelmaa
on kuitenkin muutettu niin, että käyttäjä voi sieventää ohjelman
samalla suorituskerralla useita lukuja.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
9 / 30
Sieventäminen, koodi
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
23.9.2015
10 / 30
Sieventäminen, koodi jatkuu
def sievenna():
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))
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
11 / 30
Sieventäminen, koodi jatkuu
def main():
print("Ohjelma sieventaa antamasi murtoluvun.")
jatko = "K"
while jatko != "e" and jatko != "E":
sievenna()
jatko = input("Haluatko jatkaa (K/E)?\n")
main()
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
12 / 30
Sisäkkäiset funktiokutsut
I
Funktion kutsussa funktiolle voi antaa parametrina toisen funktion
kutsun.
I
Tällöin sisempi funktio suoritetaan ensin. Sisemmän funktion
paluuarvoa käytetään ulomman funktion parametrin arvona.
I
Esimerkki (int ja input ovat Pythonin valmiita funktioita):
osoittaja = int(input("Anna osoittaja.\n"))
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
13 / 30
Totuusarvon palauttavat funktiot
I
Funktio voi myös palauttaa totuusarvon True tai False
I
Seuraava esimerkkiohjelma laskee käyttäjän iän tämän
syntymävuoden perusteella.
I
Ohjelmaan on lisätty funktio onko_kelvollinen, joka tutkii, onko
sille parametrina annettu syntymävuosi hyväksytyllä välillä 1890–2015.
I
Funkton palauttamaa arvoa voitaisiin käyttää esimerkiksi if-käskyn
ehdossa seuraavasti:
if onko_kelvollinen(syntymavuosi) == True:
I
Vertailu arvoon True on kuitenkin tarpeeton, koska funktio itsessään
palauttaa arvon True tai False. Sen vuoksi ehto voidaan kirjoittaa
lyhyemmin:
if onko_kelvollinen(syntymavuosi):
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
14 / 30
Iän laskeminen, koodi
NYKYINEN_VUOSI = 2015
def onko_kelvollinen(vuosi):
ALARAJA = 1890
if vuosi < ALARAJA or vuosi > NYKYINEN_VUOSI:
return False
else:
return True
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
15 / 30
Iän 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
23.9.2015
16 / 30
Moduuli math
I
Pythonissa on valmiina suuri joukko funktioita erilaisten toimintojen
tekemiseen.
I
Suurin osa näistä funktioista on jaettu moduuleihin. Yksi moduuli
sisältää tyypillisesti samaan asiaan liittyviä funktioita ja mahdollisesti
myös vakioita.
I
Yksi tärkeä moduuli on math, joka sisältää joukon matemaattisia
funktioita sekä vakiot math.pi ja math.e.
I
Jotta moduulin vakioita tai funktioita voisi käyttää, on
ohjelmatiedoston alkuun kirjoitettava
import math
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
17 / 30
Tärkeitä math-moduulin funktioita
ceil(x)
floor(x)
sqrt(x)
exp(x)
log(x)
log10(x)
cos(x)
sin(x)
tan(x)
pienin kokonaisluku, joka on ≥ x.
suurin kokonaisluku, joka on ≤ x.
neliöjuuri
e potenssiin x.
luonnollinen logaritmi.
10-kantainen logaritmi.
kosini.
sini.
tangentti.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
18 / 30
Esimerkki: toisen asteen yhtälön ratkaisu
I
Kirjoitetaan ohjelma, joka ratkaisee toisen asteen yhtälön
ax 2 + bx + c = 0
I
Käytetään ratkaisukaavaa
x1,2 =
−b ±
√
b 2 − 4ac
2a
I
Ohjelma tulostaa vain reaalijuuret.
I
Ratkaisujen lukumäärää tutkitaan neliöjuuren alla olevan
diskriminantin arvon perusteella.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
19 / 30
Toisen asteen yhtälö, 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
23.9.2015
20 / 30
Toisen asteen yhtälö, 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
23.9.2015
21 / 30
Välitehtävä 2
I
Kirjoita funktio, joka laskee ja palauttaa suorakulmaisen kolmion
hypotenuusan pituuden, kun kateettien pituudet annetaan
parametreina. Käytä Pythagoraan lausetta.
I
Kirjoita tämän jälkeen pääohjelma, joka pyytää käyttäjältä kateettien
pituudet, kutsuu kirjoitettua funktiota ja lopuksi tulostaa
hypotenuusan pituuden.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
22 / 30
Useampi paluuarvo
I
Funktio voi palauttaa samanaikaisesti myös useamman kuin yhden
arvon.
I
Palautettavat arvot erotetaan toisistaan return-käskyssä pilkulla:
return arvo1, arvo2, arvo3
I
Arvot voidaan ottaa samanaikaisella sijoituksella talteen siellä, missä
funktiota kutsutaan:
muuttuja1, muuttuja2, muuttuja3 = funktio(parametrit)
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
23 / 30
Esimerkki: paivamaara
I
Kirjoitetaan funktio, joka pyytää käyttäjältä nykyisen päivän ja
kuukauden ja palauttaa ne molemmat.
I
Pääohjelma tulostaa päivämäärän kahdella eri tavalla.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
24 / 30
Paivamaara, koodi
def pyyda_paivays():
monesko = int(input("Mika paiva tanaan on?\n"))
kuu = input("Mika kuukausi on nyt?\n")
return monesko, kuu
def main():
paiva, kuukausi = pyyda_paivays()
print("Tanaan on {:s}n {:d}. paiva.".format(
kuukausi, paiva))
print("Tanaan on {:d}. {:s}ta.".format(
paiva, kuukausi))
main()
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
25 / 30
Valikkopohjaisen ohjelman kirjoittaminen
I
I
I
I
I
I
I
I
Hyvin yleinen tehtävä on kirjoittaa ohjelma, jossa käyttäjä voi valita
valikosta haluamansa toiminnon useasta vaihtoehdosta.
Käyttäjä voi valita aina uuden toiminnon niin kauan, kunnes hän
haluaa lopettaa.
Seuraava esimerkki näyttää, miten tällainen ohjelma kannattaa
kirjoittaa.
Valikon tulostamista ja käyttäjän valinnan pyytämistä varten
kirjoitetaan oma funktio.
Myös jokaista toimintoa varten kirjoitetaan oma funktio (nämä
funktiot voivat mahdollisesti vielä kutsua muita funktioita).
Pääohjelmaan kirjoitetaan toistokäsky, joka kutsuu käyttäjän valintaa
pyytävää funktiota ja valinnan mukaan aina jonkun toiminnon
toteuttavaa funktiota.
Toistokäsky loppuu, kun käyttäjä valitsee ohjelman lopettamisen.
Seuraavassa esimerkissä käyttäjä voi laskea erilaisten kuvioiden
pinta-aloja.
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
26 / 30
Valikko-ohjelma, koodi
import math
def valitse_toiminto():
print()
print("Valitse toiminto:")
print("1. laske ympyran pinta-ala")
print("2. laske suorakulmion pinta-ala")
print("3. laske kolmion pinta-ala")
print("4. lopeta")
vastaus = int(input())
return vastaus
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
27 / 30
Valikko-ohjelma, koodi
def ympyran_ala():
sade = float(input("Ympyran sade.\n"))
ala = math.pi * sade * sade
print("Pinta-ala on {:.4f}.".format(ala))
def suorakulmion_ala():
leveys = float(input("Suorakulmion leveys.\n"))
korkeus = float(input("Suorakulmion korkeus.\n"))
ala = leveys * korkeus
print("Pinta-ala on {:.4f}.".format(ala))
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
28 / 30
Valikko-ohjelma, koodi
def kolmion_ala():
kanta = float(input("Kolmion kannan pituus.\n"))
korkeus = float(input("Kolmion korkeus.\n"))
ala = 0.5 * kanta * korkeus
print("Pinta-ala on {:.4f}.".format(ala))
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
29 / 30
Valikko-ohjelma, koodi
def main():
valinta = valitse_toiminto()
while valinta != 4:
if valinta == 1:
ympyran_ala()
elif valinta == 2:
suorakulmion_ala()
elif valinta == 3:
kolmion_ala()
valinta = valitse_toiminto()
print("Ohjelman suoritus paattyy")
main()
CSE-A1111
Ohjelmoinnin peruskurssi Y1
23.9.2015
30 / 30