Repetisjon: Å gjøre en ting mange ganger#

Læringsmål#

Introduksjon#

Det er vanlig i programmering å gjøre en ting mange ganger.

while-løkker likner litt på for-løkker, men også litt på if-setninger. De gjør en oppgave så lenge et kriterium er sant. På nesten-pythonsk kunne vi si

 while trivsel(baby):
    lek()
    spis()

som gir at lek() og spis() utføres igjen og igjen så lenge trivsel(baby) er sant. En annen variant kunne være

 alder = 0 # dager
 while alder < 365:
    lek()
    spis()
    alder = alder + 1 # øker med 1 dag

som gir at alderen økes med 1 dag hver gang barnet har lekt og spist; det vil leke og spise 365 ganger før det går videre i livet.

Representasjoner og variasjoner#

Forskjellige språk har forskjellige varianter av dette.

Ord#

På norsk sier vi noen ganger

  • Fortsett så lenge du har lyst

  • Du må spise inntil du er mett

  • Så lenge du er sulten må du fortsette å spise.

Dette likner while-løkker. Du må fortsette med en handling så lenge et kriterium er sant.

Scratch: Repeat#

../../../_images/scratchRepeat.png

Fig. 2.31 while not foo > 10: print(foo)#

../../../_images/scratchForever.png

Fig. 2.32 while True: foo = foo + 1#

Python: While#

Se på følgende eksempel

teller = 0
sum = 0
while teller < 10:
    sum = sum + teller
    print("Telleren er", teller, "og sum er", sum)
    teller = teller + 1
Telleren er 0 og sum er 0
Telleren er 1 og sum er 1
Telleren er 2 og sum er 3
Telleren er 3 og sum er 6
Telleren er 4 og sum er 10
Telleren er 5 og sum er 15
Telleren er 6 og sum er 21
Telleren er 7 og sum er 28
Telleren er 8 og sum er 36
Telleren er 9 og sum er 45

Vi definerer to variable, teller og sum. teller er fra begynnelsen 0, og while-løkka fortsetter så lenge telleren er mindre enn 10. Siden teller øker med 1 hver runde, tar det 10 runder før while-løkka blir ferdig. For hver runde økes summen med teller.

Øvelse: Lag en funksjon som regner ut multiplikasjon med repetert addisjon. Du kan ta utgangspunkt i programmet over; du trenger kanskje to nye variable addend1 og addend2. Tenk gjerne i et eksempel: 3×4 er 4+4+4; da skal while-løkka gå 3 ganger, og summen skal bli økt med 4 hver gang.

Turtle#

Forløkker kan gjerne brukes i Turtle også.

Regneark#

Noe til svarende kan også modelleres i regneark, og dette er et vanlig mønster. Det kan for eksempel gjøres slik:

  • Hver runde er en rad (linje)

  • Hver variabel er en kolonne. I eksempelet over kan teller og sum være kolonner. I eksempelet under, med lån, kan lån, rente og gebyr være kolonner. Se eksempel under.

Dette åpner et vindu inn i simuleringsverden TODO Dette er dessverre ikke så vanlig i norsk skole ennå TODO. Logistisk regresjon

Et større eksempel#

Lån#

Her er et større eksempel, som du kan gjøre ferdig selv:

lån = 1000 # Lån i starten
gebyr = 15 # Hvor mye gebyr vi betaler hvert år
sumGebyr = 0 # Hvor mye gebyr vi har betalt så langt
rentefot = 5/100 # Altså 5%
vekstfaktor = 1 + rentefot
år = 0;
while år < 10:
    renteIÅr = lån * rentefot
    sumGebyr = sumGebyr + gebyr # Skal leses: sumGebyr får ny verdi, lik gammel verdi + gebyr
    lån = lån + renteIÅr + gebyr # Skal leses: lån blir satt til ny verdi lik gammelt lån + ...
    print("År ", år, 
          ": Lån etter justering er ", round(lån),
          "Vi har betalt ", sumGebyr,
          " kr i renter og UKJENT i renter.")
    år = år + 1
År  0 : Lån etter justering er  1065 Vi har betalt  15  kr i renter og UKJENT i renter.
År  1 : Lån etter justering er  1133 Vi har betalt  30  kr i renter og UKJENT i renter.
År  2 : Lån etter justering er  1205 Vi har betalt  45  kr i renter og UKJENT i renter.
År  3 : Lån etter justering er  1280 Vi har betalt  60  kr i renter og UKJENT i renter.
År  4 : Lån etter justering er  1359 Vi har betalt  75  kr i renter og UKJENT i renter.
År  5 : Lån etter justering er  1442 Vi har betalt  90  kr i renter og UKJENT i renter.
År  6 : Lån etter justering er  1529 Vi har betalt  105  kr i renter og UKJENT i renter.
År  7 : Lån etter justering er  1621 Vi har betalt  120  kr i renter og UKJENT i renter.
År  8 : Lån etter justering er  1717 Vi har betalt  135  kr i renter og UKJENT i renter.
År  9 : Lån etter justering er  1818 Vi har betalt  150  kr i renter og UKJENT i renter.

Programmet har noen variable som er uforandrede gjennom programmet (gebyr, rentefot), noen som blir regnet ut for hvert år (renteIÅr) og noen som blir oppdatert hvert år og oppsummerer utviklingen inntil det året (sumGebyr, lån).

Oppgaver:

  • Fjern round(), få parentesene til å bli balanserte og se hva funksjonen round gjør. Om du vil vite mer kan du gå til w3schools.

  • Lag en variabel sumRenter og skriv ut hvor mye som er betalt i renter hittil hvert år (i stedet for UKJENT).

  • Implementer dette i regneark. Hver rad (linje) skal være ett år. Det skal være kolonner for lån, rente og gebyr, og kanskje flere (vil bli gjort på forelesning)

Når bruker vi while-løkker?#

En del programmerere bruker dem ofte. Ellef bruker dem relativt sjelden; oftere brukes funksjonell programmering hvor en funksjon kjøres på lister e.l. med map(). Men mønsteret med variable som holder styr på informasjon brukes ofte.