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 - Dvorak [1p] Den "normala" uppsättningen på tangentbord (s.k. "Qwerty") växte fram på skrivmaskinernas tid. Tangenternas placering var då optimerad för att bokstavsarmarna inte skulle fastna i varandra allt för ofta. Professor August Dvorak utvecklade en ny layout (som numera kallas för "Dvorak") som var optimerad för bekvämlighet och effektivitet. Både layouterna kan ses här till vänster (engelska varianterna). Det finns vetenskapligt underlag som stödjer att Dvorak är en mer effektiv tangentbordslayout, jämfört med Qwerty. Vad som menas med effektiv i detta avseende går vi inte in på i denna tentauppgift. Man kan dock fråga sig, varför inte denna mer "effektiva" tangentbordslayout har vunnit världen? Svaret är troligtvis vana. Eftersom de flesta som lär sig skriva på dator lär sig på ett Qwertytangentbord så är det besvärligt att byta. I denna uppgift skall du låta användaren mata in en hel mening (godtyckligt många tecken, till radslut). Vi tänker oss att personen har skrivit in meningen på Dvorak-layouten. Vi utgår ifrån att användaren inte matar in versaler (stora bokstäver). Programmet skall sedan mata ut meningen som den blir om personen hade gjort samma tangenttryckingar på ett Qwerty-tangentbord. Vi tar bara hänsyn till de tangenter som ringats in med rött ovan. Tecken som inte finns med, (t.ex. mellanslag, utropstecken) skall bara bli som de är. Körexempel: Mata in en mening: hail king albert, ruler of all albion. På Qwerty tg bord: jagp vglu apndokw ofpdo sy app apngsle TIPS: Det finns en given fil dvorak.adb som har tre deklarerade strängar med dvorak-layoutens innehåll. Använd den om du vill.
Uppgift 2 - Triangelkäpp [1p] Magikern Magnus den Magnifike har en särskild magisk käpp. Det magiska med käppen är att den kan förvandlas till en triangel! I själva verket är käppen uppdelad på tre segment, är ihålig, och har ett elastiskt band inuti sig. Drar man i käppens två yttre segment blir delarna lösa och kan snabbt sättas ihop till en triangel (se bild). (Om du är bekant med tältpinnar så fungerar de ibland på detta sätt). Protegén Pontus Plagiér vill göra en lika dan käpp till sin magiska föreställning och står nu hemma vid snickarbänken. Han har kapat käppen på ett ställe, men står nu och funderar, vilken bit skall han kapa härnäst och hur långt in, så att det säkert blir en triangel? Skriv ett program som läser in käppens totala längd och avståndet (från vänster) för första kapningen. Talen som matas in är heltal (behöver ej kontrolleras), och käppens totala längd är alltid ett udda heltal (behöver ej heller kontrolleras). Båda talen är i enheten cm. Ditt program skall sedan mata ut vilken av bitarna, och hur långt in (från vänster) som Pontus skall kapa för att bitarna tillsammans skall kunna bilda en triangel. TIPS: Det finns en matematisk sats som heter triangelolikheten, som innebär att för en triangel så måste man kunna namnge sidorna A, B och C så att A <= B + C. TIPS 2: Det är inte tänkt att du skall lösa detta genom att ställa upp ett ekvationssystem. Låt ditt program testa sig fram (en cm i taget) för att komma fram till en lösning. Körexempel 1: Mata in käppens totala längd: 11 Mata in första kapningens position (fr. vänster): 3 Gör nästa kapning på den högra biten, 3 cm in. Körexempel 2: Mata in käppens totala längd: 87 Mata in första kapningens position (fr. vänster): 54 Gör nästa kapning på den vänstra biten, 11 cm in.
Uppgift 3 - Operatorn Super_Or [2*p] Operatorn "or" i Ada fungerar på följande vis: för två villkor (logiska uttryck) A och B gäller att A or B är SANT om minst en av A och B är sann. FALSKT i övrigt. Man kan även "kedja" sådana uttryck, t.ex: är uttrycket "A or B or C" sant om minst en av A, B eller C är sann, men falskt i övrigt. Vi skulle kunna tänka oss en operator "Super_Or" som opererar på ett godtyckligt antal villkor och dessutom ett heltal N, men som fungerar på ett liknande sätt som "or". T.ex. skulle Super_Or med operanderna A, B, C, D, E (fem villkor) och N (ett icke-negativt heltal) om minst N st av A, B, C, D och E är sanna och falskt annars. Tråkigt nog kan vi inte formulera detta som en operator, utan det får istället bli en funktion. Du har fått ett påbörjat huvudprogram test_super_or.adb där du kan se hur det är tänkt att funktionen skall anropas. Du har även fått ett fält av Boolean definierat som du kan ha hjälp av när du skriver din funktion. Lägg till koden för funktionen Super_Or så att den fungerar så som beskrivs ovan. Det är beskrivet i testprogrammet hur utmatningen skall se ut vid korrekt körning. Du får inte ändra på huvudprogrammet. Ett antal observationer: Om N är lika med antalet villkor så blir funktionen effektivt operatorn "and". Om N är 0 blir resultatet alltid sant oavsett vilka villkor som skickas in. Om N är större än antalet villkor så blir resultatet alltid falskt. TIPS: Attributen 'Last, 'First, 'Length och 'Range är bra att ha i denna uppgift... *OBS: Om du löser uppgiften rekursivt, d.v.s helt utan loopar, så är uppgiften värd 1 extra poäng.
Uppgift 4 - Reverse_File [2p] I Ada finns filmoden In_File som tillåter ett program som öppnar en fil att läsa filens innehåll, från början till slut. F : File_Type; Str : String(1..10); begin Open(F, In_File, "DAGBOK.TXT"); Get(F, Str); läser de första 10 tecknen från filens första rad. Close(F); Det vore trevligt om vi kunde skapa en filmod som hette Reverse_File som istället öppnade upp filen bakifrån så att filens sista rad läses ifrån först, och sedan den näst sista o.s.v. Alltså på detta sätt: Open(F, Reverse_File, "DAGBOK.TXT"); Get(F, Str); läser 10 tecken från filens sista rad. Skip_Line(F); Get(F, Str); läser 10 tecken från filens näst sista rad. Close(F); Detta är självklart möjligt i programmeringens underbara värld, men täcks inte helt av kursen. Däremot skulle man kunna göra en ny variant av Open, som löser detta åt oss. Open_With_Reverse(F, "DAGBOK.TXT"); Get(F, Str); läser 10 tecknen från filens sista rad.... Det finns ett givet huvudprogram på filen test_reverse_file.adb. Lägg till koden som behövs för att programmet skall gå att kompilera och ge korrekt utmatning. Du skall inte ändra på huvudprogrammet. Vi har egna varianter på filen DAGBOK.TXT, men du får anta att filen inte har mer än 1000 rader och att ingen rad är längre än 100 tecken. OBS: Open_With_Reverse behöver inte klara av att programmet hanterar flera externa filer samtidigt.