Feilsøke i kode

Feilsøking (debugging) betyr å finne og rette feil i en algoritme som ikke gjør det den skal. Vanlige feilkilder er: feil sammenligningstegn (< i stedet for <=), å glemme et steg, eller å starte en telling på feil tall.

Tips

  • Spor algoritmen steg for steg med et konkret eksempel, akkurat som i «Teste og forbedre en algoritme» – da ser du nøyaktig HVOR den gir feil svar, ikke bare AT den gjør det.
  • Sjekk grensene nøye: «større enn» (>) og «større enn eller lik» (≥) gir ofte ulikt svar akkurat ved grensetilfellet – dette kalles en «av-med-én»-feil (off-by-one) og er en av de vanligste feilene i programmering.

Eksempel: Finne feilen i en algoritme

Algoritmen «HVIS tallet er større enn 10: skriv ut «stort tall»» skal fange opp tallet 10 selv, men gjør det ikke. Hva er feilen, og hvordan rettes den?

Feilsøke grensetilfellet 10
TestResultat
Er 10 > 10?Usant (feil svar for oppgaven)
Er 10 ≥ 10?Sant (riktig)
Løsning:
  1. Vi sporer algoritmen med tallet 10
  2. er 10>1010 > 10? Nei, dette er USANT
  3. tallet 10 blir IKKE fanget opp av «stort tall»-testen, selv om oppgaven sier den skal
  4. feilen er at «større enn» (>) ekskluderer 10 selv
  5. rettelsen er å bytte «større enn» med «større enn eller lik» (≥).
Alternativ forklaring/metode: Sjekk et tall du VET skal gi riktig svar

Alternativ metode – innenfor pensum, men ikke hovedmetoden her

Sammenligne med et fungerende eksempel

Test algoritmen med et tall du er helt sikker på svaret til (f.eks. 15, som klart er «stort») – gir algoritmen riktig svar der, vet du at hovedlogikken virker, og feilen ligger sannsynligvis i en grense (som i eksempelet over) heller enn i selve strukturen på algoritmen.

TestResultat
Tall = 15 (klart stort)riktig svar
Konklusjonhovedlogikk virker, sjekk grensen

Oppgaver

Prøv minst én oppgave på hvert nivå.

Lett(3)

L-31En algoritme skal telle tall FRA OG MED 5, men bruker «tallet > 5». Vil tallet 5 selv bli talt med?

Vis fasit
TestResultat
Er 5 > 5?Usant
KonklusjonNei, ikke talt med
  1. 5 > 5 er usant, så 5 blir ikke talt med
  2. nei

L-32En algoritme «HVIS tallet er mindre enn 0: negativt» testes på tallet 0. Blir 0 kategorisert som negativt?

Vis fasit
TestResultat
Er 0 < 0?Usant
KonklusjonNei, 0 er ikke negativt
  1. 0 < 0 er usant
  2. nei, 0 er ikke negativt

L-33En algoritme skal starte tellingen på 1, men koden starter på 0 ved en feil. Hvis listen har 5 elementer, hvor mange ganger går løkka med feilen (fra 0 til 5, ikke medregnet 5)?

Vis fasit
TestResultat
Tall fra 0 til 56 tall
Riktig antall5

Fra 0 til og med 5 er det 6 tall, én for mye

Middels(3)

M-31En algoritme skal finne alle tall STØRRE ENN ELLER LIK 10 i listen [8, 10, 12, 9]. Men koden bruker «tallet > 10» ved en feil. Hvilket tall blir feilaktig utelatt?

Vis fasit
TestResultat
Er 10 > 10?Usant
Konklusjon10 blir feilaktig utelatt
  1. 10 > 10 er usant, så 10 blir feilaktig utelatt selv om den skal telles med (≥ 10)
  2. 10 blir feilaktig utelatt

M-32En algoritme for gjennomsnitt deler summen på antallet MINUS 1 ved en feil. For listen [4, 6, 8] (sum 18, riktig antall 3), hva blir det feilaktige svaret?

Vis fasit
TestResultat
18 : (3-1)9 (feil)
Riktig (18:3)6

18 : (3-1) = 18 : 2 = 9 (feil, riktig svar er 18:3=6)

M-33En algoritme skal sjekke om et tall er positivt med «HVIS tallet > 0», men testeren mener 0 også skal telle som «ikke-negativt». Er dagens kode riktig for testerens krav?

Vis fasit
TestResultat
Er 0 > 0?Usant
KonklusjonNei, feil grense brukt
  1. 0 > 0 er usant, så 0 klassifiseres som «ikke positivt» men testeren vil ha 0 som «ikke-negativt»
  2. nei, feil grense brukt
Vanskelig(3)

V-31En algoritme for størst-av-tre bruker feilaktig kun to sammenligninger og hopper over den tredje for tallene (3, 9, 6): «sammenlign 3 og 9, behold 9». Hva blir feil-svaret, og hva er riktig svar?

Vis fasit
TestResultat
Feil-svar (3,9,6)9 (tilfeldig riktig)
Konklusjonufullstendig, sammenlign alle tre
  1. For (3,9,6) gir den avkortede algoritmen 9, som tilfeldigvis stemmer – men for (3,6,9) ville den gitt 9 fra første sammenligning og aldri sjekket det siste 9-tallet riktig
  2. algoritmen er ufullstendig, må sammenligne alle tre

V-32En algoritme for primtall-test sjekker delelighet fra 2 til og med tallet selv (i stedet for å stoppe før). For tallet 7, vil algoritmen feilaktig konkludere at 7 IKKE er et primtall?

Vis fasit
TestResultat
7 mod 70
KonklusjonJa, feilaktig sier nei
  1. 7 mod 7 = 0, og hvis algoritmen teller dette som et «bevis» på at 7 ikke er primtall, er det en feil – 7 er jo delelig med SEG SELV, det diskvalifiserer ikke primtall-status
  2. ja, algoritmen vil feilaktig si nei

V-33En algoritme for å telle partall i [2, 5, 4, 7, 6] bruker feilaktig «tallet MODULO 2 er 1» (i stedet for 0) som partall-test. Hvor mange «partall» finner den feilaktige algoritmen?

Vis fasit
TestResultat
Rest 1 (oddetall)5, 7
Konklusjon2, feilaktig telte oddetall
  1. Tall med rest 1 ved deling på 2 er oddetall: 5 og 7
  2. algoritmen finner 2 (feilaktig telte oddetall som partall)