Tentaupplägg TIPS 1: Läs igenom ALLA uppgifterna. Välj den du känner är lättast först. Det kan gärna ta 10-20 minuter. Försök skriva saker som kan vara problem i uppgifterna. Är det något du absolut kommer att fastna på så kanske det är fel uppgift att ge sig på. Tiden du lägger på att noga läsa uppgifterna tjänar du in på att välja rätt uppgift. TIPS 2: Kolla ibland till kommunikationsfönstret. Det kan ha kommit information till alla utan att ni skickat in en fråga. Kanske gäller det dig också (d.v.s. den uppgift du jobbar med). TIPS 3: Om ni har problem med kompilator, Emacs eller annat som INTE har med uppgifterna att göra, räck upp handen så kommer en assistent. Detsamma gäller om hur man kopierar givna filer " cp given_files/*. " eller liknande. Frågor om själva uppgifterna tar vi i första hand via tentasystemet. I körexemplen har vi markerat det som användaren matar in på tangentbordet med fet och kursiverad stil. Tänk på att körexemplen bara är ett exempel på när programmet körs. Testa ditt program noga och tänka över hur programmet skall fungera vid andra indata. Vi hinner normalt sett inte svara på frågor de sista 10 utminutera på tentan. Då ägnar vi all tid åt att rätta uppgifter för att alla skall hinna få svar innan ni går hem. Betygsgränser: Tid TekFak FilFak 1 poäng 19:00 Betyg 3 Betyg G 3 poäng 18:00 Betyg 4 3 poäng 16:45 Betyg VG 3 poäng 16:30 Betyg 5 >=4 poäng 18:00 Betyg 5 >=4 poäng 18:15 Betyg VG Bonustid från avklarade duggauppgifter/laborationer tillkommer till dessa tidsgränser. Tiden för betyg 3/G överstiger dock aldrig 5 timmar. OBS: Delpoäng delas inte ut på uppgifterna. För att få poäng på en uppgift måste man alltså lösa uppgiften helt (och enligt specifikation). Lycka till med tenterandet och hoppas att alla får G på minst en uppgift idag. M.v.h. /Torbjörn (examinator)
Uppgift 1 - Ordkors [1p] Skriv ett program som läser in två ord (ett antal sammanhängande tecken mellan 'a' och 'z'). Orden får maximalt vara 10 tecken långa. Programmet skall sedan "länka ihop" dessa ord som om de satt ihop i ett korsord, d.v.s. det första ordet skall gå vågrätt, och det andra lodrätt, där någon av bokstäverna tillhör båda orden (se körexempel). Ibland finns det flera lösningar, t.ex. orden "virka" och "sniken" kan sitta ihop vid i:et eller vid k:et, vilket av dessa som väljs spelar ingen roll. Du kan utgå ifrån att det alltid finns minst en bokstav som ingår i båda orden. Mata in första ordet: krydda Mata in andra ordet: ylle krydda l l e Mata in första ordet: arv Mata in andra ordet: ert e arv t Körexempel 3: Mata in första ordet: sig Mata in andra ordet: kartong k a r t o n sig
Uppgift 2 - Hexagonbordet [1p] Möbeldesignern Mariam har bestämt sig för att skapa ett bord som är format som en hexagon (sexkantigt). Bordets tre ben skall vara trianglar som går ner från tre av bordets sidor. Mariam har tänkt att göra bordet ur en stor plastskiva format som en liksidig triangel. Sedan skall tre mindre trianglar vikas rakt ner så att de bildar benen (se bild). Dessa tre trianglar är lika stora till ytan. Sett snett uppifrån. Sett uppifrån. Sett uppifrån. Sett från sidan. Skriv ett program som låter användaren mata in sidan på den stora triangeln (ett flyttal, i cm). Användaren skall sedan få välja om den vill fixera bordets hexagonformade yta (area) eller bordets höjd. Slutligen matar programmet ut bordets yta om användaren fixerade bordets höjd, eller bordets höjd om användaren fixerade bordets yta. Observera att det inte är säkert att hexagonens alla sidor blir lika långa, men det gör inget, tycker Mariam. Mata in sidan på triangeln (i cm): 170.0 Vill du fixera (1) bordets höjd eller (2) bordets yta? 1 Mata in bordets höjd: 45.0 Bordets yta blir då 9006.7 cm² Mata in sidan på triangeln (i cm): 170.5 Vill du fixera (1) bordets höjd eller (2) bordets yta? 2 Mata in bordets yta: 9006.7 Bordets höjd blir då 45.0 cm TIPS 1: Eftersom den stora triangeln är liksidig, och de små ligger i denna, så är de också liksidiga. TIPS 2: En liksidig triangel med sidan S och höjden H har arean A = H² / tan(π/3) eller A = S² * tan(π/3) / 4 TIPS 3: Paketen Ada.Numerics.Elementary_Functions och Ada.Numerics har matematiska funktioner (t.ex. tan, sqrt), respektive vanliga konstanter (t.ex. Pi).
Uppgift 3 - Dela på bytet [2p] Ett godtyckligt antal pirater har just plundrat ett av kolonialmaktens handelsskepp och skall nu dela på bytet. Kaptenen har bestämt att detta skall göras på följande sätt för att det skall bli rättvist. Besättningen får i tur och ordning ange hur mycket av bytet (räknat i dubloner) som de vill ha, där den med lägst rang måste säga först, sedan den med näst lägst rang och så vidare. Till sist anger kaptenen hur mycket som han tar från bytet. Sedan går det baklänges till den som har näst högst rang (d.v.s. styrmannen). Om det i detta läge inte finns tillräckligt kvar för så att styrmannen kan ta sin del så får han/hon inget, och det går vidare till nästa pirat, o.s.v. Skriv den rekursiva funktionen Divide_Pirate_Loot som tar exakt 1 parameter, ett heltal som anger hur stort bytet är. Funktionen skall läsa in namnen (exakt 6 bokstäver) på piraterna och ett heltal för respektive som anger deras begäran. Det är givet att "Kapten" alltid är den sista piraten. Sedan skall funktionen dela ut till var och en, i omvänd ordning, om det är möjligt. Slutligen returnerar funktionen hur mycket som är kvar av bytet när uppdelningen är klar. Du kan utgå ifrån att kaptenen alltid anger en andel som han/hon är säker på att få (d.v.s. mindre än eller lika med hela bytets värde). Det finns ett påbörjat huvudprogram test_divide.adb som skall testa din funktion. Du skall lägga till koden för funktionen Divide_Pirate_Loot. Du får inte ändra på huvudprogrammet. Mata in hur många dubloner bytet är: 1000 Mata in piraternas begärda andelar: Sammie 70 Dougal 140 Sophia 130 Gagnef 400 Kapten 670 Kapten fick 670 dubloner. Gagnef fick inget! Sophia fick 130 dubloner. Dougal fick 140 dubloner. Sammie fick inget! Kvarvarande pott är 60 dubloner. Mata in hur många dubloner bytet är: 2500 Mata in piraternas begärda andelar: Natali 500 Adrian 600 Gloria 600 Kapten 2000 Kapten fick 2000 dubloner. Gloria fick inget! Adrian fick inget! Natali fick 500 dubloner. Kvarvarande pott är 0 dubloner.
Uppgift 4 - Prepend [3p] I Ada finns filmoden Append_File som tillåter det program som öppnar en fil för skrivning och lägga till "i slutet" av filen (d.v.s. efter filens nuvarande innehåll), istället för att filen skrivs över helt. Om vi t.ex. har filen SHOPPING.TXT, och vi vill lägga till sist i filen (efter alla andra planerade inköp) så skulle vi kunna göra: Open(F, Append_File, "SHOPPING.TXT"); Put_Line(F, ""); Close(F); Här är F en variabel av typen File_Type. Det vore trevligt om vi kunde skapa en filmod Prepend_File som lade till i början av filen. D.v.s att man skulle kunna skriva: Open(F, Prepend_File, "SHOPPING.TXT"); Put_Line(F, ""); Close(F); Detta är självklart möjligt i programmeringens underbara värld, men täcks inte helt av kursen. Däremot skulle vi kunna göra en förenklad variant där vi definierar en ny version av Open och en ny version av Close som håller reda på att det skall göras en prepend. Det vi vill åstadkomma är alltså samma som i exemplet direkt ovanför, men koden skulle då se ut så här. Prepend_Open(F, "SHOPPING.TXT"); Put_Line(F, ""); Prepend_Close(F); Av erfarenhet vet vi att det kan hända tråkiga saker om vi ber er göra program som skriver till filer på tenta *, så vi förenklar ett steg till. Vi säger att programmet skall skriva ut till skärmen, istället för på själva filen. Vi behöver därför inte filvariabeln, men tänket är ändå samma. Prepend_Open("SHOPPING.TXT"); Put_Line(""); Prepend_Close; terminalen Koden direkt ovanför finns förberedd i filen test_prepend.adb. Den och filen SHOPPING.TXT finns i mappen given_files. Vi har egna varianter av SHOPPING.TXT, och man kan inte anta något om formatet på filen (förutom att det är en textfil). Lägg till koden som behövs för att programmet skall gå att kompilera och köra (med rätt utmatning i terminalen). Du skall inte ändra i huvudprogrammet i test_prepend.adb. OBS: Prepend_Open och Prepend_Close behöver inte klara av att programmet hanterar flera externa filer samtidigt. * Det är dock helt tillåtet, att i denna uppgift skapa och/eller skriva till filer.