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

I filen uke_12_oppg_1.py, skriv en funksjon som heter filter_high_temperatures med parametre:

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:

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:

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:

I filen uke_12_oppg_8.py skriv en funksjon tid_til_nok_egenkapital() som ber brukeren om å angi følgende variabler

  1. årslønn.
  2. Prosentandel av lønnen som skal spares.
  3. 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

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: