EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

Like dokumenter
EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

EKSAMENSOPPGAVE. Ingen. Robert Pettersen. Eksamen i: INF Innf. i progr. og datam. virkem. Dato: Tirsdag 5. desember 2017

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl. 10:30

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Teorifagb, hus 3, og og Adm.bygget, Aud.max og B.

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: NEI

EKSAMENSOPPGAVE. INF-1100 Innføring i programmering og datamaskiners virkemåte. Ingen. Elektronisk (WiseFlow) Robert Pettersen

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA Hvis JA: ca. kl.10:00 og 12:00

EKSAMENSOPPGAVE. Adm.bygget, rom K1.04 og B154 Ingen. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl.

EKSAMENSOPPGAVE. NB! Det er ikke tillatt å levere inn kladd sammen med besvarelsen

EKSAMENSOPPGÅVE. Kalkulator, Rottmanns tabellar og 2 A4 ark med eigne notater (4 sider).

EKSAMENSOPPGÅVE. Kalkulator, 2 ark (4 sider) med eigne notater og Rottmanns tabeller. Ragnar Soleng

EKSAMENSOPPGAVE. Godkjent kalkulator; Rottmanns tabeller; To A4 ark egne notater (håndskrevne, trykte, eller blandede).

EKSAMENSOPPGAVE I INF-1100

EKSAMENSOPPGAVE. Alle skrevne og trykte. Godkjent kalkulator.

EKSAMENSOPPGAVE. KRAFT I og II Hall del 2 Kraft sportssenter Ingen

EKSAMENSOPPGAVE. INF-1400 Objektorientert Programmering. Dato: Tirsdag 23. mai Klokkeslett: Kl 17:00-21:00. Adm. bygget, Aud.

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

UNIVERSITETET I OSLO

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

Forside. 1 Hva skrives ut?

EKSAMENSOPPGAVE. INF-1400 Objektorientert Programmering. Dato: Torsdag 29. september Klokkeslett: Kl 09:00-13:00.

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

Øvingsforelesning 1 Python (TDT4110)

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl. 10

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

EKSAMENSOPPGÅVE. Mat-1005, Diskret matematikk. Godkjent kalkulator, Rottmanns tabellar og 2 A4 ark med eigne notater (4 sider).

IN1000 Obligatorisk innlevering 7

EKSAMENSOPPGAVE. Adm.bygget, rom B154 2 ark med egne notater (4 sider) Godkjent kalkulator Rottman. Matematisk formelsamling

EKSAMENSOPPGAVE. : INF-1400 Objektorientert programmering. Oppgavesettet er på 5 sider inklusiv forside

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

EKSAMENSOPPGAVE. «Tabeller og formler i statistikk» av Kvaløy og Tjelmeland. To A4-ark/ 4 sider med egne notater. Godkjent kalkulator.

Eksamen REA3022 Matematikk R1. Nynorsk/Bokmål

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Dette kan selvfølgelig brukes direkte som en numerisk tilnærmelse til den deriverte i et gitt punkt.

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

UNIVERSITETET I OSLO

EKSAMENSOPPGAVE STA-1001.

EKSAMENSOPPGAVE. Kontaktperson under eksamen: Steffen Viken Valvåg Telefon:

UNIVERSITETET I OSLO

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. Kl 10.00

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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.

Øvingsforelesning 3 Python (TDT4110)

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

Eksamensoppgaver 2014

UNIVERSITETET I OSLO

EKSAMENSOPPGAVE. 4 (1+3) Det er 12 deloppgaver (1abc, 2abcd, 3abc, 4ab) Andrei Prasolov

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

UNIVERSITETET I OSLO

Mattespill Nybegynner Python PDF

INF1000 Eksamen 2014 (modifisert)

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

Steg 1: Rest etter divisjon

UNIVERSITETET I OSLO

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

EKSAMEN 6109 OBJEKTORIENTERT PROGRAMMERING 5609 OBJEKTORIENTERT PROGRAMMERING

EKSAMENSOPPGAVE Njål Gulbrandsen / Ole Meyer /

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I)

