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:

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:

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:

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:

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:

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:

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:

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.

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.

Mulige riktige svar på spørsmålene i eksempelet: