1 ( 6) Uppgifter till tenta i 729G04 Programmering och diskret matematik. 7 augusti 2015, kl 08:00-12:00 Tillåtna hjälpmedel: Dator, penna, papper, linjal, suddgummi, godkänd(a) bok/böcker/kompendier (ej anteckningar, föreläsningsbilder, gamla tentor, gamla labbar eller labbinstruktioner) Uppgifter: Tentan består av 8 uppgifter för TEN3 och 9 uppgifter för TEN4. TEN3 = de som läste kursen i höstas. TEN4 = de som läste kursen mellan HT2009-HT20013. Poäng TEN3: 20 Poäng TEN4: 25 Betyg TEN3: U/G/VG. För att få VG behövs minst 15 poäng. För att få G behövs minst 10 poäng. Betyg TEN4: U/G/VG. För att få VG behövs minst 18 poäng. För att få G behövs minst 12 poäng. Frågor på tentamen: Examinator är närvarande i lokalen i början av tentan och besöker sedan tentalokalen ca kl. 9, 10 och 11. Om du har funderingar som du inte kan få svar på, skriv ner dessa och hur du tolkat eventuella oklarheter som kommentarer i koden. Om det är systemet som krånglar, kan en av tentavakterna kontakta examinatorn. OBS! Uppgift 9 görs bara av de som läste kursen första gången mellan HT 2009 och HT 2013. Uppgift 1 (1p) Skriv en funktion rectangle_area(width, height) som får in en bredd och en höjd som flyttal och returnerar arean för en rektangel (bredden gånger höjden) som ett flyttal. Variabeln width är bredden och variabeln height är höjden. Kontrollera om argumenten till funktionen är flyttal. Om de inte är det, skriv ut ett felmeddelande och returnera None. rectangle_area(5.0, 2.0) 10.0 rectangle_area(5, 2.0) Error: Please use floating point numbers. Uppgift 2 (3p) För nedanstående uppgifter ska antalet tal som är större än ett angivet tal räknas. count_larger_for([1, 2, 2.1], 2) 1 count_larger_for([], 2) 0 a) Skriv funktionen count_larger_for(values, number) som får in en lista (values) med tal (heltal och flyttal) returnerar antalet tal som är större än talet number. Använd en for-loop. b) Skriv funktionen count_larger_while(values, number) som får in en lista (values) med tal (heltal och flyttal) returnerar antalet tal som är större än talet number. Använd en while-loop. c) Skriv funktionen count_larger_rec(values, number) som får in en lista (values) med tal (heltal och flyttal) returnerar antalet tal som är större än talet number. Använd rekursion.
2 ( 6) Uppgift 3 (3p) För nedanstående uppgifter ska funktionen ta in en sträng och två tecken och returnera en ny sträng där förekomsten av det ena tecknet ska ersättas med det andra tecknet. replace_char_while("python", "p", "j") "jython" replace_char_while("hello", "l", "j") "hejjo" replace_char_while("", "a", "b") "" a) Skriv funktionen replace_char_for(a_string, search_char, repl_char) som får in en sträng och två tecken och returnerar en sträng som är resultatet av att alla förekomster av tecknet search_char i strängen a_string ersatts med tecknet repl_char. Använd en for-loop. Den inbyggda metoden str.replace() får inte användas. b) Skriv funktionen replace_char_while(a_string, search_char, repl_char) som får in en sträng och två tecken och returnerar en sträng som är resultatet av att alla förekomster av tecknet search_char i strängen a_string ersatts med tecknet repl_char. Använd en while-loop. Den inbyggda metoden str.replace() får inte användas. c) Skriv funktionen replace_char_rec(a_string, search_char, repl_char) som får in en sträng och två tecken och returnerar en sträng som är resultatet av att alla förekomster av tecknet search_char i strängen a_string ersatts med tecknet repl_char. Använd rekursion. Den inbyggda metoden str.replace() får inte användas. Uppgift 4 (3p) Skriv funktionen rate_my_password(password) som tar en sträng och returnerar ett flyttal som representerar bra lösenordet är. Ett lösenord kan få mellan 1,0-4,0 poäng. Reglerna för poängsättningen är följande: 1. Poäng för stränglängd: 1.1. Mindre eller lika med 5 tecken ger 0,5 poäng 1.2. Mellan 6 och 11 tecken ger 1 poäng 1.3. Mellan 12 och 18 tecken ger 2 poäng 1.4. Fler än 18 tecken ger 0,5 poäng 2. Poäng för teckenvariation 2.1. Om lösenordet innehåller minst en gemen får det 0,5 poäng 2.2. Om lösenordet innehåller minst en versal får det 0,5 poäng 2.3. Om lösenordet innehåller minst en siffra får det 0,5 poäng 2.4. Om lösenordet innehåller minst ett av följande specialtecken får det 0,5 poäng:!"#%&/()+=?+,.- rate_my_password("python") 1.5 rate_my_password("py+honru13z0rzz") 4.0 rate_my_password("java") 1
3 ( 6) Uppgift 5 (1p) Skriv funktionen append_to_key(the_value, the_key, the_dict) som lägger till värdet the_value till listan som är associerad med nyckeln the_key i dictionaryt the_dict. Om dictionaryt inte har någon existerande lista associerad med nyckeln the_key, så skapas en ny lista med innehållet the_value. my_dict = {"hejdå": ["bye"]} append_to_key("byebye", "hejdå", my_dict) my_dict {'hejdå': ['bye', 'byebye']} append_to_key("hello", "hej", my_dict) my_dict {'hejdå': ['bye', 'byebye'], 'hej': ['hello']} append_to_key("hi", "hej", my_dict) my_dict {'hejdå': ['bye', 'byebye'], 'hej': ['hello', 'hi']} Uppgift 6 (1p) Skriv funktionen value_in_dict(the_value, the_dict) som returnerar om värdet the_value finns i dictionaryt the_dict, och om det inte finns. Alla värden i the_dict är antingen strängar eller siffervärden. d = {"a": 1, "b": 2, "c": "kylskåp"} value_in_dict(300, d) value_in_dict("a", d) value_in_dict(2, d)
4 ( 6) Uppgift 7 (4p) En biologisk familj kan representeras som en nästlad lista där varje element är en lista med tre strängar. Den första strängen är namnet på en person, den andra är namnet på personens biologiska pappa och den tredje är namnet på personens biologiska mamma. Alla namn skrivs med gemener. Se nedan: example_family = [['anna', 'bengt', 'cecilia'], ['david', 'bengt', 'cecilia'], ['fridolf', 'bengt', 'cecilia'], ['gustav', 'håkan', 'iris'], ['johan', 'håkan', 'iris'], ['knut', 'gustav', 'anna'], ['linda', 'gustav', 'anna']] a) Skriv funktionen father(name, family) som givet en lista enligt ovan och namnet på en person returnerar namnet på personens pappa. Om personen i fråga inte finns med i familjelistan returneras en tom sträng. (1p) Körexempel för 7a: father('knut', example_family) 'gustav' father('anna', example_family) 'bengt' father('urban', example_family) '' b) Skriv funktionen share_child(name1, name2, family) som givet lista enligt ovan och namnen på två personer returnerar om de har ett gemensamt barn och om de inte har ett gemensamt barn. Observera att name1 och name2 inte har någon koppling till om det är ett namn på en mamma eller pappa. Namn som inte finns med ska också hanteras. (3p) Körexempel för uppg 7b: share_child("anna", "bengt", example_family) share_child("cecilia", "bengt", example_family) share_child("bengt", "cecilia", example_family) share_child("barbie", "ken", example_family)
5 ( 6) Uppgift 8 (4p) a) Skriv funktionen draw_text_rectangle(width, height) som tar två argument, ett för bredden på en rektangel och en för höjden på rektangeln och ritar ut kantlinjerna för rektangeln på skärmen med hjälp av asterisker. (1p) draw_text_rectangle(3,3) draw_text_rectangle(9, 4) b) Skriv funktionen draw_text_triangle(height) som tar ett argument höjden (större än 0) på en triangeln och ritar ut kantlinjerna för triangeln på skärmen med hjälp av asterisker. Spetsen på triangeln ska vara i mitten på basen. (3p) draw_text_triangle(1) draw_text_triangle(2) draw_text_triangle(3) draw_text_triangle(6)
6 ( 6) Uppgift 9 - TEN4 (4p) OBS! Uppgift 9 görs bara av de som läste kursen första gången mellan HT 2009 och HT 2013. Vi använder en lista som datastruktur för att representera en abstrakt datatyp för en spelare i ett datorspel. Nedan är ett exempel: ['unic0rn', 2368, ['sword of love', 'broken helmet']] Listan består alltså av tre element. Det första är spelarens namn, det andra är spelarens poäng och det tredje elementet är en lista med namn på de saker som spelaren har. a) Skriv funktionen is_player(player) som tar in ett värde och kontrollerar så gott det går att det värdet har rätt struktur för ADT:n spelare. Om player har rätt struktur returneras, annars returneras. b) Skriv funktionen add_item(player, item_name) som lägger till värdet i item_name till listan över saker i spelaren player. Kontrollera att argumentet player som fås är av rätt struktur och att item_name är en sträng. Skriv ut ett felmeddelande om något inte är som det ska. player1 = ['unic0rn', 2368, ['sword of love', 'broken helmet']] not_a_player = ['unic0rn', 2368, 'sword of love', 'broken helmet'] is_player(player1) is_player(not_a_player) add_item(player1, "python") player1 ['unic0rn', 2368, ['sword of love', 'broken helmet', 'python']] add_item(not_a_player, "python") ERROR: wrong input.