Løse reelle problemer

Like dokumenter
Løse reelle problemer

Hvordan løse problemer med programmering?

Løse reelle problemer

INF uke 2. Inputt, beslutninger, kontrollflyt og prosedyrer

Løkker og lister. Løse problemer med programmering. INF1001, uke3 Geir Kjetil Sandve

Løse reelle problemer

Finne ut om en løsning er helt riktig og korrigere ved behov

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

Håndtere mange verdier

Finne ut om en løsning er helt riktig og korrigere ved behov

Repetisjon Novice Videregående Python PDF

IN uke 2. Presis forståelse av programmering

Metoder med parametre, løkker og arrayer

INF1000 Eksamen 2014 (modifisert)

Innlesing fra fil og metoder med returverdier

Løkker og arrayer. Løse problemer med programmering. INF1000, uke3 Geir Kjetil Sandve

Feilmeldinger, brukerinput og kontrollflyt

INF1000 Eksamen 2014 (modifisert)

Eksamensoppgaver 2014

Øvingsforelesning i Python (TDT4110)

Oppsummering fra sist

IN uke 2. Presis forståelse av programmering

Objektorientert programmering i Python

TDT4110 IT Grunnkurs Høst 2015

Oppgave 1 Hva tror du følgende program skriver ut til terminalen? Diskuter med gruppen.

Informasjon Prøveeksamen i IN1000 høsten 2018

Steg 1: Regneoperasjoner på en klokke

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

Hvor gammel er du? Hvor gammel er du? Del 1: Skrive ut til skjerm. Gjøre selv. Skrevet av: Sindre O. Rasmussen, Kodeklubben Trondheim

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

INF Ekstrainnlevering

Feilmeldinger, kontrollflyt og void-metoder

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

INF120: Oblig 3. Yngve Mardal Moe

Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

TEKSTSTRENGER GRUNNLEGGENDE STRENGOPERASJONER. 2 TESTING, SØKING OG MANIPULERING AV TEKSTSTRENGER. 3 FORMATTERING. 5 BETINGEDE KONTROLLSTRUKTURER.

Øvingsforelesning 5 Python (TDT4110)

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Oppgave 1.1 (1 poeng) Oppgave 1.2 (2 poeng) Oppgave 1.3 (2 poeng) 1.1

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker. - 3rd edition: Kapittel 4. Professor Alf Inge Wang

For å sjekke at Python virker som det skal begynner vi med å lage et kjempeenkelt program. Vi vil bare skrive en enkel hilsen på skjermen.

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Informasjon Eksamen i IN1000 høsten 2017

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

IN uke 1. Komme i gang med programmering

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

Øvingsforelesning 5 Python (TDT4110)

IN1000 Obligatorisk innlevering 7

Læringsmål og pensum. Intro løkker. Mål Lære om begrepet løkker Lære om bruk av while-løkke Lære om bruk av for-løkke Pensum. Kapittel 4.

Kapittel 1 En oversikt over C-språket

TDT4110 IT Grunnkurs Høst 2016

UNIVERSITETET I OSLO

Øvingsforelesning 7 i Python (TDT4110)

YouTube-kanal ITGK. Læringsmål og pensum

Steg 1: Rest etter divisjon

IN uke 1. Komme i gang med programmering

Python: Funksjoner og moduler Kapittel

Øvingsforelesning 1 Python (TDT4110)

TDT4110 IT Grunnkurs Høst 2016

Innleveringsoppgave 1

Øvingsforelesning i Python (TDT4110)

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

IN1000 Repetisjonskurs: IO og listeoperasjoner (+ string)

Forelesning inf Java 4

TDT4110 Informasjonsteknologi grunnkurs: Tema: Enkle funksjoner. - 3rd edition: Kapittel Professor Alf Inge Wang

Læringsmål og pensum. if (be): else (not_to_be):

Hangman. Steg 1: Velg et ord. Steg 2: Gjett en bokstav. Sjekkliste. Sjekkliste. Introduksjon

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

Utførelse av programmer, metoder og synlighet av variabler i JSP

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

Python: Intro til funksjoner. TDT4110 IT Grunnkurs Professor Guttorm Sindre

INF109 - Uke 1b

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

INF1000: Forelesning 4. Mer om arrayer Metoder

Feilmeldinger, kontrollflyt og void-metoder

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk. - 3rd edition: Kapittel 3. Professor Alf Inge Wang

Programmering Høst 2017

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Del 1 En oversikt over C-programmering

Mattespill Nybegynner Python PDF

Først må vi få datamaskinen til å velge et tilfeldig ord, så la oss begynne. Lagre programmet ditt og kjør det. Hvilket ord skrives ut?

Repetisjon, del 2. TDT 4110 IT Grunnkurs Professor Guttorm Sindre

Oppgaver uke 1: Løsningsforslag

