Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Repetition af dIntProg v/ Morten D. Bech. Tour de force Variabler Løkker Comparable ImErKo-reglen Eksamenssæt dIntProg, E13.

Lignende præsentationer


Præsentationer af emnet: "Repetition af dIntProg v/ Morten D. Bech. Tour de force Variabler Løkker Comparable ImErKo-reglen Eksamenssæt dIntProg, E13."— Præsentationens transcript:

1 Repetition af dIntProg v/ Morten D. Bech

2 Tour de force Variabler Løkker Comparable ImErKo-reglen Eksamenssæt dIntProg, E13

3 Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;

4 dIntProg, E13 Erklæringer i Java Reglen i Java er at alle navne skal erklæres (eller importeres) før de kan bruges –Eneste undtagelse er navne fra java.lang der automatisk importeres til alle filer (String, Math, Thread,...) Navne kan erklæres i filer (gælder dog kun navne på klasser), i klasser og i metoder –I denne sammenhæng skal vi indskrænke os til at betragte navne på variabler (herunder parametre) erklæret i klasser og metoder Forskel på klasser og metoder –Som vi skal se i det følgende, er der lidt forskel på reglerne for variabler erklæret i klasser og variabler erklæret i (blokke i) metoder

5 public class Date { private int day; private int month; private int year; public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); } private int daysInMonth() { int[] daysInMonth = {0,31,28,...}; int res; res = daysInMonth[month]; // special case:.. if (month == 2 && isInLeapYear()) { res++; } return res; } public class Date { private int day; private int month; private int year; public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); } private int daysInMonth() { int[] daysInMonth = {0,31,28,...}; int res; res = daysInMonth[month]; // special case:.. if (month == 2 && isInLeapYear()) { res++; } return res; } dIntProg, E13 Tre slags variabler Feltvariabler Parametre Lokale variabler Field variables, parameters, and local variables

6 dIntProg, E13 Feltvariabler En klasse definerer et navnerum hvor alle navne erklæret i klassen er tilgængelige overalt i klassen (med mindre...). public class Scope { public Scope() { i = 0; } public void addOne() { i = i + 1; } int i; public void addTwo() { i = i + 2; } public int value() { return i; } public class Scope { public Scope() { i = 0; } public void addOne() { i = i + 1; } int i; public void addTwo() { i = i + 2; } public int value() { return i; }

7 dIntProg, E13 Parametre En metode definerer et navnerum hvor parametre til metoden er tilgængelige overalt i metoden (med mindre...). public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); } public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); }

8 dIntProg, E13 Lokale variabler I en metode (funktion) definerer en blok {...} et navnerum hvor alle navne erklæret i blokken er tilgængelige efter erklæringen og indtil blokkens afslutning. public void pip() { x = x++; // error! int x = 0; x++; } public void pip() { x = x++; // error! int x = 0; x++; }

9 public void pip() { int i = 0; { i++; System.out.println(i); int x = 0; x = i; x++; i++; System.out.println(x); } System.out.println(i); } public void pip() { int i = 0; { i++; System.out.println(i); int x = 0; x = i; x++; i++; System.out.println(x); } System.out.println(i); } dIntProg, E13 Indre blokke I en blok kan man erklære indre blokke { {... } }. Reglen for indre blokke er den samme som reglen for blokke i metoder (forrige slide). Virkefelt for x

10 public void pip() { i = j; // Fejl, j virker ikke her! int j = 0;... { i++; System.out.println(i); j++; System.out.println(j); }... } public void pip() { i = j; // Fejl, j virker ikke her! int j = 0;... { i++; System.out.println(i); j++; System.out.println(j); }... } dIntProg, E13 Et navn virker i indre blokke Hvad er virkefeltet for int j ? Virkefelt for j

11 public class Scope { public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println(i); int i = 0; i++; System.out.println(i); } public static void testMethod() { Scope s = new Scope(); s.pip(); } int i; } public class Scope { public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println(i); int i = 0; i++; System.out.println(i); } public static void testMethod() { Scope s = new Scope(); s.pip(); } int i; } dIntProg, E13 Og dog... Hvad sker der når vi oversætter (og evt. afvikler) følgende program?

12 dIntProg, E13 En forklaring på “(med mindre...)” Hvad er virkefelterne for de to int i ’er ? public class Scope { public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println(i); int i = 0; i++; System.out.println(i); } public static void testMethod() { Scope s = new Scope(); s.pip(); } int i; } public class Scope { public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println(i); int i = 0; i++; System.out.println(i); } public static void testMethod() { Scope s = new Scope(); s.pip(); } int i; } Virkefelt for ydre i Virkefelt for indre i

13 dIntProg, E13 Virkefeltsregler i Java En variabel erklæret i en klasse virker overalt i klassen med undtagelse af –virkefeltet for eventuelle ens-benævnte variabler erklæret i (blokke i) klassens metoder. En variabel erklæret i en blok virker overalt i blokken med undtagelse af –den del af blokken der går forud for erklæringen –virkefeltet for eventuelle ens-benævnte variabler erklæret i indre blokke i blokken.

