Uppgift 1 (10p) Lösningsförslag till tenta 081024 • Total antal poäng: 40 • Tillåtna hjälpmedel: Inga • Betyg – 3: [20,28) – 4: [28,35) – 5: [35,40] a: Vilket värde har följande uttryck: 1<>2 and (1<0 or 6>=6) and True True b: Vilken utskrift ger följande program: a=4 b=3 if (a+b)>7: print ”Summan för stor” elif (b-a)<0: print ”Differensen för liten” else: print ”Allting fel” Differensen för liten c:Vilken utskrift ger följande program: b=2 while b<10: print ”B”, b=b+4 B B d: Vad händer när följande kod exekveras: x=”Python ”*2+”är kul!” x='Python Python är kul!‘ e:Vad händer när följande kod exekveras: y=”H ”+chr(ord(’e’))+”j!” y='H ej! def min(x, y, z): if (x<y): return x if (y<z): return y return z a: I vilket/vilka fall gör programmet fel? z<x<y b: Skriv en rättad version av programmet som fungerar i samtliga fall. def min(x, y, z): if (x<y) and (x<z): return x if (y<z): return y return z Uppgift 2 (5p) Någon har skrivit en funktion, min(x, y, z), som är tänkt att returnera det minsta av talen x, y, och z. Antag att x,y, och z är olika. Programmeraren kom fram till följande: def min(x, y, z): if (x<y): return x if (y<z): return y return z Programmeraren har dock gjort lite fel. Uppgiften är att identifiera och rätta felen. a: I vilket/vilka fall gör programmet fel? b: Skriv en rättad version av programmet som fungerar i samtliga fall. Uppgift 3 (5p) Vad blir utskriften av följande program? def improve(lst): lst[1:2]=[6] return lst lista=[1,3,5,4] lista2=improve(lista) lista2=[] print lista [1,6,5,4] 1 Uppgift 4 (5p) Skriv en funktion, replaceSegment, som tar en sträng str, och en annan sträng, replace, samt två heltal, start och stop. Funktionen ska returnera en ny sträng, där alla förekomster av delsträngen ”X” i den ursprungliga strängen, str, i intervallet från och med index start till, men inte med index stop, är utbytta mot strängen replace. Inbyggda funktioner eller moduler som utför samma eller liknande uppgifter får inte användas i denna uppgift. Det är dock tillåtet att använda funktionen len. Exempel: >>> replaceSegment("HXej! X balXoo!", "hopp", 3, 7) 'HXej! hopp balXoo!' def replaceSegment(str, replace, start, stop): new=str[0:start] for letter in str[start:stop]: if letter=='X': new=new+replace else: new=new+letter new=new+str[stop:] return new Uppgift 5 (5p) Betrakta följande kodsnutt: def func(fil, m): n=1 f=open(fil, “w”) while n<m: f.write(str(n)+”\n”) n=n+1 f.close() return n n=1 f=open(fil, “w”) while n<m: f.write(str(n)+”\n”) n=n+1 f.close() print n Identifiera lämpliga parametrar och lämpligt returvärde samt kapsla in koden som en egen funktion. Modifiera koden så att skärmutskrifter istället returneras från funktionen. Uppgift 6 (5p) Vi vill göra en klass som implementerar en frysvarnare. En frysvarnare fungerar så att den håller reda på om temperaturen varit under 0 grader. Frysvarnaren har tre metoder, increase, decrease och wasFreezing. En termometer kommer att anropa increase när temperaturen ökar en grad och decrease när temperaturen minskar en grad (vi ska inte implementera termometern i denna uppgift). Den ursprungliga temperaturen ska kunna sättas med initieraren till klassen. Metoden wasFreezing ska returnera True om temperaturen någon gång varit under 0 grader och False i annat fall. class Frysvarnare: def __init__(self,temperatur): self.temperatur=temperatur self.hasFrozen=temperatur<0 def increase(self): self.temperatur+=1 def decrease(self): self.temperatur-=1 if (temperatur<0): self.hasFrozen = True def wasFreezing(self): return self.hasFrozen 2 Uppgift 7 (5p) Skriv en rekursiv funktion studs, som tar ett heltal, n, som argument och skriver ut var tredje tal från n ner till och med det första negativa talet och sedan var tredje tal upp till n igen. Exempel på körning: >>> studs(10) 10 7 4 1 -2 1 4 7 10 >>> studs(10) 10 7 4 1 -2 1 4 7 10 def studs(n): print n, if n<0: return studs(n-3) print n, 3