HOOFDSTUK 5 CONTROLESTRUCTUREN (DEEL 2) 5.1. INTRODUCTIE Vervolg discussie omtrent gestructureerd programmeren Introductie van de overblijvende controlestructuren 1 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 2 VOORBEELD WhileCounter.java • is een programma (applet), dat een waaier van 10 lijnen gaat tekenen • gebruikt een while- herhalingsstructuur • gebruikt een teller om de herhaling bij te houden 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 // Fig. 5.1: WhileCounter.java // Herhaling gecontroleerd door een teller // Java core packages import java.awt.Graphics; // Java extension packages import javax.swing.JApplet; public class WhileCounter extends JApplet { // trek lijnen op de achtergrond van de applet lines on applet public void paint( Graphics g ) { // roep de overgeërfde versie van de methode paint op super.paint( g ); int counter = 1; // initialisatie while ( counter <= 10 ) // conditie van de herhaling { g.drawLine( 10, 10, 250, counter * 10 ); ++counter; // increment } // einde while structuur } } // einde methode paint // einde klasse WhileCounter 4 18 19 20 21 22 23 24 int counter = 1; // initialisatie while ( counter <= 10 ) // conditie van de herhaling { g.drawLine( 10, 10, 250, counter * 10 ); ++counter; // increment } // 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 5.3. DE “FOR” HERHALINGSSTRUCTUUR for ( expressie1; expressie2; expressie3 ) statement • hanteert alle details van de herhalingsstructuur met teller 6 VOORBEELD ForCounter.java • is een programma (applet), dat een waaier van 10 lijnen gaat tekenen. • gebruikt een for-herhalingsstructuur. 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Fig. 5.2: ForCounter.java // Herhaling gecontroleerd door een teller via een for-structuur // Java core packages import java.awt.Graphics; // Java extension packages import javax.swing.JApplet; public class ForCounter extends JApplet { // teken lijnen op de achtergrond van de applet public void paint( Graphics g ) { // roep de overgeërfde versie van de methode paint op super.paint( g ); // Initialisatie, herhalingsconditie and incrementeren // zijn allemaal inbegrepen in de hoofding van de for structuur. for ( int counter = 1; counter <= 10; counter++ ) g.drawLine( 10, 10, 250, counter * 10 ); } } // einde methode paint // einde klasse ForCounter 8 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. 9 REGEL 20 UIT FORCOUNTER.JAVA for sleutelwoord Naam van de controlevariabele Eindwaarde van de controlevariabele for ( int counter = 1; counter <= 10; counter++ ) Beginwaarde van de controlevariabele Increment van de controlevariabele Conditie voor vervolg van de lus Fig. 5.3 Componenten van een typische hoofding van een “for” structuur. 10 5.3. DE “FOR” HERHALINGSSTRUCTUUR (VERVOLG) for ( expressie1; expressie2; expressie3 ) statement kan herschreven worden als: { expressie1; while ( expressie2 ) { } statement expressie3; } 11 FLOWCHART VAN EEN TYPISCHE “FOR” HERHALINGSSTRUCTUUR Fig. 5.4 Flowchart van een typische “for” herhalingsstructuur. Stel de beginwaarde counter <- 1 van de controle- variabele vast true Bepaal of counter <= 10 10, 10, 250, counter * 10 de eindwaarde ); van de controle- variabele bereikt is. g.drawLine( false “body” van de lus counter<- counter Incrementeer de controlevariabele. (dit kunnen meerdere Statements zijn) 12 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 ) 13 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. 14 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 total = 0; 13 14 // sommeer de even gehele getallen van 2 tot en met 100 15 for ( int number = 2; number <= 100; number += 2 ) 16 total += number; 17 18 // toon het resultaat 19 JOptionPane.showMessageDialog( null, "The sum is " + total, 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 15 12 13 14 15 16 17 18 19 20 21 int total = 0; // sommeer de even gehele getallen van 2 tot en met 100 for ( int number = 2; number <= 100; number += 2 ) total += number; // toon het resultaat JOptionPane.showMessageDialog( null, "The sum is " + total, "Sum Even Integers from 2 to 100", JOptionPane.INFORMATION_MESSAGE ); Lijn 15 number += 2 • incrementeer number met 2 bij elke iteratie 16 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. 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 // Fig. 5.6: Interest.java // Berekening van samengestelde interest // Java core packages import java.text.NumberFormat; import java.util.Locale; // Java extension packages import javax.swing.JOptionPane; import javax.swing.JTextArea; Interest.java public class Interest { // de uitvoering van de Java applicatie begint bij de main methode public static void main( String args[] ) { double amount, principal = 1000.0, rate = 0.05; // creëer NumberFormat om floating point getallen // met twee cijfers rechts van de decimale punt te formatteren NumberFormat moneyFormat = NumberFormat.getCurrencyInstance ( Locale.US ); // creëer JtextArea om de uitvoer te laten zien JTextArea outputTextArea = new JTextArea(); // plaats de eerste lijn tekst in outputTextArea outputTextArea.setText( "Year\tAmount on deposit\n" ); // bereken het bedrag in deposito voor elk van de tien jaren for ( int year = 1; year <= 10; year++ ) { // bereken nieuw bedrag voor een specifiek jaar amount = principal * Math. pow( 1.0 + rate, year ); 18 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 } // voeg één lijn tekst toe aan outputTextArea outputTextArea.append( year + "\t" + moneyFormat.format( amount ) + "\n" ); } // einde for structuur // toon het resultaat JOptionPane.showMessageDialog( null, outputTextArea, "Compound Interest", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } // beëindig de applicatie // einde methode main // einde klasse Interest Interest.java vervolg code + uitvoer 19 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) 20 19 20 21 22 23 24 25 26 27 28 29 // creëer NumberFormat om floating point getallen // met twee cijfers rechts van de decimale punt te formatteren NumberFormat moneyFormat = NumberFormat.getCurrencyInstance( Locale.US ); // creëer JtextArea om de uitvoer te laten zien JTextArea outputTextArea = new JTextArea(); // plaats de eerste lijn tekst in outputTextArea outputTextArea.setText( "Year\tAmount on deposit\n" ); Lijn 21 • NumberFormat kan numerieke waarden als een valuta formatteren Lijn 22: Locale.US • Toont geldbedragen met een dollarteken ($) 21 30 31 32 33 34 35 36 37 38 39 40 // bereken het bedrag in deposito voor elk van de tien jaren for ( int year = 1; year <= 10; year++ ) { // bereken nieuw bedrag voor een specifiek jaar amount = principal * Math.pow( 1.0 + rate, year ); // voeg één lijn tekst toe aan outputTextArea outputTextArea.append( year + "\t" + moneyFormat.format( amount ) + "\n" ); } // 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 22 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 23 5.5. 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! 24 VOORBEELD DoWhileControle.java • Er wordt gevraagd om een positief geheel getal, verschillend van nul in te voeren; de invoer wordt vervolgens gecontroleerd; indien deze niet voldoet, wordt een nieuwe waarde aan de gebruiker gevraagd. Is de invoer in orde, dan wordt dit getal in een dialoogvenster getoond. 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 // Dit voorbeeld staat niet in het boek!!! // Using the do/while repetition structure. // Java core packages import java.awt.Graphics; // Java extension packages import javax.swing.*; public class DoWhileControle { public static void main( String[] args ) { int getal; String input; do { input = JOptionPane.showInputDialog(“Geef een positief geheel getal,verschillend van nul in : “); getal = Integer.parseInt(input); } while ( getal <= 0 ); // einde do/while structuur JOptionPane.showMessageDialog(null,”Het ingevoerde getal getal); System.exit(0); } // einde methode main } // einde klasse DoWhileControle = “ + 26 18 19 20 21 22 23 do { input = JOptionPane.showInputDialog(“Geef een positief geheel getal,verschillend van nul in : “); getal = Integer.parseInt(input); } while ( getal <= 0 ); // einde do/while structuur Lijn 19-23 • Een getal wordt ingevoerd en vervolgens wordt er getest op de waarde van getal. • Voldoet de waarde van getal niet, dan krijgt de gebruiker een tweede kans om een getal in te voeren. • Enz..., tot het ingevoerde getal voldoet aan de gestelde vraag. Merk op: de lus wordt niet verlaten, zolang het ingevoerde getal niet voldoet! 27 FLOWCHART VAN DE “DO/WHILE” HERHALINGSSTRUCTUUR actie(s) true conditie false Fig. 5.10 Flowchart van de do/while herhalingsstructuur. 28 5.6. DE “SWITCH” MEERVOUDIGE SELECTIESTRUCTUUR switch structuur wordt gebruikt voor meervoudige selecties: switch (var) { case label1: statement1 break; case label2: statement2 break; default: statement3 [ break;] } 29 VOORBEELD SwitchTest.java (= applet) • 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. 30 1 2 3 4 5 6 7 8 9 10 // Fig. 5.7: SwitchTest.java // Lijnen, rechthoeken of ovalen tekenen op basis van de input van de gebruiker. // Java core packages import java.awt.Graphics; // Java extension packages import javax.swing.*; Verkrijg input van de gebruiker public class SwitchTest extends JApplet 11 { private int choice; // keuze van de gebruiker 12 13 14 15 16 welke vorm getekend moet worden // initialiseeer de applet door de keuze van de gebruiker public void init() { String input; // input van de gebruiker te verkrijgen 17 18 19 20 21 22 23 24 25 26 // verkrijg de keuze van de gebruiker input = JOptionPane.showInputDialog( "Enter 1 to draw lines\n" + "Enter 2 to draw rectangles\n" + "Enter 3 to draw ovals\n"); // converteer de input van de gebruiker naar een int choice = Integer.parseInt( input ); } 31 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 // bepaal de te tekenen vorm op basis van de keuze van de gebruiker 35 36 switch ( choice ) 37 { 38 case 1: 39 for ( int i = 0; i < 10; i++ ) g.drawLine( 10, 10, 250, 10 + i * 10 ); 40 break; // gedaan met dit geval te verwerken 41 42 case 2: 43 for ( int i = 0; i < 10; i++ ) 44 g.drawRect( 10 + i * 10, 10 + i * 10, 50 + i * 10, 50 + i * 10 ); 45 break; // gedaan met dit geval te verwerken 46 47 case 3: 48 for ( int i = 0; i < 10; i++ ) 49 g.drawOval( 10 + i * 10, 10 + i * 10,50 + i * 10, 50 + i * 10 ); 50 break; // gedaan met dit geval te verwerken 51 52 default: 53 g.drawString( "Invalid value entered", 54 10, 20 + i * 15 ); 55 56 } // einde switch structuur 57 58 } // einde for structuur 59 60 } // einde paint methode 61 62 } // einde klasse SwitchTest 32 SWITCHTEST.JAVA: OUTPUT 33 36 37 38 switch ( choice ) { case 1: 39 40 41 for ( int i = 0; i < 10; i++ ) g.drawLine( 10, 10, 250, 10 + i * 10 ); 42 case 2: 43 44 45 46 47 48 49 50 51 52 53 54 55 56 break; input van de gebruiker (choice) is de for ( int i = 0; i < 10; i++ ) controlerende expressie g.drawRect( 10 + i * 10, 10 + i * 10,50 + i * 10, 50 + i * 10 ); break; // gedaan met dit geval te verwerken case 3: for ( int i = 0; i < 10; i++ ) g.drawOval( 10 + i * 10, 10 + i * 10,50 + i * 10, 50 + i * 10 ); break; // gedaan met dit geval te verwerken default: g.drawString( "Invalid value entered", 10, 20 + i * 15 ); default case voor ongeldige ingaven } // einde switch structuur Lijn 36 • de switch structuur bepaalt welk case label uitgevoerd moet worden, wat afhangt van de controlerende expressie. 34 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. 35 Zet de volgende geneste if-structuren om in een switch – case-structuur 1. int i, k; // invoer van een waarde voor i if (i == 1) k = 3; else if (i == 2) k = 6; else if ( i == 3 || i == 4) k = 10; else k = 20; } 2. int x, y = 0; // invoer van een waarde voor x if (x == 100 || x == 150 || x == 170 || x == 199) y++; 36 OPLOSSINGEN 1. int i, k; // invoer van een waarde voor i switch (i) { case 1 : k = 3; break; case 2 : k = 6; break; case 3 : case 4 : k = 10; break; default : k = 20; } 37 OPLOSSINGEN 2. int x, y = 0; // invoer van een waarde voor x switch (x) { case 100 : case 150 : case 170 : case 199 : y++; } 38 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 39 Voorbeeld met break statement 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 // Fig. 5.11: BreakTest.java // Gebruik van het break statement in een for structuur // Java extension packages import javax.swing.JOptionPane; public class BreakTest { // de uitvoering van de Java applicatie begint bij de main methode public static void main( String args[] ) { String output = ""; int count; BreakTest.java // herhaal 10 keer for ( count = 1; count <= 10; count++ ) { // als count gelijk is aan 5, beëindig dan de lus if ( count == 5 ) break; // onderbreek de lus enkel als count == 5 output += count + " "; } // einde for structuur output += "\nBroke out of loop at count = " + count; JOptionPane.showMessageDialog( null, output ); System.exit( 0 ); } } // beëindig de applicatie // einde methode main // einde klasse BreakTest 40 16 17 18 19 20 21 22 23 24 for ( count = 1; count <= 10; count++ ) { // als count gelijk is aan 5, beëindig dan de lus if ( count == 5 ) break; // onderbreek de lus enkel als count == 5 output += count + " "; } // einde for structuur Lijn 16 • Herhaal 10 keer Lijn 20 • ga uit de for structuur (break) wanneer count gelijk is aan 5 41 Voorbeeld met continue statement 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 // Fig. 5.12: ContinueTest .java // Gebruik van het continue statement in een for structuur // Java extension packages import javax .swing. JOptionPane ; public class ContinueTest { // de uitvoering van de Java applicatie begint bij de main methode public static void main( String args [] ) { String output = ""; ContinueTest .java // herhaal 10 keer for ( int count = 1; count <= 10; count++ ) { // als count 5 is, ga verder met de volgende iteratie van de lus if ( count == 5 ) continue ; // sla de overblijvende code in de lus over // enkel als count == 5 output += count + } " "; // einde for structuur output += "\nUsed continue to skip printing 5" ; JOptionPane .showMessageDialog ( null , output ); System.exit( 0 ); // beëindig de applicatie } // einde methode main } // einde klasse ContinueTest 42 15 16 17 18 19 20 21 22 23 24 for ( int count = 1; count <= 10; count++ ) { // als count 5 is, ga verder met de volgende iteratie van de lus if ( count == 5 ) continue; // sla de overblijvende code // in de lus over enkel als count == 5 output += count + " "; } // einde for structuur Lijn 15 • Herhaal 10 keer Lijn 19 • Sla lijn 22 over en ga verder naar lijn 15 als count 5 is 43 5.8. LOGISCHE OPERATOREN Logische operatoren • zorgen ervoor dat complexere condities gevormd kunnen worden • combineren eenvoudige condities Logische operatoren in Java • && (conditionele EN) •& (logische EN) • || (conditionele OF) •| (logische inclusieve OF) •^ (logische exclusieve OF) •! (logische NIET) 44 WAARHEIDSTABEL CONDITIONELE EN (&&) expressie1 expressie2 expressie1 && expressie2 false false false false true false true false false true true true Fig. 5.15 Waarheidstabel voor de && operator. 45 WAARHEIDSTABEL CONDITIONELE OF (||) expressie1 expressie2 expressie1 || expressie2 false false false false true true true false true true true true Fig. 5.15 Waarheidstabel voor || operator. 46 WAARHEIDSTABEL LOGISCHE EXCLUSIEVE OF (^) expressie1 expressie2 expressie1 ^ expressie2 false false false false true true true false true true true false Fig. 5.15 Waarheidstabel voor de logische exclusieve OF (^) operator. 47 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) 48 WAARHEIDSTABEL LOGISCHE NIET (!) expressie !expressie false true true false Fig. 5.18 Waarheidstabel voor de operator ! (logische negatie, of logische NIET). 49 Short-circuit-operatoren • De logische AND (&) en de logische inclusieve OR (|) werken op dezelfde manier als de conditionele AND (&&) en de conditionele OF (||), mits één uitzondering: het zijn GEEN short-circuit-operatoren • de logische operatoren & en | evalueren steeds de beide operands Voorbeelden: geslacht == 1 & leeftijd >= 65 verjaardag == true | ++ leeftijd >= 65 50 Short-circuit-operatoren (vervolg) • een expressie met een conditionele AND (&&) of een conditionele OF (||) wordt geëvalueerd totdat geweten is of de volledige expressie true of false oplevert Gevolgen: 1. 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. 2. Zet de conditie die eventueel niet mag geëvalueerd worden rechts! 51 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!!! 52 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 // Fig. 5.19: LogicalOperators .java // Demonstratie van de logische operatoren // Java extension packages import javax .swing.*; public class LogicalOperators { // de uitvoering van de Java applicatie begint bij de main methode public static void main( String args [] ) { // creëer een JTextArea om de resultaten te laten zien JTextArea outputArea = new JTextArea ( 17 , 20 ); Logical Operators .java // hang de JTextArea aan een JScrollPane, zodat de gebruiker kan // scrollen door de resultaten JScrollPane scroller = new JScrollPane ( outputArea ); String output; waarheidstabel logische EN // creëer de waarheidstabel voor de && operator output = "Logical AND (&&)" + "\nfalse && false: " + ( false && false ) + "\nfalse && true: " + ( false && true ) + "\ntrue && false: " + ( true && false ) + "\ntrue && true: " + ( true && true ); // creëer de waarheidstabel voor de || operator output += "\n\nLogical OR (||)" + "\nfalse || false: " + ( false || false ) + "\nfalse || true: " + ( false || true ) + "\ntrue || false: " + ( true || false ) + "\ntrue || true: " + ( true || true ); waarheidstabel logische OF 53 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 // creëer de waarheidstabel voor de & operator output += "\n\nBoolean logical AND (&)" + "\nfalse & false: " + ( false & false ) + "\nfalse & true: " + ( false & true ) + "\ntrue & false: " + ( true & false ) + waarheidstabel "\ntrue & true: " + ( true & true ); voor de booleaanse logische EN // creëer de waarheidstabel voor de | operator output += "\n\nBoolean logical inclusive OR (|)" + "\nfalse | false: " + ( false | false ) + "\nfalse | true: " + ( false | true ) + "\ntrue | false: " + ( true | false ) + waarheidstabel "\ntrue | true: " + ( true | true ); voor de booleaanse logische OF // creëer de waarheidstabel voor de ^ operator output += "\n\nBoolean logical exclusive OR (^)" "\nfalse ^ false: " + ( false ^ false ) + "\nfalse ^ true: " + ( false ^ true ) + "\ntrue ^ false: " + ( true ^ false ) + "\ntrue ^ true: " + ( true ^ true ); // creëer de waarheidstabel voor de ! output += "\n\nLogical NOT (!)" + "\n!false: " + ( ! false ) + "\n!true: " + ( ! true ); outputArea .setText ( output ); // 0 ); vervolg + Waarheidstabel voor de booleaanse logische operator exclusieve OF Waarheidstabel voor de NIETin JOptionPane plaatslogische resultaten JOptionPane .showMessageDialog ( null , scroller , "Truth Tables" , JOptionPane .INFORMATION_MESSAGE System.exit( Logical Operators .java ); // beëindig de applicatie 54 67 68 69 70 } } // einde methode main // einde klasse LogicalOperators LogicalOperators.java vervolg 55 21 22 23 24 25 26 27 // creëer de waarheidstabel voor de && operator output = "Logical AND (&&)" + "\nfalse && false: " + ( false && false ) + "\nfalse && true: " + ( false && true ) + "\ntrue && false: " + ( true && false ) + "\ntrue && true: " + ( true && true ); Lijn 22-26 • waarheidstabel logische EN 56 28 29 30 31 32 33 34 // creëer de waarheidstabel voor de || operator output += "\n\nLogical OR (||)" + "\nfalse || false: " + ( false || false ) + "\nfalse || true: " + ( false || true ) + "\ntrue || false: " + ( true || false ) + "\ntrue || true: " + ( true || true ); Lijn 29-33 • waarheidstabel logische OF 57 35 36 37 38 39 40 41 // creëer de waarheidstabel voor de & operator output += "\n\nBoolean logical AND (&)" + "\nfalse & false: " + ( false & false ) + "\nfalse & true: " + ( false & true ) + "\ntrue & false: " + ( true & false ) + "\ntrue & true: " + ( true & true ); Lijn 36-40 • waarheidstabel voor de booleaanse logische EN 58 42 43 44 45 46 47 48 // creëer de waarheidstabel voor de | operator output += "\n\nBoolean logical inclusive OR (|)" + "\nfalse | false: " + ( false | false ) + "\nfalse | true: " + ( false | true ) + "\ntrue | false: " + ( true | false ) + "\ntrue | true: " + ( true | true ); Lijn 43-47 • waarheidstabel voor de booleaanse logische OF 59 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 60 56 57 58 59 60 // creëer de waarheidstabel voor de ! operator output += "\n\nLogical NOT (!)" + "\n!false: " + ( !false ) + "\n!true: " + ( !true ); Lijn 57-59 • Waarheidstabel voor de logische NIET 61 PRECEDENTIE EN ASSOCIATIVITEIT VAN DE OPERATOREN Operators Associativity Type () ++ ++ * + < == & ^ van van van van van van van van van haakjes unair postfix unair multiplicerend toevoegend relationeel gelijkheid booleaanse logische EN booleaanse logische exclusieve OF booleaanse logische inclusieve OF logische EN logische OF conditioneel toekenning --- + - ! (type) / % <= > >= != links naar rechts rechts naar links rechts naar links links naar rechts links naar rechts links naar rechts links naar rechts links naar rechts links naar rechts | van links naar rechts && || ?: = += -= *= /= %= van van van van links naar rechts links naar rechts rechts naar links rechts naar links Fig. 5.20 Precedentie en associativiteit van operatoren. 62 5.9. SAMENVATTING GESTRUCTUREERD PROGRAMMEREN Sequentiestructuur • “ingebouwd” in Java Selectiestructuren • if, if/else en switch Herhalingsstructuren • while, do/while en for 63 SAMENVATTING HERHALINGSSTRUCTUREN Je gebruikt een ‘for’ of een ‘while’ 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 ‘dowhile’ tenminste één keer moet worden uitgevoerd. Eerst wordt de body van de ‘do-while uitgevoerd, vervolgens wordt de voorwaarde gecontroleerd. Zolang de expressie 64 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. 65 OEFENINGEN Hoofdstuk 5 66 Vind de fout(en) in volgende stukjes code: 1. Deze code zou moeten printen of een geheel getal value, even of oneven is switch ( value % 2 ) { case 0: System.out.println( “Even getal” ); case 1: System.out.println( “Oneven getal” ); } 67 Vind de fout(en) in volgende stukjes code: 2. Deze code zou moeten de oneven gehele getallen van 19 tot en met 1 printen for ( x = 19; x >= 1; x += 2 ) System.out.println( x ); 68 Welke output geven volgende statements? Stel: i = 1, j = 2, k = 3 en m = 2 a) b) c) d) e) f) g) System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( i == 1 ); j == 3 ); i >= 1 && j < 4 ); m <= 99 & k < m ); j >= i || k == m ); k + m < j | 3 – j >= k ); !( k > m ) ); 69 Schrijf een applicatie die… volgende patronen print, enkel gebruik makend van: System.out.print(‘*’), System.out.println() en voor (c) en (d) ook nog System.out.print(‘ ’) (a) (b) (c) (d) * ** *** **** ***** ****** ******* ******** ********* *********** ********** ********* ******** ******* ****** ***** **** *** ** * ********** ********* ******** ******* ****** ***** **** *** ** * * ** *** **** ***** ****** ******* ******** ********* ********** 70 OPLOSSINGEN Hoofdstuk 5 71 Verbeterde code: 1. Deze code zal printen of een geheel getal value, even of oneven is switch ( value % 2 ) { case 0: System.out.println( “Even getal” ); break; case 1: System.out.println( “Oneven getal” ); break; } 72 Verbeterde code: 2. Deze code zal de oneven gehele getallen van 19 tot en met 1 printen int x; for ( x = 19; x >= 1; x -= 2 ) System.out.println( x ); 73 Welke output geven volgende statements? Stel: i = 1, j = 2, k = 3 en m = 2 a) b) c) d) e) f) g) System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( System.out.println( i == 1 ); j == 3 ); i >= 1 && j < 4 ); m <= 99 & k < m ); j >= i || k == m ); k + m < j | 3 – j >= k ); !( k > m ) ); true false true false true false false 74 Schrijf een applicatie die… volgende patronen print, enkel gebruik makend van: System.out.print(‘*’), System.out.println() en voor (c) en (d) ook nog System.out.print(‘ ’) (a) (b) (c) (d) * ** *** **** ***** ****** ******* ******** ********* *********** ********** ********* ******** ******* ****** ***** **** *** ** * ********** ********* ******** ******* ****** ***** **** *** ** * * ** *** **** ***** ****** ******* ******** ********* ********** 75 Patroon a public class PatroonA { public static void main (String args[]) { for (int i=1; i<=10; i++) // 10 rijen { for (int j=1; j<=i; j++) // #kol = rij-index System.out.print (‘*’); System.out.println(); } } } 76 Patroon b public class PatroonB { public static void main (String args[]) { for (int i=1; i<=10; i++) // 10 rijen { for (int j1=1; j1<=i-1; j1++)// 0,1,..,9 sp System.out.print (‘ ’); for (int j2=11-i; j2>=1; j2--)//10,9,..,1 * System.out.print (‘*’); System.out.println(); } } 77 } Patroon c public class PatroonC { public static void main (String args[]) { for (int i=1; i<=10; i++) // 10 rijen { for (int j=11-i; j>=1; j--) // 10,9,8,..,1 kol System.out.print (‘*’); System.out.println(); } } } 78 Patroon d public class PatroonD { public static void main (String args[]) { for (int i=1; i<=10; i++)// 10 rijen { for (int j1=10-i; j1>=1; j1--)// 9,8,..,0 sp System.out.print (‘ ’); for (int j2=1; j2<=i; j2++)//1,2,3,..,10 * System.out.print (‘*’); System.out.println(); } } 79 }