Veivalg – if-elif-else - Konstruksjons- og styringsteknikk (TP-TIP vg1) - NDLAHopp til innhold
Verktøy og mal
Veivalg – if-elif-else
Et program må kunne gjøre valg ut ifra visse vilkår.
Problemstilling
Vi ønsker å lage et program der brukeren av programmet skal oppgi om hen er norsk eller svensk (vi later nå som om det ikke er andre alternativer). Dette skal gjøres ved at brukeren skriver inn "n" dersom hen er norsk eller "s" dersom hen er svensk. Deretter skal programmet skrive enten "Du er norsk." eller "Du er svensk." ut ifra svaret til brukeren. Programmet må starte med å gi instruksjoner til brukeren.
Oppgave – algoritme
Skriv algoritmen (instruksjonene) til programmet med ord.
Løsningsforslag
Algoritmen kan se slik ut:
Skriv til skjermen: "Dersom du er norsk, skriv 'n'. Dersom du er svensk, skriv 's'.".
Ta imot svaret til brukeren, og sett det lik variabelen svar.
Dersom svar har verdien "n", skriv til skjermen "Du er norsk.".
Dersom svar ikke er "n", men "s", skal det skrives "Du er svensk." til skjermen.
if-elif
I Python kan vi lage programmet til algoritmen ovenfor med en if-elif-struktur. Prøv først å kjøre programmet nedenfor med avspillingsknappen , og følg instruksjonene i programmet. (NB: Det kan ta litt tid fra du trykker på avspillingsknappen til programmet blir kjørt.)
Oppgave – koding
Prøv å skrive en forklaring på hva programmet gjør på hver linje.
Forklaring
På linje 1 blir teksten "Dersom du er norsk, skriv 'n'." skrevet ut til skjermen.
På linje 2 blir først teksten "Dersom du er svensk, skriv 's'." skrevet ut til skjermen. Deretter blir det som brukeren skriver inn, lagret i variabelen svar.
På linje 3 blir vilkåret om innholdet av variabelen svar er lik "n" testet.
På linje 4 blir det skrevet ut "Du er norsk." til skjermen dersom vilkåret på linje 3 er oppfylt.
På linje 5 blir vilkåret om innholdet av variabelen svar er lik "s" testet dersom – og bare dersom – vilkåret i linje 3 ikke er oppfylt.
På linje 6 blir det skrevet ut "Du er svensk." til skjermen dersom vilkåret på linje 5 blir testet og viser seg å være oppfylt.
Med en if-elif-struktur kan vi altså få programmet til å gjøre ulike ting basert på vilkår vi setter opp.
Oppgave – koding
Skriv ned en forklaring på hvorfor testen i linje 3 alltid blir gjort av programmet, mens testen i linje 5 bare blir gjort av og til.
Forslag til forklaring
Programmet vil alltid komme til linje 3 og kjøre testen der, men if-elif-strukturen er slik at dersom testen under if slår til, blir ikke testen under elif utført. Da vil programmet hoppe til neste linje som ikke er en del av if-elif-strukturen. (I programmet her er det ikke noe etter if-elif-strukturen.)
Oppgave – koding
Forklar hvorfor vi har brukt enkle apostrofer (') rundt "n" på linje 1 og rundt "s" på linje 2 i programmet ovenfor i stedet for doble apostrofer (").
Forklaring
Dersom vi hadde brukt doble apostrofer rundt "n", ville linje 1 ha sett slik ut:
print("Dersom du er norsk, skriv "n".")
Da får vi feilmelding fordi Python vil tro at først kommer det en tekststreng "Dersom du er norsk, skriv ". Deretter kommer det en "n" som ikke er definert noe sted. Vi ønsker at alt i print()-setningen skal se ut som én tekststreng. Da må vi bruke enkle apostrofer inne i tekststrengen for at Python skal skjønne at alt er bare én tekststreng. En dobbel apostrof (vanlig hermetegn) her vil oppfattes som at her slutter tekststrengen.
Problemet kommer når vi har bruk for hermetegn inne i en tekststreng (som i utgangspunktet er omsluttet av hermetegn). Vi løser problemet ved å bruke enkle apostrofer inne i tekststrengen slik vi har gjort her. Om vi insisterer på at vanlige hermetegn skal vises ved utskrift til skjerm, kan vi på linje 1 i programmet skrive
print('Dersom du er norsk, skriv "n".')
I Python kan vi altså velge om vi vil bruke enkle eller doble apostrofer til å markere tekststrenger.
Oppgave – koding
Hva skjer dersom brukeren av programmet ved et uhell har tasten caps lock aktivert slik at brukeren taster for eksempel "N" i stedet for "n" i programmet? Prøv dette, og forklar hvorfor vi får et slikt resultat.
Forklaring
I verken linje 3 eller i linje 5 er vilkåret oppfylt, og programmet vil derfor avslutte uten at det blir skrevet noe til skjermen. Årsaken til det er at ingen av de to testene slår til.
Vi kan lage programmet slik at det tar høyde for at brukeren skriver inn feil. Det fikser vi i det kommende avsnittet.
if-elif-else
Vi kan løse problemet med brukere som skriver feil ved å legge til en else-setning til slutt. else betyr at dersom ingen av de andre vilkårene er oppfylt, skal det som står under else bli oppfylt.
Vi ønsker at brukere som skriver noe annet enn "n" eller "s", får et passende svar, som for eksempel "Du må skrive inn enten liten 'n' eller liten 's'.". Det får vi til ved å skrive inn følgende rett etter koden som hører til elif:
else: print("Du må skrive inn enten liten 'n' eller liten 's'")
Skriv inn disse to linjene i programmet øverst på siden. Pass på at else: står helt inntil venstremargen og at print()-setningen står med innrykk slik som linjene 4 og 6, ellers vil ikke programmet fungere.
Eksempel (vi går ut ifra at a og b er tallvariabler som har fått en 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 ifikke 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 ikke slår til, vil programmet gå ut av if-elif-strukturen uten å skrive noe til skjermen.
Legg merke til at kodelinjene som hører til innunder if eller elif skal være rykket inn mot høyre. Det er slik Python vet hvilke linjer som hører til disse kodeordene. Ofte vil vi få dette innrykket automatisk i den kodeeditoren vi bruker.
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: Husk innrykk på de kodelinjene som hører til innunder if, elif og else. Vi kan ha så mange elif som vi vil, men bare én else.
Logiske operatorer
For å teste på to vilkår samtidig, bruker vi operatorene or eller and.
Eksempel med or (vi går ut ifra at x er en tallvariabel):
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: Hva skjer dersom vi i det siste eksempelet bytter ut and med or?
Sammenligningsoperatorer
< Mindre enn
> Større enn
== Lik
Aktiviteter
a) Algoritme
Vi ønsker å endre på det opprinnelige programmet slik at det ikke spiller noen rolle om brukeren skriver inn "n" eller "N" (og tilsvarende for "s" eller "S"). Endre på algoritmen til programmet slik at dette kravet blir oppfylt.
Løsningsforslag
Algoritmen kan se slik ut:
Skriv til skjermen: "Dersom du er norsk, skriv 'n'. Dersom du er svensk, skriv 's'.".
Ta imot svaret til brukeren, og sett det lik variabelen svar.
Dersom svar har verdien "n" eller verdien "N", skriv til skjermen "Du er norsk.".
Dersom svar ikke er "n" eller "N", men "s" eller "S", skal det skrives "Du er svensk." til skjermen.
b) Koding
Skriv koden til algoritmen over, og test at programmet fungerer slik det skal.
Tips
Her passer det å bruke or for at programmet skal akseptere enten "n" eller "N" og enten "s" eller "S".
Løsningsforslag
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 ønsker å endre på programmet i oppgaven ovenfor slik at brukeren kan skrive om hen er norsk, svensk, dansk eller britisk. Skriv om på algoritmen i a) slik at dette blir oppfylt.
Løsningsforslag
Algoritmen kan se 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 brukeren, og sett det lik variabelen svar.
Dersom svar har verdien "n" eller verdien "N", skriv til skjermen "Du er norsk.".
Dersom svar ikke er "n" eller "N", men "s" eller "S", skal det skrives "Du er svensk." til skjermen.
Dersom ingen av alternativene over er oppfylt og svar har verdien "d" eller verdien "D", skriv til skjermen "Du er dansk.".
Dersom ingen av alternativene over er oppfylt 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
Husk at det går an å ha flere elif i en if-elif-else-struktur. (Det kan bare være én else.)
Løsningsforslag
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 ifra et logisk ståsted: Hva er problemet med programmene over?
Kommentar
Problemet er: Hva skal en bruker svare dersom hen verken er norsk, svensk, dansk eller britisk?
Dersom vi skal ta hensyn til alle nasjonaliteter, blir det et langt program, men vi kan få programmet til å skrive "Du er verken norsk, svensk, dansk eller britisk" dersom brukeren skriver for eksempel "a".
f) Algoritme
Vi ønsker å endre på programmet i oppgaven ovenfor slik at brukeren kan skrive om hen er norsk, svensk, dansk, britisk eller noe annet. Skriv om på algoritmen i c) slik at dette blir oppfylt.
Løsningsforslag
Algoritmen kan se 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 delene, skriv 'a'.".
Ta imot svaret til brukeren, og sett det lik variabelen svar.
Dersom svar har verdien "n" eller verdien "N", skriv til skjermen "Du er norsk.".
Dersom svar ikke er "n" eller "N", men "s" eller "S", skal det skrives "Du er svensk." til skjermen.
Dersom ingen av alternativene over er oppfylt og svar har verdien "d" eller verdien "D", skriv til skjermen "Du er dansk.".
Dersom ingen av alternativene over er oppfylt og svar har verdien "b" eller verdien "B", skriv til skjermen "Du er britisk.".
Dersom ingen av alternativene over er oppfylt, 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
Husk at det går an å ha flere elif i en if-elif-else-struktur. (Det kan bare være én else.)
Løsningsforslag
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 delene, 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:
Hvorfor har vi ikke testet om svar har verdien "a" i løsningsforslaget?