Storseminarium 2.2 - En sak i taget
Innan seminariet ska du ha gått igenom Inför seminariet nedan och gjort tillhörande quiz. Syftet med detta är att du ska bekanta dig med innehållet så eventuella frågor kan redas ut under seminariet.
Denna sida visar en del av det som kommer att diskuteras på seminariet. Det kan hända att handledarna också tar upp andra uppgifter som inte behöver något specifikt studiematerial och då syns dessa uppgifter inte på sidan.
Inför seminariet
- Föreläsning 2 Webbversion, Sökbar version
- Förberedelsematerial
Under seminariet
Vi går igenom nedanstående uppgifter tillsammans, det kommer finnas möjlighet till diskussion och frågor. Känn er fria att följa med på uppgifterna på egen dator under seminariet om ni lär er bättre så, men vi kan inte garantera att vi har tid att vänta in alla.
Skriv ut tal
a)
Skriv en funktion print_numbers(first, last)
som skriver ut alla heltal mellan first
och last
. Om first
är 3
och last
är 5
så ska alltså talen 3
, 4
och 5
skrivas ut. Antag att last
är större än first
. Lös med rekursion, med for
och med while
.
Vilken lösning är lättare att förstå? Vilka skäl finns det för att föredra en viss lösning före en annan?
b)
Generalisera lösningarna så att funktionen fungerar även om first
är större än last
. Om first
är 9
och last
är 6
så ska alltså talen 9
, 8
, 7
och 6
skrivas ut. Förändrar detta vilken lösning som är “bäst”?
Multiplikationstabell
a)
Skriv en funktion multiplication_table(n, last_factor)
som skriver ut multiplikationstabellen för talet n
upp till och med last_factor
. Lös med lämplig loop.
Exempel
>>> multiplication_table(7, 4)
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
b)
Skriv en funktion multiplication_table(n, max_product)
som skriver ut multiplikationstabellen för talet n
upp tills max_product
överskrids. Lös med lämplig loop.
Exempel
>>> multiplication_table(7, 30)
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
Gissa tal
a)
Skriv en funktion guess_the_number(lowest, highest)
som slumpar ett tal mellan lowest
och highest
och låter användaren gissa tills hen gissat rätt. Vi kan ta input från användaren med hjälp av funktionen input(prompt)
.
OBS! Tänk på att värdet som slumpas av random.randint
är ett heltal och värdet som input
läser in är en sträng, det ena värdet måste alltså konverteras för att gissning och värde skall kunna jämföras.
Exempel
>>> guess_the_number(1, 5)
Gissa ett tal mellan 1 och 5: 1
Gissa ett tal mellan 1 och 5: 2
Gissa ett tal mellan 1 och 5: 3
Gissa ett tal mellan 1 och 5: 4
Rätt gissat!
b)
Nu ska vi göra funktionen lite mer hjälpsam så att vi snabbare ska kunna gissa rätt värde. Lägg till kod i guess_the_number
så att funktionen också skriver ut om gissningen är för hög eller för låg.
Exempel
Med strategin vi använde i förra exemplet hade vi behövt i snitt 50 gissningar innan vi gissar rätt. I värsta fall, om det slumpade talet är 100 och vi börjar gissa från 1 och testar värde för värde, så måste vi gissa 100 gånger.
Att funktionen informerar oss om huruvida vår gissing är för hög eller för låg innebär dock att vi kan använda en gissningsstrategi som kallas binärsökning där vi hela tiden halverar hur stort steg vi tar. Vi tar ett exempel där vi ska gissa ett slumpat värde mellan 1 och 100.
>>> guess_the_number(1, 100)
Gissa ett tal mellan 1 och 100: 50
För lågt!
Gissa ett tal mellan 1 och 100: 75
För lågt!
Gissa ett tal mellan 1 och 100: 87
För högt!
Gissa ett tal mellan 1 och 100: 81
För lågt!
Gissa ett tal mellan 1 och 100: 84
För högt!
Gissa ett tal mellan 1 och 100: 82
Rätt gissat!
c)
Vi ska nu vända på förhållandet och låta vårt program gissa istället. Skriv en funktion binary_search_gtn(lowest, highest)
som ska använda samma strategi som ovan för att lista ut ett värde som vi har bestämt i förväg. Dvs. istället för att programmet läser in en gissning från oss så gör programmet en gissning och vi svarar ifall gissningen är rätt (r
), för låg (l
) eller för hög (h
).
Exempel
Vi bestämmer att värdet ska vara 23 och informerar programmet att värdet ligger någonstans mellan 1 och 100:
>>> binary_search_gtn(1, 100)
Är talet 50? (r/l/h): h
Är talet 25? (r/l/h): h
Är talet 12? (r/l/h): l
Är talet 18? (r/l/h): l
Är talet 21? (r/l/h): l
Är talet 23? (r/l/h): r
Woho!
Tärningsslag
a)
Skriv en funktion dice_rolls_until(n_sides, target_side)
som simulerar och lagrar slag av en tärning med n_sides
sidor (antag att de är numrerade från 1 och utan uppehåll) till och med att target_side
kommer upp.
Exempel
|
|
b)
Skriv en funktion dice_rolls_until(n_sides, target_sum)
som simulerar och lagrar slag av en tärning med n_sides
sidor (antag att de är numrerade från 1 och utan uppehåll) tills det att summan av slagen är minst target_sum
.
Exempel
|
|
c)
Skriv en funktion dice_rolls_until(n_sides, target_side, target_sum)
som simulerar och lagrar slag av en tärning med n_sides
sidor (antag att de är numrerade från 1 och utan uppehåll) tills det att sidan target_side
kommer upp eller summan av slagen är minst target_sum
.
Exempel
|
|
Muterbarhet och funktionsanrop
Fungerar följande kodsnuttar och i så fall, vad skriver de ut?
a)
|
|
b)
|
|
c)
|
|
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-09-15