Grondslagen v/d beleidsinformatica Hoofdstuk 7: Structureren in methoden 7.1 OVERZICHT CPU (centrale verwerkingseenheid) --> voert procedures en functies uit zoals neergeschreven Via structuren kan men routines een veel breder spectrum bieden 7.2 GESTRUCTUREERD: EEN DEFINITIE Instructies op een rij zetten is niet voldoende Men kan algoritmes opbouwen via drie structuurprimitieven (door Dijkstra - 1968) - Sequentie: de opeenvolging - Selectie: de keuzestructuur - Iteratie: de herhalingsstructuur We moeten de structuren niet volledig opbouwen zoals de computer dit zou doen (Warnier – 1972) --> keuze voor grafische ruimtelijk denken als basis voor een algoritme De technieken werden verfijnd door Michael Jackson 1975 --> introductie van ontwerpmethode voor structuren Eiffel biedt een combinatie tussen objectgericht en gestructureerd programmeren 7.3 DE SEQUENTIE Bij een opsomming v/d taken (zoals alle voorbeelden hiervoor) gebruikten we een sequentie Sequentie: opeenvolging van instructies Instructie1 instructie2 instructie 3 … instructie N ! Instructies moeten niet gescheiden zijn door een nieuwe regel of puntkomma --> qua overzicht is dit wel aangeraden 7.4 SELECTIE: DE IF-CLAUSULE 7.4.1 Enkelvoudige keuzestructuren We kunnen gebruik maken van selectiestructuren die behoren tot de keuzestructuren --> hierdoor bieden we alternatieve keuzemogelijkheden (acties) De keuze waardoor de actie begint noemt men een conditie Bijvoorbeeld: Het runnen v/e bepaalde actie als een uitkomst < 50% 1 Jeroen De Koninck – HIRB – 2012-2013 Keuzestructuren moeten voldoen aan twee eigenschappen: - Exclusief: geen overlappende condities - Exhaustief: condities dekken alle mogelijke gevallen De meest eenvoudige keuze is: if conditie then actie end -- if ! We sluiten een IF-structuur steeds af met een end-clausule ! We voegen een “voetnoot” -- if toe om de structuurprimitieve aan te tonen Een conditie is v/h type BOOLEAN Samengestelde uitdrukkingen zijn op basis van: - Booleaanse variabelen - Booleaanse functieoproepen - Vergelijkingsoperatoren en logische bewerkingen - AND - OR - NOT De actie kan bestaan uit: - enkelvoudige instructie - complexe instructie (sequentie, if-instructie of iteratie) Bij het uitvoeren v/e if-instructie: - Stap 1: analyse v/d conditie - Stap 2a: het resultaat is TRUE --> de actie gaat van start - Stap 2b: het resultaat is FALSE --> er gebeurd niets ZIE VOORBEELD PAGINA 122 - 123 7.4.2 Meervoudige keuzestructuren Meestal zijn er meervoudige keuzestructuren Voorbeeld: if conditie1 then actie1 elseif conditie2 then actie 2 elseif conditie3 then actie3 elseif ... {else laatste actie} --> optioneel --> optioneel end -- if 2 Jeroen De Koninck – HIRB – 2012-2013 ! Keuzealternatief tussen accolades is alternatief --> er wordt geen conditie omschreven Bij de uitvoering v/e meervoudige keuze-instructie --> analyse van alle condities, bij TRUE gaat men over tot actie Indien alles FALSE is dan voert men de optionele keuzealternatief uit --> deze is niet verplicht ! Geen alternatief zorgt dat het programma niets meer doet ! Condities worden achtereenvolgens geëvalueerd --> de exclusiviteit wordt gegarandeerd If getal < 20 then print(“Het getal is strik kleiner dan 20%N”) elseif getal < 30 then print(“Het getal is groter of gelijk aan 20, maar kleiner dan 30%N”) else print(“Getal is groter of gelijk aan 30”) end -- if Men kan de gehele werking weergeven in een determinatie structuur Conditie TRUE actie then FALSE actie else De structuur laat ons toe om te evalueren van boven naar onder Voorbeeld: bovenstaande tekst kan men ook (overbodig) schrijven als If getal < 20 then print(“Het getal is strik kleiner dan 20%N”) elseif getal >= 20 AND getal < 30 then print(“Het getal is groter of gelijk aan 20, maar kleiner dan 30%N”) else print(“Getal is groter of gelijk aan 30”) end -- if 3 Jeroen De Koninck – HIRB – 2012-2013 7.4.3 Condities en booleanen We moeten programma’s kwalitatief opbouwen en weldoordacht Voorbeeld: if geslacht = ‘M’ then print(“Mijnheer”) end -- if if geslacht = ‘V’ then print(“Mevrouw”) end -- if We gebruiken hier twee keer een afzonderlijke enkelvoudige keuzestructuur --> kan beter geschreven worden als een meervoudige keuzestructuur If geslacht = ‘M’ then print(“Mijnheer”) else print(“Mevrouw”) end -- if De gebruiker kan zelf maar één karakter toevoegen --> de waarden v/h geslacht zijn echter niet beperkt tot M en V Vaak schrijven mensen ook m of v If geslacht = ‘m’ or geslacht = ‘M’ then print(“Mijnheer”) elseif geslacht = ‘v’ or geslacht = ‘V’ then print(“Mevrouw”) end -- if ! We gebruiken in dit geval ook beter elseif dan else --> bij een schrijffout moet het programma eindigen en de gebruiker niet definiëren als een vrouw ! Programma’s moeten wel nog steeds leesbaar zijn door andere personen Bij voorkeur schrijven we condities in de instructie zelf ZIE VOORBEELDEN PAGINA 126 - 128 4 Jeroen De Koninck – HIRB – 2012-2013 7.5 ITERATIE: DE LOOP-CLAUSULE We kunnen gebruik maken van iteratiestructuren die behoren tot de herhalingsstructuren Qua overzicht ziet de herhalingsstructuur er zo uit: From beginactie Until stopconditie Loop te_herhalen_actie End -- loop We definiëren eerst de beginsituatie --> dit is het vertrekpunt v/d herhaling Bij een teller is dit bijvoorbeeld 0 of 1 Daarna definiëren we de stopconditie --> bij het bereiken van deze conditie stopt de herhaling Bij de loop-instructie wordt de from uitgevoerd en de stopconditie getest --> is de stopconditie TRUE dan stopt de herhaling --> is de stopconditie FALSE dan wordt alles herhaald tot men TRUE bereikt ! De stopconditie moet ooit TRUE kunnen zijn, anders heb je een oneindige lus From beginsituatie Until stopconditie Loop te_herhalen_actie End -- loop 7.5.1 De voorspelbare iteratie Voorspelbare iteraties zijn de eenvoudige iteratiestructuren --> het is geweten hoe vaak de herhaling zichzelf zal voordoen We maken gebruik v/e tellervariabele --> deze houdt bij hoeveel keer de iteratie zichzelf heeft doorlopen 5 Jeroen De Koninck – HIRB – 2012-2013 Voorbeeld: from teller := 0 until teller = 10 loop print(“Oefening baart kunst”) io.new_line teller := teller +1 end -- loop ! De teller wordt in de loop-conditie steeds met een 1 verhoogd Voorbeeld: We maken een teller waarbij de eerste gehele getallen bij elkaar worden opgeteld From i := 1 totaal := 0 Until i > 10 loop totaal := totaal + i i := i + 1 end -- loop We kunnen ook een complexe instructie toevoegen aan het actiegedeelte Voorbeeld: feature druk_rechthoek (lengte, breedte: INTEGER) is local i,j : INTEGER do from j := 0 until i = lengte loop from j := 0 until j = breedte loop io.putchar(‘*’) j := j + 1 end io.new_line i := i + 1 end -- loop end -- druk_rechthoek ! Als je druk_rechthoek(5,10) oproept, zal men binnenste lus 5 x uitvoeren en de actie erin 10x 6 Jeroen De Koninck – HIRB – 2012-2013 Voorbeeld De teller v/d eerste lus behoord hier tot de stopconditie v/d tweede lus Feature getallen_driehoek is local i, j: INTEGER do from i := 1 until i > 10 loop from j := 1 until j > i loop io.putint(j) j := j + 1 end -- loop i := i + 1 io.new_line end -- loop end -- getallen_driehoek 7.5.2 De onvoorspelbare iteratie De onvoorspelbare iteratie is een complexere iteratiestructuur --> de hoeveelheid herhalingen is niet geweten Voorbeeld Programma om getal op te tellen bij vorig tussentotaal --> het is op voorhand niet geweten hoeveel getallen de gebruiker zal willen optellen Men moet zelf ontdekken wanneer het laatste getal is ingevoerd We stellen per voorbeeld dat de gebruiken x getallen mag intypen en het alles stopt wanneer 99999 wordt ingedrukt Form - Start bij een tussentotaal van 0 - Vraag aan de gebruiker om een getal in te tikken Until getal = 99999 loop - Tel het getal op bij het tussentotaal - Vraag aan de gebruiker een getal in te tikken end -- loop Toon het tussentotaal (als eindtotaal) 7 Jeroen De Koninck – HIRB – 2012-2013 Feature kassa is local invoer, totaal: INTEGER do from totaal := 0 io.new_line print(“Tik een getal in (99999 om te stoppen):”) io.readint invoer := io.laststring until invoer = 99999 loop totaal := totaal + invoer io.new_line print(“Tik een getal in (99999 om te stoppen):”) io.readint invoer := lastint end -- loop io.new_line io.new_line print(“Het totaal is: “) io.putint(totaal) io.new_line end -- kassa 7.6 ITERESTIE EN SELECTIE: MENUSTRUCTUREN Menu’s zijn vaak opgebouwd bestaande uit zowel iteratiestructuren als keuzestructuren Voorbeeld: ZIE PAGINA 134 - 136 ! Wanneer men bij INTEGER een reëel getal ingeeft, krijgt men een exception --> het gaat om een zware fout die zal resulteren in een run-time error Compilatiefout: een fout reeds gevonden bij het compileren --> men probeert veel compilatiefouten te vinden zodat de kans op uitvoeringsfouten kleiner is Bij een run-time error zal het programma stoppen, tenzij de fout wordt opgevangen 7.7 EEN TELLERSYSTEEM MET MENUSTRUCTUUR 7.8 EEN REKENMACHINE ZIE VOORBEELDEN IN CURSUS PAGINA 137 - 147 EN BIJGEVOEGDE EIFFEL-BESTANDEN 8 Jeroen De Koninck – HIRB – 2012-2013