T¨ank p˚a f¨oljande
• L¨agg uppgifterna i ordning. Skriv uppgiftsnummer och din anm¨alningskod ¨overst i h¨ogra h¨ornet p˚a alla papper.
• Fyll i f¨ors¨attssidan fullst¨andigt.
• S˚avida inget annat anges f˚ar man bygga p˚a l¨osningar till f¨oreg˚aende uppgifter ¨aven om dessa inte har l¨osts.
• Det ¨ar till˚atet att inf¨ora hj¨alpmetoder och hj¨alpklasser. Uttrycket ”skriv en metod som” skall allts˚a inte tolkas s˚a att l¨osningen inte f˚ar struktureras med hj¨alp av flera metoder.
• Alla uppgifter g¨aller programmeringsspr˚aket Java och programkod skall skrivas i Java. Koden skall vara l¨aslig dvs den skall vara vettigt strukturerad och indenterad. Namn p˚a variabler, metoder, klasser etc skall vara beskrivande men kan ¨and˚a h˚allas ganska korta.
Observera att betyget p˚averkas negativt bland annat av:
– icke-privata eller on¨odiga instansvariabler, – d˚alig l¨aslighet,
– upprepning av identisk kod,
– underl˚atenhet att utnyttja given eller egen tidigare skriven metod, – underl˚atenhet att utnyttja arv och
– l¨osningar som har v¨asentligt s¨amre komplexitet ¨an n¨odv¨andigt — t ex Θ(n2) i st¨allet f¨or Θ(n log n).
Observera
Skrivningen best˚ar av tv˚a delar. L¨osningarna till uppgifterna p˚a del A ska skrivas direkt p˚a skrivningsformul¨aret och l¨amnas in. Rutorna ¨ar tilltagna i storlek s˚a att de ska rymma svaren. Om du ¨and˚a inte f˚ar plats f˚ar du forts¨atta p˚a vanligt skrivblad. Markera g¨arna detta b˚ade p˚a f¨ors¨attsbladet och i rutan. Skriv inte p˚a baksidan.
Svaren p˚a del B skrivs p˚a vanligt papper med nytt papper f¨or varje uppgift.
Var god v¨and!
s¨ager att studenten efter godk¨and kurs ska kunna:
• anv¨anda programspr˚aket Java, b˚ade skriva egen kod och f¨orklara vad en given kod utf¨or;
• redog¨ora f¨or begreppen arv och polymorfi i ett objektorienterat spr˚ak och anv¨anda dessa begrepp i egen programutveckling;
• implementera rekursiva l¨osningar till olika problem;
• beskriva principen f¨or analys av algoritmers effektivitet och utf¨ora s˚adan analys av enklare algoritmer;
• beskriva, implementera och anv¨anda de grundl¨aggande datastrukturerna array, l¨ankad lista, hashtabell och bin¨art tr¨ad samt abstrakta datatyper som stackar, k¨oer och avbildningar;
• beskriva hur felhantering med hj¨alp av undantag fungerar och kunna anv¨anda detta i egna program.
F¨or betyget 4 kr¨avs dessutom att minst h¨alften, och f¨or betyg 5 alla, uppgifterna p˚a B-delen ¨ar i stort sett r¨att l¨osta. Vid bed¨omning f¨or dessa betyg tas ¨aven h¨ansyn till kvaliteten p˚a l¨osningarna p˚a A-delen.
Observera att B-delen inte r¨attas om inte A-delen ¨ar godk¨and.
Lycka till!
Inledning
I bilagorna finns ett antal mer eller mindre ofullst¨andiga klasser.
KlassenBST inneh˚aller en variant av bin¨ara s¨oktr¨ad med tal som nycklar.
KlassenExamException¨ar en liten undantagsklass.
Klassen List inneh˚aller n˚agra grundl¨aggande komponenter f¨or att skapa och hantera enkell¨ankade listor av Student-objekt. Varje student kan f¨orekomma flera g˚anger.
Klassen Misc inneh˚aller dels stommen till ett h¨andelsedrivet program, dels en metod f¨or att matcha uttryck med jokertecken mot text.
KlassenParser ¨ar ett utdrag ur en klass f¨or att tolka aritmetiska uttryck.
KlassenStudentrepresenterar en student med f¨or- och efternamn. Den ¨ar of¨or¨anderlig, det g˚ar inte att byta namn efter att en student har skapats.
Notera att ¨aven de metoder som inte ¨ar implementerade oftast har giltig Javadoc-dokumentation, som kan ge v¨ardefull information.
Ut¨over detta finns delar av den officiella Java-dokumentationen f¨orArrayList,Comparable,MapochString
Del A (obligatorisk f¨ or alla)
A1. Ringa in r¨att svarsalternativ (om flera alterantiv kan vara r¨att anges detta)!
a) Vilket/vilka av f¨oljande beh¨ovs f¨or att undvika o¨andlig rekursion?
1) Ett basfall
2) Ett induktionssteg 3) En retursats
b) F¨or att rita geometriska figurer i Java anropar man metoder i en instans av vilken klass?
1) JPanel
2) JFrame
3) Graphics
4) DrawingTools
c) Vilken typ av objekt reagerar p˚a h¨andelser i ett h¨andelsestyrt Swingprogram?
1) GUI
2) EventHandler
3) ActionListener
4) JPanel
d) Vilket eller vilka av f¨oljande p˚ast˚aenden g¨aller om en klass X ¨arver fr˚an en annan klass Y?
1) Alla Y:s publika metoder kan anropas f¨or ett objekt av typen X 2) Alla X:s publika metoder kan
anropas f¨or ett objekt av typen Y 3) Y m˚aste implementera alla metoder i X 4) X m˚aste implementera alla metoder i Y 5) En instans av Y kan deklareras som X 6) En instans av X kan deklareras som Y
e) Vilken tidskomplexitet har en effektiv sorte- ringsalgoritm? n anger antalet element som ska sorteras.
1) Θ(1) 2) Θ(log n) 3) Θ(n) 4) Θ(n log n) 5) Θ(n2) 6) Θ(2n)
f) Hur beror antalet operationer f¨or att h¨amta ett v¨arde ur en sorterad lista p˚a listans l¨angd n?
1) Θ(1) 2) Θ(log n) 3) Θ(n) 4) Θ(n log n) 5) Θ(n2) 6) Θ(2n)
g) Hur beror antalet operationer f¨or att h¨amta ett v¨arde ur ett balanserat bin¨art s¨oktr¨ad p˚a antalet noder n?
1) Θ(1) 2) Θ(log n) 3) Θ(n) 4) Θ(n log n) 5) Θ(n2) 6) Θ(2n)
h) Hur beror antalet operationer f¨or att h¨amta ett v¨arde ur en hashtabell p˚a antalet element i tabellen, n? Antag en bra implemenation av hashtabell och hashfunktion.
1) Θ(1) 2) Θ(log n) 3) Θ(n) 4) Θ(n log n) 5) Θ(n2) 6) Θ(2n) i) Vilket nyckelord anv¨andar man f¨or att i en
metod m1 “rapportera” ett undantag till den metod som anroparm1?
1) super
2) throw
3) return
4) new
j) Vad inneb¨ar det att en metod ¨overskuggar en annan metod?
1) Metoderna har samma namn, men olika antal parametrar 2) Metoderna har samma namn,
men deras parametrar har olika namn 3) Metoden i fr˚aga har samma namn
och parametrar som metoden den
¨
overskuggar, men ligger l¨angre upp i klasshierarkin
4) Metoden i fr˚aga har samma namn och parametrar som metoden den
¨
overskuggar, men ligger l¨angre ned i klasshierarkin
k) Vad ¨ar ett undantag? 1) Ett objekt
2) En abstrakt klass 3) Ett interface 4) En metod
A2. List.getStudent letar efter en student med ett visst namn. Den kastar undantagetExamException
om studenten inte finns. Implementera metodenensureStudent. Den ska anv¨andagetStudentoch l¨agga till och returnera ett nytt studentobjekt med detta namn om det inte redan finns.
public Student ensureStudent(String firstName, String surname) {
try {
return getStudent(firstName, surname);
} catch (ExamException) {
Student s = new Student(firstname, surname);
add(s);
return s;
} }
A3. Det ¨ar f¨orh˚allandevis normalt att ett visst element inte finns i en lista. Undantag ska normalt bara anv¨andas f¨or undantagsfall (fel). Hur borde getStudent fungera i st¨allet, utifr˚an hur exempelvis
Map fungerar?
Returnera null f¨or att indikera att elementet saknas.
A4. Javadoc-kommentaren f¨or List.equals saknar giltiga kommentarrader f¨or parametern och re- turv¨ardet. Skriv ett f¨orslag p˚a hur de kunde se ut med giltig syntax.
@param other The object to compare against.
@return Whether this and other are equal.
A5. N¨ar man skriver sin egen klass, somStudent, kan vissa standardmetoder beh¨ova implementeras.
Implementera toString s˚a att resultatet f˚ar formatet “F¨ornamn Efternamn”.
public String toString() {
return firstName + " " + surname;
}
A6. Implementera metodenStudent.equals.
public boolean equals(Object other) {
if (other == this) { return true;
}
if (other == null || other.getClass != getClass()) { return false;
}
Student s = (Student) other;
return s.firstName.equals(firstName) && s.surname.equals(surname);
}
A7. Om ett objekt ska l¨aggas i en TreeSet eller som nyckel i en TreeMap m˚aste det finnas en sorte- ringsregel f¨or hur objekten ska ordnas. En klass kan styra sin ordning genom att implementera interfacet Comparable. String ¨ar ett exempel p˚a en standardklass som implementerar Comparable. Implementera metodenStudent.compareTo. Studenter ska sorteras i stigande alfabetisk ordning, i f¨orsta hand p˚a efternamn och i andra hand p˚a f¨ornamn.
public int compareTo(Student s) {
int comp = surname.compareTo(s.surname);
if (comp == 0) {
comp = firstName.compareTo(s.firstName);
}
return comp;
}
A8. Titta p˚a implementationen av List.add. Vilken tidskomplexitet har denna operation i relation till listans totala storlek n? Ge en kort motivering och svara i termer av Θ.
I och med att det nya elementet l¨aggs till f¨orst i listan g¨ors alltid samma konstanta antal operationer, Θ(1).
A9. Titta p˚a implementationen avList.remove. Vilken tidskomplexitet har denna operation i relation till listans totala storlek n, i fallet d˚a studenten inte visar sig finnas i listan? Ge en kort motivering och svara i termer av Θ.
F¨or att avg¨ora att elementet inte finns i listan m˚aste remove ¨and˚a bes¨oka varje element. Varje bes¨ok tar kosntant tid. Sammantaget allts˚a Θ(n).
A10. ImplementeraBST.size, som returnerar det totala antalet noder i tr¨adet.
public int size() { return size(root);
}
private static int size(Node n) { if (n == null) return 0;
return 1 + size(n.left) + size(n.right);
}
A11. ImplementerahashCodef¨or Student. Se till att de hypotetiska personerna “Sten Bj¨orn” och “Bj¨orn Sten” inte f˚ar samma hashv¨arde. Du f˚ar utnyttja befintligahashCode-metoder i andra klasser.
public int hashCode() {
return firstName.hashCode() + 3 * surName.hashCode();
}
A12. Vi har f¨oljande klasser:
public class Person { public void work() {
System.out.println("Struggling...");
} }
public class Professor extends Person { public void work() {
System.out.println("Supervising students...");
} }
public class UniStudent extends Person { public void work() {
System.out.println("Studying for exam!");
} }
public class PhDStudent extends UniStudent { public void work() {
System.out.println("Reading a paper...");
} }
public class Undergrad extends UniStudent { }
Ange i rutan p˚a n¨asta blad vilken/vilka av f¨oljande kodrader som inte kommer att kunna kom- pileras och varf¨or. Ange sedan vad den kvarvarande koden skriver ut.
01 Person p1 = new Professor();
02 p1.work();
03 Professor p2 = new Person();
04 p2.work();
05 PhDStudent p3 = new UniStudent();
06 p3.work();
07 UniStudent p4 = new PhDStudent();
08 p4.work();
09 Person p5 = new PhDStudent();
10 p5.work();
11 PhDStudent p6 = new Person();
12 p6.work();
13 Person p7 = new Undergrad();
14 p7.work();
15 Undergrad p8 = new UniStudent();
16 p8.work();
17 Object p9 = new Person();
18 p9.work();
03, 05, 11, 15 f¨ors¨oker tilldela variabler deklarerade av underklasstyp med basklasser. 04, 06, 12, 16 ger f¨oljdfel beroende p˚a den misslyckade
tilldelningen. Rad 18 f¨ors¨oker anropa metoden work p˚a en Object-referens. Object har ingen workmetod.
(02:) Supervising students...
(08:) Reading a paper...
(10:) Reading a paper...
(14:) Studying for exam!
blad.
B1. Alla Object har en standardversion av hashCode f¨ardig som ber¨aknar hashv¨arde utifr˚an referens- likhet ( == ). Varf¨or m˚aste du ¨overskugga hashCode om du har valt att ¨overskugga equals och vill anv¨anda klassen som nyckel iHashMap?
Om tv˚a objekt ¨ar identiska enligt equals f¨orv¨antas de representera samma nyckel, men om man inte ¨overskuggar hashCode kan de tv˚a objekten f˚a olika hashv¨arden. De kommer d˚a att placeras i olika hinkar och aldrig j¨amf¨oras, s˚a det blir i praktiken m¨ojligt att ha samma nyckel flera g˚anger i samma HashMap och att missa att en nyckel finns vid s¨okningar.
B2. Skriv den n¨odv¨andiga koden f¨or metoden List.getSurnameList, som ska returnera en List med alla studenter i listan som har ett visst efternamn.
public List getSurnameList(String surname) { \\
List newList = new List();
newList.first = getSurnameList(root, surname);
return newList;
}
private static Node getSurnameList(Node n, String surname) { if (n == null) {
return null;
}
Node next = getSurnameList(n.next, surname);
if (surname.equals(n.student.getSurname())) { next = new Node(next, n.student);
}
return next;
}
B3. I program som bearbetar text ¨ar det vanligt att kunna hantera s˚a kallade jokertecken, eller wildcards. Skriv klart metoden Misc.matchWildcards. * (asterisk) ska tolkas som noll eller fler tecken, ? (fr˚agetecken) ska tolkas som exakt ett tecken. Se kommentarer i bilagan f¨or n˚agra exempel p˚a f¨orv¨antade resultat.
public static boolean matchWildcards(String text, String pattern) { return matchWildcards(text, 0, pattern, 0);
}
private static boolean matchWildcards(String text, int textpos, String pattern, int patternpos) {
if (patternpos == pattern.length()) { // At the end of both?
return textpos == text.length();
}
boolean anyText = textpos < text.length();
char patternChar = pattern.charAt(patternpos);
switch (patternChar) { case ’?’:
matchWildcards(text, textpos + 1, pattern, patternpos)) ||
matchWildcards(text, textpos, pattern, patternpos + 1);
default:
// Normal character return anyText &&
text.charAt(textpos) == patternChar &&
matchWildcards(text, textpos + 1, pattern, patternpos + 1);
} }
B4. Klassen BST har st¨od f¨or att skapa enArrayListmed talen in-order.
a) Skriv koden f¨or den konstruktor som tar enArrayListf¨or att skapa ett tr¨ad fr˚an en s˚adan sor- teradArrayList. Skriv ytterligare hj¨alpmetoder vid behov. Det resulterande tr¨adet f˚ar maximalt ha h¨ojden dlog2ne, d¨ar n ¨ar antalet element. T¨ank efter hur du kan g¨ora processen s˚a tidseffektiv som m¨ojligt.
public BST(ArrayList<Integer> list) {
root = fromArrayList(list, 0, list.size());
}
private static Node fromArrayList(ArrayList<Integer> list, int start, int end) {
if (end <= start) { return null;
}
int mid = start + (end - start) / 2;
return new Node(list.get(mid),
fromArrayList(list, start, mid), fromArrayList(list, mid + 1, end));
}
b) Motivera vilken tidskomplexitet konstruktorn har. Hur f¨orh˚aller den sig till tidskomplexiteten f¨or att l¨agga till samma element i tr¨adet ett i taget i slumpm¨assig ordning?
Hj¨alpmetoden g¨or konstant arbete och anropas en g˚ang f¨or varje element, plus en g˚ang extra f¨or varje tomt l¨ov. Det senare skalar mindre ¨an linj¨art med totala antalet element. Allts˚a ¨ar det totala arbetet f¨or konstruktorn Θ(n). Vid slumpm¨assig inl¨aggningsordning skulle add anv¨andas och tr¨adet skulle i genomsnitt bli balanserat, vilket skulle inneb¨ara n operationer med komplexitet Θ(log n), d.v.s. Θ(n log n).
B5. T¨ank dig att du har koden iMisc.maini bilagan.
c.process();
if (c.isDone()) { doneCs.add(c);
}
} catch (CommandException e) {
System.err.println("Error processing command: " + e);
doneCs.add(c);
} }
B6. S˚a h¨ar ser klassdesignen f¨or den symboliska kalkylatorn i den sista obligatoriska uppgiften ut:
double getValue() boolean isConstant() boolean isConstant(double) Sexpr diff(Sexpr) String getName() Sexpr eval(map)
Sexpr diff(Sexpr) String getName() Sexpr eval(map)Abs
Sexpr eval(map)
Addition
String getName() int priority() ?
Sexpr diff(Sexpr) String getName() Sexpr eval(map) String ident
Variable
Sexpr eval(map) String getName() Sexpr diff(Sexpr)
Evaluation Quotation Negation
Sexpr abstract
String getName() abstract Sexpr eval(map) abstract int priority()
Sexpr diff(Sexpr) double getValue() boolean isConstant() boolean isConstant(double)
String getName() Constant
double value
Sexpr eval(map) Differentiation
Assignment Division Multiplication
Subtraction String toString() Sexpr right Sexpr left
abstract Binary
String toString() abstract
Atom
abstract
String toString() String toString() abstract Function Operator
Unary abstract Sexpr operand
Exp Cos Sin
Log int priority()
En f¨orkortad version av koden finns i bilagan.
Du vill l¨agga till operatorn ˆ, som st˚ar f¨or upph¨ojt till.
xˆy=z ska tolkas som (xˆz)=z x+yˆz ska tolkas som x+(yˆz) x*yˆz ska tolkas som x*(yˆz)
”xˆy ska tolkas som (”x)ˆy xˆyˆz ska tolkas som (xˆy)ˆz
xˆyˆzˆw ska tolkas som ((xˆy)ˆz)ˆw o.s.v.
a) I vilken metod i parsern ska hanteringen av ˆ l¨aggas till? Skriv den kod som beh¨ovs och ange
while((c=tokenizer.getChar()) == ’\’’ || c == ’^’) { tokenizer.nextToken();
if(’^’ == c) {
result = new Power(result, primary());
} else {
<Existerande kod f¨or att skapa en Differentiation>
} }
Inga andra ¨andringar beh¨ovs iParser.
b) Upph¨ojt till ska representeras av en klass som heter Power. Var i klassdiagrammet ska den klassen ligga? Motivera!
Den ska ligga under Binaryeftersom en Power-nod har tv˚a barn.
c) Vilka metoder beh¨over implementeras iPower? Motivera!
Metoderna getName() och eval() beh¨over implementeras eftersom de ¨ar abstrakta. Metoderna
priority()ochdiff()beh¨over implementeras eftersom vi inte vill ha det beteende som definieras iSexpr. (Prioriteten ska vara l¨agre ¨an defaultv¨ardet och en Power ska g˚a att derivera.)