Göm meny

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:

1
2
>>> average_while([10.0, 20.0, 6.3])
12.1

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:

1
2
3
4
5
6
7
8
>>> range_list_stop(0)
[]
>>> range_list_stop(1)
[0]
>>> range_list_stop(2)
[0, 1]
>>> range_list_stop(5)
[0, 1, 2, 3, 4]

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:

1
2
3
4
5
6
7
8
>>> range_list_start(0, 0)
[]
>>> range_list_start(0, 5)
[0, 1, 2, 3, 4]
>>> range_list_start(3, 6)
[3, 4, 5]
>>> range_list_start(-2, 2)
[-2, -1, 0, 1]

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:

1
2
3
4
5
6
7
8
>>> range_list_step(0, 0, 1)
[]
>>> range_list_step(-2, 2, 1)
[-2, -1, 0, 1]
>>> range_list_step(6, 1, -1)
[6, 5, 4, 3, 2]
>>> range_list_step(10, -10, -3)
[10, 7, 4, 1, -2, -5, -8]

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:

1
2
3
4
5
6
7
8
>>> roll_pair(6)
[4, 3, 4, 2, 6, 4, 2, 2]
>>> roll_pair(6)
[1, 2, 6, 3, 4, 6, 4, 1, 4, 4]
>>> roll_pair(6)
[3, 1, 3, 6, 3, 3]
>>> roll_pair(6)
[1, 2, 2]

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> integers_to(4)
[1, 2, 3]
>>> integers_to(8)
[1, 2, 3, 4]
>>> integers_to(16)
[1, 2, 3, 4, 5, 6]
>>> integers_to(32)
[1, 2, 3, 4, 5, 6, 7, 8]
>>> integers_to(64)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> required_storage(1)
2
>>> required_storage(10)
16
>>> required_storage(100)
128
>>> required_storage(1000)
1024
>>> required_storage(10000)
16384

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.)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
>>> halflife(0.5)
1
>>> halflife(0.8)
1
>>> halflife(0.3)
2
>>> halflife(0.2)
4
>>> halflife(0.1)
7
>>> halflife(0.01)
69

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> account(100.0, 1.0)
Current balance: 100.0
Change this period: 100
Current balance: 202.0
Change this period: 300
Current balance: 507.02
Change this period: -200
Current balance: 310.09
Change this period: end
>>>

Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-08-05