Uploaded by Robin Strömberg

Lösningsförslag till tentor

advertisement
Programmering tentasvar:
Innehållsförteckning
Programmering tentasvar: .......................................................................................................................... 1
A1 .............................................................................................................................................................. 1
a) .......................................................................................................................................................................... 1
b) .......................................................................................................................................................................... 2
c)........................................................................................................................................................................... 4
d) .......................................................................................................................................................................... 6
A2 .............................................................................................................................................................. 7
A3 ............................................................................................................................................................ 10
SKRIVA EN SOM LÄSER FIL ................................................................................................................................. 12
A4 ............................................................................................................................................................ 13
A5 ............................................................................................................................................................ 16
a uppgifter: ........................................................................................................................................................ 16
b uppgifter: ........................................................................................................................................................ 19
Ordlista: ................................................................................................................................................... 21
A1
a)
2020-06-03
ls [1:] tar bort första elementet för varje loop.
2020-08-24
1
2021-06-03
Kommer följande program att terminera?
i =9
while i>0:
i=i-10
Ja. Då loopen fortsätter så länge i är större än noll. Efter första varvet får i värdet -1 och därmed så
avslutas loopen.
2021-08-23
2022-06-01
b)
2020-06-03
Vad kommer att skrivas ut?
s="sommar"
b=7
c=6
if b==len(s) or c>b:
print("Vinter!")
elif len(s)<b and b>c:
print("Vår!")
else:
print("Höst!")
Svar: Vår!
2
2020-08-24
2021-06-03
Vilken utskrift ger detta program?
i="b"
j="ab"
b = len(i)==len(j)
if i=="b" and b:
print("A")
elif not (b or j!="b"):
print("B")
else:
print("C")
Svar:
“C” – då b får värdet false för att längen på i och j inte är lika. len(i)==len(j) testar om de har
samma längd, vilket de inte har. 1 respektive 2, b är false.
Första if-satsen säger att i ska ha samma värde som b och b värdet, vi får alltså 2 false.
Andra if-satsen säger not (b or j!=”b”). Eftersom varken b eller j har samma värde som b blir
det false, men ! gör det till true. Sedan går vi tillbaka till not, som vänder på det. Dvs. satsen
blir false och ”C” printas.
2021-08-23
3
2022-06-01
Vilken utskrift ger detta program?
s="defgh"
b=s[2]=="f"
n=len(s)
if not b and s[3]=="g":
print("A")
elif len(s)>n or len(s)<0:
print("B")
else:
print("C")
Svar: “C”
Förklaring:
• "b" sätts till True eftersom strängen "s" på position 2 (index 1) är "f".
• "n" sätts till längden på strängen "s", vilket är 5.
• Villkoret i if-satsen är "not b and s[3]=='g'", vilket är "False and s[3]=='g'", vilket är "False
and True", vilket är False. Därför kommer inte if-satsen att köras.
• Villkoret i elif-satsen är "len(s)>n or len(s)<0", vilket är "5>5 or 5<0", vilket är "False or
False", vilket är False. Därför kommer inte elif-satsen att köras.
Eftersom ingen av if- eller elif-satserna kördes kommer else-satsen att köras, vilket resulterar i att "C"
skrivs ut.
c)
2020-06-03
Vilken utskrift ger följande program?
s="abc"
sn=""
for c in s:
sn = c + sn
print(sn)
Svar:
”a”
”ba”
”cba”
Då första iterationen (loopen) ger c + sn vilket går igenom första tecknet i strängen ’s’, vilket är a.
4
Andra iterationen sätts sn = c + sn där c representerar andra tecknet i strängen, då har sn värdet ”b” +
”a”, alltså ”ba”.
Tredje iterationen görs samma sak, bara att c representerar det tredje tecknet i stränget. Då får sn
värdet ”c” + ”b” + ”a”, vilket skriver ut ”cba”
Tänk på att ’print’ ligger i loopen, så den kommer att ge en utskrift för varje varv den tar.
2020-08-24
2021-06-03
2021-08-23
Vilken utskrift ger följande program?
ls=[1,2,3]
i=0
j=len(ls)-1
while i<len(ls):
(ls[i],ls[j]) = (ls[j],ls[i])
i = i+1
j = j-1
print(ls)
Svar: [1, 2, 3]
2022-06-01
Vilken utskrift ger detta program:
5
lst=[4,2,1]
while lst[0]>len(lst):
print(lst[0])
lst=lst[1:]
Svar: ”4”
• Villkoret i while-loopen är "lst[0]>len(lst)", vilket är "4>3", vilket är True. Därför körs
loopen.
• Koden inuti loopen kommer att skriva ut värdet på första elementet i listan, vilket är 4.
• Listan "lst" ändras till att bara innehålla elementen 2 och 1.
• Villkoret i while-loopen kontrolleras igen och är nu "lst[0]>len(lst)", vilket är "2>2",
vilket är False. Därför avslutas loopen och programmet fortsätter inte längre.
d)
2020-06-03
Vad händer när följande kod exekveras? Om det blir fel, varför blir det fel? Om det blir korrekt, vilket
värde får s?
s="3"+str(int("345")+int(float("2.35")))
“3” är en sträng, så den kan adderas framför ett helttal.
Int() gör en sträng till ett heltal, 345 förblir 345.
Float() 2.35 gör 2.35, dock så gör int() det till ett heltal, alltså 2
Då adderar vi 3 + (345 + 2) = 3347
345 + 2 blir 347 då båda är heltal. 3 är en sträng och adderas därför framför.
2020-08-24
Vad händer när följande kod i python körs? Om det blir fel, varför blir det fel? Om det blir
rätt, vad blir då värdet på f?
f = 3.14-float("0.1"+str(4))-float(str(float(2/2))+"0")
3.14 får värdet 3.14.
float("0.1"+str(4)) blir 0.1 där 4 läggs till av en sträng, alltså 0.14.
Sen har vi float av 2/2 vilket blir 1. När det konverteras till en string får vi 1.0.
3.14 – 0.14 – 1 blir 2.0
2021-06-03
6
2021-08-23
Vad händer när följande kod exekveras (Om det blir fel, varför blir det fel? Om det blir rätt,
vilket värde får f?
f = 3 + float(0.1 + int("3")) + float("1"+str(0))
Svar: 16.1
Vi har heltalet 3 först.
Float(0.1 + int(”3”) blir 3.1, heltal
Float(”1”+str(0)) blir 10.
3+3.1+10=16.1
2022-06-01
Vad händer när följande kod exekveras? Om det blir fel, varför blir det fel? Om det blir korrekt, vilket
värde får s?
s=str(5.0)+float("2"+str(int(4-4)+1))
Svar: typeError då str(5.0) blir en sträng och float(”2”+str(int(4-4)+1)) blir ett flyttal. Man kan inte
addera strängar och heltal/flyttal.
A2
2020-06-03
7
2020-08-24
En programmerare har skrivit funktionen nzEvenProd(lst), som tar en lista av tal som
argument och returnerar produkten av alla tal med jämna värden strikt större än 0.
programmerare kom fram till koden nedan. Programmeraren har däremot gjort fel. Din
uppgift är att identifiera felen i koden och rätta dom. Det är inte tillåtet att skriva ett helt nytt
program, felen i det befintliga programmet måste korrigeras.
def nzEvenProd(lst):
i=0
while i<=len(lst):
if i % 2 == 0 and lst[i]>0:
prod = prod * lst[i]
i = i+1
return prod
Felen:
1. Variabeln prod används innan den har blivit tilldelad ett värde. Sätt prod = 1 ovanför
i=0
2. Loopen kommer att köras en gång för mycket. Då vi kollar om i är mindre eller lika
med längden på listan. Vi borde bara kolla om i är mindre än längden på listan. Ändra
loopvillkoret till:
8
while i<len(lst):
2021-06-03
2021-08-23
9
2022-06-01
Någon har skrivit en funktion, f, som tar en lista som argument. Funktionen ska beräkna och returnera
summan av alla element i listan. Programmeraren har gjort fel. Uppgiften är att skriva en korrigerad
version. Det är inte tillåtet att skriva ett helt nytt program, utan felen i detta befintliga måste rättas.
Programmeraren kom fram till följande:
def f(lst):
i = 0
while i < len(lst):
sum = sum + i
print(sum)
felen:
• Summan initialiseras inte till något värde. I den befintliga koden skapas en lokal variabel
"sum" men den tilldelas inte något värde, så summan är odefinierad när while-loopen börjar
köras.
• Elementen i listan räknas inte riktigt. I den befintliga koden adderas i (indexet för elementet)
till summan i stället för elementet självt.
• Resultatet skrivs ut med print(), men funktionen returnerar inte summan. I den befintliga
koden skrivs summan ut med print(), men den returneras inte med "return"-satsen. Detta gör
att funktionen inte kan användas på rätt sätt i andra delar av programmet.
Korrigeringar:
def f(lst):
sum = 0 # Initialisera summan till 0
for i in lst: # Loopa igenom alla element i listan
10
sum += i # Addera elementet till summan
return sum # Returnera summan
•
I den befintliga koden används en while-loop för att loopa igenom elementen i listan, men
summan av elementen räknas inte riktigt.
• I den korrigerade koden används en for-loop för att loopa igenom elementen i listan och
addera varje element till summan.
• Summan returneras sedan med hjälp av "return"-satsen.
Så den korrigerade versionen av funktionen räknar rätt summa av elementen i listan och returnerar
den.
A3
2020-06-03 – SKRIVA EN SOM SKAPAR EN FIL, en per rad
2021-06-03 – SKRIVA EN SOM SKAPAR EN FIL, SEMIKOLON
Skriv en funktion writeFile, som tar ett filnamn som argument (sträng) samt en lista av
heltal. Funktionen ska skapa en ny fil med filnamnet från parametern och skriva samtliga heltal
från listan i filen i samma ordning som i listan. Efter varje tal ska ett semikolon (;) skrivas i filen.
def writeFile(numbers, filename):
with open(filename, 'w') as f:
for number in numbers:
f.write(str(number) + ';')
2022-06-01– SKRIVA EN SOM SKAPAR EN FIL, lista med en ny per rad
11
SKRIVA EN SOM LÄSER FIL
2020-08-24 – SKRIVA EN SOM LÄSER FIL
2021-08-23 – SKRIVA EN SOM LÄSER FIL
12
A4
2020-06-03
2020-08-24
13
2021-06-03
2021-08-23
14
2022-06-01
Skriv en funktion, insertAfter, som tar tre strängar, s1, s2 och s3, som argument. Både s2 och s3
innehåller ett enda tecken (har längden 1). Funktionen ska returnera en ny sträng som är samma som
s1, men där s3 lagts till direkt efter varje förekomst av s2.
>>> insertAfter("murmeldjur","m","X")
'mXurmXeldjur'
Inbyggda funktioner eller metoder för listor eller strängar får inte användas. Det är tillåtet att använda
funktionerna len, range samt operatorn in. Iteration kan ske på valfritt sätt med for eller while.
15
A5
a uppgifter:
2020-06-03
2020-08-24
16
2021-06-03
Vilket värde har ls efter att programmet har körts klart?
2021-08-23
17
Motivering:
2022-06-01
18
b uppgifter:
2020-06-03
2020-08-24
19
2021-06-03
Vilket värde har ls efter att koden körts klart?
2021-08-23
2022-06-01
20
Ordlista:
Alias:
21
Append:
Argument:
22
Range:
Flyttal:
Att tänka på när man beräknar med strängar, float, int, flyttal, heltal och ””
23
Det finns viktigt att tänka på när du utför aritmetiska operationer på olika datatyper i Python:
•
•
•
str : Du kan inte utföra aritmetiska operationer på strängar direkt. Om du försöker göra
det kommer du att få ett felmeddelande. Du kan konvertera strängar till andra
datatyper (som int eller float) med hjälp av inbyggda funktioner som int() och float(),
och sedan utföra operationerna på den konverterade datatypen.
int: Du kan utföra aritmetiska operationer på heltal på samma sätt som du kan på andra
numeriska datatyper. Resultatet av en operation på två heltal kommer också att vara ett
heltal (om det inte är en division).
float: Du kan utföra aritmetiska operationer på flyttal på samma sätt som du kan på
andra numeriska datatyper. Resultatet av en operation på två flyttal kommer också att
vara ett flyttal.
Det är viktigt att komma ihåg att division mellan två heltal ( /) alltid ger ett flyttal, även om
resultatet är ett heltal. T.ex. 5 / 2 ger 2.5. För att få ett heltal som resultat kan du använda
divisonsoperator //, t.ex. 5 // 2 ger 2.
Om du vill concatenera (slå samman) strängar kan du använda plusoperatorn +. T.ex. "hej" +
"då" ger "hejdå".
Om du vill repetera en sträng ett visst antal gånger kan du använda stjärnmultiplikation *.
T.ex. "hej" * 3 ger "hejhejhej".
Det är viktigt att komma ihåg att du inte kan utföra aritmetiska operationer på strängar direkt.
Om du försöker göra det kommer du att få ett felmeddelande.
Det är också viktigt att tänka på att du inte kan konvertera alla strängar till numeriska
datatyper. Endast strängar som representerar giltiga heltal eller flyttal kan konverteras.
Strängar som innehåller annat än siffror (t.ex. bokstäver) kommer att resultera i ett
felmeddelande när du försöker konvertera dem.
Det är också viktigt att tänka på att olika aritmetiska operationer har olika prioritet.
Multiplikation och division har högre prioritet än addition och subtraktion. Du kan använda
parenteser för att specificera prioriteten för operationer. T.ex. 2 + 3 * 4 ger 14, medan (2 + 3)
* 4 ger 20.
Om du vill säkerställa att dina beräkningar ger förväntade resultat, se till att du förstår vilken
datatyp varje värde har och vilka operationer som kan utföras på den datatypen. Se också till
att du förstår prioriteten för operationerna du utför, och använd parenteser om det behövs för
att specificera prioriteten.
24
Download