Dugga 1 i TDP007 fredag 10 februari 2012 kl 15.15-17.00 ------------------------------------------------------- Uppgift 1 (7 p) --------------- a) (1p) Ge ett bra exempel (som inte finns i boken) på hur man använder metoden Array#inject och förklara vad som händer när man kör det. b) (2p) I Ruby kan man utöka ett enskilt objekt med nya metoder (som alltså inte är tillgängliga för andra objekt av samma klass). Vilka för- och nackdelar kan finnas med den möjligheten? c) (2p) Vad är poängen med klassen Enumerable och vad används den till? Förklara med egna ord, alltså inte bara det som står i kursboken. d) (2p) I en text som innehåller recept vill vi hitta alla förekomster av mängdangivelser, t.ex. "2 msk", "0,5 tsk", "2 l". Skriv ett reguljärt uttryck som matchar sådana mängder, d.v.s. ett tal följt av en enhet. Uppgift 2 (4 p) --------------- I den bifogade filen myclass.rb finns en klass MyClass. Här är ett exempel på hur den kan användas: >> foo = MyClass.new { rand(15) } => #, @a=0> >> foo.call => 4 >> foo.call => 4 >> foo.call => 8 >> foo.call => 13 Förklara vad klassen MyClass gör (d.v.s. vad poängen skulle kunna vara med en sådan klass) samt föreslå bättre namn på klassen och dess instansvariabler. (2p) Utforma därefter en uppsättning lämpliga enhetstester för klassen MyClass. (2p) Uppgift 3 (6 p) --------------- I filen befolkning.txt finns uppgifter om antalet invånare i några svenska kommuner under några år. I filen bibliotek.txt finns uppgifter om hur många besök som gjordes på kommunala folkbibliotek i dessa kommuner. Din uppgift är att läsa in tabellerna i dessa två filer till en lämplig datastruktur. Därefter ska du räkna ut antalet biblioteksbesök per invånare och år och skriva ut en tabell över vilken kommun som hade flest biblioteksbesök ett givet år. Exempel: >> library_stats 2000: Taby (10.4) 2001: Taby (9.9) 2002: Vallentuna (8.4) 2003: Vallentuna (8.3) 2004: Nacka (12.1) 2005: Nacka (10.8) 2006: Nacka (11.6) 2007: Nacka (12.2) 2008: Nacka (14.5) 2009: Nacka (16.9) Den här tabellen ska tolkas som att Täby kommun (Taby i listan) hade 10,4 biblioteksbesök per invånare år 2000 och var den kommun som hade flest besök per invånare det året. Uppgift 4 (8 p) --------------- I filen foobar.xml finns information om alla anställda på företaget Foobar Inc. Alla anställda måste tillhöra en grupp och en av personerna i gruppen är chef. Grupperna är organiserade i olika divisioner. Det finns fem divisioner och några av dem är så små att de bara innehåller en enda grupp. En division är så stor att den i sin tur är uppdelad i två divisioner. Din uppgift är att skriva olika funktioner för att kunna läsa in och hantera informationen i filen. Om du vill göra en SAX-lösning hittar du ett exempel att utgå från i filen sax_example.rb och om du vill göra en DOM-lösning hittar du lite information om metoderna i klassen Element i filen rexml.txt. Uppgiften består av flera deluppgifter som ger olika många poäng. a) (3p) Gör en funktion som beräknar och skriver ut medellönen i varje grupp. Exempel: >> average_salary(doc) Domestic: 33340 Overseas: 40250 Alpha: 35800 Beta: 35433 ... b) (3p) Gör en funktion som tar in namnet på en person och returnerar namnet på den personen som är ledare för personens grupp. Exempel: >> find_leader(doc,"Jessie Poarch") => "Benita Bisbee" >> find_leader(doc,"Ted Bogar") => "Ted Bogar" c) (2p) Lönekontoret vill veta hur mycket pengar det måste betala ut varje månad. Skriv en funktion som summerar ihop månadslönerna för alla personer i företaget och dessutom lägger på 53% (för arbetsgivar- och pensionsavgifter). Exempel: >> total_salary(doc) => 2866761.0