INF109 - Uke 1a

MAT1030 Diskret Matematikk

Python: Valg og betingelser. TDT4110 IT Grunnkurs Professor Guttorm Sindre

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

INF1000 : Forelesning 4

Anta at følgende programsetninger utføres. Hva skrives ut på skjermen? Hva skrives ut her (skriv nøyaktig de karakterene som printes, og bare de)?

Forkurs i informatikk Python. Andreas Færøvig Olsen

Transkript:

Løse reelle problemer Litt mer om løkker, prosedyrer, funksjoner, tekst og innlesing fra fil INF1000, uke4 Geir Kjetil Sandve 1

Tilbakeblikk Dere bør nå beherske det sentrale fra uke 1 og 2: Uttrykk, typer, variabler, beslutninger (if) Forrige uke introduserte to helt fundamentale konsept while for å kjøre en kodeblokk mange ganger liste for å holde på mange verdier Hvor mye må dere ha skjønt av lister og løkker? Ikke forventet stålkontroll i dag - krever modning Det løsner etterhvert - Mengde, mengde, mengde Mindre enn 13 timer med faget er på eget ansvar 2

Outline For-løkker Prosedyrer med parametre Funksjoner Lese fra fil Mer om lister og strenger Jobbe med ekte data 3

Outline For-løkker Prosedyrer med parametre Funksjoner Lese fra fil Mer om lister og strenger Jobbe med ekte data 4

Iterere gjennom en samling: for Syntaks: for variable in container: statement1... Eksempel: for tall in [1,2,3,4]: print(tall*tall) En løkke som kjøres én gang med hver verdi i en samling (container) Variabelen mellom "for" og "in" blir satt til én verdi fra samlingen for hver gang kodeblokken i løkka kjøres [sum_vha_for_v1.py] 5

En samling (container) En samling er en verdi som består av flere elementer En liste, en mengde,... Alt som kan itereres gjennom med en for-løkke Noen samlinger kan også aksesseres på indeks: Mulig for liste: min_liste[2] Ikke mulig for mengde: min_mengde[2] 6

Strenger er også en type lister! Man kan iterere gjennom strenger: for bokstav in "NORGE": print("gi meg en " + bokstav) Man kan aksessere strenger på indeks: land = "NORGE" print( land[2]) Men man kan ikke endre en streng: land[2] = "J" Man sier at strenger er uforanderlige (immutable) 7

Kjapt spesifere lister av tall: range Funksjonen range kan brukes for å kjapt lage lister: assert range(5) == [0,1,2,3,4] assert range(2,5) == [2,3,4] assert range(0,5,2) == [0,2,4] assert range(1,5,2) == [1,3] Dette kan brukes som del av for-løkke for tall in range(1,5): print(tall*tall) [sum_vha_for_v2.py] 8

Outline For-løkker Prosedyrer med parametre Funksjoner Lese fra fil Mer om lister og strenger Jobbe med ekte data 9

Flere typer subrutiner Subrutine (fra uke 2): en navngitt blokk med kodelinjer, som kan kalles og tilpasses Vi vil i dag introdusere flere aspekter Uke 2: Prosedyre - uten parametre og returverdi I dag: Prosedyre - med parametre I dag: Funksjon - med returverdi Neste uke: Instans-metode (OO) 10

Prosedyrer med parametre Prosedyren vi så på i tidligere uke gjorde alltid eksakt det samme når den ble kallet Det er sjelden av nytte! For å være nytig må en slik prosedyre kunne tilpasses Det gjør vi ved å sende inn parametre 11

Din første prosedyre med parametre print er en prosedyre hvor utfallet tilpasses! print(text): skriver verdien i text til skjermen Variabelen text er en parameter Verdien vi gir inn (hallo INF1001) når vi kaller print er et argument Parameter og argument er to sider av det samme Parameter: variabel i prosedyre som tar i mot verdi Argument: verdi sendt inn når prosedyren kalles 12

Prosedyre med parametre def mittprosedyrenavn(parameter1, parameter2,...): kodelinje1 kodelinje2... For å kjøre alle kodelinjene i prosedyren ("kalle prosedyren"): mittprosedyrenavn(argument1, argument2,...) 13

Prosedyrer outsourcer detaljer og håndterer redundans Man har ofte behov for (omtrent) samme funksjonalitet ulike steder i en kode Man ønsker da ikke å duplisere koden Minsker oversiktlighet av kode Endringer og rettinger må utføres mange steder Man samler i stedet funksjonaliteten i en prosedyren og kaller metoden der den trengs Dersom det er noe variasjon i hva man trenger, representerer man det som varierer med en parameter 14

Prosedyre med parametre {prosedyre_med_parameter_v1.pyprosedyre_med_parameter_v3.py} 15

