Datortentamen i TDP007 tisdag 12 mars 2013 kl 08:00-12:00 --------------------------------------------------------- Duggan startar kl. 08:00 och pågår till 12: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å sex filer. Ingen särskild inlämning behöver göras. När man är färdig loggar man ut och lämnar salen. Tentan består av sex uppgifter, några indelade i deluppgifter, som totalt kan ge 32 poäng. För godkänt krävs 50%, dvs minst 16 poäng. För betyg 4 krävs minst 21 poäng och för 5 minst 26 poäng. Inga poäng från duggor kan räknas tillgodo, utan tentan bedöms helt på egen hand. Uppgift 1: Grundläggande Ruby och teorifrågor (5p) -------------------------------------------------- a) Skriv ett reguljärt uttryck som matchar olika stavningar av efternamnet Ohlsson. Uttrycket ska klara av namn med eller utan 'h' som andra bokstav, samt stavningar med 's', 'ss' eller 'z'. (1p) b) På sista föreläsningen tittade vi på en topplista över de mest populära programspråken i världen (TIOBE Programming Community Index). Listan baserar sig på sökningar på nätet och visar alltså i praktiken vilka språk som det talas mest om. Antag att ett företag står inför beslutet att välja vilket programspråk man ska satsa på i sitt nästa projekt. Varför kan det vara en bra respektive dålig idé att basera det beslutet på vad som står i den här listan? (2p) c) På vilka sätt skiljer sig ett domänspecifikt språk (DSL) från ett "vanligt" programmeringsspråk (eng. general purpose language, GPL). (2p) Uppgift 2: Behandling av data i textfiler (5p) ---------------------------------------------- I filerna kor.txt och befolkning.txt finns tabeller som visar hur många mjölkkor respektive personer som bodde i kommunerna i Östergötland under tre olika år. Din uppgift är att läsa in dessa tabeller på valfritt sätt och därefter beräkna hur många kor det fanns per 100 invånare i alla kommuner under dessa tre år. Resultatet ska skrivas ut i en tabell där sifferkolumnerna är snyggt högerjusterade som i exemplet nedan: >> cow_quota("kor.txt", "befolkning.txt") Kommun 1985 1995 2005 0509 Ödeshög 23.02 13.78 9.83 0512 Ydre 61.76 45.95 65.78 0513 Kinda 44.74 31.09 30.58 ... Som en bonus kommer vi äntligen få svar på vilken som är den kotätaste kommunen i Östergötland. Uppgift 3: XML (6p) ------------------- I filen movies.xml finns information om filmutbudet på en påhittad biograf. Första delen av filen visar vilka filmer som går vissa datum. För varje föreställning indikeras också hur många platser som är lediga i salongen just nu. Andra delen av filen visar vilka salonger som finns och hur stora de är. 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. Du ska läsa in bioprogrammet och för en given dag visa alla föreställningar i kronologisk (tidsmässig) ordning, samt hur många procent av platserna som är bokade just nu. Här är ett exempel på hur det ska fungera: >> bookings("movies.xml","2013-03-07") 14:30 FS6 7.7% War and Peace 14:30 FS8 1.1% Story of my life 18:00 FS4 2.6% It happened in the jungle 18:15 FS6 16.9% War and Peace 21:00 FS7 8.8% Dark and cold midnight 21:00 FS8 5.7% Us against the world Uppgift 4: DSL (5p) ------------------- Filen supplies.rb innehåller information om artiklar som finns hos ett företag som säljer kontorsmateriel, alltså pennor, papper och sånt. Första delen av filen är information om varje produkt i sortimentet: vilken typ det är, artikelkoden, namnet, samt två tal. Det första av dessa tal är defektpunkten som vi kan kalla d. Meningen med den är att när en affär endast har max d antal kvar av den artikeln, så är det dags att beställa fler. Man vill ju inte riskera att det tar slut. Det andra av dessa tal är inköpstaket som vi kan kalla t. När man ska köpa in fler artiklar, köper man inte in fler än att det blir totalt t artiklar i affären. Man vill ju inte lagerhålla saker i onödan. Defektpunkten och inköpstaket är olika för olika artiklar, och genom att sätta rätt värden på dessa kan en affärkedja optimera sina inköp, transporter och kostnader för lager. I den här uppgiften ska vi betrakta innehållet i supplies.rb som ett domänspecifikt språk, därav ändelsen .rb. Din uppgift är att skriva ett program som använder de Ruby-specifika tekniker för att implementera interna DSL som vi gått igenom, för att läsa in informationen i filen. Det som vi vill ha ut från programmet är en lista över vilka saker respektive affär i den här affärskedjan behöver köpa in. Listan ska alltså, för respektive affär, visa de artiklar vars antal sjunkit ner till defektpunkten, och för var och en visa hur många vi behöver köpa in för att komma upp till inköpstaket. Det skulle kunna funka ungefär så här: >> Order.process("supplies.rb") Order for Bob's Office Supplies 15 Ballpoint Stick Pen, 0.7 mm 8 Permanent Marker, Black 6 Highlighter Pen, Yellow 17 Rubber Eraser 15 Clear Shipping Tape Order for Mary's Office Supplies 13 Ballpoint Stick Pen, 1.0 mm 46 Wood Pencil, Medium Soft ... Uppgift 5: Icke-deterministisk programmering (5p) ------------------------------------------------- Detta problem ska lösas med hjälp av problemlösaren som finns i filen amb_test.rb som vi tittade på under näst sista föreläsningen. Det problem som ska lösas är som följer: Kalle, Anders och Eva-Lotta har tillsammans gått runt under Halloween och samlat på sig godis. När kvällen är slut har de samlat ihop 57 klubbor som de vill dela på. Anders var inte med från början av turen, så alla är överens om att han ska få färre klubbor än de andra. Eva-Lotta har bidragit mest till deras fina kostymer, så de är också överens om att hon ska ha fler än de andra. Alla måste få minst tio klubbor och dessutom vill de fördela klubborna så att alla får ett udda antal. Ställ upp detta problem med hjälp av problemlösaren i amb_test.rb och skriv ut alla möjliga sätt som de tre vännerna kan fördela klubborna mellan sig. Uppgift 6: Parsning (6p) ------------------------ En grupp av arkeologer har just upptäckt lämningar efter en utdöd civilisation som man kallar för Cromare. De verkade ha ett annorlunda talsystem, baserat på fyra symboler: Symbol Värde -------------- i 1 x 10 c 100 m 1000 På gamla lertavlor har man funnit matematiska uträkningar med detta konstiga talsystem. Uppenbarligen kunde man blanda dessa "siffror" hur man ville. Ordningen spelade ingen roll, så som det gör i vårt talsystem. Vi tycker ju att 123 inte är samma tal som 321, men för Cromarna var ixi, xii och iix samma tal (tolv enligt vårt sätt att räkna). Istället för att använda våra symboler för de fyra räknesätten har man använt symbolerna P (plus), M (minus), G (multiplikation) och D (division). Deras uträkning "micPcix" betyder alltså 1101 plus 111, vilket borde bli 1212 om man räknar som vi gör. De verkade också kunna kombinera dessa operatorer så att "xiGiiPi" skulle motsvara (11*2)+1 = 23. Din uppgift är att hjälpa arkeologerna genom att skriva en parser som kan tolka matematiska uttryck som är skrivna som Cromarna gjorde. Utgå från parsern som finns i rdparse.rb. Följande är ett exempel på hur det skulle kunna se ut: >> CromanParser.new.start [Croman Calculator] xPiPiPi => 13 [Croman Calculator] iiGxPiii => 23 [Croman Calculator] iiGcDxxxxx => 4