Obligatorisk oppgave 6
IN1000, våren 2026
Innleveringsfrist: onsdag 18. mars, 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:
- test_dato.py
- test_fotball,py
- teori.txt
- begreper.txt
Oppgave 1
Filnavn: test_dato.py
Du skal lage noen egne Dato-objekter som du trenger til et Python-program (og disse vil du lage i oblig 7), men for å gjøre prosessen lettere for deg selv velger du å fokusere på grensesnittet først, slik at du vet hva du skal lage før du begynner å tenke på hvordan du skal lage det.
I den vedlagte filen oblig7.py har du laget noen prototyper som gjør at du kan bruke alle bruke Dato-objekter som forklart under (koden kjører, men det er mye som ikke er laget ferdig). Du vil ikke trenge å lese eller forstå koden i oblig7.py for å løse oppgavene - det er der bare for at du skal kunne kjøre din egen kode uten feilmeldinger. Selv om de ikke virker som de skal enda, skal vi likevel skrive programmet som bruker disse objektene som om de var ferdige og fungerte som de skal. Denne øvelsen er nemlig gull verdt når vi senere fikser på hvordan objektene skal fungere. (Det samme gjelder i oppgave 2.)
Importer objekt-typene du trenger og gjør skriv et program som skal teste objektene på følgende måte:
- Lag et nytt Dato-objekt som representerer 15. mars 2026.
- Hvis dagen er lik 15, skriv ut "Lønningsdag!"
- Ellers, hvis dagen er lik 1, skriv ut "Ny måned, nye muligheter"
- Skriv ut dato-objektet, endre til neste dag, og skriv ut dato-objektet igjen
- La brukeren selv skrive inn en tekststreng på formatet "dd.mm.åååå" (d = dag, m = måned, å = år) og endre dato-objektet til å representere denne datoen. Skriv ut dato-objektet enda en gang etterpå
Vær klar over at prototypene gjør minst mulig, så når du har løst oppgaven riktig vil programmet bare skrive ut følgende (minneadressene til objektene vil ikke være de samme som i figuren):

Vær klar over at målet med oppgaven er å kunne bruke objektene riktig, ikke å få riktig utskrift. Det er koden du skriver som blir vurdert, ikke utskriften den produserer (som bare er der for å hjelpe deg å bruke objektene riktig).
Grensesnittene til alle typene som brukes finner du her (og du må sette deg inn i disse for å løse oppgaven, men det er ikke slik at all informasjonen må brukes - noe av dette er først nyttig i oblig 7):
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.åååå |
Oppgave 2
Filnavn: test_fotball.py
Du vil lage en fotballsimulator som simulerer fotballkamper og spår resultater i Python. Du skal lage noen egne objekter til dette programmet (og disse vil du lage i oblig 7), men for å gjøre prosessen lettere for deg selv velger du å fokusere på grensesnittet først, slik at du vet hva du skal lage før du begynner å tenke på hvordan du skal lage det.
I den vedlagte filen oblig7.py har vi laget noen veldig enkle prototyper som gjør at du kan bruke alle objekt-typene under (koden kjører, men det er mye som ikke er laget ferdig). Du skal likevel øve deg på å bruke disse objektene riktig allerede nå (som om de var ferdiglaget).
Importer objekt-typene du trenger og gjør skriv et program som skal teste objektene på følgende måte:
- Lag et nytt Sesong-objekt
- La objektet lese inn informasjon om alle lagene fra den vedlagte filen eliteserien_2026.txt
- Hent ut første runde (nummer 1) fra Sesong-objeket (finnes ikke fra før, så dette opprettes)
- Legg til følgende 8 kamper i Runde-objektet (det første av de to lagene er hjemmelaget):
- HamKam - Viking
- Molde - Rosenborg
- Kristiansund - Brann
- KFUM Oslo - Start
- Sarpsborg 08 - Bodø/Glimt
- Vålerenga - Sandefjord
- Aalesund - Lillestrøm
- Tromsø - Fredrikstad
- Gå gjennom alle kampene i denne runden (Runde-objektet) med en for-løkke
- For hver kamp (hvert Kamp-objekt), spill kampen og skriv ut kampen (med resultat) etterpå
Vær klar over at prototypene gjør minst mulig, så når du har løst oppgaven riktig vil programmet bare skrive ut noe som ligner følgende (minneadressene til objektene vil ikke være de samme som i figuren):

Vær klar over at målet med oppgaven er å kunne bruke objektene riktig, ikke å få riktig utskrift. Det er koden du skriver som blir vurdert, ikke utskriften den produserer (som bare er der for å hjelpe deg å bruke objektene riktig).
Grensesnittene til alle typene som brukes finner du her (og du må sette deg inn i disse for å løse oppgaven, men det er ikke slik at all informasjonen må brukes - noe er først nyttig i oblig 7). Objektene opprettes uten argumenter (for eksempel Sesong() for Sesong) med mindre annet er spesifisert. Det er ikke sikkert du vil trenge å bruke alle typene objekter i oblig 6.
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. |
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. |
Oppgave 3
Filnavn: teori.txt
Gi korte svar på spørsmålene under (hentet fra forelesning 7):
- Hva er innkapsling? Hvorfor er det nyttig?
- Hva er grensesnittet til en klasse? Hvordan skiller det seg fra implementasjonen av en klasse?
- Hva er en instansmetode (ofte kalt bare metode)? Hvordan skiller metoder seg fra prosedyrene/funksjonene vi har jobbet med hittil?
Oppgave 4
Filnavn: begreper.txt
Se illustrasjonseksempelet nederst i oppgaven om du er i tvil om hvordan oppgaven skal besvares.
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. Hvis eksempelet går over flere linjer, oppgir du start- og sluttlinje.
- A. Opprettelse av nytt objekt
- B. Kall på instansmetode
- C. Argumenter

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