EKSAMENSOPPGAVE Georg Elvebakk NB! Det er ikke tillatt å levere inn kladd sammen med besvarelsen

UNIVERSITETET I OSLO

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

INF1000 Eksamen 2014 (modifisert)

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Repetisjon Novice Videregående Python PDF

EKSAMENSOPPGAVE STA-2004.

Norsk informatikkolympiade runde

EKSAMENSOPPGAVE. GEO-2010 Marine geofag

UNIVERSITETET I OSLO

ITGK - H2010, Matlab. Repetisjon

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Oppgave 1.6 Hva skrives ut? Riktig svar: The total rainfall from June to August was 54.00

Informasjon Eksamen i IN1000 høsten 2017

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet

EKSAMENSOPPGAVE STA «Tabeller og formler i statistikk» av Kvaløy og Tjelmeland. To A4-ark/ 4 sider med egne notater. Godkjent kalkulator. Rute.

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Eksamen REA3022 Matematikk R1. Nynorsk/Bokmål

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

UNIVERSITETET I OSLO

Øvingsforelesning 5 Python (TDT4110)

UNIVERSITETET I OSLO

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

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å.

Hash-funksjoner. Introduksjon. Steg 1: Strekkoder. Eksempel. Skrevet av: Martin Strand

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

EKSAMENSOPPGAVE. Eksamen i: INF-1400 Objektorientert programminering Dato: Mandag 26. mai 2014 Tid: Kl 09:00-13:00 Sted: Adm.

Norsk informatikkolympiade runde

Øvingsforelesning 5 Python (TDT4110)

Informasjon Prøveeksamen i IN1000 høsten 2018

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

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

Transkript:

Fakultet for naturvitenskap og teknologi EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE Eksamen i: Inf-1049, Introduksjon til beregningsorientert programmering Dato: 14. desember 2018 Klokkeslett: 09.00 13.00 Sted / Stad: Kraft I og II Hall del 3 Tillatte hjelpemidler: Lovlege hjelpemiddel: Ingen Antall sider inkl. forside: 9 Kontaktperson under eksamen: Edvard Pedersen Telefon/mobil: 404 58 598 Vil det bli gått oppklaringsrunde i eksamenslokalet? Skal det gåast trøysterunde i eksamenslokalet? Hvis JA / Om JA: Ca. 10.00 Svar: JA Postboks 6050 Langnes, N-9037 Tromsø / 77 64 40 00 / postmottak@uit.no / uit.no

Les hele oppgaveteksten nøye før du starter. Disponer tiden slik at du rekker å svare på alle spørsmålene. Vær nøye på å svare på det som det blir spurt om, og bruk fullstendige setninger. Oppgavesettet kommer først på bokmål og så på nynorsk. Nynorsk-versjon av oppgavesettet starter på side 6. Oppgave 1 15% I oppgavene under må dere selv finne ut hvilke argumenter funksjonene tar inn. Legg inn ett eksempel på bruk av funksjonene i løsningen. (a) Lag en Python funksjon f som returner verdien til den matematiske funksjonen: f(x, y) = 2x 2 + 2y 2 4 (b) Lag en Python funksjon g som returnerer verdien for den matematiske funksjonen: g(x, y, z) = 1 x2 + y 2 + z 2 16 (c) Utvid funksjonen g fra (b) til å håndtere mulig feilsituasjoner hvor funksjonen brukes med verdier på argumentene som vil feile. Slike feil skal håndteres med å generere ValueError unntak (engelsk: raise ValueError exceptions) som inkluderer dine egne feilmeldinger unik for de ulike feilsituasjonene. Vi kan anta at funksjonen brukes med rett type argumenter. (Hint: For hvilke verdier av x, y og z vil kall på funksjonen gi oss situasjoner hvor Python ikke kan regne ut svaret uten at programmet vil feile?) Oppgave 2 10% Numerisk tilnærming til den dobbelt-deriverte av en funksjon f(x) kan, for en liten verdi for h, uttrykkes slik: f (x) f(x + h) 2f(x) + f(x h) h 2 Verdien til h kan typisk være 10 5. Lag en funksjon dblderivative i Python som tar 2 argumenter i tillegg til et valgfritt tredjeargument h: def dblderivative(f, x, h=1e-5): Argument f er funksjonen f som tar et argument x. Argument x er verdien til x. Funksjonen dblderivative skal kunne benyttes slik: from math import sin, pi def f1(x): return 3*x**2 + 2*x**3 def f2(x): return sin(x) print("f1''(2) = %.2f \t(verifiser: %.2f)" % (dblderivative(f1, 2), 6 + 12*2)) print("f2''(pi) = %.2f \t(verifiser: %.2f)" % (dblderivative(f2, pi), -sin(pi))) Det vil gi følgende utskrift: f1''(2) = 30.00 (verifiser: 30.00) f2''(pi) = -0.00 (verifiser: -0.00) 2

