Løkker med kodeordet while - Konstruksjons- og styringsteknikk (TP-TIP vg1) - NDLA

Hopp til innhold
Verktøy og mal

Løkker med kodeordet while

Ofte har vi bruk for at noe skal skje flere ganger inntil et visst vilkår er oppfylt. Da trenger vi en while-løkke.

Eksempel

På siden "Veivalg – if-elif-else" starter vi med et program der brukeren av programmet skal skrive "n" dersom hen er norsk, og "s" dersom hen er svensk. Deretter skriver programmet til skjermen enten "Du er norsk." eller "Du er svensk.". Algoritmen til programmet (uten at variabelnavn er tatt med) er slik:

  • Skriv til skjermen: "Dersom du er norsk, skriv 'n'. Dersom du er svensk, skriv 's'.".
  • Ta imot svaret til brukeren.
  • Dersom svaret er "n", skriv til skjermen "Du er norsk.". Dersom svaret ikke er "n" men "s", skal det skrives "Du er svensk." til skjermen.

Vi ser nå på en variant av dette programmet der brukeren skriver

  • "j" dersom hen har søsken
  • "n" dersom hen ikke har søsken

Oppgave – algoritme

Skriv om på algoritmen ovenfor slik at den passer til den nye varianten av programmet.

Løsningsforslag

Vi må skrive om på den første og den siste instruksjonen for at responsen fra programmet skal passe.

  • Skriv til skjermen: "Dersom du har søsken, skriv 'j'. Dersom du ikke har søsken, skriv 'n'.".
  • Ta imot svaret til brukeren.
  • Dersom svaret er "j", skriv til skjermen "Du har søsken.". Dersom svaret ikke er "j", men "n", skal det skrives "Du har ikke søsken." til skjermen.

Problemet med denne algoritmen er at dersom brukeren av en eller annen grunn skriver feil, vil programmet avslutte uten at brukeren får en ny sjanse til å skrive rett. Det ønsker vi å gjøre noe med. Programmet skal fungere slik at dersom det blir skrevet noe annet enn "j" eller "n", skal programmet gi melding om det og gå tilbake til starten.

Oppgave – algoritme

Endre på algoritmen ovenfor slik at den passer med de nye kravene til programmet.

Løsningsforslag
  • Skriv til skjermen: "Dersom du har søsken, skriv 'j'. Dersom du ikke har søsken, skriv 'n'.".
  • Ta imot svaret til brukeren.
  • Dersom svaret er "j", skriv til skjermen "Du har søsken.". Dersom svaret ikke er "j" men "n", skal det skrives "Du har ikke søsken." til skjermen.
  • Så lenge svaret fra brukeren er noe annet enn "j" eller "n", skal det skrives "Du skrev noe som programmet ikke forsto. Prøv en gang til.". Deretter går programmet tilbake til den første instruksjonen.

På denne måten vil programmet gå "i løkke" helt til brukeren skriver enten "j" eller "n".

Løkker med kodeordet while

Hvordan får vi programmet til å repetere utvalgte kodelinjer helt til brukeren har skrevet "j" eller "n"? I Python løser vi det ved å lage en såkalt løkke med kommandoordet while. En while-løkke (eller en while-struktur) fungerer delvis på den samme måten som en if-struktur ved at det er et vilkår som fastsetter om kode skal kjøres eller ikke. Forskjellen er at med en while-løkke vil programmet kjøre koden på nytt og på nytt helt til vilkåret ikke er oppfylt lenger.

Programmet nedenfor fungerer etter algoritmen ovenfor. Kjør programmet ved å trykke på avspillingsknappen , og test det ved å skrive noe feil, altså noe annet enn "j" eller "n". (NB: Det kan ta litt tid fra du trykker på avspillingsknappen til programmet blir kjørt.)

Oppgave – koding

Hva tror du svar != "j" i vilkåret på linje 2 betyr?

Forklaring

"!=" betyr "er ikke lik". Så svar != "j" tester om variabelen svar er ulik "j". Se lengre ned på siden.

Oppgave – koding

Hvorfor starter programmet med å opprette variabelen svar og gi den verdien "noe annet"?

Forklaring

Hele programmet med unntak av den første linja er med i while-løkken. While-løkken tester om brukeren har skrevet noe annet enn "j" eller "n", som vi har i algoritmen til programmet, men testen kommer alt i linje 2 før brukeren har skrevet inn noe den første gangen. Da må variabelen svar være definert på forhånd og ha fått en verdi som er "noe annet" enn "j" eller "n".

Oppgave – koding

Prøv å ta vekk den første linja (svar = "noe annet"), og kjør programmet. Hvorfor kommer det en feilmelding, og hva betyr feilmeldingen du får?

Kommentar

Feilmeldingen kommer fordi while-kommandoen prøver å teste på en variabel som ikke finnes (ennå).

Oppgave - koding

Legg inn svar = "j" på linje 1 (i stedet for svar = "noe annet"), og kjør programmet. Hva skjer, og hvorfor skjer det?

Kommentar

Testen i while-løkken slår ikke til, og while-løkken blir derfor ikke kjørt. Da skjer det ingenting.

Oppgave – algoritme

Algoritmen ovenfor programvinduet passer ikke helt med programmet. Skriv om algoritmen slik at den stemmer med programmet.

Løsningsforslag
  • Sett variabelen svar lik "noe annet".
  • Så lenge variabelen svar har andre verdier enn "j" og "n":

    • Skriv til skjermen "Dersom du har søsken, skriv 'j'. Dersom du ikke har søsken skriv 'n'.".
    • Ta imot svaret, og sett det lik variabelen svar.
    • Dersom svar er lik "j": skriv til skjermen "Du har søsken.".
    • Dersom svar ikke er lik "j", men "n": skriv til skjermen "Du har ikke søsken.".
    • Dersom svar er lik noe annet enn "j" eller "n": skriv til skjermen "Du skrev noe som programmet ikke forsto. Prøv en gang til!".

I testen på while-løkken (linje 2) må vi teste om variabelen svar verken har verdien "j" eller verdien "n". I motsatt fall vet vi at brukeren har skrevet et rett svar, og programmet kan avslutte. Da skal ikke while-løkken kjøre mer.

Legg merke til at alt som hører til i while-løkken er rykket inn mot høyre på den samme måten som vi gjør med det som hører innunder if, elif og else i en if-elif-else-struktur. Dersom vi legger til en ny programlinje med kode nederst og rykker den helt tilbake til venstremargen, vil koden ikke være en del av while-løkken.

Pythonkode å lære seg

Vis innhold

while

Struktur:

while vilkår:
    kodelinje
    kodelinje
    ...

Eksempel (vi går ut ifra at a og b er tallvariabler som har fått en verdi):

while a < b:
    a = a + 1

Hver gang løkken blir kjørt, øker verdien av variabelen a med 1. Løkken vil kjøre helt til a ikke lenger er mindre enn b. NB: Dersom a er større eller lik b i utgangspunktet, vil ikke løkken kjøre i det hele tatt.

Husk også at kodelinjer som hører til en while-løkke skal være rykket inn mot høyre.

Sammenligningsoperatorer

== lik

!= ikke lik

>= større enn eller lik

<= mindre enn eller lik

Relatert innhold

Skrevet av Bjarne Skurdal.
Sist faglig oppdatert 10.06.2022