CONTROLESTRUCTUREN (DEEL 2) HOOFDSTUK 5 CONTROLESTRUCTUREN (DEEL 2) 5.1. INTRODUCTIE Vervolg discussie omtrent gestructureerd programmeren Introductie van de overblijvende controlestructuren
5.2. ESSENTIE VAN DE HERHALING GECONTROLEERD DOOR EEN TELLER Voor een herhaling met een teller zijn nodig: naam van een controlevariabele (de teller) initiële waarde van de controlevariabele increment/decrement van de controlevariabele elke keer de lus doorlopen wordt conditie die test op de eindwaarde van de controlevariabele
VOORBEELD WhileCounter.java is een programma dat een waaier van 10 lijnen gaat tekenen gebruikt een while- herhalingsstructuur gebruikt een teller om de herhaling bij te houden
1 // Fig. 5.1: WhileCounter.java 2 // Herhaling gecontroleerd door een teller 3 4 // Java core packages 5 import java.awt.Graphics; 6 7 // Java extension packages 8 import javax.swing.JApplet; 9 10 public class WhileCounter extends JApplet 11 { 12 // trek lijnen op de achtergrond van de applet lines on applet 13 public void paint( Graphics g ) 14 { 15 // roep de overgeërfde versie van de methode paint op 16 super.paint( g ); 17 18 int counter = 1; // initialisatie 19 20 while ( counter <= 10 ) // conditie van de herhaling 21 { 22 g.drawLine( 10, 10, 250, counter * 10 ); 23 ++counter; // increment 24 } // einde while structuur 25 26 } // einde methode paint 27 28 } // einde klasse WhileCounter
Naam van de controlevariabele is counter. 18 int counter = 1; // initialisatie 19 20 while ( counter <= 10 ) // conditie van de herhaling 21 { 22 g.drawLine( 10, 10, 250, counter * 10 ); 23 ++counter; // increment 24 } // einde while structuur Lijn 18 Naam van de controlevariabele is counter. Initiële waarde van de controlevariabele is 1. Lijn 20 Conditionele test op de eindwaarde van counter. Lijn 23 Increment van de controlevariabele counter.
5.3. DE “FOR” HERHALINGSSTRUCTUUR hanteert alle details van de herhalingsstructuur met teller
VOORBEELD ForCounter.java is een programma dat een waaier van 10 lijnen gaat tekenen. gebruikt een for-herhalingsstructuur.
1 // Fig. 5.2: ForCounter.java 2 // Herhaling gecontroleerd door een teller via een for-structuur 3 4 // Java core packages 5 import java.awt.Graphics; 6 7 // Java extension packages 8 import javax.swing.JApplet; 9 10 public class ForCounter extends JApplet 11 { 12 // teken lijnen op de achtergrond van de applet 13 public void paint( Graphics g ) 14 { 15 // roep de overgeërfde versie van de methode paint op 16 super.paint( g ); 17 18 // Initialisatie, herhalingsconditie and incrementeren 19 // zijn allemaal inbegrepen in de hoofding van de for structuur. 20 for ( int counter = 1; counter <= 10; counter++ ) 21 g.drawLine( 10, 10, 250, counter * 10 ); 22 23 } // einde methode paint 24 25 } // einde klasse ForCounter
Naam van de controlevariabele is counter. 18 // Initialisatie, herhalingsconditie and incrementeren 19 // zijn allemaal inbegrepen in de hoofding van de for structuur. 20 for ( int counter = 1; counter <= 10; counter++ ) 21 g.drawLine( 10, 10, 250, counter * 10 ); Lijn 20 int counter = 1 Naam van de controlevariabele is counter. Initiële waarde van de controlevariabele is 1. counter <= 10 Conditionele test op de eindwaarde van counter. counter++ Increment van de controlevariabele counter.
REGEL 20 UIT FORCOUNTER.JAVA Naam van de Eindwaarde van de for controlevariabele controlevariabele sleutelwoord for ( int counter = 1 ; counter <= 10 ; counter++ ) Beginwaarde Increment van de controlevariabele van de controlevariabele Conditie voor vervolg van de lus Fig. 5.3 Componenten van een typische hoofding van een “for” structuur.
5.3. DE “FOR” HERHALINGSSTRUCTUUR (VERVOLG) for ( expressie1; expressie2; expressie3 ) statement; kan herschreven worden als: expressie1; while ( expressie2 ) { statement; expressie3; }
FLOWCHART VAN EEN TYPISCHE “FOR” HERHALINGSSTRUCTUUR Fig. 5.4 Flowchart van een typische “for” herhalingsstructuur. Stel de int counter = 1 beginwaarde van de controle- variabele vast true g.drawLine( counter++ Bepaal of counter <= 10 10, 10, 250, de eindwaarde counter * 10 Incrementeer van de controle- ); de controle- variabele bereikt is. false “body” van de lus variabele. (dit kunnen meerdere Statements zijn)
5.4. VOORBEELDEN DIE GEBRUIK MAKEN VAN DE “FOR” HERHALINGSSTRUCTUUR Variërende controlevariabele in de for structuur De controlevariabele varieert van 1 tot 100, toenemend in stappen van 1 for ( int i = 1; i <= 100; i++ ) De controlevariabele varieert van 100 tot 1, afnemend in stappen van –1 for ( int i = 100; i >= 1; i-- ) De controlevariabele varieert van 7 tot 77 in stappen van 7 for ( int i = 7; i <= 77; i += 7 )
VOORBEELD 1 Sum.java de som van de even gehele getallen van 2 t.e.m. 100 wordt weergegeven op het scherm. gebruikt een for-herhalingsstructuur in stappen van 2.
1 // Fig. 5.5: Sum.java 2 // Herhaling gecontroleerd door een teller met de “for” structuur 3 4 // Java extension packages 5 import javax.swing.JOptionPane; 6 7 public class Sum 8 { 9 // de uitvoering van de Java applicatie begint bij de main method 10 public static void main( String args[] ) 11 { 12 int sum = 0; 13 14 // sommeer de even gehele getallen van 2 tot en met 100 15 for ( int number = 2; number <= 100; number += 2 ) 16 sum += number; 17 18 // toon het resultaat 19 JOptionPane.showMessageDialog( null, "The sum is " + sum, 20 "Sum Even Integers from 2 to 100", 21 JOptionPane.INFORMATION_MESSAGE ); 22 23 System.exit( 0 ); // beëindig de applicatie 24 25 } // einde methode main 26 27 } // einde klasse Sum
incrementeer number met 2 bij elke iteratie 12 int sum = 0; 13 14 // sommeer de even gehele getallen van 2 tot en met 100 15 for ( int number = 2; number <= 100; number += 2 ) 16 sum += number; 17 18 // toon het resultaat 19 JOptionPane.showMessageDialog( null, "The sum is " + sum, 20 "Sum Even Integers from 2 to 100", 21 JOptionPane.INFORMATION_MESSAGE ); Lijn 15 number += 2 incrementeer number met 2 bij elke iteratie
Interest.java is een programma dat de samengestelde intrest berekent VOORBEELD 2 Interest.java is een programma dat de samengestelde intrest berekent a = p(1 + r)n p = kapitaal (in ons vb. $1000) r = jaarlijkse intrest (in ons vb. 5%) n = aantal jaren a = kapitaal na n jaar Het kapitaal MET de samengestelde intrest wordt voor de eerste 10 jaar weergegeven. gebruikt een for-herhalingsstructuur.
Interest.java 1 // Fig. 5.6: Interest.java 2 // Berekening van samengestelde interest 3 4 // Java core packages 5 import java.text. NumberFormat ; 6 import java.util.Locale; 7 8 // Java extension packages 9 import javax .swing. JOptionPane ; Interest.java 10 import javax .swing. JTextArea ; 11 12 public class Interest 13 { 14 // de uitvoering van de Java applicatie begint bij de main methode 15 public static void main( String args [] ) 16 { 17 double amount, principal = 1000.0 , rate = 0.05 ; 18 19 // creëer NumberFormat om floating point getallen 20 // met twee cijfers rechts van de decimale punt te formatteren 21 NumberFormat moneyFormat = 22 NumberFormat . getCurrencyInstance ( Locale. US ); 23 24 // creëer JtextArea om de uitvoer te laten zien 25 JTextArea outputTextArea = new JTextArea (); 26 27 // plaats de eerste lijn tekst in outputTextArea 28 outputTextArea . setText ( "Year \ tAmount on deposit \ n" ); 29 30 // bereken het bedrag in deposito voor elk van de tien jaren 31 for ( int year = 1 ; year <= 10 ; year++ ) 32 { 33 // bereken nieuw bedrag voor een specifiek jaar 34 amount = principal * Math. pow ( 1.0 + rate, year ); 35
Interest.java vervolg code + uitvoer 36 // voeg één lijn tekst toe aan outputTextArea 37 outputTextArea .append( year + " \ t" + 38 moneyFormat .format( amount ) + " \ n" ); 39 40 } // einde for structuur 41 42 // toon het resultaat 43 JOptionPane . showMessageDialog ( null , outputTextArea , 44 "Compound Interest" , JOptionPane . INFORMATION_MESSAGE ); 45 46 System.exit( ); // beëindig de applicatie 47 48 } // einde methode main 49 50 } // einde klasse Interest Interest.java vervolg code + uitvoer
12 public class Interest 13 { 14 // de uitvoering van de Java applicatie begint bij de main methode 15 public static void main( String args[] ) 16 { 17 double amount, principal = 1000.0, rate = 0.05; 18 Lijn 17 Java stockeert floating-point getallen in variabelen van het type double (of float)
NumberFormat kan numerieke waarden als een valuta formatteren 19 // creëer NumberFormat om floating point getallen 20 // met twee cijfers rechts van de decimale punt te formatteren 21 NumberFormat moneyFormat = 22 NumberFormat.getCurrencyInstance( Locale.US ); 23 24 // creëer JtextArea om de uitvoer te laten zien 25 JTextArea outputTextArea = new JTextArea(); 26 27 // plaats de eerste lijn tekst in outputTextArea 28 outputTextArea.setText( "Year\tAmount on deposit\n" ); 29 Lijn 21 NumberFormat kan numerieke waarden als een valuta formatteren Lijn 22: Locale.US Toont geldbedragen met een dollarteken ($)
Bereken amount (kapitaal) met een for structuur amount = a = p(1 + r)n 30 // bereken het bedrag in deposito voor elk van de tien jaren 31 for ( int year = 1; year <= 10; year++ ) 32 { 33 // bereken nieuw bedrag voor een specifiek jaar 34 amount = principal * Math.pow( 1.0 + rate, year ); 35 36 // voeg één lijn tekst toe aan outputTextArea 37 outputTextArea.append( year + "\t" + 38 moneyFormat.format( amount ) + "\n" ); 39 40 } // einde for structuur Lijn 31-40 Bereken amount (kapitaal) met een for structuur amount = a = p(1 + r)n Lijn 34 Math.pow(1.0 + rate, year) (1.0 + rate)year
41 42 // toon het resultaat 43 JOptionPane.showMessageDialog( null, outputTextArea, 44 "Compound Interest", JOptionPane.INFORMATION_MESSAGE ); 45 46 System.exit( 0 ); // beëindig de applicatie 47 48 } // einde methode main 49 50 } // einde klasse Interest
MEERVOUDIGE SELECTIESTRUCTUUR 5.5. DE “SWITCH” MEERVOUDIGE SELECTIESTRUCTUUR switch structuur wordt gebruikt voor meervoudige selecties: switch (var) { case label1: statement1 break; case label2: statement2 default: statement3 }
SwitchTest.java de gebruiker geeft een getal in. VOORBEELD SwitchTest.java de gebruiker geeft een getal in. 1 = een waaier van 10 lijnen tekenen 2 = 10 vierkanten tekenen 3 = 10 cirkels tekenen 1, 2 en 3 = de tekst "Invalid value entered“ wordt weergegeven.
Verkrijg input van de gebruiker 1 // Fig. 5.7: SwitchTest.java 2 // Lijnen, rechthoeken of ovalen tekenen op basis van de input van de gebruiker. 3 4 // Java core packages 5 import java.awt.Graphics; 6 7 // Java extension packages 8 import javax.swing.*; 9 10 public class SwitchTest extends JApplet 11 { private int choice; // keuze van de gebruiker welke vorm getekend moet worden 12 13 // initialiseeer de applet door de keuze van de gebruiker te verkrijgen 14 public void init() 15 { 16 String input; // input van de gebruiker 17 18 // verkrijg de keuze van de gebruiker 19 input = JOptionPane.showInputDialog( 20 "Enter 1 to draw lines\n" + 21 "Enter 2 to draw rectangles\n" + 22 "Enter 3 to draw ovals\n"); 23 24 // converteer de input van de gebruiker naar een int 25 choice = Integer.parseInt( input ); 26 } Verkrijg input van de gebruiker
28 // teken vormen op de achtergrond van de applet 29 public void paint( Graphics g ) 30 { 31 // roep de overgeërfde versie van de methode paint op 32 super.paint( g ); 33 34 // herhaal 10 keer, tellend van 0 tot en met 9 35 for ( int i = 0; i < 10; i++ ) 36 { 37 // bepaal de te tekenen vorm op basis van de keuze van de gebruiker 38 switch ( choice ) 39 { 40 case 1: 41 g.drawLine( 10, 10, 250, 10 + i * 10 ); 42 break; // gedaan met dit geval te verwerken 43 44 case 2: 45 g.drawRect( 10 + i * 10, 10 + i * 10, 46 50 + i * 10, 50 + i * 10 ); 47 break; // gedaan met dit geval te verwerken 48 49 case 3: 50 g.drawOval( 10 + i * 10, 10 + i * 10, 51 50 + i * 10, 50 + i * 10 ); 52 break; // gedaan met dit geval te verwerken 53 54 default: 55 g.drawString( "Invalid value entered", 56 10, 20 + i * 15 ); 57 58 } // einde switch structuur 59 60 } // einde for structuur 61 62 } // einde paint methode 63 64 } // einde klasse SwitchTest
SWITCHTEST.JAVA: OUTPUT
input van de gebruiker (choice) is de controlerende expressie 38 switch ( choice ) 39 { 40 case 1: 41 g.drawLine( 10, 10, 250, 10 + i * 10 ); 42 break; // gedaan met dit geval te verwerken 43 44 case 2: 45 g.drawRect( 10 + i * 10, 10 + i * 10, 46 50 + i * 10, 50 + i * 10 ); 47 break; // gedaan met dit geval te verwerken 48 49 case 3: 50 g.drawOval( 10 + i * 10, 10 + i * 10, 51 50 + i * 10, 50 + i * 10 ); 52 break; // gedaan met dit geval te verwerken 53 54 default: 55 g.drawString( "Invalid value entered", 56 10, 20 + i * 15 ); 57 58 } // einde switch structuur input van de gebruiker (choice) is de controlerende expressie default case voor ongeldige ingaves Lijn 38 de switch structuur bepaalt welk case label uitgevoerd moet worden, wat afhangt van de controlerende expressie.
FLOWCHART VAN DE “SWITCH” MEERVOUDIGE SELECTIESTRUCTUUR true case a case a actie(s) break false true case b case b actie(s) break false true case z case z actie(s) break false default actie(s) Fig. 5.8 De switch meervoudige selectiestructuur.
5.6. DE “DO/WHILE” HERHALINGSSTRUCTUUR do statement while (voorwaarde); lijkt op de while structuur, MAAR test of de lus verder doorlopen moet worden NADAT de body van de loop uitgevoerd is dit betekent dat de lus altijd MINSTENS EENMAAL doorlopen wordt Het statement wordt herhaald zolang de voorwaarde WAAR blijft! Zorg ervoor dat de voorwaarde beïnvloed wordt in het statement, anders oneindige lus!
DoWhileTest.java er worden 10 cirkels getekend op het scherm. VOORBEELD DoWhileTest.java er worden 10 cirkels getekend op het scherm.
1 // Fig. 5.9: DoWhileTest.java 2 // Using the do/while repetition structure. 3 4 // Java core packages 5 import java.awt.Graphics; 6 7 // Java extension packages 8 import javax.swing.JApplet; 9 10 public class DoWhileTest extends JApplet 11 { 12 // teken ovalen op de achtergrond van de applet 13 public void paint( Graphics g ) 14 { 15 // roep de overgeërfde versie van de methode paint op 16 super.paint( g ); 17 18 int counter = 1; 19 20 do 21 { g.drawOval( 110 - counter * 10, 110 - counter * 10, 22 counter * 20, counter * 20 ); 23 ++counter; 24 } while ( counter <= 10 ); // einde do/while structuur 25 26 } // einde methode paint 27 28 } // einde klasse DoWhileTest
18 int counter = 1; 19 20 do 21 { g.drawOval( 110 - counter * 10, 110 - counter * 10, 22 counter * 20, counter * 20 ); 23 ++counter; 24 } while ( counter <= 10 ); // einde do/while structuur Lijn 20-24 Eén ovaal wordt getekend alvorens er getest wordt op de eindwaarde van counter
FLOWCHART VAN DE “DO/WHILE” HERHALINGSSTRUCTUUR actie(s) true conditie false Fig. 5.10 Flowchart van de do/while herhalingsstructuur.
5.7. STATEMENTS “BREAK” EN “CONTINUE” break/continue veranderen de stroom van de controle break statement veroorzaakt een onmiddellijke exit uit de controlestructuur wordt gebruikt in while, for, do/while en switch statements continue statement slaat de resterende statements in de body van de lus over gaat verder naar de volgende iteratie wordt gebruikt in while, for en do/while statements
Voorbeeld met break statement 1 // Fig. 5.11: BreakTest .java 2 // Gebruik van het break statement in een for structuur 3 4 // Java extension packages 5 import javax .swing. JOptionPane ; 6 BreakTest.java 7 public class BreakTest 8 { 9 // de uitvoering van de Java applicatie begint bij de main methode 10 public static void main( String args [] ) 11 { 12 String output = "" ; 13 int count; 14 15 // herhaal 10 keer 16 for ( count = 1 ; count <= 10 ; count++ ) 17 { 18 // als count gelijk is aan 5, beëindig dan de lus 19 if ( count == 5 ) 20 break ; // onderbreek de lus enkel als count == 5 21 22 output += count + " " ; 23 24 } // einde for structuur 25 26 output += " \ nBroke out of loop at count = " + count; 27 JOptionPane . showMessageDialog ( null , output ); 28 29 System.exit( ); // beëindig de applicatie 30 31 } // einde methode main 32 33 } // einde klasse BreakTest
ga uit de for structuur (break) wanneer count gelijk is aan 5 16 for ( count = 1; count <= 10; count++ ) 17 { 18 // als count gelijk is aan 5, beëindig dan de lus 19 if ( count == 5 ) 20 break; // onderbreek de lus enkel als count == 5 21 22 output += count + " "; 23 24 } // einde for structuur Lijn 16 Herhaal 10 keer Lijn 20 ga uit de for structuur (break) wanneer count gelijk is aan 5
Voorbeeld met continue statement 1 // Fig. 5.12: ContinueTest .java 2 // Gebruik van het continue statement in een for structuur 3 4 // Java extension packages 5 import javax .swing. JOptionPane ; 6 7 public class ContinueTest 8 { ContinueTest.java 9 // de uitvoering van de Java applicatie begint bij de main methode 10 public static void main( String args [] ) 11 { 12 String output = "" ; 13 14 // herhaal 10 keer 15 for ( int count = 1 ; count <= 10 ; count++ ) 16 { 17 // als count 5 is, ga verder met de volgende iteratie van de lus 18 if ( count == 5 ) 19 continue ; // sla de overblijvende code in de lus over 20 // enkel als count == 5 21 22 output += count + " " ; 23 24 } // einde for structuur 25 26 output += " \ nUsed continue to skip printing 5" ; 27 JOptionPane . showMessageDialog ( null , output ); 28 29 System.exit( ); // beëindig de applicatie 30 31 } // einde methode main 32 33 } // einde klasse ContinueTest
Sla lijn 22 over en ga verder naar lijn 15 als count 5 is 15 for ( int count = 1; count <= 10; count++ ) 16 { 17 // als count 5 is, ga verder met de volgende iteratie van de lus 18 if ( count == 5 ) 19 continue; // sla de overblijvende code 20 // in de lus over enkel als count == 5 21 22 output += count + " "; 23 24 } // einde for structuur Lijn 15 Herhaal 10 keer Lijn 19 Sla lijn 22 over en ga verder naar lijn 15 als count 5 is
5.8. GELABELDE “BREAK” EN “CONTINUE” STATEMENTS Gelabeled blok reeks statements omvat door {} voorafgegaan door een label Gelabeled break statement exit uit geneste controlestructuren gaat verder bij het einde van het gespecifieerde gelabelde blok Labeled continue statement slaat de resterende statements in de body van de geneste loop over gaat verder bij het begin van het gespecifieerde gelabelde blok
BreakLabelTest.java programma met een gelabeled break statement VOORBEELD BreakLabelTest.java programma met een gelabeled break statement 1 // Fig. 5.13 BreakLabelTest.java 2 // Gebruik van het break statement met een label 3 4 // Java extension packages 5 import javax.swing.JOptionPane; 6 7 public class BreakLabelTest 8 { 9 // de uitvoering van de Java applicatie begint bij de main methode 10 public static void main( String args[] ) 11 { 12 String output = ""; 13
stop is het gelabelde blok 14 stop: // gelabeled blok 15 { 16 // count 10 rows 17 for ( int row = 1; row <= 10; row++ ) 18 { 19 // tel 10 rijen 20 for ( int column = 1; column <= 5 ; column++ ) 21 { 22 // tel 5 kolommen 23 if ( row == 5 ) 24 break stop; // spring naar het einde van 25 // het stop blok 26 output += "* "; 27 28 } // einde binnenste for structuur 29 30 output += "\n"; 31 32 } // einde buitenste for structuur 33 34 // de volgende lijn wordt overgeslagen 35 output += "\nLoops terminated normally"; 36 37 } // einde gelabeled blok stop is het gelabelde blok Exit naar lijn 37
38 39 JOptionPane.showMessageDialog( 40 null, output,"Testing break with a label", 41 JOptionPane.INFORMATION_MESSAGE ); 42 43 System.exit( 0 ); // beëindig de applicatie 44 45 } // einde methode main 46 47 } // einde klasse BreakLabelTest
ContinueLabelTest.java programma met een gelabeled continue statement VOORBEELD ContinueLabelTest.java programma met een gelabeled continue statement 1 // Fig. 5.14 ContinueLabelTest.java 2 // Gebruik van het continue statement met een label 3 4 // Java extension packages 5 import javax.swing.JOptionPane; 6 7 public class BreakLabelTest 8 { 9 // de uitvoering van de Java applicatie begint bij de main methode 10 public static void main( String args[] ) 11 { 12 String output = ""; 13
nextRow is het gelabelde blok 14 nextRow: // doellabel van het continue statement 15 { 16 // tel 5 rijen 17 for ( int row = 1; row <= 5; row++ ) 18 { output += "\n"; 19 20 // tel 10 kolommen per rij 21 for ( int column = 1; column <= 10; column++ ) 22 { 23 // als column groter is dan row, begin met volgende rij 24 if ( column > row ) 25 continue nextRow; // volgende iteratie van 26 // de gelabelde lus 27 28 output += "* "; 29 30 } // einde binnenste for structuur 31 32 } // einde buitenste for structuur 33 } nextRow is het gelabelde blok Lijn 25 continue (ga verder) op lijn 14 (nextRow)
34 35 JOptionPane.showMessageDialog( 36 null, output,"Testing continue with a label", 37 JOptionPane.INFORMATION_MESSAGE ); 38 39 System.exit( 0 ); // beëindig de applicatie 40 41 } // einde methode main 42 43 } // einde klasse ContinueLabelTest
zorgen ervoor dat complexere condities gevormd kunnen worden 5.9. LOGISCHE OPERATOREN Logische operatoren zorgen ervoor dat complexere condities gevormd kunnen worden combineren eenvoudige condities Logische operatoren in Java && (logische EN) & (booleaanse logische EN) || (logische OF) | (booleaanse logische inclusieve OF) ^ (booleaanse logische exclusieve OF) ! (logische NIET)
WAARHEIDSTABEL LOGISCHE EN (&&)
WAARHEIDSTABEL LOGISCHE OF (||)
WAARHEIDSTABEL LOGISCHE EXCLUSIEVE OF (^)
WAARHEIDSTABEL LOGISCHE EXCLUSIEVE OF (^) Deze operator heeft geen short-circuit evaluatie! Beide operands worden steeds geëvalueerd! Voorbeeld: Als x negatief is moet y positief zijn of omgekeerd, als y negatief is moet x positief zijn. if (x < 0 ^ y < 0) // (x < 0 en y >= 0) of // (y < 0 en x >= 0)
WAARHEIDSTABEL LOGISCHE NIET (!)
Short-circuit-operatoren De booleaanse logische AND (&) en de booleaanse logische inclusieve OR (|) werken op dezelfde manier als de logische AND (&&) en de logische OF (||), mits één uitzondering: het zijn GEEN short-circuit-operatoren de booleaanse logische operatoren evalueren steeds de beide operands Voorbeelden: geslacht == 1 & leeftijd >= 65 verjaardag == true | ++ leeftijd >= 65
Short-circuit-operatoren (vervolg) een expressie met een logische AND (&&) of een logische OF (||) wordt geëvalueerd totdat geweten is of de volledige expressie true of false oplevert Gevolgen: Zet bij de operator && de conditie die meest kans heeft om vals te zijn links van de operator, bij de operator || de conditie die meest kans heeft om waar te zijn. Zet de conditie die eventueel niet mag geëvalueerd worden rechts!
Short-circuit-operatoren (vervolg) Voorbeelden: n != 0 && q < 1.0 / n Als n = 0 dan is n != 0 vals -> volledig vals en GEEN deling door nul! n == 0 || q > 1.0 / n Als n = 0 dan is n == 0 true -> volledig true en GEEN deling door nul! verjaardag == true || ++ leeftijd >= 65 Als verjaardag = true dan is conditie1 true -> volledig true, MAAR geen aanpassing van de leeftijd!!!
Logical Operators.java 1 // Fig. 5.19: LogicalOperators .java 2 // Demonstratie van de logische operatoren 3 4 // Java extension packages 5 import javax .swing.*; 6 7 public class LogicalOperators 8 { 9 Logical Operators.java // de uitvoering van de Java applicatie begint bij de main methode 10 public static void main( String args [] ) 11 { 12 // creëer een JTextArea om de resultaten te laten zien 13 JTextArea outputArea = new JTextArea ( 17 , 20 ); 14 15 // hang de JTextArea aan een JScrollPane, zodat de gebruiker kan 16 // scrollen door de resultaten 17 JScrollPane scroller = new JScrollPane ( outputArea ); 18 19 String output; waarheidstabel logische EN 20 21 // creëer de waarheidstabel voor de && operator 22 output = "Logical AND (&&)" + 23 " \ nfalse && false: " + ( false && false ) + 24 " \ nfalse && true: " + ( false && true ) + 25 " \ ntrue && false: " + ( true && false ) + 26 " \ ntrue && true: " + ( true && true ); 27 waarheidstabel logische OF 28 // creëer de waarheidstabel voor de || operator 29 output += " \ n \ nLogical OR (||)" + 30 " \ nfalse || false: " + ( false || false ) + 31 " \ nfalse || true: " + ( false || true ) + 32 " \ ntrue || false: " + ( true || false ) + 33 " \ ntrue || true: " + ( true || true ); 34
Logical Operators.java 35 // creëer de waarheidstabel voor de & operator 36 output += " \ n nBoolean logical AND (&)" + 37 nfalse & false: " + ( false & ) + 38 & true: " true 39 ntrue 40 ); 41 42 // creëer de waarheidstabel voor de | operator 43 logical inclusive OR (|)" + 44 | false: " | 45 | true: " 46 47 48 49 // creëer de waarheidstabel voor de ^ operator 50 logical exclusive OR (^)" 51 ^ false: " ^ 52 ^ true: " 53 54 55 56 // creëer de waarheidstabel voor de ! operator 57 nLogical NOT (!)" 58 n!false: " + ( ! 59 n!true: " 60 61 outputArea . setText ( output ); // plaats resultaten in JOptionPane 62 63 JOptionPane showMessageDialog ( null , scroller 64 waarheidstabel voor de booleaanse logische EN Logical Operators.java vervolg waarheidstabel voor de booleaanse logische OF Waarheidstabel voor de booleaanse logische exclusieve OF Waarheidstabel voor de logische NIET "Truth Tables" , JOptionPane . INFORMATION_MESSAGE ); 65 66 System.exit( ); // beëindig de applicatie
LogicalOperators.java vervolg 67 68 } // einde methode main 69 70 } // einde klasse LogicalOperators LogicalOperators.java vervolg
Lijn 22-26 21 // creëer de waarheidstabel voor de && operator 22 output = "Logical AND (&&)" + 23 "\nfalse && false: " + ( false && false ) + 24 "\nfalse && true: " + ( false && true ) + 25 "\ntrue && false: " + ( true && false ) + 26 "\ntrue && true: " + ( true && true ); 27 Lijn 22-26 waarheidstabel logische EN
Lijn 29-33 28 // creëer de waarheidstabel voor de || operator 29 output += "\n\nLogical OR (||)" + 30 "\nfalse || false: " + ( false || false ) + 31 "\nfalse || true: " + ( false || true ) + 32 "\ntrue || false: " + ( true || false ) + 33 "\ntrue || true: " + ( true || true ); 34 Lijn 29-33 waarheidstabel logische OF
Lijn 36-40 35 // creëer de waarheidstabel voor de & operator 36 output += "\n\nBoolean logical AND (&)" + 37 "\nfalse & false: " + ( false & false ) + 38 "\nfalse & true: " + ( false & true ) + 39 "\ntrue & false: " + ( true & false ) + 40 "\ntrue & true: " + ( true & true ); 41 Lijn 36-40 waarheidstabel voor de booleaanse logische EN
Lijn 43-47 42 // creëer de waarheidstabel voor de | operator 43 output += "\n\nBoolean logical inclusive OR (|)" + 44 "\nfalse | false: " + ( false | false ) + 45 "\nfalse | true: " + ( false | true ) + 46 "\ntrue | false: " + ( true | false ) + 47 "\ntrue | true: " + ( true | true ); 48 Lijn 43-47 waarheidstabel voor de booleaanse logische OF
Lijn 50-54 49 // creëer de waarheidstabel voor de ^ operator 50 output += "\n\nBoolean logical exclusive OR (^)" + 51 "\nfalse ^ false: " + ( false ^ false ) + 52 "\nfalse ^ true: " + ( false ^ true ) + 53 "\ntrue ^ false: " + ( true ^ false ) + 54 "\ntrue ^ true: " + ( true ^ true ); 55 Lijn 50-54 Waarheidstabel voor de booleaanse logische exclusieve OF
Lijn 57-59 56 // creëer de waarheidstabel voor de ! operator 57 output += "\n\nLogical NOT (!)" + 58 "\n!false: " + ( !false ) + 59 "\n!true: " + ( !true ); 60 Lijn 57-59 Waarheidstabel voor de logische NIET
PRECEDENTIE EN ASSOCIATIVITEIT VAN DE OPERATOREN
GESTRUCTUREERD PROGRAMMEREN 5.10. SAMENVATTING GESTRUCTUREERD PROGRAMMEREN Sequentiestructuur “ingebouwd” in Java Selectiestructuren if, if/else en switch Herhalingsstructuren while, do/while en for
SAMENVATTING HERHALINGSSTRUCTUREN Je gebruikt een ‘for’ indien je van tevoren weet om hoeveel herhalingen het gaat. Weet je niet van tevoren om hoeveel herhalingen het gaat, dan dien je een ‘while’ of een ‘do-while’ te gebruiken. Je kiest voor een ‘while’ indien de body van de while misschien nooit mag worden uitgevoerd. De ‘voorwaarde’ wordt eerst getest. De body van de while wordt uitgevoerd zolang de ‘voorwaarde’ waar is. Je kiest voor een ‘do-while’ indien de body van de ‘do-while’ tenminste één keer mag worden uitgevoerd. Eerst wordt de body van de ‘do-while uitgevoerd, vervolgens wordt de voorwaarde gecontroleerd. Zolang de expressie waar is wordt de body van de ‘do-while’ uitgevoerd.
SAMENVATTING HERHALINGSSTRUCTUREN de body van de while wordt 0, 1 of meerdere keren uitgevoerd. de body van de do-while wordt minstens 1 keer uitgevoerd.
FLOWCHARTS Selectie Sequentie T if structuur (enkelvoudige selectie) break F T T break F F T F T break F switch structuur (meervoudige selectie) Fig. 5.21 Java’s enkele-ingang/enkele-uitgang controlestructuren.
FLOWCHARTS (VERVOLG) Herhaling do/while structuur while structuur T F for structuur F T F Fig. 5.21 Java’s enkele-ingang/enkele-uitgang controlestructuren. (vervolg)
REGELS OM GESTRUCTUREERDE PROGRAMMA’S TE VORMEN De nesting regel
DE EENVOUDIGSTE FLOWCHART Fig. 5.23 De eenvoudigste flowchart.
HERHAALD TOEPASSEN VAN REGEL 2 OP DE EENVOUDIGSTE FLOWCHART Fig. 5.24 Herhaald toepassen van Regel 2 van Fig. 5.22 op de eenvoudigste flowchart.
EENVOUDIGSTE FLOWCHART REGEL 3 TOEPASSEN OP DE EENVOUDIGSTE FLOWCHART Regel 3 Regel 3 Regel 3 Fig. 5.25 Regel 3 van Fig. 5.22 toege-past op de eenvoudigste flowchart
GESTAPELDE, GENESTE EN OVERLAPPENDE BOUWBLOKKEN geneste bouwblokken gestapelde bouwblokken Overlappende bouwblokken (illegaal in gestructureerde programma’s) Fig. 5.26 Gestapelde, geneste en overlappende bouwblokken.
EEN ONGESTRUCTUREERDE FLOWCHART Fig. 5.27 Een ongestructureerde flowchart.