1 ( 5) 729G04 Programmering och diskret matematik Tenta kl 14:00-18:00 Tillåtna hjälpmedel: Dator, penna, papper, linjal, suddgummi, godkänd(a) bok/böcker (ej anteckningar, föreläsningsbilder, gamla labbar eller labbinstruktioner) Uppgifter: Tentan består av 7 uppgifter (! 5 sidor inklusive denna sida). Poäng: 200 Betyg: U/G/VG. För att få VG behövs minst 150 poäng. För att få G behövs minst 100 poäng. Frågor på tentamen: Examinator är närvarande i lokalen i början av tentan och besöker sedan tentalokalen klockan 15:00, 16:00 och 17:00. Om du fastnar på en fråga, gå vidare till nästa fråga. 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. Inloggning 1. Ändra sessionstyp till "Exam System" innan du loggar in. 2. Logga in med ditt vanliga IDA-konto 3. Följ instruktionerna på skärmen och skriv in ditt personnummer. 4. 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. Utloggning (viktigt) Du måste avsluta tentan innan du lämnar salen genom att trycka på knappen "Avsluta tenta". För att komma till knappen "Avsluta tenta" måste du först logga ut som vanligt (se till att filer är sparade), och sedan välja avsluta tenta.
2 ( 5) Inlämning 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. Hemkatalogen i tentasystemet heter både /home/student_tilde/ eller /home/progixyz där XYZ är siffror som är olika för varje inloggning. Du får använda valfri texteditor som finns tillgänglig, dvs. jedit, gedit eller den inbyggda i IDLE (fram tills nu i kursen har vi bara använt IDLE). 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: utf-8 # Jody Foo, jodfo01 # 990818-0274 # Uppgift 1
3 ( 5) Uppgift 1 (20p) För att omvandla temperatur angiven i Fahrenheit till Celsius används följande formel. T C = (T F - 32) * 5/9 Motsvarande omvandlar man en temperatur angiven i Celsius till Fahrenheit med T F = T C * 9/5 + 32 a) Implementera funktionen fahrenheit_to_celsius(temp_f) som tar in en temperatur (flyttal) i Fahrenheit och returnerar temperaturen i Celsius (också flyttal). b) Implementera funktionen celsius_to_fahrenheit(temp_c) som tar in en temperatur (flyttal) i Celsius och returnerar temperaturen i Fahrenheit (också flyttal). Uppgift 2 (30p) För nedanstående uppgifter ska endast heltalen adderas. Summan av heltalen i listan [1, 1.0, 1] är alltså 2. Summan av heltalen i listan [1.0, 2.0] är 0. a) Skriv funktionen add_ints_for(numbers) som får in en lista av positiva heltal och flyttal och returnerar summan av alla heltal. Använd en for-loop. b) Skriv funktionen add_ints_while(numbers) som får in en lista av positiva heltal och flyttal och returnerar summan av alla heltal. Använd en while-loop. c) Skriv funktionen add_ints_rec(numbers) som får in en lista av positiva heltal och flyttal och returnerar summan av alla heltal. Lös uppgiften rekursivt. Uppgift 3 (30p) a) Skriv funktionen reverse_for(a_string) som får in en sträng och returnerar strängen baklänges. Får den in strängen "hej" ska den alltså returnera "jeh". Använd en for-loop. b) Skriv funktionen reverse_while(a_string) som får in en sträng och returnerar strängen baklänges. Får den in strängen "hej" ska den alltså returnera "jeh". Använd en while-loop. c) Skriv funktionen reverse_rec(a_string) som får in en sträng och returnerar strängen baklänges. Får den in strängen "hej" ska den alltså returnera "jeh". Lös uppgiften rekursivt. Uppgift 4 (20p) Skriv funktionen days_in_month(name_of_month) som tar in ett namn på en månad och returnerar hur många dagar som den månaden har (anta att det inte är skottår). Funktionen ska klara av namn på svenska i olika former, dvs variationer med stora och små bokstäver, samt både utskrivna namn på månader (januari, februari, mars osv), samt tre-bokstavsförkortningar (jan, feb, mar osv). Om felaktig input ges, dvs en sträng som inte känns igen, eller ett värde som inte är en sträng, ska -1 returneras.
4 ( 5) Uppgift 5 (20p) Vi har följande dictionary som får representera en person. person1 = {"name": "Pellegrin", "age": 56} Skriv funktionen add_child(person, name_of_child) som tar in ett dictionary med samma struktur som person1 och lägger till namnet på barnet i en lista i dictionaryt. Nyckeln till listan med barn ska vara strängen "children". Man ska kunna använda samma funktion för att lägga till flera barn. Se körexempel nedan >>> person1 = {"name": "Pellegrin", "age": 56} >>> add_child(person1, "Rabarber") >>> print(person1) {'name': 'Pellegrin', 'age': 56, 'children':['rabarber']} >>> add_child(person1, "Krusbär") >>>print(person1) {'name': 'Pellegrin', 'age': 56, 'children':['rabarber', 'Krusbär']} >>> Uppgift 6 (50p) Geraldine har kommit på att man kan identifiera en persons lyckofärg genom att analysera i vilka proportioner som vokaler och konsonanter förekommer i personens namn. Man börjar med att räkna hur antalet hårda vokaler (a, o, u, å), mjuka vokaler (e, i, y, ä, ö) och konsonanter en person har i sitt namn. Man får då tre tal. För att få fram en färg, tolkar man dessa tal som RGB-färgkod (dvs hur mycket rött, grönt och blått ljus man blandat). Hårda vokaler motsvarar röd färg. Mjuka vokaler motsvarar grön färg och konsonanter motsvarar blå färg. Storleken på rött, grönt, blått ska vara ett flyttal mellan 0 och 1, därför normaliserar man värdena så att det högsta värdet motsvarar 1. a) Skriv funktionen calc_vowels_and_consonants(name) som returnerar en lista med tre heltal givet en sträng som motsvarar ett namn. Det första elementet i listan är antalet hårda vokaler, det andra elementet är antalet mjuka vokaler och det tredje elementet är antalet konsonanter. Om 1 namnet man vill analysera är "Rumpelstiltskin" så får man följande anrop och returvärde: >>> calc_vowels_and_consonants("rumpelstiltskin") [1, 3, 11] >>> b) Skriv funktionen normalize_char_freqs(char_freqs) som tar in en lista med tre heltal, char_freqs, och returnerar en lista med tre flyttal mellan 0 och 1. Man får flyttalen genom att dividera heltalen med det största värdet i listan som kommer in. För listan [1, 3, 11] är det högsta talet 11, så man dividerar alla tal med 11 (vi struntar alltså i storleken på lägsta värdet och hur det förhåller sig till 0). Nedan följer anrop och returvärde: >>> normalize_char_freqs([1, 3, 11]) [0.090909091, 0.272727273, 1.0] >>> (antalet värdesiffror kan skilja sig beroende på flyttalshantering i datorer) 1 Denna sagofigur från bröderna Grimm kallas också för Bulleribasius, Rackarnaster, Bullerskaft, Pärkonskaft, Tom Tit Tot och säkert en del andra saker också.
5 ( 5) Uppgift 7 (30p) Skriv en funktion manhattan(houses, min_height, max_height som givet tre tal ritar upp en slumpmässig figur som med lite fantasi kan tolkas som en bild av skyskrapor. De tre talen anger bredden (d.v.s. antalet höghus) samt minsta respektive högsta höjden på husen. Höghusen ska skrivas ut med tecknet '#'. Inga fönster (dvs luckor) får finnas i husen Exempel: >>> manhattan(15, 2, 8) # # ## ## ##### # # ## ##### # # ######## ### ######## ## ############### ############### Ovanstående exempel producerar en slumpmässig höghuskontur med 15 höghus som är från 2 upp till 8 våningar höga. Den figur som skrivs ut ska vara orienterad enligt exemplet, d.v.s. marknivå längst ned. Använd randint() från modulen random för att slumpa.