NSD (Nassi-Schneidermann-diagrammen) Werk de opdrachten in een apart Word-bestand uit en zet dit samen met de nsddiagrammen die je gemaakt hebt op je logboek. Inleiding Computers kunnen alleen uitvoeren wat een programmeur in een programma heeft vastgelegd. De instructies worden opeenvolgend uitgevoerd. variabelen In een programma kunnen getallen bewaard worden in een plek die we variabele noemen.1 Na elke opdracht staat vermeld wat de waarde van de variabele A, B en C is. regel 1 2 3 opdracht A=2 B=5 C=A+B A 2 2 2 B ? 5 5 C ? ? 7 Met A=2 zorg je er voor dat het getal 2 in variable A bewaard wordt. Met C=A+B worden de getallen in de variabelen A en B bij elkaar geteld. De uitkomst wordt in variabele C gezet. Opdracht 1 Bekijk het volgende eenvoudige programma. Wat moet er op de plaats van X staan? regel 1 2 3 opdracht A=1 B=3 C=A+B A 1 1 1 B ? 3 3 C ? ? X Bij de meeste programmeertalen kun je ook andere ‘dingen’ in variabelen bewaarden, bijvoorbeeld teksten. Bovendien wordt er vaak onderscheid gemaakt tussen variabelen die alleen gehele getallen kunnen onthouden en variabelen die ook kommagetallen kunnen onthouden. Als je in een echte programmeertaal gaat programmeren is dat verschil belangrijk. Voorlopig werken we alleen met getallen. Dat kunnen kan gehele getallen of kommagetallen zijn. 1 springen Er bestaan ook sprong-instructies, de processor gaat dan verder met een opdracht ergens anders in het geheugen. Met JUMP 3 wordt bedoeld dat de computer met de opdracht op regel 3 verder gaat. Bekijk de volgende opdrachten. Op regel 4 staat niets vermeld bij de variabelen omdat deze regel niet uitgevoerd wordt. regel 1 2 3 4 5 opdracht A=1 B=3 JUMP 5 A=6 C=A+B A 1 1 1 B ? 3 3 C ? ? ? 1 3 4 Alleen springen als... Soms moet de computer een keuze maken, afhankelijk van een waarde gaat de computer dan met de volgende opdracht verder, of hij springt naar een andere instructies. Dit heet een voorwaardelijke spronginstructie. Een voorbeeld van zo een voorwaardelijke spronginstuctie is: IF A>2 JUMP 3 Het programma springt naar regel 3 als A groter dan 2 is. In plaats van A>2 kunnen (bijvoorbeeld) ook de volgende voorwaarden voorkomen: A=3, B<3, A=B, etc. Bekijk weer de volgende opdrachten. Bij de derde opdracht ziet de processor dat B gelijk aan 0 is. Hij gaat dus verder met regel 5. regel 1 2 3 4 5 opdracht A=1 B=0 IF B=0 JUMP 5 A=6 C=A+B A 1 1 1 B ? 0 0 C ? ? ? 1 0 1 opdracht 2 Verander de voorwaarde in regel 3 zo, dat regel 4 wel uitgevoerd wordt. (Je moet dus B=0 veranderen in een andere voorwaarde). Door instructies, spronginstructies en voorwaardelijke spronginstructies te combineren kun je herhalingen maken In het voorbeeld hieronder kun je zien dat eerste A=3 en B=0 uitgevoerd worden. Daarna wordt B=B+1 en A=A-1 uitgevoerd totdat A nul is. Dan pas wordt B=2*B uitgevoerd. De asterisk (*) staat daarbij voor vermenigvuldig. Je vindt het misschien vreemd dat in één opdracht (A=A-1) twee keer dezelfde variabele voorkomt. Rechts van het is-teken staat wat de berekening is (A-1) en links staat waar de uitkomst bewaard wordt (in dit geval in A). regel 1 2 3 4 5 6 opdracht A=3 B=0 B=B+1 A=A-1 IF A>0 JUMP 3 B=2*B opdracht 3 Hoe vaak worden regel 3 en 4 uitgevoerd? NSD De structuur van een (deel van een) programma kun je in Nassi-SchneiderDiagrammen vastleggen. Start Het eerste symbool staat hieronder. In het vak staat een beschrijving van het programma of de routine. Instructie Daarna volgen 1 of meer instructies. Keuze Een keuze is ook een instructie, maar die ziet er natuurlijk anders uit. In dit geval wordt met een normale instructie een getal ingelezen. Met de functie odd(N) (odd in Engels voor oneven) wordt gekeken of het getal N oneven is. Afhankelijk van het resultaat wordt de juiste bewering over N gedaan.2 Soms wil je alleen in het linker- of het rechterdeel opdrachten uitvoeren. In dat geval blijft dus één van de kolommen leeg. Je ziet hier dat het ‘antwoord’ van de vraag Y (Yes) of N (No) kan zijn. Bij echte programmeertalen is het vaak beter om je af te vragen of de voorwaarde Waar (True) of Onwaar (False). 2 Herhaling Om het meteen maar ingewikkeld te maken: er zijn drie soorten herhaling. Bij de WHILE-lus wordt eerst gekeken of aan de voorwaarde voldaan is (in dit geval teller>0). Als dat zo is worden de opdrachten binnen de lus uitgevoerd. Het kan dus zo zijn dat de opdrachten binnen de lus nooit uitgevoerd. Hieronder staat van twee programmeertalen beschreven hoe je een While-lus programmeert. We nemen aan dat er een andere stukje programma is – dat Schrijf heet – waarmee je een getal op het scherm kunt schrijven. Basic Do while teller>0 Schrijf(teller) Teller=teller-1 Loop Pascal/Delphi while teller>0 do begin Schrijf(Teller); teller:=teller-1; end; Terzijde 1: Heb je de details gezien? In Basic schrijf je =, in Pascal :=. In Pascal eindigt bijna elke regel met een puntkomma, in Basic is dat niet nodig. Terzijde 2: In Delphi is een Begin/End nodig om aan te geven wat het blok is. Als je dat niet doet wordt alleen Schrijf(Teller) als het blok gezien. teller:=teller-1 wordt dan pas uitgevoerd als de lus afgebroken wordt! opdracht 4 Welke getallen worden in het diagram hierboven achtereenvolgens op het scherm geschreven? Opdracht 5 De eerste regel is nu 'teller=10', verander deze regel zo dat de lus nooit uitgevoerd wordt. Bij de FOR-lus kun je met een start- en eindgetal aangegeven voor welke waarden de lus doorlopen moet worden. opdracht 6 Welke getallen worden in het diagram hierboven achtereenvolgens op het scherm geschreven? Je ziet dat de getallen nu van klein naar groot geschreven worden. IN een echte programmeertaal ziet dat er als volgt uit: Basic for teller = 1 to 10 schrijf(Teller) next Pascal/Delphi for teller:=1 to 10 do Schrijf(Teller); Als je in Pascal/Delphi meer dan 1 opdracht in de lus wilt uitvoeren moet je de opdrachten tussen begin en end zetten: Schrijf('De eerste kwadraten zijn:'); for teller:=1 to 10 do Begin Getal:=Teller*Teller; Schrijf(Getal); End; Bij de while-lus telden we terug. Kan dat ook bij een for-lus? In het NSD kun je dat eenvoudig oplossen door de voorwaarde te veranderen in Teller=10 to 1. In echte programmeertalen is er vaak nog een extra aanpassing nodig. In Basic schrijf je step -1 achter de opdracht: Basic for teller = 10 to 1 step -1 schrijf(Teller) next In Pascal/Delphi schrijf je downto in plaats van to: Pascal/Delphi for teller:=10 downto 1 do Schrijf(Teller); Bij de REPEAT-opdracht worden de opdrachten binnen de lus altijd minimaal 1 keer uitgevoerd. De controle of de lus nog een keer doorlopen moet worden vindt pas na de eerste doorloop plaats. Basic Do Until teller=0 Schrijf(teller) Teller=teller-1 Loop Pascal/Delphi repeat Schrijf(Teller); teller:=teller-1; until teller=0; Het valt op dat in Basic de Until opdracht voor het blok staat dat uitgevoerd wordt, maar in werkelijkheid vindt de controle pas achteraf plaats. Delphi is in dat opzicht duidelijker. opdracht 7 Welke getallen worden in het diagram hierboven achtereenvolgens op het scherm geschreven? opdracht 8 WHILE versus UNTIL Het zal je misschien zijn dat de voorwaarde bij While en Until het ongekeerde van elkaar zijn. Kun je uitleggen waarom dat zo is? Je kunt de ene lus dus vaak in een andere vertalen. Hieronder staat een voorbeeld. Bekijk dit voorbeeld kritisch! Voorbeeld while Teller:=4; while teller>0 do begin teller:=teller-1; getal:=sqrt(teller); schrijf(getal); end; for repeat For teller:=3 downto 0 do begin Teller:=4; getal:=sqrt(teller); repeat schrijf(getal); teller:=teller-1; end; getal:=sqrt(teller); schrijf(getal); until teller=0; Je ziet dat bij een While en een for een begin en een end om de lus heen staat. Het is veilig om dat steeds te doen. Bij een repeat-lus is dat niet nodig. De begin/end zit als het ware in de repeat/until ingebouwd. Omdat je in dit geval omlaag telt heb je een for-downto-lus. Als je omhoog telt heb je een for-to-lus. Je ziet dat bij een while en repeat de waarde van de teller veranderd in de regel teller:=teller-1;. Bij een for is dat niet nodig. Het verlager van de teller zit in downto ingebouwd. opdracht 9 Schrijf de volgende herhaling als een For en als een Repeat-Until in Delphi: x:=0 while x<5 Do Begin y:=x*x; Schrijf(y) ; x:=x+1; End; Toch is er in veel gevallen wel een voorkeur voor 1 van deze drie soorten lussen. Als je een hele reeks gehele getallen 1-voor-1 wilt doorlopen kies je een FORloop. Als het blok zeker 1 keer doorlopen moet worden kies je een UNTIL-loop. Als je vooraf wil bepalen of de lus wel/niet doorlopen moet worden kies je een WHILE-loop. NSD’s zelf maken Op de website vind je het programma NSD. Pak het zip-bestand in een mapje uit en start het programma (nsd.exe). Maak een nieuw NSD aan met de meeste linkse knop in de taakbalk. We gaan een programma maken dat opeenvolgende getallen bij elkaar telt. Geef het nieuwe programma daarom de naam SOM. Je NSD ziet er dan zo uit. We gaan nu een statement toevoegen. Klik op de bovenste knop in de lijst met NSDelementen en sleep met de muis tot de plek onder Som rood oplicht. Geef de volgende beschrijving van de eerste instructie. Opdracht 10 Maak nu zelf het NSD op de onderstaande manier na. Bewaar je NSD onder de naam Som.nsd en zet het bij de uitwerking van deze opdracht op je logboek. opdracht 11 Een wielrenner trekt afhankelijk van de temperatuur een bepaald tenue aan. Hij draagt altijd een korte broek, sokken, een bril en een helm. Als de temperatuur 25 graden of hoger is, draagt hij verder een shirt met korte mouwen. Beneden 25 graden draagt hij onder zijn shirt met korte mouwen een termo-shirt. Bij 15 graden of lager draagt hij over dit alles een jasje met lange mouwen. Als de temperatuur onder de 10 graden zakt trekt hij een extra lange broek aan. Als het niet droog en kouder dan 5 graden is trekt hij bovendien nog overschoenen aan. De korte broek heeft helpen die over het termo-schirt, maar onder het shirt met de korte mouwen of het jasje gedragen worden. Het termo-shirt wordt onder het shirt met korte mouwen gedragen. Het jasje wordt over de shirt gedragen. De lange broek wordt over de kort broek gedragen. Verwerk deze gegevens in een kloppend NSD en bewaar dit onder de naam fietsen.nsd (Het programma NSD is al meer dan 10 jaar oud en kan niet met bestandsnamen van meer dan 8 tekens omgaan). Het valt je wellicht tegen dat er zoveel beschreven wordt in deze opdracht. Vooral de laatste voorschriften/omschrijvingen kunnen natuurlijk weggelaten worden als je uit gaat van ‘gezond verstand’. Het probleem is natuurlijk dat ‘gezond verstand’ geen exacte omschrijving is van hoe de wielrenner zijn tenue draagt. Het is in de informatica (maar ook bij andere wetenschappen als wiskunde) vaak pure noodzaak om exact en volledig te zijn. Ga er bij de volgende opdrachten vanuit dat je: een getal in de variabele X kunt inlezen (=invoeren met het toetsenbord) met de opdracht Lees(X). de variabele X op het scherm kunt schrijven met de opdracht Schrijf(X) Twee variabelen of getallen kun je vermenigvuldigen met het vermenigvuldigingsteken * de wortel kun je berekenen met de opdracht sqrt (van square root). Bijvoorbeeld: a=sqrt(4) een willekeurig getal kunt laten kiezen met de opdracht Rand() (van het Engelse woord random=willekeurig). Bijvoorbeeld A=Rand(). Let op de haakjes achter Rand! van een komma getal een geheel getal kunt maken door alles achter de komma weg te laten met de opdracht Int(). Bijvoorbeeld A=Int(2.3) of A=Int(B) Je kunt een programma tussentijds beëindigen met de opdracht Exit. opdracht 12 Maak een NSD waarin je een programma beschrijft dat twee getallen inleest en het product van die twee getallen op het scherm schrijft. Bewaar dit NSD onder de naam product.nsd. opdracht 13 Maak een NSD waarin je een programma beschrijft dat de wortel van een ingelezen getal berekend en op het scherm schrijft. Bewaar dit NSD onder de naam wortel.nsd. Opdracht 14 Maak een NSD van een programma dat van een ingelezen getal bepaald of het gelijk is aan een eerder gekozen willekeurig geheel getal. Bewaar dit NSD onder de naam gokken.nsd. Opdracht 15 Maak een NSD waarin je een programma beschrijft waarmee iemand zijn leeftijd kan invoeren. Als de ingevoerde leeftijd lager is dan dan jouw eigen leeftijd, schrijft jouw programma “je bent jonger”. Als de ingevoerde leeftijd hoger is schrijf het “Je bent ouder”, anders “we zijn even oud”. Bewaar dit NSD onder de naam leeftijd.nsd. opdracht 16 Maak een NSD voor het berekenen van de oplossingen van een kwadratische vergelijking door middel van de abc-formule. De kwadratische vergelijking is 2 van de vorm ax bxc0. Lees eerst a, b en c in. Bereken daarna de discriminant D. Afhankelijk van de waarde van D zijn er 0, 1 of 2 snijpunten Bewaar je NSD onder de naam abc.nsd. Opdracht 17 Maak een NSD voor een programma dat alle kwadraten tussen twee ingelezen getallen op het scherm schrijft. Bewaar je NSD onder de naam kwadraat.nsd. Opdracht 18 In je boek staat op bladzijde 46 een stroomdiagram voor de conversie van een getal van het decimale naar de binaire talstelsel. Maak een NSD dat hetzelfde algoritme beschrijft als het stroomdiagram. Gebruik eventueel de functie Odd() die eerder in deze opdracht al gebruikt werd. Bewaar je NSD onder de naam binair.nsd Opdracht 19 (moeilijk!) Maak een NSD van een programma dat van een ingelezen getal bepaald of het een priemgetal is. Een priemgetal is een getal dat alleen deelbaar is door 1 en zichzelf. Je mag bij deze opdracht ook de waarden True en False aan een variabele toekennen. Bijvoorbeeld: RoodIsEenKleur=True WitIsEenDag=False Hint: Als een getal D een deler van G is moet de uitkomst van de deling ene geheel getal zijn. Een getal is een geheel getal als X-int(X)=0. Bijvoorbeeld: X=2.3, 2.3-int(2.3)=2.3-2=0.3 Bewaar je NSD onder de naam priem.nsd.