Syllabus Programmeren
gemaakt door Jan Croonen, Nijmegen 1990
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)
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
Een computer werkt (gedeeltelijk) automatisch, omdat hij
met sensoren is uitgerust. Noem een voorbeeld van zo'n sensor.
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.
Maak een programma dat de som bepaalt van alle positieve
getallen in een reeks van 1000 getallen die worden ingevoerd.
Stel dat A = 2 en B = 1. Welke waarde krijgt C?
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.
Analyse en globaal ontwerp: maak een globale schets van
het algoritme in de vorm van een PSD.
Detailontwerp: maak een in alle details uitgewerkt PSD.
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
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.
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.
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.
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
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?
Gaat excursie 2 over hardware of software?
Maak een programma dat de som bepaalt van de derde machten van de getallen 1 tot en met 100.
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
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.
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.
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