Komplett pensumoversikt for introduksjon til programmering med vitenskapelige anvendelser ved UiO — med forklaringer, sentrale begreper, eksamenstips og vanlige fallgruver. Eksamensoptimalisert basert på tidligere eksamener.
Innhold
IN1900 Introduksjon til programmering med vitenskapelige anvendelser er UiOs første programmeringsemne for realfagsstudenter. Du lærer Python med vekt på det naturvitere trenger: løkker og lister, funksjoner, filer og ordbøker, klasser, differenslikninger og numerisk løsning av differensiallikninger.
Guiden er bygd på alle 19 ordinære eksamenssett fra 2007 til 2025 og 18 midtveiseksamener fra 2007 til 2025, sammen med UiOs løsningsforslag til hvert sett. Hver deloppgave er klassifisert etter tema, oppgavetype og poeng. Tallene du ser i guiden, som «i 5 av 5 sett 2021–2025», er telt opp fra settene — ikke anslått.
Midtveiseksamen tester nesten bare kodelesing: «Hva skrives ut?», «Hvilken linje mangler?», «Hvilket funksjonskall er riktig?». I 2021–2025 sto grunnleggende Python for om lag 16 av de 25 poengene.
Den avsluttende eksamenen er mest kodeskriving. Settet åpner med 5–8 korte lesoppgaver på til sammen 11–24 poeng. Deretter følger 7–9 skriveoppgaver på til sammen 51–64 poeng, den største på 10–12 poeng. Du skriver kode for hånd i en tekstboks, uten å kunne kjøre den.
| Tema | Poeng | Sett |
|---|---|---|
| Grunnleggende Python og kodelesing | ≈ 25 | 5/5 + 5/5 |
| Klasser, spesialmetoder og arv | ≈ 14 | 5/5 ord. |
| Filer, strenger og ordbøker | ≈ 13 | 5/5 + 5/5 |
| ODE-er og ODESolver | ≈ 11 | 5/5 ord. |
| Testfunksjoner og feilhåndtering | ≈ 10 | 5/5 + 5/5 |
| Funksjoner, lambda og summer | ≈ 9 | 5/5 + 5/5 |
| Differenslikninger | ≈ 8 | 4/5 ord. |
| NumPy og plotting | ≈ 6 | 4/5 + 3/5 |
| Numeriske metoder | ≈ 5 | 4/5 + 4/5 |
«5/5 + 5/5» betyr at temaet var med på alle fem avsluttende eksamener og alle fem midtveiseksamener 2021–2025.
f(t, u) og løsningen solver.solve(t_span, N). Settene fra 2011–2022 bruker f(u, t), og de fleste av dem solve(time_points). Løser du eldre sett, må du bytte rekkefølgen.Studerer du bare én ting, så lær deg å spore kode for hånd. «Hva skrives ut?»-oppgaver har vært med i 18 av 19 avsluttende sett og i alle 18 midtveissett.
Kodelesing gir i snitt 24,6 av 100 poeng (9,0 p ordinær + 15,6 p midtveis, 2021–2025) og sto i 5 av 5 ordinære sett og 5 av 5 midtveissett. «Hva skrives ut?» finnes i 18 av 19 ordinære sett og alle 18 midtveissett.
Kodelesing er det tyngste enkeltområdet i IN1900 når ordinær eksamen og midtveiseksamen ses under ett. I settene 2021–2025 ga temaet i snitt 9,0 av 75 poeng på ordinær eksamen og 15,6 av 25 poeng på midtveiseksamen – til sammen 24,6 av 100 poeng. Det sto i 5 av 5 ordinære sett og 5 av 5 midtveissett 2021–2025 (17 av 19 ordinære sett og 18 av 18 midtveissett siden 2007). Oppgavetypen «Hva skrives ut?» finnes i 18 av 19 ordinære sett og i alle 18 midtveissett.
| Type | Eksempler | Poeng |
|---|---|---|
| Hva skrives ut? (flervalg) | H2025 oppg. 1–2, H2024 oppg. 1, H2025-midtveis oppg. 1–7 | 2 p ordinær, 1 p midtveis |
Løkke som teller (while med to variabler) | H2021 oppg. 1, H2025 oppg. 3 | 2 p |
| Match uttrykk og verdi (indeksering, boolske uttrykk) | H2021 oppg. 2 og 5, H2022 oppg. 2, H2023 oppg. 5; midtveis i 5 av 5 sett 2021–2025 | 2–3,5 p |
| Hva gjør funksjonen? / hvilken kode er riktig? | H2023 oppg. 3 (sortering), H2025-midtveis oppg. 19 | 1–2 p |
Lag én kolonne per variabel og én rad per gjennomløp. Skriv ned verdien etter hver linje, og noter utskriften i en egen kolonne. Aldri regn «i hodet» når det er en løkke.
s = 1
for k in range(2, 11, 4):
s = s * k
print(k, s)
| k | s | utskrift |
|---|---|---|
| 2 | 2 | 2 2 |
| 6 | 12 | 6 12 |
| 10 | 120 | 10 120 |
range(a, b, d) starter på a, øker med d og stopper før b. Derfor er 10 med (10 < 11), men ikke 14. range(n) har n elementer, range(1, n) har bare n − 1.
Hva er verdien av n når koden er kjørt? Alternativer: 16, 18, 19, 21.
n = 1
k = 12
while n < k:
n = n + 3
k = k + 1
print(n)
n øker med 3 og k med 1, så avstanden krymper med 2 per runde.k = 18).Svar: 19.
end=' 'print(..., end=' ') avslutter med mellomrom i stedet for linjeskift, så alt havner på én linje. Den indre løkka kjører helt ferdig for hver verdi av den ytre. Merk at range(i, 3) er tom når i ≥ 3.
for i in range(1, 4):
print(i, end=' ')
for j in range(i, 3):
print(j, end=' ')
Alternativer: 112223, 11222, 1122233, 12123 (mellomrom utelatt).
i = 1: skriv 1, deretter j i range(1, 3) = 1, 2.i = 2: skriv 2, deretter j i range(2, 3) = 2.i = 3: skriv 3; range(3, 3) er tom, så ingenting mer.Svar: 1 1 2 2 2 3, altså 112223.
Regn innenfra og ut: finn indeksen først, slå så opp. liste[i] gir et element, liste[i:i+1] gir alltid en liste med ett element. Negative indekser teller bakfra.
Gitt v = [3, -1, [4], [[0]], 1]. Koble hvert uttrykk til en av verdiene 1, −1, 4, [0], [-1], [[0]].
v[-1] er siste element: 1.v[v[-1]] = v[1] = −1.v[v[0]] = v[3] = [[0]].v[2][0]: v[2] er [4], element 0 er 4.v[3][0]: v[3] er [[0]], element 0 er [0].v[1:2] er et utsnitt: [-1], ikke −1.v[v[1]] = v[-1] = 1.Svar: 1, −1, [[0]], 4, [0], [-1], 1.
Presedens: sammenlikning før not, not før and, and før or. Sett usynlige parenteser før du regner.
print(True or False and False)
print(not True or True)
print((True or False) and False)
print(3 > 2 and not 2 > 1)
Utskrift: True, True, False, False. Første linje leses True or (False and False). Heltall ganger flyttall gir flyttall, og / gir alltid float:
r = 2
A = r * 1.5
print(type(r), type(A))
print(7 / 7, 7 // 2, 7 % 2)
Utskrift: <class 'int'> <class 'float'> og 1.0 3 1.
x = 5
data = [1, 2]
def f(a, liste):
x = a * 2
liste.append(x)
return x + 1
y = f(x, data)
print(x, y, data)
f er x = a * 2 en ny lokal variabel (10). Den globale x er fortsatt 5.liste peker på samme listeobjekt som data, så append endrer data.f returnerer 10 + 1 = 11.Svar: 5 11 [1, 2, 10]
b = a lager ingen kopi – bare et nytt navn. a[:] (eller a.copy()) lager en ny liste:
a = [1, 2]
b = a
c = a[:]
b.append(3)
c.append(4)
print(a, c)
Utskrift: [1, 2, 3] [1, 2, 4].
t er en liste med tall. Hva returnerer g(t)?
def g(t):
for i in range(len(t) - 1):
if t[i] > t[i + 1]:
t[i], t[i + 1] = t[i + 1], t[i]
return t[-1]
[4, 9, 1, 7] blir [4, 1, 7, 9].t[-1] returneres.Svar: Funksjonen returnerer det største tallet i lista (og endrer rekkefølgen i lista som ble sendt inn).
Nøkkelformler
range(a, b, d) gir a, a+d, a+2d, … så lenge verdien er mindre enn bnot > and > or/ gir alltid float; // er heltallsdivisjon og % er restb = a er samme liste; b = a[:] eller a.copy() er en ny listeliste[-1] er siste element; liste[i:j] tar med i, men ikke jprint(x, end=' ') avslutter med mellomrom i stedet for linjeskiftVanlige feil
range: range(1, 9, 3) er 1, 4, 7 – ikke 10.append på en parameter endrer lista hos den som kalte funksjonen.4 når uttrykket er v[2:3] – et utsnitt gir alltid en liste, her [4].True or False and False fra venstre mot høyre; and regnes først.1 i stedet for 1.0 når svaret kommer fra /.Eksamenstips
while-løkke (H2021 og H2025 oppg. 1/3).range(a, b, d) ut som en liste før du regner: range(2, 11, 3) er 2, 5, 8 – sluttverdien 11 er aldri med.v[i] (element) og v[i:i+1] (liste).not før and før or.Laster...