Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Forelæsning Uge 4 – Mandag

Lignende præsentationer


Præsentationer af emnet: "Forelæsning Uge 4 – Mandag"— Præsentationens transcript:

1 Forelæsning Uge 4 – Mandag
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 p1 == p2 evaluerer til false "Jill" p2 Person "Fred" p1 På Projekt Euler og CodingBats findes en masse ekstra opgaver, hvor I kan øve jer i Java programmering, hvis I har tid tilovers. Links øverst på Ugeoversigten

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

3 findOne = finder ét element
public TYPE findOne( PARAM ) { for ( TYPE elem : LISTE ) { if ( TEST(elem, PARAM) ) { return elem; } return null; For-each løkke (gennemløb af LISTE) Test af betingelse Så snart vi finder et element, der opfylder TEST, returneres dette (hvorpå algoritmen terminerer) 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)

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

5 findAll = finder alle elementer
public ArrayList<TYPE> findAll( PARAM ) { ArrayList<TYPE> result = new ArrayList<TYPE>(); for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result.add(elem); } return result; For-each løkke (gennemløb af LISTE) Test af betingelse Elementer, der opfylder TEST, tilføjes til arraylisten result 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

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

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

8 findSumOf = finder summen af elementerne
Endnu en algoritmeskabelon public int findSumOf( PARAM ) { int result = 0; for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result += VALUE(elem, PARAM); } return result; Hvad gør denne algoritmeskabelon? Initialisering 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 (beregnet ved hjælp af VALUE) af de elementer, der opfylder TEST Hvis man undlader TEST (og fjerner if-sætningen), summerer man over alle elementer i LISTE

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 et 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 SKOBUTIK BETINGELSEN TESTER SKOENES FARVE EN RØD SKO ALLE RØDE SKO ANTALLET AF RØDE SKO SAMLEDE PRIS FOR ALLE RØDE SKO Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af algoritmeskabeloner Skabelon Initialisering Opdatering findAll tom liste add findNoOf += 1 findSumOf += VALUE

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

11 Eksempler på findSumOf
Finder summen af de elementer, der opfylder betingelsen public int findSumOfDarkPixels(int color) { int result = 0; for ( Pixel p : pixels ) { if ( p.getColor() <= color ) { result += p.getColor(); } return result; Finder summen af mørke pixelværdier ClickerQuiz 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 teenageres alder

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

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

14 Eksempler på forfremmelse og begrænsning
Hvad er værdien af dette udtryk? (int) (12 / 2.5) (int) (12.0 / 2.5) (int) 4.8 4 12 forfremmes til 12.0 4.8 begrænses til 4 ved at smide decimalbrøken væk 9 + 6 * 2 / (int) -3.5 = 5 6 / (int) (2 / 2.5) 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)
Type Literal byte 15 short -3215 int 45320 long 45320L float 15.03e5F double 15.03e5 char 'h' boolean false Wrapper type Byte Short Integer Long Float Double Character Boolean Primitive typer Objekt typer Pause Objekt type String "hello"

16 ● Identitet versus lighed (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). Java == identitet equals lighed (magen til) Operator Metode i Object klassen (redefineres i mange underklasser, f.eks. String)

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

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

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

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

21 Fibonacci tallene Nedenstående talfølge, hvor hvert tal er lig summen af de to foregående 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, … Beregning ved hjælp af en for-løkke 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; Lidt svær at gennemskue, hvad der sker i løkken

22 Fibonacci funktionen (rekursiv)
Rekursiv definition fib(1) = 0 fib(2) = 1 fib(n) = fib(n-2) + fib(n-1) for n ≥ 2 Rekursiv beregning public int fibonacci(int n) { if (n == 1) return 0; if (n == 2) return 1; return fibonacci(n-2) + fibonacci(n-1); } Samme værdi beregnes mange gange Elegant, men ikke effektivt fibonacci(4) fibonacci(2) fibonacci(3) fibonacci(0) fibonacci(1) fibonacci(1) fibonacci(2) Rekursion er utrolig nyttigt og anvendes meget fibonacci(0) fibonacci(1)

23 Koch kurver Rekursiv metode n = 0 Koch(n) n ≥ 1 n = 1 n = 2 n = 3
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); } n = 3 n = 4 n = 4 n = 5

24 Sierpinksi kurver Rekursiv metode n = 0 Sierpinksi(n) n ≥ 1 n = 1
Sier(n-1) n ≥ 1 n = 1 Rekursiv metode 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); turn(60); move(length/2); turn(-60); move(-length/2); } n = 2 n = 3

25 Skildpadde på kængurustylter
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 Demo

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

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

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 Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af algoritmeskabeloner

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


Download ppt "Forelæsning Uge 4 – Mandag"

Lignende præsentationer


Annoncer fra Google