Institutionen för informationsteknologi, avdelningen för TDB , Olle Eriksson Institutionen för informationsteknologi, avdelningen för TDB , Olle Eriksson 1. Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 030813 Heltal i Java begränsas ju av hårdvaran så att ett ganska litet talområde går att använda. Ett sätt att komma runt detta är att skapa en egen klass som kan lagra och utföra aritmetik på väldigt stora tal. Då gör man lämpligen så att man skapar en array av heltal där man låter varje arrayelement innehålla en siffra i vårt stora tal. Ett tal med exempelvis 100 siffror kräver då en heltalsarray med 100 element. En sådan klass kan se ut som: public class BigNumber { private boolean sign; • Skrivtid: 14.00-19.00 • Hjälpmedel: Inga • Tentamen är uppdelad i ett antal uppgifter. Maximal poäng är 40. private byte[] tal; // tecken, false = positivt // true = negativt // en siffra 0-9 i varje element public BigNumber() {...} // std konstruktor public BigNumber(int t) {...} // konstruktor med ett vanligt heltal // konstruktor med ett Big Number • För att bli Godkänd på tentamen krävs minst 18 poäng. För att bli Väl Godkänd på krävs minst 28 poäng. public BigNumber(BigNumber t) {...} • För kursen Programmeringsteknik II, gäller att det krävs 18 poäng för betyget 3, 26 poäng för betyget 4 och 33 poäng för betyget 5. public void skrivUt() {...} • Skriv varje uppgift på nytt papper. Skriv inte på baksidan av pappren. Sortera pappren i rätt ordning. Skriv namn på alla papper. // utskrift av ett tal // jämför två BigNumber med varandra. Returnera ett // ett tal mindre än noll, noll eller ett tal större än noll beroende // på testens utfall • Om du inte förstår en uppgift eller är tveksam om tolkningen, fråga någon av lärarna. } public int compareTo(BigNumber b) {...} Din uppgift är att skriva metoderna skrivUt och compareTo i klassen. (5p) 2. Rekursion är en viktig teknik som används i många sammanhang. Som bekant kan det mesta uttrycks såväl med som utan rekursion. Din uppgift är att skriva en rekursiv metod som utför urvalssortering av en array. Som “wrappermetod” till din metod kan du tex använda en metod som public void SelectionSort(int [] tal) {...} som bara anropar din rekursiva metod. Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 03081312 August 2003 1 Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 03081312 August 2003 (3p) 2 Institutionen för informationsteknologi, avdelningen för TDB , Olle Eriksson Institutionen för informationsteknologi, avdelningen för TDB , Olle Eriksson 3. 5. a) Studera följande deklaration av ett träd i C. Vi antar att detta ligger i den separata filen Tree.c: Antag att du skapat en länkad lista med heltal sorterade i stigande ordning. struct node { int info; struct node* left; struct node* right; }; a) Skriv en metod i listklassen som beräknar och returnerar medianen av alla tal lagrade i listan (3p) struct node *root=NULL; b) void insert(int tal) { struct node *ny = malloc(sizeof(struct node)); ny->info = tal; ny->left = ny->right = NULL if (root == NULL) root = ny; else { ... } } Skriv en metod i listklassen som skriver ut alla tal i listan i bakvänd ordning, dvs med det största talet störst. (2p) 6. Som du ser har vi deklarerat rotpekare som global i den separata modulen. Förklara vad det innebär. Förklara också varför detta inte är nån bra ide i detta sammanhang. (2p) b) Skriv om träddeklarationen så att du inte använder en global variabel som rotpekare. Förklara också hur man delar upp detta i h-filer och c-filer och förklara varför man gör så. Du kan behöva ändra på deklarationen av funktionen insert också, du behöver inte skriva någon ytterliga kod dock. Vi vill nu bygga upp ett binärt sökträd med Personnoder. Trädet skall vara ordnat i namnordning. a) Designa en nodklass och en trädklass som kan användas för att bygga upp en sådant träd. Det ska finnas attribut och metoder men du behöver inte skriva kod för metoderna, de kan lämnas tomma. (1p) b) (2p) “Recursive descent” är en algoritm för att evaluera vanliga aritmetiska uttryck. Förklara hur den fungerar och hur man kodar den. (4p) Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 03081312 August 2003 Antag att du har en klass Person som deklareras enligt: public class Person { private String namn; private String adress; private String personNummer; // antag 12 siffror med ett fyrsiffrigt årtal public Person() {...} public Person(String n, String a, String p) { ...} public String getNamn() { return namn;} // hämta namn public String getAdress() {return adress;} // hämta adress public String getPersonNummer(){return personNummer;} }; osv 4. Vi har en klass Lista bestående av en referens till listans första nod. Noden är ett objekt av klassen ListNode som består av ett heltal och en referens till nästa nod. Klasserna finns i samma paket och kan använda paketåtkomst för attributen. Skriv en metod i trädklassen som lägger in ett Person-objekt på rätt ställe i det binära sökträdet. (2p) 3 Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 03081312 August 2003 4 Institutionen för informationsteknologi, avdelningen för TDB , Olle Eriksson Institutionen för informationsteknologi, avdelningen för TDB , Olle Eriksson c) Ett sätt att mäta balansen hos ett träd är att beräkna kvoten mellan dess höjd och antalet noder i trädet. Ett högre värde betyder sämre balans. Skriv en metod i trädklassen som beräknar denna kvot. (3p) 7. Antag att du har följande deklarationer: b) (3p) Vi har visat hur man gör traversering i inorder, preorder och postorderordning. Ett annat sätt att traversera ett binärt träd är i nivåordning. Det betyder att man först skriver ut roten, sedan dess barn från vänster till höger, sedan barnbarnen från vänster till höger och så vidare. Skriv en (eller flera) metod som givet en rotpekare utför en sådan traversering. (4p) public class ListNode { ListNode next; } public interface List { public ListNode insert(Object data); public boolean isEmpty(); public void clear(); public ListNode remove(Object data); public void print(); } Din uppgift är nu att utifrån dessa deklarationer skapa och till fullo implementera en listklass public class MyList implements List { ListNode root; ... } med noder som innehåller heltal. Listan skall vara sorterad i stigande ordning. Du skall utnyttja men inte förändra ovanstående deklarationer. Det kan behövas ytterligare klasser för att lösa uppgiften. Kom ihåg att ett heltal inte är ett objekt i Java. Du kan anta att paketåtkomst kan användas för att komma åt instansvariabler i olika ingående klasser. (6p) 8. a) I den trädklass som delats ut och som används i inlämningsuppgift 2 fanns en metod successor som givet en nod, returnerade efterföljande nod i inordermening. I vissa fall vill man ha en annan ordning, exempelvis postorder, dvs vänsterhöger-rot. Skriv en metod postorderSuccessor som givet en referens till en nod i ett binärt träd, returnerar en referens till nästa nod i postorderordning. Du kan anta att varje nod innehåller en höger-, vänster- och en föräldrapekare. Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 03081312 August 2003 5 Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 03081312 August 2003 6