Oppgave 3 20% Vi skal nå beregne sannsynligheten med en Monte Carlo simulering. Vi har en vanlig kortstokk med kort med verdiene fra 2 til 10, i tillegg til knekt, dame, konge og ess. Alle disse verdiene finnes i ruter, kløver, hjerter og spar. I Monte Carlo simuleringen skal vi trekke ut 5 kort fra kortstokken og beregne sannsynlighetene for at vi får 2, 3 eller 4 like kort (kort med samme verdi). (a) Vis hvordan du vil representere denne kortstokken i Python. Når du velger hvordan du skal representere kortstokken så er det lurt å ta hensyn til hva vi skal bruke kortstokken til. (Hint: ess = 1, knekt = 11, dame = 12, konge = 13.) (b) Lag en funksjon select_card som trekker ut et tilfeldig kort fra kortstokken: def select_card(deck): (c) Lag en funksjon simulate som utfører Monte Carlo simulering for c antall like kort, hvor c er 2, 3 eller 4: def simulate(c, N=10000): N angir antall simuleringer som skal utføres. Du bør lage en ny kortstokk for hver ny simulering. Bruk funksjonen select_card fra (b) for å trekke ut tilfeldig kort fra kortstokken. Eksempel på bruk av simulate: print("propability for 2 equal cards: %f" % (simulate(2),)) print("propability for 3 equal cards: %f" % (simulate(3),)) print("propability for 4 equal cards: %f" % (simulate(4, 100000),)) Det vil kunne gi følgende utskrift: Propability for 2 equal cards: 0.497300 Propability for 3 equal cards: 0.021000 Propability for 4 equal cards: 0.000200 Oppgave 4 10% Du skal i denne oppgaven lage et Python program som leser input fra brukeren av programmet. Du kan selv velge om programmet skal lese input fra kommando-linja når du starter programmet eller som input i programmet når programmet kjører. Du skal lese inn to ting: et matematisk uttrykk med en variable x og en verdi for x. Det matematiske utrykket skal være et gyldig Python utrykk, som for eksempel: 2*x**2 + 6*x**3 - sin(x) Programmet skal lese det matematiske uttrykket og verdien på x, og skrive verdien av utrykket for denne verdien av x. Hvis programmet ditt er lagret i Python fila mathexpr.py så vil de to versjonene av å kjøre programmet se slik ut (du skal bare implementere en av disse): Input fra kommando-linje > python3 mathexpr.py "2*x**2 + 6*x**3 - sin(x)" 0.5*pi 27.1895 Input under kjøring av programmet > python3 mathexpr.py Skriv inn matematisk utrykk: 2*x**2 + 6*x**3 - sin(x) Skriv inn verdien til x: 0.5*pi 27.1895 (Hint: Du skal enten bruke sys.argv eller input i denne oppgaven.) 3

