Løsningsforslag, forgreininger og løkker

Forgreininger med «if»

Oppgave 1:

Et krydder som selges i løsvekt, koster kr 0,90 per gram hvis vi kjøper inntil 25 gram og kr 0,80 per gram hvis vi kjøper 25 gram eller mer. Vi skal skrive Python-kode som leser inn vekt og skriver ut gramprisen. Koden kan se slik ut:

# Les inn vekt og skriv ut grampris på krydder
vekt = int(input("Oppgi antall gram: "))
if vekt < 25:
    pris = 0.9
else:
    pris = 0.8
print(f"Grampris er kr {pris}.")

Tilbake til oppgaven

Oppgave 2:

En student har skrevet koden under for å doble verdien til variabelen x hvis x er større enn 0, men la x være uendret ellers:

if x > 0:
    x *= 2
else:
    x = x

En annen student har skrevet koden under for å gjøre det samme:

if x > 0:
    x *= 2
else:
    pass

Vi skal vurdere om én av de to variantene er bedre enn den andre, og om koden eventuelt kan skrives på en enklere måte.

Begge variantene inneholder kode som ikke har noen effekt, så ingen av dem er særlig bra. Men å sette en variabel lik seg selv, slik som x = x, er alltid meningsløst, så den første varianten er kanskje håret dårligere enn den siste.

Det er ikke uvanlig at studenter tar med en else som ikke har noen effekt, slik som her. Grunnen er antakelig at vi ofte bruker else sammen med if, og at de derfor tror at det er et krav å ha med else. Som en plassholder putter de så inn kode som ikke gjør noe. Men hvis vi ikke har meningsfull kode til else-blokka, sløyfer vi bare else. Så en kode som gjør akkurat det samme, kan se slik ut:

if x > 0:
    x *= 2

Tilbake til oppgaven

Oppgave 3:

I koden under er det brukt en innrykket kommentar i stedet for kodeordet pass, og vi skal vurdere om koden er riktig.

radius = int(input("Oppgi radius: "))
if radius >= 0:
# Kommer senere
else:
    print("Radius kan ikke være negativ.")

Koden er ikke riktig. Kommentarer blir ignorert av Python, så slik Python ser det, står det ikke noe på den innrykkede linja. Vi har derved en tom kodeblokk, og vi får en feilmelding.

Tilbake til oppgaven

Strukturere «if»

Oppgave 1:

Vi skal fjerne overflødige betingelser i Python-koden under.

vekt = int(input("Oppgi vekt i gram: "))
if vekt < 25:
    pris = 0.90
elif 25 <= vekt < 50:
    pris = 0.80
elif 50 <= vekt < 100:
    pris = 0.75
elif vekt >= 100:
    pris = 0.70
print(f"Total pris på {vekt} g krydder er kr {pris * vekt:.2f}")

Hvis vi kommer til første elif, vet vi allerede at 25 <= vekt, så denne betingelsen kan fjernes. Hvis vi kommer til andre elif, vet vi allerede at 50 <= vekt, så denne betingelsen kan fjernes. Hvis vi kommer til tredje elif, vet vi allerede at vekt >= 100, så denne betingelsen kan erstattes med else. Koden kan se ut som vist under:

vekt = int(input("Oppgi vekt i gram: "))
if vekt < 25:
    pris = 0.90
elif vekt < 50:
    pris = 0.80
elif vekt < 100:
    pris = 0.75
else:
    pris = 0.70
print(f"Total pris på {vekt} g krydder er kr {pris * vekt:.2f}")

Så skal vi skrive om koden slik at betingelsene sjekkes i omvendt rekkefølge. Koden kan da se slik ut:

vekt = int(input("Oppgi vekt i gram: "))
if vekt >= 100:
    pris = 0.70
elif vekt >= 50:
    pris = 0.75
elif vekt >= 25:
    pris = 0.80
else:
    pris = 0.90
print(f"Total pris på {vekt} g krydder er kr {pris * vekt:.2f}")

Tilbake til oppgaven

Nøstede forgreininger

Oppgave 1:

Vi har koden under, som beregner og skriver ut pris på et kjøp av lysdioder:

# Leser inn antall lysdioder, og skriver ut stykkpris og totalpris
antall = int(input("Hvor mange lysdioder vil du kjøpe? "))
if antall < 10:
    stykkpris = 3.50
elif antall < 100:
    stykkpris = 3.00
else:
    stykkpris = 2.50
print(f"{antall} lysdioder à kr {stykkpris:.02f}, totalt kr {antall*stykkpris:.02f}.")
    1. Vi skal utvide koden med en ytre if som sjekker at antall kjøpte dioder er større enn 0, og skriver ut en feilmelding hvis ikke.
       
      Vi skriver en ytre if, slik oppgaven sier, og legger den eksisterende koden inn i en else, slik at den bare aktiveres hvis antall dioder er større enn 0, markert med gult:
# Leser inn antall lysdioder, og skriver ut stykkpris og totalpris
antall = int(input("Hvor mange lysdioder vil du kjøpe? "))
if antall <= 0:
    print("Antall dioder må være større enn 0.")
else:
    if antall < 10:
        stykkpris = 3.50
    elif antall < 100:
        stykkpris = 3.00
    else:
        stykkpris = 2.50
    print(f"{antall} lysdioder à kr {stykkpris:.02f}, totalt kr {antall*stykkpris:.02f}.")
    1. Vi skal utvide ytre if slik at den også sjekker om antall kjøpte dioder er 1000 eller mer, og i så fall skriver at kjøperen skal kontakte kundeservice.
       
      Vi har nå fått en ny betingelse, og må utvide ytre if med en elif, markert med gult:
