729G04 Programmering och diskret matematik

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
...