De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Hoofdstuk 6: Controle structuren

Verwante presentaties


Presentatie over: "Hoofdstuk 6: Controle structuren"— Transcript van de presentatie:

1 Hoofdstuk 6: Controle structuren

2 Soms verschillende acties nodig afhankelijk van bepaalde condities
Voorbeeld: Auto’s met twee assen betalen 100fr tol de andere 200fr Als aantal assen = 2 dan tol = 100 anders tol = 200 conditie variabelen Actie indien conditie voldaan Actie indien Conditie niet voldaan

3 if statement Java if (assen == 2) tol = 100 ; else tol = 200 ;
conditie Sleutelwoorden Actie wordt enkel uit-gevoerd indien conditie waar is Actie wordt enkel uit- gevoerd indien conditie niet waar is

4 conditie Statements uit te voeren als conditie true is Statements uit te voeren als conditie false is false true

5 … assen = Integer.parseInt(br.readLine () ); if (assen == 2)
tol = 100 ; else tol = 200 ; System.out.println( tol) ; ... assen== 2 tol = 100 true tol = 200 false assen = Integer.parseInt(br.readLine () ); System.out.println( tol) ;

6 if statement (2) Twee alternatieven:
if (conditie) statement1 else statement2 Geen actie als conditie niet voldaan: if (conditie) statement

7 If - eenvoudig voorbeeld
uur = uur + 1; if (uur == 24) uur = 0 ; }

