Ohjelmoinnin peruskurssi Y1

Samankaltaiset tiedostot
Ohjelmoinnin perusteet Y Python

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 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 perusteet Y Python

Ohjelmoinnin peruskurssi Y1

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 perusteet Y Python

Ohjelmoinnin peruskurssi Y1

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 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 perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

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 perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Algoritmit 2. Demot Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Java-kielen perusteet

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Pythonilla. Teemu Sirkiä, 2015

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Olio-ohjelmointi Javalla

Ohjelmoinnin perusteet Y Python

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Luokan sisällä on lista

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

17. Javan omat luokat 17.1

Ohjelmoinnin perusteet Y Python

17. Javan omat luokat 17.1

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Ohjelmoinnin perusteet Y Python

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

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

Metodien tekeminen Javalla

1. Omat operaatiot 1.1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Merkkijonon tutkiminen matches-metodilla

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Ohjelmoinnin perusteet Y Python

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmoinnin peruskurssi Y1

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Ohjelmoinnin perusteet, kurssikoe

Ohjelmoinnin peruskurssi Y1

Transkriptio:

Ohjelmoinnin peruskurssi Y1 CSE-A1111 28.10.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 1 / 25

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

Oppimistavoitteet: tämän luennon jälkeen Osaat kirjoittaa ohjelmia, jotka käsittelevät järkevästi useammasta arvosta muodostuvia kokonaisuuksia (esim. opiskelija) olioiden avulla. Osaat kirjoittaa pääohjelman, joka luo olioita käyttäjän antamien tietojen perusteella ja kutsuu olioille niiden luokan metodeita. Osaat määritellä metodeita, joiden parametrit (muutkin kuin self) ovat olioita. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 3 / 25

Olioista (kertausta) Olioiden avulla voidaan kuvata useammasta arvosta koostuvaa kokonaisuutta yhtenä oliona. Olioilla on kenttiä. Kenttien avulla kuvataan olion ominaisuuksia ja niiden arvoja. Oliolle mahdolliset toimenpiteet määritellään metodien avulla. Luokassa määritellään, millaisia luokan oliot ovat ja mitä operaatoita olioille voidaan tehdä. Operaatiot määritellään metodien avulla. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 4 / 25

Luokka ja metodit (kertausta) Metodi init määrittelee, mitä tapahtuu, kun luodaan uusi luokan olio. Kun metodi on määritelty, uusia olioita voidaan luoda (yleensä luokan ulkopuolella) luokan nimen avulla: kurssilainen1 = Opiskelija("Matti Virta", "11223U") Luokkaan määritellään muita metodeita esim. kenttien arvojen selvittämiseen ja muuttamiseen sekä muihin tarvittaviin operaatioihin. Esimerkiksi metodia muuta_tenttiarvosana voidaan kutsua kurssilainen1.muuta_tenttiarvosana(4) CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 5 / 25

Toinen esimerkki: luokka Vesisailio Määritellään luokka vesisäiliön kuvaamiseen. Säiliöön voi lisätä vettä ja sieltä voi poistaa vettä. Säiliöllä on kuitenkin koko, eikä säiliöön voi lisätä vettä enempää kuin siihen mahtuu. Säiliöstä ei voi myöskään ottaa vettä enempää kuin siellä on. Vettä lisäävät ja sitä poistavat metodit palauttavat lisätyn tai poistetun veden määrän. Lähes samanlaista rakennetta voi käyttää esimerkiksi erilaisissa varastosovelluksissa. Yhden tuotteen varastotilannetta kuvataan Vesisailio-luokkaa muistuttavalla luokalla. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 6 / 25

Luokka Vesisailio, koodi class Vesisailio: def init (self, annettu_koko): if annettu_koko >= 0.0: self. koko = annettu_koko else: self. koko = 0.0 self. maara = 0.0 Vesisailio koko =... maara =... def kerro_koko(self): return self. koko def kerro_maara(self): return self. maara CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 7 / 25

Luokka Vesisailio, koodi jatkuu def lisaa(self, paljonko): if paljonko > 0.0: mahtuu = self. koko - self. maara if paljonko <= mahtuu: self. maara += paljonko return paljonko else: self. maara = self. koko return mahtuu else: return 0.0 CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 8 / 25

