Ohjelmoinnin peruskurssi Y1

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Tutoriaaliläsnäoloista

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Algebra. 1. Ovatko alla olevat väittämät tosia? Perustele tai anna vastaesimerkki. 2. Laske. a) Luku 2 on luonnollinen luku.

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

Ohjelmoinnin perusteet Y Python

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Demot Timo Männikkö

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Kokonaisluvut. eivät ole kokonaislukuja!

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Talousmatematiikan perusteet, L3 Prosentti, yhtälöt Aiheet

1. Omat operaatiot 1.1

Ohjelmoinnin peruskurssien laaja oppimäärä

13. Loogiset operaatiot 13.1

Muistutus aikatauluista

Algoritmit 1. Demot Timo Männikkö

niin järjestys on tämä: ensin kerto- ja jakolaskut vasemmalta oikealle, sen jälkeen plus- ja miinuslaskut vasemmalta oikealle.

Luento 5. Timo Savola. 28. huhtikuuta 2006

TIE Johdatus ohjelmointiin

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

13. Loogiset operaatiot 13.1

T Ohjelmoinnin perusteet Y (Python) Opetusmoniste kevät 2010

Harjoitus 3 -- Ratkaisut

Python-ohjelmointi Harjoitus 2

Transkriptio:

Ohjelmoinnin peruskurssi Y1 CSE-A1111 28.9.2016 CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 1 / 29

Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute. Tätä kautta on mahdollisuus antaa nimettömänä palautetta luennosta. Tätä kautta voit myös antaa palautetta, jos jokin asia opetusmonisteessa on jäänyt epäselväksi. Jos jokin asia on jäänyt palautteen perusteella epäselväksi, palataan siihen mahdollisuuksien mukaan seuraavalla luennolla. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 2 / 29

Oppimistavoitteet: tämän luennon jälkeen Tiedät, miten ohjelma voidaan jakaa pienempiin osiin käyttämällä funktioita. Osaat määritellä funktion. Osaat kutsua funktiota eli kirjoittaa muualle ohjelmaan käskyn, joka saa aikaan funktion suorittamisen. Tiedät, miten funktiolle voi antaa lähtötietoja parametrien avulla. Tiedät, miten funktio voi välittää muulle ohjelmalle tiedon laskemistaan arvoista tms. paluuarvojen avulla. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 3 / 29

Funktiot Tähän asti esitetyt ohjelmat ovat oleet hyvin lyhyitä. Todellisessa elämässä tarvitaan kuitenkin ohjelmia, jotka ovat tuhansien tai kymmenien tuhansien rivien mittaisia. Jos koko ohjelma muodostuu tuolloin yhdestä pääohjelmasta, on sen rakenteen ja toiminnan hahmottaminen vaikeaa. Lisäksi ohjelmissa tehdään usein sama asia monta kertaa (mutta ei heti peräkkäin niin, että voitaisiin käyttää toistokäskyä). On työlästä kirjoittaa sama koodi monta kertaa. Ratkaisu: käytetään funktioita. Funktio on ohjelmakoodin osa, jolle on annettu oma nimi. Funktion nimeä käyttämällä voidaan kutsua funktiota eli pyytää funktiota suoritettavaksi muualta ohjelmasta. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 4 / 29

Funktioiden käytön etuja Ohjelmakoodi selkiytyy. Saman asian tekevä koodi joudutaan kirjoittamaan vain kerran. Ohjelman ylläpito helpottuu. Ohjelman testaus helpottuu. Ohjelman kirjoittaminen ryhmätyönä helpottuu. Ohjelman osia on helpompi käyttää uudelleen toisissa ohjelmissa. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 5 / 29

Esimerkki: kolmioiden tulostus Halutaan kirjoittaa ohjelma, joka tulostaa seuraavan kuvion. * *** ***** * *** ***** * *** ***** Kuvio muodostuu kolmiosta, joka piirretään 3 kertaa. Kirjoitetaan funktio 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 toistokäskyn sisällä 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 Halutaan kirjoittaa ohjelma, jolle annetaan kuljettu matka ja aika (minuutit ja sekunnit erikseen) ja joka tulostaa sitten nopeuden kilometriä kohti. Kilometrinopeuden laskeminen sopii hyvin omaksi funktioksi. Tarvitaan kuitenkin jokin tapa kertoa funktiolle, mikä on kuljettu matka ja aika. Tämä tieto voidaan välittää parametrien avulla. Parametri on funktion otsikossa sulkujen sisällä annettu nimi, jota voi käyttää funktion sisällä kuin mitä tahansa muuttujaa. Kun funktiota kutsutaan, määrätään 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 pääohjelmasta Lähtötiedot (matka ja käytetty aika) on kirjoitettu suoraan pääohjelmaan. 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 pääohjelma 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

Vielä parametreista Parametrit saavat funktion kutsussa annetut alkuarvot samassa järjestyksessä kuin parametrit ovat funktion otsikossa. Funktion kutsussa parametrina arvo voidaan antaa minä tahansa lausekkeena, jonka arvo voidaan laskea, esimerkiksi: suoraan lukuarvo muuttuja monimutkaisempi lauseke Esimerkkejä 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

