Lykkjer med kodeordet while - Konstruksjons- og styringsteknikk (TP-TIP vg1) - NDLA

Hopp til innhald
Verktøy og mal

Lykkjer med kodeordet while

Ofte har vi bruk for at noko skal skje fleire gonger inntil eit visst vilkår er oppfylt. Då treng vi ei while-lykkje.

Eksempel

På sida "Vegval – if-elif-else" startar vi med eit program der brukaren av programmet skal skrive "n" dersom hen er norsk, og "s" dersom hen er svensk. Deretter skriv programmet til skjermen anten "Du er norsk." eller "Du er svensk.". Algoritmen til programmet (utan at variabelnamn er tekne med) er slik:

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

Vi ser no på ein variant av dette programmet der brukaren skriv

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

Oppgåve – algoritme

Skriv om på algoritmen ovanfor slik at han passar til den nye varianten av programmet.

Løysingsforslag

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

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

Problemet med denne algoritmen er at dersom brukaren av ein eller annan grunn skriv feil, vil programmet avslutte utan at brukaren får ein ny sjanse til å skrive rett. Det ønskjer vi å gjere noko med. Programmet skal fungere slik at dersom det blir skrive noko anna enn "j" eller "n", skal programmet gi melding om det og gå attende til starten.

Oppgåve – algoritme

Endre på algoritmen ovanfor slik at han passar med dei nye krava til programmet.

Løysingsforslag
  • Skriv til skjermen: "Dersom du har søsken, skriv 'j'. Dersom du ikkje har søsken, skriv 'n'.".
  • Ta imot svaret til brukaren.
  • Dersom svaret er "j", skriv til skjermen "Du har søsken.". Dersom svaret ikkje er "j" men "n", skal det skrivast "Du har ikkje søsken." til skjermen.
  • Så lenge svaret frå brukaren er noko anna enn "j" eller "n", skal det skrivast "Du skreiv noko som programmet ikkje forstod. Prøv ein gong til.". Deretter går programmet attende til den første instruksjonen.

På denne måten vil programmet gå "i lykkje" heilt til brukaren skriv anten "j" eller "n".

Lykkjer med kodeordet while

Korleis får vi programmet til å repetere utvalde kodelinjer heilt til brukaren har skrive "j" eller "n"? I Python løyser vi det ved å lage ei såkalla lykkje med kommandoordet while. Ei while-lykkje (eller ein while-struktur) fungerer delvis på den same måten som ein if-struktur ved at det er eit vilkår som fastset om kode skal køyrast eller ikkje. Skilnaden er at med ei while-lykkje vil programmet køyre koden på nytt og på nytt heilt til vilkåret ikkje er oppfylt lenger.

Programmet nedanfor fungerer etter algoritmen ovanfor. Køyr programmet ved å trykkje på avspelingsknappen , og test det ved å skrive noko feil, altså noko anna enn "j" eller "n". (NB: Det kan ta litt tid frå du trykkjer på avspelingsknappen til programmet blir køyrt.)

Oppgåve – koding

Kva trur du svar != "j" i vilkåret på linje 2 betyr?

Forklaring

"!=" betyr "er ikkje lik". Så svar != "j" testar om variabelen svar er ulik "j". Sjå lengre ned på sida.

Oppgåve – koding

Kvifor startar programmet med å opprette variabelen svar og gi han verdien "noko anna"?

Forklaring

Heile programmet med unntak av den første linja er med i while-lykkja. While-lykkja testar om brukaren har skrive noko anna enn "j" eller "n", som vi har i algoritmen til programmet, men testen kjem alt i linje 2 før brukaren har skrive inn noko den første gongen. Då må variabelen svar vere definert på førehand og ha fått ein verdi som er "noko anna" enn "j" eller "n".

Oppgåve – koding

Prøv å ta vekk den første linja (svar = "noko anna"), og køyr programmet. Kvifor kjem det ei feilmelding, og kva betyr feilmeldinga du får?

Kommentar

Feilmeldinga kjem fordi while-kommandoen prøver å teste på ein variabel som ikkje finst (enno).

Oppgåve - koding

Legg inn svar = "j" på linje 1 (i staden for svar = "noko anna"), og køyr programmet. Kva skjer, og kvifor skjer det?

Kommentar

Testen i while-lykkja slår ikkje til, og while-lykkja blir derfor ikkje køyrt. Då skjer det ingenting.

Oppgåve – algoritme

Algoritmen ovanfor programvindauget passar ikkje heilt med programmet. Skriv om algoritmen slik at han stemmer med programmet.

Løysingsforslag
  • Set variabelen svar lik "noko anna".
  • Så lenge variabelen svar har andre verdiar enn "j" og "n":
    • Skriv til skjermen "Dersom du har søsken, skriv 'j'. Dersom du ikkje har søsken skriv 'n'.".
    • Ta imot svaret, og set det lik variabelen svar.
    • Dersom svar er lik "j": skriv til skjermen "Du har søsken.".
    • Dersom svar ikkje er lik "j", men "n": skriv til skjermen "Du har ikkje søsken.".
    • Dersom svar er lik noko anna enn "j" eller "n": skriv til skjermen "Du skreiv noko som programmet ikkje forstod. Prøv ein gong til!".

I testen på while-lykkja (linje 2) må vi teste om variabelen svar verken har verdien "j" eller verdien "n". I motsett fall veit vi at brukaren har skrive eit rett svar, og programmet kan avslutte. Då skal ikkje while-lykkja køyre meir.

Legg merke til at alt som høyrer til i while-lykkja er rykt inn mot høgre på same måten som vi gjer med det som høyrer innunder if, elif og else i ein if-elif-else-struktur. Dersom vi legg til ei ny programlinje med kode lengst nede og rykkjer den heilt attende til venstremargen, vil koden ikkje vere ein del av while-lykkja.

Pythonkode å lære seg

Vis innhald

while

Struktur:

while vilkår:
    kodelinje
    kodelinje
    ...

Eksempel (vi går ut ifrå at a og b er talvariablar som har fått ein verdi):

while a < b:
    a = a + 1

Kvar gong lykkja blir køyrd, aukar verdien av variabelen a med 1. Lykkja vil køyre heilt til a ikkje lenger er mindre enn b. NB: Dersom a er større eller lik b i utgangspunktet, vil ikkje lykkja køyre i det heile.

Hugs også at kodelinjer som høyrer til ei while-lykkje skal vere rykt inn mot høgre.

Samanlikningsoperatorar

== lik

!= ikkje lik

>= større enn eller lik

<= mindre enn eller lik

Relatert innhald

Skrive av Bjarne Skurdal.
Sist fagleg oppdatert 10.06.2022