Dugga 1 i TDP007 fredag 13 februari 2015 kl 09.00-11.00 ------------------------------------------------------- Duggan startar kl. 09.00 och pågår till 11:00. Ni kommer att få köra på begränsade datortentakonton. Instruktioner för att logga in på dessa lämnas i salen. Alla filer som ni behöver för att lösa uppgifterna finns i hemkatalogen när ni har loggat in. Där finns också en PDF-version av en tidig utgåva av kursboken som ni gärna får använda er av. Öppna den med kommandot acroread. Svar på frågor skrivs i vanliga textfiler och programkod skrivs i rb-filer. En fil per huvuduppgift ska produceras, totalt alltså fyra filer. Ingen särskild inlämning behöver göras. När man är färdig loggar man ut och lämnar salen. Duggan består av fyra uppgifter (några indelade i deluppgifter) som totalt kan ge 25 poäng. Dessa poäng summeras ihop med poängen från den andra duggan. Uppgift 1 (7p) -------------- a) (1p) Om man kör följande Ruby-program, varför skriver det ut att a är 45 och inte 73? def sub a = 73 yield end def main a = 45 sub { puts "a = #{a}" } end main 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) Konstruera ett reguljärt uttryck som kan matcha en korrekt e-postadress! d) (2p) När ska man använda strömparsning (SAX) och när ska man använda trädparsning (DOM)? Ge ett exempel på användningsområde och förklara kort varför den ena metoden skulle kunna vara bättre. Uppgift 2 (4p) -------------- 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 a) (2p) 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. b) (2p) Utforma därefter en uppsättning lämpliga enhetstester för klassen MyClass. Uppgift 3 (6p) -------------- I textfilen tab112.txt visas statistik för produktionen av några olika industriprodukter i Sverige under året 1947 till 1951. Din uppgift är att läsa in den här textfilen på lämpligt sätt och mellanlagra informationen i någon valfri struktur. Därefter ska informationen bearbetas så att förändringen i produktion från första till sista året ska räknas ut. Därefter ska listan sorteras så att den produkt som ökat mest visas först. Lisan ska till sist skrivas ut och ska då innehålla produktkategori och ökning/minskning i procent. Lösningen ska utformas så att den åtminstone i viss utsträckning kan användas för liknande tabeller, men den behöver inte vara fullständigt generell. Funktionen ska fungera så här: >> development('tab112.txt') Kylmaskiner och -apparater +76% Bilar, fabricerade och hopsatta +66% Skjortor och pyjamas +40% Wellpapp +28% Lim +10% Ullgarn -4% Cyklar (inkl. motorcyklar) -5% Gatsten -9% Choklad, karemeller, sylt m.m. -28% Havregryn -32% :ok Symbolen :ok är returvärdet från funktionen och spelar egentligen ingen roll. Tabellen kommer från "Statistik årsbok för 1954". Uppgift 4 (8p) -------------- På sajten tvsajten.com kan man hitta tablåer för olika TV-kanaler i bland annat XML-format. Formatet beskrivs i filen xmltv.dtd som är ganska lång, men som inte egentligen behöver detaljstuderas för att kunna lösa uppgiften. Som exempel bifogas fyra XML-filer med tablåerna för fyra kanaler för en specifik dag. Din uppgift är att skriva olika funktioner för att kunna läsa in och hantera informationen i filerna. 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 REXML::Element samt några exempel på XPath-uttryck i filen rexml.txt. a) (4p) Skriv funktioner som gör att man kan ta reda på i vilka program en viss skådespelare förekommer. Använd innehållet i taggen för detta. Lösningen ska gå igenom alla de filer som finns bifogade och skriva ut resultatet på skärmen. Nedanstående körexempel visar hur det skulle kunna se ut, men beroende på hur man väljer att göra kan funktionerna behöva ta andra parametrar. Det viktiga är att information om tid, kanal och titel skrivs ut. >> t = read_all_files { ... stor tabell med info om skådespelare i olika filmer ... } >> find_actor('Will Ferrell', t) Time: 20150204062500 +0100 Channel: action.cmore.se Title: Kicking & Screaming ---------- Time: 20150204143000 +0100 Channel: action.cmore.se Title: A Night at the Roxbury ---------- :ok >> find_actor('Matt Damon', t) Time: 20150204145500 +0100 Channel: first.cmore.se Title: Mitt liv med Liberace ---------- :ok I detta exempel läses all information in till en stor tabell, men man behöver inte göra så. Symbolen :ok är returvärdet från funktionen, och är egentligen inte viktigt. b) (4p) Skriv funktioner som gör att man kan hitta alla filmer från ett visst år. Utgå från alla program som har kategorin 'Movie' och kolla årtalet i taggen . Program som saknar delar av denna information ska hoppas över. Skriv ut en lista med titel, år och kanal. Följande exempel visar hur det skulle kunna se ut: >> check_all_channels(2005) Kicking & Screaming (2005) on action.cmore.se Jarhead (2005) on first.cmore.se :ok >> check_all_channels(2012) Atlas Shrugged II: The Strike (2012) on action.cmore.se Hyde Park on Hudson (2012) on action.cmore.se Parental Guidance (2012) on first.cmore.se Antboy (2012) on first.cmore.se :ok