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