Ohjelmoinnin peruskurssi Y1

Samankaltaiset tiedostot
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 peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

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

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 peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

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

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 perusteet Pythonilla. Teemu Sirkiä, 2015

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

T Ohjelmoinnin perusteet Y (Python). Tentti

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

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

Listarakenne (ArrayList-luokka)

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin jatkokurssi, kurssikoe

815338A Ohjelmointikielten periaatteet

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

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

Ohjelmoinnin perusteet Y Python

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

Tentti: T Ohjelmoinnin peruskurssi, osa 1. Yleistä. Tehtävä 1

ITKP102 Ohjelmointi 1 (6 op)

Transkriptio:

Ohjelmoinnin peruskurssi Y1 CSE-A1111 4.11.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 1 / 55

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 4.11.2015 2 / 55

Kysymyksiä viime kerran luentopalautteesta Minkä takia ohjelmointia tehdään? Mitä ohjelmointi käytännössä tekee? Mitä Goblinilla tehdään? Return jäänyt epäselväksi. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 3 / 55

Oppimistavoitteet: tämän luennon jälkeen Osaat käyttää monipuolisemmin olioita kuin mitä aikaisempien luentojen perusteella. Osaat tehdä ja käyttää listoja, joiden alkiot ovat olioita. Ymmärrät, mitä seuraa siitä, jos useampi muuttuja viittaa samaan olioon. Osaat määritellä olioita, joiden kenttinä on toisia olioita. Osaat tallentaa olioiden tietojen tallentaminen tekstitiedostoon ja lukea niitä tekstitiedostosta. Osaat määritellä olioita, jonka kenttänä toisia olioita sisältävä lista (jää itseopiskeluun). CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 4 / 55

Kertausta: Listan alkiona viiteitä olioihin Halutaan tehdä ohjelma ohjelmointikurssien opiskelijoiden käsittelyyn. Yhden opiskelijan tietoja kuvataan yhdellä Opiskelija-oliolla. Kurssin kaikkien opiskelijoiden käsittelemistä varten tehdään lista, joka sisältää viitteet kurssin kaikkia opiskelijoita kuvaaviin Opiskelija-olioihin. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 5 / 55

Kertausta: olioviitteiden lisääminen listaan Listaan voi lisätä uuden Opiskelija-olion esimerkiksi seuraavasti: opiskelijalista.append(opiskelija("matti Virtanen", \ "511114")) Toinen vaihtoehto on tehdä olion luonti ja sen lisääminen listaan eri käskyissä: uusi_opiskelija = Opiskelija("Matti Virtanen", "511114") opiskelijalista.append(uusi_opiskelija) Jos listassa on jo vähintään i+1 alkiota, voi olioviitteen sijoittaa myös suoraan paikalle i: uusi_opiskelija = Opiskelija("Matti Virtanen", "511114") opiskelijalista[i] = uusi_opiskelija CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 6 / 55

Kertausta: metodien kutsuminen listan alkioille Indeksillä i olevalle Opiskelija-oliolle voidaan kutsua Opiskelija-luokan metodeita seuraavasti: print("opiskelijan", opiskelijalista[i].kerro_nimi()) print("kurssiarvosana on", opiskelijalista[i].laske_kokonaisarvosana()) On myös mahdollista käydä koko lista läpi for-käskyllä ja kutsua metodeita vuorotellen jokaiselle listan alkiolle: for kurssilainen in opiskelijalista: print("opiskelijan", kurssilainen.kerro_nimi()) print("kurssiarvosana on", kurssilainen.laske_kokonaisarvosana()) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 7 / 55

Opiskelija-olioita listassa Seuraavilla kalvoilla on esimerkkiohjelma, joka lukee käyttäjältä opiskelijoiden tiedot, luo vastaavat Opiskelija-oliot ja sijoittaa ne listaan, pyytää listan opiskelijoille arvosanat ja tulostaa kurssin tulokset. Eri vaiheita varten on kirjoitettu omat funktionsa. Aluksi on jo aikaisemmin esitetty Opiskelija-luokan koodi. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 8 / 55

