Tentamen TEN1 HI1029 2014-03-14 Skrivtid: 8.15-13.00 Hjälpmedel: Referensblad (utdelas), papper (tomma), penna Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha tålamod! Logga inte ut förrän ni är klara med hela tentan. Svaren på uppgifterna ska vara program bestående av filer som ligger i kataloger: uppgift1, uppgift2,, uppgift5 som i sin tur ligger direkt under H:. Även om ni inte löser hela uppgiften så kan ni få delpoäng men ni måste se till att koden kompilerar och kan köras. Både output och koden bedöms och det är viktigt att denna är välskriven och uppfyller uppgiftens instruktioner. Välj bra variabelnamn och struktur men lägg inte så stor vikt vid kommentarer. Kom ihåg ert tentamenskonto. Resultaten kommer att presenteras kopplade till dessa! Tentamen består av 5 uppgifter. Filer som behövs för att lösa uppgifterna hittar ni i W:\PROV\AoD\ Java API hittar ni i W:\PROV\Java\api\index.html Betygsgränser: Fx-7p, E-8p, D-9p, C-10p, B-11p, A-12p, Max-15p Examinator och rättande lärare: Nicklas Brandefelt Rättning: Generellt gäller korrekt lösning för att få poäng. -1p per mindre avvikelse från specifikation -1p per kvalitetavvikelse Uppgift 2 Stack istället för kö 0p Ej cirkulär array Max 1p Uppgift 3 Ej kontrollerat root!=null -1p (om allt annat snyggt och korrekt -0p) returnerar String eller Node<E> istället för E -1p nollställer ej medlemsvariabel så att anrop två blir fel -1p Uppgift 4 Använder mergesort i endast ett steg och sedan annan sortering -1p Saknar merge 0p Sorterar ej korrekt 0p
1. Taltriangel Vilken är den högsta summan man kan få genom summera talen längs valfri väg från toppen till botten i en taltriangel? Vid varje steg kan man alltså endast välja på att gå vänster eller höger. Utgå ifrån att alla tal är heltal större än eller lika med noll. Dina funktioner skall klara valfri storlek med godtyckliga siffror. Använd skalet ni hittar i W:\AoD\Uppgift1. a) Skriv en rekursiv funktion som beräknar högsta möjliga summan för en taltriangel. Troligen använder du en wrapper-funktion som i sin tur anropar den funktion som du sedan anropar rekursivt. (2p) b) Förbättra effektiviteten genom att tabulera värden du räknat ut (dynamisk programmering top-down). (1p) Tips: Om man vill lagra en triangel såsom ovan gör man det enklast i en array: 7 * * * * 3 8 * * * 8 1 0 * * 2 7 4 4 * 4 5 2 6 5 Om man då står på rad n och kolumn m och vill gå vänster ska man gå till rad n+1 och kolumn m. Vill man gå till höger ska man gå till rad n+1 och kolumn m+1.
2. Implementera en kö för strängar med hjälp av en array som inre datastruktur. Använd arrayen som en cirkulär array för att få en effektiv implementering. Kalla klassen för Queue. Med hjälp av konstruktorn ska man kunna sätta storleken som ska vara fix. Den skall endast ha två publika metoder: enqueue (för att köa) och dequeue (för att avköa). Försöker man köa en sträng i en full kö ska den returnera false annars true. Försöker man avköa en tom kö ska den returnera en tom sträng ( ). I W:\AoD\Uppgift2 hittar du ett skal som bör gå att köra med din kö. (3p) 3. I den här uppgiften utgår vi ifrån vårt binära sökträd från föreläsningen. Utgå ifrån filerna i W:\AoD\Uppgift3. a) Skriv en metod som returnerar största värdet lagrat i det binära sökträdet. Trädet får inte påverkas av metoden. (2p) b) Skriv en metod som returnerar antalet noder som har exakt två barn. Trädet får inte påverkas av metoden. (2p) 4. Implementera en static metod som sorterar en array med heltal med hjälp av mergesort. Du får alltså inte använda någon färdig sorteringsalgoritm i javas api utan skall skriva en egen. Utgå från skalet du hittar i W:\AoD\Uppgift4. (2p) Mergesort - kort påminnelse: Dela upp en array i två arrayer Sortera vänster array Sortera höger array Sammanfoga de sorterade arrayerna
5. I följande pussel ska man få siffrorna i nummerordning genom att rotera de fyra i övre vänstra hörnet, övre högra hörnet, nedre vänstra hörnet eller nedre högra hörnet enligt bilden: Varje 2*2 ruta kan alltså roteras medurs eller moturs 90 grader. Ett drag består då av en sådan rotation. a) Skriv ett program som löser problemet för godtycklig startuppställning och berättar hur många drag som krävs. Programmet behöver alltså inte presentera dragen. Du får utgå ifrån att ingen startuppställning kräver mer är 9 drag (egentligen kräver en del uppställningar 11 drag). (2p) Exempel: 1,2,3,4,5,6,8,9,7 6 drag 1,2,3,4,5,6,9,8,7 7 drag b) Skriv en ny version (spara den gamla) som inte behöver veta antalet maximala drag genom att genomsöka möjligheterna med bredden först. Dvs den testar först alla möjliga första drag. Sedan testar den alla möjliga två drag och så vidare till den hittar lösningen. Den här lösningen kommer antagligen äta minne så du kan nöja dig med att testa den på exempel som löses på få drag. (1p) Exempel: 1,2,3,4,9,8,7,6,5 2 drag 1,2,3,4,5,7,6,9,8 4 drag