Alle fag › Videregående programmering

Videregående programmering: gratis øving, teori og oppgaver

Objektorientert programmering (OOP) lar deg samle data og funksjonene som hører til dataene, i én enhet: et objekt. En klasse er oppskriften, og et objekt er en konkret instans av den. Som ingeniør bruker du dette til å modellere ting i den virkelige verden – en sensor, en komponent, en simulering – slik at koden speiler problemet og blir lettere å bygge videre på.

3 deler56 oppgaver12 begreper forklartPrøveeksamenGratis
Start å øve gratis →

Innhold

  1. Objektorientering
  2. Algoritmer og datastrukturer
  3. Numerikk med NumPy

1. Objektorientering

Hva handler det om?

Objektorientert programmering (OOP) lar deg samle data og funksjonene som hører til dataene, i én enhet: et objekt. En klasse er oppskriften, og et objekt er en konkret instans av den. Som ingeniør bruker du dette til å modellere ting i den virkelige verden – en sensor, en komponent, en simulering – slik at koden speiler problemet og blir lettere å bygge videre på.

Begreper og formler

Slik løser du oppgavene

  1. Finn ut om et attributt er en klassevariabel (delt) eller en instansvariabel (satt med self. i __init__).
  2. Følg hvert objekt for seg: hvilke metoder kalles på hvilket objekt, og i hvilken rekkefølge?
  3. Ved arv: sjekk hvilken klasses versjon av metoden som faktisk kjører (den mest spesifikke som er definert for det objektet).
  4. Ved en klassevariabel: husk at en endring gjort via ett objekt kan påvirke alle andre, med mindre det lages en ny instansvariabel med samme navn.

Eksempel

class Konto:
    rente = 0.02          # klassevariabel, delt av alle kontoer
    def __init__(self, saldo):
        self.saldo = saldo  # instansvariabel

    def legg_til_rente(self):
        self.saldo += self.saldo * Konto.rente

a = Konto(1000)
b = Konto(500)
Konto.rente = 0.05
a.legg_til_rente()
print(round(a.saldo), round(b.saldo))
  1. a og b får hver sin saldo (instansvariabler): 1000 og 500.
  2. Konto.rente = 0.05 endrer klassevariabelen for alle objekter, siden ingen av dem har fått sin egen rente.
  3. Bare a.legg_til_rente() kalles: 1000+1000⋅0,05=10501000 + 1000\cdot 0{,}05 = 1050.
  4. b.saldo er uendret siden legg_til_rente aldri ble kalt på b.

Utskriften blir 1050 500.

Vanlige feil

Et objekt er data (attributter) + oppførsel (metoder) samlet i én ting. Instansvariabler er private per objekt; klassevariabler er delt helt til noen overstyrer dem lokalt.

Begreper i denne delen

Øv på objektorientering i appen →

2. Algoritmer og datastrukturer

Hva handler det om?

Når data blir store, er det ikke nok at koden virker – den må også være rask nok. Kompleksitetsanalyse (Big-O) gir deg et språk for å beskrive hvor mye arbeid en algoritme bruker når mengden data nn vokser, uavhengig av datamaskinen. Som ingeniør trenger du dette for å velge riktig datastruktur og algoritme før koden blir treg med ekte, store datasett – for eksempel måleserier med millioner av punkter.

Begreper og formler

Slik løser du oppgavene

  1. Finn hvilken del av koden som gjentas flest ganger når nn vokser – det er den som dominerer kompleksiteten.
  2. Tell løkker i dybden: én løkke over nn gir O(n)O(n), en løkke inni en løkke gir O(n2)O(n^2).
  3. For rekursjon: skriv opp kallene helt til basistilfellet er nådd, og tell dem.
  4. For sortering: følg algoritmen steg for steg med en konkret liste, og noter hver sammenligning og hvert bytte.

Eksempel

Innsettingssortering bytter et element bakover til det står riktig, ett steg om gangen:

