Vegval – if-elif-else - Konstruksjons- og styringsteknikk (TP-TIP vg1) - NDLA

Hopp til innhald
Verktøy og mal

Vegval – if-elif-else

Eit program må kunne gjere val ut ifrå visse vilkår.

Problemstilling

Vi ønskjer å lage eit program der brukaren av programmet skal oppgi om hen er norsk eller svensk (vi latar no som om det ikkje er andre alternativ). Dette skal gjerast ved at brukaren skriv inn "n" dersom hen er norsk eller "s" dersom hen er svensk. Deretter skal programmet skrive anten "Du er norsk." eller "Du er svensk." ut ifrå svaret til brukaren. Programmet må starte med å gi instruksjonar til brukaren.

Oppgåve – algoritme

Skriv algoritmen (instruksjonane) til programmet med ord.

Løysingsforslag

Algoritmen kan sjå slik ut:

  • Skriv til skjermen: "Dersom du er norsk, skriv 'n'. Dersom du er svensk, skriv 's'.".
  • Ta imot svaret til brukaren, og set det lik variabelen svar.
  • Dersom svar har verdien "n", skriv til skjermen "Du er norsk.".
  • Dersom svar ikkje er "n", men "s", skal det skrivast "Du er svensk." til skjermen.

if-elif

I Python kan vi lage programmet til algoritmen ovanfor med ein if-elif-struktur. Prøv først å køyre programmet nedanfor med avspelingsknappen , og følg instruksjonane i programmet. (NB: Det kan ta litt tid frå du trykkjer på avspelingsknappen til programmet blir køyrt.)

Oppgåve – koding

Prøv å skrive ei forklaring på kva programmet gjer på kvar linje.

Forklaring

På linje 1 blir teksten "Dersom du er norsk, skriv 'n'." skrive ut til skjermen.

På linje 2 blir først teksten "Dersom du er svensk, skriv 's'." skrive ut til skjermen. Deretter blir det som brukaren skriv inn, lagra i variabelen svar.

På linje 3 blir vilkåret om innhaldet av variabelen svar er lik "n" testa.

På linje 4 blir det skrive ut "Du er norsk." til skjermen dersom vilkåret på linje 3 er oppfylt.

På linje 5 blir vilkåret om innhaldet av variabelen svar er lik "s" testa dersom – og berre dersom – vilkåret i linje 3 ikkje er oppfylt.

På linje 6 blir det skrive ut "Du er svensk." til skjermen dersom vilkåret på linje 5 blir testa og viser seg å vere oppfylt.

Med ein if-elif-struktur kan vi altså få programmet til å gjere ulike ting basert på vilkår vi set opp.

Oppgåve – koding

Skriv ned ei forklaring på kvifor testen i linje 3 alltid blir gjort av programmet, mens testen i linje 5 berre blir gjort av og til.

Forslag til forklaring

Programmet vil alltid kome til linje 3 og køyre testen der, men if-elif-strukturen er slik at dersom testen under if slår til, blir ikkje testen under elif utført. Då vil programmet hoppe til neste linje som ikkje er ein del av if-elif-strukturen. (I programmet her er det ikkje noko etter if-elif-strukturen.)

Oppgåve – koding

