Programmastructuurdiagrammen

J. van Dort Mollerlyceum Bergen op Zoom
Tweede, herziene, versie. '03

Programmastructuurdiagrammen
§1 Inleiding
In de komende lessen gaan we een begin maken met programmeren. Programmeren is in feite niets anders dan het vertellen aan een computer van wat je wilt dat hij doet. Dat gaat (helaas) niet in gewone spreektaal, want die is vaak voor meerdere uitleg vatbaar. Er zijn daarom verschillende speciale programmeertalen ontwikkeld. Dit zijn talen met een beperkt aantal 'woorden' (opdrachten e.d.) waarvan de betekenis precies vastligt. Ook de syntax (de manier waarop 'zinnen' gemaakt moeten worden) ligt precies vast. Daardoor kan de computer de door jou gegeven opdrachten (de programmacode) op precies één manier vertalen naar bewerkingen die door de processor uitgevoerd kunnen worden. Het schrijven van een (groter) programma is vaak een hele klus, waarvan het typen van de programmacode slechts een klein deel uitmaakt. De meeste tijd gaat zitten in het testen van het programma (doet het wel wat ik wil?; kan het tegen 'verkeerde' invoer e.d.?) en het bedenken van hóe je de oplossing van het gegeven probleem gaat aanpakken. In het algemeen is het het makkelijkst eerst de hoofdlijnen vast te leggen en daarna de details uit te werken. Het vastleggen van de structuur van de oplossing (het algoritme) gebeurt in een programmastructuurdiagram (PSD). Je bent ze al eens tegengekomen in een van de eerdere hoofdstukken. Je gaat vanaf opdracht 5 werken met het programma StruktoGraaf dat het tekenen van een PSD voor je doet. Het invullen van het PSD moet je zelf doen, maar dat is juist het interessante en leuke aan programmeren………… Maar StruktoGraaf doet meer: als je de juiste aanpak gekozen hebt, vertaalt het jouw PSD in een computerprogramma dat direct uitgevoerd kan worden. Je hoeft dus zelf (nog) geen echte programmeertaal te gebruiken. Je kunt een demoversie van StruktoGraaf downloaden van www.sichemsoft.nl. Met deze demo kan je geen PSD 's opslaan, maar je kan je PSD's wél bewaren door ze m.b.v. knippen en plakken in een Word-document te plakken.

§2 Wat is een programmastructuurdiagram?
Een PSD (programmastructuurdiagram) is een schema dat de onderlinge volgorde en samenhang van opdrachten binnen een programma weergeeft. PSD's worden niet geschreven in een programmeertaal, maar dienen om de structuur van een programma vast te leggen. Dit is onafhankelijk van de programmeertaal die je (later) gebruikt. Het vertalen naar programma-code gaat daarna een stuk eenvoudiger. Een PSD bestaat uit een rechthoek (of als je ingewikkelder programma's gaat maken, uit meerdere rechthoeken), waarbinnen tekst of een aantal basisfiguren voorkomt. De drie meest gebruikte basisstructuren zijn: de opdracht, de keuze en de herhaling. (StruktoGraaf bevat er nog meer, maar die zullen wij niet gebruiken.)

opdracht

keuze

herhaling

Door deze basisstructuren te combineren kan je voor elk programma een PSD maken.

§3 De opbouw van een PSD
De opdrachten en acties die uitgevoerd moeten worden in een PSD worden in principe van boven naar beneden uitgevoerd. Bekijk het volgende voorbeeld maar eens. De tekst tussen accolades maakt geen deel uit van de programmacode, maar is commentaar (zie ook §4).
Programmastructuurdiagrammen 13-3-2003 jvd

2

Dit programma doet het volgende: Eerst wordt er een tekst op sc hr i j f " Van wel k get al wi l j e het k wadr aat ?" het scherm afgedrukt: de l ees get al { hi er wor dt het i ngev oer de get al gel ez en} vraag 'Van welk getal wil je het kwadraat?'. (Dat wat kwadr aat : = get al * get al { k wadr aat ber ek enen} tussen de aanhalingstekens staat wordt letterlijk sc hr i j f " Het k wadr aat i s : " afgedrukt.) sc hr i j f k wadr aat De volgende opdracht 'lees getal' laat het programma wachten totdat de gebruiker een getal ingetoetst heeft. De term getal kan je zien als de naam van een geheugenplaats in de computer en die kan elke waarde bevatten die de gebruiker van het programma intikt. We noemen dit een variabele omdat getal elke keer een andere (dus veranderlijke) waarde kan krijgen. De term kwadraat is dus ook een variabele.
{ k wadr aat }