Oppgave 5 30% En fil sykkel.csv inneholder data om sykkelpasseringer. Her er et eksempel på de 8 første linjene i denne filen: timestamp;direction;speed_(km/h) 2016-09-01T05:41:33.800+02:00;1;21.80 2016-09-01T05:43:02.040+02:00;1;13.30 2016-09-01T05:44:03.540+02:00;-1;20.90 2016-09-01T06:00:13.520+02:00;-1;23.50 2016-09-01T06:06:45.520+02:00;1;17.60 2016-09-01T06:08:03.000+02:00;1;18.40 2016-09-01T06:11:25.050+02:00;-1;24.40 sykkel.csv Hver linje representerer en passering og inneholder 3 verdier adskilt med semicolon (;). Første verdi er et tidsstempel på når passeringen skjedde (dato og klokkeslett), andre verdi er enten 1 (nord) eller 1 (sør) og angir retning på sykkelpasseringen, og tredje verdi er hastighet målt på sykkel ved passering (i kilometer per time). Første linje med data (linje 2) sier at en sykkel passerte 1. september 2016 klokken 05:41:33 på vei nordover i en hastighet på 21,80 km/t. Vi kan anta at linjene kommer i den rekkefølgen passeringene har skjedd (at de er sortert på tidsstempel). (a) Lag et Python program som leser inn dataene fra denne fila og lagrer de 3 datasettene i 3 Numerical Python arrays (fra numpy modulen). Altså, et array med tidsstempel, et array med retning, og et array med hastighetene. (b) Regn ut og finn gjennomsnittlig hastighet, minimum hastighet og maksimum hastighet for alle sykkelpasseringene. Finn også antall som har syklet i retning nord og i retning sør. Programmet skal skrive ut resultatene slik: Speed: min = 4.1 average = 16.5291 max = 36.5 Direction: north = 5170 south = 3993 (c) Plot antall passeringer per dag bassert på arrayet med tidsstempel (passeriger for en dag kommer etter hverande i fila). Plottet skal se ut omtrent slik hvis vi antar i overkant av 9000 paseringer på 30 dager: 500 400 300 200 100 0 T F L S M T O T F L S M T O T F L S M T O T F L S M T O T F (Hint: I plottet over har vi brukt matplotlib.pyplot sin plottefunksjon bar og ikke plot som vi vanligvis bruker. De brukes på samme måte. Eneste forskjellen er at vi med bar får søylediagram og ikke en vanlig graf. Dere kan fritt velge om dere bruker bar eller plot. Jeg har også valgt å legge inn første bokstav i ukedag under hver søyle. Det er ikke nødvendig i deres løsning av oppgaven.) 4

Oppgave 6 15% I denne oppgaven skal vi lage en klasse Vec2D som kan representere vektorer i et plan. Hvis vi har to vektorer (a, b) og (c, d) så har vi disse matematiske operasjonene på vektorene i et plan: (a, b) + (c, d) = (a + c, b + d) (1) (a, b) (c, d) = (a c, b d) (2) (a, b) = (c, d) if a = c and b = d (3) (a) Lag klassen Vec2D i Python som kan representere vektorer i et plan. Klassen skal kunne brukes slik for å lage en vektor v1 som representerer vektoren (1, 2) i et plan: v1 = Vec2D(4, 6) (Hint: du må blant annet lage metoden init i klassen Vec2D.) (b) Utvid klassen Vec2D med metodene str og repr som gir to ulike tekststreng-representasjoner av en vektor (et objekt av klassen Vec2D). Disse benyttes av henholdsvis Python sin str og Python sin repr funksjon. Objekter av klassen Vec2D kan da benyttes sammen med Python sin print funksjon. For eksempel vil print(v1) # Funksjonen print vil i dette tilfellet utføre str(v1) print(repr(v1)) gi utskrift (4, 6) Vec2D(4, 6) (c) Utvid klassen Vec2D med metoder som gjør at vi kan legge sammen (addere) og trekke fra (subtrahere) to vektorer, se (1) og (2) ovenfor. Med to vektorer v1 og v2 vil vi for eksempel kunne lage to nye vektorer v3 og v4 på denne måten: v1 = Vec2D(4, 6) v2 = Vec2D(3, 2) v3 = v1 + v2 v4 = v1 - v2 print("v3 = v1 + v2 = %s + %s = %s" % (str(v1), str(v2), str(v3))) print("v4 = v1 - v2 = %s - %s = %s" % (str(v1), str(v2), str(v4))) Denne koden vil gi følegnde utskrift: v3 = v1 + v2 = (4, 6) + (3, 2) = (7, 8) v4 = v1 - v2 = (4, 6) - (3, 2) = (1, 4) (d) Utvid klassen Vec2D med metoder som gjør at vi kan sjekke om to vektorer er like eller ulike, se (3) ovenfor. Uttrykket v3 == v4 skal kunne brukes for å sjekke at vektor v3 er lik vektor v4, og uttrykket v3 == (v2 + v4) skal kunne brukes for å sjekke at vektor v3 er lik summen av vektor v2 og vektor v4. Uttrykket v3!= v4 skal kunne brukes for å sjekke at vektor v3 ikke er lik vektor v4, og uttrykket v3!= (v2 + v4) skal kunne brukes for å sjekke at vektor v3 ikke er lik summen av vektor v2 og vektor v4. For eksempel vil gi utskrift print("v3 == v4 -> %s; v3!= v4 -> %s" % (str(v3 == v4), str(v3!= v4))) print("v3 == (v2 + v4) -> %s; v3!= (v2 + v4) -> %s" % ( str(v1 == (v2 + v4)), str(v1!= (v2 + v4)))) v3 == v4 -> False; v3!= v4 -> True v3 == (v2 + v4) -> True; v3!= (v2 + v4) -> False 5

