Generell iteration — while-loopen
Skriv lösningarna till uppgifterna i en och samma fil och testa koden själv innan du använder rättningsskriptet. Att kunna testa sin kod är en viktig del av att programmera!
Att lära dig från uppgifterna
- Förstå hur upprepning kan implementeras generellt med hjälp av
while
-loopen. - Förstå hur godtyckligt långa sekvenser kan genereras iterativt.
- Förstå hur
while
-loopen kan användas för upprepning i situationer där antalet iterationer inte är känt i förväg.
Man kan få max 105 poäng och för att få godkänt krävs 70 poäng (90 för väl godkänt). Försök dock att lösa alla uppgifter då inte alla fel upptäcks av rättningsskriptet. Om ni har lite marginal kan ni kanske bli godkända även om assistenten som rättar hittar något sådant fel.
Uppgift 6.1 (5p)
Skriv funktionen word_in_list_while(words, word)
. Funktionen får in en lista av strängar(argumentet words
) samt en enskild sträng (argumentet word
). Funktionen ska returnera True
om strängen word
finns i listan words
. False
ska returneras om word
inte finns i listan words
.
Använd inte den inbyggda operatorn in
.
Använd en while
-loop för att lösa uppgiften
Om man inte vill att loopen ska fortsätta när man väl hittat att ordet finns kan
man använda nyckelordet break
för att avbryta. Det går även bra att returnera
i loopen.
OBS! Förekomsten av in
i for
-loopskonstruktionen är inte den inbyggda
operatorn in
utan hänger ihop med nyckelordet for
. Operatorn in
används
för att kontrollera om ett värde finns i t.ex. en sekvens: 'a' in 'hejsan'
returnerar True
.
Uppgift 6.2 (5p)
Skriv funktionen count_integers_while(value_list)
. Funktionen ska returnera antalet heltal i argumentet value_list
.
Använd funktionen type()
som returnerar vilken datatypen hos ett värde. Till exempel type(4)
returnerar int
, så jämförelsen type(4) == int
kommer att vara True
(OBS! int
inte är omgiven av några citat-tecken).
Uppgiften ska lösas med en while
-loop.
Tips
Hur sparar du antalet heltal och vad händer när du hittar en?
Uppgift 6.3 (5p)
Skriv funktion average_while(values)
. Funktionen ska returnera genomsnittet av alla värden i argumentet values
som kommer vara en lista av flyttal. Funktionen ska summera ihop värdena med en while
-loop och sedan dela summan med antalet värden i listan values
.
Den inbyggda funktionen sum()
får inte användas.
Exempel:
|
|
Uppgifterna vi löst hittills har vi redan löst tidigare med hjälp av en for
-loop. Som vi ser går det att lösa alla problem som kan lösas med en for
-loop med hjälp av en while
-loop också. En for
-loop är dock nästan alltid mer lättläst och mindre benägen att bli fel än motsvarande while
-loop, givet att vi i förväg kan definiera en sekvens över vilken loopen ska iterera. Det är därför oftast mer lämpligt att använda en for
-loop i dessa fall.
Så varför introducerar vi while
-loopen? Jämfört med for
-loopen är while
-loopen mer generell och kan användas även i situationer när vi inte i förväg kan definiera en sekvens av värden vi vill använda. Vi ska nu titta på uppgifter där en for
-loop hade varit markant krångligare.
Överkurs: För den nyfikne kan sägas att for
-loopar går att använda i princip i alla fall där vi i första hand sträcker oss efter while
-loopen. Detta kräver dock att vi implementerar egna iteratorer, något som ligger utanför kursens ramar.
Uppgift 6.4
6.4.1 (5p)
Skriv en funktion range_list_stop(stop)
som tar ett heltal stop
och returnerar en lista med alla heltal från 0 till men inte med stop
.
Exempel:
|
|
6.4.2 (5p)
Skriv en funktion range_list_start(start, stop)
som tar två heltal start
och stop
och returnerar en lista med alla heltal från start
till men inte med stop
. Antag att start
är mindre än stop
.
Exempel:
|
|
6.4.3 (5p)
Skriv en funktion range_list_step(start, stop, step)
som tar tre heltal start
, stop
och step
, där step
kan vara positivt eller negativt. Funktionen ska returnera en lista med alla heltal från start
till men inte med stop
i inkrement om step
. Antag att start
och stop
kommer i rätt ordning i förhållande till om step
är positivt eller negativt.
Exempel:
|
|
Uppgift 6.5 (10p)
Skriv en funktion roll_pair(sides)
som simulerar tärningsslag (återanvänd gärna roll_dice
från introavsnittet). Funktionen skall simulera slag och spara resultatet i en lista tills utfallet blir detsamma två gånger i rad varpå funktionen skall returnera listan med tärningsslag.
Exempel:
|
|
Uppgift 6.6 (10p)
Skriv en funktion integers_to(target)
som ska summera naturliga tal (1, 2, 3, …) tills summan blir större än target
. Returnera en lista med talen som summerades.
Exempel:
|
|
Uppgift 6.7 (10p)
I rekursionsavsnittet löste vi en uppsättning uppgifter required_storage
som gick ut på att beräkna hur stort lagringsutrymme som behövde köpas av en molntjänst. Vi löste uppgiften på flera olika sätt som alla nyttjade rekursion. Nu ska vi lösa samma problem med en while
-loop istället.
Skriv en funktion required_storage(filesize)
som tar en filstorlek, filesize
, representerat som ett heltal. Om den initiala storleken, som ska vara 2 precis som tidigare, inte räcker till så ska funktionen testa med nästa större 2-potens. Funktionen ska returnera den första storlek den hittar som är tillräcklig. Använd en while
-loop.
|
|
Uppgift 6.8 (10p)
I ett radioaktivt ämne genomgår en viss andel av atomerna radioaktivt sönderfall varje år. Skriv funktionen halflife(rate)
som tar ett värde mellan 0 och 1 som representerar hur stor andel av atomerna som sönderfaller varje år. Funktionen ska beräkna hur många år det tar för hälften av atomerna att sönderfalla. Dvs funktionen ska beräkna det radioaktiva ämnets halveringstid i hela år.
Du kan beräkna hur stor andel av atomerna som finns kvar efter ett år genom att multiplicera antalet atomer vid början av året med (1-rate)
.
Uppgiften skall lösas med en lämplig loop.
Tips: Det spelar ingen roll hur många atomer som finns från början, resultatet ska bli detsamma oavsett vilket. För enkelhets skull kan du låta antalet atomer börja på 1000
och alltså fortsätta så länge fler än 500
är kvar. (När funktionen fungerar kan du testa att byta till 1
respektive 0.5
och se att du får samma resultat.)
|
|
Uppgift 6.9
6.9.1 (10p)
Befolkningsproblemet: Befolkningen i två länder antas växa exponentiellt; i början på varje år ökar befolkningen i länderna med en viss procent av den nuvarande befolkningen.
Skriv funktionen population(pop_a, rate_a, pop_b, rate_b)
som får in folkmängden för två länder A (pop_a
) och B (pop_b
) samt folkökningen i procent (3.3
betyder 3,3%) för dessa (rate_a
resp. rate_b
). Folkmängden i land A ska från början vara lägre än folkmängden i land B.
Funktionen ska returnera antalet hela år det tar innan folkmängden i land A är större än folkmängden i land B. Gör detta genom att i funktionen skriva en loop som för varje iteration räknar ut folkmängd för början på nästa år för vardera land. Låt loopen fortsätta tills folkmängden i land A är större än folkmängden i land B.
Förutsättningen att kunna hitta ett svar är att land A har en högre tillväxtprocent än land B. Kontrollera detta i början av funktionen. Om det kravet ej är uppfyllt ska funktionen returnera -1
.
6.9.2 (5p)
Skriv en funktion population2
som ska fungera precis som population
men där folkmängden i land A inte behöver vara lägre än folkmängden i land B från början. Funktionen ska returnera antalet hela år det tar innan landet med den från början lägre folkmängden har fler människor än det andra landet. Skulle detta vara omöjligt ska -1
returneras.
Uppgift 6.10 (10p)
Skriv en funktion retsticka()
som inte ska ta några argument. Funktionen ska skriva ut "Jag är en retsticka, vad säger du nu?"
. Funktionen skall sedan vänta på input från användaren på en ny rad (använd funktionen input
). Funktionen skall sedan skriva ut exakt vad användaren skrev och sedan vänta på input igen (åter igen på en ny rad). Detta skall sedan upprepas tills användaren skriver “sluta härmas” varefter funktionen skall skriva ut "okej"
och sedan avslutas.
Obs! Använd inte argumentet till input
för att skriva ut något. Alla utskrifter som retsticka
gör skall göras med print
.
Exempel
>>> retsticka()
Jag är en retsticka, vad säger du nu?
hej
hej
vad håller du på med
vad håller du på med
du är inte rolig
du är inte rolig
sluta härmas
okej
>>>
Uppgift 6.11 (10p)
Skriv en funktion account(balance, interest)
som tar två flyttal balance
och interest
. Värdet på balance
ska vara mängden pengar på kontot när funktionen startar och interest
ska vara en ränta i procent.
Varje iteration skall funktionen först skriva ut Current balance: XXXXXX
där XXXXXX ska motsvara det aktuella värdet på kontot. Sedan ska funktionen skriva ut Change this period:
och vänta på input från användaren (använd funktionen input
). Efter att användaren skrivit in ett tal, positivt eller negativt, så skall värdet på kontot uppdateras först med den förändringen och sedan med räntan, och sedan avrundas till två decimaler.
Programmet avslutas när användaren skriver end
istället för ett tal.
Obs! Använd inte argumentet till input
för att skriva ut något. Alla utskrifter som account
gör skall göras med print
.
Exempel:
|
|
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-08-05