Outline For-løkker Prosedyrer med parametre Funksjoner Lese fra fil Mer om lister og strenger Jobbe med ekte data 16

Subrutiner med returverdi: Funksjoner def mittfunksjonsnavn(parameter1,...): kodelinje1 kodelinje2 return beregnet_verdi For å kjøre alle kodelinjene i funksjonen ("kalle prosedyren"): verdien_jeg_trenger = mittfunksjonsnavn(argument1,..) 17

Subrutiner med returverdi: Funksjoner En funksjon lar deg outsource en beregning til en separat kodeblokk Funksjonen tar inn en eller flere verdier, gjør en bestemt beregning, og sender tilbake resultatet Det som skiller en funksjon fra en prosedyre er altså at en funksjon returnerer noe: def min_funksjon(parametre,..):... return en_beregnet_verdi 18

Subrutiner med returverdi: Funksjoner Eksempler på funksjoner: def gang_med_to(tall): return tall*2 def lag_velkomst(fag, person): return "Velkommen til " + fag + " kjære " + person Bruk av funksjoner dusin=13 todusin = gang_med_to(dusin) print(todusin) #Skriver ut 26 velkomst = lag_velkomst("inf1001", "Geir") print(velkomst) #Velkommen til inf1001 kjære Geir 19

Funksjoner kan enkelt testes Man vet hva funksjonen skal gjøre, og kan skrive testen før selve funksjonen! assert gang_med_to(3) == 6 Man kan ikke teste alle muligheter, men forsøk å dekke litt variert type argumenter (ulikt som kunne tenkes å feile) assert gang_med_to(0) == 0 assert gang_med_to(-3) == -6 assert gang_med_to(2.4) == 4.8 20

Funksjoner kan enkelt testes Skriv deretter gjerne en (tom) funksjon som skal feile def gang_med_to(tall): return 0 Forsøk til slutt å skrive riktig funksjon def gang_med_to(tall): return tall*2 Se at programmet (asserts) ikke lenger feiler ved kjøring [ganging.py] 21

Prosedyrer versus funksjoner i Python Det er i Python ikke noe teknisk skille mellom prosedyre og funksjon Begge kalles i Python "funksjoner" og har samme form: def min_funksjon(parameter):... Forskjellen er i vårt hode (vårt formål): Det som skiller en "ekte" funksjon fra en prosedyre er at funksjoner returnerer en verdi man er interessert i Dette ser man som en return i koden, men også ved at resultatet av kallet brukes/tas vare på: todusin = gang_med_to(dusin) 22

Utsett til i morgen, det du ikke trenger gjøre i dag Prosedyrer med returverdi tillater å utsette problemer! Fokuser først på hva som trengs overordnet Deretter gå løs på detaljene Eksempel: kvm=60 postnr=0316 inntekt=503800 pris = regn_bolig_pris(kvm, postnr) maks_laan = regn_kreditt_verdighet(inntekt) if (maks_laan > pris): print("yes!") # Deretter skriv selve funksjonene.. 23

Med/uten parametre/returverdi (En litt filosofisk distinksjon...) Prosedyrer uten parametre: Handler stort sett om kontrollflyt Prosedyrer med parametre: Handler stort sett om tilpasset gjenbruk av kode Funksjoner: Outsourcer en overordnet beregning (transformerer inn til ut) 24

Tre kilder til funksjoner Innebygde funksjoner print, int, input... Følger med Python og er alltid tilgjengelige Funksjoner i standard-biblioteket (ikke innebygde) sqrt, ctime Er del av en modul: math, time,... from time import ctime print(ctime()) Egendefinerte funksjoner def min_funksjon(parameter):... 25

Prøv selv (5 min) (Lett modifisert fra eksamen 2014) Skriv en funksjon def pris(gratis, alder): Dersom parameteren gratis har verdien True, skal funksjonen alltid returnere 0. Dersom parameteren gratis har verdien False og verdien av alder er mindre enn 18, skal funksjonen returnere 100, ellers 200. Altså skal f.eks. kallet pris (true, 10) returnere 0, kallet pris(false,10) returnere 100 og kallet pris(false, 50) returnere 200. 26

En mulig løsning def pris(gratis, alder): if gratis: svar = 0 elif alder < 18: svar = 100 else: svar = 200 return svar 27

En annen mulig løsning (returnere inni if) def pris(gratis, alder): if gratis: return 0 elif alder < 18: return 100 else: return 200 28

En tredje mulig løsning (bare rene if - ingen else..) def pris(gratis, alder): if gratis: svar = 0 if (!gratis and alder < 18): svar = 100 if (!gratis and alder >= 18): svar = 200 return svar 29

