Uppgifter för dugga 1 i TDP007 2011-02-11 ----------------------------------------- Uppgift 1: Teorifrågor (5p) --------------------------- a) Vad är skillnaden på @var och @@var? (1p) b) I Ruby kan man lägga till eller ändra metoder i en redan definierad klass. Nämn någon fördel och någon nackdel med detta! (1p) c) Vad innebär det att ett XML-dokument är "well-formed" respektive "valid"? (1p) d) 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. (2p) Uppgift 2: Grundläggande Ruby (6p) ---------------------------------- a) I den bifogade filen myclass.rb finns en klass MyClass. Här är ett exempel på hur den kan användas: >> c=MyClass.new{gets.to_i} => #, @a=0> >> c.call 4711 => 4711 >> c.call banan => 4711 Förklara vad klassen MyClass gör (d.v.s. vad poängen är med en sådan klass) samt föreslå bättre namn på klassen och dess instansvariabler. (3p) b) Vad är en iterator? Förklara först kort vad en iterator är. Visa sedan med ett kort kodexempel hur man kan använda en iterator. Visa också kod som gör samma sak, men utan en iterator. Argumentera för vilket av dessa två exempel som du tycker är bäst. (3p) Uppgift 3: Reguljära uttryck (7p) --------------------------------- a) I filen kurskoder.txt finns en lista över alla kurser som just nu finns på IDA, ISY och MAI. Konstruera ett reguljärt uttryck som matchar alla de kurskoder som finns i filen. Uttrycket ska vara tillräckligt exakt för att matcha alla koder, men inte så generellt att det matchar vilken sekvens av bokstäver och siffror som helst. Förklara hur du har resonerat när du har konstruerat uttrycket och motivera varför det funkar! (2p) b) I filen tddi16.txt finns en kursplan för en kurs som ni kommer att läsa lite senare. På olika ställen i texten finns det kurskoder. Skriv en funktion som läser in filen och använder ett reguljärt uttryck, förslagsvis det som du konstruerade nyss, för att matcha och hitta alla kurskoder. Svaret ska vara en array med unika kurskoder, sorterade i bokstavsordning. (2p) >> find_codes("tddi16.txt") => ["TADI03", "TDDI04", "TDDI12", "TDDI16", "TDIU01", "TDP004", "TDP015"] c) I filen film.txt finns korta beskrivningar av filmer. Skriv en funktion som läser in filmbeskrivningarna och med hjälp av reguljära uttryck hittar alla namn som förekommer. Vi vill som svar ha någon form av datastruktur som innehåller vilka namn som förekommer i varje film. Det skulle t.ex. kunna se ut som nedan. (3p) >> read_movies("film.txt") => [["Mannen med den gyllene pistolen", ["Francisco Scaramanga", "James Bond"]], ["The Fantastic Four", ["Doctor Doom", "Reed Richards", "Mr Fantastic", "Sue Storm", "Invisible Girl", "Johnny Storm", "Ben Grimm"]], ["Rosa Pantern slår igen", ["Charles Dreyfus", "Jacques Clouseau"]]] Uppgift 4: XML (7p) ------------------- "The Recursive Shakespeare Company" är en amatörteaterförening som sätter upp klassiska pjäser. Wilhelm Skakspjut är regissör och han har hittat en webbsida med manuskript till pjäser i XML-format. Nu behöver han ett program som kan hjälpa honom att räkna ut lite statistik om den pjäs han har valt, nämligen Hamlet. I den bifogade filen hamlet.xml finns hela manuset. Strukturen framgår av den DTD som finns i filen. Det finns också en förkortad version i example.xml som man kan använda för testning. a) Först och främst vill Wilhelm ha en lista som talar om hur många replikrader varje rollfigur har. Han vill alltså räkna varje LINE-tagg, inte bara varje SPEECH-tagg, för alla personer. Exakt hur listan presenteras är inte viktigt, så länge informationen finns med. Nedanstående exempel visar hur det skulle kunna se ut. (3p) >> count_lines("hamlet.xml") BERNARDO (34) FRANCISCO (10) HORATIO (290) MARCELLUS (65) KING CLAUDIUS (550) CORNELIUS (1) LAERTES (206) LORD POLONIUS (355) HAMLET (1495) ... b) Därefter vill Wilhelm ha en lista för varje scen som talar om vilka rollfigurer som medverkar i scenen. Detta gör att han lättare kan planera repetitionerna. Om man går igenom alla replikerna i första scenen ser man att det är Bernardo, Francisco, Horatio och Marcellus som medverkar. Wilhelm vill ha en sådan lista för alla scener. I praktiken handlar det alltså om att identifiera innehållet i alla SPEAKER-taggar som förekommer i en och samma SCENE-tagg. Nedanstående exempel visar hur det skulle kunna se ut. (4p) >> count_persons("hamlet.xml") SCENE I. Elsinore. A platform before the castle. BERNARDO, FRANCISCO, HORATIO, MARCELLUS SCENE II. A room of state in the castle. KING CLAUDIUS, CORNELIUS, VOLTIMAND, LAERTES, LORD POLONIUS, HAMLET, QUEEN GERTRUDE, HORATIO, MARCELLUS, BERNARDO, All SCENE III. A room in Polonius' house. LAERTES, OPHELIA, LORD POLONIUS SCENE IV. The platform. HAMLET, HORATIO, MARCELLUS ... I filen rexml.txt finns en kort sammanfattning av några vanliga metoder i REXML, om du vill göra en DOM-lösning. I filen sax_example.rb finns ett exempel på hur en SAX-lyssnare kan se ut, om du vill göra en sådan lösning.