Hopp til innhold
Oppgave

Programmering med if-elif-else

Veivalg er noe av det mest sentrale i programmering.

AP-30 Koding

Se på programkoden nedenfor, og finn fem feil.

if svar = "ja"
print("Du vil gifte deg med meg!")
else print("Du vil ikke gifte deg med meg.")

Fasit
  1. Variabelen svar må være definert før den kan brukes i testen i if-setningen.
  2. Den logiske operatoren for å sjekke om noe er likt, er == (to likhetstegn).
  3. Det mangler kolon på slutten av den første linja.
  4. Den andre linja må rykkes inn.
  5. else skal stå på linje for seg selv.
  6. Det mangler kolon etter else på tredje linje.

Husk også at linje 4, som er den siste print()-kommandoen, må rykkes inn.

AP-31

Vi skal lage et program som regner ut ukelønnen din. Du har en timelønn på 195 kroner per time. Dersom du arbeider over 37,5 timer i løpet av en uke, skal du ha et timetillegg på 35 prosent til den vanlige timelønnen på overtidstimene. Som bruker av programmet skal du skrive inn hvor mange timer du har arbeidet i en uke.

a) Algoritme

Først skal vi lage et kort program som avgjør om du har arbeidet overtid i en aktuell uke ut ifra det timetallet som blir skrevet inn.
Skriv algoritmen til et slikt program, og husk å få med forklarende tekster.

Løsningsforslag
  • Skriv til skjermen "Dette programmet finner ut om du har arbeidet overtid eller ikke.".
  • Skriv til skjermen "Skriv inn hvor mange timer du har arbeidet den aktuelle uka.".
  • Ta imot tallet fra brukeren, og sett tallet lik variabelen timertotalt.
  • Dersom timertotalt er større enn 37,5: Skriv til skjermen "Du har arbeidet overtid.".
  • Dersom timertotalt ikke er større enn 37,5: Skriv til skjermen "Du har ikke arbeidet overtid.".

b) Koding

Skriv og kjør koden til programmet, og kontroller at det fungerer slik det skal.

Løsningsforslag

print("Dette programmet finner ut "
"om du har arbeidet overtid eller ikke.")
timertotalt = float(input("Skriv inn hvor mange timer "
"du har arbeidet den aktuelle uka."))
if timertotalt > 37.5:
     print("Du har arbeidet overtid.")
else:
     print("Du har ikke arbeidet overtid.")

c) Algoritme

Skriv resten av algoritmen som trengs for å regne ut ukelønnen og presentere den på skjermen. Husk å endre på forklarende tekster slik at de passer.

d) Koding

Skriv og test programkoden til algoritmen over.

e) Algoritme

Vi ønsker at programmet i tillegg skal spesifisere hvor mange timer som er overtid (dersom det er det), og hva lønnen blir for overtidstimene.
Endre på algoritmen i oppgave c) slik at dette blir oppfylt.

f) Koding

Skriv og test programkoden til algoritmen over.

AP-32

Vi skal lage et program som skal avgjøre om brukeren av programmet er over 38 år. Vi skal gå gjennom tre eksempler for hvordan vi kan gjøre dette.

a) Koding

Skriv koden til algoritmen nedenfor:

  • Skriv til skjermen "Trykk 'j' dersom du er over 38 år og 'n' dersom du ikke er det.".
  • Ta imot svaret fra brukeren, og sett det lik variabelen svar.
  • Dersom svar har verdien "j": Skriv til skjermen "Du er over 38 år.".
  • Dersom svar ikke har verdien "j", men "n": Skriv til skjermen "Du er 38 år eller yngre.".
Løsningsforslag

svar = input("Trykk 'j' dersom du er over 38 år "
"og 'n' dersom du ikke er det.")
if svar == "j":
    print("Du er over 38 år.")
elif svar == "n":
    print("Du er 38 år eller yngre.")

b) Koding

Lag koden til algoritmen nedenfor:

  • Skriv til skjermen "Trykk 'j' dersom du er over 38 år og 'n' dersom du ikke er det.".
  • Ta imot svaret fra brukeren, og sett det lik variabelen svar.
  • Dersom svar har verdien "j": Skriv til skjermen "Du er over 38 år.".
  • Dersom svar ikke har verdien "j": Skriv til skjermen "Du er 38 år eller yngre.".
Løsningsforslag

svar = input("Trykk 'j' dersom du er over 38 år "
"og 'n' dersom du ikke er det.")
if svar == "j":
    print("Du er over 38 år.")
else:
    print("Du er 38 år eller yngre.")

c) Algoritme

Et tredje alternativ til programkode er denne:

svar = input("Trykk 'j' dersom du er over 38 år "
"og 'n' dersom du ikke er det.")
if svar == "j":
    print("Du er over 38 år.")
if svar == "n":
    print("Du er 38 år eller yngre.")

Skriv algoritmen til dette programmet.

Løsningsforslag
  • Skriv til skjermen "Trykk 'j' dersom du er over 38 år og 'n' dersom du ikke er det.".
  • Ta imot svaret fra brukeren, og sett det lik variabelen svar.
  • Dersom svar er lik "j": Skriv til skjermen "Du er over 38 år.".
  • Dersom svar er lik "n": Skriv til skjermen "Du er 38 år eller yngre.".

