A1#
import math
class Fyrkant():
def __init__(self, sida):
pi = math.pi
self.hojd = 2 * sida
self.bredd = 3 * sida
self.area = self.hojd * self.bredd
self.vinklar = [pi/2., pi/2., pi/2., pi/2.]
self.diag1, self.diag2 = 2 * [math.sqrt(self.hojd ** 2
+ self.bredd ** 2)]
def parallellogram(self, ang):
self.vinklar = [ang, pi - ang, ang, pi - ang]
self.diag1 = math.sqrt(self.hojd ** 2 + self.bredd ** 2
+ 2 * self.hojd * self.bredd * math.cos(ang))
self.diag2 = math.sqrt(self.hojd ** 2 + self.bredd ** 2
- 2 * self.hojd * self.bredd * math.cos(ang))
def __str__(self):
return f'Area = {self.area}'
Betrakta koden ovan. Vilket alternativ använder korrekt terminologi för de olika komponenterna i koden?
Välj ett alternativ
moduler: math, self
klasser: Fyrkant
funktioner: sqrt, cos
metoder: __init__(), __str__(), diag1, diag2, vinklar
attribut: hojd, bredd, area
moduler: math
klasser: Fyrkant
funktioner: sqrt, cos, area, parallellogram()
metoder: __init__(), parallellogram(), __str__()
attribut: hojd, bredd, area, vinklar, diag1, diag2
moduler: math
klasser: Fyrkant
funktioner: sqrt, cos
metoder: __init__(), parallellogram(), __str__()
attribut: hojd, bredd, area, vinklar, diag1, diag2
moduler: math
klasser: Fyrkant
funktioner: sqrt, cos, parallellogram()
metoder: __init__(), __str__()
attribut: hojd, bredd, area, vinklar, diag1, diag2, self
Lösning
Svar: Alternativ 3
A2#
import random as rd
import matplotlib.pyplot as plt
from math import sqrt
from turtle import Turtle
Betrakta koden ovanför. För varje påstående nedanför, markera om det är sant eller falskt.
Du måste markera alla 4 påståendena korrekt för att få 1 poäng på den här uppgiften.
sqrt
ochTurtle
är en funktion respektive en klass från modulerna math respektive turtle :
Sant
Falskt
sqrt
ochTurtle
är funktioner från modulerna math respektive turtle :
Sant
Falskt
rd
ochplt
är funktioner från modulerna random respektive matplotlib.plt:
Sant
Falskt
rd
ochplt
är import-alias till modulerna random och matplotlib.plt:
Sant
Falskt
A 3#
Skriv en funktion summa_av_slumptal(tol)
som summerar en serie slumpmässiga heltal mellan 0 och 10 och returnerar summan av slumptalen. Summan ska returneras när nästa term i serien hade gjort att summan blivit större än en angiven tolerans tol
.
Förutom summan ska även antalet termer i summan returneras.
Ledning: Slumptalsgeneratorn importeras med import random
.
Metoden random.randint(a,b)
ger slumpmässiga heltal mellan a och b.
Exempel: Följande kod
count,summa = summa_av_slumptal(21)
print(f'Summan av {count} slumptal är lika med {summa}.')`
ska till exempel kunna ge utskriften:
Summan av 5 slumptal är 19.
Utskriften kommer att variera då det är en summa av slumptal.
Lösningsförslag
import random
def summa_av_slumptal(tol):
tol = int(tol)
summa = 0
count=0
kast = 0
while summa +kast <=tol:
summa += kast
count +=1
kast = random.randint(0,10)
count = count-1
return count,summa
count,summa = summa_av_slumptal(21)
print(f'Summan av {count} slumptal är lika med {summa}.')
A4#
Kast med en tärning modelleras av klassen Dice,
import random
class Dice:
def __init__(self, sides):
self.sides = sides
self.number = 1
self.value = random.randint(1, self.sides)
def __str__(self):
return f'Sidor: {self.sides:2d},
f'summa: {self.value:2d} efter {self.number} kast'
def roll(self,number):
self.value =random.randint(1, self.sides)
Uppdatera metoden roll
så att den beräknar summan av number
tärningskast. Summan ska sedan lagras i instansvariablen value
.
Om man anger ett värde på number
som är mindre än 1, skall metoden använda number=1
.
Utskriften ska bli av formen nedan
Önskad utskrift
d1 = Dice(6)
d1.roll(5)
print(d1)
d1.roll(-2)
print(d1)
Utskrift:
Sidor: 6, summa: 17 efter 5 kast
Sidor: 6, summa: 5 efter 1 kast
Notera att du endast får uppdatera metoden roll
i klassen. Du får INTE göra några andra ändringar i koden.
Lösningsförslag
import random
class Dice:
def __init__(self, sides):
self.sides = sides
self.number = 1
self.value = random.randint(1, self.sides)
def __str__(self):
return f'Sidor: {self.sides:2d}, summa: {self.value:2d} efter {self.number} kast'
def roll(self,number):
if number <1:
number = 1
self.number = number
self.value = 0
for _ in range(number):
self.value +=random.randint(1, self.sides)
d1 = Dice(6)
print(d1)
d1.roll(3)
print(d1)
A 5#
Skriv ett skript som anropar en funktion rakna_ord(text)
som tar en textsträng text
som input och returnerar statistik över förekomsten av olika ord.
Funktionen rakna_ord(text)
ska returnera en lista med de olika orden samt hur ofta orden förekommer. Listan skall vara sorterad i bokstavsordning.
Ledning 1: Använd lexikon.
Ledning 2: Du kan plocka ut de enstaka orden i en text med hjälp av följande kod
import re
ordlista = re.findall(r'[a-zA-ZåäöÅÄÖ]+', text)
Se exemplet och utskriften nedan.
Exempel Med följande kod
text_ut = rakna_ord(text)
for element in text_ut:
print(f'{element[0]}:{element[1]}', end=' ')
ska textsträngen
text = 'O jerum, jerum, jerum, O quae mutatio rerum'
resultera i utskriften
O:2 jerum:3 mutatio:1 quae:1 rerum:1
Lösningsförslag
import re
def rakna_ord(text):
ordlista = re.findall(r'[a-zA-ZåäöÅÄÖ]+', text)
antal_ord = {}
for ord in ordlista:
if ord in antal_ord:
antal_ord[ord] += 1
else:
antal_ord[ord] = 1
return (sorted(antal_ord.items()))
text = 'O jerum, jerum, jerum, O quae mutatio rerum'
text_ut = rakna_ord(text)
#print(text_ut)
for element in text_ut:
print(f'{element[0]}:{element[1]}',end = ' ')
A 6#
En text är skriven på ett tangentbord som saknar de svenska bokstäverna å, ä, ö, Å, Ä samt Ö. Istället har man använt { för å, } för ä och | för ö, samt [ för Å, ] för Ä och _ för Ö
Skriv en funktion svenska_tecken(text_in)
som tar en textsträng text_in
och returnerar en textsträng text_ut
där {,},|,[,] och _ ersatts med å, ä, ö, Å, Ä och Ö.
Exempel (från en dikt av Gustav Fröding)
Med
text_in = "D’} e {, vett ja”, skrek ja, f|r ja ble rasen, ”{ i {a } e |, h|rer han lite, d’} e {, { i {a } e |."
ska
print(svenska_tecken(text_in))
resultera i
text_ut ="D’ä e å, vett ja”, skrek ja, för ja ble rasen, ”å i åa ä e ö, hörer han lite, d’ä e å, å i åa ä e ö."
Lösningsförslag
def svenska_tecken(text):
text=text.replace('{','å')
text=text.replace('}','ä')
text=text.replace('|','ö')
text=text.replace('[','Å')
text=text.replace(']','Ä')
text=text.replace('_','Ö')
return text
eller
def svenska_tecken_alt(text_in):
text_ut = text_in
byta = {'{': 'å', '}': 'ä', '|': 'ö', '[': 'Å', ']': 'Ä', '_': 'Ö'}
for old, new in byta.items():
text_ut = text_ut.replace(old, new)
return text_ut
text_in = "D’} e {, vett ja”, skrek ja, f|r ja ble rasen, ”{ i {a } e |, h|rer han lite, d’} e {, { i {a } e |."
print(svenska_tecken(text_in))
A 7#
Skriv en funktion statistik(lst)
som beräknar medelvärde och median för en lista lst
med n
tal. Funktionen behöver kunna hantera listor med både ett jämt och ett udda antal värden.
OBS! Du får inte använda modulen statistics.
Ledning 1: Medianen definieras som det mittersta värdet av listan om n är udda. Om n är jämnt är medianen medelvärdet av de mittersta värdena i listan.
Ledning 2: För beräkning av medianen behöver listan vara sorterad i storleksordning.
Exempel Med listan
lst = [10,1,3,4,2]
skall koden
medelvarde,median = statistik(lst)
print(f' Medianen är {median} och medelvärdet är {medelvarde}.')
resultera i
Medianen är 3 och medelvärdet är 4.0.
Lösningsförslag
def statistik(lst):
lst = sorted(lst)
length = len(lst)
medelvarde = sum(lst)/len(lst)
if length%2 !=0:
return medelvarde, lst[length//2]
else:
return medelvarde,(lst[length//2-1]+lst[length//2])/2
lst = [10,1,3,4,2]
medelvarde,median = statistik(lst)
print(f' Medianen är {median} och medelvärdet är {medelvarde}.')
A 8#
Du har gjort ett experiment tillsammans med en kursare där ni, var för sig, varje timme mätt temperaturen T
i ett prov.
Mätningarna är sparade i varsitt lexikon med klockslaget som nyckel och temperaturen (i grader Celsius) som värde. I labbrapporten ska ni redovisa medelvärdet per timme av era temperaturmätningar.
Det visar sig dock att ni sparat datat på två olika sätt.
Du har sparat datat som lexikonet
data_1 = {'12':1.1,'13':2.8,'14':3.4}
Din kursare har sparat datat som lexikonet
data_2 = {'14:00':'3.5','13:00':'2.9','12:00':'1.4'}
Skriv en funktion temperatur_matning(data_1,data_2)
som läser in de två olika mätningarna och returnerar medelvärdet av temperaturen per timme.
Ledning: Du kan utgå ifrån att data läses in i ordningen data_1
, data_2
.
Med koden
matning = temperatur_matning(data_1,data_2)
for m in matning:
print(f' Kl {m} var temperaturen {matning[m]} grader Celsius.')
ska utskriften från programmet ska se ut som nedan:
Kl 12 var temperaturen 1.25 grader Celsius.
Kl 13 var temperaturen 2.85 grader Celsius.
Kl 14 var temperaturen 3.45 grader Celsius.
Lösningsförslag
def temperatur_matning(data_1,data_2):
matning = {}
for e in data_1:
matning[e]= round((float(data_1[e])+ float(data_2[e+':00']))/2,2)
return matning
data_1 = {'12':1.1,'13':2.8,'14':3.4}
data_2 = {'14:00':'3.5','13:00':'2.9','12:00':'1.4',}
matning = temperatur_matning(data_1,data_2)
for m in matning:
print(f' Kl {m} var temperaturen {matning[m]} grader Celsius.')
B#
På midsommaafton på landet brukar man arrangera ett ”potatisrace”. Racet går ut på att man placerar en potatis på en sked, som man sätter i munnen, och man ska sedan gå en sträcka och balansera potatisen.
Regler:
Först i mål vinner.
Tappar man potatisen måste man gå tillbaks till start ett steg i taget och börja om från början.
Om två personer kommer i mål samtidigt vinner den som är yngst.
B1: Skapa en klass Potatisrace.
Skriv en konstruktor __init__(self,length,number)
som tar parametrarna length
(heltal, längden på banan) och number
(heltal, antal deltagare).
Vid initieringen ska åldern på varje deltagare slumpas till mellan 10 och 80 år.
Ledning 1: Använd import random samt random.randint(min,max) för att slumpa fram åldrarna.
Ledning 2: Ett lexikon kan vara användbart för att hålla ordning på de olika deltagarna.
Ledning 3: Förutom length
och number
kan position, riktning (framåt/bakåt) och ålder vara bra att definiera i konstruktorn.
Exempel:
import ....
class Potatisrace:
def __init__(self,length,number):
def __str__(self):
def kliva(self,tol):
def mal(self):
B2 Lägg till en __str__()
metod som illustrerar loppet vid varje tidssteg. Positionen för varje deltagare markeras med bokstaven P.
Utskriften ska se ut som nedan, vilket ger en ögonblicksbild för tre deltagare (number = 3
) och med en banlängd om 10 (length =10
)
[ P ]
[ P ]
[ P ]
B3 Lägg till en metod kliva(tol) för deltagarna att ta ett steg framåt.
Vid varje steg så avgör slumpen om en deltagare n tappar sin potatis.
Om man tappar sin potatis måste man återvända till start, ett steg i taget, och börja om.
Sannolikheten för att tappa potatisen ges av en tolerans tol som ges som input till metoden.
Metoden ska alltså:
ta ett steg framåt och kolla om man tappat potatisen.
Om man tappat potatisen, måste man gå ett steg bakåt de kommande gångerna tills man nått startpunkten, och sedan börja gå framåt igen.
Du kan kan lämna in svaret vid uppgift B4.
B4 Skriv en metod mal() för att avgöra om någon kommit i mål, och i så fall vem om kommit först i mål. Simuleringen skall avbrytas når någon kommit i mål.
Om flera kommer i mål samtidigt, vinner den som är yngst.
Utskriften vid vinst ska se ut som nedan.:
Racet klart! Vinnare är bana 1 med en deltagare som är 47 år gammal
[ P ]
[ P ]
[ P ]
def main():
tol = 20
p1 =Potatisrace(5,3)
print(p1)
klar = False
while not klar:
p1.kliva(tol)
print(p1)
klar,alder,bana =p1.mål()
if klar:
break
print(' ')
print(f'Racet klart! Vinnare är bana {bana+1} med en deltagare som är {alder} år gammal')
print(p1)
if __name__ == '__main__':
main()
Lösningsförslag
import random
class Potatisrace:
def __init__(self,length,number):
self.length = length
self.race={}
pos = 0
direction = 1
for n in range(number):
age = random.randint(10,70)
self.race[n]=[pos, direction, age]
def __str__(self) :
res = '\n'
for n in self.race:
track = [' ']*self.length
track[self.race[n][0]]='P'
row_str = ' '.join([str(track[_]) for _ in range(self.length)])
res += '[ ' + row_str + ' ]\n'
return res
def kliva(self,tol):
for k in self.race:
self.race[k][0] += self.race[k][1]
slumptal = random.randint(1,100)
if slumptal<tol and self.race[k][0]>0:
self.race[k][1]= -1
if self.race[k][0]<=0:
self.race[k][0]=0
self.race[k][1]=1
if self.race[k][0]>self.length:
self.race[k][0]=self.length
def mål(self):
klar = False
alder = 100
bana = 1
for k in self.race:
if self.race[k][0]>= self.length-1:
if self.race[k][2]<alder:
alder = self.race[k][2]
bana = k
klar = True
return klar,alder,bana
bana = 0
tol = 20
p1 =Potatisrace(5,3)
print(p1)
klar = False
while not klar:
p1.kliva(tol)
print(p1)
klar,alder,bana =p1.mål()
if klar:
break
print(' ')
print(f'Racet klart! Vinnare är bana {bana} med en deltagare som är {alder} år gammal')
print(p1)