De volgende opdracht maakt de waarde van de variabele kwadraat gelijk aan de waarde van getal maal getal. Anders gezegd: aan (de variabele) kwadraat wordt de waarde getal * getal toegekend. Het symbool := gebruik je bij de toekennings-opdracht: kwadraat wordt getal keer getal. De volgende opdracht is weer een schrijfopdracht voor een regel tekst (te herkennen aan de aanhalingstekens). De laatste opdracht is ook een schrijfopdracht, maar nu wordt de waarde van de variabele kwadraat afgedrukt (geen aanhalingstekens!). Opgave 1 Maak in je schrift een PSD dat drie getallen leest en het gemiddelde van die drie getallen afdrukt. Zorg er voor dat aan de gebruiker van het programma duidelijk gemaakt wordt wat er van hem verlangd wordt. Een leeg scherm met een knipperende cursor zegt de meeste mensen niets, dus laat bijv. het doel van het programma afdrukken ("Dit programma berekent het gemiddelde van drie door U in te voeren getallen.") Vraag daarna om die getallen in te voeren, en vermeld de betekenis van de uitvoer. In het algemeen geldt: maak programma's gebruikersvriendelijk!!!

Er zijn verschillende soorten variabelen. De twee hoofdtypen zijn: numerieke variabelen, voor het opslaan van getallen; alfanumerieke, voor het opslaan van tekenreeksen (Eng: strings). Er zijn aparte numerieke typen variabelen voor het opslaan van gehele getallen (Eng: integer) en voor reële getallen (Eng: real, of: double). Met numerieke variabelen kan je rekenen, alfanumerieke variabelen worden gebruikt om tekst op te slaan.

§4 Commentaar
Commentaar is tekst (géén programmacode) die in een programma tussengevoegd wordt en bijvoorbeeld nuttig is bij een latere wijziging of uitbreiding van het programma, of om bepaalde gedeelten van een programmacode of PSD toe te lichten. Zie de tekst tussen accolades in het PSD hierboven. Begin een programma steeds met een stukje commentaar waarin je de auteur van het programma aangeeft en een korte omschrijving van het doel van het programma. Bij het huiswerk vermeld je ook steeds het nummer van de opgave. Opgave 2 Een stalen balk met hoogte h en breedte b die voor een lengte l uit een (stevige) constructie steekt kan aan zijn uiteinde maximaal een gewicht g dragen dat berekend

Programmastructuurdiagrammen 13-3-2003

3

jvd

kan worden met de formule g =

19b ×h2 . (Hierbij zijn de lengtematen in cm en g in kg.) l Maak in je schrift een PSD dat de drie maten leest en het maximale gewicht berekent en afdrukt.

§5 De herhaling
Bovenstaande programma's waren rechttoe rechtaan: alle opdrachten werden van boven naar beneden door het PSD gaand in die volgorde uitgevoerd. In veel situaties moet een groep opdrachten echter herhaald worden. Een voorbeeld is het volgende programma:
{ t af el v an 6} sc hr i j f " De get al l en ui t de t af el van 6 zi j n: " t el l er := 1

ZOLANG t el l er <= 10 ui t k om st : = t el l er * 6 schr i j f ui t kom st t el l er : = t el l er + 1

Na de verklarende regel die in de eerste opdracht afgedrukt wordt, krijgt de variabele teller de waarde 1. In de derde regel begint een herhalingsblok: zolang geldt: 'teller <= 10 is waar (true)' wordt het deelprogramma in het binnenste blok herhaald. De voorwaarde 'teller <= 10' wordt onwaar(false) als teller groter dan 10 is. Als dat zo is, wordt het deelprogramma niet meer uitgevoerd en stopt het

programma. Op het scherm worden de antwoorden van de tafel van 6 afgedrukt. Bestudeer het voorbeeld dat gegeven wordt in de PPpresentatie: Voorbeeld bij §5. Opgave 3 Maak in je schrift een PSD dat uitrekent hoeveel er uitkomt als je de eerste honderd kwadraten bij elkaar optelt, en die uitkomst op het scherm afdrukt.

§6 De keuze
Soms is het (verdere) verloop van een programma afhankelijk van de waarde die een variabele op een gegeven moment krijgt. Er moet dan gekozen worden welk van de mogelijkheden er gebruikt moet worden. Bij een keuze is er sprake van een voorwaarde ofwel conditie en een tweetal handelingen, waarbij kenmerkend is dat óf de ene óf de andere handeling wordt uitgevoerd. Welke actie wordt uitgevoerd is afhankelijk van het feit of aan de voorwaarde is voldaan of niet.
N.B. Er bestaan ook constructies waarbij je naar aanleiding van de waarde van een variabele uit méér dan twee handelingen kan kiezen. Deze zullen in deze lesbrief echter niet besproken worden.

Bekijk het PSD op de volgende bladzijde:

Programmastructuurdiagrammen 13-3-2003

4

jvd

