Tentamen TEN1 HI1029 2015-03-17 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. Välj H: som ert workspace i eclipse. Skapa ett projekt TEN1 (välj execution environment JRE: JavaSE-1.7). Skapa ett package per uppgift och kalla dessa uppgift1, uppgift2,, uppgift5. I varje package lägger ni nu till filerna ni behöver för denna uppgift. Ä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. Om ett program är ineffektivt kan detta ge poängavdrag. Det är meningen att man skall använda de tekniker vi lärt oss där detta är fördelaktigt. 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 (Max 15p): 7p Fx, 8p E, 9p D, 10p C, 11p B, 12 A Examinator och rättande lärare: Nicklas Brandefelt
1. I den här uppgiften utgår vi ifrån vår enkellänkade lista från föreläsningen (något nedbantad). Använd filerna i W:\AoD\Uppgift1. Glöm inte bort specialfallet att vi har en tom lista när du programmerar. a) Skriv om tostring-metoden så att den utför samma uppdrag som nu (att skriva ut listans alla element i rätt ordning) med hjälp av rekursion istället för iteration. Du får använda en wrapper-metod men inga medlemsvariabler utöver de som redan finns (head och size). (1p) b) Skriv om getnode-metoden så att den utför samma uppdrag som nu med hjälp av rekursion istället för iteration. Du får använda en wrappermetod men ändra hellre i anropet till metoden. Denna metod är ju privat. (1p) c) Ibland om det är viktigt att en lista tar minsta möjliga plats kan det vara bättre att klara sig utan medlemsvariabeln size. Ta bort medlemsvariabeln size och introducera inga nya medlemsvariabler. Ändra befintliga metoder så att de fungerar precis som innan men nu utan medlemsvariablen size. Spara de gamla funktionerna bortkommenterade ifall du inte lyckas med denna uppgift. (1p)
2. I den här uppgiften gäller det att ta sig från toppen av en sifferpyramid till botten på ett sådant sätt att man passerat varje siffra precis en gång. I varje steg får man bara gå vänster eller höger på sin väg nedåt. För full poäng skall man använda sig av backtracking. Programmet skall presentera ordningen på de siffror man passerat på väg nedåt. Det skall klara en godtycklig triangel innehållande endast siffrorna 0-9 med tio nivåer. Om det finns flera lösningar räcker det att programmet hittar en lösning. Saknas lösning skall programmet ange det. I W:\AoD\Uppgift2 hittar ni ett skal med pyramiden nedan hårdkodad. För denna bör utskriften bli: 5, 1, 7, 8, 3, 6, 0, 9, 2, 4. (3p)
3. Implementera en heap för heltal med en array som inre datastruktur. Du får inte använda några andra datastrukturer från java s api. Du behöver bara implementera insättning och inte borttagning. Heapen ska ha plats för 1000 heltal och behöver inte kunna växa när den blir full. Metoden insert skall returnera true om den lyckas sätta in och false om arrayen är full. I W:\AoD\Uppgift3 hittar du en main som bör fungera med din heap. Där ser du att du också ska implementera en tostring. Denna ska bara skriva ut alla element på en rad i den ordning de ligger i arrayen. (3p) Tips: En heap är ett komplett binärt träd där rotens nyckel är minsta nyckeln i trädet och varje icke tomt subträd är en heap. Insättning: 1. Sätt in ny nod på första lediga plats. 2. Medans noden inte är rot och nodens nyckel är mindre än förälderns nyckel: byt plats på förälder och nod Om man lagrar en heap i en array kan man börja med roten och lägga elementen nivå efter nivå från vänster till höger och då gäller: en nod med index p har vänster barn med index 2p+1, höger barn med index 2p+2 och sin förälder med index (p-1)/2.
4. I denna uppgift utgår vi från vårt binära sökträd från föreläsningen i en nedbantad version. Använd filerna i W:\AoD\Uppgift4. Lös uppgifterna nedan utan att skapa nya medlemsvariabler. Du får gärna använda privata hjälpmetoder vid behov. Sökträdet får inte påverkas av anrop till metoderna du skapar enligt nedan. a) Skriv metoden find. För den som inte minns så ska den returnerar datat från den nod vars data är lika med parametern target enligt metoden target.compareto. Om datat saknas i trädet skall metoden returnera null. (2p) b) För att kunna studera att en implementation av ett binärt sökträd faktiskt fungerar korrekt kan det vara bra att kunna skriva ut hur trädet faktiskt ser ut. Skriv metoden printtree som skriver ut ett träd till standard ut. Den ska skriva ut trädet med en nivå per rad. För varje nivå skriver den ut barnen till alla noder som fanns i nivån ovanför även om dessa är tomma (då skriver den null). På så sätt kan man entydigt se strukturen hos trädet. Trädet man får om man adderar H, B, N, A, E, C, F, D i given ordning skrivs då ut: H B N A E null null null null C F null D null null null null (2p)
5. Här ska vi titta på det allmänna myntväxlingsproblemet. Vi ska alltså skriva ett program som givet valörerna i en valuta och givet mängden växel som skall ges beräknar minsta antalet mynt/sedlar som vi kan lämna ut. Om valörerna är 1kr, 10kr och 11kr och vi ska ge 30kr i växel ska programmet alltså svara 3 (dvs 3 tiokronor). Programmet behöver alltså inte svara hur växeln skall ges utan bara antalet mynt/sedlar. Dock problemet skall i denna uppgift lösas med dynamisk programmering bottom-up. Om du löser problemet med dynamisk programmering top-down (rekursion med tabulerade värden) eller bara rekursion så får man noll poäng. För full poäng skall lösningen dessutom vara effektiv. (2p)