Obligatorisk oppgave 7
IN1000, våren 2026
Innleveringsfrist: onsdag 8. april, kl. 23:59
Du kan også få godkjent obligen ved å jobbe med den på gruppetimene - se mer info om dette på emnesidene.
Nettskjema for egenmelding ved behov for utsatt frist (max 3 dager) finner du her.
Filer som skal leveres:
- oblig7.py
- test_dato.py
- test_fotball,py
- teori.txt
- bildefil (teori3a.png / teori3a.jpg / teori3a.pdf)
- begreper.txt
OBS: Det er en del mer programmering i denne oppgaven enn i oblig 6, som handlet mest om å forstå. Sørg for at du gir deg selv god nok tid til å skrive all koden du skal levere.
Prøv deg gjerne på teorioppgavene 3 og 4 før du har løst de andre oppgavene (men etter å ha lest hele denne teksten!) – det vil gjøre programmeringen enklere. Unntak: Jobber du med obligen på gruppetime for å få godkjent der, bør oppgave 1 og 2 prioriteres!
Når du har programmert oppgave 1 og 2, kan du gå tilbake og eventuelt forbedre svarene dine på oppgave 3 og 4. Tegning av datastrukturer gir oss bedre forståelse av hva som skjer under utføring av et program, og er nyttig for å huske i detalj hvilke variabler, objekter og referanser vi opererer på. Dette er spesielt nyttig for å bygge opp en mental modell i starten av faget – men også når man skal arbeide med komplekse datastrukturer senere.
Oppgave 1
Filnavn: oblig7.py, test_dato.py
Implementér ferdig Dato-klassen du brukte prototypen til i oblig 6.
VIKTIG: Prototypene skrev ut en del ting for at vi skulle kunne se i programmet at noe hadde skjedd. Disse print-linjene skal nå fjernes med mindre grensesnittet sier noe annet.
Objekter av typen Dato opprettes med Dato(ddmmåååå) hvor argumentet er:
- ddmmåååå (str), en tekststreng på formatet dd.mm.åååå (d = dag, m = måned, å = år) - for eksempel "01.01.2026"
Objekter av typen Dato har følgende metoder:
| Metode | Parametre | Returverdi | Kommentar |
|---|---|---|---|
| hent_år | - | int | Henter ut året fra datoen |
| dag_er_lik | int | bool | True hvis dagen i datoen er lik tallet, False hvis ikke |
| neste_dag | - | - | Øker verdien av dagen i datoen med 1 |
| endre_til | str | - | Endrer datoen til en ny dato |
Objekter av typen Dato støtter følgende operasjoner:
| Operasjon | Kommentar |
|---|---|
| print(dato) | Skriver ut datoen på formatet dd.mm.åååå |
Bruk test_dato.py som du skrev i oblig 6 til å teste at klassen virker som den skal. Når du kjører programmet ditt fra forrige oblig skal du, når klassen er ferdig og virker som den skal, kunne se at du får følgende utskrift:

Endre nå test_dato.py slik at du lager objektet med datoen 28.02.2026. Nå skal utskriften se slik ut:

Oppgave 2
Filnavn: oblig7.py, test_fotball.py
Implementér ferdig de 4 klassene Lag, Kamp, Runde og Sesong som vi brukte prototypene til i oblig 6.
VIKTIG: Prototypene skrev ut en del ting for at vi skulle kunne se i programmet at noe hadde skjedd. Disse print-linjene skal nå fjernes med mindre grensesnittet sier noe annet.
Utskriften fra test_fotball.py som du laget i oblig 6 skal nå se for eksempel slik ut - du vil helt sikkert få andre resultater i kampene enn disse, og resultatene skal være forskjellige hver gang du kjører programmet:

Det viktigste i denne obligen er hvordan du bygger opp objektene (klassene) slik at de refererer til hverandre på en hensiksmessig måte. Et sentralt spørsmål er om en instansvariabel skal referere til et enkelt objekt, en liste eller en ordbok. Den enkleste måten å få til dette på er å møte opp på forelesning 9 mandag 23. mars eller se opptaket av denne forelesningen i timeplanen.
OBS: Du trenger ikke ha en realistisk simulering i simuler-metoden i Kamp-klassen. Det er nok at denne metoden returnerer et tilfeldig resultat (mellom 0 og 9 mål til hvert lag) som er forskjellig hver gang. Du trenger overhodet ikke ta hensyn til at det beste laget skal score flest mål (men gjør det gjerne om du får det til). Til å få enkle tilfeldige resultater kan du bruke funksjoner som randint eller choice (eller andre) fra random-pakken.
Når koden fra oblig 6 kjører som den skal, legger du til runde 2, 3 og 4 (med 8 kamper hver) som oppført på denne nettsiden. Du kan her se bort fra datoene og resultater av kamper som allerede er spilt (vi skal simulere dem uansett for å kunne sammenligne med de faktiske resultatene og se hvor treffsikker simuleringen er).
Frivillig oppgave 2a:
Kopier innholdet på nettsiden til en tekstfil (kamper_2026.txt) og les inn kampene automatisk til riktig runde, slik at du slipper å legge til kampene manuelt. Dette er betydelig vanskeligere enn det ser ut til, så sørg for å ha god tid om du prøver på dette - det raskeste vil være å legge til kampene for hånd. (Du skal ignorere datoer og resultat for spilte kamper ved innlesing.)
Når de første 4 rundene virker kan du utvide dette til å lese inn hele sesongen (30 runder).
Frivillig oppgave 2b:
Du trenger ikke ha gjort frivillig oppgave 2a først for å gjøre denne, eller motsatt.
Lag en mer realistisk simulering av resultatene - her en noen hint for de som vil prøve å simulere resultater med litt mer presisjon, men dette krever altså en god del research og arbeid å få til:
- Hvordan få sannsynlighetene for hjemmeseier, uavgjort, borteseiers fra ELO-rating
- Hvordan få sannsynlighetene for bestemte antall mål fra gjennomsnitt antall mål
- Hvordan trekke tilfeldig gitt sannsynligheter (gjelder både hjemme/uavgjort/borte og antall mål til hvert lag)
- Å kombinere de tre tingene over er ikke trivielt, men man kan først bestemme seg for resultat (hjemme/uavgjort/borte) ved hjelp av ELO og så finne sannsynlighetene for ulike antall mål for hvert av lagene med Poisson-fordeling, før man til slutt trekker et antall mål med disse sannsynlighetene (vektene).
- Husk at ved hjemmeseier må hjemmelaget score flere mål enn bortelaget (så ikke alle kombinasjoner av antall mål er mulige) - sannsynlighetene for resultatene du kan få da bør ha sum 1 (dvs. 100%).
- En enkel måte å simulere hjemmefordel på er å gi hjemmelaget en økning i ELO-rating, for eksempel 80.
Sesong
Objekter av typen Sesong har følgende metoder:
| Metode | Parametre | Returverdi | Kommentar |
|---|---|---|---|
| les_lag_fra_fil | str | - | Leser inn informasjon om lagene i serien fra filen med dette filnavnet |
| runde | int | Runde | Lager et nytt Runde-objekt som får dette rundenummeret hvis det ikke finnes et slikt objekt fra før. Returnerer Runde-objektet med dette rundenummeret. |
OBS: når du lager les_lag_fra_fil og skal åpne filen med navn i variabelen filnavn, må du gi parameteren encoding følgende verdi for å håndtere æ, ø og å riktig: open(filnavn, encoding="utf-8")
Runde
Objekter av typen Runde opprettes med Runde(sesong) hvor argumentet er:
- sesong (Sesong): Et Sesong-objekt som runden tilhører
Objekter av typen Runde har følgende metoder:
| Metode | Parametre | Returverdi | Kommentar |
|---|---|---|---|
| legg_til | str, str | - | Lager og legger til en nytt Kamp-objekt som hører til et Runde-objekt. Første parameter er hjemmelagets navn, andre parameter er bortelagets navn (disse navnene må finnes i filen som er lest inn til Sesong-objektet Runden tilhører) |
Objekter av typen Runde støtter følgende operasjoner:
| Operasjon | Kommentar |
|---|---|
| for .. in .. | Går gjennom Runde-objektet med en for-løkke og returnerer ett og ett Kamp-objekt |
Kamp
Objekter av typen Kamp opprettes med Kamp(hjemme, borte) hvor argumentene er:
- hjemme (Lag): Laget som har hjemmebane i kampen
- borte (Lag): Laget som har bortebane i kampen
Objekter av typen Kamp har følgende instansvariabler:
| Instansvarabel | Type | Kommentar |
|---|---|---|
| hjemme | Lag | (se ovenfor) |
| borte | Lag | (se ovenfor) |
| hmål | int / None | Antall mål hjemmelaget scoret (eller None dersom kampen ikke er spilt) |
| bmål | int / None | Antall mål bortelaget scoret (eller None dersom kampen ikke er spilt) |
Objekter av typen Kamp har følgende metoder:
| Metode | Parametre | Returverdi | Kommentar |
|---|---|---|---|
| simuler | - | - | Simulerer kampen slik at den får et resultat (hjemmelaget og bortelaget får et antall mål hver) |
Objekter av typen Kamp støtter følgende operasjoner:
| Operasjon | Kommentar |
|---|---|
| print(kamp) | Skriver ut: hjemmelagets navn - bortelagets navn, og hvis kampen er spilt: hjemmelagets mål - bortelagets mål. Eksempler: "Bodø/Glimt - Manchester City 3 - 1" (spilt kamp) "Atlético Madrid - Bodø/Glimt" (ikke spilt kamp) |
Lag
Objekter av typen Lag opprettes med Lag(navn, elo, mål) hvor argumentene er:
- navn (str): Lagets navn
- elo (int): Lagets elo-rating (høyere tall = bedre lag). Ofte et tall mellom 1000 og 2000.
- mål (float): Hvor mange mål dette laget scorer i gjennomsnitt per kamp
Objekter av typen Lag har følgende instansvariabler:
| Instansvarabel | Type | Kommentar |
|---|---|---|
| navn | str | (se ovenfor) |
| elo | int | (se ovenfor) |
| mål | float | (se ovenfor) |
Objekter av typen Lag støtter i tillegg følgende operasjoner:
| Operasjon | Kommentar |
|---|---|
| print(lag) | Skriver ut lagets navn. |
VIKTIG: Prototypene skrev ut en del ting for at vi skulle kunne se i programmet at noe hadde skjedd. Disse print-linjene skal nå fjernes med mindre grensesnittet sier noe annet.
Oppgave 3
Filnavn:
- 3a: digital tegning eller håndtegning fotografert med mobil (teori3a.png, teori3a.jpg eller teori3a.pdf)
- 3b og 3c: teori.txt
a) Lag en tegning av datastrukturen etter at følgende kode er utført:

Bruk notasjonen fra forelesningen i uke 8 (se timeplan), med variabler som fargede bokser, objekter som hvite bokser, og referanser som piler fra en variabel til et objekt. Du kan her anta at filen eliteserien_2026.txt kun inneholder de 4 lagene som spiller de 2 kampene oppgitt i figuren.
b) Klassen Sesong kunne lest inn filen med lag i konstruktøren, det vil si ved opprettelsen av et nytt Sesong-objekt. Ser du noen fordel ved å ikke lese inn filen med lag i konstruktøren?
c) Parameteren til metoden runde i klassen Sesong er en int (et heltall). Hvilken annen type ville det vært naturlig å velge, og hvilken forskjell ville det gjort?
Oppgave 4
Filnavn: begreper.txt
Se illustrasjonseksempelet nederst i oppgaven om du er i tvil om hvordan oppgaven skal besvares (samme eksempel som i oblig 6).
For hvert av begrepene i listen under, oppgi et linjenummer i programmet der du finner et eksempel på begrepet. Hvert begrep er gjennomgått i uke 7 og 8. Hvis eksempelet går over flere linjer, oppgir du start- og sluttlinje.
- A. Klassedefinisjon
- B. Definisjon av instansvariabel
- C. Definisjon av instansmetode
- D. Definisjon av konstruktør

Illustrasjonseksempel
For hvert av begrepene i listen under, oppgi et linjenummer i programmet der du finner et eksempel på begrepet. Hvis eksempelet går over flere linjer, oppgir du start- og sluttlinje.
- A. variabeldeklarasjon
- B. utskriftsetning
- C. innlesing fra terminal
- D. beslutning med flere alternativer

Mulige riktige svar på spørsmålene i eksempelet:
- A. linje 1
- B. linje 3
- C. linje 1
- D. linje 2-5