Forklar kvifor vi har brukt enkle apostrofar (') rundt "n" på linje 1 og rundt "s" på linje 2 i programmet ovanfor i staden for doble apostrofar (").

Forklaring

Dersom vi hadde brukt doble apostrofar rundt "n", ville linje 1 ha sett slik ut:

print("Dersom du er norsk, skriv "n".")

Då får vi feilmelding fordi Python vil tru at først kjem det ein tekststreng "Dersom du er norsk, skriv ". Deretter kjem det ein "n" som ikkje er definert nokon stad. Vi ønskjer at alt i print()-setninga skal sjå ut som éin tekststreng. Då må vi bruke enkle apostrofar inne i tekststrengen for at Python skal skjøne at alt er berre éin tekststreng. Ein dobbel apostrof (vanleg hermeteikn) her vil oppfattast som at her sluttar tekststrengen.

Problemet kjem når vi har bruk for hermeteikn inne i ein tekststreng (som i utgangspunktet er omslutta av hermeteikn). Vi løyser problemet ved å bruke enkle apostrofar inne i tekststrengen slik vi har gjort her. Om vi insisterer på at vanlege hermeteikn skal visast ved utskrift til skjerm, kan vi på linje 1 i programmet skrive

print('Dersom du er norsk, skriv "n".')

I Python kan vi altså velje om vi vil bruke enkle eller doble apostrofar til å markere tekststrengar.

Oppgåve – koding

Kva skjer dersom brukaren av programmet ved eit uhell har tasten caps lock aktivert slik at brukaren tastar til dømes "N" i staden for "n" i programmet? Prøv dette, og forklar kvifor vi får eit slikt resultat.

Forklaring

I verken linje 3 eller i linje 5 er vilkåret oppfylt, og programmet vil derfor avslutte utan at det blir skrive noko til skjermen. Årsaken til det er at ingen av dei to testane slår til.

Vi kan lage programmet slik at det tek høgde for at brukaren skriv inn feil. Det fiksar vi i det komande avsnittet.

if-elif-else

Vi kan løyse problemet med brukarar som skriv feil ved å leggje til ei else-setning til slutt. else betyr at dersom ingen av dei andre vilkåra er oppfylte, skal det som står under else bli oppfylt.

Vi ønskjer at brukarar som skriv noko anna enn "n" eller "s", får eit passande svar, som til dømes "Du må skrive inn anten liten 'n' eller liten 's'.". Det får vi til ved å skrive inn følgjande rett etter koden som høyrer til elif:

else:
    print("Du må skrive inn anten liten 'n' eller liten 's'")

Skriv inn desse to linjene i programmet øvst på sida. Pass på at else: står heilt inntil venstremargen og at print()-setninga står med innrykk slik som linjene 4 og 6, elles vil ikkje programmet fungere.

Pythonkode å lære seg

Vis innhald

if-elif

Struktur:

if vilkår 1:
    kodelinje
    kodelinje
    ...
elif vilkår 2:
    kodelinje
    kodelinje
    ...

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

if a < b:
    print(f"{a} er mindre enn {b}.")
elif a == b:
    print("a og b er like store fordi")
    print(f"{a} = {b}.")

Dersom testen ved if slår til, vil programmet skrive til skjermen "<verdien til a> er mindre enn <verdien til b>". Dersom testen ved if ikkje slår til og testen ved elif slår til, vil programmet skrive til skjermen "a og b er like store fordi <verdien av a> = <verdien av b>". Dersom testen ved elif heller ikkje slår til, vil programmet gå ut av if-elif-strukturen utan å skrive noko til skjermen.

Legg merke til at kodelinjene som høyrer til innunder if eller elif skal vere rykte inn mot høgre. Det er slik Python veit kva for linjer som høyrer til desse kodeorda. Ofte vil vi få dette innrykket automatisk i den kodeeditoren vi bruker.

if-elif-else

Struktur:

if vilkår 1:
     kodelinje
     kodelinje
     ...
elif vilkår 2:
     kodelinje
     kodelinje
     ...
else:
     kodelinje
     kodelinje
     ...

Eksempel:

if a < b:
     print(f"{a} er mindre enn {b}.")
elif a == b:
     print("a og b er like store fordi")
     print(f"{a} = {b}.")    
else:
     print(f"{a} er større enn {b}.")

Merk: Hugs innrykk på dei kodelinjene som høyrer til inn under if, elif og else.
Vi kan ha så mange elif som vi vil, men berre ein else.

Logiske operatorar

For å teste på to vilkår samtidig, bruker vi operatorane or eller and.

Eksempel med or (vi går ut ifrå at x er ein talvariabel):

if x < 3 or x > 5:
    print("x er mindre enn 3 eller større enn 5.")

Eksempel med and:

if x > 3 and x < 5:
    print(f"{x} er i intervallet mellom 3 og 5.")

Spørsmål: Kva skjer dersom vi i det siste eksempelet byter ut and med or?

Samanlikningsoperatorar

< Mindre enn

> Større enn

== Lik

Aktivitetar

a) Algoritme

Vi ønskjer å endre på det opphavelege programmet slik at det ikkje speler noka rolle om brukaren skriv inn "n" eller "N" (og tilsvarande for "s" eller "S").
Endre på algoritmen til programmet slik at dette kravet blir oppfylt.

Løysingsforslag

Algoritmen kan sjå slik ut:

  • Skriv til skjermen: "Dersom du er norsk, skriv 'n'. Dersom du er svensk, skriv 's'.".
  • Ta imot svaret til brukaren, og set det lik variabelen svar.
  • Dersom svar har verdien "n" eller verdien "N", skriv til skjermen "Du er norsk.".
  • Dersom svar ikkje er "n" eller "N", men "s" eller "S", skal det skrivast "Du er svensk." til skjermen.

b) Koding

Skriv koden til algoritmen over, og test at programmet fungerer slik det skal.

Tips

Her passar det å bruke or for at programmet skal akseptere anten "n" eller "N" og anten "s" eller "S".

Løysingsforslag

print("Dersom du er norsk, skriv 'n'.")
svar = input("Dersom du er svensk, skriv 's'.")
if svar == "n" or svar == "N":
     print("Du er norsk.")
elif svar == "s" or svar == "S":
     print("Du er svensk.")

