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?
| Test | Resultat |
|---|---|
| Er 10 > 10? | Usant (feil svar for oppgaven) |
| Er 10 ≥ 10? | Sant (riktig) |
- Vi sporer algoritmen med tallet 10
- er ? Nei, dette er USANT
- tallet 10 blir IKKE fanget opp av «stort tall»-testen, selv om oppgaven sier den skal
- feilen er at «større enn» (>) ekskluderer 10 selv
- 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.
| Test | Resultat |
|---|---|
| Tall = 15 (klart stort) | riktig svar |
| Konklusjon | hovedlogikk 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
| Test | Resultat |
|---|---|
| Er 5 > 5? | Usant |
| Konklusjon | Nei, ikke talt med |
- 5 > 5 er usant, så 5 blir ikke talt med
- nei
L-32En algoritme «HVIS tallet er mindre enn 0: negativt» testes på tallet 0. Blir 0 kategorisert som negativt?
Vis fasit
| Test | Resultat |
|---|---|
| Er 0 < 0? | Usant |
| Konklusjon | Nei, 0 er ikke negativt |
- 0 < 0 er usant
- 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
| Test | Resultat |
|---|---|
| Tall fra 0 til 5 | 6 tall |
| Riktig antall | 5 |
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
| Test | Resultat |
|---|---|
| Er 10 > 10? | Usant |
| Konklusjon | 10 blir feilaktig utelatt |
- 10 > 10 er usant, så 10 blir feilaktig utelatt selv om den skal telles med (≥ 10)
- 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
| Test | Resultat |
|---|---|
| 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
| Test | Resultat |
|---|---|
| Er 0 > 0? | Usant |
| Konklusjon | Nei, feil grense brukt |
- 0 > 0 er usant, så 0 klassifiseres som «ikke positivt» men testeren vil ha 0 som «ikke-negativt»
- 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
| Test | Resultat |
|---|---|
| Feil-svar (3,9,6) | 9 (tilfeldig riktig) |
| Konklusjon | ufullstendig, sammenlign alle tre |
- 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
- 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
| Test | Resultat |
|---|---|
| 7 mod 7 | 0 |
| Konklusjon | Ja, feilaktig sier nei |
- 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
- 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
| Test | Resultat |
|---|---|
| Rest 1 (oddetall) | 5, 7 |
| Konklusjon | 2, feilaktig telte oddetall |
- Tall med rest 1 ved deling på 2 er oddetall: 5 og 7
- algoritmen finner 2 (feilaktig telte oddetall som partall)