Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

I o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.1 Sweep-algoritmer Programmering med invarianter og uden kaniner.

Lignende præsentationer


Præsentationer af emnet: "I o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.1 Sweep-algoritmer Programmering med invarianter og uden kaniner."— Præsentationens transcript:

1 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.1 Sweep-algoritmer Programmering med invarianter og uden kaniner

2 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.2 Datatypen Sequence Oprette Sequence() Sequence(s, l, h) Kopiere Sequence clone() Spørge på tilstand int size() boolean isEmpty() int elementAt(int i) Opdatere Sequence setElementAt(int e, int i) Sequence insertElementAt(int e, int i) Sequence removeElementAt(int i) Sequence removeAllElements() Input/output Sequence read() Sequence write() String toString() Ekstrafunktioner Sequence sort() Sequence reverse() Sequence concat(Sequence rhs) Læs JavaDoc!

3 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.3 Sequence, by example Sequence s = new Sequence(5, 1, 20); // s: [8, 2, 19, 6, 11] s.elementAt(2) == 19 s.setElementAt(5, 1); // s: [8, 5, 19, 6, 11] s.size() == 5 s.insertElementAt(0, 2); // s: [8, 5, 0, 19, 6, 11] s.sort(); // s: [0, 5, 6, 8, 11, 19] s.reverse(); // s: [19, 11, 8, 6, 5, 0] s.concat(s.reverse()).write; // [19, 11, 8, 6, 5, 0, 0, 5, 6, 8, 11, 19]

4 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.4 for/while I turtle-programmer (og andre steder) har vi skrevet: for ( int i = 0; i < 4; i++ ) { t.move(l); t.turn(90); } Et alternativ til for-løkken er while-løkken der ser således ud: int i = 0; while ( i < 4 ) { t.move(l); t.turn(90); i++; } Hvornår skal man bruge for, og hvornår skal man bruge while?