Evaluering av uttrykk som inneholder funksjonkall Vi har i INF1001 ofte skrevet følgende: innlest = input("skriv et tall") tall = int(innlest) Dette er nøyaktig det samme som følgende: tall = int(input("skriv et tall")) I det ene tilfellet tas teksten vare på i en variabel (innlest) før den konverteres, i den andre brukes den direkte 30

Evaluering av uttrykk som inneholder funksjonkall Hva som nøyaktig skjer: tall = int(input("skriv et tall")) input("skriv et tall") -> "55" int( "55" ) -> 55 tall = 55 input er en funksjon som her får en beskjed som argument, og evaluerer til teksten brukeren skriver int er en funksjon som her tar verdien som input evaluerer til som argument, transformerer denne, og evaluerer til det tilsvarende heltallet 31

En liten nøtt Hva skjer egentlig her? noe = input(input("spørsmål: ")) print("trtrtrtrtrt: " + noe) 32

Outline For-løkker Prosedyrer med parametre Funksjoner Lese fra fil Mer om lister og strenger Jobbe med ekte data 33

Innlesing fra fil Å hente data fra filer er gøy! Man kan jobbe på mye større og mer spennende data enn fra tastatur Man slipper å taste det inn hver gang man kjører Innlesing fra enkle filer er veldig rett frem i Python 34

Innlesing fra fil Å hente data fra filer er gøy! Man kan jobbe på mye større og mer spennende data enn fra tastatur Man slipper å taste det inn hver gang man kjører Innlesing fra tekstfiler er veldig rett frem i Python En tekstfil åpnet i Python er faktisk en samling av linjer Man kan dermed iterere gjennom linjer i filen vha for-løkke (Det finnes også mange andre måter å gjøre det på) 35

Hvordan lese inn fra Først åpne en fil: tekstfil min_fil = open("mittfilnavn.txt") Deretter iterere gjennom hver linje i filen: min_fil = open("mittfilnavn.txt") for linje in min_fil: Inni for-løkken kan man gjøre noe med linjen min_fil = open("mittfilnavn.txt") for linje in min_fil: print("her fant jeg: " + linje) [les_fra_fil.py] 36

Alternative måter å Kan lese én linje lese fra fil på linje = min_fil.readline() returnerer tom streng ("") når den har nådd slutten av filen Kan lese hele filen som en liste av linjer (liste av streng-verdier) alle_linjer = min_fil.readlines() Kan lese hele filen som én streng-verdi (inkludert linjeskift) hele_teksten = min_fil.read() 37

Hvordan skrive til tekstfil Først åpne en fil for skriving: min_fil = open("mittutfilnavn.txt", "w") Deretter skrive tekst (en streng-verdi) til filen: min_fil = open("mittutfilnavn.txt", "w") min_fil.write("dette havner i filen") Man vil typisk ha linjeskift i det man skriver ut: min_fil.write("dette havner i filen\n") min_fil.write("dette havner på\n ulike\n linjer\n") Når man er ferdig bør man lukke filen: min_fil.close() [elefanter.py] 38

Outline For-løkker Prosedyrer med parametre Funksjoner Lese fra fil Mer om lister og strenger Jobbe med ekte data 39

Kakebit (slice) Mer om lister liste = [1945, 1814, 1905, 1945] assert liste[1:3] == [1814, 1905] Sortere assert sorted(liste) == [1814, 1905, 1945, 1945] Telle assert liste.count(1945) == 2 Summere assert sum(liste) == 7609 40

Mer om strenger: Siden strenger er lister tekst = "kamel" assert tekst[0:3] == "kam" assert sorted(tekst) == "aeklm" assert tekst.count("m") == 1 assert sum(tekst)==1000 #(summere gir dog ikke mening) 41

Mer om strenger Strip fjerner blanke i endene av strengen (kun endene) setning = " egg,hvete,epler og kanel " assert setning.strip() == "egg,hvete,epler og kanel" setning = setning.strip() Split deler opp strengen i flere deler (liste av strenger) assert setning.split(",") == ["egg", "hvete", "epler og kanel"] ordene = setning.split(",") assert len(ordene) == 3 assert ordene[2] == "epler og kanel" 42

Mer om utskrift Vi har til nå konkatenert tekst ifbm utskrift print( "Hei" + "INF" + "1000") Altså konkateneres 3 strenger til én streng-verdi som er argument til funksjonen print Biblioteksfunksjonen print kan ta imot mange argumenter! print("hei", "INF", "1000") Argumentene trenger ikke være strenger (blir konvertert automatisk) print("hei INF", 500*2, "er", 1==1) (hvordan kan det være mulig? - kommer senere) 43

Oppsummering Prosedyrer og funksjoner gjør livet behagelig! Tillater å tenke overordnet først, og deretter ordne detaljene Å hente data fra filer er gøy! Kan jobbe med store og reelle data, uten tasting Når alt dere har lært frem til nå kobles sammen, kan det brukes til å utrette mye 44