def sorter(a):
    bytter = 0
    for i in range(1, len(a)):
        j = i
        while j > 0 and a[j-1] > a[j]:
            a[j-1], a[j] = a[j], a[j-1]
            j -= 1
            bytter += 1
    return bytter

print(sorter([3, 1, 2]))
  1. i=1i=1: sammenlign a[0]=3a[0]=3 og a[1]=1a[1]=1. 3>13>1, så de byttes: [1,3,2][1, 3, 2], bytter = 1.
  2. i=2i=2: sammenlign a[1]=3a[1]=3 og a[2]=2a[2]=2. 3>23>2, bytt: [1,2,3][1, 2, 3], bytter = 2. Nå er a[0]=1≤a[1]=2a[0]=1 \leq a[1]=2, så den indre løkka stopper.
  3. Lista er sortert, og funksjonen returnerer 2.

Utskriften blir 2, som er antall inversjoner i den opprinnelige lista (parene 3–1 og 3–2).

Vanlige feil

Tell hvor mange ganger den tyngste operasjonen gjentas når nn vokser. Det, og bare det, bestemmer Big-O.

Begreper i denne delen

Øv på algoritmer og datastrukturer i appen →

3. Numerikk med NumPy

Hva handler det om?

NumPy gir Python rask, vektorisert regning med tallarrayer – uunnværlig for ingeniørberegninger med store datasett, som måleserier og simuleringer. I tillegg lærer du numeriske grunnmetoder: Newtons metode for å finne nullpunkter til en funksjon, og Eulers metode for å løse differensialligninger tilnærmet, steg for steg. try/except lar programmet håndtere feil i data uten å krasje.

Begreper og formler

Slik løser du oppgavene

  1. Se om koden regner elementvis eller er matriseregning – sjekk om det står * eller @/np.dot.
  2. Med boolsk indeksering: regn ut betingelsen for hvert element først, og hent ut bare de som er True.
  3. For Newton/Euler: sett inn tallene i formelen, ett steg om gangen, og hold styr på hvilken verdi som er xnx_n/yny_n i neste steg.
  4. Sjekk formene til arrayene før du legger dem sammen – stemmer de, eller kan de broadcaste?

Eksempel

En sensor logger 5 målinger. Vi vil vite gjennomsnittet av målingene som er over 20:

import numpy as np
a = np.array([15, 24, 31, 18, 27])
over = a[a > 20]
print(over, round(over.mean(), 2))
  1. a > 20 gir en boolsk array [False, True, True, False, True].
  2. a[a > 20] bruker den til å hente ut verdiene der betingelsen er sann: [24, 31, 27].
  3. Gjennomsnittet er (24+31+27)/3=27,33(24+31+27)/3 = 27{,}33.

Utskriften blir [24 31 27] 27.33.

Vanlige feil

Elementvis er standard i NumPy. Boolsk indeksering sammen med .mean()/.sum() er den vanligste måten å filtrere og oppsummere måledata på.

Begreper i denne delen

Øv på numerikk med numpy i appen →

Eksempeloppgaver med løsning

Her er noen av oppgavene i videregående programmering. I appen får regneoppgavene nye tall hver gang, så du kan øve til det sitter – og ta en prøveeksamen med karakter før eksamen.

Objektorientering: Hva er __init__ i en Python-klasse?

Svar: Konstruktøren som kjører når et objekt opprettes

Den setter opp objektets attributter.

Algoritmer og datastrukturer: Hva er tidskompleksiteten til binærsøk i en sortert liste?

Svar: O(log⁡n)O(\log n)

Søkeområdet halveres for hvert steg.

Numerikk med NumPy: Hva gir np.linspace(0, 1, 5)?

Svar: [0, 0.25, 0.5, 0.75, 1]

Fem jevnt fordelte punkter der begge endepunktene er med.

Objektorientering: Hva refererer self til i en metode?

Svar: Objektet (instansen) metoden kalles på

obj.metode() blir til Klasse.metode(obj).

Øv på alle oppgavene →

Passer for disse emnene

Innholdet dekker pensum som går igjen i ingeniørutdanningene, blant annet: