Lykkjer med kodeordet for - Konstruksjons- og styringsteknikk (TP-TIP vg1) - NDLA

Hopp til innhald
Verktøy og mal

Lykkjer med kodeordet for

Ei for-lykkje køyrer eit visst tal gonger.

I eit dataprogram skrive i Python kan ei for-lykkje minne mykje om ei while-lykkje, men der while-lykkja køyrer heilt til eit vilkår er oppfylt uavhengig av kor mange gonger lykkja blir køyrd, vil ei for-lykkje køyre eit fastsett tal gonger.

Eksempel

Vi skal setje 10 000 kroner inn i banken til ei rente på 3,4 prosent. Vi ønskjer å finne ut kva beløpet veks til kvart år framover i ti år. Vi ønskjer oss ei utskrift der det på dei to første linjene står

"Etter 1 år har 10 000 kroner vakse til <kroner>."
"Etter 2 år har 10 000 kroner vakse til <kroner>."

Slik skal programmet halde fram til vi har kome til det tiande året. Den siste linja skal sjå slik ut:

"Etter ti år har 10 000 kroner vakse til <kroner>."

Der det står "<kroner>", skal programmet rekne ut kva pengane har vakse til etter 1 år, 2 år og så vidare til og med etter ti år.

Når vi skal gjere slike utrekningar, er det kjekt å bruke vekstfaktoren.

Oppgåve – utrekning

Kva blir vekstfaktoren når renta er 3,4 prosent?

Løysingsforslag

Vekstfaktoren blir  1+3,4100=1,034.

Oppgåve – utrekning

Kor mykje har 10 000 kroner vakse til etter fem år når renta er 3,4 prosent?

Løysingsforslag

Her må vi multiplisere 10 000 kroner med vekstfaktoren 1,034 opphøgd i 5. 10 000 kroner har vakse til

10 000 kroner·1,0345=11 819,60 kroner

Vi seier gjerne at saldoen er 11 819,60 kr.

Oppgåve – algoritme

Skriv algoritmen til eit program som kan lage utskriftene vi ønskjer.

Løysingsforslag
  • Set variabelen startsaldo lik 10 000.
  • Set variabelen vekstfaktor lik 1,034.
  • Set variabelen aar lik 1.
  • Gjer ti gonger:

    • Set variabelen saldo lik startsaldo multiplisert med vekstfaktor opphøgd i aar.
    • Skriv til skjermen "Etter <aar> år har <startsaldo> kroner vakse til <saldo> kroner.".
    • La aar auke med 1.

Legg merke til at for kvar gong dei tre siste instruksjonane blir køyrde, så har talet på år vorte 1 større.

Med "<aar>" meiner vi verdien til variabelen aar.

Lykkjer med kodeordet for

Ei for-lykkje som køyrer ti gonger, kan hjelpe oss med å generere denne utskrifta slik at vi slepp å lage ti setningar med funksjonen print(). For å få til dette, bruker vi kodeorda for og in saman med funksjonen range() slik som nedanfor.

for x in range(1, 11):

x er ein fritt vald variabel. Han får gradvis aukande verdi for kvar gong for-lykkja blir køyrd og kan derfor brukast til utrekningar og utskrifter der noko skal endrast frå runde til runde. Det er range()-funksjonen som styrer kva verdiar variabelen x kan ha.

Spørsmål – kode

Kan du gjette kvifor vi må skrive range(1, 11) og ikkje range(1, 10), som ein kanskje skulle tru når vi ønskjer at lykkja skal gå ti gonger?

Svar

range()-funksjonen er slik at vi startar på talet før kommaet (1) og sluttar på éin mindre enn talet etter kommaet. Talet før kommaet er altså med, men ikkje talet etter. For å få tala 1, 2, 3, 4, 5, 6, 7, 8, 9 og 10, må vi derfor skrive range(1, 11). Ein "range" er frå og med det første talet til (men ikkje med) det andre talet.

Nedanfor kan du køyre eit program som passar til algoritmen over og skriv ut på skjermen desse ti utskriftene som vi ønskjer. (NB: Det kan ta litt tid frå du trykkjer på avspelingsknappen til programmet blir køyrt.)

I koden over har vi fordelt teksten som skal skrivast til skjermen i to linjer for at det skal vere lettare å sjå kva som står der.

Oppgåve – kode

