Lab12
I denne lab’en er det kun repetisjonsoppgaver. Lab’en vil ikke bli rettet, men for noen av oppgavene er det tester på CodeGrade slik at du kan teste deg selv.
- Oppgave 1:
filter_high_temperatures
(les fra fil, håndtere strenger, skriv til fil) - Oppgave 2:
first_letter_last_word
(les fra fil, håndtere strenger) - Oppgave 3:
spise_sammen
(håndtere input fra terminalen) - Oppgave 4:
sum_of_column
(lese fra fil, csv, 2D-lister, løkker) - Oppgave 5: akvakulturregisteret (lese fra fil, csv, 2D-lister, telling i løkke, matplotlib)
- Oppgave 6:
weekly_pay
(betingelser, matematikk) - Oppgave 7:
fastest_runner
(les fra fil, håndtere strenger) - Oppgave 8:
tid_til_nok_egenkapital
(input fra terminal, løkker, matematikk) - Oppgave 9: endre fargen på prikken (grafikk)
Oppgave 1
I filen uke_12_oppg_1.py, skriv en funksjon som heter filter_high_temperatures
med parametre:
path_input
, en filsti til en eksisterende fil hvor hver linje inneholder først en dag, deretter et mellomrom, og så en temperatur. For eksempel, temperatures.txt.path_output
, en filsti til en fil som skal opprettes, ogthreshold_temp
, et flyttall som representerer en temperatur.
La funksjonen åpne filen path_input
, gå gjennom linjene i filen og lager en ny fil path_output
hvor kun de linjene der temperaturen er minst threshold_temp
er inkludert. Om ingen dager har en temperatur som er minst threshold_temp
så skal path_output
være en tom fil.
print("Tester filter_high_temperatures... ", end="")
filter_high_temperatures("temperatures.txt", "high_temps.txt", 23.5)
expected_result = """\
Monday 23.5
Wednesday 24.0
Thursday 23.9
Sunday 23.9
"""
with open("high_temps.txt", "rt", encoding='utf-8') as f:
actual_result = f.read()
assert(expected_result == actual_result)
print("OK")
NB
Når du laster opp på CodeGrade ha med følgende linje kode på i bunn. Det er for at CodeGrade-testen skal fungere.
filter_high_temperatures("temperatures.txt", "high_temps.txt", 23.5)
Oppgave 2
I filen uke_12_oppg_2.py, skriv en funksjon som heter first_letter_last_word(path)
som åpner en fil med den gitte filstien, og returnerer en streng som består av den første bokstaven til det siste ordet i hver linje. Tomme linjer ignoreres.
Testkjøring med askeladden.txt:
print("Tester first_letter_last_word... ", end="")
assert("vlf" == first_letter_last_word("askeladden.txt"))
# Forklaring:
# Siste ord i første linje er 'vanns.' Første bokstav i dette ordet er 'v'
# Siste ord i andre linje er 'landet.' Første bokstav i dette ordet er 'l'
# Siste ord i tredje linje er 'fleste.' Første bokstav i dette ordet er 'f'
print("OK")
Oppgave 3
I filen uke_12_oppg_3.py skriv en funksjon spise_sammen()
som først viser en enkel kafémeny (se eksempelkjøringer nedenfor), spør
bruker for å angi menu nummeret, og enten skriver ut at den aktuelle menyen kommer snart ELLER skriver ut
en feilmelding om at valget deres ikke var gyldig.
Eksempelkjøringer:
spise_sammen()
Meny
1. Stekt uer med blomkålpuré.
2. Piggvarfilet med ertepuré.
3. Boknatorsk med kremstuede.
4. Steinbit, sjøkreps og snøkrabbe.
5. Norske oster med marmelade.
Hvilket nummer vil du bestille? 5
Norske oster med marmelade kommer straks!
spise_sammen()
Meny
1. Stekt uer med blomkålpuré.
2. Piggvarfilet med ertepuré.
3. Boknatorsk med kremstuede.
4. Steinbit, sjøkreps og snøkrabbe.
5. Norske oster med marmelade.
Hvilket nummer vil du bestille? 6
Beklager, det er ikke et gyldig valg!
Oppgave 4
I filen uke_10_oppg_4.py, skriv en funsjon som heter sum_of_column(path, col)
som returnerer summen av verdiene fra den oppgitte kolonnen i csv-filen med filsti path
. Ikke inkluderer verdier i summen som ikke er flyttall, og ikke inkluder rader som har færre en col
kolonner. Kolonne 0
er den første kolonnen fra venstre i csv-filen.
Eksempelkjøringer med foo.csv, Statistikk_Tilsyn_ar.csv og airport-codes.csv
print("Tester sum_first_col... ", end="")
assert(42.0 == sum_of_column("foo.csv", 0))
assert(95.0 == sum_of_column("foo.csv", 1))
assert(0.0 == sum_of_column("foo.csv", 2))
assert(76363.0 == sum_of_column("Statistikk_Tilsyn_ar.csv", 1))
assert(46007.0 == sum_of_column("Statistikk_Tilsyn_ar.csv", 2))
assert(5024518.0 == sum_of_column("airport-codes.csv", 3))
print("OK")
Oppgave 5
I denne oppgaven skal vi bruke datafilen Akvakulturregisteret.csv.
DEL A
I filen uke_12_oppg_5a.py lag et program som skriver ut en alfabetisk liste over antall oppdrettsanlegg for hver art.
Abbor: 8
Acartia tonsa **(oppdrett): 4
Akkar: 1
Amerikansk hummer: 2
Arctic sea ice amphipod *: 1
Arktisk knurrulke: 1
Berggylt: 58
...
Bruk et oppslagsverk (dict) for å telle hver art; bruk en løkke over hver rad i filen.
Første gangen du ser en art, opprett en ny nøkkel med artsnavnet i oppslagsverket og gi den verdien 1
Dersom nøkkelen derimot var i oppslagsverket fra før, øk verdien dens med 1
For å finne artene i ‘alfabetisk’ rekkefølge, bruk
sorted
-funksjonen og gi listen med nøklene fra oppslagsverket som argument.
DEL B
I filen uke_12_oppg_5b.py, ta utgangsunkt i en kopi av akvakulturer.py fra forelesning, og endre den slik at du tegner laks med én farge, ørret (inkludert allet typer fisk som inneholder “ørret” som en del av navnet) med en annen farge, og resten i en tredje farge.
DEL C
I filen uke_12_oppg_5c.py, ta utgangsunkt i en kopi av akvakulturer.py fra forelesning (eller eventuelt koden din fra oppgave B), og endre den slik at oppdrettsanlegg med stor kapasitet vises som større prikker enn anlegg med liten kapasitet. Ta utangspunkt i kolonnene LOK_KAP og LOK_ENHET:
- Ikke inkluder anlegg som oppgir kapasiteten sin i noe annet enn tonn (TN)
- Ikke inkluder anlegg med kapasitet under 2 tonn.
- La størrelsen være bestemt som en funksjon av kapasitetet: jo større kapasitet, jo større prikk. Velg selv hvordan du ønsker å skalere prikkene i forhold til hverandre.
Oppgave 6
RandomFirma AS trenger et program for å beregne hvor mye de skal betale sine timeansatte. Arbeidsmiljøloven krever at ansatte får lønn for 1,5 time for alle timer over 40 som de jobber i løpet av en enkelt uke. For eksempel, hvis en ansatt jobber 45 timer, får de 5 timer overtid, til 1,5 ganger grunnlønnen. Regjeringen har innført minstelønn i bransjen dette firmaet operer i, og minstlønnen er 200 kr. RandomFirma AS krever at en ansatt ikke jobber mer enn 60 timer i en uke.
Her er regler oppsummert:
- En ansatt får betalt (arbeidstimer) × (grunnlønn), for hver time inntil 40 timer.
- For hver time over 40 får de overtid = (grunnlønn) × 1,5.
- Grunnlønnen må ikke være lavere enn minstelønnen (200 i timen).
- Antall timer kan ikke være større enn 60.
I filen uke_12_oppg_6.py skriv en funksjon weekly_pay(hourly_rate, hours)
som tar grunnlønn og antall timer en anstatt har jobbet som parametere, og returnerer totallønnen eller en error melding om utbetalingskravene er oppflyt. Error meldingene er Minstelønnskravet er ikke oppfylt
eller En ansatt jobber mer enn 60 timer
.
print("Tester weekly_pay... ", end="")
assert(10_000 == weekly_pay(1000, 10))
assert(40_000 == weekly_pay(1000, 40))
assert(20_000 == weekly_pay(500, 40))
assert(41_500 == weekly_pay(1000, 41))
assert(70_000 == weekly_pay(1000, 60))
assert("En ansatt jobber mer enn 60 timer" == weekly_pay(1000, 61))
assert("Minstelønnskravet er ikke oppfylt" == weekly_pay(100, 40))
print("OK")
Oppgave 7
En gruppe UiB-venner bestemmer seg for å løpe Fjordkraft Bergen City Marathon. Deres navn og tider (i minutter) kan lastes ned her: marathon.txt. I filen uke_12_oppg_7.py skriv en funksjon fastest_runner(path)
som returnerer navnet på den raskeste løperen og antall minutter vedkommende har brukt som en string.
print("Tester fastest_runner... ", end="")
assert "Isak 243" == fastest_runner("marathon.txt")
print("OK")
Oppgave 8
Du er uteksaminert fra UiB og har nå en flott jobb! Du flytter til London og bestemmer deg for at du vil begynne å spare for å kjøpe hus. Siden boligprisene er svært høye i London, innser du at du må spare i flere år før du har råd til å skaffe deg egenkapital. Vi skal finne ut hvor lang tid det vil ta deg å spare nok egenkapital gitt følgende forutsetninger:
- Egenkapital er 0,25 (25%) av total kostnad.
- Beløpet du har spart så langt er null.
- Anta at sparingene dine tjener en årlig rente \(r = 0.04\) (4%).
I filen uke_12_oppg_8.py skriv en funksjon tid_til_nok_egenkapital()
som ber brukeren om å angi følgende variabler
- årslønn.
- Prosentandel av lønnen som skal spares.
- Total kostnaden for drømmeboligen.
og beregner hvor mange måneder det vil ta deg å spare opp nok egenkapital. Her kan du anta at det etter hver måned blir utbetalt r/12 i renter av det som står på konto.
tid_til_nok_egenkapital()
Hva er årslønn? 500000
Hvor mange prosent spares? 20
Hvor mye koster boligen? 3000000
Det tar 79 måneder å spare nok egenkapital
Oppgave 9
I denne oppgaven skal vi bruke uib_inf100_graphics
for å lage et program hvor brukeren kan forandre fargen på en prikk ved å trykke på piltastene.
Les deg gjerne opp på farger i kursnotatene om grafikk før du setter i gang.
En farge er i RGB-systemet representert av tre tall som beskriver lysintensiteten til rødt, grønt og blått lys. Hvert tall er mellom 0 og 255. I programmet vi skal lage i denne oppgaven, skal du tegne en prikk midt på skjermen. Brukeren skal kunne trykke på tastaturet for å endre fargen på prikken
- trykker brukeren på pil opp, økes mengden rød,
- trykker brukeren på pil ned reduseres mengden rød,
- trykker brukeren på pil høyre økes mengden grønn,
- trykker brukeren på pil venstre reduserers mengden grønn,
- trykker brukeren på
a
økes mengden blå, - trykker brukeren på
z
reduseres mengden blå.
Ingen farge-verdier skal kunne være mindre enn 0 eller høyere enn 255.
Det ferdige programmet skal se omtrent slik ut:
La modellen (app) består av fire variabler: r, g, b (tallverdier) og message (en streng). Initialiser dem i app_started.
La redraw all tegne teksten og en runding midt på skjermen. La fargen være bestemt av r, g og b fra app.
La key_pressed håndtere tastetrykk som beskrevet i oppgaveteksten. I programmet over endres verdien med 10 for hvert tastetrykk.
Bonus:
- Ha ulike modus som bestemmer hvor store steg du tar hver gang. Endre modus ved å trykke på space.
- Ha ulike prikker, der du kan klikke på hvilken prikk du nå skal endre fargen til. Vis hvilken prikk som er valgt f. eks. ved å la den ha en spesiell farge på outline.