{m i m } ax um s c hr i j f " Geef t wee get al l en" l ees get al 1 l ees get al 2 get al 1>get al 2 JA m ax : = get al 1 m ax : = get al 2 NEE

Als getal1 groter is dan getal2 dan krijgt max de waarde van getal1, anders krijgt max de waarde van getal2. Op het scherm wordt het grootste getal getoond.
Een keuzediagram wordt ook wel een als-dan-anders – constructie genoemd.

s c hr i j f " Het gr oot s t e v an dez e get al l en i s : " & { De & z or gt er v oor dat er ni et op een ni euwe r egel begonnen wor dt m et af dr uk k en. } s c hr i j f m ax

Opm: De ampersand ( d.i. het &-teken) achter de schrijfopdracht zorgt er voor dat de volgende schrijfopdracht de tekst direct achter déze tekst plaatst. Wil je van meerdere variabelen de waarden afdrukken in één schrijfopdracht, dan kan dat ook door die variabelen met komma's ertussen achter de schrijfopdracht te vermelden. De twee laatste schrijfopdrachten uit dit PSD kunnen dus ook vervangen worden door één opdracht: schrijf "Het grootste van deze getallen is: ", max.

Opgave 4 Maak in je schrift een PSD dat twee getallen leest en dan het grootste getal met 2 vermenigvuldigt en daarna optelt bij het andere. Daarna wordt de uitkomst afgedrukt.

§7 Het werken met StruktoGraaf
We gaan nu werken met het programma StruktoGraaf: een programma dat je in staat stelt om op een eenvoudige manier (het technische gedeelte van) PSD's te maken. Bovendien kan het je PSD vertalen naar een programmeertaal (compileren) en het programma laten werken, zodat je direct kunt controleren of het PSD doet wat je bedoelde. Start het programma StruktoGraaf. (Start – Programma's – Informatica) Kies Bestand⏐ Nieuw of druk op Ctrl-N of klik op de knop met het lege vel in de horizontale knoppenbalk. (zie ook de afbeelding hieronder) We maken als voorbeeld de tafel van 7. Zet de cursor links bovenin het scherm en typ: {De tafel van 7}. Klik op de knop met de rode rechthoek in de verticale knoppenbalk. Klik vervolgens ergens in het tekenvenster. Er verschijnt een leeg rechthoekje (met de cursor). Klik dan op de knop met de horizontale lijn en vervolgens op de onderkant van of binnen in het zojuist getekende diagram. Er is een nieuw rechthoekje bijgemaakt. Klik op de knop met het zolangdiagram (het herhalingsdiagram) en vervolgens binnen het onderste rechthoekje. Het PSD bestaat nu uit een lege rechthoek (een procesdiagram) gevolgd door een herhalingsdiagram.

Programmastructuurdiagrammen 13-3-2003

5

jvd

Maak nu het diagram verder af door een klik op de knop met de horizontale lijn en tot slot een klik binnen het door het zolangdiagram omsloten PSD. Het totaal moet er nu als volgt uitzien (afgezien van de zeven extra regels tekst aan de linkerkant):

In de afbeelding hierboven is ook van de zes belangrijkste knoppen in de verticale balk de betekenis gegeven. Je kunt e.e.a. ook teruglezen bij de helpfunctie. ( help – inhoudsopgave – introductie). De helpfunctie is ook handig als je de opdrachten moet maken. Je kunt o.a. een aantal voorbeelden bekijken en de syntax van StruktoGraaf. Completeer het PSD door de programmaregels in het diagram in te typen en wel als volgt: - n:=1 Bij de schrijfopdracht staan er nu drie opdrachten in één - ZOLANG n<=10 opdracht; ze worden nu op één regel afgedrukt. Let op de scheidingskomma's en het gebruik van spaties SCHRIJF n, " x 7 = ", n*7 binnen de aanhalingstekens. - n :=n+1 Opmerkingen: • Typ eens achter de laatste opdracht (n:=n+1) een lange rij uitroeptekens. Je ziet dat de breedte van de figuur vanzelf aangepast wordt. Veeg nu die uitroeptekens weer uit; het PSD blijft even breed! Om het PSD de best passende afmeting te geven druk je nu op de knop met de twee pijlen in de horizontale menubalk (links naast de 'ongedaan-maken’-knop). • Als je na het maken van het 'frame' van het PSD wil gaan beginnen met het typen van tekst, is het handig om eerst op het schuine pijltje linksboven ('selecteren') te klikken. Je kunt dan met de muis de cursor overal neer zetten om te typen of te wissen, zonder dat er nieuwe cellen ingevoegd worden.

Programmastructuurdiagrammen 13-3-2003

6

jvd

ο

