• No results found

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

N/A
N/A
Protected

Academic year: 2022

Share "Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper."

Copied!
12
0
0

Loading.... (view fulltext now)

Full text

(1)

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!

(2)

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

(3)

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)

(4)

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

(5)

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);

}

(6)

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 Θ.

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();

}

(7)

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();

(8)

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!

(9)

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 ’?’:

(10)

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.

(11)

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

(12)

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.)

References

Related documents

The Quartet has collaborated with some of this generation’s most important composers, includ- ing Gunther Schuller, John Cage, Gyorgy Ligeti, Steve Reich, Osvaldo Golijov,

Highlights of their 2014-15 season include concerts at Carnegie Hall, the Philadelphia Chamber Music Society, and the Terra di Siena Chamber Music Festival in Tuscany; a

During a ricochet stroke the axis (i.e., the frog) is moved in a more or less straight (horizontal) line in the stroke direction as long as (the rotational) bouncing takes place.

String je v Pascalu reprezentován pomocí pole znaků, z čehož se dá očekávat, že zacházení s proměnnou typu String bude velice podobné zacházení s

[r]

public Vindkraft( String inNamn, double inGen, double inRadie) { namn = inNamn;.. genStorlek

Apart from the classical circuit model and the parameters of complexity, circuit size and depth, providing the basis for sequential and for parallel computations, numerous other

6 472 Bjursell Melvin IK Hakarpspojkarna Fullföljt 7 470 Johansson Nils IK Hakarpspojkarna Fullföljt 8 465 Rönnbacka-Nybäck Simon Norabygdens SK Fullföljt 9 460 Adamsson