inhoud
Beginselen van programmeren 6
de voorwaardelijke opdracht (if) boolese uitdrukkingen en variabelen ingeneste if-opdrachten de keuze opdracht (switch)
voorwaardelijke en selectie opdrachten 1
2
//******************************************************************** // Leeftijd.java // demonstreert het gebruik van een if opdracht //********************************************************************
enkele voorbeelden
import java.util.Scanner; public class Leeftijd { //----------------------------------------------------------------// Leest de leeftijd van de gebruiker en geeft een passende bemerking //----------------------------------------------------------------public static void main (String[] args) { final int JUNIOR = 20;
leeftijd vragen met varianten een getal raden minimum van drie getallen
Scanner scan = new Scanner (System.in); System.out.print ("Geef je leeftijd: "); int leeftijd = scan.nextInt(); System.out.println ("Je gaf " + leeftijd); if (leeftijd < JUNIOR) System.out.println ("Jeugd is een mooie tijd; geniet ervan!"); System.out.println ("Jeugd is een instelling van de geest."); } } 3
4
1
//******************************************************************** // Leeftijd1.java // demonstreert het gebruik van een if – else opdracht //********************************************************************
//******************************************************************** // Leeftijd2.java // demonstreert het gebruik van meerdere if – else opdrachten //********************************************************************
import java.util.Scanner;
import java.util.Scanner;
public class Leeftijd1 { //----------------------------------------------------------------// Leest de leeftijd van de gebruiker en geeft een // passende bemerking. //----------------------------------------------------------------public static void main (String[] args) { final int JUNIOR = 20; Scanner scan = new Scanner (System.in);
public class Leeftijd2 { //----------------------------------------------------------------// Leest de leeftijd van de gebruiker en geeft een // passende bemerking. //----------------------------------------------------------------public static void main (String[] args) { final int JUNIOR = 20; final int SENIOR = 60; Scanner scan = new Scanner (System.in);
System.out.print ("Geef je leeftijd: "); int leeftijd = scan.nextInt();
System.out.print ("Geef je leeftijd: "); int leeftijd = scan.nextInt();
System.out.println ("Je gaf " + leeftijd); System.out.println ("Je gaf " + leeftijd); if (leeftijd < JUNIOR) System.out.println ("Jeugd is een mooie tijd; geniet ervan!"); else if (leeftijd < SENIOR) System.out.println ("Je bent in de productieve jaren van je leven."); else System.out.println ("Jeugd is een instelling van de geest.");
if (leeftijd < JUNIOR) System.out.println ("Jeugd is een mooie tijd; geniet ervan!"); else System.out.println ("Jeugd is een instelling van de geest."); } } }
5
6
}
//******************************************************************** // Raden.java // Demonstreert een if-else met een blok opdracht. //******************************************************************** import java.util.Scanner; public class Raden { //----------------------------------------------------------------// Gebruiker mag een getal raden. //----------------------------------------------------------------public static void main (String[] args) { final int MAX = 10; int geheimGetal, antwoord; Scanner scan = new Scanner (System.in); geheimGetal = (int) ( Math.random() * MAX ) + 1; System.out.print ("Raad een getal tussen 1 en " + MAX + " : "); antwoord = scan.nextInt(); if (antwoord == geheimGetal) System.out.println ("Je hebt het geraden!"); else { System.out.println ("Dat is fout, sorry."); System.out.println ("Het getal was " + geheimGetal); } } }
7
//******************************************************************** // MinVanDrie.java // Demonstreert gebruik van geneste if opdrachten. //******************************************************************** import java.util.Scanner; public class MinVanDrie { //----------------------------------------------------------------// Leest drie gehele waarden en bepaalt hun minimum. //----------------------------------------------------------------public static void main (String[] args) { int getal1, getal2, getal3, min = 0; Scanner scan = new Scanner (System.in); System.out.println ("Geef drie gehele waarden: "); getal1 = scan.nextInt(); getal2 = scan.nextInt(); getal3 = scan.nextInt(); if (getal1 < getal2) if (getal1 < getal3) min = getal1; else min = getal3; else if (getal2 < getal3) min = getal2; else min = getal3; System.out.println ("Minimum waarde: " + min); } }
8
2
de voorwaardelijke opdracht
syntaxis
if opdracht:
if (
) < then blok > else < else blok >
actie afhankelijk van een voorwaarde vb. niet geslaagd indien score < 60, wel geslaagd indien in ander geval
if (
testScore < 60
Boolese uitdrukking
boolese of logische uitdrukking: boolean expression waarde true of false genoemd naar George Boole (1815-1864), (mede)grondlegger van de wiskundige logica (cf. boole-algebra) vbn:
)
schrijf (“je bent niet geslaagd”);
Then Blok
testScore < 60 testScore * 2 > 350 30 < g / (h * h)
else
indien de waar (true) is, worden de opdracht(en) uit het uitgevoerd, zoniet de opdracht(en) uit het <else blok>
schrijf (“je bent geslaagd”);
Else Blok
9
Nassi-Schneiderman diagram:
opgebouwd met relationele operatoren < <= == != > >=
testScore < 60 ja
10
neen
kleiner dan kleiner dan of gelijk aan gelijk aan niet gelijk aan groter dan groter dan of gelijk aan
then-blok en else-blok: schrijf (“je bent geslaagd”)
ofwel een enkelvoudige opdracht :
schrijf (“je bent niet geslaagd”)
ofwel een samengestelde opdracht : { ...
algemene regel: overal waar één opdracht kan voorkomen, mag ook een samengestelde opdracht worden gebruikt
} 11
12
3
vb:
accolades mogen altijd gebruikt worden!
if (testscore < 60) { System.out.println(“je behaalde ” + testScore); System.out.println(“je bent niet geslaagd”); System.out.println(“span je beter in”); } else { System.out.println(“je behaalde ” + testScore); System.out.println(“je bent geslaagd”); }
if (testscore < 60) { System.out.println(“je bent niet geslaagd”); } else { System.out.println(“je bent geslaagd”); }
13
14
schikking:
if opdracht zonder else
onbelangrijk voor de compiler zo dat we de structuur goed zien stijl 1
vb: if (testScore >= 95) { System.out.println(“felicitaties !”); }
if ( ) { ... // opdrachten } else { ... // opdrachten }
testScore >= 95
stijl 2 if ( ) { ... // opdrachten } else { ... // opdrachten }
ja
neen
schrijf (“felicitaties !”)
15
16
4
boolese uitdrukkingen en variabelen alternatief:
notatie van de boolese waarden:
uitdrukkingen:
true if (testScore >= 95) { System.out.println(“felicitaties !”); } else { }
boolese operatoren: ! && ||
uiteraard kan ook if (testScore >= 95)
false
System.out.println(“felicitaties !”);
of
niet en (inclusieve of)
betekenis van de operatoren: weergegeven in waarheidstabellen a
!a
a
b
a && b
false true
true false
false false true true
false true false true
false false false true
a || b false true true true
17
18
combinatie van boolese, rekenkundige en relationele operatoren: vbn:
prioriteitsregels voor operatoren (voorlopige lijst)
met int jaartal, leeftijd ; int x, y, z ;
prioriteit groep operator volgorde binnen groep --------------------------------------------------------------------------------------------------------------------9 deeluitdrukking ( ) van links naar rechts van binnen naar buiten 8 unaire operatoren - ! van rechts naar links
geldige boolese uitdrukkingen: jaartal == 2005 || jaartal == 2006 jaartal != 2005 && jaartal != 2006 overeenkomst! denk aan ! ( jaartal == 2005 || jaartal == 2006 ) de wetten van De Morgan
7
multiplicatieve operatoren
*
/ %
van links naar rechts
6
additieve operatoren
+ -
van links naar rechts
5
vergelijkingsoperatoren
< <= > >=
van links naar rechts
4
gelijkheidsoperatoren
== !=
van links naar rechts
3
boolese EN
&&
van links naar rechts
2
boolese OF
||
van links naar rechts
1
toekenning
=
van rechts naar links
jaartal != 1987 + leeftijd (x + 150) == y || x < y && ! (y < z && z < x) y == 0 || x / y > z x / y > z || y == 0 ( 80 <= x ) && ( x < 90 )
slechte stijl !!
‘korte’ of ‘luie’ evaluatie: zodra resultaat vaststaat, wordt evaluatie gestopt kan deling door 0 vermijden wiskundige notatie: 80 x < 90
evaluatie:
prioriteitsregels binnen zelfde prioriteitsgroep: van links naar rechts of van rechts naar links in de uitdrukking
19
20
5
voorbeelden
(met passende declaraties van variabelen)
score < min / 2 - 10 || score > 90 volgorde: 3 1 2 5 4
slechte stijl !!
boolese variabelen declaratie boolean
p, q, r, gedaan, geslaagd ;
gebruik geslaagd = 70 < x ; gedaan = true ; r = p && q ; if ( geslaagd ) System.out.println(“je bent geslaagd”) ;
haakjes plaatsen:
(score < ( (min / 2) - 10 ) ) || ( score > 90 )
(temperatuur > 30) || (regenval > 20) || (vochtigheid >= 60) if (( aantalProeven > 0 ) && ( totaalScore / aantalProeven ) > 60 )) System.out.println(“goed gewerkt !) ; // geen deling door 0 ! else System.out.println (“ het wordt tijd enkele proeven af te leggen ! ”) ;
21
22
innesteling van if-opdrachten vb:
regel: overal waar een opdracht mag voorkomen, kan ook een if-opdracht staan elk then-blok en elk else-blok kan dus op zijn beurt een if-opdracht zijn of bevatten
if (testScore >= 70) if (leeftijd < 10) System.out.println(”knap werk"); else
schikking:
System.out.println(”je bent geslaagd");
bij innesting een beetje inspringen (indentation) duidelijke structuur voor lezer, niet voor compiler zorg dat overeenstemmende delen verticaal onder elkaar komen
else System.out.println(”je bent niet geslaagd"); testScore >= 70
neen
ja leeftijd < 10 ja
schrijf (“knap werk”)
neen
schrijf (“je bent geslaagd”)
schrijf (“je bent niet geslaagd”) 23
vb: if ( x < y ) if ( z != w ) a = b + 1; else a = c + 1; else a = b * c ; 24
6
bij diepe innesting: schikking aanpassen
if (score >= 90) System.out.println(”je behaalde A"); else if (score >= 80) System.out.println(”je behaalde B"); else if (score >= 70) System.out.println(”je behaalde C"); else if (score >= 60) System.out.println(”je behaalde D"); else System.out.println(”je behaalde F");
alternatief:
if (score >= 90) System.out.println("je behaalde A"); else if (score >= 80) System.out.println("je behaalde B"); else if (score >= 70) System.out.println("je behaalde C"); else if (score >= 60) System.out.println("je behaalde D"); else System.out.println("je behaalde F");
innestelen is niet steeds de overzichtelijkste oplossing:
wordt moeilijk leesbaar! 25
26
Vb: hoeveel van drie gehele getallen zijn er negatief? if (get1 < 0) if (get2 < 0) if (get3 < 0) aantalNegatief else aantalNegatief else if (get3 < 0) aantalNegatief else aantalNegatief else if (get2 < 0) if (get3 < 0) aantalNegatief else aantalNegatief else if (get3 < 0) aantalNegatief else aantalNegatief
= 3; //alle drie zijn negatief
alternatief:
aantalNegatief = 0; if (get1 < 0) aantalNegatief++; if (get2 < 0) aantalNegatief++; if (get3 < 0) aantalNegatief++;
= 2; //get1 en get2 zijn negatief
= 2; //get1 and get3 zijn negatief = 1; //get1 is negatief
aantalNegatief++; betekent: aantalNegatief = aantalNegatief + 1 ;
= 2; //get2 en get3 zijn negatief = 1; //get2 is negatief
= 1; //get3 is negatief = 0; //geen negatieve getallen
27
28
7
overeenkomst van else-blok:
1: if ( a > 0 ) if ( b > 0 ) b = b – a; else a = a – b;
hoe volgende diagrammen coderen? 2
1
a>0
a>0 neen
ja
neen
ja
neen
b=b-a
a=a-b
b=b-a
2: is dit OK?: if ( a > 0 ) if ( b > 0 ) b = b – a; else a = a – b;
b>0
b>0 ja
neen
ja
neen, maar wel: if ( a > 0 ) { if ( b > 0 ) b = b – a; } else a = a – b;
a=a-b
29
30
//******************************************************************** // Puntencommentaar.java // met meerdere if's //********************************************************************
meerdere keuzes
import java.util.Scanner; public class Puntencommentaar { //----------------------------------------------------------------// leest een resultaat (%) en geeft passende bemerking. //----------------------------------------------------------------public static void main (String[] args) { int resultaat, categorie; Scanner scan = new Scanner (System.in);
voorbeeld:
System.out.print ("Enter je percentage (0 to 100): "); resultaat = scan.nextInt(); categorie = resultaat / 10; System.out.print ("Je resultaat is "); if (categorie == 10) System.out.println ("perfect. Proficiat.");
31
32
8
//******************************************************************** // Puntencommentaar1.java // Demonstreert het gebruik van een switch opdracht. //********************************************************************
System.out.print ("Je resultaat is "); if (categorie == 10) System.out.println ("perfect. Proficiat."); else if (categorie == 9) System.out.println ("erg goed. Uitstekend."); else if (categorie == 8) System.out.println ("boven het gemiddelde. Fijn werk."); else if (categorie == 7) System.out.println ("matig."); else if (categorie == 6 || categorie == 5) { System.out.println ("lager dan het gemiddelde. Je zou contact "); System.out.println ("moeten opnemen met de monitor "); } else System.out.println ("niet goed; je slaagt niet."); } }
import java.util.Scanner; public class Puntencommentaar1 { //----------------------------------------------------------------// leest een resultaat (%) en geeft passende bemerking. //----------------------------------------------------------------public static void main (String[] args) { int resultaat, categorie; Scanner scan = new Scanner (System.in); System.out.print ("Enter je percentage (0 to 100): "); resultaat = scan.nextInt(); categorie = resultaat / 10; System.out.print ("Je resultaat is "); switch (categorie) { case 10: System.out.println ("perfect. Proficiat."); break; case 9:
33
34
meerdere keuzes System.out.print ("Je resultaat is "); switch (categorie) { case 10: System.out.println break; case 9: System.out.println break; case 8: System.out.println break; case 7: System.out.println break; case 6: case 5: System.out.println System.out.println break; default: System.out.println }
voorbeeld: invoer:
("perfect. Profociat.");
een geheel getal: 0 1 .. 4
betekent geen keuze geldige keuzes
("erg goed. Uitstekend.");
("boven het gemiddelde. Fijn werk.");
("matig.");
("lager dan het gemiddelde. Je zou contact "); ("moeten opnemen met de monitor ");
("niet goed; je slaagt niet.");
} } 35
36
9
switch opdracht Voorbeeld:
vorige code met nieuwe opdracht: switch switch (selection) { case 0: System.out.println(”geen keuze”); break; case 1: System.out.println(”keuze 1”); break; case 2: System.out.println(”keuze 2”); break; case 3: System.out.println(”keuze 3”); break; case 4: System.out.println(”keuze 4"); break; default: System.out.println(”geen geldige keuze”); break; }
int selection; selection = scan.nextInt(“maak je keuze: 0, 1, 2, 3 of 4”); if (selection == 0) System.out.println(“je else if (selection == 1) System.out.println(“je else if (selection == 2) System.out.println(“je else if (selection == 3) System.out.println(“je else if (selection == 4) System.out.println(“je else System.out.println(“je
maakte geen selectie”); koos voor 1”); koos voor 2”); koos voor 3”); koos voor 4”); maakte geen geldige keuze”);
37
switch opdracht
syntaxis
38
alternatief voor geneste if met gelijkheidstesten sequentiële uitvoering afgebroken door break
switch ( <expression> ) { : …
switch ( N case 1: case 2: case 3: }
: }
) x x x
{ = 10; break; = 20; break; = 30; break;
switch ( N case 1: case 2: case 3: }
) x x x
{ = 10; = 20; = 30;
waarbij is
1
case default
waarbij <expression> van een van de volgende types is
int, byte, short char
N
2
3
N
1
2
3
x = 10 x = 10
x = 20
x = 30 x = 20
(zie later in de cursus)
x = 30 39
40
10
in verschillende gevallen dezelfde actie ondernemen:
liefst steeds default case toevoegen
int waarde;
switch ( N ) { case 1: x = 10; break; case 2: x = 20; break; case 3: x = 30; break; default: x = 0; }
waarde = scan.nextInt (); switch (waarde) { case 10: case
case N
8:
System.out.println(”Redelijk");
1
2
3
zoniet
case x = 10
9: case
System.out.println(”Hoog niveau"); break; 7: case 6:
x = 20
x = 30
x=0
break; 5: case 4: System.out.println(”Je moet nog leren"); break;
default: System.out.println (”Invoerfout: ongeldige waarde"); break; 41
Voorbeeld: Bank Balance – p 131
}
42
Voorbeeld: Exercise JOptionPane
import java.util.*;
import javax.swing.*;
public class BankBalance { public static final double OVERDRAWN_PENALTY = 8.00; public static final double INTEREST_RATE = 0.02;//2% annually public static void main(String[] args) { double balance; System.out.print("Enter your checking account balance: $"); Scanner keyboard = new Scanner(System.in); balance = keyboard.nextDouble( ); System.out.println("Original balance $" + balance); if (balance >= 0) balance = balance + (INTEREST_RATE * balance)/12; else balance = balance - OVERDRAWN_PENALTY; System.out.println("After adjusting for one month"); System.out.println("of interest and penalties,"); System.out.println("your new balance is $" + balance); } } 43
public class ExerciseJOptionPane { public static void main(String[] args) { boolean adult = false; //Initialized to keep the compiler happy. int answer = JOptionPane.showConfirmDialog(null, "Are you 18 years old or older?", "Age Check", JOptionPane.YES_NO_OPTION); if (answer == JOptionPane.YES_OPTION) adult = true; else if (answer == JOptionPane.NO_OPTION) adult = false; else System.out.println("Error");
44
11
Voorbeeld: Exercise JOptionPane (2)
Voorbeeld: JOptionPaneYesNoDemo import javax.swing.*;
if (adult) JOptionPane.showMessageDialog( null, "You are old enough."); else JOptionPane.showMessageDialog( null, "Sorry. you must be 18."); System.exit(0);
public class JOptionPaneYesNoDemo { public static void main(String[] args) { int answer = JOptionPane.showConfirmDialog(null, "End program?", "Want to end?", JOptionPane.YES_NO_OPTION);
} }
if (answer == JOptionPane.YES_OPTION) System.exit(0); else if (answer == JOptionPane.NO_OPTION) System.out.println("One more time"); else System.out.println("This is impossible"); System.exit(0); } } 45
46
Voorbeeld: MultipleBirths
Voorbeeld: MultipleBirths (2)
import java.util.*;
case 3: System.out.println("Wow. Triplets."); break; case 4: case 5: System.out.println("Unbelieveable."); System.out.println(numberOfBabies + " babies"); break; default: System.out.println("I don't believe you."); break;
public class MultipleBirths { public static void main(String[] args) { int numberOfBabies; System.out.print("Enter number of babies: "); Scanner keyboard = new Scanner(System.in); numberOfBabies = keyboard.nextInt( ); switch (numberOfBabies) { case 1: System.out.println("Congratulations."); break; case 2: System.out.println("Wow. Twins."); break;
} } }
47
48
12
Voorbeeld: StringEqualityDemo
Voorbeeld: StringEqualityDemo (2)
import java.util.*;
if (s2.equals(s1)) System.out.println("The two lines are equal."); else System.out.println("The two lines are not equal."); if (s1.equalsIgnoreCase(s2)) System.out.println( "But the lines are equal, ignoring case."); else System.out.println( "Lines are not equal, even ignoring case.");
public class StringEqualityDemo { public static void main(String[] args) { String s1, s2; System.out.println("Enter two lines of text:"); Scanner keyboard = new Scanner(System.in); s1 = keyboard.nextLine( ); s2 = keyboard.nextLine( ); if (s1.equals(s2)) System.out.println("The two lines are equal."); else System.out.println("The two lines are not equal.");
} }
49
50
Voorbeeld: YellowFace
Voorbeeld: YellowFace
import javax.swing.*; import java.awt.*; public class YellowFace { public static final public static final public static final public public public public public public
static static static static static static
final final final final final final
public static final int MOUTH_START_ANGLE = 180; public static final int MOUTH_DEGREES_SHOWN = 180; extends JApplet
public void paint(Graphics canvas) { //Draw face circle: canvas.setColor(Color.YELLOW); canvas.fillOval(X_FACE, Y_FACE, FACE_DIAMETER, FACE_DIAMETER); canvas.setColor(Color.BLACK); canvas.drawOval(X_FACE, Y_FACE, FACE_DIAMETER, FACE_DIAMETER); //Draw eyes: canvas.setColor(Color.BLUE); canvas.fillOval(X_RIGHT_EYE, Y_RIGHT_EYE, EYE_WIDTH, EYE_HEIGHT); canvas.fillOval(X_LEFT_EYE, Y_LEFT_EYE, EYE_WIDTH, EYE_HEIGHT); //Draw nose: canvas.setColor(Color.BLACK); canvas.fillOval(X_NOSE, Y_NOSE, NOSE_DIAMETER, NOSE_DIAMETER); //Draw mouth: canvas.setColor(Color.RED); canvas.drawArc(X_MOUTH, Y_MOUTH, MOUTH_WIDTH, MOUTH_HEIGHT, MOUTH_START_ANGLE, MOUTH_DEGREES_SHOWN); }
int FACE_DIAMETER = 200; int X_FACE = 100; int Y_FACE = 50; int int int int int int
EYE_WIDTH = 10; EYE_HEIGHT = 20; X_RIGHT_EYE = 155; Y_RIGHT_EYE = 95; X_LEFT_EYE = 230; Y_LEFT_EYE = Y_RIGHT_EYE;
public static final int NOSE_DIAMETER = 10; public static final int X_NOSE = 195;//Center of nose will be at 200 public static final int Y_NOSE = 135; public public public public
static static static static
final final final final
int int int int
MOUTH_WIDTH = 100; MOUTH_HEIGHT = 50; X_MOUTH = 150; Y_MOUTH = 175;
} 51
52
13