Opiskelija-luokka class Opiskelija: def init (self, annettu_nimi, numero): self. nimi = annettu_nimi self. opiskelijanumero = numero self. tenttiarvosana = 0 self. harjoitusarvosana = 0 def kerro_nimi(self): return self. nimi def kerro_opiskelijanumero(self): return self. opiskelijanumero CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 9 / 55

Opiskelija-luokka jatkuu def kerro_tenttiarvosana(self): return self. tenttiarvosana def kerro_harjoitusarvosana(self): return self. harjoitusarvosana def muuta_tenttiarvosana(self, arvosana): if 0 <= arvosana <= 5: self. tenttiarvosana = arvosana def muuta_harjoitusarvosana(self, arvosana): if 0 <= arvosana <= 5: self. harjoitusarvosana = arvosana CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 10 / 55

Opiskelija-luokka jatkuu def laske_kokonaisarvosana(self): if self. tenttiarvosana == 0 or \ self. harjoitusarvosana == 0: arvosana = 0 else: arvosana = (self. tenttiarvosana + self. harjoitusarvosana + 1) // 2 return arvosana def str (self): mjono = self. nimi + ", " + \ self. opiskelijanumero + \ ", tenttiarvosana: " + \ str(self. tenttiarvosana) + \ ", harjoitusarvosana: " + \ str(self. harjoitusarvosana) return mjono CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 11 / 55

Opiskelija-olioita listassa, koodi import opiskelija def lue_kokonaisluku(): luku_onnistui = False while not luku_onnistui: try: luku = int(input()) luku_onnistui = True except ValueError: print("virheellinen kokonaisluku!") print("anna uusi!") return luku CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 12 / 55

Opiskelija-olioita listassa, koodi jatkuu def lue_opiskelijatiedot(): opiskelijat = [] print("anna opiskelijoiden nimet ja opiskelijanumerot") print("samalla rivilla kauttaviivalla erotettuna.") print("lopeta tyhjalla rivilla.") rivi = input() while rivi!= "": tiedot = rivi.split("/") if len(tiedot)!= 2: print("virheellinen rivi!") else: uusi = opiskelija.opiskelija(tiedot[0], tiedot[1]) opiskelijat.append(uusi) rivi = input() print("opiskelijoiden tiedot luettu!") return opiskelijat CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 13 / 55

Opiskelija-olioita listassa, koodi jatkuu def lisaa_arvosanatiedot(opiskelijalista): for kurssilainen in opiskelijalista: print("anna opiskelijan {:s} tenttiarvosana:".\ format(kurssilainen.kerro_nimi())) tentti_as = lue_kokonaisluku() print("harjoitusarvosana:") harjoitus_as = lue_kokonaisluku() kurssilainen.muuta_tenttiarvosana(tentti_as) kurssilainen.muuta_harjoitusarvosana(harjoitus_as) print("arvosanat lisatty!") CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 14 / 55

Opiskelija-olioita listassa, koodi jatkuu def tulosta_tulokset(opiskelijat): print("numero nimi tentti harj kurssi") for i in range(len(opiskelijat)): print("{:6s} {:15s} {:<6d} {:<6d} {:<6d}".format(\ opiskelijat[i].kerro_opiskelijanumero(), opiskelijat[i].kerro_nimi(), opiskelijat[i].kerro_tenttiarvosana(), opiskelijat[i].kerro_harjoitusarvosana(), opiskelijat[i].laske_kokonaisarvosana())) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 15 / 55

