Vilkår (if-tester)#
Læringsutbytte
Etter å ha arbeidet med dette temaet, skal du kunne:
bruke vilkår til å systematisere valg i programkode
illustrere og løse matematiske og naturvitenskapelige problemstillinger med sammensatt kode der vilkår inngår
Innledende oppgave
Før du går i gang med å programmere, prøv å forklare hva følgende kodesnutter gjør:
tall = 10
if tall > 8:
print("Tallet er større enn 8.")
tall = 10
if tall < 8:
print("Tallet er mindre enn 8.")
tall = 10
if tall < 8:
print("Tallet er mindre enn 8.")
else:
print("Tallet er ikke mindre enn 8.")
tall = 10
if tall < 8:
print("Tallet er mindre enn 8.")
elif tall >= 8:
print("Tallet er ikke mindre enn 8.")
Definisjon#
Vilkår
Et vilkår, eller en betingelse, er en logisk test for å sjekke om et kriterium er oppfylt. Dersom kriteriet er oppfylt, utføres det en handling. Dersom kriteriet ikke er oppfylt, blir ikke handlingen utført. Vilkår beskrives ofte i programmering som en «hvis-setning» («if» i Python).
Vilkår er sentrale i programmering, men også sentrale i hverdagen. Vi kan lage et enkelt eksempel ut fra billettpriser på bussen. Hvis du er under 18 år, blir prisen 31 kroner. Hvis ikke, regnes du som voksen, og må betale 62 kroner. Vi kan beskrive dette med følgende pseudokode:
hvis alder er mindre enn 18:
pris = 31
hvis ikke:
pris = 62
Dersom vi oversetter denne pseudokoden til Python-kode, ser vi at logikken og strukturen er ganske lik:
if alder < 18:
pris = 31
else:
pris = 62
Underveisoppgave
Vi kan illustrere hvordan vilkår fungerer med et puslespill. Puslespillet nedenfor er basert på billettpriseksempelet. Løs dette puslespillet uten å se på Python-koden ovenfor. Pass på at innrykkene er riktig! Hva tror du innrykk betyr?
Vilkår i Python#
La oss se på et eksempel i Python:
tall = float(input("Tast inn et tall: "))
if tall > 1:
print("Hurra, tallet er større enn 1!")
Programmet ber brukeren om å taste inn et vilkårlig tall som deretter konverteres til flyttall. Vilkåret starter med if, etterfulgt av variabelnavnet. Deretter gir vi et kriterium som skal sjekkes. Her tester vi om tallet er større enn 1. Dersom det er større enn 1, skrives det ut en beskjed. Vi må ha et kolon etter første linje, og innrykk på alt som hører til det spesifikke kriteriet. Dersom kriteriet ikke er oppfylt, skjer det ingen ting. Dersom vi vil at det skal skje noe selv om kriteriet ikke er oppfylt, kan vi legge til else-kommandoen:
tall = float(input("Tast inn et tall: "))
if tall > 1:
print("Hurra, tallet er større enn 1!")
else:
print("Tallet er ikke større enn 1.")
Dersom kriteriet (tall > 1) ikke er sant, blir beskjeden etter else skrevet ut. Vi kan legge til enda flere kriterier ved å bruke elif (forkortelse for else if):
tall = float(input("Tast inn et tall: "))
if tall > 1:
print("Hurra, tallet er større enn 1!")
elif tall < 1:
print("Tallet er mindre enn 1!")
else:
print("Tallet er 1!")
Det er en logisk konklusjon at tallet er 1 dersom det verken er større eller mindre enn 1. For å være helt sikre, kan vi erstatte else-kommandoen med nok en elif-kommando:
tall = float(input("Tast inn et tall: "))
if tall > 1:
print("Hurra, tallet er større enn 1!")
elif tall < 1:
print("Tallet er mindre enn 1!")
elif tall == 1:
print("Tallet er 1!")
Legg merke til at symbolet == brukes for å teste om tallet er lik 1. Dersom vi bruker enkel likhetstegn (=) tror Python at vi prøver å tilordne en variabel. Da får vi en feilmelding. De ulike symbolene som brukes i vilkår, er oppsummert i tabellen nedenfor.
Symbol |
Betydning |
---|---|
> |
Større enn |
< |
Mindre enn |
== |
Er lik |
<= |
Mindre enn eller lik |
>= |
Større enn eller lik |
!= |
Ikke lik |
Det er noen ting å passe spesielt på når vi programmerer med vilkår:
Alt som er rykket inn utføres kun hvis if-testen ovenfor er sann. Innrykk er derfor viktig for strukturen.
“elif” står for “else if”, og sjekker noe nytt, mens “else” brukes for å gjøre noe dersom ingen av kriteriene under “if” og “elif” er sanne.
Det er den første if-testen som er sann i en serie av if-elif-else som utføres. Alle andre overses. Dersom vi skriver “if” en gang til, begynner vi på en ny serie med if-elif-else.
Vi må begynne med “if”, mens “elif” og “else” er valgfritt.
Underveisoppgave
Lag et program der du sjekker om et tall er positivt, negativt eller null, og skriver ut relevante setninger når de ulike kriteriene er nådd. Du kan ta utgangspunkt i programkoden i kodeboksen her:
Løsningsforslag
tall = 2
if tall > 0:
print("Tallet er positivt")
elif tall < 0:
print("Tallet er negativt")
else: # Eventuelt elif tall == 0:
print("Tallet er 0")
Undervisningstips
Vilkår er som regel ganske greit for mange elever å forstå. Vær nøye på kolon etter selve betingelsen for vilkåret og innrykk som markerer det som skal skje hvis betingelsen er sann. Minn også elevene på at if og elif skal ha en betingelse rett etter, mens else skal aldri det (else avsluttes alltid direkte med kolon).
Bruk gjerne flytskjemaer og programmeringspuslespill for å gjøre det lettere å lære vilkår.
Nøstede vilkår#
Vi kan også ha vilkår inni vilkår. Dette er spesielt nyttig hvis vi skal sjekke flere ting som er avhengige av hverandre. Nedenfor ser du en svært forenklet bestemmelsesnøkkel for grunnstoffer som illustrerer prinsippet. Kanskje du kan legge inn et kriterium til som gjør bestemmelsen mer presis?
elektronegativitet = float(input("Hvilken elektronegativitet har grunnstoffet? "))
if elektronegativitet > 2:
print("Grunnstoffet er mest sannsynlig et ikke-metall.")
else:
reaktivt = input("Er grunnstoffet svært reaktivt (ja/nei)? ")
if reaktivt == "ja":
print("Grunnstoffet er mest sannsynlig et alkalimetall.")
elif reaktivt == "nei":
print("Grunnstoffet kan for eksempel være et innskuddsmetall eller et jordalkalimetall.")
Hvilken elektronegativitet har grunnstoffet? 2.0
Er grunnstoffet svært reaktivt (ja/nei)? nei
Grunnstoffet kan for eksempel være et innskuddsmetall eller et jordalkalimetall.
Underveisoppgave
Bruk flytskjemaet nedenfor som utgangspunkt for et program som finner ut hva slags bergart du har oppdaget.
Løsningsforslag
print("Velkommen til bestemmelsesnøkkel for bergarter!")
prikker = input("Er mønsteret i steinen prikkete (ja/nei)? ")
if prikker == "ja":
print("Du har funnet en magmatisk bergart.")
elif prikker == "nei":
striper = input("Er mønsteret i steinen stripete (ja/nei)? ")
if striper == "ja":
print("Du har funnet en metamorf bergart.")
elif striper == "nei":
print("Du har funnet en sedimentær bergart.")
else:
print("Vennligst svar 'ja' eller 'nei'")
else:
print("Vennligst svar 'ja' eller 'nei'")
Oppgaver#
Oppgave 3.1
Forklar hvorfor de to ulike programmene nedenfor gir ulike output.
a = 10
if a > 5:
a = a + 5
a = a + 2
print(a)
a = 10
if a > 5:
a = a + 5
else:
a = a + 2
print(a)
Løsningsforslag
Verdien til a er større enn 5. Dette gjør at programmet vil gjøre det som står under if i begge programmene.
Første program vil utføre a = a + 2 etter if -testen uansett om a > 5 stemmer eller ikke. Dette er fordi a = a + 2 ikke er en del av if-testen.
Siden andre kodesnutt bruker en else-kommando, vil a = a + 2 utføres kun når a ikke er større enn 5. Siden verdien til a er større enn 5, vil programmet utføre det som står under if.
Oppgave 3.2
Lag et program som spør brukeren om alderen til brukeren. Skriv ut en kommentar som avhenger av om alderen er under eller over 17. Utvid programmet til å skille mellom flere aldre.
Løsningsforslag
alder = int(input("Hvor gammel er du? "))
if alder < 17:
print("Dra tilbake til barnehagen!")
elif alder == 17:
print("Du er i din beste alder")
elif alder < 25:
print("Voksenlivet nærmer seg!")
else:
print("Dra tilbake til gamlehjemmet!")
Oppgave 3.3
Lag et program som tar en poengsum som input. Programmet skal finne ut hvilken karakter du får dersom maks poengsum er 60 poeng. Finn på karaktergrenser selv.
Utvid programmet med en maks poengsum. Programmet skal benytte prosenter av denne makssummen til å regne ut sluttkarakteren. Lag prosentgrensene selv.
Løsningsforslag
maks_poeng = int(input("Hva er maks poengsum? "))
poengsum = int(input("Hvor mange poeng fikk du? "))
prosent1 = 20
prosent2 = 40
prosent3 = 60
prosent4 = 80
prosent5 = 95
grense1 = maks_poeng /100*prosent1
grense2 = maks_poeng /100*prosent2
grense3 = maks_poeng /100*prosent3
grense4 = maks_poeng /100*prosent4
grense5 = maks_poeng /100*prosent5
if poengsum < grense1 :
karakter = 1
elif poengsum < grense2 :
karakter = 2
elif poengsum < grense3 :
karakter = 3
elif poengsum < grense4 :
karakter = 4
elif poengsum < grense5 :
karakter = 5
else: # poengsum må være større enn grense5
karakter = 6
print("Du fikk karakteren", karakter)
Oppgave 3.4
Lag et program som tar to tall som input. Programmet skal skrive ut hvilket av de to tallene som er størst.
Løsningsforslag
tall1 = int(input("Skriv et tall: "))
tall2 = int(input("Skriv et til tall: "))
if tall1 > tall2:
største = tall1
else:
største = tall2
print("Det største tallet av", tall1 ,"og", tall2,"er:", største)
Oppgave 3.5
Løs dette programmeringspuslespillet. Programmet skal skrive ut antallet løsninger i en andregradslikning. Når du er ferdig, kan du prøve dette puslespillet, som er en litt mer avansert variant. Forklar forskjellen på programmene.
Oppgave 3.6
Lag et program som tar utgangspunkt i puslespillet ovenfor. Programmet skal også regne ut hva løsningene er.
Løsningsforslag
a = 1
b = -3
c = 2
rotuttrykk = b**2 - 4*a*c
if rotuttrykk > 0:
x1 = (-b + rotuttrykk**0.5)/(2*a)
x2 = (-b - rotuttrykk**0.5)/(2*a)
print("Likningen har løsningene x1 =", x1, "og x2 =", x2)
elif rotuttrykk == 0:
x = -b/(2*a)
print("Likningen har løsningen x = ", x)
else:
print("Likningen har ingen reelle løsninger.")
Oppgave 3.7
Lag en kalkulator der brukeren må taste inn to tall og en regneoperasjon. Du bestemmer selv hvor mange regneoperasjoner programmet skal håndtere.
Løsningsforslag
tall1 = float(input("Første tall: "))
op = input("Velg operasjon ( + , - , / , * ): ")
tall2 = float(input(" Andre tall: "))
if op == "+":
resultat = tall1 + tall2
elif op == "-":
resultat = tall1 - tall2
elif op == "/":
resultat = tall1 / tall2
elif op == "*":
resultat = tall1 * tall2
else:
resultat = "udefinert "
print(tall1, op, tall2, "=", resultat)
Fysikkoppgave
Lag et program der du kan taste inn bølgelengden til synlig lys i nm og få ut hvilken farge lyset har. Utvid eventuelt programmet med andre deler av det elektromagnetiske spekteret.
Løsningsforslag
bl = float(input("Skriv inn lysets bølgelengde i nm: "))
if 380 <= bl < 420:
farge = "fiolett"
elif 420 <= bl < 490:
farge = "blå"
elif 490 <= bl < 575:
farge = "grønn"
elif 575 <= bl < 585:
farge = "gul"
elif 585 <= bl < 650:
farge = "oransje "
elif 650 <= bl <= 750:
farge = "rød"
else:
farge = "udefinert "
print("Fargen til lyset er:", farge )
Kjemioppgave
Lag et program med en variabel kalt pH. Programmet skal skrive ut om løsningen med denne pH-en er sur, basisk eller nøytral.
Her står \([H_3O^+]\) for konsentrasjonen av \(H_3O^+\)-ioner. Test programmet med \([H_3O^+] = 1\cdot 10^{-7}\). Dette bør gi nøytral løsning.
Løsningsforslag
from numpy import log10
oksonium = float(input("[H3O+]: "))
pH = -log10(oksonium)
if pH < 7:
print("Løsningen er sur.")
elif pH > 7:
print("Løsningen er basisk.")
elif pH == 7: # Eventuelt else:
print("Løsning er nøytral.")
Biologioppgave
Vi skal se på en populasjon av mennesker og ser på et gen som finnes i to varianter: \(a\) og \(A\). Andelen av populasjonen som har variant \(a\) kan vi kalle for \(p\) og andelen av populasjonen som har variant \(A\) kan vi kalle for \(q\). Verdiene til \(p\) og \(q\) må være mellom 0 og 1. Siden alle i populasjonen vil ha enten \(a\) eller \(A\) (eller begge), må \(p + q = 1\).
Populasjonen sies å være i Hardy-Weinberg-likevekt dersom verdiene til \(p\) og \(q\) ikke forandrer seg under forutsetningen at det foregår tilfeldig paring, ingen mutasjoner, ingen naturlig seleksjon og ingen evolusjon i populasjonen.
Dersom populasjonen er i Hardy-Weinberg-likevekt kan en finne andelen til de tre mulige genotypene til menneskene i populasjonen:
\(AA\) : \(p^2\)
\(Aa\) : \(2pq\)
\(aa\) : \(q^2\)
Lag et program som ber brukeren om verdien til \(p\) og \(q\). Programmet skal så teste om \( p + q = 1\). Hvis summen er 1, skal programmet regne ut andelene til de tre mulige genotypene, og skrive dem ut. Hvis summen ikke er 1, skal programmet skrive en feilmelding.
Løsningsforslag
p = float(input(" Hvor stor andel har genvariant a?: "))
q = float(input(" Hvor stor andel har genvariant A?: "))
if p + q == 1:
AA = p**2
Aa = 2*p*q
aa = q**2
print(" Andel som har genotype AA:", round(AA,2))
print(" Andel som har genotype Aa:", round(Aa,2))
print(" Andel som har genotype aa:", round(aa,2))
else:
print("Summen av p og q er ikke lik 1!")
Video#
Se videoen nedenfor for å få en gjennomgang av det viktigste når vi skal programmere if-tester i Python: