IN1900 — tre programmeringsoppgaver til midtveis

Om settet

Her skal du skrive tre programmer, ett per oppgave. Til sammen dekker de midtveispensumet (kap. 1–6 og 8, se tabellen nederst). Hver oppgave bygger seg opp stegvis, så få hvert steg til å kjøre før du går videre.
Midtveiseksamen er flervalg og handler om å lese kode. Men den koden er skrevet med nøyaktig de konstruksjonene du øver på her. Kan du skrive dem selv, klarer du å lese dem.

Løsningsforslag: IN1900 midtveis - løsningsforslag. Se på det først når programmet ditt kjører.


Oppgave 1 — Temperaturtabell (f2c_tabell.py)

Løkker, lister, vilkår, formatering, slicing

En vanlig tommelfingerregel for å gjøre Fahrenheit om til Celsius er . Den eksakte formelen er .

a) Bruk en while-løkke til å skrive ut en tabell for med tre kolonner: , eksakt og tilnærmet . Bruk f-strenger, slik at kolonnene står rett under hverandre, med 2 desimaler for eksakt og 1 desimal for tilnærmingen. Ta med en overskriftslinje.

b) Lag de samme verdiene med en for-løkke over range. Lagre dem i tre lister, F_list, C_list og Cca_list, med append. Lag så en nøstet liste tabell, der hvert element er en rad [F, C, C_ca]. Bruk list comprehension og zip.

c) Gå gjennom tabell og skriv bare ut radene der tilnærmingen bommer med mindre enn 2 grader. Bruk if og abs.

d) Finn raden der tilnærmingen bommer mest, med en løkke (ikke max). Skriv ut -verdien og feilen.

e) Bruk slicing til å skrive ut de tre første og de to siste radene av tabell.


Oppgave 2 — Tyngdekraft på planetene (planeter.py)

Funksjoner, standardargumenter, testfunksjoner, filer, ordbøker, try/except, raise, sys.argv

Lag en fil planeter.txt med dette innholdet (kopier nøyaktig, raden for Pluto er med vilje ødelagt):

# navn     masse(10^24 kg)   radius(km)
Merkur     0.330             2440
Venus      4.87              6052
Jorden     5.97              6371
Mars       0.642             3390
Pluto      0.0130            ukjent
Jupiter    1898              69911

Tyngdeakselerasjonen på overflaten er , med (SI-enheter: kg og m).

a) Skriv en funksjon tyngdeakselerasjon(M, R, G=6.674e-11) som returnerer . Hvis R <= 0, skal den heve en ValueError med en forklarende melding (bruk raise).

b) Skriv en testfunksjon test_tyngdeakselerasjon() i standardformen med expected, computed, tol, success, msg og assert. Velg tall slik at du vet svaret eksakt uten kalkulator. (Hint: sett G=1.0.)

c) Kall funksjonen med R = 0 inni en try/except ValueError as e, og skriv ut feilmeldingen e i stedet for at programmet krasjer.

d) Skriv en funksjon les_planeter(filnavn) som leser fila og returnerer en ordbok {navn: (masse_i_kg, radius_i_m)}. Husk å hoppe over overskriftslinja og å regne om enhetene. Linjer der tallene ikke kan leses, skal hoppes over med en melding. Bruk try/except ValueError inni løkka, ikke rundt hele fila.

e) Filnavnet skal komme fra kommandolinja: python planeter.py planeter.txt. Bruk sys.argv. Hvis brukeren glemmer filnavnet, skal programmet skrive ut en bruksanvisning og avslutte, ikke krasje. (Hvilken feil får du hvis du bare skriver sys.argv[1]?)

f) Lag en ny ordbok g_verdier = {navn: g} og skriv ut en pen tabell. Finn planeten med størst med en løkke.

g) Hvor lang tid tar det å falle m på hver planet? Bruk og sqrt fra math.

h) Skriv resultatene til en ny fil, tyngdekraft.txt, med én planet per linje. Åpne fila etterpå og sjekk at den ser riktig ut.


Oppgave 3 — Taylorrekka til sin(x) (taylor_sin.py)

NumPy-arrays, vektorisering, linspace/zeros, slicing, plotting, funksjoner som argument, lambda, testfunksjoner

Taylorrekka til , kuttet etter ledd, er

a) Skriv en funksjon S(x, n) som regner ut summen med en for-løkke. Bruk factorial fra math. Funksjonen skal virke både når x er et tall og når x er et NumPy-array. (Hvorfor gjør den det uten at du endrer noe?)

b) Skriv test_S(), som sjekker tre ting du vet svaret på: , og .

c) Lag to arrays med 201 punkter, x fra til og y = S(x, 3), på to måter:

  1. med np.zeros og en løkke som fyller inn ett element om gangen
  2. vektorisert, med np.linspace og ett kall på S

Sjekk at de to måtene gir samme resultat.

d) Plott og for i samme figur. Ta med label på hver kurve, legend, navn på aksene og ylim(-2, 2). Hvor på -aksen blir tilnærmingene dårlige, og hvorfor der?

e) Skriv en funksjon maks_feil(f, g, x) som tar inn to funksjoner og et array, og returnerer . Kall den med np.sin og lambda x: S(x, n), og skriv ut feilen for i en tabell.

f) Bruk en while-løkke til å finne minste der maksfeilen på er under .

g) Bruk slicing på x til å regne ut maksfeilen for bare på , altså den første halvdelen av arrayet. Sammenlikn med hele intervallet og forklar forskjellen ut fra plottet.


Pensumdekning

Tema (kjernepensum)Hvor
Variabler, typer, aritmetikk, math-import1a, 2g, 3a
f-strenger og formatert utskrift1a, 1c, 2f, 3e
while-løkker1a, 3f
for-løkker, range1b, 1d, 2d, 3a
Lister: append, indeksering, slicing1b, 1e
Nøstede lister, zip, list comprehension1b
if-tester, abs1c, 1d, 2f
Funksjoner, returverdier, standardargumenter2a, 3a
Funksjoner som argument, lambda3e, 3f
Testfunksjoner (assert, toleranse)2b, 3b
Lese fil (with open, readline, split)2d
Skrive fil2h
try/except, raise2a, 2c, 2d, 2e
Kommandolinje (sys.argv)2e
Ordbøker2d, 2f
NumPy: zeros, linspace, vektorisering, slicing3c, 3g
Plotting med matplotlib3d