c) Algoritme

Vi ønskjer å endre på programmet i oppgåva ovanfor slik at brukaren kan skrive om hen er norsk, svensk, dansk eller britisk.
Skriv om på algoritmen i a) slik at dette blir oppfylt.

Løysingsforslag

Algoritmen kan sjå slik ut:

  • Skriv til skjermen: "Dersom du er norsk, skriv 'n'. Dersom du er svensk, skriv 's'. Dersom du er dansk, skriv 'd'. Dersom du er britisk, skriv 'b'.".
  • Ta imot svaret til brukaren, og set det lik variabelen svar.
  • Dersom svar har verdien "n" eller verdien "N", skriv til skjermen "Du er norsk.".
  • Dersom svar ikkje er "n" eller "N", men "s" eller "S", skal det skrivast "Du er svensk." til skjermen.
  • Dersom ingen av alternativa over er oppfylte og svar har verdien "d" eller verdien "D", skriv til skjermen "Du er dansk.".
  • Dersom ingen av alternativa over er oppfylte og svar har verdien "b" eller verdien "B", skriv til skjermen "Du er britisk.".

d) Koding

Skriv koden til algoritmen over, og test at programmet fungerer slik det skal.

Tips

Hugs at det går an å ha fleire elif i ein if-elif-else-struktur. (Det kan berre vere éin else.)

Løysingsforslag

print("Dersom du er norsk, skriv 'n'.")
print("Dersom du er svensk, skriv 's'.")
print("Dersom du er dansk, skriv 'd'.")
svar = input("Dersom du er britisk, skriv 'b'.")
if svar == "n" or svar == "N":
     print("Du er norsk.")
elif svar == "s" or svar == "S":
     print("Du er svensk.")
elif svar == "d" or svar == "D":
     print("Du er dansk.")
elif svar == "b" or svar == "B":
     print("Du er britisk.")

e) Vurdering

Ut ifrå ein logisk ståstad: Kva er problemet med programma over?

Kommentar

Problemet er: Kva skal ein brukar svare dersom hen verken er norsk, svensk, dansk eller britisk?

Dersom vi skal ta omsyn til alle nasjonalitetar, blir det eit langt program, men vi kan få programmet til å skrive "Du er verken norsk, svensk, dansk eller britisk" dersom brukaren skriv til dømes "a".

f) Algoritme

Vi ønskjer å endre på programmet i oppgåva ovanfor slik at brukaren kan skrive om hen er norsk, svensk, dansk, britisk eller noko anna.
Skriv om på algoritmen i c) slik at dette blir oppfylt.

Løysingsforslag

Algoritmen kan sjå slik ut:

  • Skriv til skjermen: "Dersom du er norsk, skriv 'n'. Dersom du er svensk, skriv 's'. Dersom du er dansk, skriv 'd'. Dersom du er britisk, skriv 'b'. Dersom du er ingen av delane, skriv 'a'.".
  • Ta imot svaret til brukaren, og set det lik variabelen svar.
  • Dersom svar har verdien "n" eller verdien "N", skriv til skjermen "Du er norsk.".
  • Dersom svar ikkje er "n" eller "N", men "s" eller "S", skal det skrivast "Du er svensk." til skjermen.
  • Dersom ingen av alternativa over er oppfylte og svar har verdien "d" eller verdien "D", skriv til skjermen "Du er dansk.".
  • Dersom ingen av alternativa over er oppfylte og svar har verdien "b" eller verdien "B", skriv til skjermen "Du er britisk.".
  • Dersom ingen av alternativa over er oppfylte, skriv til skjermen "Du er verken norsk, svensk, dansk eller britisk.".

g) Koding

Skriv koden til algoritmen over, og test at programmet fungerer slik det skal.

Tips

Hugs at det går an å ha fleire elif i ein if-elif-else-struktur. (Det kan berre vere éin else.)

Løysingsforslag

print("Dersom du er norsk, skriv 'n'.")
print("Dersom du er svensk, skriv 's'.")
print("Dersom du er dansk, skriv 'd'.")
print("Dersom du er britisk, skriv 'b'.")
svar = input("Dersom du er ingen av delane, skriv 'a'.")
if svar == "n" or svar == "N":
     print("Du er norsk.")
elif svar == "s" or svar == "S":
     print("Du er svensk.")
elif svar == "d" or svar == "D":
     print("Du er dansk.")
elif svar == "b" or svar == "B":
     print("Du er britisk.")
else:
     print("Du er verken norsk, svensk, dansk eller britisk.")

Spørsmål:

Kvifor har vi ikkje testa om svar har verdien "a" i løysingsforslaget?

Relatert innhald

Skrive av Bjarne Skurdal.
Sist fagleg oppdatert 05.08.2020