Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Algoritmeskabeloner findOne, findAll, findNoOf, findSumOf Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder.

Lignende præsentationer


Præsentationer af emnet: "Algoritmeskabeloner findOne, findAll, findNoOf, findSumOf Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder."— Præsentationens transcript:

1 Algoritmeskabeloner findOne, findAll, findNoOf, findSumOf Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder strenge) Opfølgning på Skildpadde opgaven Rekursive metoder Afleveringsopgave: Billedredigering Forelæsning Uge 4 – Mandag p1 == p2 evaluerer til false :Person "Jill" p2 Person "Fred" p1 Person

2 ● Algoritmeskabeloner 2 public Pixel findOnePixel(int color) { for ( Pixel p : pixels ) { if ( p.getColor() == color) { return p; } return null; } public Person findOnePerson(String q) { for ( Person p : persons ) { if (p.getName().contains(q)) { return p; } return null; } Finder en peson, hvis navn indeholder den angivne textstreng Finder et element, der opfylder betingelsen Finder en pixel med den angivne farve

3 findOne = finder ét element Algoritmeskabelon –Gennemsøger LISTE og returnerer et element, der opfylder TEST –Hvis flere elementer opfylder TEST, returneres et vilkårligt af disse –Hvis ingen elementer opfylder TEST, returneres null (den tomme pointer) 3 public TYPE findOne( PARAM ) { for ( TYPE elem : LISTE ) { if ( TEST(elem, PARAM) ) { return elem; } return null; }

4 En anden algoritmeskabelon 4 public ArrayList findAllPixels(int color) { ArrayList result = new ArrayList (); for ( Pixel p : pixels ) { if ( p.getColor() == color ) { result.add(p); } return result; } public ArrayList findAllPersons(String q) { ArrayList result = new ArrayList (); for ( Person p : persons ) { if (p.getName().contains(q)) { result.add(p); } return result; } Finder alle pixels med den angivne farve Finder alle, hvis navn indeholder den angivne textstreng Finder alle elementer, der opfylder betingelsen

5 findAll = finder alle elementer Algoritmeskabelon –Gennemsøger LISTE og returnerer en arrayliste med alle elementer, der opfylder TEST –Hvis ingen elementer opfylder TEST, er arraylisten tom –Video 4.2 fra BlueJ bogen behandler et eksempel på denne algoritmeskabelon 5 public ArrayList findAll( PARAM ) { ArrayList result = new ArrayList (); for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result.add(elem); } return result; }

6 Lad os kigge lidt nærmere på findAll Lad os bibeholde de grønne dele, men udskifte de blå 6 public ArrayList findAll( PARAM ) { ArrayList result = new ArrayList (); for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result.add(elem); } return result; } Initialisering af resultat variabel Opdatering af resultat variabel Resultat type Returner resultat Start på for-each løkke TEST af element Parameter

7 Ny algoritmeskabelonfindNoOf = finder antal elementer 7 public int findNoOf( PARAM ) { int result = 0; for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result++; } return result; } Initialisering Opdatering Algoritmeskabelon –Gennemsøger LISTE og returnerer antallet af elementer, der opfylder TEST Hvad gør denne algoritmeskabelon?

8 Endnu en algoritmeskabelon findSumOf = finder summen af elementerne 8 public int findSumOf( PARAM ) { int result = 0; for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result += VALUE(elem, PARAM); } return result; } Opdatering Beregner værdi ved hjælp af VALUE, f.eks. – farven i et Pixel-objekt – længden af navnet i et Person-objekt Algoritmeskabelon –Gennemsøger LISTE og returnerer SUMMEN af de enkelte elementers værdier (beregnet ved hjælp af VALUE) –Hvis man undlader TEST (og fjerner if-sætningen), summerer man over alle elementer i LISTE Hvad gør denne algoritmeskabelon? Initialisering

9 Sammenligning af de fire algoritmeskabeloner Fælles –Alle skabeloner gennemsøger en arrayliste og tjekker hvert enkelt element i listen op mod en angiven betingelse (der kan afhænge af parametre) –Betingelsen involverer kun det element i listen, der pt. undersøges Forskelle –findOne returnerer ét element, der opfylder den angivne betingelse (og stopper så snart en sådant element er fundet) –findAll returnerer en arrayliste med alle de elementer, der opfylder den angivne betingelse –findNoOf returnerer antallet af elementer, der opfylder den angivne betingelse –findSumOf returnerer summen af værdierne af de elementer, der opfylder den angivne betingelse 9 SkabelonInitialiseringOpdatering findAlltom listeadd findNoOf0+= 1 findSumOf0+= VALUE Alle eksamensopgaver indeholder spørgsmål, som kan løses ved hjælp af algoritmeskabeloner

10 Eksempler på findNoOf 10 public int findNoOfPixels(int color) { int result = 0; for ( Pixel p : pixels ) { if ( p.getColor() == color ) { result++; } return result; } public int findNoOfPersons(String q) { int result = 0; for ( Person p : persons ) { if (p.getName().contains(q)) { result++; } return result; } Finder antal pixels med den angivne farve Finder antal personer, hvis navn indeholder den angivne textstreng Finder antal elementer, der opfylder betingelsen

11 Eksempler på findSumOf 11 public int findSumOfDarkPixels(int color) { int result = 0; for ( Pixel p : pixels ) { if ( p.getColor() <= color ) { result += p.getColor(); } return result; } public int findSumOfTeenagers() { int result = 0; for ( Person p : persons ) { if ( 13 <= p.getAge() && p.getAge() <= 19 ) { result += p.getAge(); } return result; } Finder summen af mørke pixelværdier Finder summen af teenageres alder Finder summen af de elementer, der opfylder betingelsen

12 ● Primitive typer i Java double d; int i; byte short int long 8 bit16 bit32 bit 64 bit Heltal ≤ 12 X ≤ Y angiver at udtryk af type X kan assignes til variabler af type Y char 16 bit Tegn boolean 1 bit Sandhedsværdier d = 7; i = 3.5; Eksempel: Lovligt: int ≤ double Ulovligt: Man kan ikke proppe en stor værdi ind i en lille variabel Man må gerne assigne en lille værdi til en stor variabel Reelle tal 32 bit 64 bit float double ≤ ≤ ≤ ≤ ≤

13 Forfremmelse og begrænsning En værdi kan forfremmes til en "større type" Lovligt: integer udtrykket 7 bliver forfremmet til typen double d = 7; i = d; i = (int) 3.5; En værdi kan begrænses til en "mindre type" Lovligt: double udtrykket 3.5 bliver begrænset til typen int Ulovligt: Man kan ikke proppe en stor værdi ind i en lille variabel Håndteres automatisk af compileren (når det er nødvendigt) Kræver et type-cast (indsat af programmøren) type-cast

14 Eksempler på forfremmelse og begrænsning (int) (12 / 2.5) (int) (12.0 / 2.5) (int) 4.8 4 14 9 + 6 * 2 / (int) -3.5 6 / (int) (2 / 2.5) = 5 12 forfremmes til 12.0 4.8 begrænses til 4 ved at smide decimalbrøken væk Hvad er værdien af dette udtryk? Er nedenstående erklæringer lovlige? double d = 7; int i = d; Selv om d har værdien 7 kan den ikke assignes til heltals variablen i Det er typen der er afgørende Ikke den øjeblikkelige værdi

15 Konstanter (literals) TypeLiteral byte15 short-3215 int45320 long45320L float15.03e5F double15.03e5 char'a' booleanfalse 15 Objekt type Wrapper type Byte Short Integer Long Float Double Character Boolean Primitive typer String"hello" Objekt typer

16 ● Identitet versus lighed (magen til) Java == identitet equalslighed (magen til) I det virkelige liv skelner vi mellem objekter, der er identiske, og objekter, der ligner hinanden –To personer er ikke identiske, selvom de hedder det samme og er født samme dag (har samme attributværdier). –Hvis man fortæller tjeneren, at man vil have den Pizza, som står på nabobordet, kommer han med en der ligner (dvs. er magen til). 16 Metode i Object klassen (redfineres i mange underklasser, f.eks. String) Operator

17 Identitet mellem objekter 17 p1 == p2 evaluerer til false :Person "Jill" p2 Person "Fred" p1 Person p1 == p2 evaluerer til false :Person "Fred" p2 Person "Fred" p1 Person p1 == p2 evaluerer til true :Person "Jill" p2 Person "Fred" p1 Person Operatoren == tester for identitet –Det er ikke nok, at de to objekter har samme attributværdier –Nedenfor peger p1 og p2 på samme objekt

18 Sammenligning af strenge if( input == "stop" ) {... } == tester identitet Testet evaluerer til false String input = reader.getInput(); equals tester lighed (magen til) Strenge skal altid sammenlignes ved hjælp af equals metoden fra String klassen 18 Eksempel – eller true, hvis det er en smart compiler if( input.equals("stop") ) {... } Testet evaluerer til true Næste input Test ved hjælp af equals metoden Lad os antage, at input derved har fået værdien "stop" "stop" input String "stop" String Test ved hjælp af == operatoren

19 ● Opfølgning på Skildpadde opgaven Fakultets funktionen n! er defineret ved 19 public int faculty(int n) { int result = 1; for (int i=2; i<=n; i++) { result *= i; } return result; } n! = 1 * 2 *...* (n-2) * (n-1) * n for n ≥ 1 Beregning ved hjælp af en for-løkke 5! = 1 * 2 * 3 * 4 * 5 = 120 1! = 1

20 Fakultets funktionen (rekursiv) Fakultets funktionen kan også defineres rekursivt, dvs. ved hjælp af sig selv 20 public int faculty(int n) { if (n == 1) return 1; return faculty(n-1) * n; } n! = 1 for n = 1 n! = (n-1)! * n for n ≥ 1 Rekursiv metode til beregning af n! Rekursion ≈ Induktionsbeviser

21 Fibonacci tallene Nedenstående talfølge, hvor hvert tal er lig summen af de to foregående 21 public int fibonacciLoop(int n) { if (n == 1) return 0; int first = 0; int second = 1; int temp; for (int i=3; i<=n; i++) { temp = second; second += first; first = temp; } return second; } 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, … Beregning ved hjælp af en for-løkke

22 Fibonacci funktionen (rekursiv) Rekursiv definition 22 public int fibonacci(int n) { if (n == 1) return 0; if (n == 2) return 1; return fibonacci(n-2) + fibonacci(n-1); } fib(1) = 0 fib(2) = 1 fib(n) = fib(n-2) + fib(n-1) for n ≥ 2 Rekursiv beregning

23 Koch kurver 23 n = 1 n = 2 n = 3 n = 4 n = 5 n = 4 Koch(n) Koch(n-1) public void kochCurve(int n, double length) { if ( n == 0 ) { move(length); } else { kochCurve(n-1, length/3); turn(-60); kochCurve(n-1, length/3); turn(120); kochCurve(n-1, length/3); turn(-60); kochCurve(n-1, length/3); } Rekursiv metode n = 0 n ≥ 1

24 Sierpinksi kurver 24 Sierpinksi(n) public void sierpinskiCurve(int n, int length) { if ( n == 0 ) { triangle(length); } else { sierpinskiCurve(n-1, length/2); turn(-60); move(length/2); turn(60); sierpinskiCurve(n-1, length/2); turn(60); move(length/2); turn(-60); sierpinskiCurve(n-1, length/2); move(-length/2); } Rekursiv metode n = 1 n = 2 n = 3 Sier(n-1) n = 0 n ≥ 1

25 Skildpadde på kængurustylter 25 Lad os nu antage, at skildpadden har taget kængurustylter på –Den afsætter kun en plet, når den lander –Den hopper rundt mellem tre punkter –Men den er nybegynder, så den når aldrig helt hen til punkterne

26 ● Afleveringsopgave: Billedredigering I får ”udleveret” et projekt med nedenstående to klasser –Samme som i billedredigering i mandagsforelæsningen 26

27 Afleveringsopgave – fortsat I skal implementere en række billedoperationer på gråtone billeder 27 Lysere og mørkere Spejling vandret og lodret Invertering (lys ↔ mørk) Udjævning (uskarpt) Skalering Original

28 ● Opsummering Fire algoritmeskabeloner, som alle tjekker elementer i en arrayliste op mod en angiven betingelse –findOne returnerer ét element –findAll returnerer en arrayliste med alle elementer –findNoOf returnerer antallet af elementer –findSumOf returnerer summen af værdierne Primitive typer –Regler for assignments og parametre (bestemt via ≤ relation) –Forfremmelse (til større type) og begrænsning (til mindre type) –Konstanter og Wrapper klasser Identitet versus lighed –For objekter generelt –Strenge skal altid sammenlignes ved hjælp af equals metoden Rekursive metoder Afleveringsopgave: Billedredigering 28

29 Det var alt for nu….. … spørgsmål 29


Download ppt "Algoritmeskabeloner findOne, findAll, findNoOf, findSumOf Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder."

Lignende præsentationer


Annoncer fra Google