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 teller
en 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 sum
men 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 funksjonenround
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 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.