Les heile oppgåveteksten nøye før du startar. Disponer tida slik at du rekk å svare på alle spørsmåla. Vær nøye å svara på det som det blir spurt om, og bruk fullstendige setningar. Oppgåvane kjem først på bokmål og så på nynorsk. Bokmål-versjon av oppgåvane starter på side 2. Oppgåve 1 15% I oppgavene under må du sjølv finne ut kva argument funksjonane tek inn. Legg inn eit døme på bruk av funksjonane i løysninga. (a) Lag ein Python funksjon f som returner verdien til den matematiske funksjonen: f(x, y) = 2x 2 + 2y 2 4 (b) Lag ein Python funksjon g som returnerer verdien for den matematiske funksjonen: g(x, y, z) = 1 x2 + y 2 + z 2 16 (c) Utvid funksjonen g frå (b) til å håndtera moglege feil-situasjonar der funksjonen vert brukt med verdiar på argumenta som vil feila. Slike feil skal håndterast med å generere ValueError unntak (engelsk: raise ValueError exceptions) som inkluderer dine eigne feilmeldingar unik for dei ulike feilsituasjonane. Vi kan anta at funksjonen vert bruket med rett typa argument. (Hint: For kva verdiar av x, y og z vil kall på funksjonen gje situasjonar hvor Python ikkje kan regne ut svaret uten at programmet vil feile?) Oppgåve 2 10% Numerisk tilnærming til den dobbelt-deriverte av ein funksjon f(x) kan, for ein liten verdi for h, verte uttrykt slik: f (x) f(x + h) 2f(x) + f(x h) h 2 Verdien til h kan typisk vera 10 5. Lag ein funksjon dblderivative i Python som tek 2 argument i tillegg til eit valfritt tredjeargument h: def dblderivative(f, x, h=1e-5): Argument f er funksjonen f som tek eit argument x. Argument x er verdien til x. Funksjonen dblderivative skal kunna verta nytta slik: from math import sin, pi def f1(x): return 3*x**2 + 2*x**3 def f2(x): return sin(x) print("f1''(2) = %.2f \t(verifiser: %.2f)" % (dblderivative(f1, 2), 6 + 12*2)) print("f2''(pi) = %.2f \t(verifiser: %.2f)" % (dblderivative(f2, pi), -sin(pi))) Det vil gje følgjande utskrift: f1''(2) = 30.00 (verifiser: 30.00) f2''(pi) = -0.00 (verifiser: -0.00) 6