Kies Code⏐Genereren. Het PSD wordt nu door Struktograaf vertaald naar een echt computerprogramma. Dit heet compileren. Als het compileren lukt krijg je de melding hiernaast: Als het PSD niet in één keer goed gecompileerd kan worden krijg je een foutmelding. Klik op de knop, dan verschijnt er een venster als hieronder.

Onderaan in het venster staan foutmeldingen. Als je die aanklikt gaat de cursor naar de regel waar een fout zit. In dit geval is er een dubbele punt getypt, waar een := teken had moeten staan.

Verbeter de fout(en) en compileer opnieuw.

ο

Kies na correcte compilatie Code⏐Uitvoeren of Ctrl-F9 of de knop met de raket. Nu

wordt de uitvoering gestart en de tafel van 7 verschijnt op het scherm. Met een druk op een toets verdwijnt dit scherm weer.

Programmastructuurdiagrammen 13-3-2003

7

jvd

@ Om je PSD op te slaan: klik op het diskette-symbool links in de menubalk en geef in
het dan geopende venster aan waar je het PSD wil bewaren: neem een (aparte) diskette (A:) of gebruik je eigen gedeelte van de harde schijf (H:). Neem als naam voor het bestand: opgave nr. …. Overigens wordt iedere keer als je een compileeropdracht geeft het huidige PSD automatisch op schijf opgeslagen, zodat de laatste versie steeds bewaard wordt.

Opgave 5 Maak van de opgaven 1 t/m 4 een PSD in Struktograaf, compileer en test elk PSD.! N.B. Het is altijd verstandig om een programma éérst op te slaan, en pas daarna te testen. Als het niet (goed) werkt kan je de programmacode kwijtraken als de computer vastloopt!! Opgave 6 Maak een PSD van een programma dat (met een herhalingslus) bepaalt wat de uitkomst is als je de getallen 1,2,3….tot en met een getal dat je in moet voeren met elkaar vermenigvuldigt, en daarna de uitkomst op het scherm toont. (Als je dus bijvoorbeeld het getal 6 invoert, wordt er uitgerekend hoeveel 1x2x3x4x5x6 is en de uitkomst 720 wordt op het scherm afgedrukt.) Opgave 7 Maak een PSD dat twee getallen (die kleiner dan 1000, het eerste kleiner dan het tweede) inleest en dan alle kwadraten die voorkomen tussen die twee getallen afdrukt. (Dus als je bijvoorbeeld eerst 10 en dan 50 invoert, krijg je het lijstje met de volgende kwadraten: 16, 25, 36, 49.)

§8 Fouten opsporen
Een PSD dient (rechtstreeks) om te zetten te zijn in een correct functionerend programma. Om de werking van een PSD te begrijpen of te controleren is het noodzakelijk om de opdrachten na te lopen. Daarbij worden de opdrachten stap voor stap op papier uitgevoerd. Dit heet een ooggetuigenverslag. Zie het volgende voorbeeld.
Voorbeeld PSD Ooggetuigenverslag

{ 1} { 2} { 3}

p : =5 q : =- 1 ZOL ANG p >- 3 q

{ 4} { 5} { 6} { 7}

p : =p +2 q q : =- 2 q " p =" , " q =" , p q

regel 1 2 3 4 5 3 4 5 3 6 7

p 5 5 5 3 3 3 7 7 7 7 7

q -1 -1 -1 2 2 2 -4 -4 -4 -4

p>-3q

waar

waar

s c hr i j f s c hr i j f

niet waar

commentaar Toekenning van waarde 5 aan p Toekenning van waarde –1 aan q 5 is groter dan (-3*-1=) 3. p krijgt waarde p+2q, dus 3. q krijgt waarde –2q, dus 2. Nu terug naar regel 3. 3 is groter dan (-3*2=) -6 p krijgt waarde p+2q, dus 7. q krijgt waarde –2q, dus -4. Nu terug naar regel 3. 7 is niet groter dan (-3*-4=) 12, dus nu naar regel 6. Afgedrukt wordt: p=7 Afgedrukt wordt: q=-4
jvd

Programmastructuurdiagrammen 13-3-2003

8

Opgave 8 Ga na aan de hand van een ooggetuigenverslag wat het hieronder links staande programma zal afdrukken. Maak het ooggetuigenverslag in Word en sla het op.

{ opgave 8} { 1} x : =1 { 2} y : =2 { 3} ZOLANG x < 6 { 4} x > 4 JA NEE { 5} y: =y+x

{ opgav e 9} aant al : =0 l ees i nvoer get al ZOLANG i nv oer get al > 10

i nv oer get al : =i nv oer get al - 5 aant al : = aant al + 1 i nv oer get al > 6 JA NEE aant al : =aant al + 3

{ 6} x: =x+2
s c hr i j f i nv oer get al

{ 7} s chr i j f x , y
aant al : =aant al + 1 s c hr i j f aant al