14 dIntProg, E13 Kontrolvariabel i for-løkke svarer til Konstruktionen for (int j=0; j<4; j++) { System.out.println(j); } for (int j=0; j<4; j++) { System.out.println(j); } { int j; for (j=0; j<4; j++) { System.out.println(j); } { int j; for (j=0; j<4; j++) { System.out.println(j); }

15 Antagelse: Feltvariable er erklæret øverst i klasse Metode: Gå op og ud indtil en erklæring nås Scope gælder fra erklæring til blok-slut Hvilken variabel? public class Scope { private int i; public Scope (int i) { i = i + 1; System.out.println(“a “ + i); } public void foo() { System.out.println(“b “ + i); for (int i = 0; i < 3; i ++){ System.out.println(“c “ + i); } System.out.println(“d “ + i); } new Scope(1).foo(); public class Scope { private int i; public Scope (int i) { i = i + 1; System.out.println(“a “ + i); } public void foo() { System.out.println(“b “ + i); for (int i = 0; i < 3; i ++){ System.out.println(“c “ + i); } System.out.println(“d “ + i); } new Scope(1).foo(); dIntProg, E13

16 public class Scope { private int i; public Scope(int i) { i = i + 1; System.out.println(“a” + i); } public void foo() { System.out.println(“b” + i); for(int i = 0; i < 3; i++){ System.out.println(“c” + i); } System.out.println(“d” + i); } new Scope(1).foo(); public class Scope { private int i; public Scope(int i) { i = i + 1; System.out.println(“a” + i); } public void foo() { System.out.println(“b” + i); for(int i = 0; i < 3; i++){ System.out.println(“c” + i); } System.out.println(“d” + i); } new Scope(1).foo(); dIntProg, E10Virkefelt.16 Hvilken variabel refereres til? 1. 2. 3. 4. Ingen (compilerfejl) 5. Ved ikke

17 Iteration for- og for-each-løkker

18 Motivation for løkker Gentagelser Mere overskuelig kode Dynamisk kode dIntProg, E13

19 for-løkke dIntProg, E13 for(init; betingelse; inkrementering) { statements } int sum = 0; int[] values = {1,2,3,4}; for(int i=0; i<values.length; i++) { sum += values[i]; }

20 for-each-løkke dIntProg, E13 for(type variabel: collection) { statements } for(Die d: dies) { d.roll(); }

21 Brug for-løkke –Iteration over arrays (T[]) –Forskellig handling/operation ud på elementerne –Matematisk sum for-each-løkke –Iteration over lister (Collection ) –Ens handling/operation udført på alle elementer –find-én og find-alle dIntProg, E13

22 Comparable Sammenligning af objekter

23 Afkobling af programkomponenter Collections T min(Collection c) void sort (List l)... > Comparable Person Terning Track dIntProg, E13

24 Ansvarsfordeling over Atlanten (1) dIntProg, E13 min(myList) Collections Comparable : Driver e.compareTo(res) e: T

25 Ansvarsfordeling over Atlanten (2) public T min(List l) { T res; res= l.get(0); // res == min element so far for ( T e : l ) { if ( e.compareTo(res) < 0 ) { res= e; } return res; } dIntProg, E13 public class Driver { public void run() { ArrayList myList; myList= new ArrayList ();... Track t= Collections.min(myList); } Comparable public class Track implements Comparable {... public int compareTo(Track t) {... }

26 dIntProg, E13 Checkliste for Comparable (1) Antagelse –vi har en liste med elementer af typen T: ArrayList lst; –vi ønsker at kunne udføre standardoperationer der fordrer en naturlig ordning (f.eks. max(lst) og sort(lst) fra Collections) Lad klassen T implementere Comparable : public class T implements Comparable {... public int compareTo(T t) { return... }

27 dIntProg, E13 Checkliste for Comparable (2) Det er underforstået at det er den naturlige ordning der anvendes ved kald af standard-operationer: ArrayList lst;... T res= Collections.max(lst);... Collections.sort(lst);

28 Eksamensprojekt 1, 2007 Opgave 9 –Programmér metoden widestRange. Metoden skal returnere flytypen med størst rækkevidde (range). Hvis flere flytyper har samme rækkevidde, er det underordnet hvilken af disse der returneres. Udvid Plane-klassen med de nødvendige get- metoder. dIntProg, E13

29 ImErKo IMporter ERklær initialiser i KOnstruktør

30 Realisering af en-til-mange (ImErKo) For at realisere en en-til-mange relation i koden skal man : 1.Importere en collection (f.eks. en liste) import java.util.ArrayList; 2.Erklære en attribut af passende type private ArrayList persons; 3.Initialisere collection’en i Konstruktøren public AddressBook(){ persons = new ArrayList (); } dIntProg, E13

31 Realisering af en-til-mange Hvilken af nedenstående kodestumper realiserer en-til-mange relationen i diagrammet ovenover? B * import java.util.*; public class A { private ArrayList list; public A(){ list= new ArrayList (); } import java.util.*; public class A { private ArrayList list; public A(){ list= new ArrayList (); } import java.util.*; public class B { private ArrayList list; public B(){ list= new ArrayList (); } import java.util.*; public class B { private ArrayList list; public B(){ list= new ArrayList (); } 1. 2. 4. 3. 5. Ingen af ovenstående A 6. Flere af ovenstående

32 Eksamensprojekt 1, 2012


Download ppt "Repetition af dIntProg v/ Morten D. Bech. Tour de force Variabler Løkker Comparable ImErKo-reglen Eksamenssæt dIntProg, E13."

Lignende præsentationer


Annoncer fra Google