Ohjelmoinnin peruskurssi Y1

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin peruskurssi Y1

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 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 peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 5. Timo Savola. 28. huhtikuuta 2006

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

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Tutoriaaliläsnäoloista

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

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

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Muistutus aikatauluista

Ohjelmoinnin peruskurssien laaja oppimäärä

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Pythonilla. Teemu Sirkiä, 2015

Algoritmit 1. Demot Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Python-ohjelmointi Harjoitus 5

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Demot Timo Männikkö

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

Transkriptio:

Ohjelmoinnin peruskurssi Y1 CS-A1111 4.10.2017 CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 1 / 23

Mahdollisuus antaa luentopalautetta Luennon aikana voit kirjoittaa kommentteja ja kysymyksiä sivulle presemo.aalto.fi/opey1luento5 Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute. Tätä kautta on mahdollisuus antaa nimettömänä palautetta luennosta. Myös harjoitustehtävistä voi antaa palautetta palautuksen yhteydessä, mutta tämä palaute ei ole nimetöntä. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 2 / 23

Luentojen ja harjoituskierrosten ajoituksesta Palaute aikaisemmalta kurssikerralta En käynyt luennoilla, sillä luennoilla käsiteltävät asiat olivat niin paljon (noin 2 viikkoa) harjoitustehtäviä edellä. Joten sitten kun luentoihin liittyvät aiheet tulivat harjoitustehtäviin, ei muistissa ollut enää mitään käsiteltyjä asioita. Yleensä keskiviikon luennon aihetta käsittelevä harjoituskierros avautuu seuraavana päivänä eli torstaina. Harjoituskierroksen tekemiseen on aikaa noin 2 viikkoa. Jos tehtävien teon jättää viime tippaan, tuntuvat harjoitukset olevan selvästi luentoja jäljessä. Jos haluaa edetä harjoitustehtävissä luentojen tahtiin, kannattaa kierroksen tehtävien tekeminen aloittaa heti kierroksen avautuessa. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 3 / 23

Oppimistavoitteet: tämän luennon jälkeen Tiedät, miten saat luettua käyttäjältä jotain ja muutettua sen luvuksi yhdellä rivillä (aikaisemman kahden sijaan). Tiedät, miten ohjelman toimintaa voi tutkia ja ohjelmassa olevia virheitä etsiä debuggerin avulla. Osaat käsitellä useita yhteenkuuluvia arvoja yhden muuttujan kautta käyttämällä hyväksi listoja. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 4 / 23

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): sahkoauto = int(input("anna sahkoauton hinta (eur).\n")) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 5 / 23

Debuggeri Tyypillinen tilanne: ohjelma on kirjoitettu, Python-tulkki ei valita virheistä, mutta ohjelma kuitenkin toimii jotenkin väärin. Tällöin ohjelman toimintaa voi tutkia ja virhettä yrittää etsiä debuggerin avulla. Debuggeri on ohjelma, jonka avulla ohjelmaa voi ajaa käsky kerrallaan ja tutkia samalla ohjelman käyttämien muuttujien arvoja. Ohjelmaan voi asettaa pysähdyspisteitä (breakpoint), joissa ohjelma pysähtyy. Eclipseen kuuluu debuggeri, jonka avulla voi ajaa mm. Python-ohjelmia. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 6 / 23

Debuggerin käytttö Eclipsessä Ennen debuggerin käynnistymistä kannattaa asettaa ensimmäinen pysähdyspiste. Valitaan haluttu rivi koodista, painetaan rivin vasemmassa reunassa hiiren oikeaa painiketta ja valitaan esiin tulevasta valikosta Add breakpoint. Tämän jälkeen debuggerin voi käynnistää valitsemalla Run->Debug As->Python Run Eclipse ajaa ohjelmaa ensimmäiseen pysähdyspisteeseen saakka ja kysyy sitten, siirrytäänkö Debug-perspektiiviin (ellei se ole jo käytössä). Tämän jälkeen ohjelmassa voi edetä rivi kerrallaan valitsemalla Run->Step Over. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 7 / 23

