Tentamen 729G04, 2013-01-11 1(8) 729G04 Programmering och diskret matematik Tentamen 2013 01 11 kl 08.00 13.00 Tillåtna hjälpmedel: Dator, penna, papper, linjal, suddgummi, godkänd(a) bok/böcker Uppgifter: Tentan består av 6 uppgifter (8 sidor inklusive denna sida). Poäng: Totalt kan man få 25 poäng. Betyg: För G behövs 12 poäng och för VG behövs 18 poäng. Frågor på Tentamen: Examinator besöker lokalen ca kl 8 och ca kl 10. Om du har funderingar som du inte kan få svar på, skriv ner dessa och hur du tolkat eventuella oklarheter som kommentarer i koden. Instruktion för att logga in 1. Logga in på kontot examx med lösenordet kluring1 2. Följ instruktionerna på skärmen och skriv in ditt personnummer. 3. Tentavakten kommer att gå runt och kontrollera personnummer och legitimation. Efter kontroll får du ett engångslösenord som du använder för att logga in med i själva tentasystemet. Genomförande av uppgifter Svar till uppgifterna skrivs i en textfil som du sparar under namnet dittstudentid.py (om ditt student-id är abcde123 sparar du till filen abcde123.py). Spara filen direkt i din hemkatalog. Du får använda valfri texteditor som finns tillgänglig, dvs. jedit, gedit eller den inbyggda i IDLE. Rekommendationen är använda jedit eller gedit tillsammans med ipython då det har hänt att IDLE är ostabilt i tentamiljön. Skriv namn, liu-id och personnummer i början av filen. Skriv en kommentar med uppgiftsnummer innan lösningen på uppgiften. Kom ihåg att spara då och då! Exempel på hur början av filen kan se ut # coding: latin-1 # Jody Foo, jodfo01 # 990818-0274 # Uppgift 1 Så här startar du IDLE/gedit/jedit Öppna först ett terminalfönster genom att högerklicka på skrivbordet och välja Terminal. För att starta IDLE, skriv idle i terminalfönstret. För att starta gedit, skriv gedit i terminalfönstret. För att starta jedit, skriv jedit i terminalfönstret.
Tentamen 729G04, 2013-01-11 2(8) Om du använder IDLE och det hänger sig under tentan 1. Prova att stänga IDLE-fönstren med Alt-F4 eller övre vänstra hörnets meny. 2. Om det inte fungerar, stäng terminalfönstret med Alt+F4 eller övre vänstra hörnets meny. 3. Starta idle igen genom att öppna en nytt terminalfönster (om det behövs) och skriva idle följt av <ENTER>. 4. Öppna din fil via menyraden eller genom att trycka Ctrl+O
Tentamen 729G04, 2013-01-11 3(8) Uppgift 1 (3p) Nedan finns en funktion som returnerar hur vanligt på en skala från 1-3 ett efternamn var i Sverige år 2011. Skriv om funktionen så att den innehåller färre vilkorssatser. Ändra också i koden så att funktionen blir okänslig för stora och små bokstäver i förnamnet som skickas till funktionen (dvs att funktionen klarar av t.ex. "Andersson" och "ANDERSSON" och "ANDERson" som input). def get_sirname_rating(sirname): if sirname == "Andersson": return 1 elif sirname == "Eriksson": return 2 elif sirname == "Johansson": return 1 elif sirname == "Karlsson": return 1 elif sirname == "Larsson": return 2 elif sirname == "Nilsson": return 2 elif sirname == "Olsson": return 3 elif sirname == "Persson": return 3 elif sirname == "Svensson": return 3
Tentamen 729G04, 2013-01-11 4(8) Uppgift 2 (4p) a) Skriv en funktion list_contains_greater_than(list_of_numbers, number) som returnerar True om listan list_of_numbers innehåller ett värde som är större än number. Om det inte finns ett heltal i list_of_numbers som är större än number, returnerar funktionen False. Använd en for-loop för att lösa denna uppgift. list_of_numbers är en lista som innehåller heltal och number är ett heltal. Se körexempel från ipython nedan. In [1]: list_contains_greater_then([1, 200, 3, 4], 3) Out[1]: True In [2]: list_contains_greater_then([5, 100, 7, 1], 101) Out[2]: False In [3]: list_contains_greater_then([6, 7, 8], 8) Out[3]: False b) Skriv en funktion list_contains_less_than(list_of_numbers, number) som returnerar True om listan list_of_numbers innehåller ett värde som är mindre än number. Om det inte finns ett heltal i list_of_numbers som är mindre än number, returnerar funktionen False. Använd en while-loop för att lösa denna uppgift. list_of_numbers är en lista som innehåller heltal och number är ett heltal. Se körexempel från ipython nedan. In [4]: list_contains_less_then([1, 2, 3, 4], 3) Out[4]: True In [5]: list_contains_less_then([10, 50, 30, 20], 9) Out[5]: False In [6]: list_contains_less_then([6, 7, 8], 6) Out[6]: False
Tentamen 729G04, 2013-01-11 5(8) Uppgift 3 (2p) Definiera funktionen nfirst(mixed_list, n) som returnerar de n första elementen i listan mixed_list. Anta att n är ett positivt heltal. Se exempelkörningar från ipython nedan: In [7]: nfirst(["a", "b", "c"], 2) Out [7]: [ a, b ] In [8]: nfirst([5, 6, 7], 1) Out [8]: [5] In [9]: nfirst([1, 2, 3], 0) Out [9]: []
Tentamen 729G04, 2013-01-11 6(8) Uppgift 4 (3p) Definiera en funktion average(mixed_list) som tar in en lista, mixed_list, som innehåller värden av olika datatyper, dock inte listor. Funktionen ska returnera medelvärdet av alla heltal (inte flyttal) i listan. Det returnerade medelvärdet ska dock vara ett flyttal. Anta att det finns minst ett heltal i listan som ges som input. Se exempelkörning nedan: In [10]: average([1, 2, 3.0, "4"]) Out[10]: 1.5 In [11]: average([2, 2, 2, 2]) Out[11]: 2.0 In [12]: average(["eggs", "bacon", 500]) Out[12]: 500.0
Tentamen 729G04, 2013-01-11 7(8) Uppgift 5 (6p) I denna uppgift ska du lagra information om din nyfunna hobby Platespotting. Platespotting går ut på att du först ska se en bil med ett registreringsnummer som slutar på 001 (T.ex. ABC 001). Sedan ska du se en bil med registreringsnummer som slutar på 002 osv. I denna uppgift ska du skriva funktioner i Python som kan bearbeta information om vilket registreringsnummer du såg vid vilken tidpunkt. Längst ner på sidan ser du exempelkörningar från ipython. a) Skriv en funktion create_spot(date_time, plate) som tar in två strängar och returnerar ett dictionary som innehåller nycklarna "date and time" och "plate". Nyckeln "date and time" lagrar värdet från argumentet date_time. Nyckeln "plate" lagrar värdet från argumentet plate. Kontrollera att både både date_time och plate är strängar. Skriv ut ett felmeddelande och returnera None om någon av argumenten inte är en sträng. Ingen felhantering av innehållet i strängarna date_time och plate behöver göras (dvs det spelar ingen roll vad som står i strängarna). b) Skriv en funktion get_date_time(spot) som tar en spot som argument (dvs ett dictionary enligt ovan) och returnerar strängen som lagras i under nyckeln "date and time". Kontrollera att spot är ett dictionary med nycklarna "date and time" och "plate". Skriv ut ett felmeddelande och returnera None om spot inte är ett dictionary enligt ovan. c) Skriv en funktion set_plate(spot, plate) som tar en spot (enligt ovan) och en sträng, plate, som argument. Funktionen ändrar på värdet i spot som är associerat med nyckeln "plate". Kontrollera att spot är ett dictionary med nycklarna "date and time" och "plate". Skriv ut ett felmeddelande, och ändra inte på spot. Nedan följer exempelkörning från ipython: In [13]: create_spot("2013-01-11 07:00", "ABC001") Out[13]: {'date and time': '2013-01-11 07:00', 'plate': 'ABCD123'} In [14]: first = create_spot("2013-01-11 07:00", "ABC001") In [15]: get_date_time(first) Out[15]: '2013-01-11 07:00' In [16]: get_date_time("blabla") Error in input. In [17]: set_plate(first, "PYTHON") In [18]: first Out[18]: {'date and time': '2013-01-11 07:00', 'plate': 'PYTHON'}
Tentamen 729G04, 2013-01-11 8(8) Uppgift 6 (7p) I denna uppgift ska du skapa en abstrakt datastruktur för att representera tid. Vi ska implementera denna datastruktur genom att använda oss av en lista. Listan ska ha tre element. Längst ner på sidan finns exempelkörningar. Det första elementet representerar antal timmar Det andra elementet representerar antal minuter Det tredje elementet representerar antal sekunder Tiden 08:15:00 representeras alltså av följande lista: [8, 15, 0] a) Skapa funktionen create_clock(hours, minutes, seconds) som tar tre heltal som argument och returnerar en liststruktur enligt ovanstående specifikation. Se till att funktionen skriver ut ett felmeddelande och returnerar None om något av följande är sant: värdet på minutes överskrider 59 värdet på seconds överskrider 59 värdet på hours överskrider 23 hours, minutes eller seconds är negativt hours, minutes eller seconds inte är ett heltal b) Skapa funktionen add_seconds(seconds, clock) som tar in två argument, ett heltal och en clock (dvs en lista enligt ovan). Funktionen ökar tiden i clock med antalet sekunder som anges i argumentet seconds. Se till öka minuter och timmar om det behövs. Funktionen returnerar inget utan ändrar direkt i listan som representerar tiden. Ändra bara i clock om seconds är ett positivt heltal. Om ingen ändring sker, skriv ut ett felmeddelande. Nedan följer exempelkörning från ipython: In [19]: create_clock(8, 15, 0) Out[19]: [8, 15, 0] In [20]: create_clock(8, 80, 0) Error in input. In [21]: the_time = create_clock(8, 15, 0) In [22]: the_time Out[22]: [8, 15, 0] In [23]: add_seconds(10, the_time) In [24]: the_time Out[24]: [8, 15, 10] In [25]: add_seconds(120, the_time) In [26]: the_time Out[26]: [8, 17, 10]