Tentaupplägg denna gång Denna tenta är uppdelad i två olika varianter. Det är helt ok att använda vilken variant ni vill. Det är ok att byta mitt under tentan om man så vill också. Variant 1: Uppgift 1, 2, 3, 4 hör ihop och de regler gällande betygsgränser som står på det separata regelbladet gäller. OBS! Bonustiden från laborationerna gäller endast på denna tenta för er som gått kursen i år. Bonustiderna från laborationerna försvinner omedelbart efter den första ordinarie tentan. Variant 2: Uppgift 5 är en specialvariant av tenta för dem som känner att de inte vill ge sig på någon av de ordinarie uppgifterna. Denna uppgift kan INTE kombineras med någon av de övriga för högre betyg utan kan endast generera betyg 3 som bäst. Några tips på vägen kanske också kan vara bra. TIPS 1: Läs igenom ALLA uppgifterna och välj den du känner att det är den lättaste först. Det kan gärna ta 10-20 minuter. Försök skriva ner lite saker som kan vara problem i uppgifterna. Om det är något du absolut kommer att fastna på kanske det är fel uppgift. Du tjänar lätt in denna tid på att välja rätt uppgift. I vissa (flera) av uppgifterna finns en inledning (kursiv text) som egentligen inte har med själva uppgiften att göra, men som är en liten introduktion (i vissa fall) till varför detta program skall skapas. 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å (din uppgift kanske). TIPS 3: Sista timmen är vi normalt sett lite snällare och ger eventuellt lite bättre återkoppling på era fel. Innan dess kan man få högre betyg och därför kräver vi att ni har lite mer koll på vad som skall rättas till. Vi ger dock information om vilket symptom felet uppvisar om vi kompletterar er uppgift under hela tentans gång. Lycka till med tenterandet och hoppas att alla får G på minst en uppgift idag. M.v.h. /Torbjörn (examinator)
Uppgift 1 (Lucky numbers) Filmen Lucky Numbers från år 2000 är en komedi med speltid på 105 minuter. Den hade premiär den 27 oktober i USA. Den handlar om en väderpresentatör som genomför en scam mot ett stort lotteri. Nora Ephron är regissör och Adam Resnick står för manus. Några av tjärnorna i filmen är John Travolta och Lisa Kudrow. Ett litet tips från oss alla till er alla på en skaplig film så här i början av tentaperioden. Din uppgift är att skriva ett program som låter användaren mata in sina lyckotal så att dessa kan skrivas ut i en tjusig tabell. Användaren skall själv få ange hur många lyckotal hon eller han har. Dessutom skall användaren få mata in sitt namn, så att detta kan skrivas ut i tabellhuvudet. Man får i denna uppgift anta att inga förnamn är längre än 12 tecken. Tabellen är alltid exakt 16 tecken bred. Tabellhuvudet skall vara centrerat. I vissa fall kan man inte placera användarens namn exakt i mitten. I dessa fall är det OK om namnet blir lite förskjutet till vänster (se hur detta ser ut i körexemplen). Observera att det är godtyckligt många lyckotal som matas in. Man kan alltså inte lösa denna uppgift genom att läsa in alla talen till ett fält eller dylikt. Observera också att det är ett avslutande s på namnen i tabellen. Om namnet slutar med ett s skall det förstås inte läggas till ytterligare ett s. Se i exemplen. Körexempel 1: Mata in antalet lyckotal: 4 Mata in ditt namn (max 12 tecken): Linnea Mata in dina lyckotal: 1 7 17 123456789 Linneas Lyckotal 1 7 17 123456789 Körexempel 2: Mata in antalet lyckotal: 1 Mata in ditt namn (max 12 tecken): Nils Mata in dina lyckotal: 102 Nils Lyckotal 102 TIPS: Räkna inte ut centreringen innan ni kollat om det skall vara s i slutet eller ej.
Uppgift 2 (MGM) MGM (Metro-Goldwyn-Mayer) är ett litet företag, i det lilla landet USA (United States of America), som har som huvuduppgift att kränga filmer. En av företagets filmer är Ben Hur (som antagligen handlade om någon som inte hade koll på hur man gör saker). Andra kända alster är Borta med vinden (någon som snodde övervåningen på ett hus) och Trollkarlen från Oz (en grekisk film som handlar om dryckesvanor). För er som inte har (lika bra) koll på filmer (som vi) kan kanske det tecknade radarparet Tom&Jerry vara det som gör att ni känner igen MGM. I denna uppgift skall du skriva underprogrammet MGM som tar fram den minsta gemensamma multipeln givet indata av ett antal inmatade tal. I uppgiften sätter vi antalet till 4. Det finns i programmet en konstant som anger detta antal så att man kan ändra detta och testa med t.ex. 20 tal istället. Givetvis skall programmet använda konstanten som är definierad istället för talet 4. I den givna filen least_common_multiple.adb finns en början till ett program (inklusive den konstant som anger antalet ovan) som skall beräkna MGM av ett antal tal. En multipel till ett tal P är alla tal som kan delas jämnt med P. T.ex. har talet 13 följande multiplar: 13, 26, 39, 52, 65, o.s.v. MGM av flera tal är, precis som det låter, en multipel till dessa tal som är så liten som möjlig. MGM av 6 och 8 är t.ex. 24, eftersom 3 * 8 = 24 och 4 * 6 = 24. Den minsta gemensamma multiplen av 3, 7 och 12 är, 84 (3*28, 7*12, 12*7). Ett lätt sätt att räkna ut MGM för N tal är att använda sig av två fält med N heltal i varje, vi kan kalla dem för A och B. I fältet A stoppar man in de tal som man vill räkna ut MGM för, A kommer att ha koll på de ursprungliga talen. Man fyller B på samma sätt. Sedan använder man följande algoritm: 1. Om alla tal i B är lika gå till steg 5. Annars fortsätt med steg 2. 2. Hitta det tal i B som är minst (eller ett av de minsta om det finns fler som är minst). 3. Öka detta tal med motsvarande tal i A (alltså det tal i A som står på samma position som det minsta talet i B finns på). 4. Gå tillbaka till steg 1 igen. 5. Färdigt! På alla platser i B står nu MGM för talen i A. Om vi t.ex. vill beräkna MGM för talen 3 och 5 (= 15) blir detta på följande vis: A = [3, 5] B = [ 3, 5] <-- B(1) är minst, öka på med A(1) B = [ 6, 5] <-- B(2) är minst, öka på med A(2) B = [ 6, 10] <-- B(1) är minst, öka på med A(1) B = [12, 10] <-- B(2) är minst, öka på med A(2) B = [12, 15] <-- B(1) är minst, öka på med A(1) B = [15, 15] <-- Alla tal i B är lika, MGM är 15! Din uppgift är att lägga till koden för funktionen Mgm i filen least_common_multiple.adb. Du får bara ändra mellan de två kommentarsraderna som finns i filen. Funktionen Mgm skall fungera enligt ovanstående algoritm. Du kan behöva skriva fler funktioner som hjälper Mgm att lösa problemet.
Uppgift 3 (Barnuppfostran) Som förälder är man ju enveten i sin träning av sina barn. Detta vet alla föräldrar om (så också jag). När man t.ex. vill lära dem att sätta på sig strumporna så drar man givetvis av den redan påsatta strumpan när barnet sätter på sig den andra. :-) Vill man lära barnet att prata så låter man dem upprepa ord så många gånger att man själv tröttnar på ordet. Barn känner, enligt all forskning, en stor glädje i att utföra saker många gånger. :-) I denna uppgift är det din uppgift att agera förälder och skriva ett program som bara upprepar det man matar in. Skriv ett program som läser in 10 heltal och skriver ut dem igen i samma ordning. Programmet skall ha två underprogram. Det första skall heta Get och det skall läsa in talen och lagra dem i ett fält (en array). Det andra skall heta Put och det skall skriva ut talen i det fält som kommer in som parameter. Körexempel 1: Mata in 10 heltal: 1 2 3 4 5 6 7 8 9 10 Talen var: 1 2 3 4 5 6 7 8 9 10 Körexempel 2: Mata in 10 heltal: 34 12-5 10230 27 13 57 18-1000000 1113 58 321 19 45 Talen var: 34 12-5 10230 27 13 57 18-1000000 1113 Körexempel 3: Mata in 10 heltal: 1 1 1 1 1 1 1 1 1 1 Rupert 2 3 4 Talen var: 1 1 1 1 1 1 1 1 1 1 KRAV 1: Inga globala variabler får användas i underprogrammen (givetvis). KRAV 2: Du får INTE använda dig av de inbygda konstruktionerna loop, for eller while utan allt som skall upprepas skall ske med hjälp av rekursion. KRAV 3: Inga globala variabler får användas i underprogrammen (givetvis). TIPS 1: Ingen felhantering krävs i denna uppgift. TIPS 2: Det är ok att använda den inbyggda Get för heltal om du vill (i din egen Get)
Uppgift 4 (if cat = katt then...) I Unix (och alla varianter av detta) finns ett kommando som heter cat. Detta kommando skriver ut innehållet i en fil (eller flera) i terminalen. Om man anger flera filnamn efter detta kommando kommer filerna att skrivas ut efter varandra som om innehållet skulle ha funnits i en enda lång fil. Man kan tänka sig att det engelska ordet cat som på svenska betyder katt skulle ha något speciellt med detta att göra, men så är inte fallet. Denna uppgift baserar sig på unixkommandot cat, men är en variant där man vill slå ihop två filer bredvid varandra istållet för efter varandra. Vi kallar detta katt så att vi inte råkar ut för att strula till det med att vi har samma namn som ett Unix-kommando. Det ställer bara till det. Det du skall göra i denna uppgift är att skriva ett program som tar emot två filnamn via kommandoraden (Ada.Command_Line behövs) och sen slå ihop dessa två filers innehåll och skriva ut det på skärmen enligt exemplet nedan. OBS! Filerna vi testar med kan vara helt andra än de i exemplet nedan. Antag att filen A.TXT innehåller: Detta är en liten fil en Antag att filen B.TXT innehåller: längre text som är större än en tom rad kan ställa till det. Körexempel (inklusive hur man startar programmet som heter katt ): PROMPT> katt A.TXT B.TXT Detta är en längre text som är större än en liten fil en tom rad kan ställa till det. TIPS 1: Det är inte givet att raderna är lika många i filerna man skall slå ihop. TIPS 2: Tänk på att filer kan vara tomma.
Uppgift 5 ( Betyg 3 -uppgift: Ruperts son...) Som alla vet är Rubiks kub en skojjig leksak som man gärna ger sina barn att leka med på långa resor, eller i allmänhet när de har tråkigt. Det hände sig så, att Rubik fick en son, Ruben. Det visade sig dock att Rubiks kub var för avancerade för Ruben, så Rubik konstruerade en kub med 2 x 2 rader (istället för 3 x 3), även känd som minikuben. Denna kubs klurighet motsvarde Rubens intellekt. Ruben fick i sin tur en son, Rupert. Det visade sig dock att minikuben var allt för knepig för Rupert, så Ruben fick skapa en ny kub med 1 x 1 rader, även kallad mikrokuben. Denna kub lyckades Rupert till slut lösa. Ruperts son... Här kommer en gammal klassisk rituppgift som den såkallade betyg 3 -uppgiften. Du skall skriva ett program som ritar ut en tredimensionell kub i två dimensioner enligt exmeplen nedan. Användaren matar in vilken storlek på kuben den vill se och det skall gå att mata in vilken storlek som helst större än 0. Ingen felhantering krävs. Om figuren ser konstig ut när den blir större än vad terminalen klarar av att rita ut kan det bero på att terminalen bara var för liten och det är helt ok. Vi antar att vi har en enormt stor terminal att tillgå. Körexempel 1: Mata in storleken på kuben: 1 +--+ \ \ + +--+ \ +--+ Större figurer (inte körexempel): Storlek 2 Storlek 3 Storlek 4 +------+ +----------+ \ \ \ \ \ \ \ \ \ \ \ \ +------+ \ \ \ \ + +----------+ \ \ \ \ + +------+ \ \ + \ \ +----------+ \ \ \ KRAV: Vi accepterar INTE en fullständig uppräkning av olika fall. Det måste lösas på ett någorlunda algoritmiskt sätt. Det skall finnas loopar etc som beror på storleken. TIPS: Underprogram underlättar för dig. Använd små underprogram som löser delar av problem som du slipper strula med senare.