Oppgåve 3 20% Me skal no berekna sannsyn med ein Monte Carlo simulering. Me har ein vanleg kortstokk med kort med verdiane frå 2 til 10, i tillegg til knekt, dame, konge og ess. Alle desse verdiane finst i ruter, kløver, hjarter og spar. I Monte Carlo simuleringa skal me trekkje ut 5 kort frå kortstokken og berekne sannsyn for at me får 2, 3 eller 4 like kort (kort med same verdi). (a) Vis korleis du vil representere denne kortstokken i Python. Når du velgjer korleis du skal representere kortstokken så er det lurt å ta onsyn til kva me skal bruke kortstokken til. (Hint: ess = 1, knekt = 11, dame = 12, konge = 13.) (b) Lag ein funksjon select_card som trekkjer ut et tilfeldig kort frå kortstokken: def select_card(deck): (c) Lag ein funksjon simulate som utfører Monte Carlo simulering for c menge like kort, der c er 2, 3 eller 4 def simulate(c, N=10000): N angjer mengde simuleringar som skal utførast. Du bør laga ein ny kortstokk for kvar ny simulering. Bruk funksjonen select_card frå (b) for å trekkje ut tilfeldig kort frå kortstokken. Døme på bruk av simulate: print("propability for 2 equal cards: %f" % (simulate(2),)) print("propability for 3 equal cards: %f" % (simulate(3),)) print("propability for 4 equal cards: %f" % (simulate(4, 100000),)) Det vil kunne gi følgjande utskrift: Propability for 2 equal cards: 0.497300 Propability for 3 equal cards: 0.021000 Propability for 4 equal cards: 0.000200 Oppgåve 4 10% Du skal i denne oppgaven lage et Python program som leser input fra brukeren av programmet. Du kan selv velge om programmet skal lese input fra kommando-linja når du starter programmet eller som input i programmet når programmet kjører. Du skal lese inn to ting: et matematisk uttrykk med en variable x og en verdi for x. Det matematiske utrykket skal være et gyldig Python utrykk, som for eksempel: 2*x**2 + 6*x**3 - sin(x) Programmet skal lese det matematiske uttrykket og verdien på x, og skrive verdien av utrykket for denne verdien av x. Hvis programmet ditt er lagret i Python fila mathexpr.py så vil de to versjonene av å kjøre programmet se slik ut (du skal bare implementere en av disse): Input fra kommando-linje > python3 mathexpr.py "2*x**2 + 6*x**3 - sin(x)" 0.5*pi 27.1895 Input under køyring av program > python3 mathexpr.py Skriv inn matematisk utrykk: 2*x**2 + 6*x**3 - sin(x) Skriv inn verdien til x: 0.5*pi 27.1895 (Hint: Du skal enten bruke sys.argv eller input i denne oppgaven.) 7

Oppgåve 5 30% En fil sykkel.csv inneholder data om sykkelpasseringer. Her er et eksempel på de 8 første linjene i denne filen: timestamp;direction;speed_(km/h) 2016-09-01T05:41:33.800+02:00;1;21.80 2016-09-01T05:43:02.040+02:00;1;13.30 2016-09-01T05:44:03.540+02:00;-1;20.90 2016-09-01T06:00:13.520+02:00;-1;23.50 2016-09-01T06:06:45.520+02:00;1;17.60 2016-09-01T06:08:03.000+02:00;1;18.40 2016-09-01T06:11:25.050+02:00;-1;24.40 sykkel.csv Hver linje representerer en passering og inneholder 3 verdier adskilt med semicolon (;). Første verdi er et tidsstempel på når passeringen skjedde (dato og klokkeslett), andre verdi er enten 1 (nord) eller 1 (sør) og angir retning på sykkelpasseringen, og tredje verdi er hastighet målt på sykkel ved passering (i kilometer per time). Første linje med data (linje 2) sier at en sykkel passerte 1. september 2016 klokken 05:41:33 på vei nordover i en hastighet på 21,80 km/t. Vi kan anta at linjene kommer i den rekkefølgen passeringene har skjedd (at de er sortert på tidsstempel). (a) Lag et Python program som leser inn dataene fra denne fila og lagrer de 3 datasettene i 3 Numerical Python arrays (fra numpy modulen). Altså, et array med tidsstempel, et array med retning, og et array med hastighetene. (b) Regn ut og finn gjennomsnittlig hastighet, minimum hastighet og maksimum hastighet for alle sykkelpasseringene. Finn også antall som har syklet i retning nord og i retning sør. Programmet skal skrive ut resultatene slik: Speed: min = 4.1 average = 16.5291 max = 36.5 Direction: north = 5170 south = 3993 (c) Plot antall passeringer per dag bassert på arrayet med tidsstempel (passeriger for en dag kommer etter hverande i fila). Plottet skal se ut omtrent slik hvis vi antar i overkant av 9000 paseringer på 30 dager: 500 400 300 200 100 0 T F L S M T O T F L S M T O T F L S M T O T F L S M T O T F (Hint: I plottet over har vi brukt matplotlib.pyplot sin plottefunksjon bar og ikke plot som vi vanligvis bruker. De brukes på samme måte. Eneste forskjellen er at vi med bar får søylediagram og ikke en vanlig graf. Dere kan fritt velge om dere bruker bar eller plot. Jeg har også valgt å legge inn første bokstav i ukedag under hver søyle. Det er ikke nødvendig i deres løsning av oppgaven.) 8

