SWI cursus: ‘Inleiding programmeren in Java’ 5e college Ma 5 februari 2001 drs. F. de Vries
Programma vandaag Voortgangsadvies Deitel 4 & 5 Priemgetallen Datum/klok
Deitel hoofdstuk 4 (4.1 - 4.4) introductie controle structuren (4.5 - 4.6) if en if - else (4.7 - 4.10) while (4.11 - 4.12) assignment (4.13) primitieve datatypen
Drie samenwerkende controlestructuren Sequentie: stuk voor stuk statements uitvoeren Selectie: statement(s) alleen onder bepaalde conditie uitvoeren Iteratie: herhaling van uitvoeren van statement(s)
1. Sequentie In aangegeven volgorde uitvoeren Een schijnbaar eenvoudige structuur Probleemgebieden: volgorde ontwerp aansluiting globale-locale volgordes multi-threading Voorbeeld: aanpak datum/klok
Voorbeeld datum/klok Welke volgorde ontwerpen? Het totaal uitsplitsen van onderaf (ms) of van bovenaf (jaar)? Restdagen in een jaar: beginnen bij januari of bij december? Vaststellen schrikkeljaar: vroeg of laat? Konklusie: volgorde is een probleem
2. Selectie En nu een echte vork: if - else Een vork in een vork: Gevaar: dangling else probleem
Dangling else Hoort else bij 1e of 2e if statement? if <expr> if <expr> <statement> ; else <statement> ; Oplossing: { …. } om binnenste if Geneste sequentie: compound statement
Ontwerpen van selectie Net als bij volgorde is het ontwerpen van selectie niet triviaal Bepalende factoren: overzichtelijkheid kans op fouten efficiëncy Voorbeeld
Vaststellen maand Vergelijk 3 alternatieven: 1. Meest eenvoudige sequentie 2. Een diepe uitsplitsing 3. Een binaire uitsplitsing (omslachtig, maar correct ge-nest if - else statement)
Meest eenvoudig If (maand ==1) label=“januari”; If (maand ==2) label=“februari”; If (maand ==3) label=“maart”; If (maand ==4) label=“april”; If (maand ==5) label=“mei”; If (maand ==6) label=“juni”; If (maand ==7) label=“juli”;
Een diepe uitsplitsing if (maand ==1) label=“januari”; else if (maand ==2) label=“februari”; else if (maand ==3) label=“maart”; else if (maand ==4) label=“april”; else if (maand ==5) label=“mei”; else if (maand ==6) label=“juni”; else if (maand ==7) label=“juli”; else if (maand ==8) label=….
Een binaire uitsplitsing 1 2 3 4 5 6 7 8 9 10 11 12
Een binaire uitsplitsing <=6 <=3 <=2 = 1 = 2 > 2 = 3 > 3 >= 5
Herhaling Lus-structuren in diverse vormen hoofdstuk 4: while <expr> <statement> hoofdstuk 5: do <statement> while < expressie> for (<expr1 ; expr2 ; expr3>) <statement>
Een enkele while lus Fig. 4.7: Average1 Fig. 4.9: Average2 Fig. 4.11: Analysis In hoofdstuk 4, opdracht 1
Is een willekeurig getal deelbaar? Zonder lus constructie niet uitvoerbaar kritieke ontwerppunten: starten en stoppen van de lus uiterste waarden gevaar: oneindige lus inefficiënte lus
Kritieke ontwerppunten Starten-stoppen: beginwaarde expressie, wijziging expressie Uiterste waarden minimale, maximale stuurwaarden Oneindige lus: while (true) <statement>
Aanpak Uitschrijven: testGetal % 2 == 0, ja of nee? testGetal % 3 == 0 …... testGetal % testGetal == 0 ?
Aanpak - 2 Voorwerk: controle testGetal Herhaal na de herhalingslus conditie ?? start teller ? test print ? ophogen teller na de herhalingslus
Een lus binnen een lus Komt veel voor in algoritmen Dubbel gevaar, dubbel lastig extra probleem: terugzetten waarden binnenste lus Voorbeeld: hoofdstuk 4, opdracht 2
Zoek priemgetallen in interval Binnenste lus uit vorige opdracht kleinste = 2 grootste = max int ? (of max long) ondergrens interval = 2 bovengrens = max int (of max long)
Lus in een lus Hier: de binnenste lus krijgt van de buitenste lus steeds een nieuwe waarde aangereikt Andere vorm: binnenste lus doorloopt steeds dezelfde waarden, bv lezen van een matrix (hfst 7)
Binnenlus: van 2 tot (n-1)
Afwerking belangrijk Interval niet correct er zijn geen priemgetallen gevonden gevonden priemgetallen zijn correct nummering van gevonden getallen minimum interval correct: [ 2 .. 2 ] maximum interval?
Speciale assignments c += 1 , ++c en c++ zijn slechts verkorte schrijfwijzen van c = c + 1 Komt de duidelijkheid van het programma niet altijd ten goede
Primitieven boolean char byte - short - int - long float - double dit zijn géén objecten ‘wrapper’ klassen hiervoor
Boolean Declaratie: Assignment: Bewerking: Gebruik: boolean stoppen; stoppen = false; Bewerking: if (n ==10) stoppen = true; Gebruik: if (stoppen) <statement> ;
Datum/klok - 3 constanten declareren gebruik van switch
7 variabelen berekenen jaar, maand, weekdag, dag, uur, minuten, seconden 1 seconde verschil kan alle 6 andere wijzigen 1 uur zomertijd? 1 dag van een schrikkeljaar?
magic numbers elke constante wordt ook alszodanig gedeclareerd betekenisvolle naam kiezen zie Java conventies
Aanpak schrikkeldagen - 1 bereken hele dagen totaal begin bij jaar = 1970 herhaal is ‘jaar’ een schrikkeljaar? (4, 100, 400) ja, trek 366 af, hoog ‘schrikkeldagen’ op nee trek 365 af, ‘schrikkeldagen’ gelijk tel 1 bij jaar op totdat ‘dagen over’ < 365? [of 366 ?!]
Aanpak schrikkeldagen - 2 let op: expressie schrikkeljaar na afloop 1. hele jaren bekend 2. overige dagen bekend 3. aantal schrikkeldagen bekend zijn de schrikkeldagen nog wel nodig?
Aanpak zomertijd - 1 alleen 2001 wat wordt anders? 24/25 mrt 2:00 uur + 1 uur 27/28 okt 3:00 uur - 1 uur wat wordt anders? verspringing van uren, evt dagen/ weekdag/ maand niet: jaar
Aanpak zomertijd - 2 3 manieren: 1. Terugrekenen vanaf breekpunten: op welke seconde 1 uur erbij? op welke seconde 1 uur eraf 2. eerst wintertijd berekenen 3. zelfde berekening voor twee tijden behoefte aan ‘methode’
De stof van vandaag Deitel & Deitel, hoofdstuk 5: niet zo veel nieuws
Hoofdstuk 5 1. Herhalingslus 2: for 2. Selectie: switch statement 3. Herhalingslus 3: do - while 4. Break en continue 5. Logische operatoren Samenvatting gestructureerd programmeren
For - lus Wordt veel gebruikt voorbeeld fig 5.6
Switch statement Een overzichtelijk alternatief voor een serie if statements efficiënt? Nadeel: geen range test Let op: break
switch ( (int) maand ) { case 1: { maandTekst = "Januari" ; break; } case 2: { maandTekst = "Februari" ; break; } case 3: { maandTekst = "Maart" ; break; } case 4: { maandTekst = "April" ; break; } case 5: { maandTekst = "Mei" ; break; } case 6: { maandTekst = "Juni" ; break; } case 7: { maandTekst = "Juli" ; break; } case 8: { maandTekst = "Augustus" ; break; } case 9: { maandTekst = "September" ; break; } case 10: { maandTekst = "October" ; break; } case 11: { maandTekst = "November" ;break; } case 12: { maandTekst = "December" ;break; } default: { maandTekst = "onbekend" ; } }
Do - while herhaling Body wordt altijd een keer uitgevoerd Conditie test achteraf Niet zo interessant
Break en continue Niet zulke mooie constructies vgl. Edsgar Dijkstra’s beroemde artikel: ‘GOTO statement harmfull’