Syllabus Programmeren

  1989/1990      

Word-versie
Met name voor de juiste weergave van de schema's wordt de Word-versie aanbevolen!

   
Voorwoord   ‑ Wat is het nut van leren programmeren? ‑ Wie is daar geschikt voor? ‑ Wat leren we in deze cursus?   In alle informatica ‑ opleidingen komt wel iets van de beginselen van het programmeren ter sprake. Deze beginselen zijn niet alleen voor de toekomstige beroeps ‑ programmeurs belangrijk. Het programmeren van een computer gebeurt op vele niveaus. Van heel technisch en specialistisch, zoals in de micro‑programmering, tot heel algemeen dagelijks zoals in het gebruiken van een tekstverwerkingsprogramma. Zelfs voor de bediening van een moderne videorecorder is enig inzicht in het programmeren tegenwoordig welhaast een vereiste geworden. Ook al is de leek het zich niet bewust, in de weer zijnde met zijn video is hij in feite al bezig met programmeren. Het precieze, voor slechts een uitleg vatbare beschrijven van handelingen wordt gedaan middels de zogeheten algoritmen. Het maakt daarbij niet uit of het mensen of computers zijn, die de handelingen uit moeten voeren. In beide gevallen zijn algoritmen nodig om efficiënt te werken. Op het eerste gezicht eenvoudige handelingen blijken bij nadere bestudering vaak te analyseren in vele deel ‑ handelingen die in een hogere orde zijn opgenomen. Die hogere orde wordt de structuur van een handeling genoemd. Het algoritme beschrijft deze structuur. Wel zijn computers nog altijd een stuk simpeler opgebouwd dan de menselijke geest dat is. Daarom is een algoritme voor computer‑programma's op te bouwen uit maar een paar eenvoudige elementen. Hiermee kunnen evenwel zeer ingewikkelde programma's worden opgebouwd. De door Nassi‑Shneidermann ontworpen schema‑taal zal in deze cursus uitvoerig aan bod komen. Deze schema ‑ taal of notatiewijze wordt vrij algemeen toegepast om computerprogramma's programmeertaalonafhankelijk te ontwerpen. Eenmaal op de hoogte van de eerste beginselen zal men met de computer zelf aan de slag willen gaan. Men wil bijvoorbeeld eens iets schrijven in BASIC. Vooral in de tweede helft van de cursus zal ik daarom wat eenvoudige BASIC ‑ programma's introduceren. Als we er aan toe komen programmeren we in BASIC zelfs nog een complete 'database'. De belangrijkste vereiste voor succesvol programmeren is een grote nauwkeurigheid. Bij het programmeren is alles, wat niet helemaal goed uitgewerkt is (correcte spelling, logische volgorde) gelijk helemaal fout. Dat wil zeggen dat de computer daar dan helemaal niets mee kan beginnen. Doordat men steeds weer pijnlijk op de vingers wordt getikt door deze situatie, waarin de computer met het programma niets kan, keert men zich op een goed moment of geheel en al van het programmeren af, of men wordt van lieverlee veel nauwkeuriger dan men was. Les 1: Inleiding in de PSD techniek   De computer als 'programmeerbare automaat'. Bij de moderne organisatie van maatschappelijke activiteiten (arbeid) speelt de computer een grote rol. Daarnaast zijn ook hulpmiddelen als transportvoertuigen, telefooncentrales, ballpoints enzovoorts daar onmisbaar bij. Wat maakt die computer eigenlijk zo bijzonder, dat er een speciale wetenschap voor is ontwikkeld? Waarom bestaat er 'informatica'? Een computer is programmeerbaar en werkt automatisch. Volgens deze definitie is een koffiezetmachine geen computer. Zo'n apparaat werkt wel automatisch, maar programmeerbaar is hij niet. Een omgekeerd voorbeeld is het draaiorgel. Dat wordt geprogrammeerd middels een draaiboek waar gaten in geponst zijn. Het draaiorgel doet echter niets automatisch. Bekende programmeerbare machines zijn verder: het weefgetouw van Jacquard, de wasautomaat. Machines die niet programmeerbaar zijn, zoals een koffiezetapparaat of een hamer, zijn hulpmiddelen voor de mens die maar voor een doel geschikt zijn (koffie zetten, timmeren). Het draaiorgel kan echter allerlei melodieën spelen, het weefgetouw verschillende patronen aanbrengen, de wasautomaat verschillende soorten textiel op passende wijze behandelen. Welke melodie, patroon of wasbehandeling wordt gekozen hangt helemaal van het door de gebruiker ingebrachte of geselecteerde (=uitgekozen) programma af. Een programmeerbare machine is dus voor meerdere doeleinden geschikt te maken. De computer heeft zoveel toepassingsmogelijkheden, is zo algemeen programmeerbaar, dat in zijn korte bestaan de mogelijkheden nog lang niet allemaal onderzocht zijn. In bedrijfsleven en wetenschappelijk onderzoek maakt de computer informatie toegankelijker, door middel van database‑programmatuur. Daarnaast doet de computer in de privé‑huishoudens meestal dienst als een soort luxe schrijfmachine, via tekstverwerkingsprogramma's. Dat zijn momenteel de twee voornaamste toepassingen. Een automaat reageert afhankelijk van de omstandigheden, door middel van terugkoppeling. Een automaat heeft altijd een sensor (=kunstmatig zintuig), waarmee hij iets kan 'merken'. Als het einde van de tape bereikt is, dan stopt de videorecorder automatisch. Als de wastrommel voldoende gevuld is met sop, dan wordt automatisch de watertoevoer gestaakt. Videorecorder en wasmachine zijn dus automaten. Een computerprinter daarentegen is (meestal nog altijd) geen automaat; als het papier op is wordt gewoon verder geprint alsof er nog papier was. Hoe 'automatisch' een computer werkt hangt in sterke mate van de programmeur(s) af.   De schematechniek van Nassi‑Shneidermann Om een computer te programmeren, in welke programmeertaal dan ook, maakt men steeds gebruik van variabelen, statements, lusstructuren ('loops') en bestanden. In een Programma Structuur Diagram (PSD)volgens de Nassi ‑ Shneidermann notatiewijze krijgen deze elementen allemaal een herkenbare vorm.   Variabelen, toekenning Een variabele heeft een naam, zodat we ernaar kunnen verwijzen. Een variabele krijgt een waarde, als we die eraan toekennen.   VARIABELE := EXPRESSIE   is de algemene vorm van een toekenning. Voorbeeld: C := 3. Dit spreek je uit als: "C krijgt de waarde 3". De waarde die wordt toegekend mag een expressie zijn. Voorbeeld: C := (A‑B)*3. De computer rekent de waarde van een expressie automatisch uit. NB '*' betekent 'maal'.   Variabelen, typen Er zijn enkelvoudige en samengestelde variabelen. Er zijn 4 typen enkelvoudige variabelen, namelijk integer, real, booleaans en string.   type omvat voorbeelden   integer de gehele getallen 1, 2, 8 real de reële getallen 1.4, 1/7 booleaans de logische waarden true en false 1 en 0 string de alfanumerieke teksten 'TEKST 93'   Er zijn 2 typen samengestelde variabelen, namelijk de array en de record. De array is een verzameling van enkelvoudige waarden die allemaal van hetzelfde type (integer, real, booleaans of string) zijn. Een record is een verzameling van enkelvoudige waarden die niet van hetzelfde type behoeven te zijn (bijvoorbeeld integer en string).   Conditie Een conditie wordt uitgedrukt door een Booleaanse expressie, bijvoorbeeld 'als C = 3'. Een conditie is altijd true of false, al naargelang aan de conditie voldaan wordt. Wordt aan de conditie voldaan, dan wordt het subprogramma uitgevoerd, anders gebeurt er niets.     BOOLEAANSE EXPRESSIE   JA NEE  
programmadeel 1     Selectie Wordt aan de conditie voldaan, dan wordt het ene subprogramma geselecteerd, anders het andere.  
BOOLEAANSE EXPRESSIE   JA NEE  
programmadeel 1 programmadeel 2     Repetitie Hier wordt een conditie gesteld, waar na een aantal doorlopingen van de lus aan wordt voldaan. Het effect is dat een subprogramma een bepaald aantal malen wordt uitgevoerd.    
TELLER := BENEDENGRENS  
TELLER <= BOVENGRENS?  
PROGRAMMADEEL  
TELLER := TELLER + 1     Bestanden Van externe gegevensdragers zoals een floppy disk kunnen net zo goed gegevens worden ingelezen als van het toetsenbord. Naar externe gegevensdragers kunnen net zo goed gegevens worden weggeschreven als naar beeldscherm of printer. In onze schema-taal zijn voor lezen en schrijven door de computer dan ook maar twee statements, namelijk    
READ (VARIABELE)   en  
WRITE (VARIABELE)         Vragen bij de eerste les.   1.'In moderne videorecorders zit een kleine computer ingebouwd'. Wat denk je? Denk aan onze definitie van computers. 2.Wat betekent 'programmeerbaar'? 3.Wat betekent 'automatisch'? 4.Noem een belangrijk toepassingsgebied van computertechnologie. 5.Wat is een samengestelde variabele? 6.Maak een stukje PSD waarin je programma onderzoekt of de variabele DELTA positief is en, zo ja, programmadeel 5 uitvoert. Zo nee, gebeurt er niets.       Les 2: Drie voorbeelden van Programma Structuur Diagrammen Nieuwe begrippen uit de eerste les Algoritme Organisatie Programmeren Automatisch Sensor Nassi‑Shneidermann diagram PSD Variabelen Booleaanse expressie TRUE FALSE Alfanumeriek Integer Real String Statement Toekenning Conditie Subprogramma Expressie Selectie Repetitie Bestanden READ WRITE Samenvatting van de eerste les Een computer is een programmeerbare automaat. Los van de vraag om welke computer het gaat of welke programmeertaal je gebruikt kun je een computerprogramma altijd ontwerpen in de algoritme‑taal van Nassi‑Shneidermann, door middel van een Programma Structuur Diagram(PSD). Hoe maak ik een PSD? Op het einde van deze les zal ik een voorbeeld geven van een alledaags algoritme, namelijk een recept voor het bereiden van een cake in de magnetron. Dit algoritme zal vervolgens in een PSD worden weergegeven. Om te beginnen een eenvoudiger voorbeeld van een PSD. Zoals steeds beginnen we met een zo duidelijk mogelijke beschrijving van het probleem dat we de computer willen laten oplossen.   Voorbeeld 1: Invoer5 Beschrijving van het programma. Het programma vraagt de gebruiker een getal in te voeren. Is dit getal groter dan 5? Zo ja, wordt dat op het scherm gemeld. Zo nee, wordt subprogramma 'keuze' uitgevoerd.      
"Voorbeeld 1: Invoer5"  
GETAL := 0  
READ(GETAL)  
GETAL > 5   JA NEE  
WRITE("Dit getal is groter KEUZE dan 5")  
"Einde Programma"     Merk op dat de variabele GETAL aan het begin van het programma de waarde 0 krijgt toegekend. Door deze statement dwingen we de computer voor GETAL een geheugenplaats te reserveren. Zou je deze regel weglaten, dan loop je het risico dat de computer onvoorspelbare reacties geeft. Een variabele moet dus steeds in het begin van je programma gedeclareerd (=aangemeld) worden. Wanneer we slechts een fragment van een programma behandelen laten we deze declaraties meestal weg. Wat aan het begin en het eind van dit programma tussen aanhalingstekens (") staat geldt als commentaar. Een commentaar‑statement dient slechts om het programma voor de menselijke lezer te verduidelijken; de computer slaat zulke regels gewoon over. Goede commentaar‑regels schrijven, dat is al het halve werk bij het programmeren! Wat na WRITE tussen aanhalingstekens staat is een tekst die letterlijk door de computer naar het beeldscherm wordt uitgeschreven. Wat niet tussen aanhalingstekens wordt gezet binnen de haakjes na het WRITE statement geldt als variabele‑naam. Bijvoorbeeld:    
NAAM := "PIETERSEN"  
WRITE( NAAM )         Voorbeeld 2: ChocoladeCake   Beschrijving van het programma: zie bovenstaand recept.    
"Hoofdprogramma CHOCOLADECAKE"  
PAS INGREDIËNTEN AF  
ROER DE BOTER DOOR DE SUIKER  
TOTDAT MENGSEL LICHTGEEL EN ROMIG IS  
MAAK BESLAG  
SCHENK BESLAG IN VORM  
BAK DE CAKE  
STORT DE CAKE  
MAAK GLAZUUR  
BESTRIJK DE CAKE MET GLAZUUR  
"Einde Programma"  
   
"PAS INGREDIENTEN AF"  
SUIKER := 100 g kristalsuiker  
BOTER := 100 g roomboter  
MEEL := 175 g zelfrijzend bakmeel  
CACAO := 25 g instant cacaopoeder  
EI := 1 ei  
MELK := 5 eetlepels melk  
"Einde PAS INGREDIENTEN AF"           "MAAK BESLAG"  
MEELMENGSEL := MEEL + CACAO  
ZEEF MEELMENGSEL  
EIMENGSEL := EI + MELK  
KLOP EIMENGSEL LOS  
ROER MEELMENGSEL DOOR DE BOTER  
ROER EIMENGSEL DOOR DE BOTER  
"Einde MAAK BESLAG"      
  "BAK DE CAKE"  
ZET DE VORM IN DE MAGNETRON  
STEL DE MAGNETRON IN OP 7 MINUTEN  
ZET DE MAGNETRON AAN      
TOTDAT DE MAGNETRON KLAAR IS  
HAAL DE VORM UIT DE MAGNETRON  
ZOLANG DE CAKE NOG WARM IS    
"Einde BAK DE CAKE"          
"MAAK GLAZUUR"  
POEDERSUIKER := 100g poedersuiker  
BOTER := 50 g roomboter  
CACAO := 1 eetlepel cacaopoeder  
ZEEF POEDERSUIKER IN EEN KOM  
MENGSEL := POEDERSUIKER + BOTER  
ROER MENGSEL  
TOTDAT MENGSEL GLAD IS  
GLAZUUR := MENGSEL + CACAO  
ROER GLAZUUR  
"Einde MAAK GLAZUUR"          
Voorbeeld 3: TafelPrinten   Beschrijving Het programma drukt alle meervouden van 10 af. Het begint bij 10 en eindigt bij 100.    
"TafelPrinten"  
I := 10  
ZOLANG I <= 100  
WRITE (I)  
I := I + 10  
"Einde programma"      
"TafelPrinten, 2e manier"  
I:= 1  
ZOLANG I <= 10  
    WRITE (I*10)  
I := I + 1  
"Einde programma"      
"TafelPrinten, 3e manier"  
I:= 1  
WRITE (I * 10)  
I := I + 1  
TOTDAT I > 10  
"Einde programma"         Schema van een 'eenvoudige' computer ‑ configuratie    
DISK A: BEELDSCHERM PRINTER    
DISK B: COMPUTER MODEM    
GEHEUGEN TOETSENBORD MUIS     Excursie: de zintuigen van een computer   Een automaat 'merkt' wat er gebeurt door middel van sensors, zoals we gezien hebben. De voornaamste sensors waar de PC (=personal computer) mee werkt worden gevormd door het toetsenbord. Een voorbeeld zagen we hiervan in het statement READ(GETAL). Het programma wacht tot de gebruiker een aantal cijfertoetsen heeft ingedrukt en tenslotte zijn invoer heeft 'ingegeven' met de Enter‑toets. Elke toets op het toetsenbord is een sensor. Het toetsenbord wordt tot de invoerapparaten gerekend.   Naast het toetsenbord ligt tegenwoordig vaak een ander 'invoerapparaat' dat de muis wordt genoemd. Door het verplaatsen van de muis over een matje wordt op het scherm een cursorpijl evenredig verplaatst. Zo kan de gebruiker bijvoorbeeld met de muis een commando 'aanwijzen' in plaats van dat letter voor letter in te typen en het in te voeren met [Enter]. N.B. Op sommige computers zit geen Enter‑toets, maar wel een Return‑toets. Deze toets heeft dezelfde functie als de Enter‑toets.     Rekenkundige bewerkingen die in een expressie mogen voorkomen zijn:    machtsverheffing A ** B 'A tot de Bde macht'  optelling A + B 'A plus B'  aftrekken A ‑ B 'A min B'  vermenigvuldigen A * B 'A maal B'  deling A/B 'A gedeeld door B'  gehele deling A div B 'A div B'  restbepaling A mod B 'A modulo B'   Prioriteitsregels zijn als in Meneer Van Dale Wacht Op Antwoord. Vermenigvuldigen en Delen hebben een gelijke prioriteit. Optellen en Aftrekken hebben een gelijke prioriteit. (Worteltrekken is niet als operatie, meestal wel als routine beschikbaar.) Wat tussen haakjes is geschreven wordt echter het eerst uitgerekend door de computer. Bij gelijke prioriteit wordt van links naar rechts de expressie uitgewerkt.     Nieuwe begrippen in les 2 Declareren Geheugenplaats Toetsenbord Personal Computer Invoerapparaat Muis Enter Return Prioriteitsregels   Samenvatting Een eerste voorbeeld werd gegeven van een eenvoudig computerprogramma dat door middel van een PSD werd ontworpen. Aanhalingstekens worden soms om gehele statements geplaatst (commentaar), soms om gedeeltelijke (letterlijk zo weer te geven tekst). Een recept voor het bereiden van cake gaf ons een mooi voorbeeld van een alledaags algoritme. Dit algoritme kon vrij aardig in een stel PSD‑en worden uitgedrukt. Dit voorbeeld was minder eenvoudig; we komen er nog uitgebreid op terug (in de les). Het 3e voorbeeld drukte de tafel van 10 af. Het voornaamste invoerapparaat ('zintuig') van een PC is het toetsenbord.     Vragen en opgaven 1.Een computer werkt (gedeeltelijk) automatisch, omdat hij met sensoren is uitgerust. Noem een voorbeeld van zo'n sensor. 2.Maak een PSD bij de volgende programmabeschrijving. Het programma bepaalt de som van de getallen 1 tot en met 1000, daarna schrijft het programma deze som uit. 3.Maak een programma dat de som bepaalt van alle positieve getallen in een reeks van 1000 getallen die worden ingevoerd. 4.Stel dat A = 2 en B = 1. Welke waarde krijgt C? 5.Hoe zou de computer de volgende expressie uitrekenen? C := (A+B)/((A‑B)**3)       Les 3: Ontwerp   Hoe maak ik een programma? Een PSD maken is een belangrijk onderdeel van het programmeren. In het hele programmeerproces zou je 3 stappen kunnen onderscheiden.   0.Een probleem, geformuleerd in menselijke taal. 1.Analyse en globaal ontwerp: maak een globale schets van het algoritme in de vorm van een PSD. 2.Detailontwerp: maak een in alle details uitgewerkt PSD. 3.Coderen: schrijf een in een programmeertaal geschreven, door de machine uit te voeren programma.           Een voorbeeld van gestructureerd programmeren.     Iemand formuleert het volgende probleem:   "Bepaal de som van 10 willekeurige getallen".   Kunnen we daar een programma voor schrijven? Nodig is dat de probleemstelling duidelijk en volledig is. Dat is deze probleemstelling beslist nog niet. Waar komen die 10 getallen vandaan? Waar moet het resultaat heen? Zulke vragen moeten eerst beantwoord zijn, dan pas heeft het zin om over een oplossing na te denken. We formuleren opnieuw:   "Maak een programma dat van 10 willekeurige, door de gebruiker in te voeren getallen de som bepaalt en deze uitschrijft."   Met deze omschrijving kunnen we aan de slag. Stap 1, analyse en globaal ontwerp, houdt voor dit voorbeeld in dat we ons afvragen of er gegevens ingelezen moeten worden en zo ja, een voor een of een paar tegelijk of allemaal tegelijk. Welke bewerkingen moeten er plaatshebben en in welke volgorde? Zijn er deelproblemen te ontdekken die als op zichzelf staande, eenvoudige problemen onafhankelijk van elkaar kunnen worden opgelost?     Een globaal PSD voor ons probleem zou uit drie deelproblemen kunnen bestaan:     " Programma SOM BEPALEN"  
INLEZEN  
BEPAAL SOM  
UITSCHRIJVEN  
" Einde Programma"     Volgt stap 2: de drie deelproblemen in detail uitwerken. Omdat we de 10 getallen achter elkaar inlezen alvorens ze te bewerken hebben we 11 variabelen nodig. Elf, omdat voor de som ook nog een variabele nodig is. Laten we de tien getallen noemen: G1, G2, G3, G4, G5, G6, G7, G8, G9, G10. Laten we de som noemen: SOM. Het uiteindelijke algoritme krijgt vorm:            
" Programma SOM BEPALEN"  
READ (G1,G2,G3,G4,G5,G6,G7,G8,G9,G10)  
SOM := G1+G2+G3+G4+G5+G6+G7+G8+G9+G10  
WRITE (SOM)  
" Einde Programma"     Tenslotte stap 3: coderen. Ter demonstratie volgt hier een vertaling van het PSD in BASIC (van BASIC leren we later in de cursus de voornaamste statements nog kennen)     REM Programma SOM BEPALEN INPUT (G1,G2,G3,G4,G5,G6,G7,G8,G9,G10) LET SOM = G1+G2+G3+G4+G5+G6+G7+G8+G9+G10 PRINT SOM REM Einde Programma       Nieuwe begrippen in les 3  Analyse  Globaal  Detail  Coderen   Samenvatting Het ontwikkelen van een programma gaat in 3 stappen, namelijk Analyse en Globaal Ontwerp, Detailontwerp, Codering. Om te beginnen moet de probleemstelling duidelijk en volledig zijn.   Vragen en opgaven 1.Maak een programma dat van 10000 willekeurige, door de gebruiker in te voeren getallen de som van alle positieve getallen en de som van alle negatieve getallen bepaalt, en deze beide sommen uitschrijft. 2.Maak een programma dat 700 getallen inleest en de som van de absolute waarden bepaalt en uitschrijft. Aanwijzing: de absolute waarde van 104 is 104; de absolute waarde van ‑223 is 223. 3.Gegeven een rij getallen, aantal onbekend, allemaal groter dan nul. De rij wordt afgesloten door een nul. Maak een programma om van deze rij de som te bepalen en uit te schrijven. 4.Gegeven een rij getallen waarvan het eerste aangeeft hoeveel getallen er nog volgen. Maak een programma dat van het tweede tot en met het laatste getal de som bepaalt en uitschrijft.       Les 4: Naamgeving   Waarom PSD? In de tijd dat de computer bestaat zijn er honderden programmeertalen ontwikkeld. Deze wijken op allerlei punten van elkaar af, maar ze hebben ook veel gemeen. Nassi‑Shneidermann heeft zich afgevraagd op welke punten alle programmeertalen hetzelfde zijn en kwam zo tot de elementen waar je in les 1 kennis mee hebt gemaakt. Sindsdien geldt het PSD als de standaardmanier om computerprogramma's te schrijven ‑ zowel in het onderwijs als in de bedrijven en instellingen. Het PSD is mede zo populair geworden omdat hiermee ook werkelijk programma's te schrijven zijn. Als het PSD klaar is staat ondubbelzinnig vast hoe het BASIC‑, PASCAL‑ of COBOL‑programma geschreven moet worden. (BASIC, PASCAL en COBOL zijn drie van de bekendste programmeertalen.) Anderzijds leidt het gebruik van de PSD‑techniek tot heldere, overzichtelijke programma's, juist omdat hierin allerlei 'programmeertrucs' die een code minder goed leesbaar en inzichtelijk maken verboden zijn. (zoals een opdracht aan de computer om uit een lus te springen, los van de zolang.. of totdat.. opdracht).   Geef het kind een naam Een programmeur zit de halve dag namen te verzinnen... De naamgeving van variabelen moet aan twee eisen voldoen. Ten eerste moet de gekozen naam betekenisvol zijn. Als een variabele in een programma als lopende som fungeert kun je hem beter SOM noemen dan, bijvoorbeeld, X. Ten tweede moeten alle variabelen een verschillende naam hebben. Op deze laatste regel zijn uitzonderingen mogelijk. Niet alleen variabelen moeten een naam krijgen, ook programma's en subprogramma's. Programma's, omdat programmeurs moeten weten over welk programma ze spreken en omdat de computer moet 'weten' onder welke naam de programmacode moet worden weggeschreven en bewaard. Subprogramma's, omdat die via hun naam in andere subprogramma's of in het hoofdprogramma moeten kunnen worden 'aangeroepen'.   Excursie 1: hardware en software Programma's die je op de computer gebruikt, of zelf schrijft, worden tot de software gerekend (de 'zachte waar'). Alle programmatuur maakt gebruik van 'ingebakken' mogelijkheden, om gegevens in te lezen en weg te schrijven bijvoorbeeld. Alles wat niet met programmatuur samenhangt, vanaf die ingebakken mogelijkheden tot en met het plastic waar bijvoorbeeld de toetsen van vervaardigd zijn, heet de hardware (de 'harde waar').     Excursie 2: soorten computers De grootste en duurste computers zijn de supercomputers, groot en duur zijn de mainframes, iets kleinere organisaties gebruiken vaak een minicomputer en verder heb je microcomputers. Deze laatste groep bestaat uit Personal Computers en homecomputers. De eerste voldoen meestal aan de IBM XT standaard en zijn voor 'serieuze' toepassingen (tekstverwerking, administratie) bedoeld. Homecomputers zijn ontworpen voor meer speelse toepassingen en zijn meestal wat simpeler uitgevoerd dan een PC.   Samenvatting Het PSD is ontwikkeld op basis van wat alle bekende hogere programmeertalen gemeenschappelijk hebben. Naamgeving is bij het programmeren een zorg apart. Programma's, deelprogramma's, variabelen: alles moet een naam krijgen. Nieuwe begrippen  hardware  software  super  mainframe  mini  micro     Vragen en opgaven 1.Om iets met een variabele te doen moet de computer daar een naam bij krijgen. Op welke twee dingen moet je letten bij het kiezen van zo'n naam? 2.Gaat excursie 2 over hardware of software? 3.Maak een programma dat de som bepaalt van de derde machten van de getallen 1 tot en met 100. 4.Gegeven een rij getallen die worden ingevoerd, afgesloten met het getal ‑1. Maak een programma dat de waarde van het grootste getal bepaalt en deze wegschrijft. Bovendien bepaalt dit programma het rangnummer in de rij van dit grootste getal, en schrijft ook dit rangnummer weg.       Les 5: Programmeertalen   Excursie 1: De toekomst van het programmeren. Er bestaat al lang, langer dan de computer feitelijk bestaat, een droombeeld van de ideale machine die de mens zogezegd op zijn oogwenken zou bedienen. Denk maar aan de science fiction verhalen over robots. Naast volgzaam als een slaaf zou deze machine ook zeer intelligent moeten zijn. Hij zou onze wensen als het ware moeten voorkomen. Zover zijn we nog lang niet. Al worden in huishoudelijke apparaten steeds vaker microchips ingebouwd, kleine computers eigenlijk, en lijkt de computer steeds meer bij het doorsnee huishouden van pas te komen, met name door de stormachtige ontwikkelingen in de 'telematica'. (Telematica is een samentrekking van telecommunicatie en automatica, geloof ik). De tendens is dat steeds meer computers worden verspreid en dat deze steeds meer met elkaar in verbinding komen te staan; via netwerken in de kantooromgeving en via modems in de privé‑sfeer. Modems vertalen een gegevensstroom uit de computer in biepjes welke via het telefoonnet worden overgeseind naar een andere computer. Aan de andere kant staat ook een modem en dat vertaalt de biepjes keurig terug in informatie waar de computer wat mee kan (bijvoorbeeld afbeelden op het scherm als tekst). De manier waarop computers met elkaar in verbinding staan wordt bepaald door de interface, dit betekent contactvlak. De omgang van de mens met een computer wordt vooral bepaald door de manier waarop deze computer geprogrammeerd is, dus door de software. In het vakjargon wordt ook deze door de programmatuur bepaalde omgangsvorm tussen mens en computer interfacing genoemd. Momenteel wordt hard gewerkt aan een nieuwe generatie van 'intelligente' software. Denk maar aan een tekstverwerker die automatisch woorden afbreekt. 'Interactief' is daarbij het toverwoord. Het programma stelt vragen en geeft suggesties. Bescheiden maar alert. Zoiets als een engelse butler. Een bekend programma dat daar al een beetje op begint te lijken is WordPerfect, een tekstverwerker die veel wordt gebruikt in de MS/DOS wereld. Als dat programma niet zeker weet of het een woord correct afbreekt vraagt het aan de gebruiker zoiets als "is het zo goed, of had je een ander voorstel?" Moet het anders, dan onthoudt hij dat voor een volgende keer! (Door een lijst op disk bij te werken).   Excursie 2: Overzichtje van programmeertalen. Klassieke hogere programmeertalen die nog altijd veel gebruikt worden zijn BASIC, COBOL, PASCAL, C. COBOL staat voor COmmon Business Oriented Language, PASCAL is geen afkorting maar de naam van een Zwitserse wiskundige en C schijnt indertijd als de opvolger van B te zijn bedoeld (nu dan D? nee, C++ heet de nieuwste versie). De naam BASIC schijnt uitgevonden te zijn als een afkorting van "Basic All purpose Symbolic Instruction Code".   Tussen mens en computer Het hart van de computer wordt door de processor gevormd. De meer volledige, Engelse naam hiervoor is: Central Processing Unit ofwel CPU. Dit luidt op zijn beurt, vertaald in het Nederlands, aldus: Centrale Verwerkingseenheid ofwel CVE. Zijn instructies ontvangt de CVE in machinetaal. Machinetaal bestaat uit hexadecimaal weer te geven waarden welke coderingen zijn voor instructies, of de weergave vormen van gegevens. Niemand schrijft in machinetaal, wel eventueel in een lagere programmeertaal zoals assembly. In assembly wordt iedere instructie uit de instructieset van een CVE weergegeven door middel van een mnemonic. Het komt erop neer dat de computer bijna altijd geprogrammeerd wordt door middel van ... programmatuur! Van 'binnen' (dicht bij de CVE) naar 'buiten' (dicht bij de gebruiker) tref je aan:   Microprogrammering Dit zijn instructies voor de CVE die in de chip zijn ingebakken, zoals instructies voor vermenigvuldiging en deling.   Machinetaal Ieder uitvoerbaar programma bestaat uiteindelijk uit machinetaal. Machinetaal bestaat uit een reeks van (door de mens meestal hexadecimaal weergegeven) waarden die op de juiste plaats in het geheugen zijn geplaatst. Zowel instructies als gegevens zijn als waarden gerepresenteerd. Een lagere programmeertaal zoals assembly vertaalt slechts deze waarden in de zogenaamde mnemonics. Voorbeeld: voor processor Pietje betekent de opeenvolging van de hexadecimale waarden 9A 03 dat register A de waarde 3 moet krijgen. De voor processor Pietje afgesproken mnemonic is in dat geval 'LD A,3'. Een afkorting voor "Load A with three").     Besturingssysteem Veel gebruikte routines zoals het uitvoeren van een teken naar het scherm zijn voorgeprogrammeerd beschikbaar. Om elementaire functies eenvoudig aan te roepen (formatteer een schijf) is op computers vaak een gebruikersinterface beschikbaar om om te gaan met het besturingssysteem (operating system). Deze interface heet een shell (=schil of schelp) en een zeer bekende shell is MS/DOS.   Hogere programmeertaal Via een compileerprogramma wordt van een broncode een soort tussencode gemaakt; het linkprogramma kan meerdere tussencode‑bestanden samenvoegen ('linken') tot een uitvoerbaar programma; de doelcode. Soms werkt een hogere programmeertaal als een interpreter (=tolk). Dan wordt regel voor regel van het programma vertaald in machinetaal en onmiddelijk uitgevoerd. De meeste BASIC‑dialecten werken als een interpreter. Een regel die vaak wordt uitgevoerd wordt door een interpreter evenvaak opnieuw vertaald. Daarom werken geïnterpreteerde programma's meestal trager dan gecompileerde.   4GL De zogenaamde 4e generatie talen (4th generation languages) werken vaak zo, dat een bronbestand vertaald wordt in een (meestal veel meer uitgebreid) bestand in een of andere hogere programmeertaal. Dit in een poging het programmeerwerk nog meer door de computer zelf uit te laten voeren.   Vragen 1. Waarom zouden we hogere programmeertalen "hoger" noemen? 2. Wat is een interface? 3. Waar is BASIC (misschien) de afkorting van?   Les 6: Lijstverwerking   Over Arrays Variabelen moeten verschillende namen dragen. Stel echter, ik wil mijn programma 10000 getallen in laten lezen en deze allemaal in variabelen opslaan, allemaal onder een verschillende naam dus. Hiervoor bestaat een oplossing.   Een variabele bestaat uit een geheugenplaats die door de CVE dankzij de naam (die vertaald wordt in een geheugenadres) te vinden is en waar van gelezen of naar geschreven kan worden. Een array nu bestaat uit een verzameling variabelen waarvan alleen het beginadres dankzij een naam te adresseren is; alle elementen uit de array met een index groter dan nul liggen daar evenredig van verwijderd.   Voorbeeld 1: 1 dimensie Een lus om een eendimensionale array in te lezen:     ┌───────────────────────────────? │ "ARRAY INLEZEN" │ ├───────────────────────────────┤ │ INDEX := 0 │ ├───────────────────────────────┤ │ INDEX < 10000 │ │ ┌───────────────────────┤ │ │ READ (G[INDEX])     │ │ ├───────────────────────┤ │ │ INDEX := INDEX + 1 │ ├───────┴───────────────────────┤ │ "einde" │ └───────────────────────────────┘   Een array kan ook tweedimensionaal zijn, je hebt dan een rij van rijen, of een tabel met tabellen. We zouden de namen van alle inwoners van Nederland in een tweedimensionale array op kunen slaan, waarbij de eerste dimensie verschillende woonplaats tabellen aanwijst en de tweede dimensie het rangnummer (bijvoorbeeld alfabetisch gesorteerd). Om een tweedimensionale array in te lezen gebruiken we twee indexen en binnen de repetitie komt weer een repetitie voor: een geneste lus.
Voorbeeld 2: 2 dimensies Een geneste lus waarmee een twee‑dimensionale tabel wordt ingelezen. (Tabel betekent hetzelfde als array). Er zijn 10000 rijen en 100000 kolommen.   ┌─────────────────────────────────────? │ "TABEL INLEZEN, 2‑dimensionaal" │ ├─────────────────────────────────────┤ │ I := 0 │ ├─────────────────────────────────────┤ │ J := 0 │ ├─────────────────────────────────────┤ │ I < 10000 │ │ ┌─────────────────────────────┤ │ │ J < 100000 │ │ │ ┌─────────────────────┤ │ │ │ READ (G[I,J]) │ │ │ ├─────────────────────┤ │ │ │ J := J + 1  │ │ ├───────┴─────────────────────┤ │ │ I := I + 1 │ ├───────┴─────────────────────────────┤ │ "einde" │ └─────────────────────────────────────┘   Hoe een bestand in te lezen waarvan de lengte onbekend is?   Om te weten of het einde van een bestand bereikt is kunnen we de speciale Booleaanse systeemvariabele EOF gebruiken. EOF staat voor "End Of File", einde bestand.     Voorbeeld 3: Bestand inlezen Het inlezen van een bestand   ┌─────────────────────────? │ "BESTAND INLEZEN" │ ├─────────────────────────┤ │ READ(RECORD) │ ├─────────────────────────┤ │ EOF = 0 │ │ ┌─────────────────┤ │ │ VERWERK(RECORD) │ │ ├─────────────────┤ │ │ READ(RECORD) │ ├───────┴─────────────────┤ │ "einde" │ └─────────────────────────┘   Opgaven 1.Gegeven een bestand met een onbekend aantal records. Elk record bevat drie gegevens: naam, aantal uren, uurloon. Ontwerp een algoritme om van elk record af te drukken naam en brutoloon. Brutoloon = aantal uren maal uurloon. 2.Ontwerp een programma om een twee‑dimensionale tabel A, bestaande uit 50 rijen van elk 60 kolommen, rij voor rij in te lezen. Vervolgens bepaalt het programma welke de grootste waarde is die in A voorkomt en hoe vaak deze voorkomt. 3.Bepaal de som van de cijfers van een positief getal dat ingelezen wordt. Aanwijzingen: ‑ het meest rechtse cijfer van het getal 1234 wordt gevonden door 1234 MOD 10. Dat is dus 4. - het cijfer onmiddelijk links daarvan wordt gevonden door (1234 DIV 10) MOD 10. Dat is dus 3.      
Les 7: Procedures   Over Procedures Van procedures, ook wel subroutines of deelprogramma's genoemd, hebben we al wat voorbeelden gezien. Een procedure wordt bijvoorbeeld aangeroepen vanuit het hoofdprogramma. Na beëindiging wordt teruggekeerd naar de volgende regel in het hoofdprogramma. Aan procedures kan men parameters meegeven, en procedures kunnen waarden teruggeven. Net als het volledige programma is de procedure te beschouwen als een reeks instructies aan de CVE om bepaalde invoer tot bepaalde uitvoer te verwerken. Als mijn hoofdprogramma een getal G tot de macht M wil verheffen via een procedure, dan zal de invoer van die procedure bestaan uit G en M, terwijl de uitvoer zal moeten zijn G**M. (G**M wordt niet door iedere programmeertaal begrepen). Het resultaat van de bewerking laten we opslaan in RESULT.   ┌───────────────────────? │ "Machtsverheffen" │ ├───────────────────────┤ │ MACHT(G,M,RESULT) │ ├───────────────────────┤ │ M := M ‑ 1 │ ├───────────────────────┤ │ M > 0 │ │ ┌───────────────────┤ │ │ G := G * G │ │ ├───────────────────┤ │ │ M := M ‑ 1 │ ├───┴───────────────────┤ │ RESULT := G │ ├───────────────────────┤ │ "einde" │ └───────────────────────┘   Het hoofdprogramma zou deze procedure kunnen aanroepen als volgt:   MACHT (GETAL,EXPONENT,RES)   In dat geval krijgt G de waarde van GETAL, M de waarde van EXPONENT, en in RES komt de waarde van RESULT terecht. Overigens kunnen procedures ook vanuit andere procedures worden aangeroepen, men spreekt dan wel van geneste procedures.       Les 8: Schema’s Schema van een computersysteem     ┌───────────?         ┌────────────? │ CVE │ ┌─────────────? gegevens ‑>│ invoerapp. │‑>│ + │‑>│ uitvoerapp. │‑> informatie └────────────┘ │ werk‑ │ └─────────────┘ │ geheugen │ └────┬─┬────┘ │ │ ┌────┴─┴────? │ gegevens‑ │ │ dragers │ └───────────┘     Schema van een centrale verwerkingseenheid (CVE)   ┌─────────────────────────────────────? │ CVE │ │┌──────────?┌───────────────────────?│ ││ reken‑ ││ besturingsorgaan ││ ││ orgaan ││ ││ │└─────┬─┬──┘└╥──────┬──────╥────────┘│ └──────┼─┼────╥──────┼──────╥─────────┘ ┌┼─┼─? ║ │ ║ ││ │ ╞??? │p ║i └│─│─┘ │r ║o │ │ │g ║ ┌──────┴─┴───────────┴? ┌╨─? input ┌────────────────? │ centraal geheugen: ├────┼────────────────┤ randapparatuur │ │ programma EN │ │ │ │ │ │ data ├────┼────────────────┤ │ │ │ └──┘ output │ │ └─────────────────────┘ └────────────────┘     ───── informatie transport ????? besturingslijnen    
Schema van het centrale geheugen   adres pointers en gebieden (bijv.)   10000 ┌───────────────────────? Top van het geheugen │ │ ├───────────────────────┤   2000 ├───────────────────────┤ start STAPEL (2000 en LAGER) │ │ <‑ stapelwijzer ├───────────────────────┤   ├───────────────────────┤ │ │ 1000 ├───────────────────────┤ │ gegeven n │ ├───────────────────────┤ │ │   ├───────────────────────┤ │ gegeven 2 │ <‑ adresregister 610 ├───────────────────────┤ │ gegeven 1 │ 600 ├───────────────────────┤ start DATA gebied │ instructie n │ laatste instructie ├───────────────────────┤ │ │   112 ├───────────────────────┤ │ instructie 2 │ 104 ├───────────────────────┤ <‑programmateller │ instructie 1 │ 100 ├───────────────────────┤ start PROGRAMMA gebied (100‑600) │ │ 0 └───────────────────────┘ Bodem van het geheugen           Opgaven   1. Maak een programma dat van twaalf ingevoerde waarden de laagste bepaalt en uitschrijft. 2. Gegeven twee eendimensionale arrays G en H, allebei met 5000 elementen. Bepaal de grootste waarde in G die kleiner is dan de kleinste waarde in H. 3. Maak een programma om etiketten af te drukken. Lees een sequentieel bestand in dat opgebouwd is uit records met de volgende velden: NAAM, ADRES, WOONPLAATS (de zogenaamde NAW‑gegevens). Per record worden al deze velden achter elkaar uitgevoerd. 4. Bepaal de som van de oneven getallen tussen 1 en 1000. 5. Schrijf de getallen 1 tot en met 100 met hun kwadraten uit. Dus een tabel van de vorm 1 1 2 4 3 9 . . . . 6. Gegeven een vraag QUESTION die wordt uitgevoerd en een antwoord ANSWER. Vraag de gebruiker om een antwoord en voer de melding "GOED" uit wanneer dit antwoord overeenkomt met de inhoud van ANSWER, anders voer "fout" uit. 7. Het onderste schema op pagina 1 van deze les is ongeveer in die vorm ontworpen door John von Neumann. Welke twee functies heeft het centrale geheugen in de von Neumann architectuur?     Uitwerkingen   Opgaven van les 4   Maak een programma dat de som bepaalt van de derde machten van de getallen 1 tot en met 100.     ┌───────────────────────────────? │ "SOM VAN DERDE MACHTEN" │ ├───────────────────────────────┤ │ SOM := 0 │ ├───────────────────────────────┤ │ N := 1 │ ├───────────────────────────────┤ │ ZOLANG N <= 100 │ │ ┌───────────────────────┤ │ │ SOM := SOM + N ** 3 │ │ ├───────────────────────┤ │ │ N := N + 1 │ ├───────┴───────────────────────┤ │ WRITE (SOM) │ ├───────────────────────────────┤ │ "einde" │ └───────────────────────────────┘     Commentaar Hier hoeft niets te worden ingelezen. Bewerkt worden immers: de getallen 1 tot en met 100. Daarvoor kunnen we een lusteller gebruiken. Je kunt ook zeggen dat het te bewerken getal tevens als lusteller dienst doet. Om de honderd derde machten bij elkaar op te tellen gebruiken we weer een lopende som.   4. Gegeven een rij getallen die worden ingevoerd, afgesloten met het getal ‑1. Maak een programma dat de waarde van het grootste getal bepaalt en deze wegschrijft. Bovendien bepaalt dit programma het rangnummer in de rij van dit grootste getal, en schrijft ook dit rangnummer weg.   ┌───────────────────────────────────────? │ "HOEVEELSTE HET GROOTSTE WAS" │ ├───────────────────────────────────────┤ │ I := 1 │ │ NR := 1 │ │ GETAL := 0 │ │ MAX := 0 │ ├───────────────────────────────────────┤ │ READ (GETAL) │ ├───────────────────────────────────────┤   │ GETAL <> ‑1 │ │ N J │ ├──────────┬────────────────────────────┤ │ WRITE │ MAX := GETAL │ │ ("Geen ├────────────────────────────┤ │ ingave") │ NR := I │ │ ├────────────────────────────┤ │ │ I := I + 1 │ │ ├────────────────────────────┤ │ │ GETAL <> ‑1 │ │  │ ┌───────────────────────┤ │ │ │ READ (GETAL) │ │ │ ├───────────────────────┤ │ │ │ GETAL > MAX │ │ │ │J N │ │ │ ├────────────────┬──────┤ │ │ │ MAX := GETAL │ │ │ │ ├────────────────┤ │ │ │ │ NR := I │ │ │ │ ├────────────────┴──────┤ │ │ │ I := I + 1 │ │ ├────┴───────────────────────┤ │ │ WRITE (MAX) │ │ ├────────────────────────────┤ │ │ WRITE (NR ) │ ├──────────┴────────────────────────────┤ │ "einde" │ └───────────────────────────────────────┘   Commentaar Om zeker te weten dat de variabele MAX de grootste waarde van GETAL zal 'onthouden' zorgen we dat MAX om te beginnen de waarde van het eerste getal krijgt. Ieder volgende getal dat groter is wordt in MAX gekopieerd. Om het rangnummer te onthouden zorgen we dat bij ieder GETAL dat gecopieerd wordt in MAX de indexteller gekopieerd wordt in NR. Opgaven van les 6   Gegeven een bestand met een onbekend aantal records. Elk record bevat drie gegevens: naam, aantal uren, uurloon. Ontwerp een algoritme om van elk record af te drukken naam en brutoloon. Brutoloon = aantal uren maal uurloon.   Voorbereiding   De drie variabelen die elk record bevat noemen we NAAM, AANTAL en UURLOON.   ┌───────────────────────────────? │ "BEREKEN BRUTO" │ ├───────────────────────────────┤ │ RECORD(NAAM, AANTAL, UURLOON) │ ├───────────────────────────────┤ │ EOF = 0 │ │ ┌───────────────────────────┤ │ │ READ (RECORD) │ │ ├───────────────────────────┤ │ │ WRITE (NAAM) │ │ ├───────────────────────────┤ │ │ WRITE (AANTAL * UURLOON) │ ├───┴───────────────────────────┤ │ "einde" │ └───────────────────────────────┘     2: zie verder op. 3. Bepaal de som van de cijfers van een positief getal dat ingelezen wordt.   ┌───────────────────────────────? │ "BEPAAL CIJFERSOM" │ ├───────────────────────────────┤ │ GETAL := 0 │ │ G2 := 0 │ │ SOM := 0 │ ├───────────────────────────────┤ │ READ (GETAL) │ ├───────────────────────────────┤ │ G2 := GETAL │ ├───────────────────────────────┤ │ G2 > 0 │ │ ┌───────────────────────────┤ │ │ SOM := SOM + (G2 MOD 10) │ │ ├───────────────────────────┤ │ │ G2 := G2 DIV 10 │ ├───┴───────────────────────────┤ │ "einde" │ └───────────────────────────────┘ 2. Ontwerp een programma om een twee‑dimensionale tabel A, bestaande uit 50 rijen van elk 60 kolommen, rij voor rij in te lezen. Vervolgens bepaalt het programma welke de grootste waarde is die in A voorkomt en hoe vaak deze voorkomt. ┌───────────────────────────────? │ "LEESIN 2‑DIM" │ ├───────────────────────────────┤ │ A[50,60] │ │ RIJ := 1 │ │ KOL := 1 │ │ MAXNR := 0 │ ├───────────────────────────────┤ │ RIJ <= 50 │ │ ┌───────────────────────────┤ │ │ KOL <= 60 │ │ │ ┌───────────────────────┤ │ │ │ READ (A[RIJ,KOL]) │ │ │ ├───────────────────────┤ │ │ │ KOL := KOL + 1 │ │ ├───┴───────────────────────┤ │ │ RIJ := RIJ + 1 │ ├───┴───────────────────────────┤  │ RIJ := RIJ ‑ 1 │ ├───────────────────────────────┤ │ KOL := KOL ‑ 1 │ ├───────────────────────────────┤ │ MAX := A[RIJ,KOL] │ ├───────────────────────────────┤ │ MAXNR := 1 │ ├───────────────────────────────┤ │ RIJ >= 1 │ │ ┌───────────────────────────┤ │ │ KOL >= 1 │ │ │ ┌───────────────────────┤ │ │  │ A[RIJ,KOL] = MAX │ │ │ │   │ │ │ │J N│ │ │ ├───────────────────┬───┤ │ │ │ MAXNR := MAXNR + 1│ │ │ │ ├───────────────────┴───┤ │ │ │ A[RIJ,KOL] > MAX │ │ │ │                       │ │ │ │J N│ │ │ ├───────────────────┬───┤ │ │ │ MAX := A[RIJ,KOL] │ │ │ │ ├───────────────────┤ │ │ │ │ MAXNR := 1 │ │ │ │ ├───────────────────┴───┤ │ │ │ KOL := KOL ‑ 1 │ │ ├───┴───────────────────────┤ │ │ RIJ := RIJ ‑ 1 │ ├───┴───────────────────────────┤ │ "einde" │ └───────────────────────────────┘Nijmegen, 1990, J.H. Croonen