Ohjelmoinnin peruskurssi Y1
CS-A1111
27.9.2017
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 1 / 30
Mahdollisuus antaa luentopalautetta
I Luennon aikana voit kirjoittaa kommentteja ja kysymyksia sivullepresemo.aalto.fi/opey1luento4
I Goblinissa vasemmassa reunassa olevassa valikossa on valinta”Luentopalaute”. Tata kautta on mahdollisuus antaa nimettomanapalautetta luennosta.
I Myos harjoitustehtavista voi antaa palautetta palautuksen yhteydessa,mutta tama palaute ei ole nimetonta.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 2 / 30
Oppimistavoitteet: taman luennon jalkeen
I Tiedat, miten voit muotoilla ohjelman tulostusta (esim. desimaalienmaaraa tulostettavassa luvussa).
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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 3 / 30
Tulostuksen muotoilu
I Tulostuksen muotoilun avulla voi esim.I maarata desimaaliluvuista tulostettavien desimaalien maaranI maarata, kuinka levea kentta tulostettavalle asialle varataanI paasta eroon ylimaaraisita valilyonneista tulostuksessa.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 4 / 30
Miten tulostusta muotoillaan?
I print-kaskyssa kirjoitetaan ensin lainausmerkkien sisalle tulostettavavakioteksti.
I Tekstin keskelle lisataan aaltosulut ja niiden sisaan muotoilumaaresellaiseen paikkaan, johin tulostuksessa halutaan tulevan jokumuotoiltava arvo, esimerkiksi muuttujan arvo.
I Lainausmerkin jalkeen tulostettavat arvot annetaan format-kaskylla.
I Esimerkki:
luku1 = 4.579875
tulo = luku1 * luku1
print("Luku on {:7.3f}".format(luku1))
print("{:5.2f} toiseen on {:6.2f}".format(luku1, tulo))
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 5 / 30
Muotoilumaare
I Muotoilukoodi alkaa kaksoispisteella.
I Kaksoispisteen jalkeen voidaan antaa kokonaislukuna tulostuksellevarattavan kentan leveys (voidaan myos jattaa pois).
I Taman jalkeen desimaaliluvuilla voidaan antaa piste ja sen jalkeenkaytettava tarkkuus (desimaalien maara) kokonaislukuna.
I Lopuksi tulee maarittelykirjain, joka kertoo, millaista arvoa ollaantulostamassa:d kokonaislukuf desimaaliluku ilman eksponenttiosaae desimaaliluku eksponenttiosan kanssaE desimaaliluku eksponenttiosan kanssag desimaalilukus merkkijono
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 6 / 30
Esimerkkeja
(Jotta esimerkit toimisivat, muuttujille pitaa ensin antaa sopivat arvot)
I Muuttujien arvot tulostetaan kahden desimaalin tarkkuudella:
print("{:.2f} toiseen on {:.2f}".format(luku1, tulo))
I Tulostettaville arvoille varataan vakiolevyiset kentat, desimaaliluvuttulostetaan kolmen desimaalin tarkkuudella:
print("{:3d} {:7.3f} {:9.3f}".format(vuosi, korko, arvo))
I Kaksoispiste tulee suoraan merkkijonon jalkeen ja piste suoraankokonaisluvun jalkeen ilman valilyonteja valissa:
print("Opiskelija {:s}: {:d}.".format(nimi, pisteet))
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 7 / 30
Funktiot
I Todellisessa elamassa tarvitaan 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.
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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 8 / 30
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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 9 / 30
Esimerkki: kolmioiden tulostus
I Halutaan kirjoittaa ohjelma, joka tulostaa seuraavan kuvion.
*
***
*****
*
***
*****
*
***
*****
I Kuvio muodostuu kolmiosta, joka piirretaan 3 kertaa. Kirjoitetaanfunktio yhden kolmion tulostamiseen.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 10 / 30
Esimerkin koodi
def tulosta_kolmio():
print(" * ")
print(" *** ")
print("*****")
def main():
tulosta_kolmio()
tulosta_kolmio()
tulosta_kolmio()
main()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 11 / 30
Toinen versio: kutsut toistokaskyn sisalla
def tulosta_kolmio():
print(" * ")
print(" *** ")
print("*****")
def main():
KERRAT = 3
for i in range(KERRAT):
tulosta_kolmio()
main()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 12 / 30
Parametrit
I Halutaan kirjoittaa ohjelma, jolle annetaan pituus jalkoina ja tuuminaja joka tulostaa saman pituuden sentteina.
I Muunnoksen laskeminen sopii hyvin omaksi funktioksi.
I Tarvitaan kuitenkin jokin tapa kertoa funktiolle lahtotietoina annetutjalat ja tuumat.
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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 13 / 30
Pituusmuunnos, koodi
def muunna_senteiksi(jalat, tuumat):
TUUMAKERROIN = 2.54
JALKAKERROIN = 12 * TUUMAKERROIN
pituus = JALKAKERROIN * jalat + TUUMAKERROIN * tuumat
print("Pituus on sentteina {:.1f} cm".format(pituus))
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 14 / 30
Pituusmuunnos, 1. versio paaohjelmasta
I Lahtotiedot (jalat ja tuumat) on kirjoitettu suoraan paaohjelmaan.
def main():
print("Paljonko on 5 jalkaa 10 tuumaa?")
muunna_senteiksi(5, 10)
print("Enta 5 jalkaa 2 tuumaa?")
muunna_senteiksi(5, 2)
main()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 15 / 30
Pituusmuunnos, parempi paaohjelma
def main():
print("Ohjelma muuntaa pituuksia senteiksi.")
rivi = input("Montako jalkaa?\n")
pituuden_jalat = int(rivi)
rivi = input("Montako tuumaa?\n")
pituuden_tuumat = int(rivi)
muunna_senteiksi(pituuden_jalat, pituuden_tuumat)
main()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 16 / 30
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
muunna_senteiksi(8, 2)
muunna_senteiksi(pituuden_jalat, pituuden_tuumat)
muunna_senteiksi(2 * pituuden_jalat, pituuden_tuumat - 5)
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 17 / 30
Valitehtava 1
Vastaa sivulla presemo.aalto.fi/opey1luento4
I Mita seuraava ohjelma tulostaa?
def tulosta_tuplana(luku):
tulos = 2 * luku
print(tulos)
def main():
numero = 3
luku = 5
tulosta_tuplana(numero)
main()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 18 / 30
Arvon palauttavat funktiot
I Halutaan tieto funktion laskemasta arvosta muualle ohjelmaan.
I Esimerkki: kierroksen 1 tehtavassa 3 piti laskea, millakilometrimaaralla sahkoauto tulee halvemmaksi kuin bensiiniauto.
I Pyydetty kilometrimaara voidaan laskea jakamalla autojen hintojenero niiden kilometrikayttokustannusten erolla.
I Kirjoitetaan funktio, joka laskee bensiiniauton kulutuksesta (l / 100km) sen polttoainekustannuksen kilometria kohti.
I Jotta funktiossa laskettua arvoa voidaan kayttaa muualla ohjelmassa,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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 19 / 30
Arvon palauttaminen
I Arvo palautetaan return-kaskylla:
return lauseke
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
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 20 / 30
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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 21 / 30
Autovertailu, koodi
def laske_bensakulut_km(kulutus_sadalla, litrahinta):
kilometrihinta = kulutus_sadalla / 100.0 * litrahinta
return kilometrihinta
def main():
rivi = input("Anna sahkoauton hinta (eur).\n")
sahkoauto = int(rivi)
rivi = input("Anna bensiiniauton hinta (eur).\n")
bensa_auto = int(rivi)
rivi = input("Anna bensiiniauton kulutus (l/100 km).\n")
kulutus = float(rivi)
# jatkuu seuraavalla kalvolla
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 22 / 30
Autovertailu, koodi jatkuu
hintaero = sahkoauto - bensa_auto
bensan_hinta = 1.35
sahkokustannus_km = 0.02
bensakustannus_km = laske_bensakulut_km(kulutus,
bensan_hinta)
ero_kilometrilla = bensakustannus_km - sahkokustannus_km
kilometrit = hintaero / ero_kilometrilla
print("Sahkoautolla pitaa ajaa yli {:.0f} km.".format(\
kilometrit))
main()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 23 / 30
Valitehtava 2
Vastaa sivulla presemo.aalto.fi/opey1luento4
I Mita seuraava ohjelma tulostaa?
def muuta_jotain(arvo):
luku = 10
tulos = 3 * arvo
return tulos
def main():
maara = 15
luku = muuta_jotain(maara)
print(luku)
main()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 24 / 30
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):
sahkoauto = int(input("Anna sahkoauton hinta (eur).\n"))
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 25 / 30
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
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 26 / 30
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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 27 / 30
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.
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 28 / 30
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))
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 29 / 30
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()
CS-A1111 Ohjelmoinnin peruskurssi Y1 27.9.2017 30 / 30