Forklar kva som skjer med variabelen aar i for-lykkja.

Forklaring

Vi ser av den første utskrifta at variabelen aar har verdien 1 den første gongen for-lykkja blir køyrd. Årsaka til det er at det første argumentet til range()-funksjonen er 1. Deretter sørgjer range()-funksjonen for at verdien til aar aukar med 1 for kvar gong lykkja blir køyrd. For-lykkja går ti gonger sidan det andre argumentet til range()-funksjonen er 11.

Hugs at range()-funksjonen er slik at det første talet (her: 1) er med, ikkje det siste (her: 11).

Oppgåve – kode

Endre {saldo} på siste linje i programmet til {saldo:.2f}. Kva skjer med utskrifta, og kva betyr 2-talet inne i klammeparentesen, trur du?

Forklaring

Summane som blir skrive ut, får no ikkje meir enn to desimalar, som er vanleg når talet er ein sum i kroner.

Koden "2f" spesifiserer kor mange desimalar variabelen saldo får i utskrifta.

Pythonkode å lære seg

Vis innhald

Lykkjer med for og "in range()"-oppsett

Eksempel:

for x in range(1, 5):
    print(f"Dette er køyring nr. {x} av for-lykkja.")

Dette vil gi følgjande utskrift til skjermen:

Dette er køyring nr. 1 av for-lykkja.
Dette er køyring nr. 2 av for-lykkja.
Dette er køyring nr. 3 av for-lykkja.
Dette er køyring nr. 4 av for-lykkja.

Merk at range()-funksjonen startar på startverdien, men tek ikkje med sluttverdien. Merk òg at dei kodelinjene som høyrer til for-lykkja, er rykt inn slik som for while-lykkjer og if-setningar.

Eksempel på for-lykkje med trinn på 2 i staden for 1:

for x in range(1, 5, 2):
    print(f"Dette er køyring nr. {x} av for-lykkja.")

Dette vil gi følgjande utskrift til skjermen:

Dette er køyring nr. 1 av for-lykkja.
Dette er køyring nr. 3 av for-lykkja.

Dersom vi legg til eit tredje argument til range()-funksjonen (her: talet 2), kan vi styre kor stort hopp variabelen i for-lykkja skal gjere for kvar gong lykkja blir køyrd. Vi får berre to linjer sidan det andre argumentet til range()-funksjonen er 5, som betyr at den største moglege verdien x kan ha, er 4. Verdien 4 kan ikkje x ha når det startar på 1 og går i trinn på 2.

Formatering

Eksempel:

print(f"Desimaltalet {3.14159:.3f} har tre desimalar.")

Dette vil gi denne utskrifta:

Desimaltalet 3.142 har tre desimalar.

Koden "3f" betyr tre desimalar. Hugs å skrive kolon og punktum før formatkoden.

Aktivitetar

a) Algoritme

Programmet skal endrast slik at slik at brukaren kan skrive inn ein vilkårleg startsaldo. Skriv om på algoritmen slik at dette blir mogleg, og pass på å få med litt forklarande tekst.

Løysingsforslag
  • Skriv til skjermen "Dette programmet reknar ut kva ein startsaldo veks til etter eitt, to og opp til og med ti år med ei rente på 3,4 prosent per år.".
  • Skriv til skjermen "Skriv inn den summen du ønskjer å setje inn:".
  • Ta imot talet frå brukaren, og set det lik variabelen startsaldo.
  • Set variabelen vekstfaktor lik 1,034.
  • Set variabelen aar lik 1.
  • Gjer ti gonger:
    • Set variabelen saldo lik startsaldo multiplisert med vekstfaktor opphøgd i aar.
    • Skriv til skjermen "Etter <aar> år har <startsaldo> kroner vakse til <saldo> kroner.".
    • La aar auke med 1.

Notasjonen "<aar>" betyr at her skal innhaldet av variabelen aar setjast inn.

b) Kode

Skriv koden til programme

Løysingsforslag
python
1print("Dette programmet reknar ut kva ein startsaldo "
2"veks til etter eitt, to og opp til og med ti år "
3"med ei rente på 3,4 prosent per år.")
4startsaldo = float(input("Skriv inn den summen du ønskjer å setje inn:"))
5vekstfaktor = 1.034
6
7for aar in range(1, 11):
8  saldo = startsaldo * vekstfaktor**aar
9  print(f"Etter {aar} år har {startsaldo:.2f} kroner "
10    f"vakse til {saldo:.2f} kroner.")

