Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Programmering med interfaces – en stak og en HP-regnemaskine push pop.

Lignende præsentationer


Præsentationer af emnet: "Programmering med interfaces – en stak og en HP-regnemaskine push pop."— Præsentationens transcript:

1 Programmering med interfaces – en stak og en HP-regnemaskine push pop

2  Michael E. Caspersen, 2003IOOPregnemaskine.2 Den onde class Bad { public static void run() { int x = 0; Node h = null; Node p = null; read(x); while ( x!=0 ) { p = new Node(); p.v = x; p.next = h; h = p; read(x); } while ( h!=null ) { p = h; h = p.next; x = p.v; write(x); } } } Hvad gør dette program?

3  Michael E. Caspersen, 2003IOOPregnemaskine.3 Den gode class Good { public static void run() { int x = 0; Stack s = new LinkedStack(); read(x); while ( x!=0 ) { s.push(x); read(x); } while ( !s.isEmpty() ) { x = s.pop(); write(x); } Hvad gør dette program?

4  Michael E. Caspersen, 2003IOOPregnemaskine.4 Hvorfor ond og god? class Good { public static void run() { int x = 0; Stack s = new LinkedStack(); read(x); while ( x!=0 ) { s.push(x); read(x); } while ( !s.isEmpty() ) { x = s.pop(); write(x); } Kommentarer? class Bad { public static void run() { int x = 0; Node h = null; Node p = null; read(x); while ( x!=0 ) { p = new Node(); p.v = x; p.next = h; h = p; read(x); } while ( h!=null ) { p = h; h = p.next; x = p.v; write(x); } } }

5  Michael E. Caspersen, 2003IOOPregnemaskine.5 Abstraktionsniveauer I de to programmer kan vi identificere (mindst) fire forskellige abstraktionsniveauer. I “den onde” er disse fire niveauer totalt sammenblandet. I “den gode” er disse niveauer klart separeret. Generelt skal vi stræbe efter at designe pro- grammer hvor abstraktionsniveauerne er klart separeret og dermed lette at identificere. Kun herved kan vi håbe på at kunne konstruere vedligeholdelsesvenlige, pålidelige og effektive programmer. application stack linked list “pointers”

6  Michael E. Caspersen, 2003IOOPregnemaskine.6 Men hvad er en stak? class Good { public static void run () { int x = 0; Stack s = new LinkedStack(); read(x); while ( x!=0 ) { s.push(x); read(x); } while ( !s.isEmpty() ) { x = s.pop(); write(x); } interface Stack { /** * returnerer om stakken er tom */ public boolean isEmpty(); /** * indsætter e øverst på stakken */ public void push(int e); /** * Under forudsætning af at stakken * ikke er tom, fjernes og returneres * det øverste element */ public int pop(); }

7  Michael E. Caspersen, 2003IOOPregnemaskine.7 En HP-regnemaskine Indtastning Display 11  11 4  4 - 7 3  3 4  4 5  5 * 20 + 23 * 161

8  Michael E. Caspersen, 2003IOOPregnemaskine.8 Rullestakken inde bag scenen Indtastning Display 11  11 4  4 - 7 3  3 4  4 5  5 * 20 + 23 * 161 54375437 display

9  Michael E. Caspersen, 2003IOOPregnemaskine.9 Regneudtryk Prefix-udtryk Infix-udtryk Postfix-udtryk Eks. 1 Eks. 2 +3*45 *+345 3+4*5 (3+4)*5 345*+ 34+5*

10  Michael E. Caspersen, 2003IOOPregnemaskine.10 Evaluering af postfixudtryk Infix-udtryk Postfix-udtryk 3+4*5 345*+ Indtastning 3  3 4  4 5  5 * 20 + 23

11  Michael E. Caspersen, 2003IOOPregnemaskine.11 Hvad sker der bag scenen? 3 4 3 5 4 3 20 3 23 push 4push 5push 3pop b pop a push a*b pop b pop a push a+b

12  Michael E. Caspersen, 2003IOOPregnemaskine.12 Algoritme for regnemaskine for alle tegn t i udtryk { hvis ( t er et tal ) push(t) ellers { int b = pop tal af stakken; int a = pop tal af stakken; vælg ( hvis t er ) { ‘+’: push a+b; ‘-’: push a-b; ‘*’: push a*b; ‘-’: push a/b; } 20 3 23 pop b pop a push a+b 3 4 5 * +

13  Michael E. Caspersen, 2003IOOPregnemaskine.13 Regnemaskine i Java public int evaluate (String exp, Stack s) { // pre: exp er et lovligt postfixudtryk for (int i = 0; i<exp.length(); i++) { char ch = exp.charAt(i); if ( Character.isDigit(ch) ) s.push(Character.getNumericValue(ch)); else { int b = s.pop(); int a = s.pop(); switch ( ch ) { case '+': s.push(a+b); break; case '-': s.push(a-b); break; case '*': s.push(a*b); break; case '/': s.push(a/b); break; default: ; }//switch }//else } //for return s.pop(); }//evaluate

14  Michael E. Caspersen, 2003IOOPregnemaskine.14 Afkobling CalculatorStack ArrayStack ListStack LinkedStack 1

15  Michael E. Caspersen, 2003IOOPregnemaskine.15 En klasse som impl. stack class LinkedStack implements Stack { private Node sp; public LinkedStack() {... } public boolean isEmpty() {... } public void push(int e) {... } public int pop() {... } } 13 9 7  sp Stack s = new LinkedStack(); s.push(13); s.push(9); s.push(7); Repræsentationsinvariant:

16  Michael E. Caspersen, 2003IOOPregnemaskine.16 Selve koden class LinkedStack implements Stack { private Node sp; public LinkedStack() { sp = null; } public boolean isEmpty() { return sp==null; } public void push(int e) { Node p = new Node(); p.v = e; p.next = sp; sp = p; } public int pop() { int res = sp.v; sp = sp.next; return res; } 13 9 7  sp Stack s = new LinkedStack(); s.push(13); s.push(9); s.push(7); Repræsentationsinvariant:

17  Michael E. Caspersen, 2003IOOPregnemaskine.17 Specifikation som brandmur class Calculator { public eval(Stack s) {... b= s.pop(); a= s.pop(); s.push(a+b);... } class LinkedStack implements Stack { private Node sp; public LinkedStack() { sp= null; } public boolean isEmpty() { return sp==null; } public void push(int e) { Node p= new Node(); p.v= e; p.next= sp; sp= p; } public int pop() { int res= sp.v; sp= sp.next; return res; } ApplikationSpecifikationImplementation interface Stack { /** * returnerer om stakken er tom */ public boolean isEmpty(); /** * indsætter e øverst på stakken */ public void push(int e); /** * Under forudsætning af at stakken * ikke er tom, fjernes og returneres * det øverste element */ public int pop(); }

18  Michael E. Caspersen, 2003IOOPregnemaskine.18 Alternativ implementation class ArrayStack implements Stack { // Class constant final private static int MAX = 100; // Instance variables private int items []; private int sp; // Constructor public ArrayStack() { items = new int[MAX]; MISSING CODE } // Methods public boolean isEmpty() { MISSING CODE } public boolean isFull() { MISSING CODE } public void push(int e) { MISSING CODE } public int pop() { MISSING CODE } } sp 0 Max items Repræsentationsinvariant:

19  Michael E. Caspersen, 2003IOOPregnemaskine.19 Endnu et alternativ class ListStack implements Stack { // Instance variables private List items; // Constructor public ListStack() { MISSING CODE } // Methods public boolean isEmpty() { MISSING CODE } public boolean isFull() { MISSING CODE } public void push(int e) { MISSING CODE } public int pop() { MISSING CODE } } 0 items Repræsentationsinvariant: items.size()

20  Michael E. Caspersen, 2003IOOPregnemaskine.20 Afkobling CalculatorStack ArrayStack ListStack LinkedStack 1

21  Michael E. Caspersen, 2003IOOPregnemaskine.21 Polymorfi En variabel er kvalificeret med en type, men variablen kan referere til et objekt af en anden type. Dog skal objektets reelle type være en subtype af den kvalificerende type. Der er to måder at lave subtyper på i Java –implementer et interface –udvid en klasse. Klasseudvidelser (subklasser) skal vi se på i kommende lektioner. class Calculator { public eval(Stack s) {... b = s.pop(); a = s.pop(); s.push(a+b);... } class Engineer { Calculator c = new Calculator(); public calculate() {... c.eval(new LinkedStack()); c.eval(new ArrayStack()); } Qualifier

22  Michael E. Caspersen, 2003IOOPregnemaskine.22 Plug-and-play push pop ArrayStack Der kan monteres både en LinkedStack og en ArrayStack (og alle mulige andre slags stakke man måtte finde på fremover!), fordi regnemaskinen er programmeret i forhold til det generelle Stack-interface. push pop LinkedStack


Download ppt "Programmering med interfaces – en stak og en HP-regnemaskine push pop."

Lignende præsentationer


Annoncer fra Google