C""I Ol-' NO IJ,) 0 O'IJ'I 00'
IIIIII
IIIII
III,I
I'
I~
/'
/1111'/"/111111111111/111 1 111 1lil/I!
11111 /111111111;1111111111111/11/11111! 1[,li ,111111111. ,/ 11'11111111/1111. 11111111111 1111111111111111 1/111111 1 BIBLIOTHEEK TU Delft P 1826 6264" " "" /I" I
C 560236inleiding
r
CPS
ir.
L.P.B.M.
Janssen
0.1.
VoorwoordConvcrsational Programming System (cps) is een zogenaamd "time-sharing-systcm". Dit wil zeggen, dat verschillende mensen simultaan een fractie van een seconde de computer gebruiken, waardoor de wachttijden tot practisch nul worden gereduceerd. De communicatie met de computer vindt plaats door middel van terminals. Dit zijn een soort schrijfmachines, die via de gewone telefoonlijnen met de computer zijn verbonden. Cps werkt interactief, (iat wil zeggen, er bestaat een voortdurende wisselwerking tussen de gebruiker en de computer. De normale gang van zaken is dat U zich bekend maakt aan de computer ('logon-procedure'). Hierna typt U een programma in, waarbij iedere regel onmiddellijk door de computer wordt gecontroleerd op taalfou-ten, waarvan, iIldien deze voorkomen, onmiddellijk een melding volgt. Is het programma klaar, dan geeft U een bewaal ·I)dracht ('save-statement') en daarna gaat U rekenen (' xeq-statement').
De taal CPS is tamelijk eenvoudig, want hij sluit Jlauw aan bij normale spreek-taal en wiskundige uitdrukkingen. Als U enkele statements kent, kunt U al eenvoudige programma's schrijven. Daarna kunt U Uw kennis van de taal uit-breiden, waardoor U steeds grotere en meer ingewikkelde programma's kunt creëren. Dit is ook verwerkt in de opzet van deze handleiding. De tekst uit het eerste hoofdstuk, in rechte letters gedrukt, is voldoende voor het schrij-ven van eenvoudige programma's. De cursieve gedeelten gaan dieper op de stof
in en zijn in eerste instantie niet nodig om eenvoudige programma's te schrijven. Het tweede hoofstuk heeft een analoge opzet. Men kan ook hier een scheiding maken tussen het eenvoudige deel, met rechte letters en het moeilijkere deel, met cursieve letters gedrukt. Om redenen van duidelijkheid zijn in deze hand-leiding alle standaardwoorden (XEQ, GOTO, IF THEN, etc.) in hoofdletters uitgevoerd. Dit is niet nodig bij het programmeren, U kunt voor de standaard-woorden zowel hoofdletters als kleine letters gebruiken. Aan het einde van ieder hoofdstuk zijn twee extra voorbeelden opgenomen. Aan het eind van deze handleiding is een lijst opgenomen van veel voorkomende foutmeldingen
met verklaringen en aanwijzingen voor het gebruik van andere dan de IBM 2741 terminals
Tot slot wil ik er de nadruk op· leggen, dat deze handleiding niet pretendeert een volledige taalbeschrijving te zijn. Omwille van de beknoptheid zijn alleen die statements opgenomen, die over het algemeen voldoende zijn om de meeste programma's te kunnen schrijven.
Delft, juni 1975 ir. L.P.B.M. Janssen
0.2. Inhoud
0.1 Voorwoord 3 0.2 Inhoud 5 1.1 Programmeren in C.P.S. 7 1.2 In- en uitloggen 8 J.3 Symbolen 9 1.4 Stroomd iagrammen 10 l.5 Regelnummering 1 I 1.6 Statements 12 1.6.1 Expressies 12 1.6.2 In- en uitvoerstatements 12 1.6.3 Sprongstatements 15 1.6.4 Voorwaarden 16 1.6.5 Loop-statements 17 1.7 Standaard-routines 21 1.8 Besturingsopdrachten 21 1.8. I Programmabesturing 21 1.8.2 Lib besturing 23 1.9 Fouten 24 1.9.1 Foutmelding 24 1.9.1.1 Syntactische fouten 241.9. I.2 Dynamische fouten 25
1.9.2 Foutenverhetering 25
1.9.2. I Syntactische fouten 25
1.9.2.2 Dynamische fouten 25
1.10 Voorbeelden van programma's 27
2.1 Besturingso
po rach ten
312.1 Autosave 31 2.1.2 Logout (Resume) 31 2.1.3 Resequence 32 2. 1.4 Load-save-fi1e 33 2.1.5 Maximale geheugenruimte 34 2.2 Taalbeschrijving 35 2.2.1 Direct 35 2.2.2 Array 35 2.2.2.1 Declaratie 35
2.2.2.2 Het gebruik van arrays 35
2.2.3 String 37
2.2.3.1 Declaratie 37
2.2.3.2 Het gebruik van strings 37
2.2.3.3 String-arrays 38
2.2.4 Standaard routines 39
2.2.5 Uitvoer-statements 39
2.2.5:1 Put image 39
2.2.6.1 Functieproeed ures 40
2.2.6.2 Interne procedures 40
2.2.6.3 Externe procedures of subroutines 42
2.3 Voorbeelden 43 3.1 Foutboodschappen 45 3.2 Andere terminals 47 3.2.1 Teletype terminal 47 3.2.2 IBM 3270 beeldbuisterminal 47 6
HOOFDSTUK
1.1. Programmeren
inc.P.S.
Voordat men een probleem kan programmeren moet het eerst geanaliseerd worden. Als voorbeeld zullen we een nulpuntsbepaling van een ingewikkelde maar continue functie bekijken. We kiezen daartoe een bepaalde startwaarde
Xo waarvan we vermoeden dat het nulpunt rechts van deze waarde ligt.
Vervolgens laten we x toenemen met een stapgrootte Xs en kijken we wanneer de functie van teken wisselt, dus wanneer een nulpunt gepasseerd wordt. Is dit het geval, dan gaan we één stap terug en met deze waarde als nieuwe startwaarde herhalen we de procedure met een stapgrootte die b.v. 5 maal zo klein is. Dit doen we totdat de gewenste nauwkeurigheid is bereikt. In 'nor-male' spreektaal en 'nor'nor-male' wiskunde zou het probleem als volgt geformu-leerd kunnen worden:
10 vraag de waarden op van Xo (beginpunt), Xs (begin stapgrootte) en n
(ge-wenste nau wkeurigheid). 20 stel x = Xo
30 stel s = Xs (stapgrootte bepaling) 40 bereken y 0 = f(x)
50 stel x = x + s (nieuwe x is oude x plus stapgrootte). 60 bereken y 1 = f(x).
70 stel z = y 0 x Y 1 (z is negatief als er een nulpunt tussen de oude x en de nieuwe x ligt).
80 als z
<
0 ga dan naar regel 110, zo niet ga dan gewoon door. 90 stel nu y 0 = Y 1100 ga terug naar regel 50
110 controleer of de stapgrootte kleiner is dan de gewenste nau wkeurigheid. Als dit zo is, ga dan naar regel 150, zo niet ga dan gewoon door. 120 omdat er tekenomslag heeft plaatsgevonden doen we een stap terug, dus
x = x - s.
130 maak de stapgrootte kleiner: s =
s
i
5140 ga naar regel 50. 150 druk de resultaten af .
Deze analyse is zonder veel moeite om te zetten in een c.p.S. programma. Als de functie er b.V. als volgt uitziet:
f(x) = x + e(x- 2) wordt het programma
10 20 30
,40
GET LIST (xO,xs,n)
x = xO s = xs
yO = x + exp(x- 2)
50 60 70 80 90 100 IlO 120 130 140 150 11: 12: 13: x=x+s yl =x+exp(x- 2) z=yO*yl IF z
<
0 THEN GOTO 12 yO = yl GOTO II IF s<
n THEN GOTO 13 x=x - s s = s/5 GOTO II PUT List (x)1.2. In- en uitloggen.
Voordat men kan beginnen met het schrijven van en het rekenen met een programma moet men zich aan de computer bekend maken. De computer moet nl. weten of U gemachtigd bent om te rekenen en welk budget hij moet belasten. U moet hiertoe eerst de knop rechts op het toestenbord van de ter-minal op "on" zetten, waarna de terminal zacht zal beginnen te zoemen. Zoemt hij niet, dan moet U de stekker in het stopcontact steken. U drukt nu éénmaal op de "return"-toets. Dit is de grote vierkante toets rechts op Uw toestenbord . De verbinding tussen de terminal en de computer komt dan tot stand.
U kunt nu gaan inloggen. Daartoe typt U:
LOGON xxxxxx/yyyy PRoe (eps)
xxxxxx is de zogenaamde useridentification en yyyy is een password. De useridentification vertelt de computer welk budget hij moet belasten en het password geeft aan of U gemachtigd bent om dit budget te gebruiken. Deze twee lettercombinaties worden U toegewezen door de budgetbeheerder van de werkgroep of het practicum. Is er geen password nodig, dan moet U als volgt inloggen:
LOGON xxxxxx PRoe (eps)
Na het logoncommando ingetypt te hebben drukt U op de "return"-toets. De computer zal de melding geven:
XXXXXX LOGON IN PROGRESS AT tijd ON datum waarin tijd en datum het precieze moment van inloggen aangeven. Hierna kunnen eventuele algemene mededelingen van het rekencentrum volgen en daarna typt de computer:
ENTER eps LOGIN PARAMETERS
Hierop reageert U door alleen de "return"-toets in te drukken. De computer zal daarna een klein streepje in de kantlijn plaatsen ten teken dat U kunt be-ginnen.
- - -
-Gebeurt niet alles zoals hierbuven is beschreven dan zijn er twee mogelijkheden;
a) Er gebeurt niets. De "Return "-toets wordt geblokkeerd.
Bel dan toestel 253. Dit is het automatische antwuordapparaat van het rekencentrum, dat U zal vertellen of het systeem 'down' is of 'normaal draait '. Is het systeem 'down', dan moet U enige tijd wachten, voordat U een
nieuwe poging om in te loggen kunt wagen. Draait het systeem normaal, zet
dan de terminal enige seconden op 'off' en herhaal de hele procedure. b) U heeft een fout gemaakt in de logon procedure. De computer geeft hiervan
dan een melding. U moet dan datgene wat fout was goed intypen, niet de hele logon procedure herhalen.
Bent U klaar met rekenen dan kunt U dit aan de computer mededelen door in te typen:
LOGOUT
U krijgt dan een mededeling, waarvan het laatste bedrag aangeeft hoeveel de sessie gekost heeft; daarna typt de computer:
IKJ 56400A ENTER LOGON OR
LOGOFF-Als U hierna niet direct doorgaat met een nieuwe logon moet U intypen: LOGOFF
Pas daarna mag U de terminal uit zetten.
1.3. Symbolen.
eps
kent drie soorten symbolen.a) De letters a tj m z (kleine letters en hoofdletters).
b) De cijfers 0 tjm 9, waarbij de nul essentieel verschilt van de letter o. c) De speciale symbolen.
Naast de algemeen bekende tekens: + - ) \
>
en<
zijn er nog een aantal andere tekens.decimale punt (i.p.v. de decimale komma).
*
"maal"-teken "gedeeld door"-teken"is gelijk aan"-teken of "wordt"-teken (bijv. a = a + 2 betekent a wordt a + 2)
-, "niet" -teken
string quote
scheidingskomma bij in- en uitvoerstatements
dubbele punt
puntkomma, afsluiting van statements
& "and "-symbool
I
"or"-symhuol '! uitvoerteken foutmelding .@ "atn-teken#
l1ummeringsteken $ dollarteken ~ cent-teken % procent-tekenCombinaties van speciale symbolen komen ook voor: ~* tot de macht
>=
groter dan of gelijk aan<=
kleiner dan of gelijk aan , = ongelijk aan,>
niet groter dan,<
niet kleiner danI~ begin van commentaar
:xl
eind van commentaarDe tekens: en" mogen alleen in strings of in commentaar gebruikt worden.
Als het "="-teken het eerste symbool op een regel is, zal deze hele regel niet
in het geheugen van de computer opgenomen worden. De op deze regel
voor-komende boodschap zal rechtstreeks aan de operator op het rekencentrum
worden doorgegeven.
1.4. Stroomdiagrammen.
Bij de voorbeelden in deze handleiding zullen, waar nodig, stroomdiagrammen
geplaatst worden. Vaak is het zinvol om voordat men begint met
programme-ren het probleem door middel van een stroomdiagram te analyseren. De in
deze handleiding gebruikte codes zijn:
I
I
: opdracht<
>
: if-statement\
/
: uitvoeropdracht a = 10 (5) 25 : Do a = 10 to 25 by 5..,
: niet waar JO- - - -....
1.5. Regelnummering
.
In het algemeen moeten de statements in een programma van een regelnummer worden voorzien. De enige eis die in
ers
aan een regeillummer wordt gesteld is, dat het groter dan of gelijk aan 1.00 moet zijn, en kleiner dan of gelijk aan 9999.99 en dat het niet meer dan twee cijfers achter de decimale punt mag hebben.Regelnummer 2357.03 zal door CPS zonder meer worden geaccepteerd. De volgorde van intypen van statements kan volkomen willekeurig zlïn, daar de computer ze zelf rangschikt naar opklimmend regelnummer.
voorbeeld 1 :
Typt U bijvoorbeeld in:,
916.3 put list (c)
12b=1.36
1 a = J 2.5
916
dan zal Uw programma er als volgt uitzien:
1. a = 12.5;
12. b=1.36;
916. c = (a'll.b):~o"(a+b);
916.3 PUT LIST (c);
In dit voorbeeld ziet U, dat CPS automatisch naar opklimmend regelnummer sorteert, alles netjes onder elkaar zet en de regels met een ";" afsluit
In
ers
mag nooit meer dan één statement per regel voorkomen.U kunt echter het nummeren van de regels ook aan de computer overlaten. Indien U bijvoorbeeld als eerste regelnummer
#10
intypt, dan zullen de statements achtereenvolgens de volgende regelnummers krijgen: 10,20,30, .. . .
Typt U echter bijvoorbeeld als eerste regelnummer in:
#7.2,1.3
dan zal de regelnummering worden: 7.2,8.5,9.8, 11.1, .
Met andere woorden: het eerste regelnummer is 7.2 en dit zal bij iedere stap met 1.3 verhoogd worden.
Bent U klaar met het intypen van Uw programma, dan zult U de automati-sche regelnummering moeten onderbreken. Dit doet U door op de "attention"-toets (ATTN) rechts boven op het "attention"-toetsenbord te drukken, mits er op de des
-betreffende regel geen statement staat.
1.6. Statements.
ePS-statements kunnen in 5 groepert ingedeeld worden:
de expressies, in- en uitvoerstatements, sprongstatements, voorwaarden en
loopstatements. Na ieder statement moet op de "return"·toets gedrukt worden. (Dit is de grote vierkante toets, rechts op het toetsenbord.) De computer zal daarna een nieuw regelnummer uittypen en een underscore (" ") geven, ten teken dat hij klaar is om nieuwe informatie van U te ontvangen.
In CPS kunt U standaardopdrachten naar believen met hoofdletters of met
kleine letters intypen. Voor identifiers, labels enz. maakt het wèl verschil of
U hoofdletters of kleine letters gebruikt.
1.6.1. Expressies.
De volgorde waarin in eps een algebraïsche expressie wordt uitgevoerd is: a) haakjes
b) mach tsverheffen
c) vermenigvuldigen en delen d) optellen en aftrekken
Vermenigvuldigen en delen, respectievelijk optellen en aftrekken hebben
on-derling geen prioriteit.
bijvoorbeeld:
x3/ a a - b
+ 5
-8b x
+
y wordt in eps:of
xxxxxxyx x(2*a)/8/b + 5*(a - b)/(x + y)
Indien bovenstaande berekening zeer vele malen herhaald wordt (bijvoorbeeld in een loop), verdient x*xxx de voorkeur boven xxx3, aangezien
vermenig-vuldigen minder rekentijd kost dan machtsverheffeIl.
1.6.2.
In- en uitvoerstatements.
ln- respectievelijk uitvoerstatements zijn opdrachten, waarmee getallen ingelezen, respectievelijk uitgeprint kunnen worden.
Het algemene invoerstatement is: GET LIST ( . . . )
Als de computer dit statement tegenkomt, zal hij opvragen wat tussen de haak-jes staat.
Staat ergens in het programma:
GET LIST (a,b,c)
- - -
---dan zal de computer de waarden van a, b en c opvragen.
Op de terminal verschijnt "a". Daaronder typt U de waarde van "a" in, waar-na U op de "return"-toets drukt. Hierna zal de computer een "b" uittypen, enz.
In hel volgende voorbeeld stelt een "p" in de kantlijn de reactie van de pro-grammeur voor, een "c" de reactie van de computer.
Voorbeeld 2.
De waarden die ingevoerd moeten worden, zijn: voor xl: 0.5, voor a: 7.3 en voor x2: 0.62. Het statement is:
GET LIST (x I ,a,x2) De te volgen procedure is:
c: xl p: 0.5 c: a p: 7.3 c: x2 p: .62
Bovendien ziet U in het voorbeeld, dat de nul voor de komma weggelaten mag worden.
U kunt ook, nadat op de terminal "x I " verschenen is, de waarden van x I, a
en x2 op één regel intypen, mits gescheiden door een komma.
Het voorbeeld wordt dan:
c: xl p: .5,7.3,0,62 of c: xl p: .5,7.3 c: x2 p: .62
Het algemene uitvoerstatement is PUT LIST ( . . . ) Dit is identiek aan:
? . . . .
De computer drukt de waarden van datgene wat op de plaats van de puntjes staat af.
Zou na bovenstaand voorbeeld in het programma staan: PUT LIST (xa,x2,a)
of
?xl,x2,a
dan zou de computer hierop reageren met: .5. .62 7.3
Opmerking 1.
Bij een "PUT LIST"-statement moeten haakjes gebruikt worden; bij een '.?"-statement mag dit niet.
Opmerking 2.
I
Tussen de verschillende in te voeren of uit te voeren elementen moeten kom-ma's staan.
Het is ook mogelijk tekst op te nemen in de uitvoer. Deze moet dan tussen string-quotes (zie l.2) staan.
Voorbeeld 3:
Als a = 0, b = 3.1415 en x = 7.128596 en de computer komt in het programma tegen:
PUT LIST ('De integraal van',a,'tot' ,b,'is' ,x) of
? 'De integraal van',a,'tot' ,b,'is' ,x dan zal de uitvoer worden:
De integraal van 0 tot 3.1415 is 7.1283596
Voor ieder uitvoer-statement zal een nieuwe regel gebruikt worden:
? 'De in tegraal van " a ? 'tot',b,'ü',x
geeft als uitvoer:
De in tegraal van 0 tot 3.1415 is 7.1283596.
Dit heeft ook tot gevolg dat
? ' , ? ' ,
betekent 2 regels overslaan.
· - - -
-1.6.3.
Sprong-statements.
In een ePS-programma kan naar een zogenaamd "label" gesprongen worden. Een label is een naam van ten hoogste 6 symbolen, gevolgd door een dubbe-le punt.
De restricties die aan een label gesteld worden zijn:
het eerste symbool moet een letter zijn; er mogen geen spaties in voorkomen. Geldige labels zijn:
lab:, g2eka:, bier:, Liesje:, p2:, g:
Ongeldig zijn:
723:, b2 c6:, 3Iab:, truus, jenever: Opmerking:
In een label zijn kleine letters en hoofdletters significant, dus: LAB =1= LAb =1= lab
Het springen naar een label gebeurt met een "goto"-statement. Dit statement mag met of zonder spatie tussen go en to geschreven worden.
Zowel "GO TO" als "GOTO" worden geaccepteerd.
Het volgende voorbeeld geeft aan hoe een stroming door een buis opgewarmd wordt. Hierin is het Nusseltgetal (Nu) een maat voor de overgedragen hoeveel-heid warmte, het Reynoldsgetal (Re) karakteriseert de stroming en het Prandtl-getal (Pr) is een stofconstante.
Voorbeeld 4.
#
10 ? ' warm teoverdrach t bij turbulente buisstromen'20 lab:
30 GET LIST (Re, Pr)
40 ?' ,
50 Nu= .027 ... Rex.~.8~Pr ... x..33 60 ? 'Het Nusseltgetal is',Nu
70 GOTO lab
In dit programma worden steeds andere Reynolds- en Prandtlgetallen ingevoerd en daarmee wordt het Nusseltgetal uitgerekend.
Opmerking I:
In het goto-statement mag het label niet gevolgd worden door een dubbele punt.
Opmerking 2:
Omdat -tfovenstaand programma steeds maar doorgaat moet het, als men klaar is met rekenen, afgebroken worden door op de "ATTN"-toets te drukken. Opmerking 3:
Achter een label mag ook een statement staan: Bijvoorbeeld: 20 lab: GET LIST (Re,Pr)
1.6.4. Voorwaarden.
Het "goto"-statement wordt vaak gebruikt in samenhang met een voorwaarde. De algemene vorm voor een voorwaarde is:
IF . .. THEN ...
Dit statement gaat na of dat wat na "ir' komt, waar is. Is dit het geval, dan doet de computer wat achter "then" staat. Is dat wat achter "ir' staat niet waar, dan zal het programma de "then"-opdracht negeren.
Voorbeeld 5: 10 20 30 40 50 60 70 80 90 100 110 [6
GET LIST
(x) ? 'wortel van x' GET LIST (x)IF x <0 THEN GOTO neg y = SQRT(x) ? ' wortel' ,x,'is',y GOTO klaar neg: y = SQRT(-x) ? ' wortel' ,x,' is' ,y " x i' klaar:
- -- -~ --- - - -- - - -Opmerking:
SQRT is een standaard routine, die de wortel uit een getal trekt (zie 1.5). Als in bovenstaande programma de x negatief is, zal het programma regel 10
ti
m 30 en 70ti
m 110 doorlopen. Is x positief, dan zullen regel 10ti
m 60,100 en 110 doorlopen worden.
Een uitbreiding van het "IF .. . THEN ... "-statement is het "IF ... THEN . .. ; ELSE ... "-statement.
Als de "IF-expressie" waar is, zal de "THEN-expressie" uitgevoerd worden. Is de "rF-expressie" niet waar, dan zal de "ELSE-expressie" uitgevoerd worden.
Bijvoorbeeld:
IF y
<
0 THEN b = 10; ELSE b = 20 oflF p = 10 THEN GOTO labl; ELSE GOTO lab2
Opmerking:
Het "IF THEN; ELSE"-statement is het enige CPS-statement waarin een ";" getypt moet worden.
Er kunnen in een "IF THEN"-statement meerdere voorwaarden gesteld wor-den door "&" of
"I"
(logische "and" of "or")-symbolen te gebruiken.IF n
>
Ia & n <20 TEEN GOTO labbetekent: ga naar lab als n
>
10 én tevens n<
20, dus als 10<
n<
20. IF n<
10In>
20 THEN GOTO labbetekent: ga naar lab als n
<
10 óf als n>
20.1.6.5. Loop-statements.
De "DO-loops" worden gebruikt om aan bepaalde variabelen achtereenvolgens verschillende waarden toe te kennen. Het volgende programma corrigeert steeds
5 verschillende meetwaarden, namelijk xl tlm x5 door middel van de
Voorbeeld 6. 10 20 30 40 lab: 50 60 loop: 70 80 90 100 110 120
Begin
GET LIST
y=
O.9 x
l.02 +O.Ix
x,y
GET LIST
(door)
door
=
I
? 'Correctie van meetwaarden.' ? ' ,
? 'Vul nu de meetwaarden in.'
GET LIST (x 1 ,x2,x3,x4,x5)
DO x = xl ,x2,x3,x4,x5
y = .9.xxx ~ 1.02 + 1 ~x
? ' De meetwaarde is' ,x,' de gecorrigeerde waarde is' ,y
END loop
? 'Typ een 1 in als U door wilt gaan, anders een 0'
GET LIST (door)
IF door
=
1 THEN GOTO lab:Dit programma zal, als het op regel 90 aankomt, terugspringen naar regel 60
en dan de volgende waarde van x nemen. Is er geen volgende waarde meer
aan-wezig, met andere woorden, is x5 geweest, dan gaat het programma door met
regel 100.
- -
---
--~ ---
- - - ---Een uitbreiding op dit statement is het "DO TO BY"-statement.Bijvoorbeeld:
DO a = 10 TO 25 BY 5
a zal hierin achtereenvolgens de waarden 10, 15, 20 en 25 aannemen. Laat men het "BY"-gedeelte weg, dan zal als stapgrootte 1 genomen worden. Bijvoorbeeld:
DO a = 10 TO 25
a krijgt hierin achtereenvolgens de waarden 10, 11, 12, 13, ... , 24,25. Voorbeeld 7.
Dit voorbeeld behandelt een numerieke integratie door de oppervlakte onder een polynoomcurve te berekenen. In regel 10 en 20 wordt tekst uitgevoerd. In regel 30 worden de begin- en eindwaarden van het integratie-interval opge-vraagd. In regel 40 wordt de integraal op nul gezet. Daarna wordt in regel 50 het integratie-interval in 100 stukjes verdeeld. In regel 60 worden de opper-vlakken van deze stukjes uitgerekend en gesommeerd. In regel 80 wordt een correctie toegepast en in regel 90 wordt de uitvoer geregeld. De polynoom is x3 - X
+
60.10 ? 'Numerieke integratie'
20 '! 'Vul de grenzen van het te beschouwen interval in' 30 GET LIST (begin, eind)
40 int = 0
50 DO i = begin TO eind BY (eind .-begin)/l 00 60 int = int
+
(ix i~ü - i+
60)* (eind - begin)/l 00 70 END80 int
=
int - (begin**3 - begin+
60+
eind**3 - eind + 60)* *(eind - begin)/20090 ? 'de integraal is', int
Er kunnen ook meerdere loops in elkaar voorkomen. Om ze te kunnen onder-scheiden moeten ze van een label worden voorzien.
Voorbeeld 8:
indien men een }ijst van het kental voor warmteoverdracht (Nu) naar een vloei-stof die door een buis stroomt wil maken voor verschillende stromingscondities en verschillende stofeigenschappen kan daarvoor het volgende programma ge-bruikt worden:
8
10 ? 'Nusselt als functie van Reynolds en Prandtl.'
20 ?' , 30 loop I: DO Re = 4000 TO 10000 BY 500 40 ? 'Re =' ,Re 50 loop2: DO Pr = I TO 5 60 Nu = .027*Re)f*.8*Pr*K33 70 ? 'Pr =',Pr:en Nu =',Nu 80 END looP2 90 ?' , 100 END loopl
In dit programma zal eerst de eerste waarde van Re genomen worden. Daar
-mee zal de hele 2e loop doorgerekend worden. Dan zal de tweede waarde
van Re genomen worden, enz.
Opmerking I: In enkelvoudige "DO"-Ioops mogen labels gebruikt worden;
ko.nen er "DO"-Ioops in "DO"-loops voor, dan moeten labels gebruikt wor-den.
Opmerking 2: Er mag niet door middel van een "GOTO"-statement van
buiten de loop naar een label binnen de loop gesprongen worden.
- - -
--~~---~ - --1.7. Standaard-routines.
Voor het rekenen met de computer staan een aantal standaardroutines ter beschikking, te weten:
sin (x) sinus van x; x in radialen sind (x) cos (x) cosd (x) atan (x) atand Ca) sqrt (x) exp (x) log (x) loglO (x) abs Cx)
sinus van x; x in graden cosinus van x; x in radialen cosinus van x; x in graden arctangens van x; in radialen arctangens van x; in graden wortel uit x; x ;;;. 0
e tot de macht x
natuurlijke logaritme van x; x
>
0 gewone (i 0) logaritme van x; x>
0 absolute waarde van xDeze routines mogen in elkaar voorkomen, bijv.
Y
=
exp (sqrt (abs (atan (sin (log I 0 (x)))))) is een volkomen legaal statement.1.8. Besturingsopdrachten.
Er zijn bepaalde statements, die direct (d.w.z. zonder regelnummer) ingetypt worden en die dienen om een programma te besturen. Deze statements wor-den "besturingsopdrachten" genoemd. Logon en Logout (zie 1.2) zijn hier voorbeelden van.
1.8.1. Programmabesturing.
Om een programma, nadat het geschreven is, te starten, dient het statement xeq (of XEQ)
gebruikt te worden. Dit is identiek aan EXECUTE
Onmiddellijk nadat dit commando ingetypt is en er op de "return"-toets gedrukt is, zal het programma beginnen met rekenen. Indien U tijdens het rekenen niet meer verder wilt gaan met Uw programma, moet U op de atten-tion-toets (A TTN) drukken. De computèr stopt met rekenen en zal U vertel-len met welke regel hij bezig was.
Er bestaan 5 alternatieve XEQ-commando's, namelijk:
a) XEQ a
waarbij a een regelnummer is. Bijv.:
XEQ 18
betekent: "doe alleen regel 18".
b) XEQ a THRU b
Dit commando betekent: "begin bij regel a en ga door tot je bij regel b aange-komen bent.
c) XEQ THRU b
Dit commando betekent: "begin bij het begin en stop zodra je bij regel b
bent aangekomen.
d) XEQ a THRU ...
Door dit commando zal het programma bij regel a starten en tot het eind van
het programma doorgaan.
e) XEQ* THRU . . .
Dit programma betekent: "ga door waar je gebleven was. Het kan bijvoorbeeld
gebruikt worden nadat het programma gestopt is door middel van een
"STOP"-commando in het programma (zie 2.2.4) of door middel van de attention
(A TTN )-toe tso Voorbeeld 9: 10 ? 'begin' 20 GOTO L2 30 Ll: ? 'L1' 40 GOTO L3 50 L2: ?' L2' 60 GOTO L1 70 L3: ? 'L3' XEQ geeft als uitvoer:
begin
U
L1 L3
XEQ 30 THR U ... geeft als uitvoer: L1
L3
XEQ 20 THR U 30 geeft als uitvoer:
L2 L1
XEQ THRU 30 geeft als uitvoer:
begin L2 Ll
Opmerking: In plaats van regelnummers kunnen ook labels gebruikt worden. In bovenstaand voorbeeld geeft
XEQ 30 THRU 50
h~'tzelfde resultaat als
XEQ Ll THR U L2 of
XEQ 30 THRU L2
Dezelfde regels als voor het "XEQ"-statement gelden, gelden ook voor het "LlST"-statement. Dit commando resulteert in het uittypen door de computer van het programma, zoals dit in het geheugen staat.
Bij een listing worden alle standaard-statements met hoofdletters geschreven en het "?" -teken wordt vervangen door "PUT LIST".
Bij een LIST-opdracht wordt niet gesprongen. In voorbeeld 9 zou het commando
LIST 20 THRU 30 leiden tot de volgende uitvoer:
20 GOTO L2; 30 Ll: PUT LlST('U');
Op eenzelfde manier als U met het LIST-statement regels in Uw programma kunt laten uittypen, kunt U door middél van het ERASE-statement regels in Uw programma uitwissen.
Het enige verschil in gebruik tussen een "LlST"-statement en een ERASE-statement is, dat, indien U het hele programma wilt wissen, U niet ERASE kunt gebruiken, maar in moet typen
ERASE THRU . . . Het statement
ERASE 30 THRU 50
betekent veeg regel 30 tot en met regel 50 uit.
1.~.2.
Libbesturing.
Als een programma ingetypt wordt, wordt dit in het snelle en dure werkgeheu-gen opwerkgeheu-genomen. In dit geheuwerkgeheu-gen kan met het programma gerekend en gemanipu-leerd worden. Wil men echter een programma bewaren, dan moet dit in het
zame achtergrondgeheugen (library genaamd) gezet worden.
Om een programma te bewaren typt U in: SA VE (nnnn).
Hierbij is nnnn een door Uzelf te kiezen naam van maximaal 6 symbolen,
waarvan het eerste symbool een letter moet zijn, en waarin géén spaties
mo-gen voorkomen. Hoofdletters en kleine letter zijn significant, dus NaaM =1= NAAM =1= naam.
Het programma staat nu in het werkgeheugen én in het achter~rondgeheugen.
Het kan nu uit het werkgeheugen verwijderd worden door het commando:
ERASE THRU ...
of door een logout. Het blijft dan echter wel in het achtergrondgeheugen staan. Wil men het programma vanuit het achtergrondgeheugen naar het wergeheugen overbrengen, dan luidt het commando hiervoor:
LOAD(nnnn)
waarbij nnnn weer de naam van het programma is.
Het programma blijft echter óók in het achtergrondgeheugen staan. De enige manier om het programma uit het achtergrondgeheugen te verwijderen is door het statement:
LIB ERASE (nnnn)
Er schuilt bij het saven nog wel een moeilijkheid. Indien U een naam gebruikt
waaronder al een programma in de library staat, wordt het oude programma
uitgeveegd en het nieuwe daarvoor in de plaats gezet. Men kan dit echter
voor-komen, door te kijken welke programma's zijn gesaved. Dit kan door het
com-mando in te typen:
UB LiST
De computer zal hierna alle programmanamen die voorkomen onder dezelfde
useridentificatie waaronder ingelogd is, uittypen.
1.9. Fouten.
1.9.1. Foutmelding.
1.9.1.1. Syntactische fouten.Indien er tijdens het intypen van een programma een syntactische fout gemaakt wordt, zal
eps
hierop reageren door een uitroepteken te typen. Drukt men daarna op de "return"-toets, dan zal op de terminal een foutboodschapver-schijnen.
Voorbeeld 10:
10 ? 'dit is een voorbeeld'
- -
- -
- . - -~---20 GET LIST (mu,n,x2
UNBALANCED PAREN 20
Regel 20 moet dus opnieuw ingetypt worden. 1.9.1.2. Dynamische fouten.
Er kan ook een fout optreden, als de computer met het programma aan het rekenen is.
Deze categorie fouten noemt men dynamische fouten. Ook hiervan krijgt U een melding. Voorbeeld 11: 10 a = 20 20 b = 75.23 30 c=5 40 ? ' dynamische fout' 50 y = b/(a - 4~c) 60 ?'y =',y
Nadat er een "XEQ" gegeven is, zal dit programma de volgende uitvoer geven: dynamische fout
50
**
DIVISION BY ZERONa de foutmelding zal de computer stoppen met rekenen en U moet dan eerst de fout verbeteren.
Opmerking I: Het getal 50 in de foutmelding geeft het regelnummer aan, waarin de desbetreffende fout gevonden is.
Opmerking 2: Achter in deze handleiding staan een aantal veel voorkomende foutmeldingen met een verklaring.
1.9.2.
Foutenverbetering.
1.9.2.1. Syntactische fouten.Bij het verbeteren van syntactische fouten moet, nadat het nieuwe regelnum-mer is verschenen, het statement opnieuw (maar dan goed) worden ingetypt. 1.9.2.2. Dynamische fouten.
Voorbeeld 12:
10 PUT LIST ('dynamische fout')
20 LEB:GET LIST(Xa,Xe);
30 X=Xa + Xe
40 PUT LIST (X)
50 IF X = 0 THEN GOTO LAB
Dit programma zal bij een "XEQ" de dynamische foutmelding geven:
- - - ---~-~,~ - - - -- -
-50
**
ILLEGAL TARGET EXP.De computer kan namelijk het label "LAB" niet vinden. Dit kan verholpen worden door, met regelnummer, een nieuwe regel 20 of een nieuwe regel 50
in te typen, waarin U de beide labels hetzelfde maakt:
Een andere mogelijkheid is het intypen van: 201 @LEB@LAB@
De computer zal hierop reageren door uit te typen: 20. LAB: GET LIST (Xa,Xe)
De computer heeft in regel 20 overal LEB vervangen door LAB. U had
na-tuurlijk ook in kunnen typen:
501 @A@E@
Fout was echter geweest: 20l @E@A@
want dit heeft tot resultaat:
20 LAB: GAT LIST (Xa, Xe)
ILLEGAL STATEMENT
Deze manieren van foutenverbetering zijn ook toe te passen als U iets in een programma wilt veranderen.
Voorbeeld 13: 10 a=3.357 20 b = 20 30 DO c =.5 TO 4 BY .5 40 x = b*a**c 50 ?x 60 END
Stel, dat b niet de waarde 20, maar de waarde 40 moet krijgen, dan heeft de opdracht
201 @20@40 een foutieve uitwerking.
Het programma wordt:
10 a=3.357 20 b = 20
30 DO c =.5 TO 4 BY .5
40 b = 40
50 ? x
60 END
Een oplossing voor dit probleem is de opdracht:
201 @=20@=40@
U kunt natuurlijk ook gewoon een nieuwe regel 20 intypen.
De verbeteringen worden alleen in het werkgeheugen aangebracht. Indien U wilt dat ze ook in het achtergrondgeheugen worden opgeborgen, geeft U een save-commando met dezelfde naam, als die waaronder het programma in het achter-grondgeheugen staat. Het oude programma (zonder verbeteringen) wordt dan uitgewist en het nieuwe (verbeterde) programma wordt daarvoor in de plaats gezet.
1.10. Voorbeelden van programma's
Voorbeeld 14:
In het volgende voorbeeld wordt de zogenaamde foutenintegraal (Errorfunction) uitgerekend. Deze is gedefinieerd als
2 z _ 2
ERF (z) = .7'::. Jet dt y 1T O
In regel 30 worden het argument z van de errorfunctie en de
integratiestap-grootte opgevraagd. In regel 70 wordt de integraal bepaald door de
oppervlak-te onder de kromme uit oppervlak-te rekenen en in regel 90 wordt een begin- en eind-correctie toegepast.
- --~--- ---~ -
-Stroomdiagram.
get list
(z,stap)
int
=
int -
(1
+exp (-z**2)*z/(2*stap))
Programma.
1 0 ? 'Dit programma berekent de Errorfunctie van het getal z' 20 ? 'Vul nu eerst z en het aantal integratiestappen in.' 30 GET LIST (z,stap)
40 Pi=4~atan(l)
50 Înt = 0
60 DO j = 0 TO z BY z/stap 70 int = int + exp H**2)*z/stap 80 END
90 int = int - (l + exp (-z**2»*z/(2*stap) 100 erf = 2/SQRT (Pi)*int
110 ?'ERF(',z,')=',erf
Voorbeeld 15:
'--==E==:::::;-
._--..
---.----E"---~a
=
0
<
) Programma.antw
=D<O
rex
=
-b/2a
irnx
=
V
-D/2a
10 ? 'Dit programma berekent de wortels uit een kwadratische vergelijking' 20 ? 'van de vorm a*xxx2 + b*x + c
=
0'30 lab 1: GET LIST (a,b,c)
40 IF a = 0 THEN GOTO lab3
-- - - - --
-50 D = bx.b - 4x.a*c
60 IF D
<
0 THEN GOTO lab270 p = -b/2/a 80 q = SQRT (D)/2/a 90 ? 'Xl =',p + q,'X2 =',p - q 100 GOTO klaar 1101ab2: rex=-b/2/a 120 imx = SQRT (-D)/2/a
130 ? 'XI =' ,rex,'+' ,irnx,' *i;X2 =' ,rex,' -' ,imx,' *i'
140 GOTO klaar
ISO lab3: IF b = 0 THEN GOTO lab4
160 x = -c/b
170 ?'X=',x
180 GOTO klaar
190 lab4: IF c = 0 THEN GOTO labS
200 ? 'STRIJDIG!!!!'
210 GOTO klaar
220 labS: ? 'IDENTIEK'
230 klaar: ? 'Wilt U nog een keer rekenen? Ua = 1, nee = 0)'
240 GET LIST (antw)
250 lF antw = I THEN GOTO labl
260 ? 'Dan stoppen we ermee'
HOOFDSTUK II.
2.1. Besturingsopdrachten.
2.1.1. Autosave.
U zult merken, dat, nadat U op de "Return"-knop gedrukt heeft, vaak de toetsen even niet ingedrukt kunnen worden. Dit is normaal. Soms echter blijven de toetsen vast zitten: er is een storing in de computer ontstaan, waar-door het systeem "down" is. Alles wat in het werkgeheugen staat, is dan ver-loren gegaan. Dit is bijzonder onplezierig als U juist een groot en uitgebreid programma ingetypt, maar nog niet gesaved heeft. Om dit risico niet te lopen, kunt U, telkens als U enkele regels heeft ingetypt, de automatisdteJ"~$elnum mering door middel van de "attention"-toets afbreken, het programma saven en daarna weer dOQrgaan. U kunt dit werk echter ook door de computer la-ten doen, door gebruik te maken van de zogenaamde "Autosave"-faciliteila-ten. U moet dan bij het inloggen, nadat de computer U gevraagd heeft:
ENTER CPS LOGIN PARAMETER
niet direct op de "Return"-knop drukken, maar eerst intypen: AUTO (pppp)
waarin pppp staat voor het zogenaamde "autosave-member". Dit is een naam, die aan dezelfde voorwaarden als een normale "save"-naam moet voldoen. De computer zal nu steeds om de paar regels het programma automatisch in het achtergrondgeheugen zetten. Ten teken dat dit gebeurt, zal steeds als er auto
-matisch gesaved wordt een dubbele horizontale streep in de kantlijn verschij
-nen. Gaat het systeem dan per ongeluk "down", dan zal het programma tot aan de laatste dubbele streep behouden blijven.
Komt het systeem weer "op", dan kunt U opnieuw inloggen met een ander autosavemember. Hierna typt U in: load (pppp). U kunt ook inloggen met hetzelfde autosavemember. De computer zal dan de boodschap geven:
RESTART COMPLETE
Een listing zal U leren, dat het programma dan in het werkegeheugen staat. De "autosave" wordt opgeheven door een "logout".
Dit betekent, dat een programma dat in het achtergrondgeheugen staat onder de naam pppp door een "logout" uitgeveegd wordt. Daarom moet U, voor-dat U uitlogt, het programma "saven" (zie 1.8.2) onder een naam, die niet dezelfde is als het autosavemember.
2.] .2. Logout (resume).
Er bestaat een alternatieve manier van uitloggen. indien U in plaats van
"LOG-OUT" intypt
LOGOUT (RESUME)
- -~~--- -
-blijft de computer in CPS doorwerken. U krijgt dan de boodschap:
ENTER CPS LOGIN PARAMETERS
U kunt hiermee dus een autosave activeren of overgaan op basic (dit is een
andere conversational taal).
2.1.3. Resequence.
Met de resequence-opdracht kunt U Uw programma van een nieuwe r
egelnum-mering voorzien. Het commando luidt:
RESEQ THRU .
De computer voorziet Uw programma van de regelnummers 1,2,3,4, ...
enz. Bovendien zal hij automatisch het nieuwe programma beginnen te listen.
Wilt U dit niet, dan moet U op de attention-toets (ATTN) drukken, waarna
de listing stopt. Een "save"-statement zorgt ervoor, dat de nieuwe
regelnum-mering ook in het achtergrondgeheugen opgenomen wordt.
Het algemene statement is:
RESEQ a (THRU b)(FROM c)(BY dj waarbij weer vele combinaties mogelijk zijn, bijv.
Reseq thru Reseq thru by Reseq thru from
"Reseq a thru .. . " zal bij regel a in het oude programma beginnen met
her-nummeren. "Thru b" betekent dat de computer doorgaat tot en met regel b in het oude programma; "thru ... " betekent dat het programma tot het eind toe hernummerd wordt. "From c" betekent, dat het eerste regelnummer van
het nieuwe programma de regel c zal zijn. "By d" geeft aan met welk getal
de regelnummers zullen opklimmen.
Voorbeeld 16:
1 0 ? ' oppervlak van een vierkant en een cirkel.'
20 GET LIST (r)
30 ol = r*r
40 ? 'oppervlak van het vierkant
='
,ol50 02 =3.14159265~nH
60 ? 'oppervlak van de cirkel
='
,0270 ?"
Indien U eerst het oppervlak van een cirkel en pas daarna het oppervlak van het vierkant zou willen uitrekenen, kunt U het programma modificeren door
in te typen:
RESEQ 30 THRU 40 FROM 63 Hierdoor krijgen regel 30 en 40 de nummers 63 en 64
Opmerking: zoudt U ingetypt hebben:
Reseq 30 thru 40 [rom 60,
dan zoudt U de volgende boodschap gekregen hebben:
~~ LINE NUMBER OVERLAP - RESEQ SUPPRESSED
en de reseq zou niet doorgaan.
2.1.4. Load-save-file.
U kunt, indien U dit wenst, Uw programma van een key voorzien, waardoor alleen mensen die deze key kennen met het programma kunnen werken.
Een key is een woord van maximaal 6 letters, dat achter de naam van het pro-gramma staat en dat bij een "Lib-list"-opdracht niet uitgetypt wordt. De ver-schillende mogelijkheden van een key zullen aan de hand van het volgende voorbeeld worden toegelicht.
Voorbeeld 17:
U kunt een programma saven door in te typen: SAVE (pro,gramma)
pro is de naam van het programma gramma heet de longkey
gram heet de shortkey gr heet de listkey
Weet U van een programma de longkey, dan kunt U alles met het programma doen (xeq, load, list, save). Weet U alleen de shortkey, dan kunt U het pro-gramma niet onder dezelfde naam saven; met andere woorden, U kunt geen veranderingen in het programma, zoals dit in het achtergrondgeheugen staat, aanbrengen. (dus alleen load, xeq en list is toegestaan). Probeert U te saven met de shortkey (save (pro,gram», dan zal de boodschap volgen:
~* KEYINCORRECT
en het savecommando zal zonder effect blijven.
Kent U alleen de listkey, dan kunt U niet saven en niet listen (alleen load en xeq). Is het programma geload met:
load (pro,gr) en geeft U de opdracht:
LIST
dan verschijnt de boodschap
**
PROGRAM IS LIST AND SAVE PROTECTED -OPERA TION SUPPRESSED en de Iisting gaat niet door.Opmerking: Iedere werkgroep en ieder practicum heeft een contactman die de contacten met het rekencentrum onderhoudt. Mocht U onverhoopt Uw key vergeten zijn, stelt U zich dan met hem in verbinding.
2
.
1.5.
Maximale geheugenruimte.
De maximale geheugenruimte. die een CPS-programma mag innemen, is 4 pages (= 16384 bytes). Is Uw programma te groot geworden, dan ontvangt U hiervan een melding. Het programma kan niet uitgebreid worden en even-min kan er iets in veranderd of verbe'terd worden. Stukken van het program-ma uitvegen helpt ook niet. Bij verbeteringen van een programprogram-ma of bij erasing van bepaalde gedeelten blijven namelijk de oude statements in het programma staan en worden alleen op non-actief gesteld.
Er bestaat een manier om deze overtollige ballast kwijt te raken. De procedure hiervoor is:
a) Voeg aan Uw CPS-programma als eerste regel toe:
1 DCL XXXX FiLE ENV (F(I60)SPACE(TRK,(2,2))) XXXX is een willekeurige naam met dezelfde voorwaarden als een save-naam).
b) Typ daarna direct (d.w.z. zonder regelnummer) in: STORE FILE XXXX
LiST 2 THRU . ..
c) Maak Uw werkgeheugen schoon door een ERASE THRU . ..
d) Typ op de terminal in met een regelnummer dat niet in Uw CPS-program-ma voorkomt:
DCL FiLE XXXX
daarna direct (d.w.z. zonder regelnummer) iNCLUDE FILE ON XXXX
Daarna wacht U enige tijd, totdat de boodschap komt:
*.x. END OF FILE ON XXXX
Uw programma staat nu zonder de ballast van de op non-actief gestelde statements in het werkgeheugen.
e) SA VE Uw programma.
Opmerking:
Mocht Uw programma zo vol zijn, dat het zelfs a) niet meer accepteert, bel dan het rekencentrum; er bestaat nl. nog een manier om Uw overbodige state-ments kwijt te raken.
2.2.
Taalbeschrijving.
2.2.1. Direct.
Via de terminal is de computer ook als "rekenmachine" te gebruiken. Daartoe typt U zonder regelnummer bijv. in:
Nadat U op de "Return"-toets gedrukt heeft, zal het antwoord onmiddellijk uitgetypt worden.
2.2.2.
Array.
2.2.2.1. Declaratie.
U kunt in CPS gebruik maken van arrays. Dit zijn getallenverzamelingen in de vorm van matrices. Deze arrays moeten gedeclareerd worden aan het begin van een programma. Daartoe typt U met regelnummer in:
DCL aaaa (10)
Dit is een array van 10 elementen met als naam aaaa, of DCL bbbb(7,lO)
Dit is een array in de vorm van een 7 bij 10 matrix. Opmerking:
Voor aa aa of bbbb kan een willekeurige naam van maximaal 6 symbolen wor-den gebruikt, die niet met een cijfer mag beginnen.
2.2.2.2. Het gebruik van arrays.
Het statement
GET LIST (aaaa)
zal tot gevolg hebben, dat de array element voor element opgevraagd wordt. Het commando
PUT LIST (bbbb)
zal achter elkaar alle getallen die de array bevat uittypen.
Een elegante manier om een array uit te voeren wordt in het volgende voor-beeld uitgewerkt.
Voorbeeld 17:
70 Ll: DO i = I TO 7
- -- - - - -~---- ~-- - - -
-80 L2: DO j
=
1 TO 9 BY 290 ? 'A(',ij,')=',a(ij),' en A(,ij+ 1,')=',a(ij+ 1)
100 END L2
110 ENDLl
Dreigt Uw array zo groot te worden, dat het programma deze niet meer kan
verwerken (dit is iets, wat bij rasters voor partiële differentiaalvergelijkingen nogal eens kan voorkomen), dan kunt U de array declareren als:
DCL aa aa (70,120)DEC(6)
CPS zal dan niet de normale hoeveelheid van 16 significante cijfers
doorreke-nene, maar slechts 6.
CPS kent ook de mogelijkheid van arrays met variabele grenzen. Deze
decla-reert U als volgt:
DCL cccc (m) CONTROLLED
waarbij U voor de voorlopige grens m een getal invult, dat in de orde van groot-te van de definitieve grens ligt. Indien daarna in Uw programma de variabele n
een waarde krijgt toegewezen (geheel getal), kunt U intypen: ALLOCATE cccc(n)
De nieuwe grens wordt n. Voordat de grens veranderd kan worden, m.a. w.
voordat U een nieuwe "allo ca te " kunt geven, moet eerst het statement
fF ALLOCA (cccc) THEN FREE cccc
gepasseerd worden. Voorbeeld 18: 36 10 20 30 40 50 60 70 80 L: 90 100 110 120 pCL X(5) CONTROLLED
? 'van hoeveel getallen wilt U het gemiddelde bepalen?'
GET LIST(n)
1F ALLOCA (X) THEN FREE X ALLOCATE X(n) GET LIST (X) som = 0 DO p = 1 TO n som = som + X(p) END L gem = som/n
2.2.3.
String.
2.2.3.1. Declaratie.
Een stringvariabele is een variabele, die geen numerieke waarde heeft, maar
waarin een bepaalde tekst staat opgeborgen.
Een string moet als volgt gedeclareerd worden:
DCL ssss CHAR (10)
Dit betekent, dat de stringvariabele 10 symbolen moet bevatten.
Een andere mogelijkheid is:
DCL ssss CHAR (20) V AR
De toevoeging "V AR" (varying) heeft tot resultaat, dat de string een
wille-keurig aantal variabelen, mits kleiner dan of gelijk aan het opgegeven getal
(hier 20), mag bevatten. ss ss is een willekeurige naam voor de string.
2.2.3.2. Het gebruik van de strings.
Het toewijzen van tekst aan een string gebeurt op de volgende wijze:
s
=
'dit is een string'Strings kunnen gekoppeld worden volgens:
s = sllls2
Indien sI = 'DIT IS' en s2 = 'een string' dan zal PUT LIST (s) na bovenstaand
statement resulteren in: DIT IS een string
Het inlezen van een string kan op twee manieren gebeuren:
a. GET LIST (s)
De computer vraagt dan als het programma gedraaid wordt s
U moet dan Uw tekst intypen, bijv.:
'Dit is een string'
b. READ INTO (s)
De computer zal nu alleen een streepje (underscore) geven en geen "s"
uit-typen als het programma gedraaid wordt. U kunt dan de tekst zonder stnng
-quotes intypen.
Dit is een string
Opmerking: Bij een "GET LIST" moeten wel stringquotes gebruikt worden;
bij een "READ INTO" mag dit niet.
~ - - - - ~~ - - - ~---- -
-Een string kan ook een bepaald getal bevatten:
P = '12345'
Hiermee kan niet gerekend worden, want P heeft geen numerieke waarde. Wil
men dit getal toch een numerieke betekenis geven, dan moet men gebruiken
a = eval (P)
a krijgt dan de "geë·valueerde ", d. w.z. de numerieke waarde van P, dus
a = 12345.
CPS kent het statement "substring" , dat een gedeelte van een string leest,
bijv.:
q = substr (P ,3,4)
Als P de inhoud "voorbeeld" heeft, krijgt q hier de inhoud "orbe", d.w.z. vier opeenvolgende letters van P (voorbeeld), te beginnen bij de derde letter van P.
Voorbeeld 19:
10 DCL q CHAR (129) VAR
20 ? 'programma om op de terminal grafieken te tekenen' 30 40 ? ' ,
,
,
q= 50 DO i = 1 TO 7 60 q = q11
q 70 END 80 q='O'lls 90 DOx=OT0360BY15 100 Y = 50~(1 + sind (x)) 110 PUT LIST(substr(q,l,y)II'.x-') 120 ENDMet dit programma wordt m.b.v. een string op de terminal de grafiek van 5041 + sind(x)) getekend. In regel 50 tot en met 70 wordt een string van 128. (= 27) spaties samengesteld. In regel 80 wordt hier een "nullijn kenmerk" aan toegevoegd. In regel 100 wordt de string op de gewenste lengte afgekapt en van een sterretje voorzien.
2.2.3.3. String-arrays.
U kunt strings ook in een array plaatsen. U krijgt dan zogenaamde
string-ar-rays. Deze moeten gedeclareerd worden met:
DCL sI (20) CHAR (30;
of
DCL s2(20) CHAR(30) VAR
De arrays sI en s2 in dit voorbeeld hebben ieder 20 stringelementen, die elk weer uit 30 symbolen bestaan.
(De elementen uit sI moeten 30 symbolen hebben, de elementen uit s2 mo-gen maximaal 30 symbolen hebben)
2
.
2.4
.
Standaardroutines.
Buiten de standaardroutines, zoals deze in het eerste hoofdstuk beschreven
staan, kent CPS nog andere standaardroutines .. ,
ALLOCA(X) "waar" als de array X "allocated" is en "onwaar" als de
array "free" is (2.2.2.2)
EVAL(X) evalueert, indien mogelijk,een string tot een numerieke
waarde (2.2.3.1)
MIN (X 1 ,X2, . .. ) Zoekt de kleinste waarde uit Xl, X2, . . .
MAX (X I ,X2, . . . ) Zoekt de grootste waarde uit X I, X2, .. .
FLOOR (X) afronding tot geheel getal naar beneden
CEIL(X) SIGN (X)
SUBSTR (str,a,b)
RANDOM
STOP
afronding tot geheel getal naar boven
(teken van X) + I als X
>
0o
als X=
0-I als X
<
0neemt een bepaald gedeelte van een string (2.2.3.2)
geeft willekeurige (random) getallen tussen 0 en I.
Onafhankelijke randomgeneratoren kunnen verkregen worden door random verschillend te schrijven, bijv. RANDOM, random, RaNdOm
indien CPS dit statement tegenkomt, stopt hij met de
berekening totdat het commando XEQ *" thru . . .
gegeven is.
2.2.5.
Uitvoer-statements
.
In hoofdstuk I is het "put list"-statement behandeld. U zult bij het gebruik bemerken dat door het wegvallen van niet significante nullen aan het begin en het eind van het getal, een nogal rommelig geheel ontstaat.
Er is ook een statement dat een vast ingedeelde uitvoer geeft. 2.2.5.1. Put image.
Bij het "PUT IMAGE"-statement moet ergens in het programma (waar doet
er niet toe) een image gedeclareerd worden, bijv.:
IlO im: IMAGE
a=---.--
b=--- c = . . .. .- - - -
- - - -
- - ----~ - - --Een image-declaratie bestaat uit twee regels. De eerste bevat een label en het
woord "IMAGE". De tweede heeft géén regelnummer en zal letterlijk
uitge-voerd worden. Het algemene uitvoerstatement is
PUT IMAGE (a,b,c) (im)
waarbij "im" de naam van het label is, dat in de declaratie wordt gebruikt.
eps
zal nu het image van I 10 (2e regel) uittypen, met daarin ingevuld dewaarden van a, b en c; en wel a met 3 cijfers vóór en 2 cijfers na de komma.
b als geheel getal en c met een .drijvende komma, dus bv: .357'02 (dit is
0,357
*
102). Voor een drijvende komma is een serie van 5 of meer puntjes
nodig. (Zie voorbeeld 25).
2.2.6.
Procedures.Eén zeer nuttig aspect van
eps
is nog niet behandeld; namelijk demogelijk-heid om procedures te gebruiken.
Een procedure is een stuk programma, dat telkens wordt uitgevoerd als het
wordt opgeroepen. Komt er in één of meer programma's meerdere malen een
bepaalde berekening voor, en kan men dit niet ondervangen door met een
"DO"-loop te werken, dan moet men een procedure gebruiken.
eps
kent drie soorten procedures.1) de functieprocedures 2) de interne procedures 3) de externe procedures
De functieprocedures en interne procedures hoeven in
eps
niet gedeclareerdte worden, de externe procedures wel.
2.2.6.1. Functieprocedures.
Met een functieprocedure, ook wel "Iet"-procedure genoemd, kent men aan
een variabele een functie toe. De algemene vorm is:
LET f(x) =0 • • •
Deze toekenning mag overal in het programma plaats vinden. Voorbeeld 20:
Indien U in een programma veel met hyperbolische functies werkt loont het
de moeite het programma te beginnen met: 10 LET sinh (x) =0 (exp (x) - exp (-x))/2
20 LET cosh (x) =0 (exp (x)
+
exp (-x))/230 LET tanh (x) = sinh (x)/ cosh (x)
Hierdoor kunt U in Uw hele programma de hyperbolische functies op
eenzelf-de manier gebruiken als eenzelf-de normale sinus en cosinus. 2.2. 6. 2. In terne procedures.
Een interne procedure kan een hele berekening bevatten. Zij kan met of zonder "dummyparameters" gebruikt worden.
Zonder dummyparameters heeft zij de vorm: int: PROC
(hier de procedurestatements) END int
Deze procedure wordt in het programma opgeroepen met CALL int
(int is een willekeurige naam) Met dummyparameters:
int: PROC (x,y,z)
(hier de procedurestatements) END int
Deze procedure wordt opgeroepen met: CALL int (a,b,c)
In het laatste geval zullen overal in de procedurestatements voor x, y en z de waarden a, b en c ingevuld worden.
Deze twee procedurevormen zullen met twee eenvoudige voorbeelden worden toegelicht.
Voorbeeld 21:
10 j.x. Interne procedure zonder dummy para meters
.x.f
20 a = 10 30 b = 25 40 CALL som 50 PUT LIST (c) 60 som: PROC 70 c = a + b 80 END som Voorbeeld 22:
10 j *-In terne proced ure met dummyparameters.x.j 20 a = 10
30 b
=
2540 CALL som (a,b,c) 50 PUT LIST (c)
60 som: PROC (p,q,r)
70 r = p + q
80 END som
In beide voorbeelden vormen regels 10
ti
m 50 het hoofdprogramma en regels 41- - - ---~---
- -
-60 t/m 80 de procedure, die in het hoofdprogramma in regel 40 wordt
aange-roepen.
Opmerking: In CPS is alles wat tussen
1*
en*1
staat commentaar. Dit wordtalleen bij een listing afgedrukt. Bij een XEQ negeert de computer dit
commen-taar.
2.2.6.3. Externe procedures of subroutines.
Een externe procedure, ook wel subroutine genoemd, maakt geen deel uit van
het hoofdprogramma, maar is als een apart programma gesaved. Dit heeft als
voordeel, dat deze procedure slechts één keer geschreven hoeft te worden, maar toch in verschillende programma's kan worden gebruikt.
De externe procedure heeft de volgende vorm:
10 naam: PROC (a,b,c,d)
Hier komen Uw procedure-statements.
90 END naam
Deze procedure moet gesaved worden onder dezelfde naam die gebruikt wordt
in de eerste regel (hier "naam")
Het hoofdprogramma moet beginnen met:
10 DCL naam ENTRY EXT Het oproepstatement is:
CALL naam (p,q,r,s)
Ook hier worden in de subroutine aan de parameters a,b,c en d de waarden toegekend die p,q,r en s in hun hoofdprogramma hebben.
"Naam" is een willekeurige naam.
De regelnummers zijn willekeurig gekozen. Voorbeeld 23:
10 som: PROC(p,q,r)
20
!-*
dit is de externe procedure*1
30 r = p + q40 END som save (som)
10 DCL som ENTR Y EXT
20
1*
dit is het hoofdprogramma*1
30 a = 1040 b = 25
50 CALL som (a,b,c) 60 PUT LIST (c)
2.3. Voorbeelden.
Voorbeeld 24:
Dit programma berekent van een aantal getallen het gemiddelde en de varian-tie. 10 20 30 40 50 60 70 80 90 100 11: IlO 120 130 140 ISO 12: 160 170 180 190 200 210 DECLARE x(10) CONTROLLED;
PUT LIST ('berekening van gemiddelde en variantie'); PUT LIST ('aantal getallen?');
GET LIST (n);
IF n
<
2 THEN GO TO flauw; IF alloca (x) THEN FREE x; ALLOCATE x(n);GET LIST (x); som = 0; DO i=l TO n; som = som
+
xCi); END 11;gem = somin; var = 0;
DO i = I TO n;
var = var
+
(x(i) - gem)**2; END 12;PUT LIST (' gemiddelde over' ,n,' getallen =' ,gem); PUT LIST ('variantie=',l/(n -l)*var);
PUT LIST (' de getallen waren' ,x); GO TO eind;
220 flauw: PUT LIST ('flauw hoor'); 230 eind: END;
Voorbeeld 25.
Tot slot volgt nog een voorbeeld van een tamelijk uitgebreid programma, dat een functie integreert, tabelleert en grafieken van de functie zelf en van de integraal van de functie tekent.
Verklaring:
In regel 30
tlm
70 wordt een string r met 128 spaties gevormd voor het te-kenen van de grafieken. In regel 90tlm
180 wordt de functie gedeclareerd. In regel 210tlm
270 wordt de functie geïntegreerd. Regel 410tlm
440 be-palen de maximum- en minimum waarden van de functie en van de integraal (i.v.m. het "schalen" van de grafieken). In regel 500 en volgende worden de grafieken getekend. 10 20 30 4011: DECLARE q(50) CONTROLLED; DECLARE r CHAR(I29) VAR;r = ' '.
DO i = I TO 7;
- - - ---~----~~~---- ---~~~--~- ~----50 60 70 80 90 100 IlO 120 130 140 150 160 170 180 190 200 210 220 23012: 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 13: 390 400 410 420 430 440 450 460 470 44 r = rl Ir; END 11; r =
'1'1
Ir;PUT LIST ('integratieprogramma');
PUT LIST ('Hoeveel programmastappen wilt U?'); GET LIST (n);
IF allo ca (q) THEN FREE q; m = n
+ I;
ALLOCATE' q (m);
PUT LIST ('declareer nu eerst Uw functie d.m.v.'); PUT LIST (' een LET f(x) = ... statement in regel 180'); PUT LIST (' en geef daarna XEQ 180 THRU . .. '); STOP;
PUT LIST ('geef de begin- en eindwaarde van x'); GET LIST (begin, eind);
step = (eind - begin)/n; int = -f(begin)*step/2; DO i = 0 TO n; j = begin + i*step; int = int + fU)*step; q(i + I) = int - fU)*step/2; END 12; ma xii =-.IE61; minii =.1 E61; maxif =-.1 E'61; minif = .1 E 61 ; PUT LIST (' '); PUT LIST (' '); PUT LIST (' '); PUT IMAGE (l)(iml); PUT IMAGE (I) (im2); PUT IMAGE (I) (im I); DO i = 1 TO n
+
I ; j == begin T step*i; t = fU);IF t> maxif THEN maxif = t; IF t < minif THEN minif = t;
IF q(i) > maxii THEN maxii = q(i); IF q(i)
<
minii THEN minii = q(i); PUT IMAGE U,fU),q(i)) (im3); END 13;PUT LIST (' '); PUT LIST (' '); 480 490 500 510 520 530 14:
PUT LIST ('grafiek van de functiewaarden'); PUT LIST ('minimum =',minif, 'maximum =',maxif); PUT LIST (' ');
DO i = 1 TO n + I; 540 j = begin + i*step;
550 PUT LIST(substr(r,I,IOOf(maxif - minif)*fU) ·· 1)11'*');
560 END 14;
570 PUT LIST (' '); 580 PUT LIST (' ');
590 PUT LIST ('grafiek van de integraal');
600 PUT LIST ('minimum =', minii, 'maximum =', maxii); 610 PUT LIST(' ');
620 15: DO i = 1 TO n + I;
630 PUT LIST (substr(r,I,IOO/(maxii - minii)*q(i) -- 1)11'-*');
640 END 15; 650 im 1: IMAGE; 1**********1**********1**********1 660 im2: IMAGE; X f(x) int (f(x» 670 im3: IMAGE;
I.
I . . . .
I . . . .
.
.
Opmerking: .1 E 61 betekent: 0.1 x 1061 = 1060.3.1.
Foutboodschappen
Enkele veel voorkomende foutboodschappen met toelichting zijn: UNBALANCED PAREN
Er komen in het desbetreffende statement niet evenveel linker- als rechter-haakjes voor.
ILLEGAL STATEMENT De computer herkent het statement niet.
IDENTIFIER TOO LONG
Een identifier (variabele, label, etc.) mag uit niet meer dan 6 symbolen bestaan. TARGET INSIDE "DO" OR "PROC"
U mag niet van buiten een loop of procedure naar een label binnen een do-loop of procedure springen. (uit een do-do-loop springen mag wel)