c) Algoritme

Programmet i oppgåva over skal endrast slik at brukaren òg kan skrive inn kor mange år pengane skal stå inne. Skriv om på algoritmen slik at dette blir mogleg.

Løysingsforslag
  • Skriv til skjermen "Dette programmet reknar ut kva ein startsaldo veks til etter eitt, to og opp til og med eit valt tal på år med ei rente på 3,4 prosent per år.".
  • Skriv til skjermen "Skriv inn den summen du ønskjer å setje inn:".
  • Ta imot talet frå brukaren, og set det lik variabelen startsaldo.
  • Skriv til skjermen "Skriv inn kor mange år pengane skal stå totalt:".
  • Ta imot talet på år frå brukaren, og set det lik variabelen maksaar.
  • Set variabelen vekstfaktor lik 1,034.
  • Set variabelen aar lik 1.
  • Gjer <maksaar> gonger:
    • Set variabelen saldo lik startsaldo multiplisert med vekstfaktor opphøgd i aar.
    • Skriv til skjermen "Etter <aar> år har <startsaldo> kroner vakse til <saldo> kroner.".
    • La aar auke med 1.

d) Kode

Skriv koden til programmet.

Løysingsforslag
python
1print("Dette programmet reknar ut kva ein startsaldo "
2  "veks til etter eitt, to og opp til og med eit valt tal på år "
3  "med ei rente på 3,4 prosent per år.")
4startsaldo = float(input("Skriv inn den summen "
5  "du ønskjer å setje inn:"))
6maksaar = int(input("Skriv inn kor mange år "
7  "pengane skal stå totalt:"))
8vekstfaktor = 1.034
9
10for aar in range(1, maksaar + 1):
11  saldo = startsaldo * vekstfaktor**aar
12  print(f"Etter {aar} år har {startsaldo:.2f} kroner "
13    f"vakse til {saldo:.2f} kroner.")

e) Algoritme

Programmet i oppgåva over skal endrast slik at brukaren i tillegg kan skrive inn kva renta skal vere. Skriv om på algoritmen slik at dette blir mogleg.

Løysingsforslag
  • Skriv til skjermen "Dette programmet reknar ut kva ein startsaldo veks til etter eitt, to og opp til og med ti år med ei valfri rente per år.".
  • Skriv til skjermen "Skriv inn den summen du ønskjer å setje inn:".
  • Ta imot talet frå brukaren, og set det lik variabelen startsaldo.
  • Skriv til skjermen "Skriv inn kor mange år pengane skal stå totalt:".
  • Ta imot talet på år frå brukaren, og set det lik variabelen maksaar.
  • Skriv til skjermen "Skriv inn kva renta skal vere:".
  • Ta imot talet frå brukaren, og set det lik variabelen rente.
  • Set variabelen vekstfaktor lik 1 + rente/100.
  • Set variabelen aar lik 1.
  • Gjer <maksaar> gonger:
    • Set variabelen saldo lik startsaldo multiplisert med vekstfaktor opphøgd i aar.
    • Skriv til skjermen "Etter <aar> år har <startsaldo> kroner vakse til <saldo> kroner.".
    • La aar auke med 1.
  • Skriv til skjermen "Renta er <rente> prosent.".

f) Kode

Løysingsforslag
python
1print("Dette programmet reknar ut kva ein startsaldo "
2  "veks til etter eitt, to og opp til og med eit valt tal på år "
3  "med ei valfri rente per år.")
4startsaldo = float(input("Skriv inn den summen "
5  "du ønskjer å setje inn:"))
6maksaar = int(input("Skriv inn kor mange år "
7  "pengane skal stå totalt:"))
8rente = float(input("Skriv inn kva renta skal vere:"))
9vekstfaktor = 1 + rente/100
10
11for aar in range(1, maksaar + 1):
12  saldo = startsaldo * vekstfaktor**aar
13  print(f"Etter {aar} år har {startsaldo:.2f} kroner "
14    f"vakse til {saldo:.2f} kroner.")
15
16print(f"Renta er {rente} prosent.")

Relatert innhald

Skrive av Bjarne Skurdal.
Sist fagleg oppdatert 10.06.2022