Debuggerin käytttö Eclipsessä, jatkoa Jos rivillä on funktion kutsu, ja haluaa siirtyä funktion sisälle, on valittava Run->Step Into. Muuttujien arvot näkyvät joka vaiheessa oikeassa yläkulmassa olevalla välilehdellä. Ideana on ajaa ohjelmaa käsky kerrallaan ja katsoa, miten muuttujien arvot muuttuvat. Kun jossain vaiheessa arvo ei vastaa odotettua tai siirrytään eri riville kuin pitäisi, voi miettiä tarkemmin, miksi näin tapahtuu. Usein tämä johtaa virheen jäljille. Debuggauksesta pääsee takaisin ohjelman editointiin (Pydev-perspektiiviin) Eclipsen ikkunan oikeassa yläkulmassa olevista valintamahdollisuuksista (valitse Pydev). CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 8 / 23

Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat on luettu, ohjelma tulostaa luetut lämpötilat ja niiden keskiarvon. Ratkaisu: käytetään listaa. Lista on rakenne, johon voidaan tallentaa useita eri arvoja. Indeksin avulla voidaan määrätä, mitä listan alkiota käsitellään. Esimerkiksi lampotilat[4]. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 9 / 23

Listan luominen ja alkioiden lisäys Tyhjän listan luominen: lampotilat = [] Alkion lisäys listan loppuun: lampotilat.append(arvo) Uuden arvon sijoittaminen indeksille i: lampotilat[i] = arvo Esimerkkejä yksittäisen alkion käyttämisestä: print("5. lampotila", lampotilat[4]) summa = summa + lampotilat[4] CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 10 / 23

Esimerkkejä lampotilat = [] CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat lampotilat = [] CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat lampotilat = [] lampotilat.append(15.0) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 15.0 lampotilat = [] lampotilat.append(15.0) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 15.0 lampotilat = [] lampotilat.append(15.0) lampotilat.append(12.1) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 15.0 lampotilat = [] 12.1 lampotilat.append(15.0) lampotilat.append(12.1) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 15.0 lampotilat = [] 12.1 lampotilat.append(15.0) lampotilat.append(12.1) lampotilat.append(10.7) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 15.0 lampotilat = [] 1 12.1 lampotilat.append(15.0) lampotilat.append(12.1) 2 10.7 lampotilat.append(10.7) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 15.0 lampotilat = [] 1 12.1 lampotilat.append(15.0) lampotilat.append(12.1) 2 10.7 lampotilat.append(10.7) lampotilat.append(15.4) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 15.0 lampotilat = [] 12.1 lampotilat.append(15.0) 2 10.7 3 15.4 lampotilat.append(12.1) lampotilat.append(10.7) lampotilat.append(15.4) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 15.0 lampotilat = [] 12.1 lampotilat.append(15.0) 2 10.7 3 15.4 lampotilat.append(12.1) lampotilat.append(10.8) lampotilat.append(15.4) lampotilat.append(13.8) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 3 4 15.0 lampotilat = [] 12.1 lampotilat.append(15.0) 2 10.7 15.4 13.8 lampotilat.append(12.1) lampotilat.append(10.8) lampotilat.append(15.4) lampotilat.append(13.8) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 3 4 15.0 12.1 2 10.7 15.4 13.8 lampotilat = [] lampotilat.append(15.0) lampotilat.append(12.1) lampotilat.append(10.7) lampotilat.append(15.4) lampotilat.append(13.8) lampotilat[3] = 18.0 CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 3 4 15.0 12.1 2 10.7 15.4 13.8 lampotilat = [] lampotilat.append(15.0) lampotilat.append(12.1) lampotilat.append(10.7) lampotilat.append(15.4) lampotilat.append(13.8) lampotilat[3] = 18.0 CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Esimerkkejä lampotilat 0 1 15.0 12.1 2 10.7 3 18.0 4 13.8 lampotilat = [] lampotilat.append(15.0) lampotilat.append(12.1) lampotilat.append(10.7) lampotilat.append(15.4) lampotilat.append(13.8) lampotilat[3] = 18.0 CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 11 / 23

Listan läpikäynti toistokäskyllä Listassa on LKM alkiota, lasketaan niiden summa: summa = 0.0 i = 0 while i < LKM: summa += lampotilat[i] i += 1 Läpikäynti on vielä helpompaa for-käskyn avulla: summa = 0.0 for astemaara in lampotilat: summa += astemaara Muuttuja astemaara saa arvokseen vuorotellen jokaisen listan alkion. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 12 / 23

Lämpötilaesimerkki, koodi def main(): LKM = 30 lampotilat = [] i = 0 print("anna", LKM, "lampotilaa") while i < LKM: lampo = float(input("seuraava lampotila: ")) lampotilat.append(lampo) i += 1 CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 13 / 23