# Leser inn antall lysdioder, og skriver ut stykkpris og totalpris
antall = int(input("Hvor mange lysdioder vil du kjøpe? "))
if antall <= 0:
    print("Antall dioder må være større enn 0.")
elif antall >= 1000:
    print("Kontakt kundeservice for et tilbud!")
else:
    if antall < 10:
        stykkpris = 3.50
    elif antall < 100:
        stykkpris = 3.00
    else:
        stykkpris = 2.50
    print(f"{antall} lysdioder à kr {stykkpris:.02f}, totalt kr {antall*stykkpris:.02f}.")

Tilbake til oppgaven

«for»-løkker

Oppgave 1:

Vi skal skrive Python-kode som beregner og skriver ut de 10 første kvadrattallene.

Vi lager ei for-løkke som bruker range() til å gå gjennom heltallene fra og med 1 til og med 10, og for hvert gjennomløp av løkka skriver ut tallet opphøyd i andre, for eksempel slik:

# Skriver ut kvadratet av tallene fra 1 til 10
for n in range(1, 11):
    print(n**2)

Vi husker at sluttverdien i range() ikke tas med, derfor står det 11, ikke 10.

Så skal vi endre koden slik at den bare skriver ut kvadratet av oddetallene i samme tallområde. Det kan vi gjøre ved å legge inn en skrittverdi på 2 i range(), markert med gult under:

# Skriver ut kvadratet av oddetallene fra 1 til 10
for n in range(1, 11, 2):
    print(n**2)

Tilbake til oppgaven

Oppgave 2:

Vi skal analysere hva for-løkkene under skriver ut:

for n in range(5, 1, -2):
    print(n)

Her starter vi med n = 5 og går i skritt på −2 så lenge n > 1, så vi får skrevet ut 5 og 3.

for n in range(-5, 10, 2):
   print(n)

Her starter vi med n = −5 og går i skritt på 2 så lenge n < 10, så vi får skrevet ut −5, −3, −1, 1, 3, 5, 7 og 9.

Tilbake til oppgaven

Oppgave 3:

Vi skal modifisere koden under slik at den skriver ut tallene mellom 1 og 100 som er delelige med 5 i stedet for delelige med 7.

# Skriver ut tallene mellom 1 og 100 som er delelige med 7
for n in range(1, 101):
    if n % 7 == 0:
        print(f"{n} er delelig med 7.")

Vi må erstatte 7 med 5 i uttrykket n % 7. Vi modifiserer også kommentaren og print() litt for å gjenspeile den nye situasjonen. Endringer er markert med gult:

# Skriver ut tallene mellom 1 og 100 som er delelige med 5
for n in range(1, 101):
    if n % 5 == 0:
        print(f"{n} er delelig med 5.")

Tilbake til oppgaven

Oppgave 4:

I koden under er linja med print() bare rykket inn én gang, og vi skal vurdere hvilken effekt dette vil ha på koden i forhold til at den er rykket inn to ganger.

for n in range(1, 101):
    if n % 7 == 0:
        pass
    print(f"{n} er delelig med 7.")

Vi ser på innrykket at print() nå ikke lenger tilhører if-strukturen, men bare for-strukturen. Derfor vil vi feilaktig få utskrift for hvert gjennomløp i løkka, uavhengig av om n er delelig med 7 eller ikke.

Tilbake til oppgaven

«while»-løkker

Oppgave 1:

Vi skal skrive Python-kode som skriver ut alle kubikktall av partall, altså 23, 43, 63, … , som er mindre eller lik 1000.

Vi trenger ei løkke med en løkkevariabel som starer på 2 og øker i skritt på 2. Vi vet imidlertid ikke hvor mange ganger løkka skal gjnnomløpes, så vi kan ikke bruke ei for-løkke. I stedet bruker vi ei while-løkke med en betingelse som gjør at løkka gjennomløpes så lenge variabelen opphøyd i 3 er mindre eller lik 1000. For eksempel slik:

# Skriver ut kubikktall av partall mindre eller lik 1000
n = 2
while n**3 <= 1000:
    print(n**3)
    n += 2

Tilbake til oppgaven

Evige løkker

Oppgave 1:

Python-koden under er ment å skrive ut 2-gangen, altså 2, 4, 6, 8, 10, 12, 14, 16, 18, 20. Men den inneholder en feil som forårsaker ei evig løkke, og vi skal forklare hva feilen er og hvordan den kan rettes.

# Skriver ut 2-gangen
n = 1
while n <= 10:
    print(n * 2)

Problemet er at vi ikke øker verdien til n i løkka. Derved vil n forbli 1, betingelsen n <= 10 er alltid sann, og gjennomløpet av løkka fortsetter evig. Løsningen er å sette inn kodelinja n +=1 etter print().

Tilbake til oppgaven

Nøstede løkker

Oppgave 1:

Vi skal gå gjennom koden under med penn og papir, og skrive opp rekkefølgen de forskjellige linjene vil bli utført i.

Nøstet løkke i Python Tutor

For hver n i den ytre løkka vil m gjennomløpe 1, 2, 3 i den indre løkka, og for hver m vil print() på linje 3 bli utført. Hver gang den indre løkka er ferdig, vil print() på linje 4 bli utført. Siden pila går til linjer med range() også idet sluttverdien nås, vil linjene bli utført i rekkefølge rekkefølge
1, 2, 3, 2, 3, 2, 3, 2, 4, 1, 2, 3, 2, 3, 2, 3, 2, 4, 1, 2, 3, 2, 3, 2, 3, 2, 4, 1..

Dette kan vi verifisere ved å klikke gjennom koden i Python Tutor.

Tilbake til oppgaven