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.
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 funksjonenroundgjør. Om du vil vite mer kan du gå til w3schools.Lag en variabel
sumRenterog skriv ut hvor mye som er betalt i renter hittil hvert år (i stedet forUKJENT).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.