Tenta i TDP007 fredag 18 mars 2011 kl 14-18 ------------------------------------------- Uppgift 1: Grundläggande Ruby (5p) ---------------------------------- a) Ge exempel på minst tre olika sätt att utöka en array i Ruby! (1p) b) Förklara kort hur du kan styra åtkomsten till metoderna i en klass! (1p) c) 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"! (1p) d) Vad är en continuation? Hur skapas den, vad innehåller den och vad kan man ha den till? Ge ett kort körexempel som illustrerar din förklaring. (2p) Uppgift 2: Textfiler, reguljära uttryck m.m. (5p) ------------------------------------------------- a) LIX eller läsbarhetsindex är ett mått på hur lätt- eller svårläst en text är. Metoden utvecklades på 1960-talet av pedagogen Carl-Hugo Björnsson. Formeln för att beräkna LIX för en text är följande: O L*100 LIX = --- + ------- M O O = antalet ord i texten M = antalet meningar i texten L = antalet långa ord (över 6 bokstäver) Följande tabell visar LIX-värden för olika typer av texter: -25 Barnböcker 25-30 Enkla texter 30-40 Normaltext (skönlitteratur) 40-50 Sakinformation (t.ex. uppslagsverk) 50-60 Facktexter 60- Svåra facktexter (t.ex. forskningsartiklar) Skriv en metod som kan läsa in en textfil och beräkna LIX för texten. För att ha något att öva på finns filerna lagerlof.txt som innehåller första kapitelet av "Gösta Berlings saga" och strindberg.txt som innehåller första kapitlet av "Röda Rummet". Man kan givetvis testa med den textfil som innehåller tentauppgifterna också. (3p) b) Skriv en metod som kan läsa in en textfil och räkna ut vilka de fem vanligaste orden är, oavsett om det är stora eller små bokstäver. (2p) Uppgift 3: XML (5p) ------------------- I filen applepie.html finns en webbsida som innehåller ett recept på äpplepaj. Receptet har åtminstone delvis taggats med mikroformatet hRecipe vars beskrivning finns i filen hRecipe.pdf. Din uppgift är att skriva en metod som kan hämta ut receptinformation från webbsidor, med utgångspunkt i hRecipe-specifikationen och det här exemplet. Den information vi är intresserade av är i första hand receptets titel, antal portioner och ingredienslistan. En kort sammanställning av vanliga REXML-metoder finns i rexml.txt. Uppgift 4: Constraint-nätverk (6p) ---------------------------------- I filen constraint_networks.rb finns kod för att bygga restriktionsnät som vi diskuterade i samband med seminarie 4. Vi tänker oss att du har löst seminarieuppgifterna och kan skapa ett nät för att omvandla mellan Celsius och Fahrenheit. Användningen av denna omvandlare kunde se ut ungefär så här: irb(main):176:0> c,f=create_temperature_network [#, #] irb(main):177:0> c.user_assign 0 "ok" irb(main):178:0> f.value 32 Antag att vi vill använda intervall istället för heltal. Vad blir 18-20 grader Celsius i Fahrenheit? Då vill vi kunna göra så här: irb(main):179:0> c.user_assign 18..20 "ok" irb(main):180:0> f.value 64..68 irb(main):181:0> Vad behöver göras för att uppnå detta? Du behöver inte implementera temperaturomvandlingen igen, utan skriv bara kod som gör att de constraints som finns i filen kan hantera även intervall. Uppgift 5: Icke-deterministisk programmering (5p) ------------------------------------------------- Kalle, Pelle och Lisa jobbar som kvällsvakter på biblioteket. Varje kväll har en av dem ansvaret för att vara kvar efter kontorstid när den ordinarie personalen gått hem. De planerar sitt schema två veckor i taget och behöver ha lite hjälp. Reglerna säger att var och en av dem måste jobba minst tre kvällar under varje tvåveckorsperiod. De har också kommit överens om att de vill jobba olika många kvällar. På hur många olika sätt kan de fördela antalet kvällar mellan sig under två veckor? (Rent matematiskt ska du alltså hitta tre unika heltal som alla är större än eller lika med tre samt har totalsumman 14.) Lös problemet med icke-deterministisk programmering med hjälp av konstruktionen Amb som finns i filen amb.rb. Uppgift 6: Parsning (6p) ------------------------ I filen spreadsheet.rb finns ett par klasser som utgör grunden för ett mycket enkelt kalkylprogram. Klassen Worksheet representerar ett kvadratiskt arbetsblad. Skapar man ett nytt sådant med t.ex. Worksheet.new(4) så får man ett arbetsblad med cellen "A1" i övre vänstra hörnet och "D4" i nedre högra hörnet. Man kan hämta ut och placera in innehåll i cellerna genom att ange sådana cellreferenser, antingen som strängar eller som symboler. Se exempel i metoden test_ws, som returnerar ett sådant arbetsblad. Pröva att skriva ut det genom att anropa metoden pr. Klassen Formula används för att lagra formler i arbetsbladen. Varje sådan formelcell innehåller dels själva formeln, dels vilket värde formeln har beräknats till. Just nu saknas dock en metod att beräkna formlerna. Din uppgift är att, med utgångspunkt i rdparse.rb, konstruera en parser som kan analysera och beräkna värdet av kalkylbladsformler. Vi tänker oss att formlerna kan se ut enligt följande specifikation: FORMULA ::= '=' EXPRESSION EXPRESSION ::= REFERENCE | NUMBER | COMPOUND_EXPRESSION | '(' EXPRESSION ')' COMPOUND_EXPRESSION ::= EXPRESSION '+' EXPRESSION | EXPRESSION '-' EXPRESSION | EXPRESSION '*' EXPRESSION | EXPRESSION '/' EXPRESSION | FUNCTION_NAME '(' AREA ')' FUNCTION_NAME ::= 'Summa' | 'Medel' AREA ::= REFERENCE ':' REFERENCE REFERENCE ::= LETTER NUMBER Definiera klassen FormulaParser på ett sådant sätt att du kan byta ut vilken rad som är bortkommenterad i metoden update och göra så att formlerna beräknas korrekt.