8 if statement - meerdere statements
Meer dan één statement if (x > y) { System.out.print(x) ; System.out.print(“ is groter dan “); System.out.print(y): } else { System.out.print(x) ; System.out.print(“ is niet groter dan “); System.out.print(y); Samengesteld statement

9 If - eenvoudig voorbeeld
public void tik () { // methode in de klasse Tijdstip sec = sec + 1 ; if (sec == 60) { sec = 0 ; min = min + 1; } if (min == 60) { min = 0 ; uur = uur + 1 if (uur == 24) uur = 0 ;

10 if statement - de conditie
De conditie moet bij evaluatie true (waar) of false (onwaar) opleveren Vb: vergelijking tussen getallen < kleiner dan vb: 8 < 10 of 20 < 10 > groter dan vb: 8 > 1 of x > 30 == gelijk vb: 8 == 1 of x == 30 <= kleiner of gelijk vb: 8 <= 10 of x <= y >= groter of gelijk vb: 8 >= 10 of x >= y != niet gelijk vb: 8 != 10 of x != y

11 boolean type Primitief data type boolean Twee waarde: true en false
Te gebruiken zoals andere typen Meer later

12 if statement - meerdere gevallen
Vb. 3 gevallen: Uren <= 40 Uren > 40 en <= 60 Uren > 60 if (uren <= 40) System.out.print(“Geen overuren”) ; else if (hours <= 60) System.out.print(“ Overuren“); else System.out.print(“Dubbele overuren); Cascade if/else

13 Cascade if statement Alternative notatie:
if (uren <= 40) System.out.print(“Geen overuren”) ; else if (hours <= 60) System.out.print(“ Overuren“); else System.out.print(“Dubbele overuren);

14 Genestelde if statements
if (uren <= 60) if (hours > 40) System.out.print(“ Overuren“); else System.out.print(“Geen overuren); System.out.print(“Dubbele overuren); Genestelde if/else

15 Genestelde if statements (2)
Opgelet if (uren <= 60) { if (hours > 40) System.out.print(“ Overuren“); } else System.out.print(“Dubbele overuren);

16 Meer over het boolean type
Boolean variabelen boolean isKoud ; if (temp < 5) isKoud = true ; else isKoud = false; if (isKoud) System.out.println(“Brrrrrr!”) ;

17 Meer over het boolean type (2)
Predicaat methode Methode die een boolean waarde terug geeft Te gebruiken als conditie Vb: public boolean equals (Name n) { … } if (name1.equals(name2)) System.out.println (“namen zijn gelijk”); else System.out.println (“namen zijn gelijk”);

18 Meer over het boolean type (3)
Boolean expressies Waarde is een boolean Vb: temp < 5 public boolean Koud (Int temp ) { return (temp < 5) ; }

19 Logische operatoren expressie && expressie logische “and”
True als beide expressies true zijn Vb: (uur == 12) && (min == 10)

20 Logische operatoren (2)
expressie || expressie logische “or” True als één van beide expressies true is Vb: (uur == 12 ) || (uur == 10)

21 Logische operatoren (3)
! expressie logische “not” True als de expressie false is Vb: ! (uur == 12)

22 Voorrangsregels voor logische operatoren
Van hoogste naar laagste prioriteit ! && || Gebruik bij voorkeur haakjes If uur < 12 || min == 60 && sec == 60 If (uur < 12 ) || (min == 60 && sec == 60)

23 Evaluatie van logische expressies
Evaluatie gebeurt van links naar rechts en stop indien resultaat gekend is (x != 0) && ( (y/x) > 10 ) Indien x = 0 is expressie false en (y/x) > 10 wordt niet meer uitgevoerd

24 Logische operatoren en if-statements
Zijn equivalent if (conditie1 && conditie2) statement if (conditie1) if (conditie2) statement if (conditie1) statement else if (conditie2) if (conditie1 || conditie2) statement

25 Voorbeeld Ontwerp een klasse voor het manipuleren van tijdstippen binnen een periode van 24-uren. Uren en minuten zijn voldoende. We willen de am/pm notatie gebruiken class Time

26 Time vb - Bepaal het gedrag
We willen het volgende gedrag Maak een nieuw tijdstip aan Ga na of het tijdstip vóór een gegeven tijdstip valt Ga na of het tijdstip na een gegeven tijdstip valt Maak een nieuw tijdstip door een tijdsperiode toe te voegen aan een tijdstip Druk het tijdstip af op een PrintStream

27 Time vb - Bepaal de interface
Class name: Time Constructor: Vb: Time t1 = new Time(10, 15, “am”); public Time(int hours, int minutes, String amOrPm) Test of vóór een bepaald tijdstip : Vb: t1.isBefore(t2) public boolean isBefore( Time t) Test of na een bepaald tijdstip : Vb: t1.isAfter(t2) public boolean isAfter( Time t)

28 Time vb - Bepaal de interface (2)
Afdrukken van een tijdstip: Vb: t1.print(System.out) ; public void print( PrintStream ps) Nieuw tijdstip door toevoegen van een tijdsduur aan een tijdstip: Vb: t3 = t1.addDuration(30) ; t4 = t1.addDuration(3, 30) ; public Time AddDuration( int minutes) public Time AddDuration( int hours, int minutes)

29 Time vb - Een vb-programma
import java.io.*; class TryTime { public static void main(String[] arg) { Time t1= new Time(10, 15, “am”); Time t2= new Time(3, 10, “pm”); Time t3= t2.addDuration(30); //voeg 30 minuten toe t3.print(System.out) ; System.out.println() ; Time t4= t2.addDuration(3, 30); //voeg 3 uur en 30 minuten toe t4.print(System.out) ;

30 Time vb - Een vb-programma (rest)
Time ealier , later ; if (t3.isBefore(t4) ) { earlier = t3; later = t4: } else { earlier = t4; later = t3: earlier.print(System.out) ; System.out.print(“ is eerder dan “) ; later.print(System.out) ; System.out.println() ;

31 Time vb - Klasse skelet class Time {
public Time( int hours, int minutes, String amOrPm) { statements } // is eerder public boolean isBefore(Time t) { // is later public boolean isAfter(Time t) { // schrijf naar een PrintStream; public void print(PrintStream ps) {

32 Time vb - Klasse skelet (2)
// voeg minuten toe; public Time addDuration(int minuten) { statements } // voeg uren en minuten toe; public Time addDuration(int hours, int minuten) { instantie variabelen indien nodig

33 Time vb - De instantie variabelen
We kiezen om de tijd uit te drukken als het totaal aantal minuten na middernacht (12.00 am) Vb 1: 3.20 am = 3 x 60 min + 20 min = 200 min Vb 2: 3.20 pm = (12 + 3) x 60 min + 20 min = 920 min Class Time { // instantie variabelen private int totalMinutes ; ... }

34 Time vb - Implementatie
De methode isBefore public boolean isBefore(Time t) { if ( this.totalMinutes < t.totalMinutes ) return true; else return false } of nog return this.totalMinutes < t.totalMinutes ; De methode isAfter return this.totalMinutes > t.totalMinutes ;

35 Time vb - Implementatie (2)
De constructor Time Uren te vermeerderen met 12 Uren sinds middernacht is 0 12 am 1 am 12 pm 1 pm Uren wijzigen niet public Time (int hours, int minutes, String amOrPm) { if ( amOrPm.equals(“am”) ) { if (hours == 12 ) hours = 0 ; } else // pm if (hours != 12) hours += 12 ; totalMinutes = hours * 60 + minutes ;

36 Time vb - Implementatie (3)
De methode print Hier moeten we totaal aantal minuten terug omzetten naar uren en minuten Stap 1: uren int hours = this.totalMinutes / 60 ; Stap 2: namiddag (uren >= 12) ? Ja, -12 uur Neen, O wordt 12 am if (hours > 12) { isAfternoon = true ; if (hours > 12) hours -= 12 ; } else { isAfternoon = false ; if (hours == 0) hours = 12 ; // 12 am

37 Time vb - Implementatie print
De methode print public void print (PrintStrean ps) { int hours = this.totalMinutes / 60 ; boolean isAfternoon ; if (hours >= 12) { isAfternoon = true ; if (hours > 12) //12 blijft 12 pm hours -= 12 ; //13 wordt 1pm , 14 wordt 2pm , …. } else { isAfternoon = false ; if (hours == 0) hours = 12 ; // 12 am ps.print(hours + “:” + totalMinutes%60) ; if (isAfternoon) ps.print(“ pm”); else ps.print(“ am”);

38 Time vb - Implementatie (4)
De methode addDuration Nieuw tijdstip door de gegeven minuten bij het totaal aantal van het tijdstip op te tellen (niet altijd correct - wanneer niet?) Echter dan constructor nodig die werkt met totaal aantal minuten private Time (int minutes) { this.totalMinutes = minutes ; } public Time addDuration (int minutes) { return new Time( this.totalMinutes + minutes) ; public Time addDuration (int hours, int minutes) { return new Time( hours* 60 + minutes + this.totalMinutes) ;

39 Herhalingen

40 Soms willen we bepaalde acties een aantal keer herhalen Voorbeeld:
Bereken het salaris voor alle werknemer. Zolang er nog een werknemer is doe bereken zijn salaris conditie Acties uit te voeren zolang de conditie voldaan is

41 conditie true Statements uit te voeren als conditie true is false

42 while statement Java while (conditie) body Uitvoering
De conditie is een boolean expressie Body is een statement of een samengesteld statement Uitvoering 1. De conditie wordt getest 2. Als de conditie false is stop de uitvoering 3. Als de conditie true is wordt body uitgevoerd en wordt vanaf 1 alles herhaald.

43 while statement - voorbeeld
Veronderstel klasse Werknemer met methoden leesIn, geefNaam, geefUren, geefSalPerUur Werknemer w = Werknemer.leesIn(); while (w != null) { System.out.println(“Werknemer “ + w.geefNaam() + “ verdient “ + (w.geefUren() * w.geefSalPerUur()); w = Werknemer.leesIn () ; } Lees de gegevens van de eerste werknemer Test of er een werknemer is Lees de gegevens van de volgende werknemer

44 while statement - voorbeelden
Verkeerde code Werknemer w ; while (w != null) { w = Werknemer.leesIn(); System.out.println(“Werknemer “ + w.geefNaam() + “ verdient “ + (w.geefUren() * w.geefSalPerUur()); } Werknemer w = Werknemer.leesIn(); w heeft geen waarde de eerste keer! Stop nooit indien eerste w niet null !

45 while statement - Lees/verwerk patroon
lees eerste item while (een geldig item is gelezen) { verwerk het item lees het volgende item }

46 Voorbeeld Bereken xY xY = 1 * x * x * … * x (y keer) Of nog
resultaat = 1 resultaat = resultaat * x Herhaal y keer Of nog resultaat = 1 teller = 0 ; tot zolang (teller != y) doe resultaat = resultaat * x teller = teller + 1

47 Voorbeeld (2) Zet de beginwaarde voor de conditie
Geeft beginwaarde aan variabele gebruikt in de loop private int mijnMacht( int x , int y) { int teller, //telt het aantal vermenigvuldigingen resultaat ; //houdt het tussentijdse resultaat van de // vermenigvuldigingen bij resultaat = 1 ; teller = 0 ; while (teller != y) { resultaat *= x ; teller ++ ; } return resultaat ; Zet de beginwaarde voor de conditie Zorgt uiteindelijk voor het resultaat Zorgt er voor dat de conditie uiteindelijk false zal worden

48 while statement - Algemeen patroon
Geef begin waarde aan de conditie while (conditie) { statements wijzig de conditie (zodat conditie uiteindelijk false wordt) }

49 while statement - “De tel-lus” patroon
Een aantal keer iets herhalen int teller = 0; // teller begint bij 0 while (teller != aantal) { ... teller++; }

50 while statement - “De teller” patroon
Tellen van bepaalde objecten int teller = 0 ; // teller begint bij 0 while (conditie) { ... if (dit moeten we tellen) teller++; }

51 Andere herhalingspatronen
De “accumulator” patroon “Het meest extreem object” patroon “De meest extreme waarde” patroon Zie later

52 for statement Is equivalent met
Alternatief voor de while-statement voor een “tel-lus” for ( initialisatie toekenningen; conditie ; increment) body Is equivalent met initialisatie toekenningen; while (conditie) { increment; }

53 for statement - voorbeeld 1
for ( initialisatie toekenningen; conditie ; increment) body Voorbeeld 1: som van 0 tot 100 for ( i = 0, som = 0 ; i <100 ; i ++) som += i ; Is equivalent met i = 0; som = 0; while (i <100 ) { som += i ; i ++; }

54 for statement - voorbeeld 2
for ( initialisatie toekenningen; conditie ; increment) body Voorbeeld 2: 10 eerste machten van 2 for ( i = 0, macht = 1 ; i <10 ; i ++, macht *= 2) System.out.println( “2 tot de macht “ + i + “ is “+ macht); Is equivalent met i = 0; macht = 1; while (i <10 ) { System.out.println( “2 tot de macht “ + i + “ is “+ macht); i ++; macht *= 2; }

55 do statement do { body} while conditie;
Alternatief voor de while-statement do { body} while conditie; Uitvoering 1. De body wordt uitgevoerd 2. Conditie wordt getest 3. Als de conditie false is stop de uitvoering 4. Als de conditie true is wordt vanaf 1 alles herhaald Gevolg: body wordt minstens één keer uitgevoerd

56 do statement - voorbeeld 1
Voorbeeld : som van 0 tot 100 i = 0; som = 0; do { som += i ; i ++; } while (i <100 );

57 do statement - voorbeeld 2
Voorbeeld : som van 0 tot j (variabele) i = 0; som = 0; do { som += i ; i ++; } while (i < j ); i = 0; som = 0; while (i <j ){ som += i ; i ++; } Niet altijd equivalent! - Wanneer niet?

58 Switch statement Een cascade if van de vorm
if (x == waarde1) statement1 else if (x == waarde2) statement2 else if (x == waarde3) statement3 else statement4 kan men vervangen door een switch switch (x) { case waarde1 : statement1 break; case waarde2 : statement2 case waarde3 : statement3 default: statement4 }

59 Switch statement (2) switch (x) { case waarde1 : statement1 break; case waarde2 : statement2 case waarde3 : statement3 default: statement4 } De case-waarden moeten constanten of literals zijn { } is niet nodig voor samengestelde statements Default case is niet verplicht Indien niet aanwezig en geen overeenstemmende waarde dan geen actie Break is noodzakelijk om te verhinderen dat ook de volgende case-statements worden uitgevoerd.

60 Switch statement - voorbeeld
public String naamDag (int d) { String naam; switch (d) { case 1 : naam = “Zondag” ; break; case 2 : naam = “Maandag” ; case 3 : naam = “Dinsdag” ; case 4 : naam = “Woesdag” ; case 5 : naam = “Donderdag” ; case 6 : naam = “Vrijdag” ; case 7 : naam = “Zaterdag” ; default: naam = “Onbekende dag” ; } return naam ;

61 Hoofdstuk 7: Objecten organiseren

62 Collecties Een collectie is een groepering van objecten
Een collectie is een object Java ondersteund verschillende soorten collecties, vb lijsten, verzamelingen Verschillende klassen Mogelijkheden met collecties Nieuwe collectie maken Object aan een collectie toevoegen De objecten in een collectie doorlopen

63 De klasse Vector Opeenvolging van objecten
Grootte past zich automatische aan Voorbeeld Vector v ; v = new Vector() ; String s; s = br.readline() ; while (s != null) { v.addElement(s) ; } v Vector object

64 De klasse Vector - voorbeeld
We willen een cijferlijst bijhouden voor een vak en voor elke student zijn cijfer vergelijken met het klas gemiddelde voor dat vak Klasse Cijferlijst Klasse Student

65 De klasse CijferLijst Gedrag Instantie variabelen
Construeer de cijferlijst, de gegevens bevinden zich op een bestand public CijferLijst(String bestandsNaam) Evalueer de studenten in de cijferlijst public void Evaluate() Instantie variabelen Vector voor de gegevens van de studenten Klas-gemiddelde

66 CijferLijst vb - Klasse skelet
class CijferLijst{ // instantie variabele private Vector students; private int klasGemiddelde ; public CijferLijst( String bestandsNaam ) { statements } public void Evaluate() {

67 CijferLijst vb - Implementatie (1)
Eerste Versie class CijferLijst{ public CijferLijst( String bestandsNaam ) throws IOException { students = new Vector() ; BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream( bestandsNaam))); Student student = Student.read(br) ; while (student != null) { students.addElement(student) ; student = Student.read(br) ; } We moeten echter ook het klas-gemiddelde berekenen. kan tegelijk met het inlezen

68 CijferLijst vb - Implementatie (2)
Tweede Versie public CijferLijst( String bestandsNaam ) throws IOException { students = new Vector() ; int totaal = 0 ; int aantal = 0 ; BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream( bestandsNaam))); Student student = Student.read(br) ; while (student != null) { students.addElement(student) ; totaal += student.getCijfer () ; aantal ++ ; student = Student.read(br) ; } klasGemiddelde = totaal / aantal ;

69 De klasse Vector - beperkingen
Een Vector is een collectie van objecten Primitieve data typen waarden kunnen niet rechtstreeks als elementen in een vector Wel via de enveloppe klasse Voorbeeld Vector v = new Vector () ; int i = 0; while (i < 3) { v.addElement(new Integer(i)) ; i++ ; } Integer-waarde eerst omzetten naar Integer-object

70 De klasse Vector - posities
Elk element bevindt zich op een welbepaalde positie (ook index genoemd) Nummering van de posities begint bij 0 Vector object positie 0 positie 1 positie 2 positie 3 Methode elementAt (int index) Geeft het element (als Object!) via zijn positie Grootte van de vector op te vragen door de methode size() ( = index van laatste element + 1)

71 De elementen van een Vector
Een Vector is een collectie van objecten Elk element wordt in een vector opgeslagen als een algemeen object. De methode elementAt (int index) geeft dan ook een algemeen object terug Omzetting naar het juiste type (conversie) kan soms nodig zijn Voorbeeld Student student = (Student) students.elementAt(k) ; Algemeen object Conversie

72 Elementen van een collectie opvragen
Patroon while (nog elementen) { x = volgende element; verwerk x ; } Voorbeeld: afdrukken van alle elementen int k = 0 ; while (k < v.size() ) { System.out.println (v.elementAt (k) ) ; k++ ; } k duidt het volgende af te drukken element aan

73 k duidt het volgende af te drukken element aan
int k = 0 ; while (k < v.size() ) { System.out.println (v.elementAt (k) ) ; k++ ; } k duidt het volgende af te drukken element aan v.size() - 1 v.size() -2 v 1 k Nog af te drukken v.size() - 1 v.size() -2 v 1 8 k Reeds afgedrukt Nog af te drukken v.size() - 1 v.size() -2 v 1 v.size() k Reeds afgedrukt

74 CijferLijst vb - Implementatie van Evaluate
public void Evaluate() { Student student ; int k = 0 ; while ( k < students.size() ) { student = (Student) students.elementAt(k) ; System.out.print (student.getNaam()); System.out.print (“ is “); if (student.getCijfer() >= klasGemiddelde) System.out.println(“beter dan het gemiddelde”); else System.out.println(“slechter dan het gemiddelde”); k++ ; }

75 CijferLijst vb - voorbeeld programma
class TryCijferLijst { public static void main (String[ ] args) throws IOException { CijferLijst lijst = new CijferLijst(“test”); lijst.evaluate () ; }

76 Voorbeeld - werken met posities
Druk de elementen van een vector af in omgekeerde volgorde int k ; // volgend af te drukken element k = v.size() -1 ; // achteraan beginnen while (k != -1) { System.out.println(v.elementAt(k)) ; k--; } v.size() - 1 v.size() -2 v 1 8 k Nog af te drukken Reeds afgedrukt

77 De klasse Vector - posities (2)
Methode insertElementAt( Object o, int i) Alle elementen vanaf positie worden 1 positie verschoven plaatst het object o op positie i v.size() - 1 v 1 i A voor B C Z Na v.insertElementAt(o,i) i v 1 A B C Z o

78 De klasse Vector - posities (3)
Methode removeElementAt( int i) verwijdert het element op positie i Alle elementen vanaf positie worden 1 positie terug geschoven i 9 v 1 voor o A B C Z v 1 i A Na v.removeElementAt(i) B C Z

79 De klasse Vector - zoeken
Ga na of een bepaald object voorkomt in een vector. Veronderstel dat de objecten strings zijn Eenvoudige werkwijze Check elk element één voor één, als element gevonden is stop dan Wordt sequentieel zoeken genoemd

80 Voorbeeld - zoeken (2) s te zoeken string (parameter)
k is de positie van het volgende te checken elementen int k ; // index van volgende te checken element k = 0 ; // vooraan beginnen while (nog elementen) en niet (element op positie k is gelijk aan s) { k++; // zoek verder } if geen elementen meer return -1 // betekent: niets gevonden else return k ; // index van gevonden element v.size() - 1 v.size() -2 v 1 8 k Reeds gecheckt Nog te checken

81 Voorbeeld - zoeken (3) int k ; // index van volgende te checken element k = 0 ; // vooraan beginnen while (nog elementen) en niet (element op positie k is gelijk aan s) { k++; } if geen elementen meer return -1 // betekent: niets gevonden else return k ; // index van gevonden element private int search ( String s) { int k ; // index van volgende te checken element k = 0 ; // vooraan beginnen while ( (k < v.size()) && ! (s.equals((String)v.elementAt(k))) ) { k++; } if (k == v.size()) return -1 else return k ;

82 voorbeeld - “Het meest extreem object” patroon
Het “extreem” object vinden in een groep van objecten. Vb: student met hoogste cijfer Student besteStudent = null; // variabele om het meest extreme object bij te // houden dat tot zover gevonden werd besteStudent = null; // nog geen extreem gevonden Student student; //variabele om element per element te testen int k = 0 ; //eerste element while ( k < students.size() ) { student = (Student) students.elementAt(k) ; if (besteStudent == null) || (student.getCijfer() > besteStudent.getCijfer()) besteStudent = student ; k++ ; //volgend element }

83 while statement - “Het meest extreem object” patroon
eenType extreem ; // variabele om het meest extreme object bij te // houden dat tot zover gevonden werd extreem = null ; //nog geen exterm object gevonden element = eerste element; while (nog element) { ... if (extreem == null) || element is meer extreem dan extreem extreem = element element = volgende element }

84 Array Lijkt op een vector Maar:
Sequentie van posities (index eerste positie is 0) Is een zelf ook een object Maar: Er is geen klasse voor Er zijn dus ook geen methoden voor arrays; wel ingebouwde symbolen Elementen van een array kunnen primitieve data typen bevatten Alle elementen van een array moeten van het zelfde type zijn (gegeven bij declaratie) Een array kan niet groeien

85 Array’s declareren type [ ] naam
Declareren van een referentie variabele voor een array type [ ] naam vben: int [ ] nummers ; String [ ] woorden ; Name [ ] namen ; Opgelet: Er wordt hierdoor geen array gemaakt, alleen een variabele om naar de array te verwijzen !

86 Array’s maken new type [ integer-waarde ]
integer-waarde specificeert het aantal elementen in de array vb: nummers = new int [6] ; Nummers is een array die 6 integers kan bevatten Nummers 2 3 4 5 1

87 Array’s manipuleren array-variabele.length
geeft de grootte van de array (= het aantal elementen dat de array kan bevatten) vb: nummers = new int [6] ; nummers.length 6

88 Array’s manipuleren (2)
Een waarde toekennen aan een element van een array array-variabele[ index ] = waarde type van array en van waarde moeten overeenkomen vb: nummers = new int [6] ; nummers[1] = 10 ; Array-elementen te gebruiken zoals variabelen nummers[2] = nummers[1] * 2 ;

89 Array’s - voorbeeld Lees 100 integers, elke integer is op een aparte lijn Druk de integers af in omgekeerde volgorde. Elke integer op een aparte lijn.

90 Array’s - voorbeeld (2) import java.io.* ; class LeesEnDrukAf {
public static void main( String[ ] arg) throws IOException { BufferedReader kb = new BufferedReader ( new InputStreamReader (System.in)) ; int [ ] z = new int [100] ; // array z voor 100 integers int i = 0 ; // i is volgende positie in array die men //gaat vullen //inlezen van de 100 integers while (i < 100) { z[i] = Integer.parseInt(kb.readLine ()) ; i ++ ; }

91 Array’s - voorbeeld (3) //afdrukken van de 100 integers in omgekeerde volgorde i = 99 ; // laatste positie in array is 99 while (i > -1) { System.out.println( z[i] ) ; i -- ; }

92 Voorbeeld - “De meest extreme waarde” patroon
De meest “extreme” waarde vinden in een groep van primitieve waarden. Vb: kleinste getal uit een array int kleinste ; // variabele om het de kleinste waarde bij te // houden dat tot zover gevonden werd boolean gevonden = false; //nog geen kleinste waarde gevonden int i = 0; while (i < z.length) { if (! gevonden ) || (z[i] < kleinste ) { kleinste = z[i] ; gevonden= true; } i ++ ; }

93 while statement - “De meest extreme waarde” patroon
eenType extreem ; // variabele om het meest extreme waarde bij te // houden dat tot zover gevonden werd boolean gevonden = false ; //nog geen extreme waarde gevonden waarde = eerste waarde; while (nog waarde) { ... if (! gevonden ) || waarde is meer extreem dan extreem { extreem = waarde ; gevonden= true; } waarde = volgende waarde }

94 Voorbeeld - “Accumulator” patroon
Een binaire operator toepassen op een groep objecten of waarden (elementen) Vb 1: een groep getallen optellen Vb 2: een groep van strings aan elkaar plakken getallen uit een array optellen: int som ; som = 0 ; //beginwaarde van som int i = 0; // eerste element while (i < z.length) { som = som +z[i] ; i++; // volgende getal }

95 while statement - “Accumulator” patroon
eenType accumulator ; accumulator = beginwaarde ; //beginwaarde afhankelijk van type operator element = eerste element; while (nog element) { accumulator = accumulator operator element element = volgende element }

96 Verschil tussen vectors en array’s
Voordelen array’s: Elementen kunnen primitive data waarden zijn laten type checking toe Eenvoudig in gebruik (geen methoden nodig) Nadelen array’s Vaste grootte Niet zo een rijke verzameling operaties zoals methoden bij Vector

97 De argumenten van de commando-lijn
public static void main( String[ ] arg) Array van Strings De argumenten op de commando lijn laten toe om informatie aan het programma door te geven zijn een soort van parameters kunnen enkel strings zijn

98 De argumenten van de commando-lijn (2)
Voorbeeld import java.io.* ; class CopyFile { public static void main( String[ ] arg) throws IOException { BufferedReader in = new BufferedReader ( new InputStreamReader ( new FileInputStream( new File (arg[0]) ))) ; PrintStream out = new PrintStream ( new FileOutputStream ( new File (arg[1]) )) ; String s = in.readLine() ; while (s != null) { out.println(s) ; s = in.readLine() ; } Naam input file Naam output file Via de argumenten van de commado-lijn

99 De argumenten van de commando-lijn (3)
Aanroep java CopyFile mijn-file mijn-file.copy

100 Twee dimensionale array’s
Array waarbij de elementen van het type Array zijn Vb: new int [5] [6] 2 3 4 5 1 2 3 4 1

101 Twee dimensionale array’s (2)
Ook voor te stellen als een matrix Vb: new int [5] [6] 2de dim 1 2 3 4 5 1ste dim 1 2 3 4

102 Twee dimensionale array’s (3)
Alle elementen doorlopen Patroon for (alle element i in 1ste dim) for (alle elementen j in 2de dim) { x = element[i] [j]; verwerk x ; } for ( int i = 0 ; i < a.length; i ++ ) for (int j = 0 ; j < a[i].length; j ++ ) { x = a[i] [j]; verwerk x ; }

103 Twee dimensionale array’s (3)
Ook andere structuren mogelijk Vb: final grootte = 5 ; int [ ] [ ] driehoek = new int [grootte] [ ] ; for (int i = 0 ; i < grootte ; i ++ ) { driehoek[i] = new int [ i + 1] ; } 2 3 4 1

104 Meer dimensionale array’s
Vb: new int [5] [6] [2] 3de dim 2de dim 1 2 3 4 5 1 1ste dim 2 3 4

105 ? Array’s - voorbeeld Game of life Regel:
een cel bevat leven in de volgende generatie als 2 of 3 van zijn buren leven bevatten in de huidige generatie

106 Array’s - Game of Life (2)
Regel: een cel bevat leven in de volgende generatie als 2 of 3 van zijn buren leven bevatten in de huidige generatie

107 Intermezzo: Een programma ontwerpen
Methode 1. Beschrijf het probleem 2. Geef een mogelijk scenario 3. Zoek de belangrijkste objecten Vaak aangegeven door naamwoorden 4. Bouw de klassen voor de diverse objecten 4.1. Bepaal het gewenste gedrag 4.2. Bepaal de interface van de methoden 4.3. Schrijf een voorbeeld programma die de klasse gebruikt 4.4. Maak het skelet van de klasse 4.5. Schrijf de code voor de methoden

108 Array’s - Game of Life (3)
Scenario Speel de Game of Life Toon iedere generatie op een eenvoudige manier op het scherm De begin generatie wordt random gekozen Elke cel heeft een zekere kans te leven Neem een 15 X 15 grid kans op leven in een cel als 10%

109 Array’s - Game of Life (4)
Belangrijkste objecten/klassen GameOfLife Klasse GameOfLife Interface Constructor GameOfLife Parameters: grootte grid kans op leven (getal tussen 0 en 1) Methode doGeneraties Geen parameters

110 Array’s - Game of Life (5)
Skelet class GameOfLife { public GameOfLife ( int grootte, double kansLeven) ) { statements } public void doGeneraties ( ) { instantie variabelen indien nodig

111 Array’s - Game of Life (6)
Instantie variabelen Het grid 2 dim array van boolean True: bevat leven False: bevat geen leven private boolean [ ] [] grid ; De regels static final int minBuren = 2, maxBuren = 3; Object voor het afdrukken van de wereld private WereldDisplay wereldDisplay

112 Array’s - Game of Life (7)
De klasse WereldDisplay constructor public WereldDisplay () ; - methode voor het afdrukken public void toonWereld( boolean [ ] [ ] grid);

113 Array’s - Game of Life (8)
Implementatie Leven geven aan een cel Via de random methode uit de klasse Math Cel bevat enkel leven als Math.random < kansLeven grid [i][j] = Math.random() < kansLeven ;

114 Array’s - Game of Life (11)
Implementatie public GameOfLife ( int grootte, double kansLeven) ) { // object om wereld af te drukken aanmaken wereldDisplay = new WereldDisplay() ; // lege grid/wereld aanmaken grid = new boolean [grootte] [grootte] ; //wereld initialiseren for (int i = 0; i < grid.length; i++) for (int j = 0 ; j <grid[i].length; j++ ) grid [i][j] = Math.random() < kansLeven ; }

115 Array’s - Game of Life (12)
Implementatie doGeneraties public void doGeneraties () throws IOException { // eerste keer wereld afdrukken wereldDisplay.toonWereld(grid) ; // Zolang er leven is gaan we door while nogLeven() { volgendeGeneratie (); } twee lokale methoden nodig: nogLeven()

116 Array’s - Game of Life (13)
Implementatie - nogLeven private boolean nogLeven () { // geeft true zodra één levende cel gevonden for (int i = 0; i < grid.length; i++) for (int j = 0 ; j <grid[i].length; j++ ) if grid [i][j] return true ; return false; }

117 Array’s - Game of Life (14)
Implementatie - volgendeGeneratie extra grid nodig! boolean [ ] [ ] nieuweGrid = new boolean [grootte] [grootte] ; Implementatie van de regel: if (levendeBuren( i , j ) >= minBuren && (levendeBuren( i , j ) <= maxBuren nieuweGrid [i] [j] = true ; else nieuweGrid [i] [j] = false ; Of nog nieuweGrid [i] [j] = levendeBuren( i , j ) >= minBuren && levendeBuren( i , j ) <= maxBuren Methode levendeBuren nodig

118 Array’s - Game of Life (15)
Implementatie - volgendeGeneratie (2) private void volgendeGeneratie () { //nieuwe lege grid maken boolean [ ] [ ] nieuweGrid = new boolean [grootte] [grootte] ; //nieuwe grid berekenen for (int i = 0; i < grid.length; i++) for (int j = 0 ; j <grid[i].length; j++ ) nieuweGrid [i] [j] = levendeBuren( i , j ) >= minBuren && levendeBuren( i , j ) <= maxBuren ; //oude grid vervangen door de nieuwe grid = nieuweGrid ; }

119 Array’s - Game of Life (16)
Implementatie - levendeBuren Telt het aantal levende buren i-1,j-1 i-1,j i-1,j+1 i,j i,j-1 i,j+1 i+1,j-1 i+1,j i+1,j+1

120 Array’s - Game of Life (17)
Implementatie - levendeBuren (2) private int levendeBuren (int i, int j) { // resultaat om aantal levende buren bij te houden, 0 om te beginnen int resultaat = 0 ; //elke buur bekijken if leeft(i-1, j-1) resultaat ++ ; if leeft(i-1, j) resultaat ++ ; if leeft(i-1, j+1) resultaat ++ ; if leeft(i, j-1) resultaat ++ ; if leeft(i, j+1) resultaat ++ ; if leeft(i+1, j-1) resultaat ++ ; if leeft(i+1, j) resultaat ++ ; if leeft(i+1, j+1) resultaat ++ ; return resultaat ; }

121 Array’s - Game of Life (18)
Implementatie - leeft private boolean leeft (int i, int j) { // positie i, j kan buiten de grid liggen, geef dan false terug if (i >= 0) && (i < grid.length) && (j >= 0) && (j < grid[i].length ) return grid(i, j) ; else return false; }

122 Array’s - Game of Life (19)
Implementatie - klasse WereldDisplay class WereldDisplay { Private BufferedReader keybd ; public WereldDisplay () { keybd = new BufferedReader (new InputStreamReader (System.in) ) ; } public void toonWereld( boolean [ ] [ ] grid) throws IOException { System.out.print(“Druk return om verder te gaan …”) ; System.out.flush() ; keybd.readLine() ; tekenLijn(grid.length + 2); for (int i = 0 ; i < grid.length, i++) { System.out.print(“ |”) ; for (int j = 0 ; j < grid[i].length, j++) tekenCel(grid[ i ][ j ]);

123 Array’s - Game of Life (20)
Implementatie - klasse WereldDisplay (2) private void tekenLijn( int n) throws IOException { // druk lijn van n streepjes - for (int i = 0 ; i < n , i++) { System.out.print(“ -”) ; System.out.println() ; } private void tekenCel( boolean b) throws IOException { // voor levende cel druk *, voor dode cel druk spatie if (b ) System.out.print(“ *”) ; else System.out.print(“ “) ;

124 String - herziening Strings zijn te vergelijken met array’s
Ze bestaan uit karakters Eerste karakter bevindt zich op positie 0 Methode charAt(positie) geeft het karakter op de gegeven positie “abcdefg”.charAt(3) char is het primitieve data type voor karakters

125 String - karakters manipuleren
Voorbeeld Test of String s1 een substring is van String s2 Hoe? Vergelijk beide strings karakter per karakter tot een verschillend karakter of einde van een van beide strings bereikt is Begin bij 0

126 String - karakters manipuleren (2)
Vergelijk beide strings karakter per karakter (begin bij 0) tot een verschillend karakter of einde van een van beide strings bereikt is abcde abudefgh int k = 0 ; while ( (k < s1.length()) && (k < s2.length()) && (s1.charAt(k) == s2.charAt(k)) ) k++ ; boolean isSubstring = ( k == s1.length () ); abcde abcdefgh abcde ab


Download ppt "Hoofdstuk 6: Controle structuren"

Verwante presentaties


Ads door Google