Opiskelija-olioita listassa, koodi jatkuu def main(): opiskelijatiedot = lue_opiskelijatiedot() lisaa_arvosanatiedot(opiskelijatiedot) tulosta_tulokset(opiskelijatiedot) print("ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 16 / 55

Välitehtävä 1: mitä tämä ohjelma tulostaa? import tasovektori def main(): vektori1 = tasovektori.tasovektori(4.0, 2.5) vektori2 = tasovektori.tasovektori(4.0, 2.5) vektori3 = vektori1 print(vektori1) print(vektori2) print(vektori3) vektori1.kerro_luvulla(3.0) print(vektori1) print(vektori2) print(vektori3) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 17 / 55

Useampi muuttuja viittaa samaan olioon Edellisen kalvon koodissa muuttujat vektori1 ja vektori3 viittaavat samaan olioon: 4.0 2.5 4.0 2.5 vektori1 vektori3 vektori2 Kun oliota muutetaan muuttujan vektori1 kautta, näkyy muutos myös, kun samaa oliota katsotaan muuttujan vektori3 kautta. 12.0 7.5 4.0 2.5 vektori1 vektori3 vektori2 CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 18 / 55

Välitehtävä 2: mitä tämä ohjelma tulostaa? import tasovektori def main(): vektori1 = tasovektori.tasovektori(4.0, 2.5) vektori2 = tasovektori.tasovektori(4.0, 2.5) vektori3 = vektori1 print(vektori1) print(vektori2) print(vektori3) vektori1 = tasovektori.tasovektori(5.0, 7.8) print(vektori1) print(vektori2) print(vektori3) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 19 / 55

Tulostuksen selitys Jälleen muuttujat vektori1 ja vektori3 viittaavat aluksi samaan olioon: 4.0 2.5 4.0 2.5 vektori1 vektori3 vektori2 Muuttujaan vektori1 tehtävä sijoitus ei kuitenkaan muuta itse oliota, vaan panee muuttujan viittaamaan uuteen olioon. Muuttuja vektori3 jää viittaamaan samaan olioon kuin aikaisemminkin: 5.0 7.8 4.0 2.5 4.0 2.5 vektori1 vektori3 vektori2 CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 20 / 55

Oliomuuttuja toisen olion kenttänä Olion kenttänä voi olla viite saman tai toisen luokan olioon. Halutaan kirjoittaa luokka Kellonaytto, jonka avulla voidaan esittää kellonaikoja muodossa hh:mm. Luokassa on metodi ajan asettamista varten sekä metodi, joka kasvattaa aikaa minuutilla. Luokka pitää huolen siitä, että tunnit ovat aina välillä 0 24 ja minuutit välillä 0 60. Määritellään luokka Numeronaytto, jonka avulla voidaan esittää lukuja kahdella numerolla. Luokassa on metodi luvun kasvatukseen. Numeronäytön arvo voi olla välillä 0 (raja - 1), missä raja on määritelty Numeronaytto-oliota luodessa. Kellonaytto-olion kenttinä on kaksi Numeronaytto-oliota. Esimerkin idea on kirjasta Barnes and Kölling: Objects first with Java. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 21 / 55

Numeronaytto, koodi class Numeronaytto: def init (self, nollausraja): self. arvo = 0 if 1 <= nollausraja <= 100: self. raja = nollausraja else: self. raja = 1 def kerro_arvo(self): return self. arvo def kerro_raja(self): return self. raja CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 22 / 55

Numeronaytto, koodi jatkuu def aseta_arvo(self, uusi_arvo): if 0 <= uusi_arvo < self. raja: self. arvo = uusi_arvo def kasvata_arvoa(self): self. arvo = (self. arvo + 1) % self. raja def str (self): if self. arvo < 10: return "0" + str(self. arvo) else: return str(self. arvo) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 23 / 55

Kellonaytto, koodi import numeronaytto class Kellonaytto: def init (self): self. tunnit = numeronaytto.numeronaytto(24) self. minuutit = numeronaytto.numeronaytto(60) def aseta_aika(self, uudet_tunnit, uudet_min): self. tunnit.aseta_arvo(uudet_tunnit) self. minuutit.aseta_arvo(uudet_min) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 24 / 55

Kellonaytto, koodi jatkuu def lisaa_minuutilla(self): self. minuutit.kasvata_arvoa() if self. minuutit.kerro_arvo() == 0: self. tunnit.kasvata_arvoa() def str (self): return str(self. tunnit) + ":" + \ str(self. minuutit) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 25 / 55

Pääohjelma, koodi import kellonaytto def main(): kello1 = kellonaytto.kellonaytto() print("kello aluksi:", kello1) kello1.aseta_aika(12, 45) print("muutoksen jalkeen:", kello1) for i in range(128): kello1.lisaa_minuutilla() print("lisattiin 128 min:", kello1) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 26 / 55

Pääohjelma, koodi jatkuu kello2 = kellonaytto.kellonaytto() kello2.aseta_aika(23, 55) print("toinen kello aluksi:", kello2) for i in range(10): kello2.lisaa_minuutilla() print("keskiyon jalkeen:", kello2) main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 27 / 55

Olioiden tietojen lukeminen tekstitiedostosta Luotavien olioiden tiedot voidaan lukea tekstitiedostosta samaan tapaan kuin ne luettaisiin suoraan käyttäjältä. On muistettava käsitellä erilaiset virhetilanteet (tiedostoa ei pystytä lukemaan, jokin rivi ei ole oletetussa muodossa jne.) Seuraavassa esimerkkiohjelmassa luetaan Opiskelija-luokan olioiden tietoja tekstitiedostosta. Tiedoston rivillä on annettu opiskelijan nimi, opiskelijanumero, tenttiarvosana ja harjoitusarvosana toisistaan kauttaviivalla erotettuna. Ohjelma luo tietojen perusteella Opiskelija-oliot ja lisää heidät listaan. Virheellisistä riveistä aiheutuneet virheet on käsitelty opiskelijoiden tiedot lukevan funktion sisällä. Ohjelma jatkaa toimintaansa normaalisti virheellisen rivin jälkeen. Tiedoston lukemisessa tapahtunut virhe käsitellään pääohjelmassa. Tällainen virhe päättää ohjelman suorituksen. Virheen voisi käsitellä myös tiedot lukevan funktion sisällä. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 28 / 55

Olioiden tietojen tallentaminen tekstitiedostoon Esimerkkiohjelma pyytää käyttäjältä myös uusien opiskelijoiden tietoja, luo näistä Opiskelija-oliot ja lisää oliot samaan listaan tiedostosta luettujen opiskelijoiden kanssa. Sitten ohjelma tekee opiskelijoista tuloslistan. Lopuksi ohjelma tallentaa kaikkien opiskelijoiden (sekä tiedostosta että käyttäjältä luettujen) tiedot käyttäjän antamaan tiedostoon. Tiedot kirjoitetaan tiedostoon samassa muodossa kuin mitä ne olivat lähtötiedostossa. Kun ohjelma lukee alussa käsiteltävien olioiden tiedot tiedostosta ja tallentaa ne lopuksi tiedostoon samassa muodossa, pystytään ohjelman käsittelemiä tietoja säilyttämään ohjelman suorituskerrasta toiseen. Myös tiedoston kirjoittamisessa tapahtunut virhe käsitellään esimerkkiohjelmassa pääohjelmassa. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 29 / 55

Opiskelijat tiedostossa, koodi import opiskelija def lue_opiskelijat_tiedostosta(): opiskelijat = [] print("mista tiedostosta opiskelijoiden tiedot luetaan?") tiedoston_nimi = input() lahtotiedosto = open(tiedoston_nimi, "r") for rivi in lahtotiedosto: rivi = rivi.rstrip() tiedot = rivi.split("/") if len(tiedot)!= 4: print("virheellinen rivi:", rivi) else: uusi = opiskelija.opiskelija(tiedot[0], tiedot[1]) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 30 / 55

Opiskelijat tiedostossa, koodi jatkuu try: tenttias = int(tiedot[2]) harj_as = int(tiedot[3]) uusi.muuta_tenttiarvosana(tenttias) uusi.muuta_harjoitusarvosana(harj_as) opiskelijat.append(uusi) except ValueError: print("rivilla virheellinen arvosana:", rivi) lahtotiedosto.close() return opiskelijat CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 31 / 55

Opiskelijat tiedostossa, koodi jatkuu def lue_opiskelijoita_kayttajalta(opiskelijat): print("anna lisattavien opiskelijoiden tiedot.") print("lopeta tyhjalla rivilla.") rivi = input() while rivi!= "": tiedot = rivi.split("/") if len(tiedot)!= 4: print("virheellinen rivi.") else: uusi = opiskelija.opiskelija(tiedot[0], tiedot[1]) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 32 / 55

Opiskelijat tiedostossa, koodi jatkuu try: tenttias = int(tiedot[2]) harj_as = int(tiedot[3]) uusi.muuta_tenttiarvosana(tenttias) uusi.muuta_harjoitusarvosana(harj_as) opiskelijat.append(uusi) except ValueError: print("rivilla virheellinen arvosana.") rivi = input() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 33 / 55

Opiskelijat tiedostossa, koodi jatkuu def tulosta_tulokset(opiskelijat): print("numero nimi tentti harj kurssi") for i in range(len(opiskelijat)): print("{:6s} {:15s} {:<6d} {:<6d} {:<6d}".format(\ opiskelijat[i].kerro_opiskelijanumero(),\ opiskelijat[i].kerro_nimi(),\ opiskelijat[i].kerro_tenttiarvosana(),\ opiskelijat[i].kerro_harjoitusarvosana(),\ opiskelijat[i].laske_kokonaisarvosana())) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 34 / 55

Opiskelijat tiedostossa, koodi jatkuu def tallenna_opiskelijat_tiedostoon(oplista): print("mihin tiedostoon kirjoitetaan?") nimi = input() tiedosto = open(nimi, "w") for i in range(len(oplista)): tiedosto.write("{:s}/{:s}/{:d}/{:d}\n".format(\ oplista[i].kerro_nimi(),\ oplista[i].kerro_opiskelijanumero(),\ oplista[i].kerro_tenttiarvosana(),\ oplista[i].kerro_harjoitusarvosana())) tiedosto.close() print("opiskelijoiden tiedot tallennettu.") CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 35 / 55

Opiskelijat tiedostossa, koodi jatkuu def main(): jatkuu = True try: opiskelijatiedot = lue_opiskelijat_tiedostosta() except OSError: print("virhe tiedoston lukemisessa.") jatkuu = False if jatkuu: lue_opiskelijoita_kayttajalta(opiskelijatiedot) tulosta_tulokset(opiskelijatiedot) try: tallenna_opiskelijat_tiedostoon(opiskelijatiedot) except OSError: print("tiedostoon kirjoittaminen ei onnistunut.") print("ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 36 / 55

Esimerkki: olion kenttänä olioviitteitä sisältävä lista Kirjoitetaan ohjelma oppilasrekisteriä varten. Jokaisesta oppilaasta on tallenettu nimi, opiskelijanumero ja tiedot kurssisuorituksista. Yhtä kurssisuoritusta kuvataan Kurssisuoritus-oliolla. Oliolla on kenttinä suoritetun kurssin koodi, nimi, suorituspäivä, opintopistemäärä ja arvosana. Oppilas-olion kenttänä on nimen ja opiskelijanumeron lisäksi lista, joka sisältää suoritettuja kursseja vastaavat Kurssisuoritus-oliot. Lisäksi on kirjoitettu omaan moduuliinsa valikkopohjainen ohjelma, jolla käyttäjä voi luoda uusia opiskelijoita ja lisätä heille kurssisuorituksia. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 37 / 55

Luokka Kurssisuoritus class Kurssisuoritus: def init (self, kurssikoodi, kurssin_nimi, pvm,\ pisteet, arvostelu): self. koodi = kurssikoodi self. nimi = kurssin_nimi self. suorituspvm = pvm self. laajuus = pisteet self. arvosana = arvostelu def kerro_koodi(self): return self. koodi def kerro_nimi(self): return self. nimi CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 38 / 55

Luokka Kurssisuoritus, koodi jatkuu def kerro_suorituspvm(self): return self. suorituspvm def kerro_laajuus(self): return self. laajuus def kerro_arvosana(self): return self. arvosana def str (self): mjono = "{:10s} {:30s} {:5.1f} {:2d} {:10s}".\ format(self. koodi,\ self. nimi, self. laajuus,\ self. arvosana, self. suorituspvm) return mjono CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 39 / 55

Luokka Oppilas class Oppilas: def init (self, annettu_nimi, nro): self. nimi = annettu_nimi self. opnro = nro self. suoritukset = [] def kerro_nimi(self): return self. nimi def kerro_opnro(self): return self. opnro CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 40 / 55

Luokka Oppilas jatkuu def lisaa_suoritus(self, uusi): if uusi.kerro_arvosana() < 1 or\ uusi.kerro_arvosana() > 5 or\ uusi.kerro_laajuus() < 0.0: return False for suoritus in self. suoritukset: if suoritus.kerro_koodi() == uusi.kerro_koodi(): if uusi.kerro_arvosana() >\ suoritus.kerro_arvosana(): self. suoritukset.remove(suoritus) self. suoritukset.append(uusi) return True else: return False self. suoritukset.append(uusi) return True CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 41 / 55

Luokka Oppilas jatkuu def onko_suoritettu(self, kurssikoodi): for suoritus in self. suoritukset: if suoritus.kerro_koodi() == kurssikoodi: return True return False def laske_opintopistesumma(self): summa = 0.0 for suoritus in self. suoritukset: summa += suoritus.kerro_laajuus() return summa CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 42 / 55

Luokka Oppilas jatkuu def laske_keskiarvo(self): arvosanasumma = 0.0 opintopistesumma = 0.0 for suoritus in self. suoritukset: arvosanasumma += suoritus.kerro_laajuus() *\ suoritus.kerro_arvosana() opintopistesumma += suoritus.kerro_laajuus() if opintopistesumma == 0.0: return 0.0 else: return arvosanasumma / opintopistesumma CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 43 / 55

Luokka Oppilas jatkuu def tee_raportti(self): raportti = self. opnro + " " + self. nimi + "\n" raportti += "Suoritetut kurssit:\n" for suoritus in self. suoritukset: raportti += str(suoritus) + "\n" opsumma = self.laske_opintopistesumma() keskiarvo = self.laske_keskiarvo() raportti += str(opsumma) +\ " op, keskiarvo {:.2f}.".format(keskiarvo) return raportti def str (self): return self. opnro + " " + self. nimi CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 44 / 55

Käyttöliittymämoduuli import oppilas import kurssisuoritus def lue_kokonaisluku(): luku_onnistui = False while not luku_onnistui: try: luku = int(input()) luku_onnistui = True except ValueError: print("virheellinen kokonaisluku!") print("anna uusi!") return luku CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 45 / 55

Käyttöliittymämoduuli jatkuu 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 4.11.2015 46 / 55

Käyttöliittymämoduuli jatkuu def lisaa_oppilas(oppilaslista): print("anna uuden oppilaan nimi: ") uusi_nimi = input() print("anna uuden oppilaan opiskelijanumero: ") uusi_nro = input() for jasen in oppilaslista: if jasen.kerro_opnro() == uusi_nro: print("opiskelija on jo listassa, ei lisatty.") return oppilaslista.append(oppilas.oppilas(uusi_nimi, uusi_nro)) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 47 / 55

Käyttöliittymämoduuli jatkuu def lisaa_uusi_suoritus(oppilaslista): print("kenelle suoritus lisataan:") nro = kysy_oppilas(oppilaslista) if nro < 0: print("kelvoton oppilaan numero") else: print("anna kurssikoodi.") uusi_koodi = input() print("anna kurssin nimi.") uusi_nimi = input() print("anna suorituspaiva.") paiva = input() print("anna kurssin opintopistemaara.") pistemaara = lue_desimaaliluku() print("anna kurssin arvosana.") numero = lue_kokonaisluku() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 48 / 55

Käyttöliittymämoduuli jatkuu tehty_suoritus = \ kurssisuoritus.kurssisuoritus(uusi_koodi,\ uusi_nimi, paiva, pistemaara, numero) if oppilaslista[nro].lisaa_suoritus(tehty_suoritus): print("suoritus lisattiin.") else: print("suorituksen lisays ei onnistunut.") CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 49 / 55

Käyttöliittymämoduuli jatkuu def tarkista_suoritus(oppilaslista): print("kenen suoritus tarkistetaan:") nro = kysy_oppilas(oppilaslista) if nro < 0: print("kelvoton oppilaan numero") else: print("anna tarkistettavan kurssin koodi.") annettu_koodi = input() if oppilaslista[nro].onko_suoritettu(annettu_koodi): print("oppilas on suorittanut kurssin.") else: print("oppilas ei ole suorittanut kurssia.") CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 50 / 55

Käyttöliittymämoduuli jatkuu def tulosta_oppilaan_raportti(oppilaslista): print("kenen raportti tulostetaan:") nro = kysy_oppilas(oppilaslista) if nro < 0: print("kelvoton oppilaan numero") else: print(oppilaslista[nro].tee_raportti()) CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 51 / 55

Käyttöliittymämoduuli jatkuu def kysy_oppilas(oppilaslista): i = 0 while i < len(oppilaslista): print("{:d}. {:s}".format(i + 1, \ str(oppilaslista[i]))) i += 1 oppilaan_nro = lue_kokonaisluku() if oppilaan_nro < 1 or oppilaan_nro > len(oppilaslista): return -1 else: return oppilaan_nro - 1 CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 52 / 55

Käyttöliittymämoduuli jatkuu def valikko(): print("valitse toiminto:") print("1. lisaa uusi oppilas") print("2. lisaa kurssisuoritus") print("3. tarkista kurssin suoritus") print("4. tulosta oppilaan raportti") print("5. lopeta") valinta = lue_kokonaisluku() return valinta CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 53 / 55

Käyttöliittymämoduuli jatkuu def main(): oppilaat = [] toiminto = valikko() while toiminto!= 5: if toiminto == 1: lisaa_oppilas(oppilaat) elif toiminto == 2: lisaa_uusi_suoritus(oppilaat) elif toiminto == 3: tarkista_suoritus(oppilaat) elif toiminto == 4: tulosta_oppilaan_raportti(oppilaat) toiminto = valikko() print("ohjelman suoritus paattyi.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 54 / 55

Huomautuksia Olio-ohjelmointia puhtaasti käyttävässä ohjelmassa myös opiskelijoita sisältävästä listasta olisi tehty oma luokkansa, jonka metodien avulla voitaisiin lisätä opiskelijoita ja opiskelijoille kurssisuorituksia. Kurssisuoritusten hakeminen olisi tehostunut, jos Oppilas-olion kurssisuoritukset olisi kerätty listan sijaan sanakirjaan, jossa avaimena on kurssikoodi ja avaimeen liittyvänä arvona koko Kurssisuoritus-olio. CSE-A1111 Ohjelmoinnin peruskurssi Y1 4.11.2015 55 / 55