Tentamen i Programmeringsteknik MN2/II i JAVA för MN och X 030813

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