Merk at 5 av poengene i denne laben gis ved deltakelse i gruppeaktivitet i din gruppetime i uke 35. De resterende 20 poeng gis ved innleveringer av oppgavene du ser på denne siden i CodeGrade. Du finner CodeGrade ved å gå til «Oppgåver» på mitt.uib.

Oppavene er delt inn i 3 kategorier:

  • Oppvarmingsoppgavene gir 1 poeng hver, og er som regel små og enkle oppgaver tett knyttet til kursnotatene eller noe vi har gjort på forelesning.
  • Kjerneoppgavene gir 3 poeng hver.
  • Mestringsoppgavene gir 1 poeng hver. Hvis du løser dem beviser du samtidig at du virkelig har mestret læringsmålene for denne uken.

Det finnes oppgaver for mer enn 20 poeng til sammen. Hvis du løser oppgaver verdt mer enn 20 poeng, vil poengene dine fra CodeGrade bli klippet ned igjen til 20 poeng.


Kursnotater for tema som er nye i denne laben:

Gruppeaktivitet

Denne oppgaven innebærer fysisk oppmøte i gruppetimen din. Du vil få 5 poeng godkjent ved å delta aktivt i gruppeaktiviteten.

Hei

I filen hei.py, skriv kode som produserer akkurat følgende output i terminalen:

Hei, det er meg, datamaskinen.
Hyggelig å se deg her.
Lykke til med INF100!
Addisjonskalkulator

Forberedeleser: les kursnotatene for å komme i gang, særlig avsnittet om å lese input fra terminalen.

I filen addition.py, be brukeren om 2 tall, og skriv ut summen av tallene. Eksempelkjøring:

Oppgi et tall:
2
Oppgi et tall til:
3
Summen av tallene er 5
Twistdeling

Du og vennene dine har vert med i en quiz og har vunnet en pose med twist. På posen står det hvor mange biter det er i posen. Du vil finne ut hvor mange biter som er til overs når alle på laget har fått like mange biter.

I filen twist.py, skriv kode som ber brukeren om å oppgi hvor mange biter det er i posen, og hvor mange dere er på laget. Programmet skal så skrive ut hvor mange biter hver av dere får, og hvor mange biter som blir til overs. Pass på å skrive ut svaret slik som eksempelet viser.

Eksempelkjøring:

Hvor mange er dere på laget?
4
Hvor mange twist er det i posen dere vant?
21
Det blir 5 twist til hver, og det blir 1 twist til overs.

Les om heltallsdivisjon og modulo i notatene om operatorer.

Typedetektiv

Du skal finne ut hvilken type forskjellige uttrykk har i python:

a = 5
b = 5.0
c = 5 / 1
d = 5 // 1
e = "5"
f = 5 == 5.0
g = True + True
h = int("42")
i = int("42.0")

For hvert uttrykk a til i finn ut hvilken type det har uten å kjøre kode for det. Så skal du skrive typene i en python fil typedetective.py for hvert variabelnavn. Hvis uttryket utløser en error, skriver du "error" som verdi. Eller skriver du typen direkte som verdi, for eksempel k = int. Typene du kan bruke er int, float, str, bool og "error".

typedetective.py skal se sånn ut:

a = #type of a
b = #type of b
c = #type of c
d = #type of d
e = #type of e
f = #type of f
g = #type of g
h = #type of h
i = #type of i
Robotverkstedet

Koden til oppstartsrutinen av en robot ser sånn ut:

