Tentamen 729G04, 2013-02-15 1(9) 729G04 Programmering och diskret matematik Tentamen 2013–02–15 kl 14.00–19.00 Tillåtna hjälpmedel: Dator, penna, papper, linjal, suddgummi, godkänd(a) bok/böcker Uppgifter: Tentan består av 7 uppgifter (9 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 14 och ca kl 16. 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. 2. 3. Logga in på kontot examx med lösenordet kluring1 Följ instruktionerna på skärmen och skriv in ditt personnummer. 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-02-15 2(9) Om du använder IDLE och det hänger sig under tentan 1. 2. 3. 4. Prova att stänga IDLE-fönstren med Alt-F4 eller övre vänstra hörnets meny. Om det inte fungerar, stäng terminalfönstret med Alt+F4 eller övre vänstra hörnets meny. Starta idle igen genom att öppna en nytt terminalfönster (om det behövs) och skriva idle följt av <ENTER>. Öppna din fil via menyraden eller genom att trycka Ctrl+O Tentamen 729G04, 2013-02-15 3(9) Uppgift 1 (3p) a) Nedan finns en funktion som returnerar True eller False baserat på tre parametrar som alla är sanningsvärden (dvs antingen True eller False). Skriv om funktionen så att den innehåller så få vilkorssatser som möjligt. def is_the_ground_wet(sun, clouds, rain): if clouds: if rain: return True if not rain: return False if sun: if rain: return True if not rain: return False if not clouds: if rain: return True if not rain: return False if not sun: if rain: return True if not rain: return False b) Nedan finns en funktion som returnerar True eller False givet ett heltal som input. Skriv om funktionen så att den innehåller färre villkorssatser. def eggs(number): if number < 50: if number < 25: if number > 0: return True if number <= 100: if number > 0: return True else: return False else: return False Tentamen 729G04, 2013-02-15 4(9) Uppgift 2 (4p) a) Skriv en funktion count_letter_for(sentence, character). Funktionen får in en sträng, sentence, och ett tecken (sträng med endast ett tecken), character. Funktionen räknar och returnerar antalet förekomster av tecknet character i strängen sentence. Använd en for-loop för att lösa denna uppgift. Se körexempel från ipython nedan. In [1]: count_letter_for("Hello World!", "l") Out[1]: 3 In [2]: count_letter_for("Hello World!", "!") Out[2]: 1 In [3]: count_letter_for("Hello World!", "x") Out[3]: 0 a) Skriv en funktion count_letter_while(sentence, character). Funktionen får in en sträng, sentence, och ett tecken (sträng med endast ett tecken), character. Funktionen räknar och returnerar antalet förekomster av tecknet character i strängen sentence. Använd en whileloop för att lösa denna uppgift. Se körexempel från ipython nedan. In [4]: count_letter_while("Hello World!", "l") Out[4]: 3 In [5]: count_letter_while("Hello World!", "!") Out[5]: 1 In [6]: count_letter_while("Hello World!", "x") Out[6]: 0 Tentamen 729G04, 2013-02-15 5(9) Uppgift 3 (2p) Definiera funktionen list_integers(mixed_list) som returnerar alla heltal i listan mixed_list. mixed_list innehåller värden av olika typer. Se exempelkörningar från ipython nedan: In [7]: list_integers(["a", "b", "c"]) Out [7]: [] In [8]: list_integers([5, 6, 7]) Out [8]: [5, 6, 7] In [9]: list_integers([1, 2.0, "3", [4], 5]) Out [9]: [1, 5] Tentamen 729G04, 2013-02-15 6(9) Uppgift 4 (3p) Definiera en funktion total_with_tip(items, people, tip_percentage) som tar in en lista, items, som innehåller heltal. Dessa heltal representerar priserna på de maträtter ni beställt under kvällen. Funktionen tar också in argumenten people och tip_percentage. people är antal personer som ska dela på notan. tip_percentage är ett heltal som berättar hur många procent dricks ni ska ge. Funktionen ska returnera hur mycket varje person ska betala om ni delar lika, inklusive dricks som ska betalas. Se exempelkörning nedan: In [10]: total_with_tip([75, 120, 225, 110], 2, 15) Out[10]: 304.75 In [11]: total_with_tip([75, 120, 225, 110], 5, 10) Out[11]: 116.6 In [12]: total_with_tip([1000], 10, 15) Out[12]: 115.0 Tentamen 729G04, 2013-02-15 7(9) Uppgift 5 (6p) I denna uppgift ska du lagra information om din nyfunna hobby "titta på färg som torkar". Du har en intressant teori om att olika färger torkar olika fort. Därför skriver du ett program som håller reda på färgtorkardata, dvs observationer av hur lång tid olika färgkulörer behöver för att torka. I denna uppgift ska du skriva funktioner i Python som kan bearbeta information om hur lång tid en viss färg tog att torka. Längst ner på sidan ser du exempelkörningar från ipython. a) Skriv en funktion create_observation(color, time) som tar in en sträng och ett heltal och returnerar en lista med dessa värden. Kontrollera att color är en sträng och att time är ett positivt heltal. Skriv ut ett felmeddelande och returnera None om något av argumenten är av fel datatyp. b) Skriv två funktioner, get_time(observation) och get_color(observation) som tar en observation som argument (dvs en lista enligt ovan) och returnerar den observerade tiden respektive namnet på färgen. Kontrollera att observation är en lista med rätt datatyp på rätt index i listan. Skriv ut ett felmeddelande och returnera None om observation inte är en lista enligt ovan. c) Skriv en funktion wettest_color(observation1, observation2) som tar två observation-strukturer (enligt ovan) som argument. Funktionen jämför tiden i observation1 med tiden i observation2 och returnerar namnet på färgen som enligt observationerna tog längst tid att torka. Kontrollera att observation är en lista enligt ovan med rätt datatyp på rätt index i listan. Skriv ut ett felmeddelande och returnera None om observation1 eller observation2 inte är en lista enligt ovan. Nedan följer exempelkörning från ipython: In [13]: create_observation("pink", 10) Out[13]: ['pink', 10] In [14]: obs1 = create_observation("pink", 10) In [15]: get_color(obs1) Out[15]: 'pink' In [16]: get_name({'date and time': '2013-01-11 07:00', 'plate': 'PYTHON'}) Error in input. In [17]: obs2 = create_observation("fuchsia", 8) In [18]: wettest_color(obs1, obs2) Out[18]: 'pink' Tentamen 729G04, 2013-02-15 8(9) Uppgift 6 (4p) I denna uppgift ska du skapa en abstrakt datastruktur för att representera personer och de tre sista böckerna de läst. Du ska implementera denna datastruktur genom att använda dig av ett dictionary. Dictionaryt ska ha två nycklar: 'name' och 'read books'. Värdet på nyckeln 'name' är en sträng med namnet på personen och värdet på nyckeln 'read books' är en lista med namn på de tre senast lästa böckerna. Listan är tom från början. När en fjärde bok läggs till, åker den först inlagda ut. Längst ner på sidan finns exempelkörningar. a) Skapa funktionen create_person(name) som tar en sträng som argument och returnerar ett dictionary enligt ovanstående specifikation, med värdet en tom lista som värde till nyckeln 'read books'. Se till att funktionen skriver ut ett felmeddelande och returnerar None om name inte är en sträng. b) Skapa funktionen add_book(book_name, person) som tar in två argument, ett sträng och en person (dvs ett dictionary enligt ovan). Funktionen lägger till en bok till listan över lästa böcker hos personen. Listan ska bara innehålla de tre sist lästa böckerna. Kontrollera att person är ett dictionary enligt ovanstående specifkation. Skriv ut ett felmeddelande om något gått fel, och ändra inte på innehållet i personen. Nedan följer exempelkörning från ipython: In [19]: create_person("John Cleese") Out[19]: {'name': 'John Cleese', 'read books': []} In [20]: create_person(404) Error in input. In [21]: john = create_person("John Cleese") In [22]: john Out[22]: {'name': 'John Cleese', 'read books': []} In [23]: add_book("The meaning of Python", john) In [24]: john Out[24]: {'name': 'John Cleese', 'read books': ['The meaning of Python']) In [25]: add_book("Hidden Shrubbery") In [26]: john Out[26]: {'name': 'John Cleese', 'read books': ['The meaning of Python', 'Hidden Shrubbery']} In [25]: add_book("Latin in 21 days") In [26]: john Out[26]: {'name': 'John Cleese', 'read books': ['The meaning of Python', 'Hidden Shrubbery', 'Latin in 21 days']} In [27]: add_book("Hamlet the Little Pig") In [28]: john Out[28]: {'name': 'John Cleese', 'read books': ['Hidden Shrubbery', 'Latin in 21 days', 'Hamlet the Little Pig']} Tentamen 729G04, 2013-02-15 9(9) Uppgift 7 (3p) Skriv en funktion fizzbuzz() som skriver ut talen 1 till 100 på egna rader. Om talet som ska skrivas ut är en multipel av 3 ska dock 'Fizz' skrivas ut istället. Om talet som ska skrivas ut är en multipel av 5 ska 'Buzz' skrivas ut. Om talet som ska skrivas ut är en multipel av både 3 och 5 ska 'FizzBuzz' skrivas ut istället. Se partiell exempelkörning nedan. In [29]: fizzbuzz() 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz ...