Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

 Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.1 Sweep-algoritmer Programmering med invarianter og uden kaniner.

Lignende præsentationer


Præsentationer af emnet: " Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.1 Sweep-algoritmer Programmering med invarianter og uden kaniner."— Præsentationens transcript:

1  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.1 Sweep-algoritmer Programmering med invarianter og uden kaniner

2  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.2 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?

3  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.3 Sweep-algoritme... i 0b.size() i = 0;... while ( i != b.size() ) { // behandl b.elementAt(i) i++; } // i == b.size() b:

4  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.4 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; }

5  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.5 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; }

6  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.6 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; }

7  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.7 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; }

8  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.8 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.

9  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.9 Dominobrikker... 10 1x2-brikker i rigelige mængder Kan man overdække dette bræt? (Ingen brikker må overlappe.) 20

10  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.10 Manglende hjørner... 10 20 1x2-brikker i rigelige mængder Kan man overdække dette?

11  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.11 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.

12  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.12 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:

13  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.13 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

14  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.14 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; }

15  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.15 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; }

16  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.16 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

17  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.17 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; }

18  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.18 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; }

19  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.19 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?

20  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.20 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; }

21  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.21 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; }

22  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.22 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); }

23  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.23 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

24  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.24 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

25  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.25 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; }

26  Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.26 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 " Michael E. Caspersen, 2000 Introducerende objektorienteret programmering4A.1 Sweep-algoritmer Programmering med invarianter og uden kaniner."

Lignende præsentationer


Annoncer fra Google