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: