(22 maj 2015 F14.1 ) Grafik, grafiska användargränssnitt och rörliga bilder Viktigt: Grafiska komponenter: Fönster, etiketter, knappar, textfält,... Tekniken med att med genom arv definiera t ex sitt eget fönster (class MyWindow extends JFrame) Grafiska användargränssnitt ( GUI ) Händelsestyrda program callback-metoder ( lyssnare ) Händelser: mustryck, tangenttryck, timer-händelse,... Tekniken att göra rörliga bilder med hjälp av en timer.
(22 maj 2015 F14.2 ) Vad behöver ni kunna och inte kunna på tentan Bör kunna: Begreppen Läsa och förstå kod som definierar ett GUI Göra små modifieringar i given kod Behöver inte kunna några detaljer utantill! Kommer inte behöva skriva någon kod från scratch.
(22 maj 2015 F14.3 ) Rekursiv problemlösning 1. Dela upp problemet i ett eller flera delproblem av samma typ som ursprungsproblemet 2. Lös delproblemen på samma sätt 3. Kombinera lösningarna till delproblemen till en lösning på ursprungsproblemet Det måste finnas minst ett basfall
(22 maj 2015 F14.4 ) Rekursion Hemligheten är att tänka lokalt! Exempel: Jag ska beräkna x n. Kan jag direkt lösa problemet jag fått? (basfall) Ja, om t ex n = 0. Svara 1. Om ej, ge Johan problemet att beräkna x n 1 Jag bryr mig inte alls om hur Johan löser problemet men han kan naturligtvis resonera på samma sätt dvs han kan sitta med exakt samma algoritm som jag men med andra indata. När jag fått svaret från Johan multiplicerar jag det med och returnerar resultatet.
(22 maj 2015 F14.5 ) Rekursion Det måste finnas sätt att ange delproblemen och avgöra vad som är basfall. I ovanstående fall var det enkelt inparametern n. I andra fall behövs det någon hjälpmetod som tar emot en extra parameter (typiskt för problem med länkade strukturer). I andra fall kan rekursionen styras av indata från fil eller tangentbord. Ni har sett åtminstone två exempel på detta: reversenumbers och Parser-metoderna Ytterligare varianter finns i kalkylatorns eval- och diff-metoder.
(22 maj 2015 F14.6 ) Komplexitet Med en algoritms komplexitet menas hur tiden (antalet operationer) växer med problemstorleken. Uttrycks ofta med ordonotation O(f (n)). Några vanliga uttryck: O(1) Bäst! O(log n) Mycket bra Binär sökning O(n log n) Bra Snabba sorteringsmetoder O(n 2 ) OK Simpla sorteringsmetoder O(n 3 ) Tja multiplikation av nxn-matiser O(2 n ) Hopplöst! Brickleken
(22 maj 2015 F14.7 ) Komplexitet Ordo-uttrycken säger bara hur det bär sig åt för stora värden på n ibland för ointressant stora. Ordo är egentligen bara en övre begränsning. Sålunda är alla användbara algoritmer O(2 n ). Mer matematiskt korrekt att använda Omega (för undre begränsningar) och Theta som anger både övre och undre begränsning.
(22 maj 2015 F14.8 ) Numeriska kalkylatorn Tillämpning av rekursion med recursive descent. Rekursionen styrs av aktuell tok Användning av TreeMap<String, Double> med metoderna: Undantag put(string name, Double value) boolean containskey(string name) Double get(string name)
(22 maj 2015 F14.9 ) Undantag Undantag ( exceptions ) är objekt som skapas och kastas när något oväntat inträffar. Överför kontrollen till något ställe som kan hantera fortsättningen. Bör veta: Skapas med new Kastas med throw Fångas med try {... catch(...) Metoder kan behöva deklareras med throws Skrivs som subklass till existerande undantagsklass
(22 maj 2015 F14.10 ) Undantag Undantagsklasser är mycket enkla: eller public class MyException extends Exception { public MyException(String msg) { super(msg); public class MyException extends RuntimeException { public MyException(String msg) { super(msg);
(22 maj 2015 F14.11 ) Länkade listor List Node 3 5 17..... 42 first last Tänk på referenser som linor som håller fast objekten. Om man ändrar en referens så tappar man bort objektet om det inte finns något annat som håller i det! public int removefirst { if (first==null) throw new ListException("Empty list in removefirst"); int ret = first.data; first = first.next; // better than remove(ret) return ret;
(22 maj 2015 F14.12 ) Länkade listor Varför är följande metod dålig: public boolean contains(int data) { Node n = first; for (int i= 0; i<length(); i++) { if (data == n.data) { return true; n = n.next;
(22 maj 2015 F14.13 ) Bättre public boolean contains(int data) { Node n = first; while (n!=null && data>n.data) { n = n.next; return n!=null && data==n.data eller public boolean contains(int data) { Node n; for (n = first; n!=null && data<n.data; n=n.next) { return n!=null && data==n.data;
(22 maj 2015 F14.14 ) Binära träd root e b n Storlek (size), höjd, intern och extern väglängd. a d g p Traverseringsorningar: prein- och postorder. c f k y
(22 maj 2015 F14.15 ) Binära sökträd Det måste finnas en ordningsrelation mellan noderna För varje nod gäller att mindre noder ligger till vänster och större noder till höger. Binära sökträd är bra för inlägg, sökning och urtag: O(?) Alla binära träd är inte binära sökträd! Är uttrycksträden i uppgift 5 binära sökträd, binära träd eller något annat?
(22 maj 2015 F14.16 ) Vad är det för fel på följande public boolean contains(string key) { return contains(key, root); private static contains(string key, Node r) { if (r == null) { return false; else if (key.compareto(r.key)==0) { return true; else { return contains(key, r.left) contains(key, r.right);
(22 maj 2015 F14.17 ) Uppgift 2 på tentan 2014-05-27 En prioritetskö implementerad med hjälp av ett binärt sökträd (egentligen inte ett riktigt sökträd). I en prioritetskö styrs uttagen av elementens prioritet - inte av hur länge de stått i kön. Hur ska kön representeras? Länkad lista eller array? Osorterat uttag O(n), inlägg O(1). Sorterat på prioritet uttag O(1), inlägg O(n)
(22 maj 2015 F14.18 ) Uppgift 2 på tentan 2014-05-27 Idé: Använd ett binärt sökträd sorterat på prioritet men där man tillåter samma prioritet på flera ställen i trädet. Inlägg blir vanligt BST-inlägg. Om man vid ett inlägg stöter på en nod med samma prioritet så fortsätter man inlägget åt höger. Fråga: Hur många operationer krävs för inlägg och urtag i bästa respektive värsta fall.
(22 maj 2015 F14.19 ) Klassen PriorityQueue: Översikt public class PriorityQueue { private static class Node { private Node root; public String tostring() { public void enqueue(int pri) { public int dequeue() { public int removerecursive() { public static void main(string[] args) {
(22 maj 2015 F14.20 ) Klassen PriorityQueue: Nodklassen Inga konstigheter: private static class Node { int priority; Node left; Node right; Node(int pri) { priority = pri;
(22 maj 2015 F14.21 ) Klassen PriorityQueue: Metoden tostring Klassisk inordertraversering med en rekursiv hjälpmetod: public String tostring() { return tostring(root); public static String tostring(node r) { if (r==null) { return ""; else { return tostring(r.left) + " " + r.priority + " " + tostring(r.right); Fråga: Är det svårt att skriva tostring utan rekursion?
(22 maj 2015 F14.22 ) Klassen PriorityQueue: Metoden enqueue public void enqueue(int pri) { root = enqueue(pri, root); private static Node enqueue(int pri, Node r) { if (r==null) { r = new Node(pri); else if (pri < r.priority) { r.left = enqueue(pri, r.left); else { r.right = enqueue(pri, r.right); return r;
(22 maj 2015 F14.23 ) Klassen PriorityQueue: Metoden dequeue public int dequeue() { int res; if (root==null) throw new RuntimeException("Empty tree"); else if (root.left==null) { res = root.priority; root = root.right; else { Node n = root; while (n.left.left!=null) n = n.left; res = n.left.priority; n.left = n.left.right; return res;
(22 maj 2015 F14.24 ) Klassen PriorityQueue: Metoden dequeue rekursivt public int dequeuerecursive() { if (root==null) throw new RuntimeException("Empty tree"); if (root.left==null) { int res = root.priority; root = root.right; return res; else { return dequeuerecursive(root);
(22 maj 2015 F14.25 ) Klassen PriorityQueue: Metoden dequeue rekursivt private static int dequeuerecursive(node r) { if (r.left.left==null) { int ret = r.left.priority; r.left = r.left.right; return ret; else { return dequeuerecursive(r.left);
(22 maj 2015 F14.26 ) Arvshierarkier Antag att B är en klass och S är en subklass till B dvs S extends A S har alla Bs attribut och metoder När en S konstrueras måste B också konstrueras - super B b = new S() är OK när S är en subklass till B, annars ej B.f() är OK om f är deklarerad (abstrakt eller konkret) i B eller någon basklass till B Om f också finns i S så är det den som anropas av b.f() dynamisk eller sen bindning.
(22 maj 2015 F14.27 ) Klasshierarkier forts Abstrakta metoder: Tjänar som platshållare i en basklass. Exempel: public abstract String getname(); i klassen Sexpr. En klass som har en eller flera abstrakta metoder måste också deklareras som abstract. Man behöver inte deklarera om en abstrakt metod i underklass om man inte har tänkt att implementera den där. En underklass som ärver från en abstrakt klass och inte implementerar alla abstrakta metoder måst deklareras abstrakt, Det går inte att instansiera en abstrakt klass
(22 maj 2015 F14.28 ) Interface Ett interface är ungefär som en abstrakt klass där alla metoder är abstrakta. Man ärver dock inte från interface man implementerar (implements) dem. Exempel: public class MyWindow extends JFrame implements ActionListener { Man kan likna det vid en försäkran om att klassen man skriver kommer att innehålla alla metoder som deklareras i interfacet.
(22 maj 2015 F14.29 ) Några råd inför tentan Se till att ni kan de obligatoriska uppgifterna Läs igenom uppgiften ett par gånger innan ni börjar lösa den Läs den bifogade koden! Den ger ofta extra vägledning för hur uppgifterna ska lösas. Ni får skriva hjälpmetoder (om det är vettigt... )
(22 maj 2015 F14.30 ) Några råd inför tentan Kom ihåg att t ex Node n = new Node() inte betyder att n är en nod eller ett nod-objekt! Kom ihåg att alltid tänka på om en referens kan vara null innan ni använder den! Använd basfallet null om det går! Ger oftast enklast och effektivast kod Kom ihåg att namn som first, next, Node, root, left, right,... inte är reserverade! Man skulle t ex kunna använda car och cdr i stället för left och right.
(22 maj 2015 F14.31 ) Läs texten på först sidan! Där står, bland annat, att poängavdrag kan kan göras för icke-privata eller onödiga instansvariabler, dålig läslighet, upprepning av identisk kod, underlåtenhet att utnyttja given eller egen tidigare skriven metod, underlåtenhet att utnyttja arv och lösningar som har väsentligt sämre komplexitet än nödvändigt t ex Θ(n 2 ) i stället för Θ(n).