CONTROLESTRUCTUREN (DEEL 1) 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)
Een algoritme Programmacontrole 4.2. ALGORITMEN 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
Pseudocode is … 4.3. PSEUDOCODE 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
Sequentiële uitvoering 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.
FLOWCHART VAN EEN SEQUENTIESTRUCTUUR Lijnen Actiesymbolen Connectiesymbolen total<- total + grade total = total + grade ; counter <- counter + 1 counter = counter + 1 ; Fig 4.1 Flowchart van een sequentiestrructuur in Java.
JAVA SLEUTELWOORDEN
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
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.
Voorbeeld in pseudocode: Als punten >= 60 dan print "Geslaagd!" Eind-als Decisiesymbool true punten >= 60 print “Geslaagd” false Fig 4.3 Flowchart van de enkelvoudige selectiestructuur if
Voorbeeld in pseudocode: Als punten >= 60 dan print "Geslaagd!" Eind-als JAVA: if ( punten >= 60 ) System.out.println("Geslaagd");
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.
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.
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");
DE RELATIONELE OPERATOREN Operator In Java > > groter dan < < kleiner dan >= groter dan of gelijk aan <= kleiner dan of gelijk aan = = = exact gelijk != verschillend
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 en-operator nodig. In JAVA schrijven we de gecombineerde voorwaarde als volgt : (temp >= 22 && temp <= 25)
DE LOGISCHE OPERATOREN Logische operator In Java en && of || niet !
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.
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 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.
Oefeningen: stel de voorwaarde op in Java 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 x moet groter zijn dan 999, kleiner dan of gelijk aan 9999 en oneven X>999 && x<=9999 && x%2 !=0 x mag niet gelijk zijn aan 0 of x moet deelbaar zijn door 10 X!=0 || x%10==0
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.
DE CONDITIONELE OPERATOR Voorbeeld: if (a < b) z = a + 1; else z = b – 1; is equivalent met z = ( a < b ? a + 1 : b - 1);
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);
DE CONDITIONELE OPERATOR Oefening: if (aantal == 1) System.out.println("Student"); else System.out.println("Studenten"); is equivalent met ?
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
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)”?
false true getal1 > 10 false true getal2 > 20 print “???” if (getal1 > 10) if (getal2 > 20) System.out. println(“getal1 > 10 en getal2 > 20”); else System.out. println(“ ??? ”); false true getal1 > 10 false true getal2 > 20 print “getal1 > 10 en getal2 > 20” print “???”
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 ”);
false true getal1 > 10 true getal2 > 20 false if (getal1 > 10) { if (getal2 > 20) System.out. println(“getal1 > 10 en getal2 > 20”); } else System.out. println(“ getal <= 10 ”); false true getal1 > 10 print “getal <= 10” true getal2 > 20 print “getal1 > 10 en getal2 > 20” false
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" als x < 0 en oneven dan druk "negatief en oneven"
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!
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.
Voorbeeld in pseudocode: product <- 2 Herhaal zolang product <= 1000 product <- product * 2 Eind-herhaal JAVA: int product = 2; while ( product <= 1000 ) product = 2 * product;
4.8. ALGORITMEN FORMULEREN: VOORBEELD 1 (HERHALING MET EEN 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
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
Declareer variabelen; gradeCounter is de teller 1 // Fig. 4.7: Average1.java 2 // Programma voor klasgemiddelde met herhaling via teller 3 Declareer variabelen; gradeCounter is de teller 4 // Java extension packages 5 import javax .swing. JOptionPane ; 6 7 public class Average1 8 { 9 Average1.java // De uitvoering van de Java applicatie begint bij de “main” methode 10 public static void main( String args [] ) 11 { 12 int total, // som van de punten ingevoerd door de gebruiker Blijf herhalen zolang gradeCounter kleiner dan of gelijk is aan 10 13 gradeCounter , // aantal ingevoerde punten 14 grade , // puntenwaarde 15 average; // gemiddelde van alle punten 16 String gradeString; // punten zoals ingetypt door de gebruiker 17 18 // Initialisatiefase 19 total = ; // het totaal initialiseren op nul 20 gradeCounter = 1 ; // voorbereiding op herhaling 21 22 // Verwerkingsfase 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
Average1.java vervolg 35 // voeg 1 toe aan teller gradeCounter 36 = gradeCounter + 1 ; 37 38 } // einde while structuur 39 40 // Eindfase 41 average = total / 10 ; // voer een gehele deling uit 42 43 Average1.java vervolg // 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( ); // beëindig het programma 49 50 } // einde methode main 51 52 } // einde klasse Average1
UITVOERING AVERAGE1.JAVA (vervolg)
declaratie van de teller “gradeCounter”. 12 int total, // som van de punten ingevoerd door de gebruiker 13 gradeCounter, // aantal ingevoerde punten 14 grade, // puntenwaarde 15 average; // gemiddelde van alle punten 16 String gradeString; // punten zoals ingetypt door de gebruiker 17 18 // Initialisatiefase 19 total = 0; // het totaal initialiseren op nul 20 gradeCounter = 1; // voorbereiding op herhaling Lijn 12 declaratie van de teller “gradeCounter”. Lijn 20 de teller “gradeCounter” wordt op 1 geïnitialiseerd.
de teller “gradeCounter” wordt met één verhoogd. 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.
de gemiddelde waarde van de 10 ingegeven getallen wordt weergegeven. 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.
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
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.
Average2.java 1 // Fig. 4.9: Average2.java 2 // Klasgemiddelde programma met herhaling met behulp van een “schildwacht” 3 4 // Java core packages 5 import java.text. DecimalFormat ; 6 7 // Java extension packages 8 import javax .swing. JOptionPane ; 9 Average2.java 10 public class Average2 11 { 12 // De uitvoering van een Java applicatie begint bij de main method 13 public static void main( String args [] ) 14 { 15 int gradeCounter , // aantal ingevoerde punten 16 grade , // puntenwaarde 17 total; // som van de punten 18 double average; // gemiddelde van alle punten 19 String input; // punten zoals ingetypt door de gebruiker 20 21 // Initialisatiefase 22 total = ; // het totaal initialiseren 23 gradeCounter = ; // voorbereiding van de herhaling 24 25 // Verwerkingsfase 26 // vraag om input en lees de punten van de gebruiker 27 input = JOptionPane . showInputDialog ( 28 "Enter Integer Grade, - 1 to Quit:" ); 29 30 // converteer de punten van een String naar een integer 31 grade = Integer. parseInt ( input ); 32
herhaal tot gradeCounter gelijk is aan “schildwacht” waarde (-1) 33 while ( grade != - 1 ) 34 { herhaal tot gradeCounter gelijk is aan “schildwacht” waarde (-1) 35 // voeg puntenwaarde toe aan totaal 36 total = total + grade ; 37 38 // voeg 1 toe aan teller gradeCounter 39 gradeCounter = gradeCounter + 1 ; 40 41 // vraag om input en lees punten van gebruiker Average2.java vervolg 42 input = JOptionPane . showInputDialog ( 43 "Enter Integer Grade, - 1 to Quit:" Rond getallen af tot op één honderdste ); 44 45 // converteer punten van een String naar een integer 46 grade = Integer. parseInt ( input ); 47 } 48 49 // Eindfase 50 DecimalFormat twoDigits = new DecimalFormat ( "0.00" ); 51 52 if ( gradeCounter != ) 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( ); // beëindig de applicatie 66
VERVOLG CODE + UITVOERING AVERAGE2.JAVA 67 } // einde methode main 68 69 } // einde klasse Average2
15 int gradeCounter, // aantal ingevoerde punten 16 grade, // puntenwaarde 17 total; // som van de punten 18 double average; // gemiddelde van alle punten 19 String input; // punten zoals ingetypt door de gebruiker 20 21 // Initialisatiefase 22 total = 0; // het totaal initialiseren 23 gradeCounter = 0; // voorbereiding van de herhaling 24 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.
Een eerste getal wordt aan de gebruiker gevraagd. 26 // vraag om input en lees de punten van de gebruiker 27 input = JOptionPane.showInputDialog( 28 "Enter Integer Grade, -1 to Quit:" ); 29 30 // converteer de punten van een String naar een integer 31 grade = Integer.parseInt( input ); 32 33 while ( grade != -1 ) 34 { 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.
een nieuw getal wordt aan de gebruiker gevraagd. 33 while ( grade != -1 ) 34 { 35 // voeg puntenwaarde toe aan totaal 36 total = total + grade; 37 38 // voeg 1 toe aan teller gradeCounter 39 gradeCounter = gradeCounter + 1; 40 41 // vraag om input en lees punten van gebruiker 42 input = JOptionPane.showInputDialog( 43 "Enter Integer Grade, -1 to Quit:" ); 44 45 // converteer punten van een String naar een integer 46 grade = Integer.parseInt( input ); 47 } 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.
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).
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.
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” Fig 4.10 Pseudocode voor examenresultaten probleem.
Herhaal tot student teller groter is dan 10 // Fig. 4.11: Analysis.java 2 // Analyse van examenresultaten. 3 4 // Java extension packages 5 import javax .swing. JOptionPane Herhaal tot student teller groter is dan 10 ; 6 7 public class Analysis 8 { 9 // De uitvoering van een Java applicatie begint bij de main methode Analysis.java 10 public static void main( String args [] ) 11 { 12 // initialiseren van de variablen in declaraties 13 int passes = 0, // aantal geslaagden 14 failures = 0, // aantal niet geslaagden 15 studentCounter = 1, // studententeller 16 result; // één examenresultaat 17 String input, // door de gebruiker ingetikte waarde 18 output; // uitvoerstring 19 20 // verwerk 10 studenten; herhaling met teller 21 while ( studentCounter <= Geneste controlestructuur 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 ;
VERVOLG CODE ANALYSIS.JAVA 35 36 studentCounter = studentCounter + 1 ; 37 } 38 39 // eindfase 40 output = "Passed: " + passes + 41 " \ nFailed : " + failures; 42 43 if ( passes > 8 ) 44 output = output + " \ nRaise Tuition" ; 45 46 JOptionPane . showMessageDialog ( null , output, 47 "Analysis of Examination Results", 48 JOptionPane . INFORMATION_MESSAGE ); 49 50 System.exit( ); // beëindig applicatie 51 52 } // einde methode main 53 54 } // einde klasse Analysis
UITVOERING ANALYSIS.JAVA 9 keer
De teller “passes” zal het aantal geslaagde studenten bijhouden. 12 // initialiseren van de variabelen in declaraties 13 int passes = 0, // aantal geslaagden 14 failures = 0, // aantal niet geslaagden 15 studentCounter = 1, // studententeller 16 result; // één examenresultaat 17 String input, // door de gebruiker ingetikte waarde 18 output; // uitvoerstring 19 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.
De body van het while-statement zal 10 keer uitgevoerd worden. 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 if-statement in de body van het while-statement.
38 39 // eindfase 40 output = "Passed: " + passes + 41 "\nFailed: " + failures; 42 43 if ( passes > 8 ) 44 output = output + "\nRaise Tuition"; 45 46 JOptionPane.showMessageDialog( null, output, 47 "Analysis of Examination Results", 48 JOptionPane.INFORMATION_MESSAGE ); 49 50 System.exit( 0 ); // terminate application 51 52 } // einde methode main 53 54 } // einde klasse Analysis Lijn 46-48 Het aantal geslaagde en het aantal niet geslaagde studenten worden weergegeven op het scherm.
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;
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;
REKENKUNDIGE TOEKENNINGSOPERATOREN
4.12. INCREMENT- EN DECREMENT- OPERATOREN 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;
4.12. INCREMENT- EN DECREMENT- OPERATOREN Unaire increment operator (++) vermeerdert de waarde van de variabele met 1 Unaire decrement operator (--) vermindert de waarde van de variabele met 1
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
4.12. INCREMENT- EN DECREMENT- OPERATOREN 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.
4.12. INCREMENT- EN DECREMENT- OPERATOREN teller++; ++ is een post-increment operator ++teller; ++ is een pre-increment operator teller--; -- is een post-decrement operator --teller; -- is een pre-decrement operator
INCREMENT EN DECREMENT OPERATOREN
1 // Fig. 4.14: Increment.java 2 // Preincrementing en postincrementing 3 public class Increment 5 { 6 // De uitvoering van de Java applicatie begint bij de main methode 7 public static void main( String args[] ) 8 { 9 int c; 10 11 c = 5; 12 System.out.println( c ); // print 5 13 System.out.println( c++ );//print 5 en vermeerder c dan met 1 14 System.out.println( c ); // print 6 15 16 System.out.println(); // sla een lijn over 17 18 c = 5; 19 System.out.println( c ); // print 5 20 System.out.println( ++c );//vermeerder c eerst met 1, print 6 21 System.out.println( c ); // print 6 22 23 } // end method main 24 25 } // end class Increment
Lijn 13 voert een postincrement uit op c 12 System.out.println( c ); // print 5 13 System.out.println( c++ );//print 5 en vermeerder c dan met 1 14 System.out.println( c ); // print 6 15 16 System.out.println(); // sla een lijn over 17 18 c = 5; 19 System.out.println( c ); // print 5 20 System.out.println( ++c );//vermeerder c eerst met 1, print 6 21 System.out.println( c ); // print 6 Lijn 13 voert een postincrement uit op c Lijn 20 voert een preincrement uit op c 5 5 6 5 6 6
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
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.
PRECEDENTIE EN ASSOCIATIVITEIT VAN DE OPERATOREN
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)
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.
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
DE PRIMITIEVE DATATYPES IN JAVA
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; }
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 = '*';
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
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
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;
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
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).
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.
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
Oefeningen Hoofdstuk 4
Verbeter volgende stukjes code: Verbeter volgende stukjes code: if ( age >= 65 ); System.out.println ( “Age greater than or equal to 65” ); else System.out.println ( “Age is less than 65 )”; int x = 1, total; while ( x <= 10 ) { total += x; ++x; }
Verbeter volgende stukjes code: Verbeter volgende stukjes code: while ( x <= 100 ) total += x; ++x; while ( y > 0 ) { System.out.println( y ); ++y;
Welke output geeft volgende applicatie? 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 );
Welke output geeft volgende applicatie? 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; }
Schrijf een applicatie die… Schrijf een applicatie die… via een lus volgende tabel met waarden afdrukt N 10*N 100*N 1000*N 1 10 100 1000 2 20 200 2000 3 30 300 3000 4 40 400 4000 5 50 500 5000 drie gehele getallen, verschillend van 0, inleest, en bepaalt of deze de zijden van een rechthoekige driehoek zouden kunnen voorstellen