Loopar

{{ 'ml-heading-theory' | message }}

En stor fördel med datorer är att de snabbt kan göra liknande beräkningar tusentals eller miljontals gånger. För att programmera sådana upprepningar använder man loopar med formuleringar som

"För alla dessa värden, gör så här: ..."
eller
"Fortsätt att göra ... tills ...".

Dessa två typer av loopar beskrivs med for- respektive while-satser, och på denna sida kommer du att lära dig hur man konstruerar sådana loopar.

varde = 0
maxvarde = 100
while varde < maxvarde:
	print(varde)
	varde = varde + 5
Vad tror du att koden gör? Vad kommer att skrivas ut? Vad händer om du byter plats på rad 4 och 5?
Teori

for-sats

Om man har instruktioner som ska upprepas ett känt antal gånger, t.ex. för varje element i en lista med given längd, kan man använda en for-sats. Dessa skrivs med kommandot for följt av ett variabelnamn, kommandot in och till sist en lista eller uppräkning, avslutat med ett kolon.

for element in ['hej', 'på', 'dig']:
	print(element)

  • Visa resultat

>
hej
på
dig

Första raden i det här programmet kan tolkas som "För varje element i listan ['hej', 'på', 'dig']". Det innebär att variabeln element sätts till det första värdet i listan och sedan ändras för varje ny upprepning i loopen. Dessa upprepningar kallas iterationer, och i den första kommer alltså element att vara lika med 'hej' för sedan bytas till 'på' i andra iterationen och 'dig' i tredje.
Teori

range()

range() är en funktion som skapar en uppräkning av heltal. Skriver man t.ex. range(5) får man en uppräkning från 00 till 4.4. Argumentet man anger ingår alltså inte i uppräkningen. Dessa uppräkningar är av datatypen iterator och används ofta tillsammans med loopar.

for x in range(8):
	print(x)

  • Visa resultat

>
0
1
2
3
4
5
6
7

Om man skriver två argument i funktionen kommer uppräkningen att ske från det första argumentet till, men inte med, det andra.

for x in range(3,8):
	print(x)

  • Visa resultat

>
3
4
5
6
7

Lägger man till ytterligare ett argument kommer det att användas som steglängden i uppräkningen.

for x in range(3,8,2):
	print(x)

  • Visa resultat

>
3
5
7

Uppgift

Skriv ett program som använder en for-sats för att skriva ut "Party!" tio gånger.

Lösning

Vi börjar med att skriva en for-sats som går igenom heltalen från 00 till och med 99 för en variabel x. Det ger att instruktionerna inne i loopen upprepas 1010 gånger.

for x in range(10):

Vi behöver egentligen inte värdet som finns i variabeln x, bara att instruktionerna i loopen upprepas 1010 gånger. För att skapa en for-sats måste man dock skriva något mellan for och in, så vi skriver in ett variabelnamn som sedan aldrig används. Inne i loopen använder vi print() för att skriva ut vårt meddelande.

for x in range(10): print('Party!')

  • Visa resultat

>
Party!
Party!
Party!
Party!
Party!
Party!
Party!
Party!
Party!
Party!

Visa lösning Visa lösning
Teori

while-sats

while-satser används för kodstycken som ska upprepas så länge ett visst villkor är uppfyllt. Det är användbart för loopar där man inte vet hur många upprepningar som krävs. För att skriva en sådan sats börjar man med ordet while, alltså "medan", följt av ett villkor och ett kolon. Den kod som ska upprepas skrivs med ett indrag.

tal = 1
while tal < 20:
	print('Talet är', tal)
	tal = tal*2 + 1

  • Visa resultat

>
Talet är 1
Talet är 3
Talet är 7
Talet är 15

I while-satser måste man akta sig för oändliga loopar. I programmet nedan ändras aldrig värdet på x,x, och då är villkoret alltid sant. Programmet kommer då aldrig ur loopen och måste avbrytas manuellt. De flesta programmeringsmiljöer har en stoppknapp för detta.

x = 1
while x < 5:
	print(x**2)
Uppgift

Skriv en while-sats som summerar de positiva heltalen, 1,2,3...1, 2, 3... , tills summan är minst 100100 och sedan skriver ut hur många tal som behövdes.

Lösning

Först måste vi bestämma villkoret. Vi ska addera termer tills summan är 100100 eller mer, och alltså har vi en process som pågår medan summan är mindre än 100.100. Villkorsraden kan därför skrivas så här.

while summa < 100:

Men programmet kan inte börja så, för jämförelsen kan inte göras innan variabeln summa fått ett värde. Vi måste därför först skapa variabeln summa, och från början är den 0.0. Eftersom 00 är mindre än 100100 är villkoret sant från början och då kan programmet starta loopen.

