Objektorienterad modellering och design (EDAF5) Föreläsning Agenda Introduktion till projekt XL UML Tillståndsdiagram Grafer Nätverk Ford Fulkersons algorim Återstår av kursen Föreläsningar: F9 må april Övning och frågestund F (flyttad till) on maj Repetition och övning inför tentan Projekt: Computer Skicka in design imorgon! Redovisning på fredag april! Slutinlämning nästa freadg 7 april! XL Börja jobba med detta projekt så snart som möjligt. Redovisning 9:e april och :a maj! Slutinlämning 9:e maj! Övning 3 redovisas on april Lab 5 redovisas fr april Tenta to juni EDAF5 (F) VT 5 / 53 EDAF5 (F) VT 5 / 53 Schema designmöten Möte : användningsfall, paketindelning, klassdiagram onsdag 9:e april Möte : klassdiagram, källkod (fungerande program) fredag :a maj Slutinlämning 9:e maj EDAF5 (F) VT 5 3 / 53 EDAF5 (F) VT 5 / 53
Observer-mönstret GUI-modellering public interface Observer { public void update(observable observable, Object object); public abstract class Observable { public void addobserver(observer observer) public void notifyobservers() Den oerfarne gör allt i en stor klass. Den agile gör lite i många klasser med beaktande av principen om enkelt ansvar. EDAF5 (F) VT 5 5 / 53 Paket EDAF5 (F) VT 5 / 53 Paketet expr expr aritmetiska uttryck (modifieras ej) gui användargränssnittet (modifieras) menu menyer (modifieras)... egna paket util avvecklingspaket Expr ExprParser Num Add... AddressExpr EDAF5 (F) VT 5 7 / 53 EDAF5 (F) VT 5 / 53
Paketet gui Varför inte javax.swing.jtable? JTable tillhandahåller mycket som skulle göra projektet lättare, men döljer mycket av det som projektet vill lära ut javadoc omfattar + sidor XL (med main) XLList CurrentLabel StatusPanel Editor RowLabels SheetPanel SlotLabel EDAF5 (F) VT 5 9 / 53 Paketet menu menyerna EDAF5 (F) VT 5 / 53 Paketet util Adjustment NumberAdjustment XLException XLBufferedReader XLPrintStream En del av dessa klasser bör flyttas till andra paket. EDAF5 (F) VT 5 / 53 EDAF5 (F) VT 5 / 53
Klassen Gui BorderLayout JFrame ger ett eget fönster på skärmen. import javax.swing.jframe; import java.awt.borderlayout; public class Gui extends JFrame { public Gui(int count) { super("untitled-" + count); setlayout(new BorderLayout()); // omissions pack(); setvisible(true); EDAF5 (F) VT 5 3 / 53 Layout EDAF5 (F) VT 5 / 53 Layout Status area: EDAF5 (F) VT 5 5 / 53 EDAF5 (F) VT 5 / 53
Editor WindowMenu JTextField används för textinmatning. public class Editor extends JTextField implements ActionListener { public Editor() { setbackground(color.white); addactionlistener(this); public void actionperformed(actionevent event) { // activated by Return key // contents returned by gettext() EDAF5 (F) VT 5 7 / 53 WindowMenuItem EDAF5 (F) VT 5 / 53 JMenu class WindowMenuItem extends JMenuItem implements ActionListener { private XL xl; public WindowMenuItem(XL xl) { super(xl.gettitle()); this.xl = xl; addactionlistener(this); public void actionperformed(actionevent event) { xl.tofront(); public class WindowMenu extends JMenu implements Observer { private XLList xllist; public WindowMenu(XLList xllist) { super("window"); this.xllist = xllist; xllist.addobserver(this); update(null, null); public void update(observable observable, Object object) { removeall(); for (XL xl : xllist) { add(new WindowMenuItem(xl)); EDAF5 (F) VT 5 9 / 53 EDAF5 (F) VT 5 / 53
GuiList MouseListener public class XLList extends Observable implements Iterable<XL> { private List<XL> list = new ArrayList<XL>(); public void add(xl xl) { list.add(xl); setchanged(); notifyobservers(); public boolean isempty() { return list.isempty(); public Iterator<XL> iterator() { return list.iterator(); Några swing-komponenter kan ha en ActionListener, t ex: JButton, JMenuItem, JTextField. Alla komponenter kan ha en MouseListener. Den läggs till med: public void addmouselistener(mouselistener listener); public interface MouseListener { void mouseclicked(mouseevent event); void mouseentered(mouseevent event); void mouseexited(mouseevent event); void mousepressed(mouseevent event); void mousereleased(mouseevent event); EDAF5 (F) VT 5 / 53 MouseAdapter EDAF5 (F) VT 5 / 53 MouseListenerLabel I regel vill man bara reagera på en av händelserna. Då är det bekvämt med: public abstract class MouseAdapter { public void mouseclicked(mouseevent event){ public void mouseentered(mouseevent event){ public void mouseexited(mouseevent event){ public void mousepressed(mouseevent event){ public void mousereleased(mouseevent event){ public class MouseListenerLabel extends JLabel { private class ClickListener extends MouseAdapter { public void mouseclicked(mouseevent event) { setbackground(color.yellow); public MouseListenerLabel() { setbackground(color.white); addmouselistener(new ClickListener()); EDAF5 (F) VT 5 3 / 53 EDAF5 (F) VT 5 / 53
Felhantering Felhantering public class XLException extends RuntimeException { public XLException(String message) { super(message); EDAF5 (F) VT 5 5 / 53 Feldetektering EDAF5 (F) VT 5 / 53 Syntaxanalys class Div extends BinaryExpr { Div(Expr expr, Expr expr) { super(expr, expr); precedence = ; precedence = ; public double op(double op, double op) { if (op!= ) return op / op; else throw new XLException("division by zero"); Syntax för aritmetiska uttryck: Ett uttryck består av en eller flera termer separerade av enkla pluseller minus-tecken. En term består i sin tur av en eller flera faktorer separerade av enkla multiplikations- eller divisionstecken. En faktor är ett tal, en variabel eller ett uttryck inom parenteser. Ett tal består av en eller flera siffror och får inledas med ett minustecken. En variabel består av en eller flera bokstäver bland a z. EDAF5 (F) VT 5 7 / 53 EDAF5 (F) VT 5 / 53
Syntaxanalys Syntaxanalys Konkret grammatik BNF: Expr ::= term (addop term)* Term ::= factor (mulop factor)* Factor ::= number name ( expr ) Addop::= + - Mulop ::= * / number ::= unsignednumber - unsignednumber unsignednumber ::= digit (digit)* digit ::= 3 5 7 9 name ::= letter (letter)* letter ::= a b... z Abstrakt representation abstrakt grammatik «interface» Expr Variable Int BinOp Add Sub Mul EDAF5 (F) VT 5 9 / 53 Syntaxanalys EDAF5 (F) VT 5 3 / 53 Syntaxanalys Java.io.StreamTokenizer: public class StreamTokenizer { public double nval; public String sval; public int ttype = -; public static final int TT_EOF = -, TT_EOL =, TT_NUMBER = -, TT_WORD = -3 public StreamTokenizer(Reader r) public int nexttoken() throws IOException public void ordinarychar(int ch) \\ omissions Java.io.StreamTokenizer: public class ExprParser { private int token; private StreamTokenizer tokenizer; public Expr build(reader reader) throws IOException { tokenizer = new StreamTokenizer(reader); tokenizer.ordinarychar( - ); tokenizer.ordinarychar( / ); token = tokenizer.nexttoken(); Expr e = expr(); if (token == StreamTokenizer.TT_EOF) return e; else throw new XLException("trailing garbage"); EDAF5 (F) VT 5 3 / 53 EDAF5 (F) VT 5 3 / 53
Syntaxanalys Syntaxanalys Analys av faktorer: private Expr factor() { Expr e; switch (token) { case ( : token = nexttoken(); e = expr(); token = nexttoken(); return e; case TT NUMBER: double x = nval; token = nexttoken(); return new Num(x); case TT WORD: String s = sval; token = nexttoken(); return new Variable(s); Analys av termer: private Expr term() { Expr result, factor; result = factor(); while (token == * token == / ) { int op = token; token = nexttoken(); factor = factor(); switch (op) { case * : result = new Mul(result, factor); break; case / : result = new Div(result, factor); break; return result; EDAF5 (F) VT 5 33 / 53 UML Tillståndsdiagram EDAF5 (F) VT 5 3 / 53 UML Tillståndsdiagram EDAF5 (F) VT 5 35 / 53 EDAF5 (F) VT 5 3 / 53
Grafer Grafer Source 3 3 Sink Ett flödesnätverk är en riktad graf där varje båge har en kapacitet och kan ta emot ett flöde. En nod i nätverket är en källa d.v.s. har bara utgående bågar. En nod i nätverket är en sänka d.v.s. har bara inkommande bågar. EDAF5 (F) VT 5 37 / 53 Snitt EDAF5 (F) VT 5 3 / 53 Snitt Snitt Ett snitt i ett flödesnätverk är en uppdelning av mängden noder i två mängder sådant att källan ingår i den ena mängden och sänkan i den andra. Kapaciteten för ett snitt är summan av kapaciteten för de bågar som går från källans mängd till sänkas mängd. 3 Minsta snittet: Hitta ett snitt med minimal kapacitet. Source 3 Sink EDAF5 (F) VT 5 39 / 53 EDAF5 (F) VT 5 / 53
Grafer Flöde Flödet via en båge kan inte överstiga dess kapacitet. Alla noder utom källan och sänkan har lika stort inflöde som utflöde. : Sök ett flöde med maximalt värde. / f= / / / / / / / 3/3 / /9 / Source / /3 Sink / EDAF5 (F) VT 5 / 53 EDAF5 (F) VT 5 / 53 Girig algoritm / f= : Sök ett flöde med maximalt värde. / / / / / Girig algoritm: Sätt flödet = för alla bågar Sök en väg p där varje båge har en resterande kapacitet större än flödet f Öka med flödet f längs vägen p Upprepa tills du inte hittar fler sådana vägar / / / /9 / / / / / f=+ / /9 / EDAF5 (F) VT 5 3 / 53 EDAF5 (F) VT 5 / 53
Girig algoritm Girig algoritm Den giriga algoritmen hittar inte maximalt flöde / f=++ / totalt flöde = / / / / / / / / / / / /9 / / /9 / / f=+++ Vi behöver en bättre algoritm +/ / / / / / 3/ 9/ maximalt flöde = 9 / +/9 +/ / 7/ / 9/ 9/9 / EDAF5 (F) VT 5 5 / 53 Ford-Fulkersons algoritm EDAF5 (F) VT 5 / 53 Ford-Fulkersons algoritm Vi definierar en ny graf som hjälper oss att hålla reda på möjligheten att ändra flödet. Residualgraf Givet grafen G med ett flöde f definierar vi residualgrafen Gf så att: Gf har samma noder som G. Alla bågar som finns i G finns även i Gf. Kapaciteten för en båge i Gf motsvarar resterande kapacitet för motsvarande båge i G. För alla bågar i G som har ett flöde fe större än noll finns också motsvarande bågar i omvänd riktning i Gf. Kapaciteten för dessa bågar är lika stort som fe. EDAF5 (F) VT 5 7 / 53 EDAF5 (F) VT 5 / 53
Ford-Fulkersons algoritm Ford-Fulkersons algoritm Utökande väg Ford-Fulkersons algoritm Sätt startflödet till för alla bågar. Sök en utökande väg i residualgrafen. Utöka flödet längs den vägen. Upprepa tills det inte går att hitta en utökande väg. EDAF5 (F) VT 5 9 / 53 Ford-Fulkersons algoritm EDAF5 (F) VT 5 5 / 53 Ford-Fulkersons algoritm / +/ / -/ totalt flöde = + +/ / +/ totalt flöde = +=9 + +/ /9 / / +/ - - + / -/ / + - - + +/ +/9 / EDAF5 (F) VT 5 5 / 53 EDAF5 (F) VT 5 5 / 53
Flöde och snitt Flödet är lika stort i varje snitt i grafen. Ett flöde är maximalt om det inte finns någon utökande väg. Värdet av ett maximalt flöde = Kapaciteten för det minsta snittet. EDAF5 (F) VT 5 53 / 53