Lämpötilaesimerkki, koodi jatkuu summa = 0.0 print("annetut lampotilat") for arvo in lampotilat: print(arvo) summa += arvo keskiarvo = summa / LKM print("lampotilojen keskiarvo on", keskiarvo) main() CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 14 / 23

Alkiot listaan listaa luodessa Luotavan listan ei tarvitse välttämättä olla tyhjä, vaan listaan kuuluvat alkiot voidaan antaa samalla: numerolista = [2, 4, 6, 8] nimilista = [ Matti Virtanen, Maija Maki, Anu Lahti ] Voidaan myös luoda lista, jossa on aluksi haluttu määrä nollia. LKM = 30 lampotilat = [0.0] * LKM Tällöin listaan sijoitettavat lämpötilat voidaan antaa sijoituskäskyllä eikä append-käskyä tarvita: i = 0 while i < LKM: lampo = float(input("seuraava lampotila: ")) lampotilat[i] = lampo i += 1 CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 15 / 23

Listan pituus käyttäjältä Luotavan listan pituuden voi myös pyytää käyttäjältä. lkm = int(input("anna lampotilojen lukumaara. ")) lampotilat = [0.0] * lkm Listan pituuden saa selville Pythonissa valmiina olevalla funktiolla len, joten sitä ei välttämättä tarvitse säilyttää muuttujassa listan luonnin jälkeen: i = 0 while i < len(lampotilat): lampo = float(input("seuraava lampotila: ")) lampotilat[i] = lampo i += 1 CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 16 / 23

Välitehtävä Mitä seuraava ohjelma tulostaa? lista = [1, 2, 3] lista[0] = lista[1] + lista[2] lista[2] = lista[0] + lista[1] for alkio in lista: print(alkio) CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 17 / 23

Merkkijonoja sisältävä lista Listan alkioiden ei tarvitse välttämättä olla lukuja, vaan alkioina voi olla esimerkiksi merkkijonoja. Saman listan eri alkiot voivat olla keskenään myös erityyppisiä. Listan alkiona voi olla myös toinen lista. Merkkijonoja sisältävät listat ovat käteviä esimerkiksi silloin, kun käyttäjälle halutaan tulostaa erilaisia valintavaihtoehtoja ja käsitellä käyttäjän valitsemaa vaihtoehtoa. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 18 / 23

def main(): ruokalajit = [ makaronilaatikko, lihapullat,\ lihakeitto, kasvispata,\ pihvi ] print("valitse ruokalaji:") i = 0 while i < len(ruokalajit): print("{:d}. {:s}".format(i + 1, ruokalajit[i])) i += 1 valinta = int(input()) if valinta > 0 and valinta <= len(ruokalajit): print("valitsit ruuan", ruokalajit[valinta - 1]) else: print("huono valinta") main() CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 19 / 23

Lista parametrina ja funktion palauttamana arvona Lämpötiloja käsittelevää ohjelmaa voi selkiyttää jakamalla sen useampaan funktioon. Tällöin kuitenkin tiedon käsiteltävistä lämpötiloista pitää siirtyä eri funktioiden välillä. Tähän voidaan käyttää parametreja ja funktion paluuarvoa. Funktio voi palauttaa arvonaan listan ja funktiolle voidaan antaa parametrina lista. Jos funktio tekee muutoksia parametrina saadun listan sisältöön, näkyvät muutokset myös silloin, kun samaa listaa käytetään funktion ulkopuolella. CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 20 / 23

Esimerkki: listan palauttava funktio def kysy_lampotilat(): LKM = 30 lampotilat = [0.0] * LKM i = 0 print("anna", LKM, "lampotilaa") while i < LKM: lampo = float(input("seuraava lampotila: ")) lampotilat[i] = lampo i += 1 return lampotilat CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 21 / 23

Esimerkki: lista funktion parametrina def tulosta_lampotilat(lammot): print("annetut lampotilat") for arvo in lammot: print(arvo) def laske_keskiarvo(lampotilalista): summa = 0.0 for lampotila in lampotilalista: summa += lampotila lukumaara = len(lampotilalista) if lukumaara > 0: keskiarvo = summa / lukumaara else: keskiarvo = 0.0 return keskiarvo CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 22 / 23

Esimerkki: pääohjelma def main(): lampolista = kysy_lampotilat() tulosta_lampotilat(lampolista) k_arvo = laske_keskiarvo(lampolista) print("lampotilojen keskiarvo on {:.2f}".format(k_arvo)) main() CS-A1111 Ohjelmoinnin peruskurssi Y1 4.10.2017 23 / 23