HOOFDSTUK 4 CONTROLESTRUCTUREN (DEEL 1) 4.1. INTRODUCTIE Waarom controlestructuren? principe van gestructureerd programmeren controlestructuren helpen om objecten op te bouwen en ze te manipuleren (zie hoofdstuk 8) 1 4.2. ALGORITMEN Een algoritme is een procedure om een probleem op te lossen in termen van • de opdrachten die uitgevoerd moeten worden • de volgorde waarin ze moeten uitgevoerd worden Programmacontrole is de volgorde specifiëren in dewelke de acties uitgevoerd moeten worden in een programma controlestructuren helpen hierbij 2 4.3. PSEUDOCODE Pseudocode is … • een informele taal om algoritmen te ontwikkelen • GEEN taal die uitgevoerd wordt door computers • een taal die softwareontwikkelaars helpt bij het “uitdenken” van algoritmen • meestal beperkt tot de uitvoerbare statements, geen declaraties 3 4.4. CONTROLESTRUCTUREN Sequentiële uitvoering De statements in een programma worden één voor één uitgevoerd in de volgorde waarin ze geschreven zijn. Overdracht van de controle Drie controleopdrachten kunnen de volgorde specifiëren: • sequentiestructuur • selectiestructuur • herhalingsstructuur Flowchart Grafische representatie van een algoritme Lijnen geven de volgorde aan waarin de acties worden uitgevoerd. 4 FLOWCHART VAN EEN SEQUENTIESTRUCTUUR Lijnen Actiesymbolen total<- total + grade counter <- counter + 1 total = total + grade ; counter = counter1; + Connectiesymbolen Fig 4.1 Flowchart van een sequentiestrructuur in Java. 5 JAVA SLEUTELWOORDEN Java Sleutelwoorden abstract boolean break byte case catch do final implements long private static class else float instanceof new public switch continue extends for int null return synchronized default false if interface package short this transient while true try char double finally import native protected super throw throws void volatile Sleutelwoorden die gereserveerd zijn maar die niet worden gebruikt in Java const goto Fig. 4.2 Java sleutelwoorden. 6 CONTROLESTRUCTUREN IN JAVA • Java heeft een “ingebouwde” sequentiestructuur • Java voorziet drie selectiestructuren if if/else switch-case • Java voorziet drie herhalingsstructuren while do/while for • Elk van deze woorden is een Java-sleutelwoord 7 4.5. DE “IF” SELECTIESTRUCTUUR if (voorwaarde) statement Het statement wordt alleen uitgevoerd als de voorwaarde WAAR is (true). Structuur met één ingang en één uitgang. 8 Voorbeeld in pseudocode: Als punten >= 60 dan print "Geslaagd!" Eind-als Decisiesymbool punten >= 60 true print “Geslaagd” false Fig 4.3 Flowchart van de enkelvoudige selectiestructuur if 9 Voorbeeld in pseudocode: Als punten >= 60 dan print "Geslaagd!" Eind-als JAVA: if ( punten >= 60 ) System.out.println("Geslaagd"); 10 4.6. DE “IF/ELSE” SELECTIESTRUCTUUR if (voorwaarde) statement1 else statement2 Het statement1 wordt enkel uitgevoerd wanneer de voorwaarde WAAR (true) is. Het alternatieve statement, namelijk statement2 wordt enkel uitgevoerd wanneer de voorwaarde VALS (false) is. 11 Voorbeeld in pseudocode: Als punten >= 60 dan print "Geslaagd!" anders print "Niet geslaagd!" Eind-als false true punten >= 60 print “niet geslaagd” print “geslaagd” Fig 4.4 Flowchart van de dubbele selectiestructuur if/else. 12 Voorbeeld in pseudocode: Als punten >= 60 dan print "Geslaagd!" anders print "Niet geslaagd!" Eind-als JAVA: if ( punten >= 60 ) System.out.println("Geslaagd"); else System.out.println("Niet geslaagd"); 13 DE RELATIONELE OPERATOREN Operator In Java > > groter dan < < kleiner dan >= groter dan of gelijk aan <= kleiner dan of gelijk aan = == exact gelijk != verschillend 14 WAAROM LOGISCHE OPERATOREN? In sommige situaties hebben we meer nodig dan alleen maar relationele operatoren. Denk maar aan volgende situatie: als de variabele temp gelegen is tussen 22 en 25 dan hebben we een ideale zomertemperatuur. We doen dit met volgende test: temp >= 22 en temp <= 25 Om deze test te kunnen uitschrijven hebben we de logische enoperator nodig. In JAVA schrijven we de gecombineerde voorwaarde als volgt : (temp >= 22 && temp <= 25) 15 DE LOGISCHE OPERATOREN Logische operator In Java en && of || niet ! 16 DE LOGISCHE EN-OPERATOR De logische en-operator werkt met twee operanden die false of true kunnen zijn. (temp >= 22 && temp <= 25) 1ste operand 2de operand Een voorwaarde met de en-operator && heeft als resultaat true als beide operanden true leveren. Als één van beide operanden false levert, of beide leveren false, dan levert de en-operator && ook false op. 17 DE LOGISCHE OF-OPERATOR De logische of-operator werkt ook met twee operanden die false of true kunnen zijn. (temp == 20 || temp == 30) Als temp de waarde 20 heeft, dan levert de gecombineerde voorwaarde true op. Als temp de waarde 30 heeft, dan levert de gecombineerde voorwaarde true op. Maar als temp bv. de waarde 25 heeft, dan levert de voorwaarde false op, omdat beide operanden nu de waarde 18 false hebben. DE LOGISCHE NIET-OPERATOR De logische niet-operator werkt met één operand die false of true kan zijn. (!(temp == 20 || temp == 30)) De niet-operator keert de waarheidswaarde om: true wordt false en false wordt true. Als temp de waarde 20 of de waarde 30 heeft, dan levert de voorwaarde false op. In de andere gevallen levert de voorwaarde true op. 19 Oefeningen: stel de voorwaarde op in Java 1. x moet tussen 1 en 10 liggen (beide grenzen inbegrepen) X>=1 && x<=10 2. x moet negatief zijn en groter dan –5 X<0 && x>-5 3. x moet groter zijn dan 999, kleiner dan of gelijk aan 9999 en oneven X>999 && x<=9999 && x%2 !=0 4. x mag niet gelijk zijn aan 0 of x moet deelbaar zijn door 10 X!=0 || x%10==0 20 DE CONDITIONELE OPERATOR In de conditionele operator komt altijd een vraagteken (?) en een dubbel punt (:) voor. voorwaarde ? expressie1 : expressie2 Indien de voorwaarde waar is, wordt expressie1 uitgevoerd. Indien de voorwaarde niet waar is, wordt expressie2 uitgevoerd. 21 DE CONDITIONELE OPERATOR • Voorbeeld: if (a < b) z = a + 1; else z = b – 1; is equivalent met z = ( a < b ? a + 1 : b - 1); 22 DE CONDITIONELE OPERATOR • Voorbeeld: if (a < b) System.out.println(a); else System.out.println(b); is equivalent met System.out.println(a < b? a : b); Oplossing: System.out.println(aantal==1?student:studenten); 23 DE CONDITIONELE OPERATOR • Oefening: if (aantal == 1) System.out.println("Student"); else System.out.println("Studenten"); is equivalent met ? 24 GENESTE IF/ELSE SELECTIESTRUCTUREN • Voorbeeld: Drie getallen worden ingegeven. Het grootste getal wordt op het scherm weergegeven. if (getal1 > getal2) if (getal1 > getal3) System.out. println(getal1); else // getal1 <= getal3 System.out. println(getal3); else // getal1 <= getal2 if (getal2 > getal3) System.out. println(getal2); else // getal2 <= getal3 System.out. println(getal3); 25 GENESTE IF/ELSE SELECTIESTRUCTUREN if (getal1 > 10) if (getal2 > 20) System.out. println(“getal1 > 10 en getal2 > 20”); else System.out. println(“ ??? ”); Behoort de else bij “if (getal1 > 10)” of bij “if (getal2 > 20)”? 26 if (getal1 > 10) if (getal2 > 20) System.out. println(“getal1 > 10 en getal2 > 20”); else System.out. println(“ ??? ”); true false getal1 > 10 false true getal2 > 20 print “???” print “getal1 > 10 en getal2 > 20” 27 GENESTE IF/ELSE SELECTIESTRUCTUREN We wensen de else bij “if (getal1 > 10)” en niet bij “if (getal2 > 20)”: if (getal1 > 10) { if (getal2 > 20) System.out. println(“getal1 > 10 en getal2 > 20”); } else System.out. println(“ getal <= 10 ”); 28 if (getal1 > 10) { if (getal2 > 20) System.out. println(“getal1 > 10 en getal2 > 20”); } else System.out. println(“ getal <= 10 ”); false getal1 > 10 true print “getal <= 10” getal2 > 20 true print “getal1 > 10 en getal2 > 20” false 29 Oefeningen : stel voor met Java-code als x >= 0 dan druk "positief" anders druk "negatief« If (x>0) { System.out.println(« positief »); else { System.out.println(« negatief »); } als temp <= 10 dan druk "koud" als temp tussen 10 en 20 ligt dan druk "goed" als temp >= 20 dan druk "warm" als x >= 0 en even dan druk "positief en even" als x >= 0 en oneven dan druk "positief en oneven" als x < 0 en even dan druk "negatief en even" 30 4.7. DE HERHALINGSSTRUCTUUR “WHILE” while (voorwaarde) statement Het statement wordt herhaald zolang de voorwaarde WAAR blijft! Zorg ervoor dat de voorwaarde beïnvloed wordt in het statement, anders oneindige lus! 31 Voorbeeld in pseudocode: product <- 2 Herhaal zolang product <= 1000 product <- product * 2 Eind-herhaal product <- 2 true product <= 1000 product = 2 * product false Fig 4.5 Flowchart van de while herhalingsstructuur. 32 Voorbeeld in pseudocode: product <- 2 Herhaal zolang product <= 1000 product <- product * 2 Eind-herhaal JAVA: int product = 2; while ( product <= 1000 ) product = 2 * product; 33 4.8. ALGORITMEN FORMULEREN: VOORBEELD 1 (HERHALING MET EEN TELLER) Teller variabele die het aantal keer dat een reeks statements wordt uitgevoerd, bijhoudt en controleert Average1.java • is een programma dat het gemiddelde van de punten van 10 studenten berekent • gebruikt een teller om de herhaling bij te houden 34 ALGORITMEN FORMULEREN: VOORBEELD 1 PSEUDOCODE totaal <- 0 puntenteller <- 1 Herhaal zolang puntenteller <= 10 lees punten in totaal <- totaal + punten puntenteller <- puntenteller + 1 Eind-herhaal klasgemiddelde <- totaal / 10 Druk klasgemiddelde Fig. 4.6 Pseudocode van het algoritme dat herhaling door middel van een teller gebruikt om het probleem van het bepalen van het gemiddelde van een klas op te lossen 35 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. 4.7: Average1.java // Programma voor klasgemiddelde met herhaling via teller // Java extension packages import javax.swing.JOptionPane; Declareer variabelen; gradeCounter is de teller public class Average1 { // De uitvoering van de Java applicatie begint bij de “main” methode public static void main( String args[] ) { int total, // som van de punten ingevoerd door de gebruiker Blijf herhalen zolang gradeCounter, // aantal ingevoerde punten gradeCounter kleiner dan of // puntenwaarde grade , average; // gemiddelde van alle punten gelijk is aan 10 String gradeString; // punten zoals ingetypt door de gebruiker Average1.java // Initialisatiefase total = 0; // het totaal initialiseren op nul gradeCounter = 1; // voorbereiding op herhaling // Verwerkingsfase while ( gradeCounter <= 10 ) // herhaal 10 keer { // vraag om input en lees punten van gebruiker gradeString = JOptionPane.showInputDialog( "Enter integer grade: " ); // converteer punten van String naar integer grade = Integer.parseInt ( gradeString ); // voeg de puntenwaarde toe aan het totaal total = total + grade ; 36 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 } // voeg 1 toe aan teller gradeCounter gradeCounter = gradeCounter + 1; } // einde while structuur // Eindfase average = total / 10; // voer een gehele deling uit // laat het gemiddelde van de examenpunten zien JOptionPane.showMessageDialog( null, "Class average is " + average, "Class Average", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } Average1.java vervolg // beëindig het programma // einde methode main // einde klasse Average1 37 UITVOERING AVERAGE1.JAVA (vervolg) 38 12 13 14 15 16 17 18 19 20 int total, // som van de punten ingevoerd door de gebruiker gradeCounter, // aantal ingevoerde punten grade, // puntenwaarde average; // gemiddelde van alle punten String gradeString; // punten zoals ingetypt door de gebruiker // Initialisatiefase total = 0; // het totaal initialiseren op nul gradeCounter = 1; // voorbereiding op herhaling Lijn 12 • declaratie van de teller “gradeCounter”. Lijn 20 • de teller “gradeCounter” wordt op 1 geïnitialiseerd. 39 23 while ( gradeCounter <= 10 ) // herhaal 10 keer 24 { 25 // vraag om input en lees punten van gebruiker 26 gradeString = JOptionPane.showInputDialog( 27 "Enter integer grade: " ); 28 29 // converteer punten van String naar integer 30 grade = Integer.parseInt( gradeString ); 31 32 // voeg de puntenwaarde toe aan het totaal 33 total = total + grade; 34 35 // voeg 1 toe aan teller gradeCounter 36 gradeCounter = gradeCounter + 1; 37 38 } // einde while structuur Lijn 23 • zolang de voorwaarde “gradeCounter <= 10” waar is, wordt de body van de while-statement (lijn 24 t.e.m. 38) uitgevoerd. Lijn 36 • de teller “gradeCounter” wordt met één verhoogd. 40 39 40 // Eindfase 41 average = total / 10; // perform integer division 42 43 // laat het gemiddelde van de examenpunten zien 44 JOptionPane.showMessageDialog( null, 45 "Class average is " + average, "Class Average", 46 JOptionPane.INFORMATION_MESSAGE ); 47 48 System.exit( 0 ); // beëindig het programma 49 50 } // einde methode main 51 52} // einde klasse Average1 Lijn 44-46 • de gemiddelde waarde van de 10 ingegeven getallen wordt weergegeven. 41 4.9. ALGORITMEN FORMULEREN: TOP-DOWN EN MET STAPSGEWIJZE VERFIJNING VOORBEELD 2 (HERHALING MET “SCHILDWACHT”) Sentinel of “schildwacht” waarde die het einde van de invoer van data aangeeft Average2.java • is een programma dat een herhaling voor onbepaalde tijd bevat • gebruikt de “schildwacht” waarde –1 om de herhaling te beëindigen 42 ALGORITMEN FORMULEREN: VOORBEELD 2 PSEUDOCODE totaal <- 0 puntenteller <- 0 lees ( de eerste) punten in (mogelijk de “schildwacht”) Herhaal zolang punten != -1 punten <- punten + totaal puntenteller <- puntenteller + 1 lees (volgende) punten in (mogelijk de “schildwacht”) Eind-herhaal Als puntenteller != 0 klasgemiddelde <- totaal / puntenteller Druk klasgemiddelde af anders Druk “Er werden geen punten ingevoerd” Eind-als Fig. 4.8 Pseudocode van het algoritme dat een herhaling met gebruik van een “sentinel” of “schildwacht” bevat om het probleem van het gemiddelde van een klas op te lossen. 43 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 // Fig. 4.9: Average2.java // Klasgemiddelde programma met herhaling met behulp van een “schildwacht” // Java core packages import java.text.DecimalFormat; // Java extension packages import javax.swing.JOptionPane; public class Average2 { // De uitvoering van een public static void main( { int gradeCounter, // grade , // total; // double average; // String input; // Average2.java Java applicatie begint bij de main method String args[] ) aantal ingevoerde punten puntenwaarde som van de punten gemiddelde van alle punten punten zoals ingetypt door de gebruiker // Initialisatiefase total = 0; // het totaal initialiseren gradeCounter = 0; // voorbereiding van de herhaling // Verwerkingsfase // vraag om input en lees de punten van de gebruiker input = JOptionPane.showInputDialog( "Enter Integer Grade, -1 to Quit:" ); // converteer de punten van een String naar een integer grade = Integer.parseInt( input ); 44 33 34 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 while ( grade != - 1 ) { herhaal tot gradeCounter // voeg puntenwaarde toe aan totaal is aan “schildwacht” waarde total = total + grade ; gelijk (-1) // voeg 1 toe aan teller gradeCounter gradeCounter = gradeCounter + 1; // vraag om input en lees punten van gebruiker input = JOptionPane.showInputDialog( "Enter Integer Grade, -1 to Quit:" Rond);getallen af tot op één een honderdste naar integer Average2.java vervolg // converteer punten van een String grade = Integer.parseInt( input ); } // Eindfase DecimalFormat twoDigits = new DecimalFormat( "0.00" ); if ( gradeCounter != 0 ) { average = (double) total / gradeCounter; // laat gemiddelde van de examenpunten zien JOptionPane.showMessageDialog( null, "Class average is " + twoDigits.format( average ), "Class Average", JOptionPane.INFORMATION_MESSAGE ); } else JOptionPane.showMessageDialog( null, "No grades were entered", "Class Average", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); // beëindig de applicatie 45 VERVOLG CODE + UITVOERING AVERAGE2.JAVA 67 68 69 } } // einde methode main // einde klasse Average2 46 15 16 17 18 19 20 21 22 23 24 int gradeCounter, // aantal ingevoerde punten grade, // puntenwaarde total; // som van de punten double average; // gemiddelde van alle punten String input; // punten zoals ingetypt door de gebruiker // Initialisatiefase total = 0; // het totaal initialiseren gradeCounter = 0; // voorbereiding van de herhaling Lijn 22 • “total” wordt op 0 geïnitialiseerd. De som van de ingegeven getallen zal in “total” bijgehouden worden. Lijn 23 • “gradeCounter” wordt op 0 geïnitialiseerd. Deze variabele zal bijhouden hoeveel getallen de gebruiker heeft ingegeven. 47 26 27 28 29 30 31 32 33 34 // vraag om input en lees de punten van de gebruiker input = JOptionPane.showInputDialog( "Enter Integer Grade, -1 to Quit:" ); // converteer de punten van een String naar een integer grade = Integer.parseInt( input ); while ( grade != -1 ) { Lijn 27-28 • Een eerste getal wordt aan de gebruiker gevraagd. Lijn 33 • Indien de gebruiker de waarde –1 heeft ingegeven (lijn 27-28), dan wordt de body van de while-statement niet uitgevoerd. 48 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 while ( grade != -1 ) { // voeg puntenwaarde toe aan totaal total = total + grade; // voeg 1 toe aan teller gradeCounter gradeCounter = gradeCounter + 1; // vraag om input en lees punten van gebruiker input = JOptionPane.showInputDialog( "Enter Integer Grade, -1 to Quit:" ); // converteer punten van een String naar een integer grade = Integer.parseInt( input ); } Lijn 33 • zolang de gebruiker de waarde –1 niet heeft ingegeven, wordt de body van de while-statement (lijn 34 t.e.m. 47) uitgevoerd. Lijn 42-43 • een nieuw getal wordt aan de gebruiker gevraagd. 49 50 DecimalFormat twoDigits = new DecimalFormat( "0.00" ); 51 52 if ( gradeCounter != 0 ) 53 { average = (double) total / gradeCounter; 54 55 // laat gemiddelde van de examenpunten zien 56 JOptionPane.showMessageDialog( null, 57 "Class average is " + twoDigits.format( average ), 58 "Class Average", JOptionPane.INFORMATION_MESSAGE ); 59 } 60 else 61 JOptionPane.showMessageDialog( null, 62 "No grades were entered", "Class Average", 63 JOptionPane.INFORMATION_MESSAGE ); 64 65 System.exit( 0 ); // beëindig de applicatie 66 67 } // einde methode main 68 69} // einde klasse Average2 Lijn 52 • Controleren indien de gebruiker al dan niet direct de waarde –1 heeft ingegeven (lijn 27-28). 50 4.10. ALGORITMEN FORMULEREN: TOP-DOWN EN MET STAPSGEWIJZE VERFIJNING VOORBEELD 3 (GENESTE CONTROLESTRUCTUREN) Nesting van controlestructuren Analysis.java • een analyse maken van de resultaten behaald door 10 studenten (1 = geslaagd, 2 = niet-geslaagd) • een if-else-statement in een while-statement gebruiken. 51 ALGORITMEN FORMULEREN: VOORBEELD 3 PSEUDOCODE geslaagden <- 0 niet_geslaagden <- 0 aantal_studenten <- 1 Herhaal zolang aantal_studenten <= 10 lees (volgende) resultaat in Als resultaat = 1 geslaagden <- geslaagden + 1 anders niet_geslaagden <- niet_geslaagden + 1 Eind-als aantal_studenten <- aantal_studenten + 1 Eind-herhaal Druk geslaagden en niet-geslaagden af Als geslaagden > 8 Druk“Raise tuition” Eind-als Fig 4.10 Pseudocode voor examenresultaten probleem. 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. 4.11: Analysis.java // Analyse van examenresultaten. // Java extension packages import javax.swing.JOptionPane; Herhaal tot student teller groter is dan 10 public class Analysis { // De uitvoering van een Java applicatie begint bij de main methode public static void main( String args[] ) { // initialiseren van de variablen in declaraties int passes = 0, // aantal geslaagden failures = 0, // aantal niet geslaagden studentCounter = 1, // studententeller result; // één examenresultaat String input, // door de gebruiker ingetikte waarde output; // uitvoerstring Analysis.java // verwerk 10 studenten; herhaling met teller while ( studentCounter <= 10 ) Geneste controlestructuur { // verkrijg resultaat van gebruiker input = JOptionPane.showInputDialog( "Enter result (1=pass,2=fail)" ); // converteer resultaat naar int result = Integer.parseInt( input ); // verwerk resultaat if ( result == 1 ) passes = passes + 1; else failures = failures + 1; 53 VERVOLG CODE ANALYSIS.JAVA 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 } studentCounter = studentCounter + 1 ; } // eindfase output = "Passed: " + passes + "\nFailed: " + failures; if ( passes > 8 ) output = output + "\nRaise Tuition"; JOptionPane.showMessageDialog( null, output, "Analysis of Examination Results", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } // beëindig applicatie // einde methode main // einde klasse Analysis 54 UITVOERING ANALYSIS.JAVA 9 keer 55 12 // initialiseren van 13 int passes = 0, 14 failures = 0, 15 studentCounter = 16 result; 17 String input, // 18 output; // 19 de variabelen in declaraties // aantal geslaagden // aantal niet geslaagden 1, // studententeller // één examenresultaat door de gebruiker ingetikte waarde uitvoerstring Lijn 13 • De teller “passes” zal het aantal geslaagde studenten bijhouden. Lijn 14 • De teller “failures” zal het aantal niet geslaagde studenten bijhouden. Lijn 15 • De teller “studentCounter” wordt op 1 geïnitialiseerd. Deze teller zullen we in de while-voorwaarde gebruiken. 56 20 // verwerk 10 studenten; herhaling met teller 21 while ( studentCounter <= 10 ) 22 { 23 // verkrijg resultaat van gebruiker 24 input = JOptionPane.showInputDialog( 25 "Enter result (1=pass,2=fail)" ); 26 27 // converteer resultaat naar int 28 result = Integer.parseInt( input ); 29 30 // verwerk resultaat 31 if ( result == 1 ) 32 passes = passes + 1; 33 else 34 failures = failures + 1; 35 36 studentCounter = studentCounter + 1; 37 } Lijn 22-37 • De body van het while-statement zal 10 keer uitgevoerd worden. Lijn 31-34 57 • if-statement in de body van het while-statement. 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 } // eindfase output = "Passed: " + passes + "\nFailed: " + failures; if ( passes > 8 ) output = output + "\nRaise Tuition"; JOptionPane.showMessageDialog( null, output, "Analysis of Examination Results", JOptionPane.INFORMATION_MESSAGE ); System.exit( 0 ); } // terminate application // einde methode main // einde klasse Analysis Lijn 46-48 • Het aantal geslaagde en het aantal niet geslaagde studenten worden weergegeven op het scherm. 58 4.11. SAMENGESTELDE TOEKENNINGSOPERATOREN Uitdrukkingen voor toekenningen afkorten • Heel vaak willen we iets bij een variabele optellen. int teller = 1; teller = teller + 1; teller = teller + 3; • In JAVA bestaat er een kortere en meer efficiënte vorm teller += 1; teller += 3; 59 4.11. SAMENGESTELDE TOEKENNINGSOPERATOREN Algemeen : x=x+a kunnen we schrijven als x += a; De volgende expressies spreken nu voor zichzelf: x -= a; x *= a; x /= a; x %= a; 60 REKENKUNDIGE TOEKENNINGSOPERATOREN Toekennings operator Stel: int c = 3, d = 5, e = 4, f = 6, g = 12; += -= *= /= %= Voorbeeld uitdrukking Uitleg c d e f g c d e f g += -= *= /= %= 7 4 5 3 9 = = = = = c d e f g Kent toe + * / % 7 4 5 3 9 10 aan c 1 aan d 20 aan e 2 aan f 3 aan g Fig. 4.12 Arithmetische toekenningsoperatoren. 61 4.12. INCREMENT- EN DECREMENTOPERATOREN In het bijzonder komt het vaak voor, dat een telvariabele (bijvoorbeeld teller) met 1 moet verhoogd of verlaagd worden. In plaats van teller += 1; teller -= 1; kunnen we dit nog korter schrijven: teller++; teller--; of ++teller; --teller; 62 4.12. INCREMENT- EN DECREMENTOPERATOREN Unaire increment operator (++) • vermeerdert de waarde van de variabele met 1 Unaire decrement operator (--) • vermindert de waarde van de variabele met 1 63 Wat is nu het verschil tussen teller++ en ++teller? int teller1, resul1, teller2, resul2; teller1 = 0; teller2 = 0; resul1 = (teller1++); resul2 = (++teller2); System.out.println("teller1 : " + teller1); System.out.println(" resul1 : " + resul1); System.out.println(" teller2 : " + teller2); System.out.println(" resul2 : " + resul2); De uitvoer van dit programma is: teller1 : 1 resul1 : 0 teller2 : 1 resul2 : 1 64 4.12. INCREMENT- EN DECREMENTOPERATOREN resul1 = (teller1++); resul2 = (++teller2); Het statement “resul1 = (teller1++);” betekent, dat eerst de waarde van teller1 (=0) wordt toegekend aan de variabele resul1. Daarna wordt de waarde van variabele “teller1” met één verhoogd. Het statement “resul2 = (++teller2);” betekent, dat eerst de waarde van de variabele “teller2” met één wordt verhoogd (dus teller2 = 0 +1). Vervolgens wordt de waarde van teller2 (=1) toegekend aan de variabele resul2. 65 4.12. INCREMENT- EN DECREMENTOPERATOREN teller++; ++ is een post-increment operator ++teller; ++ is een pre-increment operator teller--; -- is een post-decrement operator --teller; -- is een pre-decrement operator 66 INCREMENT EN DECREMENT OPERATOREN Operator Voorbeeldexpressie Uitleg ++ Wordt genoemd preincrement ++a ++ postincrement a++ -- predecrement --b -- postdecrement b-- Vermeerder a met 1 en gebruik vervolgens de nieuwe waarde van a in de expressie waarin a voorkomt. Gebruik de huidige waarde van a in de expressie waarin a voorkomt en vermeerder a vervolgens met 1. Verminder b met 1 en gebruik vervolgens de nieuwe waarde van b in de expressie waarin b voorkomt. Gebruik de huidige waarde van b in de expressie waarin b voorkomt en verminder b vervolgens met 1. Fig. 4.13 De increment en decrement operatoren. 67 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. 4.14: Increment.java // Preincrementing en postincrementing public class Increment { // De uitvoering van de Java applicatie begint bij de main methode public static void main( String args[] ) { int c; c = 5; System.out.println( c ); // print 5 System.out.println( c++ );//print 5 en vermeerder c dan met 1 System.out.println( c ); // print 6 System.out.println(); // sla een lijn over c = 5; System.out.println( c ); // print 5 System.out.println( ++c );//vermeerder c eerst met 1, print 6 System.out.println( c ); // print 6 } } // end method main // end class Increment 68 11 12 13 14 15 16 17 18 19 20 21 c = 5; System.out.println( c ); // print 5 System.out.println( c++ );//print 5 en vermeerder c dan met 1 System.out.println( c ); // print 6 System.out.println(); // sla een lijn over c = 5; System.out.println( c ); // print 5 System.out.println( ++c );//vermeerder c eerst met 1, print 6 System.out.println( c ); // print 6 Lijn 13 voert een postincrement uit op c 5 5 6 5 6 6 Lijn 20 voert een preincrement uit op c 69 Oefening: geef de inhoud van a, b en c na elk statement int a = 0, b = 0, c = 0; a = ++ b + ++ c; // a = 2 b= 1 c= 1 a = b ++ + c ++; // a = 2 b= 2 c= 2 a = ++ b + c ++; // a = 5 b= 3 c= 3 a = b -- + c --; // a = 6 b=2 c=2 70 PRECEDENTIE EN ASSOCIATIVITEIT VAN DE OPERATOREN We kennen nu wiskundige-, relationele-, logische-, conditionele-, increment- en decrement-operatoren. We zijn in staat om complexe voorwaarden samen te stellen. Veronderstel volgende complexe conditie: 5+25/12 > 6 && 33%11+1 < 2 Deze expressie bevat zowel wiskundige, relationele als logische operatoren. Mogen we gewoon de expressies evalueren van links naar rechts? Neen, bepaalde operatoren hebben voorrang op andere. 71 PRECEDENTIE EN ASSOCIATIVITEIT VAN DE OPERATOREN Operatoren () Associativiteit van links naar rechts Type haakjes ++ -- van rechts naar links unair postfix van rechts naar links unair van links naar rechts multiplicerend van links naar rechts toevoegend van links naar rechts relationeel == != van links naar rechts gelijkheid ?: van rechts naar links conditioneel van rechts naar links toekenning ++ -- + * / + - < <= > = - (type) % >= += -= *= /= %= Fig. 4.15 Precedentie en associativiteit van de operatoren. 72 PRECEDENTIE EN ASSOCIATIVITEIT VAN DE OPERATOREN Voorbeeld: 5+25/12 > 6 && 33%11+1 < 2 5+ 2 > 6 && 33%11 +1 < 2 5+ 2 > 6 && 0 +1 < 2 7 > 6 && 0 +1 < 2 7 > 6 && 1 <2 (true) && 1 <2 (true) && (true) (true) 73 PRECEDENTIE EN ASSOCIATIVITEIT VAN DE OPERATOREN Haakjes kunnen gebruikt worden om de prioriteiten te negeren. Alles wat tussen de haakjes staat wordt altijd het eerst uitgewerkt. Bij complexe voorwaarden is het soms aangewezen haakjes te gebruiken, om de lezer zonder meer duidelijk te maken hoe de expressie wordt uitgewerkt. Een belangrijke stelregel is: bij twijfel, gebruik altijd haakjes. 74 4.13. PRIMITIEVE DATATYPES Primitieve types “bouwblokken” voor ingewikkeldere types Java is sterk getypeerd alle variabelen in een Java programma MOETEN een type hebben Primitieve types in Java zijn overdraagbaar over computerplatformen die Java ondersteunen 75 DE PRIMITIEVE DATATYPES IN JAVA Type boolean Grootte in bits 8 Waarden true of false Standaard char 16 (ISO Unicode character set) byte 8 ’\u0000’ tot ’\uFFFF’ (0 tot 65535) –128 tot +127 (–27 tot 27 – 1) short 16 –32,768 tot +32,767 (–215 tot 215 – 1) int 32 –2,147,483,648 tot +2,147,483,647 (–231 tot 231 – 1) long 64 –9,223,372,036,854,775,808 tot +9,223,372,036,854,775,807 (–263 tot 263 – 1) float 32 double 64 Negatief bereik: –3.4028234663852886E+38 tot –1.40129846432481707e–45 Positief bereik: 1.40129846432481707e–45 tot 3.4028234663852886E+38 Negatief bereik: –1.7976931348623157E+308 tot –4.94065645841246544e–324 Positief bereik: 4.94065645841246544e–324 tot 1.7976931348623157E+308 Fig. 4.16 (IEEE 754 floating point) (IEEE 754 floating point) De primitieve datatypes in Java. 76 HET PRIMITIEVE DATATYPE : boolean Variabelen van het type boolean kunnen slechts twee waarden bevatten: true of false Voorbeeld: boolean gevonden; int teZoekenGetal, getal; String getalS; gevonden = false; teZoekenGetal = 20; while (!(gevonden)) { getalS = JOptionPane.showInputDialog( null, "Geef een getal"); getal = Integer.parseInt( getalS ); if (getal == teZoekenGetal) gevonden = true; } 77 HET PRIMITIEVE DATATYPE : char In variabelen van het type char kun je één letter of één ander teken opslaan. Nooit meer dan één. Zo’n teken moet je in het programma tussen apostrofs zetten, bijvoorbeeld de letter a als ‘a’, een punt als ‘.’, etc. De reden dat je apostrofs moet gebruiken is dat we de compiler duidelijk willen maken dat het om een letter gaat, en niet om bijvoorbeeld een variabele die de naam a heeft. Voorbeeld: char letter1, letter2; letter1 = 'a'; letter2 = '*'; 78 HET PRIMITIEVE DATATYPE : byte In een variabele van het type byte kun je gehele getallen van –128 t.e.m. 127 bewaren. Voorbeeld: byte getal1, getal2, getal3; getal1 = 50; getal2 = -128; getal3 = 127; System.out.println(--getal2); System.out.println(++getal3); Uitvoer: 127 -128 79 HET PRIMITIEVE DATATYPE : short In een variabele van het type short kun je gehele getallen van -32768 t.e.m. 32767 bewaren. Voorbeeld: short getal1, getal2; getal1 = -32768; getal2 = 32767; System.out.println(--getal1); System.out.println(++getal2); Uitvoer: 32767 -32768 80 HET PRIMITIEVE DATATYPE : int In een variabele van het type int kun je gehele getallen van –2 147 483 648 tot 2 147 483 647 opbergen. Voorbeeld: int getal1, getal2; getal1 = 20; getal2 = -450; 81 HET PRIMITIEVE DATATYPE : long In een variabele van het type long kun je gehele getallen van –9 223 372 036 854 775 808 tot 9 223 372 036 854 775 807 opbergen. Voorbeeld: long getal1, getal2; getal1 = 2147483647; //bovengrens van int getal2 = getal1 * 10; System.out.println(getal2); uitvoer: 21474836470 82 DE PRIMITIEVE DATATYPEN : float en double In veel gevallen waarin gerekend wordt, heb je reële getallen nodig, zoals bijvoorbeeld 24.75. Voor reële getallen kent het Engels de term floating-point getallen. Java heeft voor reële getallen twee verschillende primitieve typen: float (storing single-precision floating-point) en double (double-precision floating-point). 83 DE PRIMITIEVE DATATYPEN : float en double De nauwkeurigheid van getallen van het type float is 6 tot 7 cijfers. Dat lijkt misschien veel, maar leidt in de praktijk al gauw tot grote onnauwkeurigheden door afrondfouten. Getallen van het type double nemen meer geheugen in beslag dan float, maar hebben een nauwkeurigheid van 15 cijfers. 84 DE PRIMITIEVE DATATYPEN : float en double Voorbeeld: float float_getal; double double_getal; float_getal = 10; double_getal = float_getal; float_getal *= 12.123456789; double_getal *= 12.123456789; System.out.println("float : " + float_getal); System.out.println("double : " + double_getal); Uitvoer: float : 121.234566 double : 121.23456789000001 85 Oefeningen Hoofdstuk 4 86 Verbeter volgende stukjes code: 1. if ( age >= 65 ); System.out.println ( “Age greater than or equal to 65” ); else System.out.println ( “Age is less than 65 )”; 2. int x = 1, total; while ( x <= 10 ) { total += x; ++x; } 87 Verbeter volgende stukjes code: 3. while ( x <= 100 ) total += x; ++x; 4. while ( y > 0 ) { System.out.println( y ); ++y; 88 Welke output geeft volgende applicatie? public class Mystery { public static void main ( String args[] ) { int y, x = 1, total = 0; while ( x <= 10 ) { y = x * x; System.out.println( y ); total += y; ++x; } System.out.println ( “Total is “ + total ); } } 89 Welke output geeft volgende applicatie? public class Mystery2 { public static void main ( String args[] ) { int count = 1; while ( count <= 10 ) { System.out.println( count % 2 == 1 ? “****” : “++++++++” ); ++count; } } } 90 Schrijf een applicatie die… 1. 2. via een lus volgende tabel met waarden afdrukt N 10*N 100*N 1000*N 1 2 3 4 5 10 20 30 40 50 100 200 300 400 500 1000 2000 3000 4000 5000 drie gehele getallen, verschillend van 0, inleest, en bepaalt of deze de zijden van een rechthoekige driehoek zouden kunnen voorstellen 91