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