Tentamen i Introduktion till programmering Kurskod: Skrivtid: D0009E 09:00-13:00 (4 timmar) Totalt antal uppgifter: 7 Totalt antal poäng: 38 Tentamensdatum: 2014-05-17 Jourhavande lärare: Tillåtna hjälpmedel: Fredrik Bengtsson tel. 0920-492431, 0738166670 Ordbok (språkordbok för svenska och ett annat språk ej programmering) Tentamen avser exempel implementerade i programmeringsspråket som använts i kursen, Python, och lösningarna förväntas i samma programmeringsspråk. Lycka till!
Uppgift 1: (8p) a: Kommer följande program att terminera (terminera=avsluta)? i = range(0,7) for k in i: k=k-1 b: Vilken utskrift ger följande program: s=3 k=7 v=s==k if s>3 or not v: print "fall 1" else: if v: print "fall 2" else: print "fall 3" c: Vilken utskrift ger följande program: s="tamkcolp" r=range(len(s)) i = len(s)-1 for k in r: print s[-1], s=s[:-1] d: Vad händer när följande kod exekveras (om det blir fel, varför blir det fel?): s=3 s=float(str(s)+"2")+5.0 Uppgift 2: (5 p) Någon har skrivit en funktion, isunique(li), som är tänkt att returnera True om alla element i listan li är unika (samma element inte finns två gånger) och False i andra fall. Programmeraren kom fram till följande: def isunique(li): i = 0 while i<len(li): if li[i] in li[i+1:]: break return True Programmeraren är fundersam om han/hon gjort rätt. Uppgiften är att identifiera och rätta ev. fel genom att skriva en rättad version av programmet som fungerar i samtliga fall alternativt bevisa att versionen ovan är rätt.
Uppgift 3: (5p) Vad blir utskriften av följande program? def insert(lst, em): i = 0 while em>lst[i]: i = i+1 if i==len(lst): break lst[:] = lst[:i]+[em]+lst[i:] def choose(lst1, lst2): if lst1[0]<lst2[0]: return lst1 else: return lst2 l1=[3,8] l2=[2,5] insert(l2,7) insert(l1,1) l3=choose(l1,l2) insert(l3,6) print l1,l2,l3 Uppgift 4: (5p) Skriv en funktion histogram(s) som tar en sträng som parametrar och returnerar en lista med ett histogram över antal tecken. En lista med ett histogram över antal tecken är en lista av heltal där talet på position k i listan är antalet förekomster i strängen s av tecken k från ascii-tabellen. (första talet i listan är antalet förekomster av ascii-värde 0, andra talet av ascii-värde 1 osv.) Det finns totalt 256 st. ascii-värden. Dessutom ska en funktion histprint implementeras, som tar en lista som funktionen hist returnerat och skriver ut en tabell på skärmen, innehållande alla tecken som förekom i strängen. Tabellen ska se ut s om i exemplet nedan. Körexempel: >>> h=histogram('mississippi') >>> histprint(h) M: 1 i: 4 p: 2 s: 4 Inbygda funktioner eller metoder för strängoperationer får inte användas. Det är tillåtet att använda funktionerna len och range. Iteration kan ske på valfritt sätt med for eller while.
Uppgift 5: (5p) Betrakta följande kodsnutt: f=open("log.txt",'r') header = f.readline() logtype = int(f.readline()) f.close() Kapsla in koden som en egen funktion vid namn initlogtype. Modifiera funktionen och lägg till kod så att det, om filen inte existerar, skapas en ny fil med samma namn som den som försökte öppnas. I denna nya fil ska dessutom texten log skrivas på första raden. På andra raden ska loggens typ skrivas och detta är ett heltal som ska tas som parameter till funktionen initlogtype. Glöm inte att avsluta raderna. Om filen inte kan läsas (men väl existerar) så ska ett undantag av typen LogError kastas/genereras. Undantagshanteringssystemet användas för all funktionalitet. Felhantering utöver det som nämns i uppgiften behöver inte implementeras. Uppgift 6: (5 p) Vi vill göra en klass Counter som är tänkt att användas för att representera ett värde som kan uppdateras, men där synligheten för uppdateringar kan fördröjas. Klassen ska deklarera en metod value som ska returnera det nuvarande värdet. Det ska också finnas en metod increase, som tar ett värde som argument och där detta värde adderas till det nuvarande värdet. Dessutom ska två metoder, pause och unpause, finnas. Om pause anropas så fryses värdet som value returnerar tills unpause anropas (value returnerar aktuellt värde för tidpunkten av anropet till pause). Det går under denna tid bra att uppdatera värdet som vanligt med increase, men dessa uppdateringar syns inte när man anropar value. När unpause anropas så syns återigen det aktuella värdet, inkl. de uppdateringar som gjorts under paustiden. Även en metod revert ska implementeras som återställer värdet till det som var vid anropet av pause, om objektet är i pausläge. Om objektet inte är i pausläge händer inget vid anrop av revert. Klassen ska också deklarera en initierare där startvärde ska som argument till denna. En metod för strängrepresentationen av objektet ska implementeras och den ska ge räknarens värde, på samma sätt som value. Uppgift 7: (5p) Skriv en rekursiv funktion, isincreasing, som tar en lista av heltal, lst, som argument och returnerar True eller False. Funktionen ska returnera True om talen i listan förekommer i strikt stigande ordning i listan annars False. För en lista med längden 1 eller en tom lista får det värde som är lämpligt returneras. Exempel: >>> isincreasing([1,2,3,4,5,6,7]) True >>> isincreasing([1,2,3,4,5,8,7]) False