Oppgåve 6 15% I denne oppgaven skal vi lage en klasse Vec2D som kan representere vektorer i et plan. Hvis vi har to vektorer (a, b) og (c, d) så har vi disse matematiske operasjonene på vektorene i et plan: (a, b) + (c, d) = (a + c, b + d) (1) (a, b) (c, d) = (a c, b d) (2) (a, b) = (c, d) if a = c and b = d (3) (a) Lag klassen Vec2D i Python som kan representere vektorer i et plan. Klassen skal kunne brukes slik for å lage en vektor v1 som representerer vektoren (1, 2) i et plan: v1 = Vec2D(4, 6) (Hint: du må blant annet lage metoden init i klassen Vec2D.) (b) Utvid klassen Vec2D med metodene str og repr som gir to ulike tekststreng-representasjoner av en vektor (et objekt av klassen Vec2D). Disse benyttes av henholdsvis Python sin str og Python sin repr funksjon. Objekter av klassen Vec2D kan da benyttes sammen med Python sin print funksjon. For eksempel vil print(v1) # Funksjonen print vil i dette tilfellet utføre str(v1) print(repr(v1)) gi utskrift (4, 6) Vec2D(4, 6) (c) Utvid klassen Vec2D med metoder som gjør at vi kan legge sammen (addere) og trekke fra (subtrahere) to vektorer, sjå (1) og (2) ovanfor. Med to vektorer v1 og v2 vil vi for eksempel kunne lage to nye vektorer v3 og v4 på denne måten: v1 = Vec2D(4, 6) v2 = Vec2D(3, 2) v3 = v1 + v2 v4 = v1 - v2 print("v3 = v1 + v2 = %s + %s = %s" % (str(v1), str(v2), str(v3))) print("v4 = v1 - v2 = %s - %s = %s" % (str(v1), str(v2), str(v4))) Denne koden vil gi følegnde utskrift: v3 = v1 + v2 = (4, 6) + (3, 2) = (7, 8) v4 = v1 - v2 = (4, 6) - (3, 2) = (1, 4) (d) Utvid klassen Vec2D med metoder som gjør at vi kan sjekke om to vektorer er like eller ulike, sjå (3) ovanfor. Uttrykket v3 == v4 skal kunne brukes for å sjekke at vektor v3 er lik vektor v4, og uttrykket v3 == (v2 + v4) skal kunne brukes for å sjekke at vektor v3 er lik summen av vektor v2 og vektor v4. Uttrykket v3!= v4 skal kunne brukes for å sjekke at vektor v3 ikke er lik vektor v4, og uttrykket v3!= (v2 + v4) skal kunne brukes for å sjekke at vektor v3 ikke er lik summen av vektor v2 og vektor v4. For eksempel vil gi utskrift print("v3 == v4 -> %s; v3!= v4 -> %s" % (str(v3 == v4), str(v3!= v4))) print("v3 == (v2 + v4) -> %s; v3!= (v2 + v4) -> %s" % ( str(v1 == (v2 + v4)), str(v1!= (v2 + v4)))) v3 == v4 -> False; v3!= v4 -> True v3 == (v2 + v4) -> True; v3!= (v2 + v4) -> False 9