Datortentamen i TDP007 2009-08-17 kl. 08-12 ------------------------------------------- Uppgift 1 (6p) -------------- a) Skriv ett kort kodexempel som visar en bra användning av block. (1p) b) Förklara kort hur du kan styra åtkomsten till metoderna i en klass. (1p) c) I följande körexempel ser vi hur en hash-tabell används: irb(main):006:0> h => {"a"=>5, "b"=>13, "c"=>25} irb(main):007:0> h["x"] => 42 Förklara hur det kan komma sig att nyckeln "x" ger värdet 42, utan att detta par finns i hash-tabellen. Visa vilken kod som bör ha körts innan dessa rader. (2p) d) Den här uppgiften innehåller mycket text, men ska förhoppningsvis inte vara allt för svår. Den testar att du förstår ett antal grundläggande begrepp inom objektorientering i allmänhet och Ruby i synnerhet. Skriv fullständig och körbar kod enligt följande långrandiga specifikation. (2p) - Skapa en klass Person som har två instansvariabler name och year. Instansvariablerna ska vara läsbara, men inte skrivbara. Ge klassen en initieringsfunktion (som alltså anropas när vi kör new) som tar två parametrar motsvarande dessa två instansvariabler. Initieringsfunktionen ska spara parametrarnas värden i instansvariablerna, som är tänkta att innehålla en sträng respektive ett heltal. - Skapa en klass Student som utökar klassen Person. Den ska ha ytterligare en instansvariabel points som är läsbar men inte skrivbar. Initieringsfunktionen ska ta tre parametrar, motsvarande samtliga tre instansvariabler. Initieringsfunktionen för superklassen ska anropas för att initiera två av instansvariablerna, och den tredje initieras direkt i aktuell klass. Klassen Student ska dessutom ha en metod add som tar ett heltal som parameter och lägger till detta till det aktuella poängvärdet. Uppgift 2 (4p) -------------- I filen it.txt finns en tabell som visar hur internetanvändningen ser ut i olika ålderskategorier i Sverige. Informationen kommer från SCB och är gjort genom en urvalsundersökning. Det innebär att de siffror som står i tabellen inte egentligen motsvarar det antal personer man faktiskt har frågat, utan snarare den andel inom varje kategori som "borde" svarat som det urval av personer man har gjort. Din uppgift är att läsa in tabellen och skriva ut den på skärmen, men istället för absoluta siffror ska du presentera andelen svarande i procent. (Du ska alltså summera ihop varje kolumn för sig och ersätta siffrorna med procent av kolumnsumman.) Tabellen ska skrivas ut så att kolumnerna är raka, precis som i originalfilen. Vi tänker oss att du i framtiden kan komma att behöva behandla andra textfiler med liknande innehåll. Du ska därför utforma ditt program generellt så att det med små eller inga ändringar kan läsa in även andra tabeller av samma typ. Uppgift 3 (4p) -------------- a) En svensk postadress består av tre siffror, två siffror samt ett ortnamn. Formulera ett reguljärt uttryck som kan matcha sådana postadresser. Förutsätt att det kan finnas flera mellanslag mellan siffergrupperna och fundera över vilka möjliga ortnamn som finns. (1p) b) Använd paketet Test::Unit för att skriva en uppsättning enhetstester som testar ditt reguljära uttryck från uppgift a). För att göra det enklare kan du baka in det reguljära uttrycket i en funktion. Tänk på att formulera positiva testfall (som alltså bör matcha) men också negativa testfall (som inte bör matcha). (3p) Uppgift 4 (5p) -------------- Under seminarierna i kursen tittade vi på mikroformat, som är ett sätt att bädda in extra information i webbsidor. Tanken är att genom att tagga upp informationen på ett särskilt sätt gör man den sökbar för olika typer av tjänster. Ett sådant mikroformat är hReview som är en öppen standard för att märka upp recensioner av olika slag. I filen naomi.htm finns en webbsida med en recension av en japansk restaurang i Madrid som heter Naomi. Informationen har blivit uppmärkt enligt hReview-standarden. Precis som för andra mikroformat så ska man leta efter en HTML-tagg med ett class-attribut som innehåller hreview. Inom denna tagg finns sedan annan information som är uppmärkt enligt samma modell. Den information som finns i denna exempelfil inkluderar bl.a. följande: type Typ av vara eller tjänst som recenseras. rating Ett tal som anger betyget. summary Kort sammanfattning av varan eller tjänsten. description Längre beskrivande text. Din uppgift är att skriva ett program som med hjälp av REXML-paketet kan läsa in filen naomi.htm, hitta information om restaurangen och skriva ut den på skärmen på enklast möjliga sätt. Här är ett exempel på hur det skulle kunna se ut: Type: business Rating: 4 Summary: Especialidades japonesas Pequeño y acogedor restaurante japonés que ofrece un servicio atento y una carta plagada de las delicias de la típica gastronomía oriental: sushis, tempuras, sashimis, etc. Una opción a tener en cuenta para los amantes de los sabores nuevos y, sobre todo, de la calidad. Tanken är givetvis att du ska skriva ett generellt program som kan ta vilken XHTML-fil som helst som innehåller hReview och plocka fram motsvarande information. Du ska använda REXML-paketet för att hitta informationen, inte reguljära uttryck! Om du vill se hur sidan ser ut i en webbläsare kan du titta på filen naomi.pdf. (Datortentasystemet tillåter inte att man använder webbläsare.) Originalfilen hämtades från följande adress: http://madrid.lanetro.com/restaurantes-japoneses/naomi-75306 Tips: Om du tittar i filen ser du att siffran 4 för "rating" är gömd mellan en massa bilder och andra ointressanta HTML-taggar. Det kan vara en god idé att skriva en funktion som givet en nod i HTML-trädet hittar alla underliggande textnoder. Uppgift 5 (3p) -------------- Den här uppgiften ska vi så småningom lösa genom att bygga ett constraint-nätverk, men först en introduktion till problemet. Två bilar A och B startar samtidigt i två olika städer som vi också kan kalla A och B. De kör mot varandra på samma väg och kommer, om inget oförutsett inträffar, att mötas någonstans på ungefär halva vägen. För enkelhets skull antar vi att bilarna kör med konstant hastighet hela tiden, den ena något fortare än den andra. Huvudfrågan är var någonstans på vägen de kommer att mötas. Förhållandet mellan sträcka, hastighet och tid kan uttryckas med formeln s = h*t. För att hålla reda på de två bilarna lägger vi till A och B efter, och får alltså två formler: sA = hA*tA och sB = hB*tB. Bilarna kommer mötas samtidigt, dvs när tA = tB, och vi kan då slå ihop formlerna till en enda: sA/hA = sB/hB Vi vet också att summan av sA och sB måste vara hela vägens sträcka, som vi kan kalla s. Vi skulle alltså kunna skriva: sA/hA = (s-sA)/hB Detta kan vi i olika steg omvandla så här: sA*hB/hA = s-sA sA*(1+hB/hA) = s Din uppgift är att bygga upp ett constraint-nätverk som motsvarar ovanstående formel, med utgångspunkt i koden i constraint_networks.rb. Uppgift 6 (5p) -------------- Du kommer hem från blomsteraffären med fem olika blommor som du ska plantera i en blomlåda att ha på balkongen. Blomlådan är avlång och det får plats precis fem blommor i en rad. De fem blommor som du har köpt (en av varje sort) är: Tagetes (gul) Lejongap (gul) Lobelia (blå) Petunia (blå) Verbena (blå) Du vill planera blommorna så att inga blommor bredvid varandra har samma färg, och du ska lösa detta med hjälp av Ruby och den fantastiska konstruktionen amb som vi studerade vid det sista seminariet i kursen. I filen amb_test.rb finns amb-konstruktionen, tillsammans med ett enkelt testexempel. Din uppgift är att skriva ett nytt program som med hjälp av amb-konstruktionen skriver ut en lista över alla möjliga kombinationer enligt de givna förutsättningarna. Om du gjort rätt ska du få ut 12 olika. Uppgift 7 (5p) -------------- Cascading Style Sheets (CSS) är en teknik för att specificera hur en webbsida ska se ut. Tanken är att dokumentets struktur och innehåll ska ligga i en HTML-fil och att utseendet bestäms av en CSS-fil. På så sätt kan man separera innehåll och utseende, vilket ger många fördelar. Lite förenklat kan man säga att en CSS-fil specificerar för varje HTML-tagg hur den ska presenteras på skärmen. Följande korta exempel finns i filen example.css: h1 { font-weight: bold; font-size: 12px } p { font-size: 12px } /* px */ em { color: red } Detta säger att all text som taggas med

...

ska presenteras som fetstil i 12 punkters storlek, etc. CSS-filer kan se lite mer komplicerade ut, men för den här uppgiften utgår vi från att den består av en uppsättning regler som börjar med namnet på en tagg och fortsätter med en egenskapslista, inramad av { ... }. Egenskapslistan består av ett antal egenskaper där namnet skiljs från värdet med ett kolon. Om listan består av flera egenskaper ska det vara ett semikolon mellan egenskaperna, dock inte sist. Förutom detta kan det finnas kommentarer som inramas av /* ... */. Din uppgift är att utgå från den parser som finns i rdparse.rb och bygga en enkel parser som kan läsa in och tolka CSS-filer. Resultatet av parsningen ska vara någon form av datastruktur som innehåller de stilmallar som finns i filen, t.ex. i form av en hashtabell. Du behöver inte hantera mer komplicerade CSS-filer än filen example.css. Följande körexempel visar hur det skulle kunna se ut: irb(main):180:0> cp=CSSParser.new # irb(main):181:0> cp.load "example.css" (-klipp-) {"p"=>{"font-size"=>"12px"}, "em"=>{"color"=>"red"}, "h1"=>{"font-weight"=>"bold", "font-size"=>"12px"}}