Välitehtävä Kirjoita funktio muuta_kiloiksi, joka saa parametrina massan paunoina (kokonaisluku) ja muuttaa sen kilogrammoiksi. Yksi pauna on noin 0,453 kg. Funktio tulostaa massan kilogrammoina. Kirjoita myös pääohjelma, joka pyytää käyttäjältä massan paunoina ja kutsuu kirjoittamaasi funktiota. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 14 / 29

Arvon palauttavat funktiot Usein on tarve saada tieto funktion laskemasta arvosta muualle ohjelmaan. Esimerkki: halutaan kirjoittaa ohjelma, joka sieventää annetun murtoluvun. Murtolukua sievennettäessä tarvitaan osoittajan ja nimittäjän suurin yhteinen tekijä, syt. Sen laskeminen sopii hyvin omaksi funktioksi. Jotta funktiossa laskettua syt:iä voitaisiin käyttää sievennyksessä, pitää se saada jotenkin tietoon funktion ulkopuolelle. Funktio voi välittää tiedon laskemastaan arvosta palauttamalla tämän arvon. Arvon voi palauttaa return-käskyllä. Sen suoritus aina päättää funktion suorituksen. Palautetun arvon voi ottaa talteen siellä, missä funktiota kutsuttiin. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 15 / 29

Arvon palauttaminen Arvo palautetaan return-käskyllä: return lauseke lauseke voi olla vakioarvo, muuttujan nimi tai monimutkaisempi lauseke. Palautettu arvo voidaan ottaa sijoituskäskyllä talteen siellä, missä funktiota kutsuttiin: muuttuja = funktio(parametrit) Palautetun arvon voi myös tulostaa suoraan esimerkiksi print-käskyssä: print("tulos on", funktio(parametrit)) 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 28.9.2016 16 / 29

Huomaa Arvon palauttaminen ja arvon tulostaminen ovat täysin eri asiat. Arvon tulostaminen tarkoittaa sitä, että ohjelma tulostaa arvon näkyviin esimerkiksi kuvaruudulle. Arvon palauttaminen ei vielä tulosta arvoa minnekään näkyviin. Se vain välittää funktion laskeman arvon käytettäväksi sinne, missä funktiota kutsuttiin. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 17 / 29

Murtoluvun sieventäminen, koodi Käytetään sytin laskemiseen Euclideen algoritmia (toimii positiivisille luvuille): 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 28.9.2016 18 / 29

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 28.9.2016 19 / 29

Välitehtävä 2 Muuta kirjoittamaasi funktiota muuta_kiloiksi niin, että se ei itse tulosta massaa kilogrammoina, vaan palauttaa lasketun massan. Lisää pääohjelmaan funktion muuta_kiloiksi paluuarvon tulostus. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 20 / 29

Sisäkkäiset funktiokutsut Funktion kutsussa funktiolle voi antaa parametrina toisen funktion kutsun. Tällöin sisempi funktio suoritetaan ensin. Sisemmän funktion paluuarvoa käytetään ulomman funktion parametrin arvona. 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 Funktio voi myös palauttaa totuusarvon True tai False Seuraava esimerkkiohjelma laskee käyttäjän iän tämän syntymävuoden perusteella. Ohjelmaan on lisätty funktio onko_kelvollinen, joka tutkii, onko sille parametrina annettu syntymävuosi hyväksytyllä välillä 1900 2016. Funkton palauttamaa arvoa voitaisiin käyttää esimerkiksi if-käskyn ehdossa seuraavasti: if onko_kelvollinen(syntymavuosi) == True: 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 28.9.2016 22 / 29

Iän 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

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 28.9.2016 24 / 29

Moduuli math Pythonissa on valmiina suuri joukko funktioita erilaisten toimintojen tekemiseen. Suurin osa näistä funktioista on jaettu moduuleihin. Yksi moduuli sisältää tyypillisesti samaan asiaan liittyviä funktioita ja mahdollisesti myös vakioita. Yksi tärkeä moduuli on math, joka sisältää joukon matemaattisia funktioita sekä vakiot math.pi ja math.e. Jotta moduulin vakioita tai funktioita voisi käyttää, on ohjelmatiedoston alkuun kirjoitettava import math CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 25 / 29

Tärkeitä math-moduulin funktioita ceil(x) pienin kokonaisluku, joka on x. floor(x) suurin kokonaisluku, joka on x. sqrt(x) neliöjuuri exp(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 yhtälön ratkaisu Kirjoitetaan ohjelma, joka ratkaisee toisen asteen yhtälön ax 2 + bx + c = 0 Käytetään ratkaisukaavaa Ohjelma tulostaa vain reaalijuuret. x 1,2 = b ± b 2 4ac 2a Ratkaisujen lukumäärää tutkitaan neliöjuuren alla olevan diskriminantin arvon perusteella. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.9.2016 27 / 29

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 28.9.2016 28 / 29

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 28.9.2016 29 / 29