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
© Copyright 2024