Luokka Vesisailio, koodi jatkuu def poista(self, paljonko): if paljonko > 0.0: if paljonko > self. maara: poistetaan = self. maara self. maara = 0.0 return poistetaan else: self. maara -= paljonko return paljonko else: return 0.0 def str (self): mjono = "Sailio: vetta " + str(self. maara) + \ " / " + str(self. koko) + " l" return mjono CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 9 / 25

Välitehtävä 1 Mitä seuraava ohjelma tekee ja tulostaa? import vesisailio def main(): pikkusailio = vesisailio.vesisailio(20.0) print(pikkusailio) pikkusailio.lisaa(15.0) print(pikkusailio) pikkusailio.lisaa(8.0) print(pikkusailio) pikkusailio.poista(14.0) print(pikkusailio) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 10 / 25

Vesisailio-olioita käsittelevä pääohjelma Seuraavilla kalvoilla on esimerkkiohjelma, joka luo kaksi Vesisailio-oliota sekä lisää ja poistaa niistä vettä. Ohjelma tulostaa lisätyt ja poistetut määrät sekä säiliöiden tilan ohjelman lopussa. Desimaalilukujen lukemista varten on kirjoitettu oma apuohjelma, joka myös käsittelee virheelliset syötteet. Esimerkissä pääohjelma on kirjoitettu eri moduuliin kuin itse luokka. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 11 / 25

Vesisailio-olioita käyttävä pääohjelma, koodi import vesisailio def lue_desimaaliluku(): luku_onnistui = False while not luku_onnistui: try: luku = float(input()) luku_onnistui = True except ValueError: print("virheellinen desimaaliluku!") print("anna uusi!") return luku CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 12 / 25

Vesisailio-olioita käyttävä pääohjelma, koodi jatkuu def main(): print("anna ensimmaisen sailion koko.") koko1 = lue_desimaaliluku() sailio1 = vesisailio.vesisailio(koko1) print("anna toisen sailion koko.") koko2 = lue_desimaaliluku() sailio2 = vesisailio.vesisailio(koko2) print("lisataan vetta 1. sailioon.") print("anna lisattava maara.") lisays = lue_desimaaliluku() lisattiin = sailio1.lisaa(lisays) print("sailioon lisattiin {:.2f} l.".format(lisattiin)) CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 13 / 25

Vesisailio-olioita käyttävä pääohjelma, koodi jatkuu print("lisataan vetta 2. sailioon.") print("anna lisattava maara.") lisays = lue_desimaaliluku() lisattiin = sailio2.lisaa(lisays) print("sailioon lisattiin {:.2f} l.".format(lisattiin)) print("poistetaan vetta 1. sailiosta.") print("anna poistettava maara.") poisto = lue_desimaaliluku() poistettiin = sailio1.poista(poisto) print("sailiosta poistettiin {:.2f} l.".format(\ poistettiin)) CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 14 / 25

Vesisailio-olioita käyttävä pääohjelma, koodi jatkuu print("poistetaan vetta 2. sailiosta.") print("anna poistettava maara.") poisto = lue_desimaaliluku() poistettiin = sailio2.poista(poisto) print("sailiosta poistettiin {:.2f} l.".format(\ poistettiin)) print("ensimmaisen sailion tiedot:") print(sailio1) print("toisen sailion tiedot:") print(sailio2) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 15 / 25

Välitehtävä 2 Kirjoita pääohjelma, joka luo uuden Vesisailio-olion, jonka koko on 28 litraa. Tämän jälkeen pääohjelma lisää säiliöön vettä 8 litraa kerrallaan, kunnes säiliö on täynnä. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 16 / 25

Olio metodin parametrina: luokka Tasovektori Halutaan kirjoittaa luokka kaksiulotteisen vektorin aī + b j kuvaamiseen. Kuvataan kertoimia a ja b kentillä x_kerroin ja y_kerroin. Määritellään metodit mm. vektorin pituuden ja kahden vektorin pistetulon laskemiseen. Pistetulon laskeva metodi tarvitsee tiedon kahdesta eri Tasovektori-oliosta. Toinen olio yksilöidään metodin kutsussa ennen pistettä ja metodin nimeä, toinen annetaan metodille parametrina. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 17 / 25

