Vilkår (if-tester)#

Læringsutbytte

Etter å ha arbeidet med dette temaet, skal du kunne:

  1. bruke vilkår til å systematisere valg i programkode

  2. 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 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:

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.

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)

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.

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.

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.

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.

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.

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.

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.

\[pH = -log([H_3O^+])\]

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.

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.

Video#

Se videoen nedenfor for å få en gjennomgang av det viktigste når vi skal programmere if-tester i Python: