Løkker med kodeordet while
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