Parametriolion kenttien arvon selvittäminen Parametrina saadun olion kentät voidaa selvittää joko pistenotaation avulla def pistetulo(self, toinen_vektori): tulo = self. x_kerroin * toinen_vektori. x_kerroin + \ self. y_kerroin * toinen_vektori. y_kerroin return tulo Toinen vaihtoehto on käyttää luokan metodeita: def pistetulo2(self, toinen_vektori): tulo = self. x_kerroin * \ toinen_vektori.kerro_x_kerroin() + \ self. y_kerroin * \ toinen_vektori.kerro_y_kerroin() return tulo CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 18 / 25

Luokka Tasovektori, koodi import math class Tasovektori: def init (self, eka_kerroin, toka_kerroin): self. x_kerroin = eka_kerroin self. y_kerroin = toka_kerroin def kerro_x_kerroin(self): return self. x_kerroin def kerro_y_kerroin(self): return self. y_kerroin CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 19 / 25

Luokka Tasovektori, koodi jatkuu def laske_pituus(self): return math.sqrt(self. x_kerroin ** 2 + \ self. y_kerroin ** 2) def kerro_luvulla(self, kertoja): self. x_kerroin *= kertoja self. y_kerroin *= kertoja def pistetulo(self, toinen_vektori): tulo = self. x_kerroin * \ toinen_vektori. x_kerroin + \ self. y_kerroin * \ toinen_vektori. y_kerroin return tulo CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 20 / 25

Luokka Tasovektori, koodi jatkuu def str (self): if self. y_kerroin >= 0: mjono = "{:.3f}i + {:.3f}j".format(\ self. x_kerroin, self. y_kerroin) else: mjono = "{:.3f}i - {:.3f}j".format(\ self. x_kerroin, - self. y_kerroin) return mjono CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 21 / 25

Esimerkki Tasovektori-olioiden käytöstä Seuraavien kalvojen pääohjelma luo kaksi Tasovektori-oliota ja kutsuu niille eri metodeita. Käsiteltävien vektoreiden tiedot pyydetään käyttäjältä. Desimaalilukujen lukemista varten on jälleen määritelty oma apufunktio. CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 22 / 25

Esimerkki vektoreiden käsittelystä, koodi import tasovektori def lue_desimaaliluku(): luku_onnistui = False while not luku_onnistui: try: luku = float(input()) luku_onnistui = True except ValueError: print("virheellinen desimaaliluku!") print("anna uusi!") return luku CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 23 / 25

Esimerkki vektoreiden käsittelystä, koodi jatkuu def main(): print("anna ensimmaisen vektorin i-kerroin.") i_kerroin = lue_desimaaliluku() print("anna ensimmaisen vektorin j-kerroin.") j_kerroin = lue_desimaaliluku() a_vektori = tasovektori.tasovektori(i_kerroin, j_kerroin) print("antamasi vektori on", a_vektori) print("anna toisen vektorin i-kerroin.") i_kerroin = lue_desimaaliluku() print("anna toisen vektorin j-kerroin.") j_kerroin = lue_desimaaliluku() b_vektori = tasovektori.tasovektori(i_kerroin, j_kerroin) print("antamasi vektori on", b_vektori) CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 24 / 25

Esimerkki vektoreiden käsittelystä, koodi jatkuu main() pituus1 = a_vektori.laske_pituus() pituus2 = b_vektori.laske_pituus() print("vektorin {:s} pituus on {:.3f}".format(\ str(a_vektori), pituus1)) print("vektorin {:s} pituus on {:.3f}".format(\ str(b_vektori), pituus2)) laskettu_tulo = a_vektori.pistetulo(b_vektori) print("vektoreiden pistetulo on {:.3f}.".format(\ laskettu_tulo)) print("milla luvulla ensimmainen vektori kerrotaan?") kerroin = lue_desimaaliluku() a_vektori.kerro_luvulla(kerroin) print("eka vektori kertomisen jalkeen", a_vektori) CSE-A1111 Ohjelmoinnin peruskurssi Y1 28.10.2015 25 / 25