Dugga 1 i TDP007 fredag 14 februari 2014 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) Vad är skillnaden på att skriva var, @var respektive @@var? b) (1p) Vad är det för skillnad på om ett XML-dokument är "valid" respektive "well-formed"? c) (2p) Vilka fördelar kan man hoppas uppnå genom att systematiskt arbeta med enhetstestning? d) (1p) Konstruera ett reguljärt uttryck som kan matcha olika stavningar av efternamnet "Karlsson", med "C" eller "K" i början, med ett eller två "s", eller med "z"! e) (2p) Skriv en funktion som med hjälp av ett reguljärt uttryck kan dela upp en webbadress i server, katalog och fil enligt följande exempel. >> split-url("http://www.ida.liu.se/~TDP007/material/lectures.sv.shtml") => ["www.ida.liu.se", "/~TDP007/material/", "lectures.sv.shtml"] 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 => # >> foo.c { rand(20) } => 5 >> foo.c { 1+2+3 } => 6 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) Utforma därefter en uppsättning lämpliga enhetstester för klassen MyClass. (2p) Uppgift 3 (6p) -------------- I filen bly-i-fisk.txt finns en tabell som visar hur mycket bly som finns i sill och strömming fiskad utanför Sveriges kust. Värdena är angivna i mikrogram per gram torrvikt och kommer från Naturvårdsverket. Skriv ett program som läser in tabellen i filen till en lämplig datastruktur. Därefter ska programmet skriva ut en lista med vilken mätplats som fått högst resultat för respektive år, inklusive detta mätvärde. Efter detta ska ytterligare en lista skrivas ut som presenterar hur många gånger respektive mätplats haft det högsta värdet. Programmet ska fungera så här: >> read_table("bly-i-fisk.txt") 1981: 0.197 (Harufjärden) 1982: 0.141 (Landsort) ... 2010: 0.068 (Utlängan) 2011: 0.073 (Väderöarna) Harufjärden: 3 Ängskärsklubb: 5 Landsort: 8 Utlängan: 12 Fladen: 2 Väderöarna: 1 Mätningen kommer från: http://www.naturvardsverket.se/Sa-mar-miljon/Statistik-A-O/Bly-i-fisk/ Uppgift 4 (8p) -------------- I filen weather.xml finns väderobservationer från ett antal städer i Europa lagrade i XML. Uppgifterna kommer från OpenWeatherMap.org som tillhandahåller fria väderdata från ett stort antal stationer världen över. Formatet är ganska självförklarande. 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) (5p) Skriv ett program som läser in väderobservationer från en fil som är strukturerad på samma sätt som weather.xml. Programmet ska skriva ut en lista över städernas namn, landsbeteckning samt aktuell temperatur i grader Celsius. (Man får grader Celsius genom att ta grader Kelvin och lägga till 272.15.) Programmet ska fungera så här: >> report("weather.xml") London (GB): 5.2 C Paris (FR): 6.5 C Moscow (RU): -3.7 C Vienna (AT): 9.2 C Madrid (ES): 5.1 C Berlin (DE): 5.0 C Athens (GR): 12.2 C Nice (FR): 10.5 C Lisbon (Portugal): 9.3 C Ankara (TR): 7.5 C Stockholm (SE): 3.1 C Roma (IT): 15.0 C Milano (IT): 5.5 C Lyon (FR): 5.5 C b) (3p) Vi vill kunna rita ut väderobservationerna på en karta, men innan vi kan göra det vill vi veta hur stor kartan behöver vara. Därför behövs ett program som kan gå igenom alla observationerna och hitta största och minst latituden och longituden (finns i taggen coord). Programmet ska fungera så här: >> make_map("weather.xml") Longitude -9.15 - 37.62 Latitude 37.98 - 59.33