print("Loading firmware from C:\robots\newton\tools")
print('I'm online!")
print("SYSTEM CHECK
Arms: OK
Legs: OK")

men oppstartsrutinen er ødelagt! Rett den opp slik at den kjører og skriver ut nøyaktig dette:

Loading firmware from C:\robots\newton\tools
I'm online!
SYSTEM CHECK
Arms: OK
Legs: OK

Lagre den rette oppstartsrutinen i filen broken_robot.py.

Pytagoras

I filen distance.py, skriv kode som ber brukeren om to punkter i et koordinatsystem, og som regner ut avstanden mellom de to punktene. Programmet skal så skrive ut avstanden mellom punktene til terminalen.

Du kan anta at brukeren alltid vil oppgi koordinat-verdiene som heltall (det er altså helt greit hvis programmet ditt krajser hvis brukeren oppgir noe annet).

  1. Spør brukeren om x-koordinaten til første punkt. Lagre resultatet i en ny variabel.
  2. Spør brukeren om y-koordinaten til første punkt. Lagre resultatet i en ny variabel.
  3. Spør brukeren om x-koordinaten til andre punkt. Lagre resultatet i en ny variabel.
  4. Spør brukeren om y-koordinaten til andre punkt. Lagre resultatet i en ny variabel.
  5. Regn ut avstanden mellom de to punktene, og lagre resultatet i en ny variabel.
  6. Skriv ut avstanden mellom punktene til terminalen.

En kjøring av programmet kan se slik ut (brukerens input er markert med fet skrift):

x1 = 1
y1 = 2
x2 = 3
y2 = 4
Avstanden mellom (1, 2) og (3, 4) er 2.8284271247461903

For å regne ut avstanden mellom to punkter, kan du bruke formelen

Illustrasjon av avstandsformelen d=sqrt((x1-x2)^2 + (y1-y2)^2)

Husk å omgjøre strengen du får fra brukeren til et flyttall før du gjør noen matematiske utregninger.

Eksponentiering/potenser i Python:

result = 3 ** 2
print(result) # 9 

Husk også at å opphøye i 0.5 er det samme som kvadratrot

result = 9 ** 0.5
print(result) # 3.0
Robotjakt

Vi overvåker en flokk med selv-byggende roboter. Vi vet at i denne spesielle robot-flokken er det slik at for hver tiende robot, så vil det hvert år bli laget en ny robotbaby. For eksempel, hvis det er 97 roboter i flokken om våren, så vil det bli laget 9 robotbabyer den sommeren (siden 97 // 10 blir 9).

Siden robotene ikke går i stykker av seg selv, er den eneste måten å hindre eksponensiell vekst av roboter å avholde en regulert jakt hvert år. Fordi myndighetene er ekstremt tidlig ute, vet vi allerede nå hvor mange fellingstillatelser de vil gi de neste tre årene. Hvor mange roboter vil det være i flokken om tre år?

Her er et program som regner ut dette, men det har flere feil. Identifiser feilene og rett dem opp. Svaret leverer du i filen robot_hunt.py.

print('Hvor mange roboter er det nå?')
population = int(input())
hunting_licenses = [10, 7, 18]
year = 0

# Første år
population = population + population // 10  # til sommeren
population = population - hunting_licenses[year]  # til høsten
year = year + 1
print(f'Om {year} år er det {population} roboter i flokken')

# Andre år
population += population // 7
population -= hunting_licenses[year]
year += 1
print('Om {year} år er det {population} roboter i flokken')

# Tredje år
population += population + hunting_licenses[year]
population -= population // 10
year + 1
print(f'Om {year} år er det {population} roboter i flokken')

Forventet oppførsel for korrekt program:

Hvor mange roboter er det nå?
100
Om 1 år er det 100 roboter i flokken
Om 2 år er det 103 roboter i flokken
Om 3 år er det 95 roboter i flokken
Hvor mange roboter er det nå?
50
Om 1 år er det 45 roboter i flokken
Om 2 år er det 42 roboter i flokken
Om 3 år er det 28 roboter i flokken
Semesterbudsjett

Du skal finne ut hvor mye penger du har igjen til kaffe hver måned.

Skriv et program semester_budget.py som spør brukeren om budsjettet og de månedlige utgiftene til bolig og mat, og som regner ut hvor mange kopper kaffe du har råd til.

Pass på at utskriften ser nøyaktig ut som i eksempelet:

Hva er budsjettet ditt?
7000
Hvor mye bruker du på bolig?
3500
Hvor mye bruker du på mat?
3000
Det er 500 NOK igjen, det er nok til 11 kopper kaffe!

Kaffeprisen skal ligge i en variabel som er lett å endre. Ved innlevering skal denne variabelen være 45.

Lånekalkulator kodesporing

Oppgaven baserer seg på at du har installert Python -utvidelsen til Visual Studio Code. Vi skal benytte oss av debugger-funksjonen som finnes i Visual Studio Code for å spore kode.

Begynn med å kopiere koden under til en fil som heter mortgage.py.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# This is a script that use Python to calculate monthly cost of a loan.

# Input
house_price = 2_000_000
deductible = 300_000
yearly_interest_rate_pct = 6.44
years = 25
monthly_fee = 65


# Computation
loan = house_price - deductible
months = years * 12

yearly_rate = yearly_interest_rate_pct / 100
monthly_rate = yearly_rate / 12

discount_factor = (1 - (1 + monthly_rate) ** -months) / monthly_rate
monthly_term_amount = loan / discount_factor + monthly_fee
monthly_term_amount = round(monthly_term_amount, 2)


# Output
print(f'Monthly term amount: {monthly_term_amount}')
Oppvarming
  • Kjør programmet og se hvor mye du må betale hver måned hvis du skal kjøpe en bolig til 2 millioner kroner, med 300 000 i egenkapital, 6.44% rente og 25 års nedbetalingstid. Sjekk f. eks. om det stemmer overens med lånekalkulatoren til Nordea.

  • Sett et breakpoint på linje 4 og kjør programmet i debug-modus. Klikk deg gjennom programmet linje for linje med «step over» -knappen, og observer hvordan variablene endrer seg underveis.

  • Økonomene sier du må ta hensyn til at renten stiger med fire prosentpoeng. Hva blir i så fall den månedlige kostnaden?

Selve oppgaveteksten

Endre input-seksjonen av programmet slik at

  • huset koster 1.5 millioner,
  • egenkapitalen er 280 000,
  • renten er 7.5%, og
  • nedbetalingstiden er 30 år.

Hvilken verdi får variabelen discount_factor?

Ta et skjermbilde som du navngir discount_factor.png eller discount_factor.jpg. Bildet skal vise:

  • et skjermbilde av Visual Studio Code, der
  • debug-modus er aktivt, og
  • variabelen discount_factor med tilhørende verdi er synlig i variabel-vinduet.

Å ta et skjermbilde er en viktig life skill :)

Mac

  • Cmd + Shift + 4, trekk deretter en rute rundt det du vil ta bilde av. Skjermbilet lagres på skrivebordet ditt og kommer i .png -format. Så er det bare å endre navnet på filen og levere inn.

Windows 11

  • Søk etter applikasjonen «Snipping Tool», klikk på «New» og velg området du vil ta bilde av. Når du har valgt et område, velg «Save As» for å lagre (filtype png). Så er det bare å levere inn.

Det finnes mange alternative metoder, så spør gjerne internett om hjelp om du ikke får til akkurat denne.

Nå som du skal lære programmering er det også på tide at du blir en voksen datamaskinbruker og slår på visning av filendelser.

Mac:

  • Åpne Finder, velg «Settings» i menyen. Under «Advanced», velg «Show all filename extensions».

Windows:

  • Åpne Filutforskeren, gå til «View» -menyen, og under «Show» marker «File name extensions».

Fargemix

Koden i denne filen skal skrives i filen fargemix.py.

I denne oppgaven skal du ikke benytte deg av streng-operasjoner som beskjæring (slicing) eller indeksering, den eneste bruken av strenger er for å ta i mot input fra brukeren. Du skal heller ikke benytte deg av lister, løkker eller if-setninger. Du kan derimot bruke de matematiske operatorene +, -, *, /, // (heltallsdivisjon) og % (modulo) og den innbygde funksjonen for avrunding round().

En farge kan representeres som en RGB -verdi (les mer i avsnittet om farger i notatene om grafikk). En RGB-verdi består av tre heltall mellom 0 og 255, som representerer mengden av rød, grønn og blå farge i fargen. For eksempel er fargen rød representert som (255, 0, 0), fargen grønn er representert som (0, 255, 0), og fargen blå er representert som (0, 0, 255). Vi kan representere andre farger ved å blande disse tre fargene sammen i ulike blandingsforhold, for eksempel (255, 128, 0) gir en oransje farge.

I denne oppgaven bruker vi en litt utradisjonell representasjon for RGB: vi representerer hver farge som ett heltall med (opptil) ni siffer. De tre første sifrene representerer mengden rød farge, de tre neste sifrene representerer mengden grønn farge, og de tre siste sifrene representerer mengden blå farge. For eksempel er fargen rød representert som tallet 255000000, fargen grønn er representert som tallet 000255000 (eller bare 255000), og fargen oransje er representert som tallet 255128000.

Oppgaven vi skal utføre er å blande sammen to farger. Programmet skal lese følgende tre linjer som input fra brukeren:

  • en farge colA i formatet beskrevet over
  • en farge colB i formatet beskrevet over
  • et flyttall rationB mellom 0.0 og 1.0 som beskriver hvor stor andel av colB som skal være i den nye fargen. For eksempel, hvis colA er rød og colB er grønn, og rationB er 0.75, skal den nye fargen være en blanding av 25% rød og 75% grønn.

Programmet skal så regne ut den nye fargen som oppstår når de to fargene blandes sammen, og skrive ut den nye fargen til terminalen på en egen linje. For eksempel:

Grunnfarge:
255000000
Målfarge:
255255000
Andel målfarge:
0.25
255064000
Illustrasjon av eksempel over
Grunnfarge:
255000000
Målfarge:
255255000
Andel målfarge:
0.75
255191000
Illustrasjon av eksempel over
Grunnfarge:
200198000
Målfarge:
100190100
Andel målfarge:
0.25
175196025
Illustrasjon av eksempel over
  1. Les inn input fra brukeren og konvert til heltall og flyttall ved hjelp av int() og float().
  2. Bruk heltallsdivisjon og modulo for å separere ut verdiene for R, G og B for hver av de to fargene. PS: for å finne de siste tre sifrene i et tall kan du bruke % 1000.
  3. Regn ut de nye verdiene for R, G og B ved å blande sammen de to verdiene (for eksempel, hvis rationB er 0.25, skal den nye verdien for R være 0.75 * colA_R + 0.25 * colB_R).

Husk å runde av til nærmeste heltall. Til slutt:

  1. Regn ut den nye verdien ved å multipliserer R-verdien med 1000000 og så summere inn G multiplisert med 1000 og til slutt B.
Nærmeste busstopp

Byen Veiby består av én uendelig lang gate som heter «Byveien». Alle husene i byen har et husnummer, og det første huset er i nummer 0. Infrastrukturavdelingen i Veiby kommune har bestemt at det skal finnes et busstopp ved hvert husnummer som er delelig med 7. Det er altså busstopp ved husnummer 0, 7, 14, 21, 28 og så videre.

I filen busstop.py, skriv et program som ber brukeren om et husnummer, og som skriver ut nummeret til nærmeste busstopp.

Eksempelkjøring 1:

Husnummer:
16
Nærmeste busstopp er ved nummer 14

Eksempelkjøring 2:

Husnummer:
22
Nærmeste busstopp er ved nummer 21

Eksempelkjøring 2:

Husnummer:
139
Nærmeste busstopp er ved nummer 140

Det er ikke nødvendig å bruke if-setninger eller løkker for å løse denne oppgaven. Det er fullt mulig å løse den ved vanlig aritmetikk (se kursnotatene om operatorer).

  • Legg merke til at busstopp-nummer x befinner seg ved husnummer 7 * x. Så hvis vi bare klarer å finne ut hva busttopp-nummeret x er, så er det lett å regne seg frem til husnummeret vi skal skrive ut.

Haversine

I filen haversine.py, skriv et program som ber brukeren oppgi to punkter på en globus oppgitt med lengdegrad og breddegrad. La programmet så skrive ut avstanden mellom punktene.

Eksempelkjøring (brukerens input er markert med fet skrift):

Coordinate 1
longitude = 5.32938628135696
latitude = 60.38151104034819

Coordinate 2
longitude = 5.342659324608178
latitude = 60.394646630412296

The distance (m) is 1632.5513825024832

For å regne ut avstanden mellom punktene, må du bruke Haversine -formelen, som regner ut avstanden mellom to punkter samtidig som den tar jordklodens krumming med i betraktningen. I denne formelen er avstanden \(d\) er gitt ved

$$d = 2R \cdot \arcsin\left(\sqrt{\left(\sin^2\left(\frac{\varphi_2 - \varphi_1}{2}\right) + \cos\varphi_1 \cos\varphi_2 \sin^2\left(\frac{\lambda_2 - \lambda_1}{2}\right)\right)}\right)$$

hvor

  • \(R\) er jordens radius i meter (ca 6371000)
  • \(\lambda_1\) og \(\varphi_1\) er henholdsvis lengdegrad og breddegrad i radianer for første punkt.
  • \(\lambda_2\) og \(\varphi_2\) er henholdsvis lengdegrad og breddegrad i radianer for andre punkt.
from math import radians

lat_deg = 5.342659324608178
lat_rad = radians(lat_deg)

print(f'{lat_deg} grader er {lat_rad} radianer')

For å opphøye et tall i et annet, kan vi benytte ** -operatoren.

x = 4
y = x**2
print(y)  # 16

Å finne kvadratrot er det samme som å eksponentiere i 0.5

x = 16
y = x**0.5
print(y)  # 4.0

Å finne kvadratrot kan også gjøres med å importere sqrt -metoden fram math -modulen.

from math import sqrt

x = 16
y = sqrt(x)
print(y)  # 4.0
from math import sin, cos, asin

v = 0.05

a = sin(v)
b = cos(v)
c = asin(v)

print(a, b, c)

Husk også at \(\sin^2(x)\) er det samme som \((\sin(x))^2\).


Prøv selv først, før du studerer dette hintet alt for nøye! Husk også emnets policy: du må skrive hver eneste linje du leverer selv! La det gå 1 minutt fra du har lukket hintet til du skriver din egen løsning, slik at det ikke blir avskrift uten forståelse.

from math import sin, cos, asin, sqrt, radians

# Berlin
lat1 = 52.52
lon1 = 13.405

# Paris
lat2 = 48.8566
lon2 = 2.3522

earth_radius = 6371000  # meter
phi1 = radians(lat1)
lam1 = radians(lon1)
phi2 = radians(lat2)
lam2 = radians(lon2)

a = sin((phi2 - phi1) / 2)**2 + cos(phi1) * cos(phi2) * sin((lam2 - lam1) / 2)**2
result = 2 * earth_radius * asin(sqrt(a))
print(result)
Haiku

I denne oppgaven skal vi spørre brukeren om en haiku og siden printe den på en fin måte til terminalen.

I filen haiku.py, skriv kode som gjør følgende, i oppgitt rekkefølge (merk at noen av de beskrevne punktene her krever mer enn en enkelt linje med Python-kode):

  1. Spør brukeren om første raden i en haiku. Lagre resultatet i en ny variabel.
  2. Spør brukeren om andre raden i en haiku. Lagre resultatet i en ny variabel.
  3. Spør brukeren om tredje raden i en haiku. Lagre resultatet i en ny variabel. Nå burde du ha tre variabeler.
  4. Finn lengden av hver linje (bruk len())
  5. Finn lengden av den lengste linjen (bruk max())
  6. Skriv ut en tom linje
  7. Skriv ut toppen av haiku-rammen. Lengden av den er basert på lengden av den lengste linjen, som vi fant i trinn 5, men pluss fire til. Vi trenger fire til fordi rammen skal gå på utsiden på begge sider (se eksempelkjøring nedenfor).
  8. Skriv ut hver av de tre linjene. Hver linje skal begynne med @ + et passende antall mellomrom. Deretterer følger selve teksten, og til slutt et nytt mellomrom og en ny alfakrøll. (Hvor mange mellomrom er passende for hver linje? )
  9. Skriv ut bunnen av rammen.

Eksempelkjøring:

Første raden:
What a pleasure to
Andre raden:
right justify a haiku
Tredje raden:
as an exercise

@@@@@@@@@@@@@@@@@@@@@@@@@
@    What a pleasure to @
@ right justify a haiku @
@        as an exercise @
@@@@@@@@@@@@@@@@@@@@@@@@@
  • Husk at strenger kan gjentas flere ganger ved help av *. For eksempel vil "bar" * 2 evaluere til "barbar".