Lösningsförslag till tenta 111028 • Tillåtna hjälpmedel: Ordbok (språk) • Totalt antal poäng: 40 • Skrivtid: 4 timmar Uppgift 1 (10p) a: Kommer följande program att terminera (terminera=avsluta)? j=0 k=3 Ja! i=0 ett varv till while i<len(range(j,k)): ett varv till k=k+1 if (j<k): i=i+2 print 'ett varv till' ett varv till b: Vilken utskrift ger följande program: c: Vilken utskrift ger följande program: delay=5 jitter=3 compensation=True if delay-jitter<2 and compensation: print 'synchronization failure' elif compensation and jitter<delay: compensation=not compensation if delay>jitter and not compensation: print 'Jitter boundary' else: print 'Compensation performed' s='A' while len(s)<5: s=s+chr(ord(s[-1])+1) print s 'Jitter boundary' ABCDE d: Vad händer när följande kod exekveras: value=range(1,5,2)[-2]+3+int('2'+str(0)) value tilldelas heltal 24 1 Uppgift 2 (5p) Någon har skrivit en funktion twoOfThree(a,b,c) som är tänkt att returnera True endast om exakt två av argumenten är sanna. Programmeraren kom fram till följande lösning: def twoOfThree(a,b,c): if a and b: return not c elif a and c: return not b else: return not a Programmeraren har dock gjort lite fel. Skriv en korrigerad version av programmet som utför uppgiften korrekt. Uppgift 3 (5p) Vad blir utskriften av följande program? (metoden index på listor returnerar index för argumentet i listan (a.index(b) ger index för b i listan a)) def filter(ls,e): [3, 4, 5, 2] ls = [ls.index(e)] return ls def extract(ls,k): return ls+k list=[3,4,5] k=filter(list,5) print extract(list,k) Om (a=False) blir det fel utom b=True=c def twoOfThree(a,b,c): if a and b: return not c elif a and c: return not b elif b and c: return not a Uppgift 4 (5p) Skriv en funktion rFind(str,substr) som tar en sträng str och en till sträng substr som parametrar. Funktionen ska returnera en tupel som ska bestå dels av indexet för den sista förekomsten av substrängen substr i strängen str och dels det totala antalet förekomster av substr i strängen str. Det är tillåtet att anta att strängen substr endast innehåller ett tecken. Körexempel: >>> rFind("Mississippi", "s") (6, 4) Inbygda funktioner eller metoder som utför liknande uppgifter får inte användas. Det är dock tillåtet att använda funktionerna len och range. Iteration kan ske på valfritt sätt med for eller while. 2 def rFind(str,ch): total=0 lastIndex=0 i=0 while i <len(str): if ch==str[i]: lastIndex=i total+=1 i+=1 return lastIndex,total def rFind(str,ch): total=0 lastIndex=0 for i in range(len(str)): if ch==str[i:i+len(ch)]: lastIndex=i total+=1 return lastIndex,total def caps(n): str='' m=65 for x in range(m,m+n): if chr(x)!=' ': str=str+chr(x) return str Uppgift 5 (5p) Betrakta följande kodsnutt: m=65 for x in range(m, m+n): print chr(x), Identifiera lämpliga parametrar och kapsla in koden som en egen funktion vid namn caps. Modifiera koden så att funktionen returnerar en sträng innehållande de tecken som nu skrivs ut på skärmen exkl. mellanslag (ta inte med mellanslaget som ”print” lägger till i strängen som ni returnerar). Uppgift 6 (5p) Vi vill göra en klass WaterLevel som implementerar övervakning av en vattennivå. Aktuell vattennivå ska kunna anges vid instansiering (skapandet) av objektet. Vidare ska en metod, updateLevel(l) implementeras för att uppdatera den aktuella nivån samt en metod getAlarm() som returnerar -1 om nivån är under 0, 1 om nivån är över 100 och i annat fall 0. Implementera klassen WaterLevel enligt ovan. 3 Uppgift 7 (5p) class WaterLevel: def __init__(self, nivaa): self.vattennivaa=nivaa def updateLevel(self, nivaa): self.vattennivaa=nivaa self.vattennivaa += nivaa def getAlarm(self): if self.vattennivaa<0: return -1 elif self.vattennivaa>100: return 1 return 0 Skriv en rekursiv funktion, multiplar(i,j), som returnerar en lista av tal som är heltalsmultiplar av i. Listan ska innehålla alla heltalsmultiplar av ifrån och med 1 till och med j. (Tips: j är rekursionsvariabel) Exempel: >>> multiplar(3,5) [3, 6, 9, 12, 15] >>> multiplar(2,6) [2, 4, 6, 8, 10, 12] >>> multiplar(1,8) [1, 2, 3, 4, 5, 6, 7, 8] def multiplar(m,n): if n<=0: return [] return multiplar(m,n-1)+[m*n] 4