December 2001Eiffel sessie 21 Gestructureerd programmeren selecties en iteraties oefening met Eiffelbench 4.5 Voorkeursopbouw van systemen informatie-, bedrijfs- en systeemklassen uitwerking voorbeeld productensysteem oefening met Eiffelbench 4.5
December 2001Eiffel sessie 22 Gestructureerd programmeren : - sequentie instructie_1 instructie_2 instructie_3 - selectie als voorwaarde voldaan dan sequentie_1 anders sequentie_2 - iteratie zolang voorwaarde niet voldaan sequentie
December 2001Eiffel sessie Selectie if conditie then actie end -- if if conditie then actie_1 else actie_2 end -- if C? JN JN actie actie_1actie_2
December 2001Eiffel sessie 24 if conditie_1 then actie_1 elseif conditie_2 then actie_2 elseif conditie_3 then actie_3 … else actie_n end -- if C1? C2? C3? C…? J J J J N N N N actie_1 actie_2 actie_3 actie_…actie_n geneste selectie :
December 2001Eiffel sessie 25 Voorbeeld : feature zing (keuze : INTEGER) is do if keuze = 1 then io.putstring(“knor-knor”) elseif keuze = 2 then io.putstring(“woef-woef”) else io.putstring(“miauw-miauw”) end -- if end -- zing Exhaustiviteit Exclusiviteit
December 2001Eiffel sessie Iteratie from initialisatie until stop_ conditie loop actie end -- loop initialisatie C? N J actie
December 2001Eiffel sessie 27 voorspelbare iteratie : het aantal keer dat de actie moet worden uitgevoerd is gekend vóór de uitvoering van de iteratie vb. maak de som van 10 getallen from i := 1 until i > 10 loop io.readint som := som + io.lastint i := i + 1 end -- loop
December 2001Eiffel sessie 28 onvoorspelbare iteratie : het aantal keer dat de actie moet worden uitgevoerd is niet op voorhand gekend vb. maak de som van een willekeurig aantal getallen; om de invoer te stoppen, voer je het getal 0 in from io.readint until io.lastint = 0 loop som := som + io.lastint io.readint end -- loop
December 2001Eiffel sessie 29 Geneste iteratie : from initialisatie_1 until stop_conditie_1 loop from initialisatie_2 until stop_conditie_2 loop actie end -- loop_2 end -- loop_1 init_1 C1? N J init_2 C2? actie J N
December 2001Eiffel sessie 210 condities : expansie-objecten : =,, =, /= vb.getal > 10 pi = aantal /= 0 aanwezig referentie-objecten : is_equal of equal is_deep_equal of deep_equal vb. rek1.is_equal(rek2) deep_equal(rek1,rek2) samenvoegen van condities :and, or, xor negatie van condities :not
December 2001Eiffel sessie 211 Oefening (variant op oefening 1 p. 92) : Vervolledig de klassetekst voor een klasse FIGUUR. Bij de creatie van de figuur, moet de gebruiker kunnen kiezen tussen volgende opties: 1. * o De figuur moet als volgt op het scherm gebracht worden : s ss sss ssss sssss ssssss sssssss ssssssss sssssssss ssssssssss waarbij s het gekozen teken voorstelt (vb. als de gebruiker het getal 1 invoert, zal s = *, enz.). Je mag ervan uitgaan dat de invoer correct gebeurt.
December 2001Eiffel sessie 212 feature -- declaratie van één attribuut feature make is local x : INTEGER do io.putstring("Kies een van de volgende opties :") io.new_line io.putstring("%N 1. *") io.putstring("%N 2. -") io.putstring("%N 3. o") io.new_line io.putstring("%N Uw keuze : ") -- inlezen van de keuze -- geef het attribuut de waarde *, - of o teken_figuur end -- make
December 2001Eiffel sessie 213 feature teken_figuur is -- instructies voor het tonen van de figuur -- met om het even welk teken (opgeslagen in het -- attribuut)
December 2001Eiffel sessie 214 feature teken : CHARACTER feature make is local x : INTEGER do -- io.readint x := io.lastint if x = 1 then teken := '*' elseif x = 2 then teken := '-' else teken := 'o' end -- if teken_figuur end -- make
December 2001Eiffel sessie 215 feature teken_figuur is local i,j : INTEGER do from i:=1 until i > 10 loop fromj := 1 until j > i loop io.putchar(teken) j:=j+1 end -- binnenlus io.new_line i := i + 1 end -- buitenlus end -- teken_figuur
December 2001Eiffel sessie 216 Uitbreiding : zorg er expliciet voor dat de invoer correct gebeurt.
December 2001Eiffel sessie 217 KLASSEN voor INVOER, UITVOER en CONTROLE Voorkeursopbouw van programma’s In een programma modelleren en beïnvloeden we een deel van de werkelijkheid op basis van een systeem BEDRIJFSKLASSEN die de werkelijkheid voorstellen SYSTEEM KLASSE
December 2001Eiffel sessie 218 Bedrijfsklassen : stellen bedrijfswerkelijkheid voor ; bevatten geen invoer / uitvoeropdrachten Informatieklassen * invoerklassen : capteren van exogene gebeurtenissen * uitvoerklassen : informatie gevraagd door de gebruiker voorstellen * controleklassen : goede werking systeem waarborgen Systeemklasse * coördinator van het systeem
December 2001Eiffel sessie 219 De klasse PRODUCT met “make-is-run” classPRODUCT creation maken feature productnr, voorraad : INTEGER feature maken is do lees_invoer bestellen toon_voorraad end -- maken Bevat invoer en uitvoer instructies
December 2001Eiffel sessie 220 feature toon_voorraad is do io.putstring(“%NDe voorraad voor produkt ” ) io.putint(prodnr) io.putstring(“ bedraagt ”) io.putint(voorraad) end -- toon_voorraad feature bestellen is do io. putstring(“%NGeef hoeveelheid in : ”) io. readint voorraad := voorraad + io.lastint end -- bestellen
December 2001Eiffel sessie 221 feature lees_invoer is do io. putstring(“%NGeef produktnummer in : ”) io. readint prodnr := io.lastint putstring(“%NGeef beginvoorraad in : ”) io. readint voorraad := io.lastint end -- lees_invoer end -- class PRODUCT
December 2001Eiffel sessie 222 PRODUCT UITVOER PRODUCT SYS PRODUCT SYS INVOER Het PRODUCT voorbeeld herbekeken
December 2001Eiffel sessie 223 De nieuwe klasse PRODUCT class PRODUCT creation maken feature productnr, voorraad : INTEGER feature maken (productnr_in, vr_in : INTEGER) is do productnr := productnr_in voorraad := vr_in end -- maken feature bestellen (hoeveelheid : INTEGER) is do voorraad := voorraad + hoeveelheid end -- bestellen end -- class PRODUCT
December 2001Eiffel sessie 224 De klasse INVOER class INVOER creation maken feature een_product : PRODUCT feature maken is do lees_invoer end -- maken feature lees_bestelling is do io.putstring(“%NGeef hoeveelheid in : ”) io.readint een_product.bestellen(io.lastint) end -- bestelling
December 2001Eiffel sessie 225 De klasse INVOER (vervolg) feature lees_invoer is local productnr_in, vr_in : INTEGER do io.putstring(“Geef productnummer in : ”) io.readint productnr_in := io.lastint io.putstring(“%NGeef voorraad in : ”) io.readint vr_in := io.lastint create een_product.maken(productnr_in, vr_in) end -- lees_invoer end -- class INVOER
December 2001Eiffel sessie 226 De klasse PRODUCTSYS class PRODUCTSYS creation maken feature product1 : PRODUCT invoer1 : INVOER feature maken is do create invoer1.maken product1 := invoer1.een_product invoer1.lees_bestelling end -- maken end -- class PRODUCTSYS
December 2001Eiffel sessie 227 Overzicht van de belangrijkste instructies Systeemklasse PRODUCTSYS declaratie van product1 en invoer1 create invoer1.maken product1 := invoer1.een_product Invoerklasse INVOER declaratie van een_product : PRODUCT create een_product.maken(productnr_in, vr_in)
December 2001Eiffel sessie 228 De klasse UITVOER class UITVOER creation maken feature -- een productobject declareren feature maken (product_in : PRODUCT) is do -- dit productobject koppelen aan product_in end -- maken
December 2001Eiffel sessie 229 feature toon_voorraad is do io.putstring(“%NDe voorraad voor produkt ”) io.putint(een_product.productnr) io.putstring(“ bedraagt ”) io.putint(een_product.voorraad) end -- toon_voorraad end -- class UITVOER
December 2001Eiffel sessie 230 De klasse PRODUCTSYS class PRODUCTSYS creation maken feature product1 : PRODUCT invoer1 : INVOER -- een uitvoerobject declareren feature maken is do create invoer1.maken product1 := invoer1.een_product invoer1.lees_bestelling -- het uitvoerobject creëren -- de voorraad tonen end -- maken end -- class PRODUCTSYS
December 2001Eiffel sessie 231 product1 invoer1 uitvoer1 productsys productnr voorraad een_product
December 2001Eiffel sessie 232 De klasse UITVOER class UITVOER creation maken feature een_product : PRODUCT feature maken (product_in : PRODUCT) is do een_product := product_in end -- maken
December 2001Eiffel sessie 233 De klasse PRODUCTSYS Class PRODUCTSYS creation maken feature product1 : PRODUCT invoer1 : INVOER uitvoer1 : UITVOER feature maken is do create invoer1.maken product1 := invoer1.een_product create uitvoer1.maken(product1) uitvoer1.toon_voorraad end --maken end -- class PRODUCTSYS
December 2001Eiffel sessie 234 Overzicht van de belangrijkste instructies Systeemklasse PRODUCTSYS declaratie van product1, invoer1 en uitvoer1 create invoer1.maken product1 := invoer1.een_product create uitvoer1.maken(product1) Invoerklasse INVOER declaratie van een_product : PRODUCT create een_product.maken(productnr_in, vr_in)
December 2001Eiffel sessie 235 Overzicht van de belangrijkste instructies Uitvoerklasse UITVOER declaratie van een_product : PRODUCT een_product := product_in