Dugga 1 i TDP007 fredag 8 februari 2012 kl 15.15-17.00 ------------------------------------------------------- Duggan startar kl. 15:15 och pågår till 17: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) (1p) I en databas över kurser vill man lagra information om vilket år och vilken läsperiod en kurs startar. Denna information lagras som en sträng med först årtalet, sedan ett kolon och sist läsperioden (d.v.s. HT1, HT2, VT1 eller VT2, med stora eller små bokstäver). Skriv ett reguljärt uttryck som matchar en kursstartsangivelse på detta format! d) (2p) Om man läser in ett XML-dokument med hjälp av strömparsning (SAX), vad gör då lyssnarklassen? Beskriv kortfattat vad lyssnarklassen gör och vilken roll dess standardmetoder har. e) (1p) Förklara kortfattat vad en DTD är och hur den förhåller sig till ett XML-dokument. Uppgift 2 (5p) -------------- Filen namn.txt innehåller en lista på namn som givits till nyfödda flickor i Sverige de senaste åren. Tabellen innefattar de namn som funnits med bland de hundra mest populära under alla de senaste fem åren. Din uppgift är att läsa in tabellen på lämpligt sätt och därefter summera ihop antalet bärare för respektive namn under alla år i tabellen. Till sist ska det minst och det mest populära namnet skrivas ut, tillsammans med antalet bärare. Exempel: >> read_table("namn.txt") Minst populärt: Maria (662) Mest populärt: Alice (4531) Lösningen ska läsa in hela tabellen till en lämplig datastruktur som sedan behandlas, även om det inte är strikt nödvändigt för att lösa ovanstående problem. Uppgift 3 (5p) -------------- I filen platsannonser.txt finns ett antal autentiska annonser från olika programvaruföretag. Namnen på företagen är dock påhittade. Föga förvånande innehåller texterna ett antal tekniska förkortningar och din uppgift är att skriva en funktion som läser igenom texten, hittar och skriver ut alla tekniska förkortningar med hjälp av reguljära uttryck. Så här ska det fungera: >> buzzword_finder("platsannonser.txt") Initrode AB: HTML, XLST, AJAX, GUI, SQL, XML Global Development Inc.: XHTML, CSS2, CSS3, XML, XSLT Devil Dev AB: HTML, SQL, XML Mobile Devices AB: C++, C#, NET, XML, SQL Exakt vad funktionen returnerar är inte viktigt. Funktionen ska skriva ut namnen på företagen, samt en lista över vilka kompetenser de söker. Varje förkortning ska enbart finnas med en gång i utskriften, även om den finns flera gånger i texten. Ordningen ska vara densamma som i texten. Som förkortning räknas här en sekvens av två eller flera tecken som är versaler, siffror eller något av specialtecknen + eller #. Uppgift 4 (8p) -------------- I filen tudor.xml finns ett släktträd för några av personerna i släkten Tudor, som under främst 1500-talet satt på den engelska tronen. Den information som finns lagrad utgörs av personernas namn, när de levde, under vilka år de regerade vilket land, samt vilka barn de hade. Alla personer i släkten finns inte med, utan enbart de viktigaste. Formatet framgår av en inkluderad DTD. 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 REXML::Element samt några exempel på XPath-uttryck i filen rexml.txt. a) (3p) Skriv en funktion find_regents som läser in släktträdet och i kronologisk ordning skriver regenterna för ett viss land. Så här ska det se ut: >> find_regents("tudor.xml", "England") Henry VII of England (1485-1509) Henry VII of England (1509-1547) Edward IV of England (1547-1553) Mary I of England (1553-1558) Elizabeth I of England (1558-1603) James I of England (1603-1625) b) (3p) Skriv en funktion regency som läser in släktträdet och skriver ut alla kungar och drottningar, sorterade efter hur länge de satt på tronen. Personen med längst regeringstid ska skrivas ut först. För personer som har haft flera uppdrag på tronen räknas dessa som olika, så man behöver inte summera ihop dem. Födelseåret för respektive person ska också skrivas ut. Så här ska det se ut: >> regency("tudor.xml") Elizabeth I of England (b. 1533) 45 years Henry VIII of England (b. 1491) 38 years James VI of Scotland (b. 1566) 36 years James V of Scotland (b. 1512) 29 years Mary, Queen of Scots (b. 1542) 25 years ... c) (2p) Skriv en funktion children som läser in släktträdet och hittar den person som har flest barn. Körexempel: >> children("tudor.xml") Henry (1457) had 4 children. Eftersom så många personer har samma namn vill vi även ha med personens födelseår i utskriften.