d) Vurdering

Hva er forskjellen på disse tre programmene, og hvilket av dem er mest logisk å bruke?

Sjekk først

Gir de tre programvariantene samme resultat også dersom brukeren skriver noe annet enn "j" eller "n"?

Diskusjon

De tre programvariantene gir samme resultat med ett unntak. Dersom brukeren skriver noe annet enn "j" eller "n", får vi fremdeles svar fra det andre programalternativet. Det andre programalternativet fungerer slik at uansett hva annet enn "j" brukeren skriver, vil programmet oppfatte det som at brukeren er 38 år eller yngre fordi det er skrevet noe annet enn "j".

Det andre programalternativet følger derfor bedre logikken om at "enten er du over 38 år, eller så er du ikke det". Da burde vi klare oss med én test i programmet, noe som bare er oppfylt med det andre programalternativet. (Hvorfor er ikke dette oppfylt for alternativ 1 og alternativ 3?)

e) Vurdering

Hva er forskjellen på det første og det tredje programmet?

Forklaring

Forskjellen ligger i måten den andre testen blir kjørt på. I det første programmet blir den andre testen kjørt med kodeordet elif, mens i det tredje blir denne testen kjørt med if. Det blir en forskjell her, fordi at med kodeordet elif i det første programmet blir den andre testen bare kjørt dersom den første testen ikke slo til. I det tredje programmet blir den andre testen kjørt uansett om den første testen slår til eller ikke.

I dette tilfellet er det unødvendig å kjøre den andre testen dersom den første testen slår til. Det første programmet er derfor bedre enn det andre (selv om begge fungerer).

Dersom vi skal gjøre mange tester der det bare er ett "riktig" alternativ, vil programmet kjøre raskere jo flere tester man slipper å kjøre. Derfor prøver vi i størst mulig grad å bruke elif ved slike tilfeller, for da vil programmet hoppe ut av if-elif-else-strukturen med en gang en av testene slår til.

f) Algoritme

Gå tilbake til starten, og se hva som er hensikten til programmet. Finn en annen måte å løse problemet på. Skriv algoritmen til løsningen din.

Tips

Hva annet kan brukeren skrive inn enn "j" og "n" som kan avgjøre om hen er over 38 år?

g) Koding

Skriv og test koden til algoritmen i f).

AP-33

I Norge er det slik at arbeidstakere har krav på feriepenger, som kommer i stedet for lønn i ferien. Feriepengene for et år blir regnet ut ifra feriepengegrunnlaget, som er årslønnen det forrige året – etter at feriepengene for det forrige året er trukket ifra. (Man får altså ikke feriepenger av feriepenger.) Feriepengene skal være 10,2 prosent av feiepengegrunnlaget. Dersom arbeidstakeren er over 60 år, har hen krav på 12,5 prosent av feriepengegrunnlaget.

Vi ønsker å lage et program som regner ut feriepengene for en vilkårlig arbeidstaker.

a) Vurdering

Hvilke opplysninger må brukeren av programmet gi til programmet?

Svar

Programmet må ha

  • årslønnen for det forrige året
  • feriepengene for det forrige året
  • alderen på arbeidstakeren

b) Algoritme

Skriv algoritmen til et program som regner ut feriepengene til en arbeidstaker ut ifra de tre tallene i den forrige oppgaven.

Løsningsforslag
  • Skriv til skjermen "Dette programmet regner ut feriepengene til en arbeidstaker ut ifra årslønnen og feriepengene fra det forrige året i tillegg til alderen på arbeidstakeren.".
  • Skriv til skjermen "Skriv inn den totale årslønnen fra det forrige året:".
  • Ta imot tallet fra brukeren, og lagre det i variabelen total.
  • Skriv til skjermen "Skriv inn feriepengene fra det forrige året:".
  • Ta imot tallet fra brukeren, og lagre det i variabelen fp_gml.
  • Skriv til skjermen "Skriv inn alderen på arbeidstakeren:".
  • Ta imot tallet fra brukeren, og lagre det i variabelen alder.
  • Regn ut total minus fp_gml, og sett resultatet lik variabelen fp_grunnlag.
  • Dersom alderen er større enn 60: Multipliser fp_grunnlag med 12,5, del på 100, og sett resultatet lik variabelen fp.
  • Dersom alderen ikke er større enn 60: Multipliser fp_grunnlag med 10,2, del på 100, og set tresultatet lik variabelen fp.
  • Skriv til skjermen "Feriepengene blir <fp> kroner.".

c) Koding

Skriv koden til et program ut ifra algoritmen i den forrige oppgaven, og test at programmet fungerer.

Løsningsforslag

print("Dette programmet regner ut feriepengene til en arbeidstaker" " ut ifra årslønnen og feriepengene det forrige året"
" i tillegg til alderen på arbeidstakeren.")
total = float(input("Skriv inn den totale årslønnen fra det forrige året:"))
fp_gml = float(input("Skriv feriepengene fra det forrige året:"))
alder = float(input("Skriv inn alderen på arbeidstakeren:"))
fp_grunnlag = total - fp_gml

if alder > 60:
    fp = fp_grunnlag * 12.5 / 100
else:
    fp = fp_grunnlag * 10.2 / 100

print(f"Feriepengene blir {fp} kroner.")