5 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.5 Sweep-algoritme... i 0b.size() i = 0;... while ( i != b.size() ) { // behandl b.elementAt(i) i++; } // i == b.size() b:

6 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.6 Summering public static int sum(Sequence s) { // post: returnerer summen af tallene i s int res; // resultat-variabel int i; // sweep-variabel i = 0; res = 0; while ( i != s.size() ) { res = res + s.elementAt(i); i++; } return res; }

7 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.7 Søgning, første forsøg public static boolean search(int e, Sequence s) { // post: returnerer om e findes i s boolean found; // resultat-variabel int i; // sweep-variabel i = 0; found = false; while ( i != s.size() ) { found = s.elementAt(i)==e; i++; } return found; }

8 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.8 En let korrigering public static boolean search(int e, Sequence s) { // post: returnerer om e findes i s boolean found; // resultat-variabel int i; // sweep-variabel i = 0; found = false; while ( i != s.size() ) { found = found || s.elementAt(i)==e; i++; } return found; }

9 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.9 Den samme, men med if... public static boolean search(int e, Sequence s) { // post: returnerer om e findes i s boolean found; // resultat-variabel int i; // sweep-variabel i = 0; found = false; while ( i != s.size() ) { if ( s.elementAt(i) == e ) found = true; i++; } return found; }

10 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.10 Optagelsesprøve til Menza ? ? EA E a E A E E AA ?? ?? Find det uforanderlige i forandringen... Invariant: en størrelse som ikke ændres under ændrede forudsætninger.

11 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.11 Dominobrikker... 10 1x2-brikker i rigelige mængder Kan man overdække dette bræt? (Ingen brikker må overlappe.) 20

12 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.12 Manglende hjørner... 10 20 1x2-brikker i rigelige mængder Kan man overdække dette?

13 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.13 Farvelægning og invariant 10 20 En brik dækker to felter, et hvidt og et sort. På brædtet er der 100 sorte og 98 hvide felter (de to manglende felter er begge hvide). En brik dækker et sort og et hvidt felt. Lad # b betegne antallet af synlige sorte felter og # w antallet af synlige hvide felter. Vi har da: Invariant: # b = # w +2 og vi kan se at når # w er nul er # b = 2.

14 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.14 Sweep-algoritme + invariant... i 0s.size() i = 0;... // inv: elementerne i s[0:i) er behandlet while ( i != s.size() ) { // behandl s.elementAt(i) i++; } // elementerne i s[0:i) er behandlet og // i == s.size(), ergo // alle elementerne i s er behandlet s:

15 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.15 Invariant for summering... i 0s.size() s: // inv: elementerne i s[0:i) er behandlet // inv: elementerne i s[0:i) er summeret // inv: res = summen af s[0:i) res:42

16 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.16 Summering, udregn løsning public static int sum(Sequence s) { // post: returnerer summen af tallene i s int res; // resultat-variabel int i; // sweep-variabel i = ?; res = ?; // inv: res = summen af // i = summen af s[0:i) // // s: while ( i != s.size() ) { ? i++; } // res er summen af s[0:s.size()) return res; }

17 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.17 Summering á la carte public static int sum(Sequence s) { // post: returnerer summen af tallene i s int res; // resultat-variabel int i; // sweep-variabel i = 0; res = 0; // inv: res er summen af s[0:i) while ( i != s.size() ) { res = res + s.elementAt(i); i++; } // res er summen af s[0:s.size()) return res; } skal etablere invarianten skal sammen med invarianten garantere post skal bevare invarianten når i tælles op

18 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.18 Invariant for søgning... i 0s.size() s: // inv: elementerne i s[0:i) er behandlet // inv: elementerne i s[0:i) er sammenlignet med e // inv: found == e findes i s[0:i) e found:true

19 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.19 Søgning, udregn løsning public static boolean search(int e, Sequence s) { // post: returnerer om e findes i s boolean found; // resultat-variabel int i; // sweep-variabel i = ?; found = ?; // inv: found == e findes i // i == e findes i s[0:i) // // s: while ( i != s.size() ) { ? i++; } // found == e findes i s[0:s.size()) return res; }

20 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.20 Søgning á la carte public static boolean search(int e, Sequence s) { // post: returnerer om e findes i s boolean found; // resultat-variabel int i; // sweep-variabel i = 0; found = false; // inv: found == e findes i s[0:i) while ( i != s.size() ) { found = found || s.elementAt(i) == e; i++; } // found == e findes i s[0:s.size()) return found; }

21 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.21 Primtal?  Et tal n, n  2, er et primtal hvis de eneste divisorer i tallet er 1 og n.  Med andre ord: hvis 2,..., n-1 ikke går op i n, er n et primtal. Går 2 op? Går 3 op? Går 4 op?... Går n-1 op? Med f gennemløber vi tallene i intervallet [2:n) og registrerer hvis et af tallene går op i n. p == ingen af tallene [2:f) går op i n Er 32779 et primtal?

22 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.22 Skelet for funktionen prime public static boolean prime(int n) { // pre: n >= 2 // post: returnerer om n er et primtal boolean p; // resultat-variabel int f; // sweep-variabel f = ?; p = ?; // inv: p == ingen af tallene [2:f) går op i n while ( f != n ) { ? f++; } // p == ingen af tallene [2:n) går op i n return p; }

23 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.23 Funktionen prime public static boolean prime(int n) { // pre: n >= 2 // post: returnerer om n er et primtal boolean p; // resultat-variabel int f; // sweep-variabel f = 2; p = true; // inv: p == ingen af tallene [2:f) går op i n while ( f != n ) { if ( divides(f, n) ) { p = false; } f++; } // p == ingen af tallene [2:n) går op i n return p; }

24 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.24 Et par hjælpefunktioner... public static boolean divides(int f, int x) { // pre: f != 0 // post: returnerer om f går op i x return x%f == 0; } public static boolean even(int x) { // post: returnerer om x er lige return divides(2,x); } public static boolean odd(int x) { // post: returnerer om x er ulige return !even(x); }

25 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.25 Spejlvending af et tal public static int reverse(int n) { // pre: n >= 0 // post: returnerer ciffer-spejlvendingen af n int res; // resultat-variabel res = 0; while ( n != 0 ) { res = 10*res + n%10; n = n/10; } return res; } 1825  5281

26 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.26 Talsystemer, decimal til binær Hvordan ser 825 ud binært? n bit 825 % 2 = 1 / 2 == 412 % 2 = 0 / 2 == 206 % 2 = 0 / 2 == 103 % 2 = 1 / 2 == 51 % 2 = 1 / 2 == 25 % 2 = 1 / 2 == 12 % 2 = 0 / 2 == 6 % 2 = 0 / 2 == 3 % 2 = 1 / 2 == 1 % 2 = 1 / 2 == 0 1 1 0 0 1

27 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.27 Decimal til binær konvertering public static Sequence dec2bin(int n) { // pre: n >= 0 // post: returnerer den binære repræsentation af n Sequence b = new Sequence(); // resultat-variabel while ( n != 0 ) { int bit; if ( divides(2, n) ) bit = 0; else bit = 1; b.insertElementAt(bit, b.size()); n = n/2; } return b; }

28 i o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.28 Kaffebønner (Java naturligvis) Tag to bønner op af posen. Hvis de har samme farve, så smid dem væk, men put en ny sort bønne i. (Der er ekstra sorte bønner til dette.) Hvis de har hver sin farve, så smid den sorte væk og læg den hvide tilbage. Legen slutter når der er én bønne tilbage; kan I sige noget om farven på denne? x sorte og y hvide bønner


Download ppt "I o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5B.1 Sweep-algoritmer Programmering med invarianter og uden kaniner."

Lignende præsentationer


Annoncer fra Google