summa = 0
while summa < 100:

Sedan måste vi få loopen att räkna upp heltalen. Vi skapar variabeln tal som börjar på 00 utanför loopen, för att sedan öka med 11 för varje iteration.

summa = 0
tal = 0
while summa < 100: tal = tal + 1

Nu har vi en loop som räknar upp heltal. Varje iteration ska nu avslutas med att talet läggs till summan. Till slut blir då summan så stor att villkoret blir falskt och loopen avslutas.

summa = 0
tal = 0
while summa < 100: tal = tal + 1 summa = summa + tal

När programmet har kommit ut ur loopen finns det senaste talet kvar i variabeln tal. Detta värde är också antalet tal som har adderats, vilket är vad vi är ute efter. Vi behöver alltså bara skriva ut det.

summa = 0
tal = 0
while summa < 100: tal = tal + 1 summa = summa + tal
print(tal)

  • Visa resultat

>
14

Visa lösning Visa lösning
Teori

break

break används i en for- eller while-sats för att avbryta den. Det är t.ex. användbart när man söker igenom en lista efter en viss sorts element. I exemplet nedan avbryts sökningen med break när ett tal mellan 6161 och 6767 har hittats.

lista = [44, 50, 55, 1, 62, 70, 94, 66, 56, 6]
for tal in lista:
	if 61 < tal < 67:
		print(tal)
		break

  • Visa resultat

>
62

Notera att det finns ytterligare ett tal i listan som ligger i intervallet, men programmet hittar inte detta just eftersom loopen avbryts efter att det första hittats.

Uppgifter

Nivå 1
1.1
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Skriv ett program som skriver ut de kk första elementen i den aritmetiska talföljden som definieras av startvärdet a1=7a_1 = 7 och steglängden d=3.d = 3. Testa programmet genom att skriva ut de 2020 första elementen.

1.2
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Det finns två heltal mellan -1000\text{-} 1000 och 10001000 som löser ekvationen x499x32786x21980x56120=0.x^4 - 99x^3 - 2786x^2 - 1980x - 56120 = 0. Skriv ett program som hittar dessa genom upprepad prövning.

1.3
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Använd en while-sats för att hitta det första positiva heltal vars kvadrat är minst 123456.123\,456.

1.4
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Programmet nedan skriver ut ettans multiplikationstabell.

print('{}:ans tabell'.format(1))
for b in range(1, 11):
	print(1*b, end=' ') ##Med end=' ' avslutas printraden med ett mellanslag istället för '\n' som ger ny rad. Därför hamnar hela tabellen på en rad.

  • Visa resultat

>
1:ans tabell
1 2 3 4 5 6 7 8 9 10

Utveckla programmet så att multiplikationstabellerna för talen 1101-10 skrivs ut.

1.5
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Loopar är ett användbart verktyg för att skapa och ändra i listor.

a

Skriv ett program som med hjälp av en loop skapar en lista med de nn första udda talen och sedan skriver ut den. Testa programmet med n=10.n = 10.

b

Skriv ett program som lägger ihop två lika långa listor, element för element, och skriver ut den nya listan som skapas. Testa programmet på följande listor.

lista_1 = [-13, -25, 22, 5, -29, -7, 10, -10, -30, -17, -16]
lista_2 = [16, 10, -7, -21, 11, -21, 7, -9, 26, -19, 27]
1.6
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Utropstecknet har en speciell betydelse i matematiken, nämligen fakultet. Exempelvis utläses n!n! som "nn-fakultet", och om nn är ett positivt heltal beräknas fakulteten som produkten av alla positiva heltal från 11 upp till talet n.n. T.ex. är 5!=12345=120. 5! = 1 \cdot 2\cdot 3\cdot 4\cdot 5 = 120. Ett specialfall är 0!0! som har värdet 1.1. Skriv ett program som beräknar och skriver ut värdet av n!,n!, där heltalet nn är minst noll.

1.7
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Beskriv hur utskriften från följande program beror på vad som finns i invärdet lista.

lista = [3, 10, -3, 19, -91, 55]

b = True
for x in lista:
	if x <= 0:
		b = False
if b:
	print('Ja')
else:
	print('Nej')
Nivå 2
2.1
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

En kvadrat av en summa är inte samma sak som en summa av kvadrater. (1+2+3++7)2=282=78412+22+32++72=140\begin{aligned}(1+2+3+\ldots+7)^2 & = 28^2 = 784 \\ 1^2 + 2^2 + 3^2 + \ldots + 7^2 & = 140 \end{aligned} Vi ser att när 7 termer används är kvadraten av summan 5.6 gånger större än summan av kvadraterna, eftersom 784 / 140 = 5.6. Hur många gånger större är kvadraten av summan när 100 termer används? Avrunda till heltal.

2.2
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Funktionen max() bestämmer det största värdet i en lista. Skriv ett program som gör samma sak utan att använda max(). Testa det på följande lista.

varden = [-38, -26, 68, -68, -31, 0, -82, 40, 42, -1]

Tänk på att programmet ska fungera oavsett vilka värden som finns i listan.

2.3
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Fibonacciföljden är en följd av tal ana_n som börjar med a0=0a_0 = 0 och sedan a1=1.a_1 = 1. Varje tal därefter hittas genom att addera de två föregående talen i följden. a2=0+1=1a3=1+1=2a4=1+2=3a5=2+3=5\begin{aligned} a_2 & = 0 + 1 = 1 \\ a_3 & = 1 + 1 = 2 \\ a_4 & = 1 + 2 = 3 \\ a_5 & = 2 + 3 = 5 \end{aligned} Gör ett program som skriver ut Fibonaccitalet an,a_n, där nn är minst 2,2, och testa för n=100.n = 100.

2.4
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Ronja har skrivit ett program som beräknar vilket element i en geometrisk talföljd som är det första som är större än 10000.10\,000. Användaren anger startvarde och kvot för att definiera sin talföljd.

startvarde = 2
kvot = 4

element = startvarde
antal_element = 1
while element < 10000:
	element = element*kvot
	antal_element = antal_element + 1
print("Element {} är det första över 10000.".format(antal_element))

  • Visa resultat

>
Element 8 är det första över 10000.

Det finns en bugg som i vissa fall kan ställa till problem. Hitta felet och rätta till det.

Nivå 3
3.1
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Newton-Raphsons metod är en numerisk metod för att uppskatta lösningar till ekvationer. Den kan t.ex. användas för att beräkna närmevärden till kvadratrötter. Man börjar då med en uppskattning av vad roten är och beräknar sedan medelvärdet av denna uppskattning och talet man beräknar roten ur dividerat med uppskattningen. Man får då en ny uppskattning som ligger närmare det sanna värdet och som man upprepa proceduren för. Detta kan skrivas som xn+1=xn+axn2, x_{n+1} = \frac{x_n + \dfrac{a}{x_n}}{2}, där xnx_n och xn+1x_{n+1} är den gamla respektive nya uppskattningen och aa är det tal man vill beräkna kvadratroten av.

a

Skriv ett program som använder Newton-Raphsons metod för att uppskatta kvadratroten av ett tal. Låt invärdena vara talet som kvadratroten ska beräknas för och antalet upprepningar. Använd talet du beräknar roten av som den första uppskattningen. Använd programmet för att räkna ut kvadratroten ur 1717 med 1010 upprepningar.

b

Man kan undersöka hur nära man är det rätta värdet genom att beräkna kvadraten av sin uppskattning och jämföra med det tal man beräknar roten av. Ändra ditt program så att det fortsätter räkna ut uppskattningar tills skillnaden mellan dessa värden är mindre än 10-15.10^{\text{-}15}.

3.2
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

Antag att man ritar in en cirkel med radien rr i ett koordinatsystem, centrerad runt origo. Ett antal heltalspunkter, alltså punkter där både xx- och yy-koordinaten är heltal, kommer då att hamna på cirkelskivan, på och innanför cirkeln.

Skriv ett program som bestämmer hur många sådana punkter det finns för en given radie r.r. Testa programmet på r=5,r = 5, r=28.47r = 28.47 och r=100.r = 100.

3.3
{{ 'ml-btn-focusmode-tooltip' | message }} settings_overscan

En Pythagoreisk trippel är en samling av tre positiva heltal a,a, b,b, cc som uppfyller Pythagoras sats: a2+b2=c2. a^2 + b^2 = c^2.

a

Gör ett program som hittar och skriver ut alla Pythagoreiska tripplar som uppfyller att a+b+c=600.a+b+c=600. Utrusta programmet med en iterationsräknare som håller koll på hur många talkombinationer som loopas igenom.

b

För mycket loopande ger långsamma program! Minska antalet iterationer till under 3000030\,000 genom att endast räkna upp kombinationer som följer storleksordningen a<b<c.a < b < c.

Test
{{ 'mldesktop-selftest-notests' | message }} {{ article.displayTitle }}!
{{ tests.error }}

{{ 'ml-heading-exercise' | message }} {{ focusmode.exercise.exerciseName }}

keyboard_backspace
{{ section.title }} keyboard_backspace {{ 'ml-btn-previous' | message }} {{ 'ml-btn-previous-exercise' | message }} {{ 'ml-btn-next-exercise' | message }} keyboard_backspace {{ 'ml-btn-next-exercise' | message }}