Opgave 9 Zie het PSD hier rechtsboven. a. Wat wordt er getoond als het invoergetal gelijk is aan 13? (Maak een ooggetuigenverslag in Word) b. Wat wordt er getoond als het invoergetal gelijk is aan 20? (Maak een ooggetuigenverslag in Word) Opgave 10 Maak een PSD dat drie getallen leest en dan de kwadraten van de kleinste twee van die getallen bij elkaar optelt en het resultaat afdrukt. Laat de uitvoer afdrukken in een Nederlandse zin. (Bijvoorbeeld: invoer van de getallen 9, 17 en 11 geeft op het scherm: 'Als je de kwadraten van de kleinste twee getallen optelt krijg je: 202.)

Als je een PSD gemaakt hebt dat na compilatie géén foutmeldingen meer geeft wat betreft de syntax, maar toch niet doet wat je er van verwacht, bevat het een logische fout. Een manier om zo'n fout te ontdekken is het maken van een ooggetuigenverslag van het gedeelte van het PSD waar je vermoedt dat de fout zit. Een andere manier is om StruktoGraaf het PSD stap voor stap te laten doorlopen. Dat doe je door na een geslaagde compilatie te kiezen voor: Code/Doorlopen. Voor het programmaatje van bladzijde 6 bovenaan krijg je dan het volgende venster te zien:

Programmastructuurdiagrammen 13-3-2003

9

jvd

Klik op de knop 'Stappen' en de volgende opdracht, dat is de regel die door de zwarte balk aangegeven wordt, wordt uitgevoerd. Elke klik op die knop laat de volgende opdracht uitvoeren. Daarbij worden de waarden van de variabelen in het linker schermpje getoond, terwijl het scherm rechtsonder de uitvoer (of invoer) van het programma laat zien. Probeer dit uit! Deze 'debugger' (foutenzoeker) komt vaak van pas! Opgave 11 Maak een PSD dat een beginkapitaal en een rentepercentage inleest en vervolgens een tabel (dwz twee kolommen naast elkaar, zonder opmaak) afdrukt met de jaartallen vanaf dit jaar tot over 20 jaar en de waarde van het kapitaal in dat jaar. Vergeet niet bij de uitvoer een titel boven de kolommen te zetten. Je hoeft het kapitaal (nog) niet af te ronden op hele euro's, o.i.d. Bijvoorbeeld: als je kiest voor beginjaar 2003, kapitaal 10.000 en rente 7% krijg je (ongeveer) het volgende op het scherm: Jaar 2003 2004 2005 2006 .. .. 2022 Kapitaal 10000 10700 .. .. ..

Bedenk dat als je een getal met 7% wil verhogen je het makkelijkst dat getal kunt vermenigvuldigen met het getal 1,07! Wil je er 7% van afhalen, vermenigvuldig je met 0.93!

Opgave 12 Van een aantal artikelen wordt de prijs verhoogd op de volgende manier: als de prijs meer is dan € 150 komt er 19% bij; artikelen die goedkoper zijn dan € 55 worden 11% duurder; de rest wordt 16% in prijs verhoogd. Maak een PSD dat een prijs leest en de nieuwe prijs afdrukt. Geef de uitvoer weer in een Nederlandse zin.

Programmastructuurdiagrammen 13-3-2003

10

jvd

Opgave 13 Marloes heeft een prijs gewonnen van € 100.000 en zet dit bedrag per 1 januari a.s op de bank tegen 4% rente per jaar. Aan het eind van ieder jaar neemt zij een bedrag op van € 5000. Maak een PSD dat berekent hoe lang zij dit zal blijven kunnen doen. Mocht dit méér zijn dan 50 jaar, moet er afgedrukt worden: 'Tot aan je pensioen.' Opgave 14 Maak een PSD dat een tabel afdrukt van de eerste honderdvijftig getallen en hun kwadraten, waarbij er na iedere 10 regels in de tabel een regel overgeslagen wordt. Vergeet de kolomtitels niet. Omdat het regelmatig voorkomt dat er nádat het programma gemaakt is gegevens in het programma nog aangepast moeten worden (bijvoorbeeld rente wordt 5% ipv 4%), is het verstandig om in de code van een programma zo weinig mogelijk 'echte' getallen op te nemen. Maak in het begin van het programma een aantal variabelen als kapitaal1, rente1, kapitaal2 en dergelijke, en geef die de betreffende waarden. (Deze variabelen die niet echt variabel zijn in het programma heten constanten.) Bijv. kapitaal1:=2000. Werk dan in de rest van de code van het programma met die variabelen. Als later dezelfde vraag nog eens komt voor een ander kapitaal of een andere rente, hoef je alléén die waarde in de eerste regels aan te passen. Anders zou je overal in je programma dat getal moeten veranderen en dat levert zeker in een groter programma fouten op!! In de volgende opgave(n) moet je constanten (zoals kapitaal en rente) op die manier verwerken. Opgave 15 Maak een PSD dat uitzoekt na hoeveel jaar een kapitaal van € 2500, dat uitstaat tegen 7% rente, groter is geworden dan een kapitaal van € 3000 dat tegelijkertijd uitgezet is tegen 5% rente per jaar.

§9 Toevalsgetallen, 'afronden' en rijen,
ofwel de functies RANDOM en INT, en arrays.
Alle programmeertalen bevatten een functie die willekeurige getallen kan genereren. Ook StruktoGraaf heeft zo'n functie: RANDOM. Deze levert toevalsgetallen tussen de 0 en 1 op. Wil je een toevalsgetal tussen 0 en 7 toekennen aan een variabele a, dan geef je de opdracht a:=7*RANDOM. Een andere functie die in veel programmeertalen voorkomt is INT (van integer, geheel getal). Deze functie kapt een (positief) reëel getal af (dwz, verwijdert het gedeelte achter de komma) zodat er een geheel getal overblijft. Bijvoorbeeld: INT(5.23)= 5, INT(0.731)=0, INT(√10)=3, maar INT(-3.6)=-4 en INT(-2.1)=-3. Opgave 16 Dezelfde opdracht als opgave 13, maar het op te nemen bedrag moet nu ingevoerd worden en er moet een overzicht afgedrukt worden van de grootte van het kapitaal, steeds per 1 januari, afgerond op hele euro's. Als je van een geheel getal (bijv. 753) het laatste cijfer wilt hebben kan je de INT-functie op de volgende manier gebruiken: deel het getal door 10 en neem de INT van de uitkomst. Vermenigvuldig die INT-uitkomst met 10 en trek dit af van het oorspronkelijke getal. Het getal dat je nu vindt is het laatste cijfer.

Programmastructuurdiagrammen 13-3-2003

11

jvd

Opgave 17 Verwerk dit in een PSD en test het. Opgave 18 Maak een PSD dat de laatste twee cijfers van een ingevoerd positief getal geeft. Controleer je programma met: 156, 3458910, 12500, 12 en 5. Opgave 19 Maak een PSD dat de eerste keer 10 keer 'met een dobbelsteen gooit', daarna 20 keer, dan 30 keer, en zo tot en met 100 keer, en steeds voor ieder van deze aantallen dat aantal worpen afdrukt, met daarnaast het gemiddelde van de in die serie geworpen ogen. Soms is het handig om een hele rij variabelen (van hetzelfde type) met één naam te beschrijven. Daarvoor hebben we de beschikking over arrays. Om een array van 11 variabelen met de naam 'getallenrij' te maken, gevuld met willekeurige gehele getallen van 0 tot en met 3, kunnen we bv het volgende PSD uitvoeren:

{ ar r ay m en} ak v oor i : =1 t m 11 get al l enr i j ( i ) : = i nt ( 4* r andom )

Opgave 20 Maak een PSD dat 10 keer gooien met een dobbelsteen simuleert en de uitkomsten opslaat in een array 'dobbelsteen'. Laat daarna die array afdrukken.

Opgave 21 Maak een PSD dat 100 keer met drie dobbelstenen gooit en telt hoe vaak elke uitkomst (3, 4, 5,…,18) voorkomt. De uitvoer is een tabelletje met de uitkomsten van de worp en de frequenties. (Bedenk dat als je met twee dobbelstenen gooit de kans op uitkomst 3 véél kleiner is dan op bv 10, en dat je dus niet zomaar via toevalsgetallen een rijtje met getallen 3, 4, 5, 6, etc. kan vullen!)

§10 De keuze (vervolg)
Met behulp van een keuzediagram kan je controleren of een variabele aan een bepaalde voorwaarde voldoet of niet, en dan in elk van die gevallen een andere vervolgopdracht geven. Bekijk het volgende stukje PSD: Als de waarde van de variabele lengte kleiner is dan 150 (anders gezegd: als de conditie (voorwaarde) 'lengte>150' waar is) wordt het woord 'prima' op het scherm afgedrukt. In het andere geval wordt de waarde van lengte met 10 verhoogd.

l engt e<150

JA schr i j f " pr i m a"

NEE l engt e: =l engt e+10

Programmastructuurdiagrammen 13-3-2003

12

jvd

Het kan voorkomen dat de conditie ingewikkelder is. Bijvoorbeeld: lengte moet een waarde hebben tussen 100 en 150; 100<lengte<150. Als je dit zo intypt in Struktograaf (of een programmeertaal) krijg je een foutmelding. We kunnen dit voorkomen door te bedenken dat dit eigenlijk twéé voorwaarden zijn die tegelijkertijd moeten gelden. Dus lengte>100 én lengte<150. Je kunt dit op de volgende manier in StruktoGraaf gebruiken:

l engt e>100 EN l engt e<150

Het woordje EN geeft je de mogelijkheid om in de conditie van een keuzediagram te controleren of aan twee (of meer) eisen tegelijkertijd voldaan is.

JA ...... ......

NEE

Een conditie van de vorm 'aantal<7 OF gewicht 15' levert het antwoord JA op als de waarde van de variabele aantal kleiner is dan 7, óf de waarde van de variabele gewicht kleiner is dan 15, óf dat dat allebei geldt. Voorbeeld:

ui t kom <=2 O ui t kom >=7 st F st

JA schr i j f " O K" schr i j f " f out ! "

NEE

Als uitkomst de waarde 20 heeft wordt nu op het scherm de opmerking "fout!" afgedrukt. Als uitkomst de waarde 5 heeft wordt er "OK" afgedrukt.

Opgave 22 Een ronde schijf is verdeeld in 14 even grote stukken. In elk gedeelte staat één van de getallen 3 tot en met 16. Nadat de schijf aan het draaien is gebracht wordt er als hij weer stilstaat één van deze getallen aangewezen. Maak een PSD waarin 200 keer draaien van deze schijf gesimuleerd wordt. Er wordt geteld hoe vaak een van de getallen van 6 tot en met 14 aangewezen wordt en daarna wordt dit aantal afgedrukt. Opgave 23 Je speelt het volgende spel: je gooit drie keer met een dobbelsteen. Je krijgt één euro uitbetaald als de eerste of de laatste worp hoger is dan de tweede worp; anders moet je een euro betalen. Maak een PSD dat 100 van deze spelletjes simuleert en daarna afdrukt hoeveel euro je uitbetaald krijgt, of moet betalen. Opgave 24 Voor de winnaar van een spel waarbij een maximum aantal punten gescoord kan worden van 99 punten, is de volgende prijzengeldregeling van kracht: De prijs is een vast bedrag van € 500, aangevuld met € 3 voor elk behaald punt en bovendien € 2 voor elk punt dat gescoord is boven de 46 punten. Maak een PSD dat een score leest, controleert of die mogelijk is, en daarna het prijzengeld berekent. Als de ingevoerde score niet mogelijk is moet er een passende mededeling afgedrukt worden, en de mogelijkheid geboden worden om het opnieuw te proberen totdat er een mogelijke score ingevoerd wordt. (Het programma mag dus niet stoppen bij een verkeerde invoer, maar moet opnieuw naar invoer vragen!)
Programmastructuurdiagrammen 13-3-2003 jvd

13

Opgave 25 Bodehuis UPS stelt aan pakketten die vallen in de categorie 'middelgrote pakketten' de volgende eisen: de breedte moet minimaal 10 cm en de lengte min. 15 cm zijn, anders is het 'te klein'; de lengte, breedte en hoogte mogen samen niet meer zijn dan 1.20 m, terwijl de lengte niet meer mag zijn dan 70 cm, anders is het pakket 'te groot'. Maak een PSD dat de drie afmetingen van een pakje inleest en onderzoekt of het aan de gestelde eisen voldoet. Laat de uitslag (te klein, te groot of goed) op het scherm afdrukken.

§11 Strings
Er zijn variabelen die tekst bevatten in plaats van getallen. Dit type variabele wordt string genoemd. Die tekst die een string bevat kan bestaan uit één karakter (letter of symbool), een hele zin (in StruktoGraaf max 200 karakters) of helemaal geen karakters (een lege string). Een stringvariabele krijgt net als andere variabelen een waarde door een toekenning, bijvoorbeeld: naam:="Jan Klaassen". Hierbij moeten de karakters tussen dubbele aanhalingstekens "" staan. De karakters uit zo'n string kan je apart in een variabele opslaan. (Een string wordt dan opgevat als een array!) Bijvoorbeeld: naam[1] is "J" en naam[9] is "s". LET OP: de spatie in naam[4] telt ook mee! Met naam[5:9] krijg je de substring die bestaat uit het 5e tot en met 9e karakter, dus "Klaas". Met de functie LEN kan je het aantal karakters van een string te weten komen: LEN(naam) heeft de waarde 12. Opgave 26 Maak een PSD dat twee woorden (of zinnen) leest en dan afdrukt of het tweede woord langer, korter of even lang is als het eerste woord, en hoeveel karakters dat scheelt. Opgave 27 Maak een PSD dat een woord inleest (van minimaal 8 karakters) en daarna de substring afdrukt die bestaat uit de laatste vijf karakters. Is het woord korter dan 8 karakters, moet er een foutmelding afgedrukt worden. Uit twee strings kan een nieuwe string gemaakt worden door ze aan elkaar te rijgen (concateneren). Net zoals er voor bijvoorbeeld aftrekken en vermenigvuldigen operatoren zijn, namelijk het -, respectievelijk het *-teken, is er voor concatenatie ook een symbool: we gebruiken daarvoor (net als voor optellen van getallen) het + teken. Bijvoorbeeld: na de opdrachten naam:="Jan" en woord:="Klaassen" geeft de opdracht nieuw:=naam+woord aan de string nieuw de waarde "JanKlaassen" (zonder spatie!).

{ v oor beel d conc at enat i e}
Als je een string karakter voor karakter wil opbouwen (in een lus bijvoorbeeld) is het vaak handig om met de lege string te beginnen. Zie het volgende PSD.

naam =" abcdef ghi j kl m : nopqr s t uvwxy z" ni euw: =" " i : =1 ZOLANG i <=26 { l ege st r i ng} { begi nwaar de t el l er t j e}

ni euw: =ni euw + naam i ] [
Dit PSD levert op het scherm de string 'adgjmpsvy'. Ga dit na.

i : =i +3 sc hr i j f " De gem aakt e st r i ng i s : " , ni euw

Programmastructuurdiagrammen 13-3-2003

14

jvd

Opgave 28 Maak een PSD dat een ingelezen woord 'achterstevoren' weer afdrukt. Opgave 29 Een palindroom is een woord of getal dat achterstevoren gelezen hetzelfde woord of getal oplevert, zoals 'lepel’, 'negen’, 46564, etc. Maak een PSD dat bepaalt of een ingelezen woord een palindroom is en de juiste conclusie afdrukt.

§12 De functies ASC en CHR.
Zoals je weet worden ook letters, leestekens e.d. in een computer voorgesteld door getallen. Er is een afspraak gemaakt welk karakter door welk getal voorgesteld wordt. Deze lijst is de ASCII-tabel (die je in een van de eerste hoofdstukken van het boek al tegengekomen bent). Daarin kan je o.a. vinden dat de letters A t/m Z de ASCII-waarden 65 t/m 90 gekregen hebben; bij de letters a t/m z horen de getallen 97 t/m 122 en de spatie heeft ASCII-waarde 32. In programmeertalen bestaan er functies die bij een karakter vertellen welke ASCIIwaarde hij heeft en, omgekeerd, die je bij een opgegeven waarde (van 0 t/m 255) het bijbehorende karakter geeft. In Struktograaf geldt dit ook: het zijn de functies ASC en CHR. Bijvoorbeeld: ASC("a") geeft de ASCII-waarde van de kleine letter a, ofwel 97; CHR(100) geeft het karakter met ASCII-waarde 100, ofwel de kleine letter d. Bekijk het volgende PSD als voorbeeld: Dit programma drukt achtereenvolgens de ASCII-waarden van de letters t, a, b, e en l af.
w oor d: =" t abel " i : =1 ZO LAN G i <=5 as c ( w oor d[ i ] )

s c hr i j f i : =i +1

Ga dit na. Voorbeeld: Dit programma maakt een 'woord', bestaande uit de hoofdletters A t/m J en drukt dit af.

ni euw: =" " v oor i : =0 t m 9

ni euw: =ni euw + c hr ( 65+i ) s c hr i j f ni euw

Ga dit na. Opgave 30 Maak een PSD dat van een ingelezen zin (bestaande uit (hoofd-)letters, spaties en een punt) uitzoekt welke letters er in voorkomen en van elke letter zegt hoeveel er voorkomen. De uitvoer is de zin, met daaronder een lijstje van de voorkomende letters met de aantallen.

Programmastructuurdiagrammen 13-3-2003

15

jvd

Opgave 31 Er zijn talen die geen klinkers kennen. Maak een PSD dat een zin inleest, alle klinkers uit die zin verwijdert en het resultaat afdrukt.

Voor de liefhebber: Opgave 32 Je kunt een simpel geheimschrift maken door alle letters in een woord te vervangen door een letter die een vast aantal plaatsen (bijv. 4) verderop in het alfabet staat. Dus dan a→e, b→f, k→o en p→t. Maak een PSD dat een woord inleest en daar dan zo'n codering op toepast. Ga er van uit dat het woord alleen kleine letters bevat. Test je programma met de woorden: aardbei, zwaardvis en informatica. Opgave 33 Dezelfde opgave als opgave 29, maar nu voor een zin, zonder hoofdletters en punt, in plaats van een woord, waarbij elk woord apart gecodeerd wordt. Opgave 34 Maak een PSD dat een woord dat met het programma van opgave 32 is gecodeerd, weer decodeert, zodat het oorspronkelijke woord dus weer herkenbaar is.

Programmastructuurdiagrammen 13-3-2003

16

jvd