|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 183680 (0x2cd80)
Types: TextFile
Names: »D51«
└─⟦1e8064b49⟧ Bits:30005867/disk07.imd Dokumenter (RCSL m.m.)
└─⟦this⟧ »D51«
Forord
Efter at have udgivet en lærebog om RC 8000 basisprogrammel, er
det ganske naturligt, at næste udgivelse i Regnecentralens lære-
bogsserie omhandler ALGOL; for ALGOL er - som bekendt - Regnecen-
tralens hovedprogrammeringssprog. Sproget har sit udgangspunkt i
ALGOL 60 rapporten, men er i meget stor udstrækning udvidet i
forhold til denne rapport.
Det betyder, at hvor ALGOL i almindelighed har ry for at være et
programmeringssprog, der er specielt velegnet til programmering
af beregningsopgaver samt et sprog, der i vide kredse kun er
kendt i forbindelse med tidsskriftsartikler, hvor sproget i stor
udstrækning anvendes ved offentliggørelse af algoritmer, så har
ALGOL i Regnecentralens udgave nået et udviklingsniveau, hvor det
er et særdeles velegnet sprog, også for administrative
opgaveløsninger.
Den her foreliggende bog beskriver den fundamentale anvendelse af
ALGOL, og den vil blive efterfulgt af yderligere en lærebog, der
vil omhandle input/output-håndtering fra ALGOL, m.v.
Bogen er skrevet af programmør Kjeld Christensen fra Handelshøj-
skolens Datacenter i Århus. Kjeld Christensen skal have megen tak
for godt og konstruktivt samarbejde i forbindelse med arbejdet på
denne bog, ligesom der skal lyde en tak til Handelshøjskolens Da-
tacenter for en positiv holdning til projektet. Bogen er tænkt
anvendt i forbindelse med Regnecentralens kursusprogram, men det
er samtidig tilstræbt, at den skal kunne læses som selvstudium.
Der er derfor i lærebogen anført løsningsforslag til opgaverne.
Det skal understreges, at denne bog er en lærebog og ikke en ma-
nual. Dvs. at bogen ikke beskriver ALGOL-sprogets samlede mulig-
heder, men tværtimod kun en begrænset og overskuelig del. Det må
derfor tilrådes, at man tidligst muligt efter studiet af bogen
tvinger sig selv til at anvende de relevante manualer i det dag-
lige arbejde, så man ikke får en for stor binding til lærebogen.
Er der forhold, hvor man er i tvivl, har man jo altid muligheden
for at gå tilbage og læse et enkelt afsnit i lærebogen.
Vi håber, at brugerne af denne bog vil vise sig at være lige så
glade for bogen, som vi på Regnecentralen er.
April 1979
A/S Regnecentralen \f
F_
ALGOL BEGIN
Første Udgave
A/S REGNECENTRALEN April 1979
Informationsafdelingen RCSL 42-i1195\f
FORFATTER: Kjeld Christensen
NØGLEORD: Lærebog til undervisningsbrug, ALGOL, BOSS, FP admini-
strativ databehandling.
KONCENTRAT: Lærebogen indgår i en serie af lærebøger i den grund-
læggende undervisning i datamatiske emneområder. Denne
lærebog er en indføring i programmeringssproget ALGOL.
Lærebøgerne bruges på RC79 i kursussammenhæng, men er
lige velegnede til selvstudium.
users ...
Copyright 1980, A/S Regnecentralen af 1979
Printed by A/S Regnecentralen af 1979, Copenhagen\f
INDHOLDSFORTEGNELSE
FORORDside 7
1 INDLEDNING 9
2 PROBLEMBESKRIVELSE12
2.1 Register15
2.1.1 Opbygning15
2.1.2 Registerorganisation17
2.2 Registerbeskrivelse18
2.2.1 Postbeskrivelse19
2.2.2 Dataliste20
2.3 Blanketbeskrivelse23
2.3.1 Positionsark23
2.3.2 Blanketindhold24
2.4 En Programmeringsopgave25
2.4.1 Opgavebeskrivelse25
3 DATAMATENS OPBYGNING32
3.1 Hardware32
3.1.1 Bestanddele32
3.1.2 Arbejdslager34
3.1.3 Baggrundslager37
3.1.4 Terminal 38
3.1.5 Læser38
3.1.6 Perforator38
3.1.7 Linjeskriver39
3.2 Software39
3.2.1 Operativsystem BOSS39
4 PROGRAMMERING43
4.1 Anvendelse af Arbejdslageret44
4.2 Beskrivelse af Handlingsforløbet51
5 BASISPROGRAMMEL60
5.1 LOGIN-Rutine60
5.2 JOB61
5.3 Jobafvikling63
5.4 Kørselsanalyse64
5.5 BOSS-kommandoer66
5.5.1 Afbrydelse af JOB66
5.5.2 Afslut Terminalbrug67
5.5.3 Tildeling af Linjenumre67
5.5.4 Editering 68
5.5.4.1 Sletning 69\f
5.5.4.2 Rettelseskommandoer side 69
5.5.5 Udskrivning 71
5.5.5.1 VERIFY 71
5.5.5.2 LIST 72
5.5.6 Jobfilhåndtering72
5.5.6.1 GET73
5.5.6.2 CLEAR73
5.5.6.3 SAVE73
5.5.7 Meddelelser fra BOSS74
5.5.7.1 NO ROOM74
5.6 FP-Kommandoer75
5.6.1 Meddelelser fra FP76
5.7 ALGOL76
5.7.1 Kald af ALGOL 79
5.8 Vejledende Kørselseksempler80
6 ALGOL84
6.1 Tegnsæt 85
6.2 Identifikator 86
6.3 Talkonstant83
6.4 Grundsymboler 89
6.4.1 Sammensatte Symboler97
6.5 Programstruktur98
6.5.1 Erklæringer 99
6.5.2 Sætninger99
6.5.2.1 Elementarsætning99
6.5.2.2 Sammensat Sætning100
6.5.2.3 Blok 101
7 ERKLÆRINGER105
7.1 Simpel Variabel 105
7.2 Variabelsæt107
7.3 Feltvariabel110
7.4 Zone 112
7.5 Procedure 113
7.6 Entydighed114
8 UDTRYK116
8.1 Aritmetisk Udtryk 116
8.2 Logisk Udtryk119
8.3 Streng Udtryk122
8.4 Flervalgsudstryk124
8.5 Tovalgsudtryk125
\f
9 SÆTNINGERside126
9.1 Ubetinget Sætning 128
9.1.1 Elementarsætning128
9.1.2 Sammensat Sætning131
9.1.3 Blok132
9.2 Valgsætning133
9.2.1 Betinget Sætning134
9.2.1.1 Udskriftsprogrammet137
9.2.2 CASE Sætning138
9.2.2.1 Anvendelse af CASE140
9.3 Løkke-Sætning146
9.3.1 FOR STEP Sætning146
9.3.2 WHILE-Sætning149
9.3.3 REPEAT-Sætning150
9.3.4 FOR Sætninger151
9.3.4.1 FOR DO152
9.3.4.2 FOR STEP UNTIL152
9.3.4.3 FOR WHILE152
10 TEGNVIS INDLÆSNING OG UDSKRIVNING153
10.1 Integer Procedure READCHAR153
10.2 Tegnstreng154
10.3 Integer Procedure READ155
10.4 Integer Procedure WRITE157
11 ANVENDELSE AF BAGGRUNDSLAGER161
11.1 Procedure OPEN161
11.2 Procedure CLOSE162
11.3 Postvis Læsning og Skrivning163
11.3.1 Integer Procedure INVAR163
11.3.2 Integer Procedure OUTVAR164
12 KOMMENTAR167
12.1 COMMENT167
12.2 END167
12.3 Kommentar Parentes168
13 PROCEDURER 169
13.1 Opbygning 171
13.2 Procedureerklæring 172
13.3 Procedurekald 172
13.4 Anvendelse 172
\f
14 TOP DOWN DESIGNside177
14.1 Opgaveformulering 177
14.2 Første Trin 178
14.3 Andet Trin 179
14.4 Tredje Trin181
14.5 Fjerde Trin 182
14.5.1 Beregn gruppe 183
14.5.2 Beregn pct 184
14.5.3 Afslut gruppe 185
14.5.5 Initiering 186
14.5.6 Behandling 186
14.5.7 Afslutning 187
14.6 Det Sidste Trin 188
15 VEJLEDENDE LØSNINGER192
APPENDICES
A. TEGNVÆRDIER205
B. UDVALGTE MEDDELELSER FRA BOSS208
C. UDVALGTE MEDDELELSER FRA FP212
D. UDVALGTE MEDDELELSER FRA ALGOL213
E. UDVALGTE MEDDELELSER FRA DET KØRENDE PROGRAM216
INDEX218
\f
F_ 1 INDLEDNING
Sigtet med denne bog er at give en beskrivelse af programmerings-
sproget ALGOL samt at vise anvendelsen af det specielt med hen-
blik på løsning af administrative opgaver. Som titlen ALGOL BEGIN
lader antyde, henvender bogen sig i første række til læsere uden
programmeringserfaring i ALGOL.
I fremstillingen introduceres de nødvendige begreber på en måde,
så selv læsere uden nogen form for EDB-erfaring trygt kan give
sig i kast med læsningen. Det indebærer naturligvis, at læsere
med programmeringserfaring må indstille sig på en smule repeti-
tion, da de helt basale termer og de grundlæggende beskrivelses-
værktøjer nødvendigvis må introduceres før den egentlige beskri-
velse og anvendelse af sproget.
Bogen tager udgangspunkt i et typisk, men noget forenkelt admini-
strativt problem, og med det som referenceramme indføres forskel-
lige grundlæggende termer og nogle elementære beskrivelsesmeto-
der. Begreberne, der herved behandles, står i nær relation til
det udvalgte eksempel, da det ikke er hensigten at opstille en
fuldstændig EDB-terminologi, men udelukkende at introducere nogle
få begreber, der nødvendigvis må være bekendt, før et programme-
ringsarbejde kan påbegyndes.
Kendskab til de vigtigste principper i datamatens opbygning og
virkemåde er ligeledes en forudsætning, for at programmerings-
arbejdet kan påbegyndes, I kapitel 3 behandles dette emne. Også
denne behandling er ret summarisk, og den tjener blot til at
skabe det rette grundlag for behandlingen af bogens hovedemne.
I kapitel 4 benyttes de indhøstede erfaringer fra kapitel 2 og 3
ved udarbejdelsen af bogens første ALGOL-program. Et første kend-
skab til grundstrukturen i så vel sproget som i programmer er-
hverves herved.
Til programmeringsarbejdet er der altid knyttet en indkørings-\f
fase, hvor det konstruerede program afluses for syntaktiske og
logiske fejl og herved bringes til at fungere efter hensigten.
Dette arbejde kræver adgang til en datamat, og i kapitel 6 findes
derfor en vejledning i betjening af datamaten udelukkende med
henblik på indkøringen af bogen øvelsesopgaver. Det forudsættes,
at datamaten er udstyret med operativsystem BOSS, hvilket er
almindeligt for RC 4000 og RC 8000 datamater.
De løse tråde samles i de følgende kapitler. Kapitel 7 indeholder
en mere stringent beskrivelse af ALGOLs bestanddele. Denne be-
skrivelse er ikke udtømmende, og den omhandler kun de vigtigste
sprogelementer.
Princippet om kun at behandle de vigtigste begreber fastholdes i
de følgende kapitler. I disse kapitler findes syntaksbeskrivelser
for tilladte konstruktioner, og en ledsagende semantisk beskri-
velse redegør for meningsindholdet. Kapitlerne omhandler erklæ-
ringer, udtryk, sætninger, indlæsning, udskrivning og seriel an-
vendelse af baggrundslageret. Ledsagende opgaver giver mulighed
for at opnå fortrolighed med de nye begreber.
Kapitel 13 giver en meget kort introduktion af procedurebegrebet,
og bogen afrundes i kapitel 14 med en kort introduktion til pro-
gramdesign eksemplificeret ved en konkret opgave.
NOTATION I bogen anvendes en notation, der er adopteret fra AL-
GOL-manualen ref.1. Følgende symboler bør kendes:
::= Symbolet kaldes et definerende lighedstegn, og det an-
vendes ved definitioner. Til venstre for symbolet an-
føres navnet på det begreb, der bliver defineret, og
til højre anføres selve definitionen.
E_k_s_._
<ciffer' ::= 0 1 2 3 4 5 6 7 8 9
Et ciffer defineres til at kunne være et af tallene fra
0 til 9. \f
Symbolet anvendes som skilletegn mellem flere mulighe-
der. Jvf. forrige eksempel.
< ' Symbolet omkranser en forklarende tekst.
E_k_s_._
<tal' ::= <heltal' <reelt tal'
Symbolet kan omslutte en liste over flere muligheder.
E_k_s_._
<heltal'
<tal' ::= <reelt tal'
En klamme kan forsynes med tal til angivelse af, hvor
mange gange de enkelte elementer må optræde.
T_ E_k_s_._
M_m_m_ + 1 14
<heltal' ::= <ciffer'
P_p_p_ - 0 1
Et heltal kan evt. imdledes med et fortegn. Herefter
&_ kan følge op til 14 cifre, dog mindst 1.
\f
F_ 2 PROBLEMBESKRIVELSE
Ved enhver form for problemløsning må selve problemet være be-
skrevet på en måde, så alle de nødvendige oplysninger foreligger.
Får man til opgave at beregne den effektive rente af et pantebrev,
må kursen og rentefoden samtidig angives, da disse størrelser
indgår i beregningsformlen:
Effektiv rente = rentefod x 100/kurs
Beregningerne kan foretages manuelt eller maskinelt efter ønske.
Vælges den sidste metode, skal der udarbejdes et program, der kan
bringe datamaten til at udføre den simple beregning. I den anled-
ning stilles der yderligere krav til problembeskrivelsen, idet et
program til løsning af opgaven naturligt består af følgende 3 dele:
1. Indlæsning af kursen og rentefoden.
2. Beregning af den effektive rente.
3. Udskrivning af resultatet.
For at indlæsningen af kursen og rentefoden kan forløbe korrekt,
må der på forhånd være vedtaget, i hvilken rækkefølge disse
størrelser skal forekomme, og på hvilken måde de skal anføres, da
det er nødvendigt at vide, om størrelserne er angivet som heltal
eller decimaltal. I en såkaldt inddatabeskrivelse må sådanne
forhold være afklaret. Brugere af programmet behøver også ind-
databeskrivelsen for at kunne anføre størrelserne, der indgår i
beregningen på korrekt måde. Beregningen giver ingen særlige
problemer, når beregningsformlen er kendt.
Resultatet af beregningen må, for at man kan have gavn af det,
udskrives på læsbar form. Måden, det skal gøres på, skal også
være beskrevet, da et tal kan udskrives på mange forskellige
måder. Antallet af decimaler bør f. eks. være oplyst.
En detailbeskrivelse af problemet vedrørende beregning af den
effektive rente kan gennemføres uden specielle beskrivelses-\f
værktøjer. Anderledes forholder det sig med de fleste admini-
strative problemer, hvor såvel inddata- som uddatastrukturerne
normalt er meget komplekse.
Betragtes et så simpelt problem som udskrivning af en liste over
samtlige artikler i et vareregister, stilles allerede større krav
til inddata- og uddatabeskrivelsen. Den nødvendige specifika-
tionsgrad afhænger af, om problemet skal løses manuelt eller
maskinelt.
Når vareregisteret foreligger på kartotekskort, kan listen over
artiklerne fremstilles manuelt, og en betroet medarbejder kan
løse opgaven på trods af den løse problemformulering. Overdrages
opgaven derimod til en mindre erfaren medarbejder, kræves en mere
præcis beskrivelse af problemet, da der ellers i forbindelse med
arbejdet vil opstå problemer, som den mindre erfarne medarbejder
ikke selvstændigt kan løse. Følgende problemer kan nævnes:
Hvilke oplysninger skal skrives på listen.
Hvor findes de ønskede oplysninger i kartoteket.
Et udkast til listens udformning afklarer det første problem.
Udkastet kan f. eks. udformes således:
F_i_g_._ _2_._1_
T_ A R T I K E L O V E R S I G T
V_A_R_E_N_R_ N_A_V_N_ V_A_R_E_N_R_ N_A_V_N_
1 CPU 7 Ferritlager
17 Linjeskriver 1293 Strimmelhuller
2047 Strimmellæser 3011 Terminal
3001 Pladelager 3500 Printkort
&_
\f
En kopi af et kartotekskort med de relevante oplysninger
indrammet afklarer det andet problem:
T_ F_i_g_._ _2_._2_
VARENR = 2047
NAVN = STRIMMELLÆSER
BEHOLDNING = 3000 STK.
SALG
JANUAR 200 MAJ 375 SEPTEMBER 423
FEBRUAR 10 JUNI 3000 OKTOBER
MARTS 119 JULI 25 NOVEMBER
APRIL 517 AUGUST 7 DECEMBER
&_
For en nyansat medarbejder vil problembeskrivelsen stadig være
utilstrækkelig, og problemer af følgende karakter vil opstå:
Hvor mange linjer skal der skrives pr. side.
Hvor meget plads skal der afsættes til et varenr.
Hvor meget plads kræver et varenavn.
Hvor befinder varekartoteket sig.
Hvordan er kartotekskortene ordnet.
Også disse problemer kan afklares med en forbedret problem-
beskrivelse. Et udkast til artikeloversigten kan udformes på en
måde, så det bliver klart, hvor meget de enkelte oplysninger må
fylde, og der kan anføres hvor mange linjer, der maksimalt må
forekomme på en side. Selve kartoteket kan også beskrives mere
udførligt med oplysning om placering, indhold og ordning.
-
Når vareregisteret er lagret maskinelt, må udskrivning af artikel
oversigten ligeledes foretages maskinelt, og herved skærpes
kravene til problembeskrivelsen yderligere. Datamaten, der skal
udføre arbejdet, besidder ikke den mindste smule intelligens, og
alle problemer må være afklaret, før opgaven overlades til den.
Thi kun ved at instruere den om (programmere), hvad den skal gøre
i alle tænkelige situationer, kan den bringes til at udføre
arbejdet. \f
I kapitel 4 behandles selve programmeringsarbejdet. Grundlaget
for gennemførelsen af programmeringen er en detaljeret problem-
beskrivelse i form af en inddata- og uddatabeskrivelse. Inddata
til udskriftsproblemet er vareregistreret, og i næste afsnit
behandles registerbegrebet generelt, og en hensigtsmæssig
beskrivelsesmetode vises. Uddata i form af blanketter kan, som
det vises i afsnit 2.2, beskrives ved hjælp af positionsark.
2.1 Register
T_ 2.1.1 O_p_b_y_g_n_i_n_g_
Det omtalte vareregister indeholder oplysninger om forskellige
varer, og for at det kan bruges fornuftigt, er det nødvendigt, at
oplysningerne altid er ajourført, så registeret afbilder
virkeligheden korrekt. Hver gang, der sker afgang eller tilgang
til varelageret, skal det registreres i vareregisteret.
&_ Oplysningerne i registeret skal derfor foreligge på en måde, så
en ændring bekvemt kan foretages. Dette gælder i lige så høj grad
for registre bestående af kartotekskort som for maskineltlagrede
registre.
T_
&_ DATA Oplysninger, der foreligger på en form, så de kan
underkastes en behandling, kaldes data.
T_
FELT Vareregisteret er altså en samling data vedrørende
varer. På kartotekskortene (fig. 2.1) er der reserveret
&_ en fast plads til hver oplysning. En plads kaldes sæd-
vanligvis et felt. Det er almindeligt at anvende ordene
felt og oplysning i flæng, således at der begrebsmæssigt
ikke skelnes mellem pladsen og selve oplysningen.
T_
POST Til hver vare hører et kartotekskort, der rummer alle
relevante oplysninger om varen. Oplysningerne om
varerne er herved organiseret på en måde, så logisk
&_ sammenhængende data er samlet. En sådan logisk samling
af data kaldes en post. \f
T_ NØGLEFELT Til etablering af en entydig korrespondance mellem en
post og det objekt, som den beskriver, findes et
specielt felt. Dette felt kaldes nøglefeltet eller
postnummeret efter behag. I vareregisteret forbinder
&_ varenummeret posten med varen.
Eks. 2.1 Et CPR-nummer forbinder på entydig måde en
post i CPR-registeret med en person.
Nøglefeltets specielle betydning medfører, at det er
meningsløst at ændre netop dette felt.
T_ REGISTER Samlingen af kartotekskort, der udgør vareregisteret,
kan også betragtes som en samling ensartede poster. En
rimelig registerdefinition, der også er anvendelig i
&_ forbindelse med maskineltlagrede registre, kan nu
formuleres.
Et register er en samling poster.
T_ TERMER Mange af de begreber, der anvendes i forbindelse med
databehandling, er overtaget fra engelsk, og forskellige
danske oversættelser benyttes, lige som flere af de
engelske gloser er optaget i fagsproget. Nedenstående
&_ liste viser forskellige hyppigt anvendte termer.
T_REGISTER POST FELT NØGLEFELT
Fil Individ Oplysning Postnummer
&_ File Record Field Record number
Sammenhængen mellem de forskellige begreber er yderligere anskue-
liggjort i fig. 2.3. Der ses, at et register består af en samling
ensartede poster. Hver post rummer et antal felter, og hvert felt
indeholder en oplysning. \f
T_ F_i_g_._ _2_._3_
R_E_G_I_S_T_E_R_ P_O_S_T_ F_E_L_T_
POST FELT 1 OPLYSNING
1
FELT 2
FELT 3
POST
2
&_ POST
3
T_
2.1.2 R_e_g_i_s_t_e_r_o_r_g_a_n_i_s_a_t_i_o_n_
Kortene, der udgør vareregisteret, kan opbevares i forskellig
&_ orden, og den valgte bestemmer registerets organisation. Følgende
muligheder synes lige anvendelige:
Opbevaring i stigende varenummerorden.
Opbevaring i alfabetisk rækkefølge.
I valget af organisationsform er det afgørende at tilgodese de
hyppigste anvendelser af registeret, da organisationsformen
bestemmer de søgemetoder, der må anvendes, når registeret skal
bruges. Eks. 2.2 illustrerer dette.
T_
E_k_s_._ _2_._2_ Antag, at kortene i vareregisteret er ordnet alfabetisk
efter varenavnet, og at artikeloversigten ønskes ud-
skrevet i stigende varenummerorden. Det er indlysende,
&_ at kortenes sorteringsorden besværliggør arbejdet med
at skrive artikeloversigten.
\f
Til maskineltlagrede registre er der udviklet en række forskellige
lagringsmetoder, der hver især kan tilgodese forskellige anvendel-
ser. Det ligger uden for denne bogs rammer at behandle disse for-
skellige metoder, og i bogen anvendes kun serielle registre.
T_SERIEL I et serielt register er posterne lagret i postnummer-
orden, sædvanligvis stigende. Søgning i registeret kan
kun foregå ved læsning af posterne, startende med den
første post og sluttende med den ønskede eller den
&_ sidste post i registeret.
T_ SLUT- Det kan være vanskeligt i maskineltlagrede registre at
POST afgøre, hvornår den sidste post er fundet, thi posterne
er ikke synlige som kartotekskortene. Af denne grund
anbringes altid en speciel slutpost, der udelukkende
har til opgave at fortælle, at der ikke findes flere
poster.
T_ 2.2 REGISTERBESKRIVELSE
For at man kan arbejde med et register, må man vide, hvordan det
er organiseret, og hvordan posterne er opbygget. Er man i færd
med at opbygge et nyt system, skal registerstrukturen beskrives,
&_da man meget hurtigt glemmer detaljer, og da brugerne også har
behov for kendskab til systemet. Manglende kendskab til et system
resulterer altid i mange kostbare misforståelser.
Betydningen af at have en god beskrivelse fremgår klart af den
omfattende faglitteratur, der findes om emnet. I faglitteraturen
kan man finde anvisninger på, hvorledes en god register-
beskrivelse kan udarbejdes. For at sikre at alle relevante
oplysninger beskrives, er der udarbejdet en række blanketter, der
skal udfyldes. En rimelig god beskrivelse opstår så ved, at man
udfylder et passende antal blanketter. Har man et stort system,
må man udfylde mange blanketter, og har man et mindre system, kan
man nøjes med at udfylde færre.
\f
For små systemer kan en god registerbeskrivelse udformes ved
hjælp af to forskellige blanketter. Poster beskrives ved hjælp af
en postbeskrivelsesblanket, og samtlige data beskrives i en så-
kaldt dataliste. Fælles for disse blanketter er, at de indledes
med et hoved, der skal udfyldes, så man kan se hvem, der har ud-
fyldt blanketten, hvornår det er sket, og i hvilke sammenhænge
blanketten indgår.
2.2.1 P_o_s_t_b_e_s_k_r_i_v_e_l_s_e_
Denne blanket anvendes til at beskrive poster. Felterne i en post
nummereres, og for hvert felt anføres:
. Feltnr.
. ordnr.
. antal pos.
. Feltnavn.
&_ . klasse
. Reference til datalisten.
. Evt. en bemærkning
Felterne i en post nummereres 1, 2, 3 etc.
Ordnr. angiver, hvor feltet er placeret i posten (feltadresse). I
maskineltlagrede registre kan en feltadresse entydigt bestemmes
med et heltal. Dette belyses yderligere i kapitel 4.
Antal pos. angiver antal halvord feltet optager. Dette belyses
yderligere i kapitel 4.
Et felt navngives altid med et beskrivende navn, så det umiddel-
bart fremgår, hvad feltet anvendes til.
Til hvert felt anføres en reference til datalisten, hvor feltet
er detaljeret beskrevet.
Hvis særlige forhold gør sig gældende, udfyldes en bemærkning
herom.
Klasse beskriver feltets type f.eks. integer, long. Dette belyses
yderligere i kapitel 4. \f
T_F_i_g_._ _2_._4_
&_
T_
&_
2.2.2 D_a_t_a_l_i_s_t_e_
På denne blanket beskrives samtlige data, der findes i systemet.
For hvert datum anføres:
. Datanavn.
. Et forkortet navn
. Datatype.
. Værdisæt.
. Datadefinition.
\f
Et datum navngives, og man bør altid anvende et beskrivende navn,
så det umiddelbart af datanavnet fremgår, hvad oplysningen drejer
sig om.
Et beskrivende navn kan blive temmelig langt, og af hensyn til
personer, der er fortrolige med systemet, anføres et forkortet
navn, som de kan bruge.
Der skelnes mellem to datatyper, nemlig numeriske oplysninger
(tal) og alfanumeriske oplysninger (bogstaver og cifre). Det er
væsentligt at skelne mellem disse datatyper, da behandlingen af
dem er forskellige i datamaten.
Oplysninger om værdisættet er ligeledes af stor betydning, da det
er bestemmende for den plads, der kræves til lagring i datamaten
og ved udskrivning.
I datadefinitionen anføres en udtømmende beskrivelse af oplysnin-
ger.
\f
F_ F_i_g_u_r_._ _2_._5_
\f
F_ 2.3 Blanketbeskrivelse
Til beskrivelse af uddata hører en grafisk beskrivelse og en
indholdsbeskrivelse af blanketten.
2.3.1 P_o_s_i_t_i_o_n_s_a_r_k_
På et positionsark indtegnes den ønskede blanket, og det er
muligt at se, hvor hvert enkelt oplysning skal udskrives, og hvor
meget plads en oplysning må optage.
F_i_g_u_r_ _2_._6_ \f
F_ 2.3.2 B_l_a_n_k_e_t_i_n_d_h_o_l_d_._
Denne blanket anvendes til beskrivelse af blanketter. Hver op-
lysning nummereres, navngives og der anføres en reference til
datalisten. En supplerende bemærkning kan evt. anføres.
F_i_g_u_r_ _2_._7_
\f
F_ 2.4 En Programmeringsopgave
Antag, at det tidligere omtalte vareregister befinder sig på en
RC 8000 datamat, og at artikeloversigten ønskes. Til det formål
skal der udarbejdes et ALGOL-program. Den resterende del af dette
kapitel rummer en detaljeret problembeskrivelse.
Løsning af opgaven kræver kendskab til datamatens opbygning og
virkemåde, og dette emne er derfor genstand for en behandling i
kapitel 3, før den egentlige problemløsning kan påbegyndes i
kapitel 4.
2.4.1 O_p_g_a_v_e_ _b_e_s_k_r_i_v_e_l_s_e_._
På de følgende sider er problemet beskrevet i detaljer ved hjælp
af de 4 tidligere omtalte blanketter. Selve vareregisteret, der
er serielt lagret, er beskrevet ved hjælp af en postbeskrivelses-
blanket og en dataliste. Artikeloversigten er indtegnet på et
positionsark, og hvert felt er beskrevet særskilt på den dertil
beregnede blankettype.
\f
F_ POSTBESKRIVELSE
\f
F_ DATALISTE\f
F_ DATALISTE\f
F_ DATALISTE\f
F_ POSITIONSARK\f
F_ BLANKETINDHOLD\f
F_ 3 DATAMATENS OPBYGNING
For at man kan udnytte datamaten, er det nødvendigt at kende en
smule til dens virkemåde og dens bestanddele. Dette er nødvendigt
for såvel programmering som indkøring af programmer.
3.1 Hardware
De fysiske komponenter såsom ledninger og transistorer kaldes
hardware.
T_3.1.1 B_e_s_t_a_n_d_d_e_l_e_._
F_i_g_u_r_ _3_._1_
BAGGRUNDSLAGER
Høj
LÆSER ARBEJDSLAGER PRINTER
Mellem TERMINAL
TERMINAL PERFORATOR
Lav
&_Søjle 1Søjle 2 Søjle 3\f
På det skematiske billede figur 3.1 af en datamat ses, at der til
arbejdslageret er tilknyttet en række enheder, som det er muligt
at overføre data til eller fra. Pilene viser den mulige retning.
Fra læseren i søjle 1 kan der således overføres data til arbejds-
lageret, mens der kan overføres data i begge retninger mellem
arbejdslageret og enhederne i søjle 2. Til enhederne i søjle 3
kan der kun overføres data fra arbejdslageret og ikke den mod-
satte vej. Betragtes den vandrette opdeling af figuren, ses en
opdeling af enhederne i grupper svarende til den hastighed, hvor-
med det er muligt at overføre data. Man skelner sædvanligvis
mellem lav, mellem og høj hastighed.
CENTRAL Styringen af datamatens aktivitet foretages af den
ENHED centrale enhed (C_entral P_rocessor U_nit). CPU>en som den
oftest benævnes, er ikke afbildet i figur 3.1.
KONFIGU- Arbejdslagerets størrelse og antallet af enheder, der
RATION er tilsluttet, bestemmer datamatens konfiguration. Kon-
figurationen kan ændres i takt med behovet, og figur
3.1 viser således blot en mulig konfiguration.
T_3.1.2 A_r_b_e_j_d_s_l_a_g_e_r_._
I arbejdslageret, der ofte kaldes primærlager, gemmes såvel data,
der skal behandles, som programmer, der styrer behandlingen. Ved
et program forstås en forskrift, der angiver, hvorledes behand-
&_ lingen skal foregå. I kapitel 4 beskrives hvorledes et program
kan udarbejdes. Et program skal befinde sig i arbejdslageret for
at kunne udføres. Data, der er genstand for behandling, skal li-
geledes befinde sig i arbejdslageret.
SOFTWARE Når datamaten arbejder, læses en maskininstruktion ad
gangen fra arbejdslageret, og instruktionen udføres. I
arbejdslageret kan der være flere programmer og tilhø-
rende data samtidig (figur 3.2). Man siger, at datama-
ten er multiprogrammeret.
\f
T_F_i_g_u_r_ _3_._2_
ARBEJDSLAGER
PROGRAM A
DATA A
PROGRAM B
&_ DATA B
STYRE- CPU>en er ikke ene om at styre datamaten, thi der fin-
PROGRAM des også et styreprogram, der tager del i dette. Et så-
dant styreprogram kaldes et operativsystem.
T_ F_i_g_u_r_ _3_._5_
ARBEJDSLAGER
STYREPROGRAM
PROGRAM A
DATA A
SROGRAM B
DATA B
&_
Da styrefunktionen hele tiden skal varetages, Så styreprogrammet
permanent være aktivt i arbejdslageret i modsætning til andre
programmeS, der kun er aktive i arbejdslageret i den begrænsede
tid, det tager at udføre det enkelte program.
DATA- Når der skal overføres data mellem arbejdslageret og en
TRANSPORT ydre enhed, anvendes en såkaldt zonebuffer. Ved over-
førsel fra en enhed til arbejdslageret placeres data i\f
zonebufferen, hvor de er tilgængelige for en behand-
ling. En zonebuffer er således en del af det arbejds-
lager, der rummer data til et program. Ved overførsel
fra arbejdslageret til en enhed placeres data, der skal
overføres, i en zonebuffer, hvorfra overførslen til den
pågældende enhed kan foregå.
T_ F_i_g_u_r_ _3_._5_
ARBEJDSLAGER
PROGRAM
DATA
ZONE
&_
Grunden til al den aktivitet er dels, at arbejdslageret
sædvanligvis er ret begrænset, så der kun er plads til data, der
er under behandling, og dels at oplysninger, der befinder sig i
arbejdslageret, går tabt, når datamaten slukkes, f.eks. ved
strømsvigt.
ORD Arbejdslageret er inddelt i en mængde lige store dele,
som kaldes ord. Et ord er netop den størrelse arbejds-
lager, som kan indeholde en maskininstruktion.
MASKIN En maskininstruktion er en ordre, som datamaten kan
INSTRUK- tolke og udføre. Et program består således af en række
TION maskininstruktioner, og når programmet afvikles, ud-
føres de enkelte instruktioner i rækkefølge.
I arbejdslageret kan også indlægges data. Da alle data ikke fyl-
der lige meget, kan data fylde et halvord, et helord eller et
dobbeltord, afhængig af hvilken datatype, der skal lagres.
\f
T_ Pladskravet fremgår af nedenstående tabel.
ORD ANVENDELSE VÆRDIOMRÅDE
Halv Heltal min -2048
max 2047
Hel Heltal min-8388608
max8388607
Maskin-
instruktion
DobbeltHeltalmin -140737488355328
max 140737488355327
Alfanumerisk6 tegn
Decimaltalmin -10UU616DD
&_ max10UU616DD
Med et tegn menes et bogstav, et ciffer eller et af de øvrige
symboler, der findes på et skrivemaskinetastatur.
T_ 3.1.3 B_a_g_g_r_u_n_d_s_l_a_g_e_r_._
På baggrundslageret gemmes såvel data som progrSmmer. Der findes
forskellige typer baggrundslagre. Fælles for alle er, at dataene
skrivesSpå et magnetiserbart materiale, så oplysningerne bevares,
&_ også selv om datamaten slukkes. En oplysning slettSs derfor kun,
når den overskrives af en ny. Da behandlingen af data som bekendt
sker i arbejdslageret, foregår der mange transporter mellem ar-
bejdslageret og baggrundslageret. Forbindelsen udgøres af et high
speed kabel, så den mindst mulige tid bruges til datatransporter-
ne.
\f
T_3.1.4 T_e_r_m_i_n_a_l_._
Terminaler kan anvendes både til udskrivning og indtastning. Ind-
tastning sker ved hjælp af et almindeligt skrivemaskinetastatur.
&_ Uddata skrives på papir eller på en skærm (display) afhængig af
terminaltypen. En terminal kan være tilkoblet med en fast ledning
eller via telefonnettet. Overførselshastigheden er bestemt af ter-
minaltypen og tilkoblingen.
T_3.1.5 L_æ_s_e_r_._
Datamaten kan være udstyret med såvel en strimmel- som en hul-
kortlæser. Indlæsning via en af disse enheder anvendes sædvanlig-
vis i forbindelse med større datamængder. Det kan f.eks. dreje
sig om ændringsdata, der er hullet på almindeligt registrerings-
&_ udstyr.
T_ F_i_g_u_r_ _3_._5_
&_
Der findes forskellige hulkoder for såvel kort som strimler.
Strimlen, der er vist i figur 3.5, er hullet i flexowriterkode.
T_3.1.6 P_e_r_f_o_r_a_t_o_r_._
Data og programmer, der er lagret i datamaten, kan hulles på en
strimmel ved hjælp af perforatoren. Hulningen foregår efter ønske
&_ med en af de forskellige hulkoder.
T_
3.1.7 L_i_n_j_e_s_k_r_i_v_e_r_._
En meget stor del af administrativ databehandling består i ud-
skrivning af registeroplysninger på forskellige måder. Materia-
let, der udskrives, er ofte ganske omfattende, og udskrivning på
&_ en terminal bliver alt for tidskrævende. På linjeskriveren, der\f
oftest benævnes printer, udskrives en linje ad gangen, og en
ganske god hastighed opnås herved.
T_3.2 Software
Programmer kaldes software. Software omfatter både styreprogram-
met og de øvrige hjælpeprogrammer, der leveres sammen med data-
maten. Også selvudarbejdede programmer (applikationsprogrammer)
benævnes software.
I afsnit 3.2.1 behandles de grundlæggende principper for anvendel-
sen af styreprogrammet og dermed for anvendelsen af datamaten.
Dette uddybes senere i kapitel 5 i en mere målrettet fremstilling,
der udelukkende sigter mod at vise, hvorledes datamaten skal be-
tjenes for at kunne indkøre øvelsesprogrammer.
T_3.2.1 O_p_e_r_a_t_i_v_s_y_s_t_e_m_ _B_O_S_S_._
Datamaten, der tænkes anvendt til indkøring af øvelsesopgaverne,
forventes at være udstyret med styreprogrammet BOSS. BOSS vare-
tager i datamaten opgaver, der på en måde kan sammenlignes med de
&_ opgaver, en bibliotekar varetager på et bibliotek.
En bibliotekar udlåner bøger til lånere med lånerkort. Hvis der
er flere lånere, der ønsker at låne den samme bog, bestemmer bib-
liotekaren, i hvilken rækkefølge lånerne kan låne bogen. Når et
udlån har fundet sted, og bogen ikke er leveret tilbage til ti-
den, må bibliotekaren igen gribe ind og sørge for, at bogen bli-
ver hjemkaldt. Ud over at varetage disse styrefunktioner må bib-
liotekaren yde en del rådgivning, når der sker henvendelse her-
om.
Udlånet af datamatens ressourcer administreres af operativsyste-
met BOSS. Ressourcerne, der kan udlånes, er de forskellige en-
heder, der er vist på figur 3.1. Skal man køre et program, må man
låne de forskellige enheder, man har behov for til udskrivning og
lignende. Anvendelse af datamaten kræver i lighed med boglånet,
at der er erhvervet tilladelse.
\f
BOSS har til sin rådighed et lille kartotek over personer, der
har lov til at anvende maskinen, samt en fortegnelse over kode-
ord, som skal tilkendegives, før tilladelsen gives. Afviklings-
rækkefølgen af de forskellige opgaver, der stilles datamaten,
bestemmes af BOSS. Overskrider en bruger sin køretid, griber BOSS
ind og hjemkalder øjeblikkeligt alle de udlånte ressourcer, hvil-
ket er ensbetydende med, at kørslen afbrydes. Der kan stilles
forespørgsler til BOSS vedrørende datamatens aktivitet.
T_ O_p_g_a_v_e_ _3_._1_
Nævn forskellige ressourcer, der administreres af
&_ operativsystemet.
T_ DATA Operativsystemet udfører også en del servicevirksomhed.
TRANSPORT Det har en særlig vigtig opgave i at besørge alle da-
tatransporter mellem arbejdslageret og de øvrige en-
heder. Vi husker, at data, der skulle sendes til en
&_ ydre enhed, skulle placeres i en zonebuffer, hvorefter
operativsystemet sørgede for den videre befordring til
det rigtige sted. De forskellige steder, hvortil data
kan sendes, angives ved navne. Når stedet befinder sig
på bagrundslageret, siges navnet at referere til et
OMRÅDE område.
T_ BAG- En bruger kan låne en del af baggrundslageret. Bruge-
GRUNDS- rens del kan bestå af et eller flere områder, der navn-
&_ LAGER gives individuelt.
T_ F_i_g_u_r_ _3_._6_
BRUGER A
OMRÅDE 1 OMRÅDE 2
LEDIG PLADS
OMRÅDE 3 OMRÅDE 4
&_ BRUGER B
Figur 3.6 viser to forskellige brugeres anvendelse af
baggrundslageret, og der ses, at der er ledig kapacitet\f
T_ OMRÅDE- Et navn må højst bestå af 11 tegn. Tegnene kan være
NAVN bogstaver eller cifre. Dog skal det første altid være
&_ et bogstav.
T_ O_p_g_a_v_e_ _3_._2_
Hvilke af de følgende navne er lovlige?
lagerregister
lagerreg
varereg
a2
7b
a162:
&_ abe kat
T_ SEGMENT Områder kan have forskellig størrelse, og størrelsen
angives i segmenter. Et segment kan rumme 128 dobbelt-
&_ ord.
T_ BLOK Det er således, at overførsel mellem arbejdslageret og
baggrundslageret sker i blokke, der består af et helt
antal segmenter. Blokstørrelsen bestemmes af zonebuf-
&_ ferens størrelse.
Da der altid sendes et helt antal dobbeltord ad gangen til et
område, består et område af en ubrudt streng af dobbeltord. I
specielle tilfælde indeholder ordene udelukkende tegn, og området
består da af en tegnstreng.
T_ DOKUMENT En streng af dobbeltord kaldes et dokument. Dokumenter
er forsynet med navne, der underkastet samme regler som
&_ områdenavne.
T_ E_k_s_._ _3_._1_
På papir i printeren skrives en streng af tegn, og det
&_ kaldes et dokument. \f
En hulstrimmel består af en tegnstreng, og den kaldes
et dokument.
Et område er ligeledes et dokument.
T_ O_p_g_a_v_e_ _3_._3_
Til et område på baggrundslageret ønskes der overført
data. Hvilke af følgende blokstørrelser kan anvendes?
&_ 128, 256, 24, 368, 512, 917.
\f
T_ PROGRAM- Områder kan indeholde mange forskellige oplysninger. Et
NAVN område kan måske indeholde et personaleregister eller
måske indeholde et program. Reference til områder sker
altid ved hjælp af områdenavnet. Når der er lagret et
program i et område, kaldes områdenavnet for program-
navnet.
\f
F_ 4 PROGRAMMERING
Grundlaget for løsning af den i kapitel 2 udformede udskriftsop-
gave er nu tilvejebragt. Tilbage er at udtrykke problemløsningen
på en måde, så datamaten kan løse opgaven. Dette kan gøres i AL-
GOL, og det ville være naturligt på dette sted i fremstillingen
at bringe en detaljeret sprogbeskrivelse. En sådan sprogbeskri-
velse er imidlertid ret svært tilgængelig, og i fremstillingen er
det derfor valgt at introducere de nødvendige sprogelementer i
takt med behovet herfor i problemløsningen. Med denne metode
bliver fremstillingen mindre formel og herved mindre udtømmende,
men det sker i håbet om, at stoffet herved bliver lettere til-
gængeligt.
Der er mange detaljer i udskriften fig. 2.1, der besværliggør op-
gaveløsningen, og lad os i denne første tilnærmelse reducere kra-
vene, så der blot skal udskrives en artikeloversigt bestående af
varenummer og varenavn som vist i fig. 4.1
T_ F_i_g_u_r_ _4_._1_
1 CPU
7 Ferritlager
17 Linjeskriver
1293 Strimmelhuller
2047 Strimmellæser
3011 Terminal
3101 Pladelager
&_ 3300 Printkort
T_ PROGRAM Opgaven er nu at udarbejde en forskrift, der kan for-
tælle datamaten, hvad den skal gøre. En sådan forskrift
kaldes et program, og den skal i mindste detalje be-
skrive følgende:
. Programmets anvendelse af arbejdslageret.
&_ . Handlingsforløbet.
\f
T_4.1 Anvendelse af Arbejdslageret
Data, der skal underkastes en behandling, skal befinde sig i ar-
bejdslageret under behandlingen, og posterne i vareregisteret
skal derfor indlæses til arbejdslageret. Hertil behøves som nævnt
&_ i afsnit 3.1.2 en zonebuffer. I arbejdslageret skal der lige-
ledes reserveres plads til forskellige hjælpestørrelser, bl.a.
feltadresser (jvf. afsnit 2.2.1).
Til datalagring kan der reserveres halvord, helord, dobbeltord
eller en sammenhængende kæde af en af disse størrelser. En reser-
veret enhed lokaliseres ved et navn, og dette navn skal anføres
ved reservationen. Fig. 4.2 viser et udsnit af arbejdslageret,
hvor der er reserveret et halvord, et helord og et dobbeltord
under navnene A, B og C.
T_ F_i_g_u_r_ _4_._2_
A
B
C
&_
I et reserveret element i arbejdslageret kan der opbevares data.
Helord B kan f.eks. anvendes til opbevaring af et syvtal. Tallet
kan anbringes i B ved følgende ALGOL-sætning:
b:=7;
T_ ERKLÆRING Reservation af plads i arbejdslageret udtrykkes i ALGOL
&_ ved en såkaldt erklæring.
\f
T_ E_k_s_._ _4_._1_
integer b;
Navnet B erklæres af typen INTEGER, og hermed menes, at
&_ der reserveres et helord under navnet B.
I en erklæring må der anføres hvilken elementtype, der ønskes re-
serveret, og under hvilket navn elementet ønskes identificeret.
T_ E_k_s_._ _4_._2_
boolean a;
&_ Der reserveres et halvord under navnet A.
T_ TYPE- Det specielle ord, der bestemmer elementtypen, kaldes
DECLA- en typedeclarator. INTEGER og BOOLEAN er eksempler
&_ RATOR herpå.
T_ IDENTIFI- Navnet, der identificerer det reserverede element, kal-
KATOR des en identifikator. A og B er eksempler på lovlige
&_ navne.
T_ VARIABEL Et reserveret element kaldes en variabel, da det under
programafviklingen kan antage varierende værdier. Nav-
&_ net kaldes variabelnavnet.
Flere variable kan reserveres i samme erklæring.
T_ E_k_s_._ _4_._3_
long a,b;
To dobbeltord reserveres, og de to variable tildeles
&_ hhv. navnet A og navnet B.
Det er værd at bemærke, at der i forbindelse med erklæringer al-
drig finder værditilskrivning sted, og før en variabel bruges,
er der normalt behov for at give den en veldefineret værdi,
f.eks. 0. Dette kan for de i eks. 4.3 erklærede variable ske med
følgende ALGOL-sætninger:
\f
a:=0;
b:=0;
T_ SIMPEL Variable, der optager et halvord, et helord eller et
VARIABEL dobbeltord, kaldes simple variable. BOOLEAN-variable
kan antage logiske værdier (jvf. afsnit 8.2), og IN-
TEGER- og LONG-variable kan antage forskellige heltals-
&_ værdier, som det er illustreret i følgende tabel.
T_ TYPE VÆRDIOMRÅDE
BOOLEANTRUE
FALSE
INTEGER Min. -8388608
Max. 8388607
LONG Min. -140737488355328
&_ Max. 140737488355327
T_ FELT- Fra postbeskrivelsen erindres, at de enkelte felter
VARIABEL kunne adresseres ved en heltalsadresse. Adresser af
&_ denne type opbevares i feltvariable.
T_ E_k_s_._ _4_._4_
integer field nr;
&_ Der erklæres en feltvariabel med navnet NR.
Erklæringen af en feltvariabel minder en del om en almindelig
erklæring, blot er ordet FIELD tilføjet efter typedeclaratoren.
Typedeclaratoren afgør om feltet, der udpeges med feltvariablen,
består af et halvord, et helord eller et dobbeltord. Værditil-
skrivning til en feltvariabel udtrykkes på tilsvarende måde som
ved en simpel variabel.
\f
T_ E_k_s_._ _4_._5_
integer field nr;
&_ nr:=6;
ZONE Til indlæsningen af poster fra vareregisteret er der
som tidligere nævnt behov for en zonebuffer. En zone-
buffer erklæres med declaratoren ZONE. Den skal natur-
ligvis navngives, og desuden skal der anføres forskel-
lige specifikationer.
T_ E_k_s_._ _4_._6_
zone vare (128,1,stderror);
Declarator
Navn
&_ Specifikation
Ved hjælp af zonespecifikationen er det muligt at tilpasse zone-
bufferen til det aktuelle formål. I specifikationen, der er inde-
sluttet i en parentes, anføres 3 oplysninger adskilt med komma.
Første oplysning bestemmer zonebufferens størrelse målt i dobbelt-
ord. Anden oplysning angiver, om zonebufferen skal opdeles i fle-
re delbuffere. Som tredje oplysning anføres navnet på et under-
program, der skal anvendes, hvis der skulle ske noget uforudset.
Underprogrammet vil da give en forklarende fejludskrift.
I forbindelse med opgaverne i denne bog vil zoneerklæringen, der
er vist i eks. 4.6, være den mest hensigtmæssige.
T_ FELT- Adgang til et felt i en post, der er indlæst i en zone-
REFERENCE buffer, opnås ved at referere til såvel zonen som
feltvariablen, der udpeger det pågældende felt. De to
navne adskilles med punktum.
T_ E_k_s_._ _4_._7_
&_ vare.nr \f
FELT- En indlæst post optager et helt antal helord i zone-
ADRESSE bufferen. Disse helord indeholder postens felter, og
&_ for at kunne referere til de enkelte felter nummereres
alle halvord i posten i stigende rækkefølge startende
med 1. Feltadressen er nu bestemt ved nummeret på det
sidste halvord i feltet.
T_ E_k_s_._ _4_._8_
POST I ZONEN VARE
1 2
3 4
5 6
7 8
9 10
1112
&_ 13 14
T_ zone vare(128,1,stderror);
integer field nr;
&_
nr:=6;
Med VARE.NR udpeges feltet, der består af halvord 5 og
halvord 6.
VARIABEL- Varenavnet kan ikke rummes i et dobbeltord, og det er
SÆT nødvendigt at tage flere i anvendelse. Et sammenhængen-
de sæt af dobbeltord kaldes et variabelsæt, og for at
tilkendegive, at feltet udgør flere dobbeltord, tilfø-
jes ordet ARRAY i erklæringen af den feltvariabel, der
udpeger feltet.
T_ E_k_s_._ _4_._9_
&_ long array field navn;
De enkelte elementer i variablesættet nummeres 1, 2, 3 etc. og
det er muligt at referere til variabelsættet som helhed eller til
et udvalgt element.
\f
T_ E_k_s_._ _4_._1_0_
zone vare (128,1,stderror);
long array field navn;
VARE.NAVN udpeger variabelsættet som helhed.
VARE.NAVN(1) udpeger det første element.
&_ VARE.NAVN(2) udpeger det andet element.
VARE.NAVN(3) udpeger det tredje element.
Feltadressen på et variabelsæt er bestemt ved nummeret på det
halvord, der er placeret umiddelbart før det første halvord i
første element.
T_ E_k_s_._ _4_._1_1_
POST I ZONEN VARE
1 2
3 4
5 6
7 8
9 10
&_ 11 12
1314
1516
1718
T_ zone vare (128,1,stderror);
long array field navn;
&_ navn:=6;
Halvordene 7, 8, 9 og 10 udgør elementet VARE.NAVN(1).
I udskriftsprogrammet er der behov for en zonebuffer til indlæs-
ning af poster samt feltvariable til udpegning af de to felter,
der skal udskrives. Felttyperne er beskrevet i datalisten afsnit
2.2.2, og de nødvendige erklæringer kan foretages som vist neden-
for, idet det bemærkes, at erklæringer adskilles med semikolon.
\f
T_ zone vare (128,1,stderror);
integer field nr;
&_ long array field navn;
I arbejdslageret er der hermed reserveret 3 størrelser. En zone-
buffer, der består af 128 dobbeltord, og to feltvariable, der
hver består af et helord. Figur 4.3 illustrerer dette.
T_ F_i_g_u_r_ _4_._3_
ARBEJDSLAGER
NR
NAVN
VARE
&_
T_ STANDARD- Artikeloversigten tænkes udskrevet på terminal, og en
ZONE zonebuffer skal anvendes i den forbindelse. Da der som
regel er behov for både indlæsning og udskrivning, er-
&_ klæres der automatisk en zonebuffer til hvert af disse
formål. En således erklæret zone kaldes en standard-
IN zone. Standardzonen IN kan anvendes til indlæsning, og
OUT standardzone OUT kan anvendes til udskrivning. OUT be-
nyttes til udskrivning af artikeloversigten.
T_ STANDARD- De fleste programmer behøver forskellige hjælpevariab-
VARIABEL le, og til en række formål erklæres der i lighed med
standardzonerne også standardvariable, der umiddelbart
kan anvendes. Arbejdslageret kan nu skitseres som vist
&_ i fig. 4.4.
\f
T_ F_i_g_u_r_ _4_._4_
ARBEJDSLAGER
PROGRAM-
ERKLÆREDE
VARIABLE
NR
NAVN
VARE
STANDARD-
VARIABLE
STANDARD-
ZONER
IN
OUT
&_
T_4.2 Beskrivelse af Handlingsforløbet
En indledende analyse af problemet afklarer handlingsforløbet.
Følgende må foretages:
. Læs en post fra vareregisteret.
&_ . Udskriv felterne varenummer og varenavn.
Ovennævnte handlinger skal udføres for samtlige poster i varere-
gisteret på nær slutposten. Dette handlingsforløb kan yderligere\f
anskueliggøres ved en graf (fig. 4.5).
T_ F_i_g_u_r_ _4_._5_
LÆS
1 INITIERING 2 UDSKRIV 3 4
AFSLUTNING
&_
GRAF En graf består af nogle knudepunkter, der er forbundet
med kanter.
T_
KANT
&_ KNUDEPUNKT
Kanterne er forsynet med pile, der viser den retning man kan
bevæge sig på grafen. På grafen fig. 4.5 kan man f.eks. bevæge
sig fra knudepunkt 1 til knudepunkt 2, og ikke omvendt.
Knudepunkterne i en graf symboliserer tilstande, mens kanterne
symboliserer handlinger (aktiviteter).
T_ KNUDE- Knudepunkterne i grafen fig. 4.5 symboliserer følgende
PUNKT tilstande:
\f
1. Start
2. Klar til udskrivning
3. Klar til læsning
4. Stop.
KANT Hver kant i fig. 4.5 er forsynet med en forklarende
tekst, der beskriver den symboliserede handling.
Kanterne i fig. 4.5 symboliserer følgende handlinger:
. Initiering.
. Læsning af en post.
. Udskrivning af varenummer og varenavn.
. Afslutning.
Handlingsforløbet, der beskrives ved grafen, kan yderligere an-
skueliggøres ved et gennemløb af grafen.
T_ GRAF- Indledningsvis befinder man sig i START-tilstande. Fra
GENNEMLØB denne tilstand fører en kant til en ny knude. Handlin-
gen, der er symboliseret ved denne kant, kaldes INITIE-
&_ RING, og den omfatter tilknytning af vareregisteret og
læsning af den første post. Såfremt den første post er
en slutpost, hvilket er teoretisk muligt, fører en kant
fra knude (2) direkte til den sidste knude (4), og
handlingsforløbet afsluttes.
En mere interessant bane følges, når den første post er en egent-
lig varepost. En kant, der symboliserer udskrivning af de ønskede
oplysninger, fører da til knudepunkt (3). Fra knudepunkt (3) er
der kun en vej videre frem, nemlig at følge kanten, der symboli-
serer læsning af en post, og som fører tilbage til knudepunkt
(2). Afhængig af den læste post vælges nu en af de to mulige
kanter, der udgår fra knudepunkt (2). Løkken gentages lige så
længe, der læses vareposter, og udskrivningen og læsningen
gentages ved hvert gennemløb af løkken. Først efter læsning af
slutposten forlades løkken. \f
T_ IND- En post kan indlæses fra vareregisteret på baggrunds-
&_ LÆSNING lageret med følgende ALGOL-sætning:
invar(vare);
INVAR INVAR er navnet på et underprogram, der kan forestå
selve indlæsningen, og VARE er navnet på den zone, der
ønskes anvendt ved indlæsningen. Et underprogram akti-
veres ved at anføre navnet og en tilhørende parameter-
liste indesluttet i en parentes. I parameterlisten til
en procedure, som et underprogram normalt kaldes, kan
der overføres oplysninger til proceduren, ligesom der
fra proceduren kan returneres oplysninger i parametrene.
Posterne, der kan læses med INVAR, skal have en speciel opbyg-
ning, idet det kræves, at de 4 første halvord er forbeholdt
interne oplysninger, som INVAR benytter. Fig. 4.6 viser dette.
T_ F_i_g_u_r_ _4_._6_
INTERN
DEL
BRUGER
DEL
&_
Den interne del rummer to helordsoplysninger. I det første ord
findes postens totallængde målt i antal halvord. Det andet ord
rummer en intern kontroloplysning, der kaldes en CHECKSUM.
De egentlige brugeroplysninger udgør brugerdelen, og den kan
variere i størrelse fra post til post. Vareregisteret er dog
udformet, så alle poster har den samme længde. Tilstedeværelsen
af den interne del forklarer, at det første brugerfelt har
feltaddresse 6 jvf. postbeskrivelsen. \f
Udskrivning af de ønskede oplysninger må suppleres med typogra-
fiske oplysninger, og følgende må foretages, hver gang en post
udskrives:
1. Foretag linjeskift.
2. Udskriv varenummer.
3. Udskriv mellemslag.
4. Udskriv varenavn.
Følgende aktivering af udskriftsproceduren WRITE udfører det
fornødne:
T_ write (out, "nl",1, vare.nr, "sp",2,
vare.navn);
Procedurenavn
Zone
Linjeskift
Varenummer
Mellemslag
&_ Varenavn
WRITE Procedure WRITE aktiveres ved anførsel af navnet, og en
parameterliste indesluttet i en parentes. I parameter-
listen specificeres hvilken zone, der skal anvendes ved
udskrivningen, og hvilke oplysninger, der skal udskri-
ves. De enkelte oplysninger i parameterlisten adskilles
med komma, og de udskrives i den rækkefølge, de er an-
ført.
OUT Som første parameter skal der altid angives, hvilken
zone, der skal benyttes. I dette tilfælde anvendes
standardzonen OUT.
"NL",1 Den næste parameter indledes med en boolsk konstant.
Boolske konstanter indikerer, at der skal udskrives et
bestemt tegn, og den efterfølgende parameter fortæller,
hvor mange gange det pågældende tegn\f
skal udskrives. Udskrivning af konstanten "NL"
resulterer i udskrivning af linjeskifttegn (new line),
og da den efterfølgende parameter er et ettal,
udskrives blot et enkelt linjeskifttegn.
VARE.NR Denne parameter er en reference til det felt, der rum-
mer varenummeret, og det udskrives.
"SP",2 "SP" er en boolsk konstant, og den efterfølgende
parameter bestemmer det antal gange, det pågældende
tegn skal udskrives. Udskrivning af konstanten "SP"
resulterer i udskrivning af mellemslag. Der udskrives
således 2 mellemslag.
VARE.NAVN Denne parameter er en reference til det felt, der rum-
mer varenavnet, og navnet udskrives.
Programsætninger udføres i den rækkefølge, de er anført, og
nedskrivning af de to sætninger
T_ invar(vare);
&_ write(out,"nl",1,vare.nr,"sp",2,vare.navn);
lige så mange gange, som der er poster i vareregisteret, vil give
en løsning på udskriftsproblemet.
LØKKE En mere hensigtsmæssig løsning opnås ved at udtrykke
løkken i grafen fig. 4.5 i en WHILE-konstruktion, og
grafen omdannes herved til følgende programsekvens:
T_ invar(vare);
while vare.nr <4000 do
begin
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
invar(vare);
&_ end;
I denne programsekvens læses i første sætning den første post i\f
vareregisteret. Den næste sætning er en WHILE-sætning. En WHILE-
sætning indledes med ordet WHILE, der efterfølges af en betingel-
se. Værdien af denne betingelse kan være TRUE eller FALSE (sand
eller falsk) afhængig af, om varenummeret i den netop læste post
er mindre end 4000 eller ikke. Når betingelsen er TRUE udpeger
sekventieloperatoren DO den næste sætning, der skal udføres. I
det aktuelle tilfælde er den næste sætning en sammensat sætning
bestående af de to velkendte sætninger omgivet af sætningsparen-
tesen BEGIN END. Efter udførelsen af den sammensatte sætning
undersøges betingelsen igen, og den aktuelle værdi bestemmer, om
den sammensatte sætning atter skal udføres. Når betingelsen har
værdien FALSE, forlades WHILE-sætningen og hermed løkken, og den
efterfølgende sætning i programmet udføres.
Da slutposten har varenummer 4000, er det klart, at programse-
kvensen er en direkte omformning af løkken i grafen fig. 4.5 til
ALGOL-sætninger.
T_ O_p_g_a_v_e_ _4_._1_
Antag, at følgende poster findes i vareregisteret:
10 transistorer
17 dioder
209 printkort
&_4000 slutpost
Anvend den skitserede programsekvens på dette vare-
register og gennemgå i detaljer, hvad der sker.
Til det færdige udskriftsprogram mangler endnu et par detaljer.
Zonen VARE skal tilknyttes det område på baggrundslageret, hvor
vareregisteret befinder sig, og den skal frigives efter brugen.
En nødvendig initiering af feltvariablene kan let klares som vist
i eksemplerne 4.8 og 4.10.
OPEN En zone tilknyttes et givet område på baggrundslageret
med proceduren OPEN. Zonen VARE kan tilknyttes området
VAREREG, hvor vareregisteret antages at befinde sig,\f
med følgende aktivering af OPEN:
T_ open(vare,4,<:varereg:',0);
Procedurenavn
Zone
Baggrundslagertype
Områdenavn
&_ Fejlangivelse
Baggrundslagertypen bestemmer, til hvilken enhed zonen skal
knyttes. Ved pladelager, som udelukkende anvendes i bogens
opgaver, anføres 4.
Fejlangivelsen udnyttes ved aktivering af fejlproceduren, der
optræder i zoneerklæringen. En standardiseret anvendelse kræver,
at der anføres et nul, hvilket vil være hensigtsmæssigt i for-
bindelse med løsning af bogens opgaver.
CLOSE Med procedure CLOSE afsluttes brugen af en zone, og det
tilknyttede område frigives. Anvendelsen af zonen VARE
kan afsluttes med følgende aktivering:
T_ close(vare,true)
Procedurenavn
Zone
&_ Frigivelse
Den sidste parameter i procedurekaldet kan anvendes på forskel-
lige måder, bl.a. når en zone er tilknyttet et magnetbånd. TRUE
skal altid anvendes ved løsning af bogens opgaver.
Udskriftsprogrammet kan nu sammensættes af de udarbejdede dele,
idet det bemærkes, at de enkelte erklæringer og sætninger skal
adskilles med semikolon, og at hele programmet skal omsluttes af
parentesen BEGIN END.
\f
T_ begin
integer field nr;
long array field navn;
&_ zone vare(128,1,stderror);
T_ open(vare,4,<:varereg:',0);
nr:=6;
&_ navn:=6;
invar(vare);
T_ while vare.nr <4000 do
begin
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
invar(vare);
&_ end;
T_ close(vare,true);
&_ end
\f
F_ 5 BASISPROGRAMMEL
Den afsluttende del af programmeringsarbejdet, hvor programmet
skal afluses for fejl ved testkørsler, kræver kendskab til betje-
ning af basisprogrammellet. I dette kapitel beskrives anvendelsen
af basisprogrammellet, specielt med dette for øje. Følgende må
foretages:
1. Erhverv tilladelse til at bruge en terminal.
2. Indtast den arbejdsopgave datamaten skal udføre.
3. Sæt datamaten til at udføre opgaven.
NOTATION I de vejledende eksempler er der anvendt en speciel
notation, bl.a. for på simpel måde at tilkendegive om
en linje er indtastet af terminalbrugeren eller er
udskrevet af datamaten.
X viser, at et ATTENTION-signal skal sendes.
-' markerer, at linjen er indtastet.
Det skal bemærkes, at en linje først opfanges, når hele linjen er
tastet og afsluttet med linjeskift, hvilket ikke kan ses af
eksemplerne.
T_5.1 LOGIN-Rutine
Erhvervelse af tilladelse til at bruge en terminal opnås ved en
dialog med BOSS. Denne dialog kaldes LOGIN-rutinen, og den kan
&_ forløbe som vist i eks. 5.1.
T_ E_k_s_._ _5_._1_
X att -' boss
type user name and project number
-' kc 1234
&_ in: 1978.09.03 11.04
\f
Af eks. 5.1 ses, at dialogen med datamaten indledes med afsendel-
se af et ATTENTION-signal. Signalet besvares med udskriften ATT,
og terminalbrugeren anfører navnet på det operativsystem, som den
følgende del af dialogen skal føres med. BOSS er det udvalgte
operativsystem, og BOSS udskriver TYPE USER NAME AND PROJECT NUM-
BER for at tilkendegive, at disse oplysninger ønskes. Terminal-
brugeren indtaster sit kodeord, der består af brugerens initialer
og et tal. Disse oplysninger adskilles med et mellemslag. BOSS
godkender kodeordet ved at udskrive det aktuelle klokkeslet, og
terminalen er stillet til brugerens rådighed.
Hermed er der også stillet en såkaldt JOBFIL til rådighed, hvor
de efterfølgende linjer, der skal beskrive arbejdsopgaven, kan
opbevares.
T_5.2 JOB
En afgrænset arbejdsopgave, som det pålægges datamaten at udføre,
kaldes et job. Jobbet, der kan forestå kørslen af udskriftspro-
&_ grammet, kan indtastes til JOBFILEN, som vist i eks. 5.2.
T_ E_k_s_._ _5_._2_
m_ -' 10 u=algol
-' 20 begin
-' 30 integer field nr;
-' 40 long array field navn;
-' 50 zone vare(128,1,stderror);
-' 60 nr:=6;
-' 70 navn:=6;
-' 80 open(vare,4,<:varereg:',0);
-' 90 invar(vare);
-' 100 while vare.nr < 4000 do
-' 110 begin
-' 120 write(out,"nl",1,vare.nr,"sp",2,vare-navn);
-' 130 invar(vare);
-' 140 end;
-' 150 close(vare,true);
-' 160 end;
-' 170 u
-' 180 finis
&_
p_ \f
T_ LINJE- I eks. 5.2 er hver linje indledt med et linjenummer,
NUMMER der er adskilt fra selve indholdet med mellemslag.
Linjer, der indtastes på denne måde, gemmes i JOBFILEN
i stigende linjenummerorden. Skulle der ske fejl under
&_ indtastningen indebærer det ikke nogen katastrofe, da
det ved hjælp af linjenummeret er muligt at udpege
linjer, der skal rettes eller måske ændres fuldstæn-
digt. Rettelsesmulighederne er beskrevet i afsnit
5.5.4.
T_ FP- Det indtastede job indeholder foruden selve udskrifts-
KOMMANDO programmet (linje 20-160) forskellige styrekommandoer
(kontrolkort), der fortæller datamaten, hvilke pro-
&_ grammer, der skal aktiveres under jobafviklingen. En
styrekommando kaldes en FP-kommando, da et specielt
program, FP, varetager tolkningen og eksekveringen af
disse kommandoer.
I jobbet er der 3 FP-kommandoer. Den første (linje 10) fortæller,
at ALGOL-oversætteren skal aktiveres og oversætte det indtastede
program til maskininstruktioner. Endvidere fortælles, at det
oversatte program skal gemmes under navnet U.
Den anden FP-kommando (linje 170) er navnet på det oversatte pro-
gram, og ved at angive dette navn fortælles, at det oversatte
program skal afvikles.
Den tredje FP-kommando er FINIS, og med denne kommando aktiveres
FINIS-programmet, der har til opgave at fortælle BOSS, at jobbet
ønskes afbrudt.
De 3 FP-kommandoer eksekveres i den rækkefølge, de er opbevaret
i JOBFILEN, og jobbet består således af at oversætte udskrifts-
programmet, at køre det oversatte program og at tilkendegive, at
jobbet ikke har flere ønsker.
FP-kommandoer findes yderligere beskrevet i afsnit 5.6.
\f
T_5.3 Jobafvikling
Et job, der er beskrevet i JOBFILEN, kan bringes til udførelse
ved at anmode BOSS om at afvikle jobbet. Anmodninger til BOSS
&_ tilkendegives ved indtastning af forskellige kommandoer.
GO Med GO-kommandoen anmodes BOSS om at udføre et job.
T_ E_k_s_._ _5_._3_
-' go
finis kc0 at 13.02
GO-kommandoen besvares med en meddelelse om, hvornår
&_ jobbet kan forventes at være afviklet.
SYNTAKS go
FUNKTION Når GO-kommandoen anvendes, tilmeldes jobbet, der er
beskrevet i JOBFILEN, til afvikling. Da der kan være
tilmeldt flere job, indsættes det nye job blot i køen
af job, der ønskes afviklet. Fra jobkøen udvælger BOSS
i følge en veldefineret strategi de job, der skal af-
vikles først. Det er således, at små job med kort køre-
tid fortrinsvis afvikles først.
Et forventet afslutningstidspunkt for jobbet beregnes og
udskrives til terminalbrugeren ved jobtilmeldingen. Herefter
låses terminaltastaturet, og terminalen kan ikke benyttes til
afvikling af andre job, før det tilmeldte job er afviklet.
JOBNAVN Et job afvikles under et jobnavn, der frembringes af
brugernavnet og et indeks. Jobnavnet udskrives i be-
svarelsen af GO-kommandoen. I eks. 5.4 er jobnavnet
KC0.
Eks. 5.4 viser hele terminalkonversationen i sammenhæng.
\f
T_ E_k_s_._ _5_._4_
X att -'boss
type user name and project number
-' kc 1234
&_ in: 1978.09.03 11.04
T_ -' 10 u=algol
-' 20 begin
-' 30 integer field nr;
-' 40 long array field navn;
-' 50 zone vare(128,1,stderror);
-' 60 nr:=6;
-' 70 navn:=6;
-' 80 open(vare,4,<:varereg:',0);
-' 90 invar(vare);
-' 100 while vare.nr <4000 do
-' 110 begin
-' 120 write(out,"nl",1,vare.nr,"sp",2,vare.navn);
-' 130 invar(vare);
-' 140 end;
-' 150 close(vare,true);
-' 160 end
-' 170 u
-' 180 finis
&_
-' go
T_ finis kc0 at 13.02
&_
5.4 Kørselsanalyse
T_
Det tilmeldte job (eks. 5.4) producerer under afviklingen for-
skellige udskrifter, der i det følgende er ledsaget af forklaren-
de tekster.
&_
1: begin Udskrift fra ALGOL-over-
15: end sætteren
algol end 25
\f
9 transistorer Udskrift fra varere-
11 dioder gisteret.
17 terminaler
111 kredsløb
900 strømforsyning
1234 pladelager
2345 båndstation
3456 magnetbånd
end 18 Afsluttende udskrift fra
udskriftsprogrammet.
end 2 sec job kc0 Udskrift fra BOSS
log op date 1978.09.03 12.59
&_ ''
Udskriften fra ALGOL-oversætteren fortæller, at oversættelsen er
forløbet korrekt, og at det oversatte program optager 25 segmen-
ter på baggrundslageret. ALGOL-oversættelsen er beskrevet i af-
snit 5.7.
Udskriften af vareregisteret er mangelfuld mht. typografien, men
det vil blive afhjulpet senere.
Kørsel af et ALGOL-program afsluttes altid med meddelelsen END
XX. Tallet efter END fortæller, hvor mange gange der er indlæst
et programsegment fra baggrundslageret. Dette tal kan være mindre
end det samlede antal segmenter, da det kun er de aktuelt benyt-
tede programsegmenter, der indlæses.
Et job afsluttes altid med en meddelelse fra BOSS indeholdende
køretiden og afslutningstidspunktet.
'' tilkendegiver, at terminalen atter kan benyttes.
\f
T_5.5 BOSS-Kommandoer
Ved en BOSS-kommando forstås et direktiv til BOSS angående ud-
førsel af en given handling. Et sådant direktiv skal indtastes
&_ fra terminalen. GO-kommandoen er et eksempel herpå.
Der findes en række BOSS-kommandoer, som en terminalbruger kan
benytte, og i de følgende afsnit behandles blot et beskedent
udvalg.
Når der er tilmeldt et job fra terminalen, er det ikke tilladt
umiddelbart at anvende tastaturet. Tilladelse hertil erhverves
ved afsendelse af et ATTENTION-signal.
T_ E_k_s_._ _5_._5_
X
''
&_ -' kill
Afsendelse af et ATTENTION-signal besvares med udskrif-
ten '', der tilkendegiver, at en BOSS-kommando kan ind-
tastes. KILL-kommandoen er herefter indtastet.
Indtastning af BOSS-kommanddoer kan give anledning til udskriv-
ning af forskellige fejludskrifter. Grundene hertil kan være man-
ge, men de hyppigst forekommende er nok simple stavefejl og
ulovlig anvendelse af en kommando. I appendix B findes en liste
over de fejludskrifter, der vedrører de i bogen omtalte BOSS-kom-
mandoer.
T_5.5.1 A_f_b_r_y_d_e_l_s_e_ _a_f_ _J_O_B_
KILL Med KILL-kommandoen kan et job afbrydes.
E_k_s_._ _5_._6_
X
''
&_ -' kill
Tilladelse til at indtaste KILL-kommandoen erhverves\f
ved at sende et ATTENTION-signal.
SYNTAKS kill
FUNKTION Når KILL-kommandoen indtastes på terminalen, afbrydes
det job, der er tilmeldt BOSS fra den samme terminal.
T_5.5.2 A_f_s_l_u_t_ _T_e_r_m_i_n_a_l_b_r_u_g_
LOGOUT Med LOGOUT-kommandoen tilkendegives, at terminalen ikke
&_ ønskes anvendt længere.
T_ E_k_s_._ _5_._7_
-' logout
&_ logged in 3 min operations 5
LOGOUT-kommandoen indtastes og besvares med den
følgende udskrift.
SYNTAKS logout
FUNKTION Anvendelse af LOGOUT-kommandoen resulterer i følgende:
1. Et eventuelt tilmeldt job afbrydes.
2. Samtlige LOGIN-områder (jvf. afsnit 5.5.6.3)
fjernes.
3. En orienterende meddelelse vedrørende varigheden og
omfanget af terminalbrugen udskrives.
Når det er sket, er terminalbrugen afsluttet, og fornyet
anvendelse af terminalen må indledes med LOGIN-rutinen.
T_5.5.3 T_i_l_d_e_l_i_n_g_ _a_f_ _L_i_n_j_e_n_u_m_r_e_
AUTOLINE Efter anvendelse af AUTOLINE-kommandoen foretager BOSS
generering og udskrivning af linjenumre. Man undgår
&_ herved at skulle indtaste linjenumre.
\f
T_ E_k_s_._ _5_._8_
-' autoline
10 -' u=algol
20 -' begin
30 -' integer field nr;
40 -' long array field navn;
50 -' zone vare(128,1,stderror);
60 -' nr:=6;
70 -' navn:=6;
80 -' open(vare,4,<:varereg:',0);
90 -' invar(vare);
100 -' while vare.nr < 4000 do
110 -' begin
120 -' write(out,"nl",1,vare.nr,"sp",2,vare.navn);
130 -' invar(vare);
140 -' end;
150 -' close(vare,true);
160 -' end
170 -' u
180 -' finis
&_ 190 X
SYNTAKS autoline
FUNKTION Efter indtastning af AUTOLINE-kommandoen tildeles hver
af de følgende linjer et linjenummer. Linjerne numme-
reres 10,20,30...etc. Linjenummeret udskrives i takt
med indtastningen, og terminalbrugeren undgår herved
selv at skulle taste tallene. Tildelingen af linjenum-
re ophører, når der sendes et ATTENTION-signal.
T_5.5.4 E_d_i_t_e_r_i_n_g_
Det er næsten uundgåeligt at gemmenføre arbejdet ved en terminal
uden at begå fejl. Et ord staves måske forkert eller en linje
glemmes. Til afhjælpning af dette findes der forskellige rettel-
sesfaciliteter.
\f
T_5.5.4.1 S_l_e_t_n_i_n_g_._ Slettetegn kan anvendes, når fejlen opdages under
indtastningen af en linje.
BACKSPACE eller RUBOUT sletter det sidst tastede tegn
&_ (RUBOUT ekkoes som , BACKSPACE sletter sidste tegn).
Samtidig tryk på CTR + E sletter hele linjen
(CTRL + E ekkoes som ).
T_ E_k_s_._ _5_._9_
u=alf gol
f slettes
u=alf u=algol
&_ linjen slettes og skrives om
Slettesymbolet kan anvendes flere gange i træk, og tegnene på
linjen slettes successivt fra højre mod venstre.
T_ E_k_s_._ _5_._1_0_
u=fortran algol
&_ fortran slettes
T_5.5.4.2 R_e_t_t_e_l_s_e_s_k_o_m_m_a_n_d_o_e_r_._ Det er muligt
. at indsætte
. at slette
. at modificere
&_ linjer i JOBFILEN.
Samtlige linjer i JOBFILEN er forsynet med et linjenummer. Under
indtastningen kan linjenummereringen vælges frit af terminalbru-
geren. Linjerne lagres i stigende linjenummerorden uanset ind-
tastningsrækkefølgen.
INDSÆT Indtastningen af jobbet i eksempel 5.2 bestod i at ind-
sætte en række linjer i en tom JOBFIL. Nye linjer ind-
sættes altså ved at indtaste linjenummeret og linjeind-
holdet adskilt med mellemslag.
\f
T_ E_k_s_._ _5_._1_1_
35 invar(vare);
Hvis der i forvejen findes en linje med det anførte linjenummer,
&_ vil den sidst indtastede linje erstatte den oprindelige linje.
T_ O_p_g_a_v_e_ _5_._1_
Bestem JOBFILENS indhold, når følgende indtastning har
fundet sted:
10 p=algol
20 integer sum a,b;
30 write(out,sum);
15 begin
40 end
10 u=algol list.yes
25 read(in,a,b);
&_ 26 sum:=a+b;
Indsæt en tom linje umiddelbart efter linje 10.
SLET Indtastning af et linjenummer alene bevirker, at den
anførte linje slettes i JOBFILEN.
T_ E_k_s_._ _5_._1_2_
&_ 40
MODIFICER En linje kan modificeres, og følgende må da anføres:
. Linjenummeret.
. Det grafiske billede, der skal erstattes.
. Det nye grafiske billede, der skal indgå i stedet.
Oplysningerne skal adskilles med det samme skilletegn.
Skilletegnet må naturligvis ikke indgå i de grafiske
billeder.
\f
T_ E_k_s_._ _5_._1_3_
50 navn: =6;
&_ 50/: =/:=
Det grafiske billede >: => erstattes af >:=> i linje
50. / er anvendt som skilletegn.
Det først anførte grafiske billede opsøges fra venstre mod højre.
Første gang det mødes, foretages rettelsen, og modifikationen er
gennemført.
T_ SKILLE- Skilletegn kan frit vælges under hensyn til følgende
&_ TEGN restriktioner:
1. Et mellemslag anført umiddelbart efter linjenummeret
bevirker indsættelse af hele linjen, og mellemslag
kan derfor ikke anvendes.
2. Skilletegn må ikke indgå i de grafiske billeder.
/ > " kan f.eks. vælges som skilletegn.
T_ O_p_g_a_v_e_ _5_._2_
Jobfilen fra opgave 5.1 ønskes rettet, så variabel-
&_ navnet A overalt erstattes med SALG.
T_5.5.5 U_d_s_k_r_i_v_n_i_n_g_
Hele JOBFILEN eller dele af den kan udskrives ved anvendelse af
&_ forskellige kommandoer.
T_5.5.5.1 V_e_r_i_f_y_._ Den sidst indtastede linje eller den senest modificerede
&_ linje udskrives med VERIFY-kommandoen.
T_ E_K_s_._ _5_._1_4_
&_ verify
En given linje kan udskrives ved yderligere at anføre linjenum-
meret.
\f
T_ E_k_s_._ _5_._1_5_
&_ verify 10
En afgrænset linjegruppe kan udskrives ved yderligere at tilføje
antallet af linjer, der skal udskrives.
T_ E_k_s_._ _5_._1_6_
&_ verify 10 4
Linje 10 samt de 3 følgende linjer udskrives.
T_ 5.5.5.2 L_i_s_t_. Hele JOBFILEN kan udskrives med LIST-kommandoen.
E_k_s_._ _5_._1_7_
&_ list
Anføres yderligere et linjenummer, vil den specificerede linje
samt alle linjer med et højere linjenummer blive udskrevet.
T_ E_k_s_._ _5_._1_8_
&_ list 30
Et linjeinterval kan udskrives ved at anføre nedre og øvre grænse
for intervallet.
T_ E_k_s_._ _5_._1_9_
&_ list 30 97
T_5.5.6 J_o_b_f_i_l_h_å_n_d_t_e_r_i_n_g_
Et område på baggrundslageret kan overføres til JOBFILEN ved GET-
kommandoen. Området udnævnes herved til BASISFIL.
CLEAR-kommandoen frigiver en BASISFIL, hvorved området returnerer
til normal status. Med SAVE-kommandoen kopieres indholdet af JOB-
&_ FILEN til et område.
\f
T_5.5.6.1 G_E_T_
E_k_s_._ _5_._2_0_
get text
&_ Området TEXT overføres til JOBFILEN.
SYNTAKS get <områdenavn'
GET En mulig basisfil frigives, og det specificere område
gøres til BASISFIL, hvorved indholdet overføres til
JOBFILEN. Linjnerne nummereres, 10,20,30.... etc.
T_5.5.6.2 C_L_E_A_R_
E_k_s_._ _5_._2_1_
clear
Indholdet af JOBFILEN slettes og en evt. BASISFIL fri-
&_ gives.
SYNTAKS clear
CLEAR Indholdet af JOBFILEN slettes, og en evt. BASISFIL
frigives.
T_5.5.6.3 S_A_V_E_
E_k_s_._ _5_._2_2_
save rctext
&_ JOBFILEN overføres til området RCTEXT.
SYNTAKS save <områdenavn'
SAVE Indholdet af JOBFILEN overføres til baggrundslageret i
et område med det specificerede navn. Hvis der findes
et LOGIN-område, med det anførte navn, overføres ind-
holdet til dette område. Hvis ikke, oprettes et nyt
LOGIN-område med det anførte navn, og indholdet over-
føres hertil. Et LOGIN-område er karakteriseret ved, at
det bevares, indtil terminalbrugeren fjerner det, evt.
ved anvendelse af LOGOUT-kommandoen. Når et LOGIN-om-\f
råde er BASISFIL, vil indholdet af JOBFILEN blive slet-
tet, efter at der er ført tilbage til BASISFILEN med
SAVE-kommandoen.
Den sidste kommando i serien
get rctext
save rctext
save rctext
overføres således en tom JOBFIL tilbage til RCTEXT, og
det oprindelige indhold er forsvundet.
T_5.5.7 M_e_d_d_e_l_e_l_s_e_r_ _f_r_a_ _B_O_S_S_
Dialogen med BOSS vedrørende terminalbrug, editering, JOBFIL-
håndtering og jobhåndtering kan give anledning til forskellige
utilsigtede meddelelser fra BOSS. Hertil kan anføres mange
grunde, men de hyppigste vil nok være stavefejl og forkert an-
&_ vendelse af BOSS-kommandoer.
I appendix B findes et udvalg af de meddelelser BOSS udskriver.
T_5.5.7.1 N_O_ _R_O_O_M_._ Udskriften NO ROOM forekommer, når der ikke er kapacitet
til at gennemføre flere rettelser på en JOBFIL. For at komme
videre må JOBFILEN overføres til baggrundslageret, og det an-
vendte område skal gøres til BASISFIL. Anvendelse af SAVE og GET
&_ kommandoerne løser dette kapacitetsproblem, og flere rettelser
kan nu gennemføres. Kommandoen, der gav anledning til udskriften,
blev ikke gennemført, og den må derfor gentages.
Når VERIFY-kommandoen anvendes umiddelbart efter en GET-kommando,
udskrives linjenummeret på den sidste linje i JOBFILEN.
Fremkommer NO ROOM under indtastningen, sikrer VERIFY-kommandoen
således på en bekvem måde den videre indtastning som vist i
følgende sekvens:
\f
T_ ...
-' 136 begin
-' 137 integer
no room
-' save rcjob
-' get rcjob
-' verify
510
-' 510 integer
& ...
T_5.6 FP-Kommandoer
Jobønsker udtrykkes i JOBFILEN ved hjælp af FP-kommandoer. Med en
FP-kommando aktiveres et program, og samtidigt med dette kan der
&_ overføres parametre til programmet.
T_ E_k_s_._ _5_._2_3_
u=algol list.yes
&_ Aktivering af ALGOL ledaget af styreparametre.
T_ E_k_s_._ _5_._2_4_
u
u data
&_ p=algol txt list.yes bossline.yes
Forskellige FP-kommandoer.
T_ SYNTAKS 11
<navn'= <programnavn' <parameterliste'
&_ 00
Navne må højst indeholde 11 tegn (bogstaver/cifre). Første tegn
skal være et bogstav.
FUNKTION Det specificerede program aktiveres, og eventuelle sty-
reparametre stilles til rådighed for programmet. \f
T_5.6.1 M_e_d_d_e_l_e_l_s_e_r_ _f_r_a_ _F_P_
FP-kommandoer læses og fortolkes af et specielt program, FP. Når
FP læser en fejlagtig FP-kommando udskrives en eller flere fejl-
meddelelser, der ofte er ledsaget af en orienterende meddelelse
&_ om, hvorfra den fejlramte kommando blev læst.
T_ E_k_s_._ _5_._2_5_
*** FP SYNTAX TESTPROGRAM1
&_ * READ FROM PRIMARY INPUT
Den første udskrift fortæller, at der er syntaksfejl i
navnet TESTPROGRAM1, og den anden fortæller, at komman-
doen er læst fra PRIMARY INPUT, dvs. JOBFILEN.
I appendix C findes en liste over udvalgte meddelelser fra FP.
T_5.7 ALGOL
OVERSÆT- ALGOL er både navnet på programmeringssproget og på det
TER program, der kan oversætte en ALGOL-tekst til maskinin-
struktioner. I dette afsnit behandles programmet ALGOL
&_ eller ALGOL-oversætteren, som det også kaldes.
Et program skrevet i ALGOL kan ikke umiddelbart afvikles, da da-
tamaten kun er i stand til at udføre maskininstruktioner. Før en
afvikling må programmet derfor omformes til en række maskinin-
struktioner.
T_ SYNTAKS- Når ALGOL-oversætteren arbejder, læses en kildetekst
FEJL bestående af en række tegn og cifre, jvf. udskrifts-
programmet. Oversættelsen kan kun gennemføres korrekt,
&_ såfremt kildeteksten er skrevet i overensstemmelse med
de vedtagne regler. Brud på disse regler kaldes syntaks-
fejl, og under oversættelsen registreres og udskrives
de begående fejl. I en fejlmeddelelse fortælles, hvor-
når og hvor fejlen er observeret samt fejltype. \f
E_k_s_._ _5_._2_6_
Antag at linje 70 i udskriftsprogrammet fejlagtigt er
&_ skrevet således:
T_
70 navn=6
&_ Oversættelsen af programmet giver følgende fejludskrift:
T_ 6. LINE 6.1 DELIMITER
Hvornår
Hvor
&_ Fejltype
Hvornår Oversættelsen foretages ved flere gennemløb, og det
første tal i fejlmeddelelsen fortæller, i hvilket gen-
nemløb fejlen blev registreret.
Hvor Oplysningen består af et linjenummer efterfulgt af en
positionsangivelse på linjen. Under oversættelsen til-
deles hver linje et nummer, og det er dette nummer der
henvises til.
Fejltype Der findes adskillige fejltyper. DELIMITER i eks. 5.26
betyder, at skilletegnet = er ulovligt anbragt. Der
burde have stået := .
I appendix D findes en liste over udvalgte meddelelser fra ALGOL-
oversætteren.
LOGISKE Selv om oversættelsen forløber uden fejl, kan der sta-
FEJL dig være fejl tilbage. Det er såkaldte logiske fejl,
der skyldes, at programmet er designet forkert. Forkert
designede programmer kan komme i situationer, hvor den\f
videre afvikling må opgives. En fejlmeddelelse vil bli-
ve udskrevet med oplysninger om årsag, og hvor i pro-
grammet, afviklingen blev opgivet.
T_ E_k_s_._ _5_._2_7_
10 u=algol
20 begin
30 integer field nr;
40 long array field navn;
50 zone vare(128,1,stderror);
60 nr:=6;
&_ 70 navn:=6;
T_ 90 invar(vare);
100 while vare.nr<4000 do
110begin
120 write(out,"nl",1,vare.nr,"sp",2,vare.navn);
130 invar(vare);
140 end;
150 close(vare,true);
160 end;
170 u
&_ 180 finis
Kørsel af det velkendte job, hvor linje 80 af vanvare
er udeladt, vil give følgende fejludskrift.
T_ ZONE STATE 4 INVAR
&_ CALLED FROM LINE 6-7
Det er klart, at fejlen skyldes, at zonen ikke er til-
knyttet vareregisteret.
I appendix E findes en liste over udvalgte meddelelser fra det
kørende program.
\f
T_5.7.1 K_a_l_d_ _a_f_ _A_L_G_O_L_
ALGOL-oversætteren kan aktiveres på forskellige måder, og herved
er det muligt at styre såvel indlæsning som udskrivning.
E_k_s_._ _5_._2_8_
u=algol
u=algol kilde
&_ objekt=algol kilde liste.yes bossline.yes
T_ 1
SYNTAKS <objektnavn'=algol <kildenavn'
&_ 0
T_ 11
list.yes bossline.yes
&_00
Den anførte syntaks viser blot et udvalg af mulighederne for at
overføre parametre, der kan påvirke udførelsen.
T_ <objektnavn'
&_ Bestemmer navnet på det oversatte program.
T_ <kildenavn'
Når denne oplysning er anført, læses ALGOL-teksten fra
et område med det anførte navn. Når intet er anført,
skal ALGOL-teksten optræde umiddelbart efter ALGOL-
aktiveringen.
LIST.YES Når denne parameter optræder, udskrives kildeteksten
under oversættelsen. Hver linje påbegyndes med det
tildelte linjenummer, og det er herved let at henføre
en evt. fejlmeddelelse til den relevante linje.
\f
T_ BOSSLINE.YES
Denne parameter bevirker, at linjerne udskrives med et
supplerende linjenummer, der kan benyttes ved editering
&_ med BOSS.
T_5.8 Vejledende Kørselseksempler
Afviklingen af øvelsesopgaverne i bogen kan foretages som vist i
eks. 5.4. Under tiden kan det imidlertid være bekvemt at ændre
kørselsformen. Hertil findes en række hjælpeprogrammer, hvoraf
&_ følgende vil blive omtalt:
O Med O-programmet kan uddata omdirigeres til et
område på baggrundslageret.
CONVERT Med CONVERT-programmet udskrives et område på
printeren.
SET Med SET-programmet oprettes et område.
I eksemplerne angiver BEGIN ... END en vilkårlig ALGOL-tekst.
T_ E_k_s_._ _5_._2_9_
Adskillelse af programtekst og FP-kommandoer.
10 begin
20 end
save text
clear
10 u=algol text list.yes bossline.yes
20 u
&_ 30 finis
ALGOL-teksten indtastes og gemmes i området TEXT. Herefter slet-
tes indholdet af JOBFILEN, og forskellige FP-kommandoer indtas-
tes. I kaldet af ALGOL er det fortalt, at kildeteksten skal læses
fra området TEXT, og at den skal udskrives under oversættelsen på
en måde, så hver linje forsynes med to linjenumre. Det første kan\f
benyttes ved en efterfølgende editering med BOSS, mens det andet
kan benyttes i relation til fejlmeddelelser fra ALGOL.
Ved at adskille ALGOL-teksen og FP-kommandoerne opnås, at det
første sæt linjenumre svarer nøje til de linjenumre, der tilde-
les, når ALGOL-teksten overføres til JOBFILEN med GET-komman-
doen.
T_ E_k_s_._ _5_._3_0_
Det kan være hensigstmæssigt at gemme FP-kommandoer på
baggrundslageret, hvis der skal foretages flere
&_ kørsler.
T_ 10 begih Indtast program.
20 end
save text Gem program.
&_ clear Slet JOBFILEN.
T_ 10 u=algol text Indtast FP-kommandoer.
20 u
30 finis
&_ save kommando Gem FP-kommandoer.
T_ go Tilmeld jobbet.
. . .
&_ . . . Afvendt kørselsresultatet.
T_ get text Hent ALGOL-teksten
10/begih/begin Ret ALGOL-teksten
&_ save text Gem den rettede tekst.
T_ get kommando Hent FP-kommandoerne.
&_ go Tilmeld jobbet.
E_k_s_._ _5_._3_1_
Ved hjælp af SET, O og CONVERT er det muligt at om-
dirigere uddata fra et job, så uddata udskrives på
printeren.
\f
10 outfile=set 200 Et område på 200 segmenter
reserveres til uddata.
20 o outfile Uddata omdirigeres til
OUTFILE.
30 u=algol text list.yes
40 u
50 o c Uddata dirigeres tilbage,
hvorved brugen af OUTFILE
afsluttes.
60 convert outfile OUTFILE udskrives på
printer.
70 finis
Omdirigeringen omfatter udskrivning fra ALGOL, evt.
fejludskrifter fra det kørende program samt uddata, der
er skrevet i standardzonen OUT.
T_ E_k_s_._ _5_._3_2_
Inddata, der læses ved hjælp af standardzonen IN, læses
normalt fra JOBFILEN.
10 u=algol text
20 u
30 1 2
40 3 4
&_ 50 finis
Programmet U behøver 4 tal, og de anføres umiddelbart
efter programkaldet.
\f
T_ E_k_s_._ _5_._3_3_
Indlæsning ved hjælp af standardzonen IN kan omdirige-
res ved at ændre programkaldet. Dette gøres ved at an-
føre navnet på uddataområdet umiddelbart efter program-
navnet.
10 1 2 Indtast data.
20 3 4
save data Gem data.
&_ clear
T_ 10 u=algol text
20 u data Programkald så indlæs-
ning foretages fra DATA.
&_ 30 finis.
\f
F_ 6 ALGOL
Udskriftsprogrammet blev skrevet ved hjælp af de velkendte tegn,
der findes på et skrivemaskinetastatur. I dette kapitel redegøres
for hvilke tegn, der må indgå i et ALGOL-program, og hvorledes
disse tegn kan sammensættes til symboler, talkonstanter og navne.
Den videre opbygning af erklæringer, udtryk og sætninger ved
hjælp af symboler, talkonstanter og navne behandles også, men
ikke udtømmende, da dette er genstand for en detaljeret behand-
ling i de følgende kapitler. Dette kapitel afsluttes med det
sidste led i sprogbeskrivelsen, nemlig opbygningen af programmer
ved hjælp af sætninger og erklæringer.
NOTATION Sprogbeskrivelsen gennemføres lettes ved anvendelse af
en speciel notation.
Definitioner beskrives ved hjælp af et såkaldt define-
rende lighedstegn ::= .
<begreb' ::= <definition'
I definitioner adskilles forskellige muligheder med en
lodret streng.
E_k_s_._ _6_._1_
<ciffer'::= 0 1 2 3 4 5 6 7 8 9
Et ciffer defineres til at være et af symbolerne, der
er anført til højre for det definerende lighedstegn.
Et valg mellem flere muligheder kan også angives ved at anføre
mulighederne under hinanden i en klamme.
T_ E_k_s_._ _6_._2_
<heltal'
&_ <tal'::= <reelt tal'
\f
Et tal defineres til at være et heltal eller et reelt
tal.
Når et element må optræde flere gange, kan det angives ved en
repetitionsangivelse på klammen.
T_ E_k_s_._ _6_._3_
114
<heltal' ::= + <ciffer'
&_-01
Af definitionen ses, at et heltal evt. kan indledes med
et fortegn, der skal efterfølges af mindst 1 og højst
14 cifre.
T_6.1 Tegnsæt
Følgende tegn kan indgå i et ALGOL-program:
a b c d e f g h i j
k l m n o p q r s t
u v w x y z æ ø å
A B C D E F G H I J
K L M N O P Q R S T
&_ U V W X Y Z Æ Ø Å
0 1 2 3 4 5 6 7 8 9
T_ = - * /
< ' =
. , > : ; ( )
&_ <SP'<NL'<FF'
-
& !
" % ?
\f
Nogle symboler kan ikke repræsenteres ved et grafisk
symbol, og en speciel notation er anvendt for at
markere disse tegn.
<SP' mellemslag (space).
<NL' linjeskift (new line).
<FF' sideskift ( form feed).
De enkelte tegn er adskilt med en lodret streng og opdelt gruppe-
vis i bogstaver, cifre, basistegn og grafiske tegn. Tegnene an-
vendes til at danne identifikatorer, talkonstanter, grundsymbo-
ler, strenge og til at adskille de forskellige elementer.
T_ 6.2 Identifikator
I forbindelse med anvendelsen af arbejdslageret er det nødvendigt
at erklære identifikatorer til udpegning af arbejdslagerelementer
(jvf. 4.1). Procedurer (jvf. 4.2) identificeres ligeledes med
&_ navne.
Navne i ALGOL skal overholde følgende syntaks:
T_N
<bogstav'
<navn' ::= <bogstav' <ciffer'
&_0
Af syntaksbeskrivelsen ses, at et navn skal indledes med et bog-
stav, der kan efterfølges af et vilkårligt antal bogstaver og
cifre i tilfældig rækkefølge.
E_k_s_._ _6_._4_
I første kolonne findes forskellige korrekte navne,
mens anden kolonne udelukkende indeholder ulovlige
navne. \f
T_ a 9
b2 2b
abekat G=7
a99k moms-måned
&_ udbetalingafløn udbetaling af løn
T_ O_p_g_a_v_e_ _6_._1_
&_ Find fejlene i de ulovlige navne i eks. 6.4.
Det sidste navn i første kolonne i eks. 6.4 er ret svært at læse,
hvilket er uheldigt, da betydningen af at bruge forklarende og
letlæselige navne ikke kan overvurderes. Et mellemslag kan ikke
indgå i et navn, og i stedet må tegnet _ anvendes. Dette tegn kan
anbringes overalt mellem tegn i et navn.
T_ E_k_s_._ _6_._5_
&_ udbetaling _af _løn
_tjener kun til at fremme læseligheden af et navn, og
det har på ingen måde betydning i programmæssig sammen-
hæng.
Ved valget af et navn skal man endvidere tage hensyn til, at for-
skellige tegnkombinationer er reserveret til specielle formål.
Et navn afsluttes med <SP', <NL', <FF', eller en af de i afsnit
6.4 omtalte DELIMITERS.
T_6.3 Talkonstant
Der skelnes mellem heltal og reelle tal.
<heltal'
&_ <tal' ::= <reelt tal'
En heltalskonstant skal overholde følgende syntaks: \f
114
<heltal' ::= + <ciffer'
&_-01_
T_ E_k_s_._ _6_._6_
+1 -1 +01 0987 88
&_ 17 9 -8 000 000 97
I eks. 6.6 ses, at det er lovligt at skille cifre med
mellemslag for at fremme læseligheden.
Et reelt tal består af et decimaltal, der evt. kan være efter-
fulgt at en eksponentdel.
T_ 1
<reelt tal' ::= <decimaltal' <eksponentdel'
&_0
Et decimaltal skal overholde følgende syntaks:
T_ 1k14-k
<decimaltal' ::= + <ciffer' . <ciffer'
&_ -011
Eksponentdelen er en angivelse af en potens af 10, og følgende
syntaks må overholdes:
T_ 13
<eksponentdel' ::=> + <ciffer'
&_ -01
T_ E_k_s_._ _6_._8_
&_ 5.7>2 repræsenterer værdien 5.7*10UU2DD = 5700.0
\f
T_6.4 Grundsymboler
Et grundsymbol kan bestå af et enkelt tegn eller en kombination
&_ af flere tegn. Grundsymbolerne opdeles i 4 grupper:
T_ <bogstav'
<ciffer'
<grundsymbol' ::= <logiske værdi'
&_ <delimiter'
BOGSTAV Et bogstav defineres i nøje overensstemmelse med grup-
peopdelingen i tegnsættet i afsnit 6.1.
T_ <bogstav' ::= a b c d e f g h i j
k l m n o p q r s t
u v w x y z æ ø å
A B C D E F G H I J
K L M N O P Q R S T
&_ U V W X Y Z Æ Ø Å
Med definitionen menes blot, at et bogstav kan være et af tegnene
i listen til højre for det definerende lighedstegn.
CIFFER Et ciffer defineres ligeledes i nøje overensstemmelse
med gruppeopdelingen i tegnsættet således:
<ciffer' ::= 0 1 2 3 4 5 6 7 8 9
Bogstaver og cifre indgår bl.a. i variabelnavne, som det fremgik
af afsnit 6.2. Enkeltvis har disse tegn normalt ingen selvstændig
betydning.
Undtagelsen er etcifrede talkonstanter og identifikatorer på et
bogstav.
T_ LOGISK Den tredje gruppe af grundsymboler er de logiske vær-
VÆRDI dier. I logikken kan et udsagn antage værdien sand
&_ eller værdien falsk. \f
Relationen >varenr <4000> i udskriftsprogrammet kunne
således være sand eller falsk. En logisk værdi
defineres således:
<logisk værdi'::= true false
TRUE repræsenterer værdien sand, og FALSE repræsenterer det mod-
satte.
En række boolske konstanter kan benyttes ved udskrivning af
enkelt tegn.
<boolsk konstant' :: = ><tegnsymbol'>
DELIMITER Den fjerde gruppe af grundsymboler er en broget mængde
der kan underdeles ved følgende definition:
T_ <operator'
<separator'
<delimiter'::= <parentes'
<declarator'
&_
OPERATOR I et almindeligt aritmetisk udtryk som
10+5 7 10+5 7
indgår de to aritmetiske operatorer + og . Ingen er i
tvivl om, hvad der menes med udtrykket, og at værdien
af udtrykket er 45.
For at kunne beregne udtrykket er det nødvendigt at kende opera-
tionerne, som operatorerne symboliserer, samt at kende operations-
rækkefølgen. Det er ikke ligegyldigt, om der adderes først og
multipliceres bagefter eller omvendt.
I ALGOL findes operatorer til forskellige formål.
\f
T_ <aritmetisk operator'
<relationsoperator'
<operator' ::= <logisk operator'
<sekventiel operator'
T_ ARITMETISK
OPERATOR Aritmetiske udtryk kan indgå i ALGOL-programmer, og de
sædvanlige aritmetiske operatorer kan naturligvis an-
&_ vendes. Nedenstående definition viser de almindeligste.
T_ <aritmetisk operator' ::= + -
***
&_ / // mod
T_ +, - og / har deres sædvanlige betydning
*er multiplikationstegn
** er potensopløftning
// er heltalsdivision
&_ mod er beregning af resten ved heltalsdivision
T_ E_k_s_._ _6_._9_
7 * 5= 35
10 ** 2 = 100
101 // 10= 10
&_ 101 mod 10 = 1
Operatorerne // og MOD kan ikke anvendes i forbindelse med reelle
tal.
Aritmetiske udtryk i ALGOL-programmer beregnes efter de samme
regler som sædvanlig aritmetiske udtryk. Operatorerne har føl-
gende præcedens.
\f
1. **
2. * / // mod
3. + -
T_ O_p_g_a_v_e_ _6_._2_
Beregn værdien af følgende udtryk:
&_ 7-8*10/2+3
T_ RELATIONS-
OPERATOR Relationsoperatoren < er allerede anvendt i udskrifts-
programmet. Denne operator blev anvendt til sammenlig-
&_ ning af to talstørrelser, nemlig værdien af feltet,
VARE.NR, og talkonstanten 4000. Resultatet af sammen-
ligningen kunne være sand eller falsk. Altså en logisk
værdi, som i algol repræsenteres ved TRUE eller FALSE.
<relationsoperator' ::= < <= = '= ' <'
Operatorerne har følgende betydning:
T_ < mindre end
<= mindre end eller lig med
= lig med
'= større end eller lig med
' større end
&_ <' forskellig fra
\f
T_ O_p_g_a_v_e_ _6_._3_
Sæt kryds i den rigtige rubrik.
RELATION TRUE FALSE
5 < 7
6 ' 80
7 <= 2
5 <' 5
9 '= 5+4
&_ 2 = 7-5
T_ LOGISKE En logisk operator kan anvendes i et logisk udtryk,
OPERATOR dvs. et udtryk der antager værdien TRUE eller FALSE. En
&_ relation er et eksempel på et logisk udtryk. Neden-
stående definition omfatter de 3 almindeligste logiske
operatorer.
<logisk operator' ::= -, and or
T_ E_k_s_._ _6_._1_0_
vare.nr ' 2000 and vare.nr <3000
Det logiske udtryk antager værdien TRUE, når varenum-
&_ meret er større end 2000 og mindre end 3000.
De tre operatorers betydning fremgår af følgende skema.
\f
T_
ptruetruefalsefalse
qtruefalsetruefalse
NEGATION-, qfalsetruefalsetrue
KONJUNKTIONp and q true false false false
DISJUNKTIONp or q true true truefalse
&_
Logiske operatorer og udtryk benævnes ofte boolske operatorer og
udtryk efter den engelske matematiker George Boole, der grundlagde
den symbolske logik.
T_ SEKVENTIEL
OPERATOR I udskriftsprogrammet blev DO anvendt til at udpege den
&_ næste sætning:
T_ while vare.nr <4000 do
begin
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
invar(vare);
&_ end;
En operator, der udpeger den næste sætning eller det næste ud-
tryk, kaldes en sekventiel operator.
T_ <sekventiel operator' ::= if then else
case of
fordo
repeat
&_ goto
I de følgende kapitler underkastes samtlige disse operatorer en
grundig behandling.
SEPARATOR I udskriftsprogrammet er de enkelte erklæringer og sæt-
ninger adskilt med semikolon, og parametrene i proce-
durekald er adskilt med komma.
\f
Der findes en række forskellige separatorer.
T_ <separator' ::= ,. > : = := ;
while
stepuntil
comment
&_ <FF'<NL'<SP'
De sidste separatorer, der ikke har et egentlig grafisk billede,
adskiller sig fra de øvrige, idet et vilkårligt antal af disse
separatorer kan anbringes på steder, hvor den pågældende sepa-
rator er tilladt. Dette er i udskriftsprogrammet blevet udnyttet
til at gøre programmet læsbart ved at indlede en række linjer med
flere mellemslag og ved at indsætte tomme linjer (jvf. afsnit
4.2).
Det er også lovligt at omgive separatorerne
, : ; :=
med et vilkårligt antal mellemslag og linjeskift.
Anvendelsen af de forskellige separatorer vil blive forklaret i
den rækkefølge, der bliver behov for at anvende dem i de følgende
kapitler.
PARENTES I almindelig aritmetiske udtryk kan der sættes paren-
teser for at ændre i beregningsrækkefølgen. Det samme
er muligt i ALGOL-programmer.
I ALGOL findes flere forskellige typer parenteser, der i neden-
stående definition er anført parvis svarende til deres anvendelse
T_ <parentes' ::= begin end
( )
<::'
<< '
&_ <* *' \f
BEGIN END kaldes en sætningsparentes og anvendes til at sætte
parenteser omkring sætninger i et program. Sætningsparentesen
blev i udskriftsprogrammet anvendt til at danne en sammensat sæt-
ning, ligesom hele programmet skulle indesluttes i en sætnings-
parentes.
( ) anvendes i udtryk, erklæringer, procedurekald og ved referen-
ce til elementer i variabelsæt.
T_ E_k_s_._ _6_._1_1_
(7+9)/3
zone vare(128,1,stderror);
invar(vare);
&_ vare.navn(1);
<: :' anvendes udelukkende til at indeslutte en tekststreng. Det
kan f.eks. være navnet på et område:
open(vare,4,<:vareregister:',0).
<< ' anvendes til at indeslutte en layoutstreng. En layoutstreng
angiver i forbindelse med udskrivning det grafiske billede, der
ønskes anvendt. Denne facilitet burde være udnyttet i
udskriftsprogrammet.
T_ E_k_s_._ _6_._1_2_
<<dddd'
I layoutstreng anføres et d for hver cifferposition,
&_ der ønskes udskrevet.
<* *' anvendes til at indeslutte en kommentar, der udelukkende
henvender sig til en eventuel læser af programmet. Tegnene, der
er indesluttet i denne parentes, har derfor ingen betydning i
programmæssig sammenhæng.
T_ E_k_s_._ _6_._1_3_
&_ <* dette er en intetsigende kommentar *'. \f
T_ DECLARATOR
&_ Declaratorer anvendes i erklæringer.
T_ <declarator':= boolean integer long real
array
field
zone
&_ procedure
Declaratorerne behandles i kapitel 7.
T_6.4.1 S_a_m_m_e_n_s_a_t_t_e_ _S_y_m_b_o_l_e_r_
Grundsymbolerne i den følgende liste kaldes sammensatte. Et sam-
mensat symbol skal i et ALGOL-program altid adskilles fra fore-
gående og efterfølgende bogstaver og cifre. Dette kan gøres med
&_ <SP' <NL' eller en anden delimiter, som ikke selv er et sammensat
symbol. De sammensatte symboler må ikke anvendes som identifika-
torer. Flere af symbolerne i listen vil ikke blive omtalt yder-
ligere i bogen, men de bør naturligvis kendes, så navnene ikke
anvendes ulovligt.
T_ abs external own
add extract procedure
algol false real
and field repeat
array for round
begin goto shift
boolean if step
case integer string
comment label switch
do long then
else message true
end mod until
entier of value
extend or while
&_ zone \f
T_ O_p_g_a_v_e_ _6_._4_
Analyser udskriftsprogrammet og find samtlige parente-
&_ ser, separatorer, operatorer og sammensatte symboler.
T_ O_p_g_a_v_e_ _6_._5_
Find samtlige fejl i følgende udgave af udskriftspro-
&_ grammet:
T_ begin
integer field nr;
long array field navn:
zone vare(128,1,stderror),
nr:=6;
navn:=6;
open(vare,4<:varereg:'0);
invar(vare);
while vare,nr < 4000 do
begin
write(out,"nl",2,vare.nr,"sp",2,vare.navn)
invare(vare);
end;
close(vare,true):
&_ end;
T_6.5 Programstruktur
Reglerne for hvorledes tegnene fra tegnsættet kan sammensættes
til identifikatorer, talkonstanter og grundsymboler fremgik af de
forrige afsnit. Tilbage er at sammensætte disse størrelser til
&_ erklæringer og sætninger, der kan udgøre et program.
\f
T_6.5.1 E_r_k_l_æ_r_i_n_g_e_r_
Der findes forskellige erklæringstyper.
<typeerklæring'
<variabelsæterklæring'
<erklæring' ::= <felterklæring'
<zoneerklæring'
&_ <procedureerklæring'
Erklæringer adskilles fra hinanden og fra sætninger ved hjælp af
separatoren semikolon. Syntaksen og anvendelsen af erklæringer
gennemgås i detaljer i kapitel 7.
T_ 6.5.2 S_æ_t_n_i_n_g_e_r_
Sætninger opdeles på følgende måde:
<ubetinget sætning'
<sætning' ::= <valgsætning'
&_ <løkkesætning'
De forskellige sætningstyper underkastes en grund behandling i de
følgende kapitler, og i den resterende del at dette kapitel be-
handles blot et udvalg.
T_ <elementarsætning'
<ubetinget sætning' ::= <sammensat sætning'
&_ <blok'
T_6.5.2.1 E_l_e_m_e_n_t_a_r_s_æ_t_n_i_n_g_._
VÆRDITIL- Værditilskrivning er et eksempel på en elementar-
SKRIVNING sætning.
&_
T_ E_k_s_._ _6_._1_4_
nr:=6;
&_ Elementarsætning efterfulgt af separatoren semikolon.
<værditilskrivning' ::= <identifikator' := <udtryk' \f
FUNKTION Til højre for det dynamiske lighedstegn, som separa-
toren := kaldes, skal der anføres et udtryk, og værdien
af dette udtryk tilskrives identifikatoren, der er
anført til venstre.
T_ PROCEDURE-
&_ KALD Et procedurekald er ligeledes et eksempel på en elemen-
tarsætning.
T_ E_k_s_._ _6_._1_5_
invar(vare);
&_ Elementarsætning efterfulgt af separatoren semikolon.
T_ <procedurekald' ::=
1
<procedureidentifikator' (<parameterliste')
&_0
FUNKTION Den specificerede procedure aktiveres, og ved hjælp af
parameterlisten er det muligt at overføre oplysninger
til og fra proceduren.
T_6.5.2.2 S_a_m_m_e_n_s_a_t_ _S_æ_t_n_i_n_g_._ Ved en sammensat sætning forstås en eller
&_ flere sætninger, der er indesluttet i en sætningsparentes.
T_ E_k_s_._ _6_._1_6_
begin
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
invar(vare);
&_ end
T_ <sammensat sætning'::=
N
begin <sætning'; <sætning'; end
&_ O
\f
De enkelte sætninger adskilles af semikolon.
T_ ANVENDELSE
Når flere sætninger skal udføres i forbindelse med en
løkke eller lignende, er det nødvendigt at angive hvor
&_ mange, og det angives ved en sammensat sætning.
REKURSIV I definitionen af en sammensat sætning indgår begrebet
SÆTNING på højre side, og det kan virke underligt, når
man erindrer (jvf. 6.5.2) definitionen af en sætning.
En reduktion af definitionen giver følgende:
<sætning'= begin <sætning'; <sætning'; end
Begrebet, der defineres, optræder på begge sider, og det bruges
således til at definere sig selv. En sådan definitionsform kaldes
rekursiv. Denne rekursiv definition udtrykker, at flere sammen-
satte sætninger kan indesluttes i hinanden.
T_ E_k_s_._ _6_._1_7_
begin
a:=6;
begin
write(out,"nl",1,a);
a:=7;
end;
&_ end;
En sammensat sætning bestående af en elementarsætning
og en sammensat sætning.
T_6.5.2.3 B_l_o_k_._ Ved en blok forstås en sætningsparentes, der indeslutter en
eller flere erklæringer efterfulgt af en eller flere sætninger.
\f
T_ E_k_s_._ _6_._1_8_
begin
integer k;
k:=7;
write(out,k);
&_ end
En blok bestående af 1 erklæring og 2 sætninger.
T_ NN
<blok'::=begin <erklæring'; <sætning'; end
&_ 11
T_ ANVENDELSE
Når der er behov for at erklære variable, er det nød-
&_ vendigt at konstruere en blok.
T_ O_p_g_a_v_e_ _6_._6_
&_ Er udskriftsprogrammet (afsnit 4.2) en blok?
Af den rekursive sætningsdefinition kan det udledes, at blokke
kan indesluttes i hinanden på lignende måde som sammensatte
sætninger.
T_ E_k_s_._ _6_._1_9_
begin
integer a;
a:=1;
begin
integer b
b:=2;
write(out,a,b);
end;
&_ end;
Ved konstruktion af flere blokniveauer skal man være opmærksom
på, at en variabel ikke er synlig uden for den blok, hvor den er
erklæret. I eks. 6.19 er variabel B kun tilgængelig i den indre\f
blok, hvor den er erklæret, hvorimod variabel A kan anvendes
overalt, da den indre blok er en del af den ydre blok, hvor A er
erklæret.
Når et program udføres reserveres plads til de variable, når ud-
førelsen af en blok påbegyndes, og når blokken forlades, nedlæg-
ges de i blokken erklærede variable, og den besatte plads i ar-
bejdslageret frigives og kan anvendes til andet formål. Ved en
hensigtmæssig blokopdeling er det således muligt at opnå en
rational udnyttelse af arbejdslageret.
T_ O_p_g_a_v_e_ _6_._7_
Bestem for samtlige variable, hvor de er tilgængelige.
begin
integer a;
. . .
. . .
begin
integer b;
. . .
. . .
end;
. . .
. . .
begin
integer c;
. . .
. . .
begin
integer d;
. . .
. . .
end;
end;
&_ end;
\f
Den automatiske erklæring af standardvariable og zoner kan
opfattes som en tilføjelse af en omliggende blok.
T_ begin
Erklæring af standardvariable etc.
begin
Det egentlige program.
end;
&_ end; \f
F_ 7 ERKLÆRINGER
Erklæringer kan kun foretages først i en blok (jvf. 6.5.2.3). Der
skelnes mellem følgende erklæringer.
<typeerklæring'
<variabelsæterklæring'
<erklæring'::= <felterklæring'
<zoneerklæring'
<procedureerklæring'
Erklæringer adskilles fra hinanden og fra sætninger med separa-
toren semikolon.
T_7.1 Simpel Variabel
Variable, der optager et halvord, et helord eller et dobbeltord,
kaldes simple variable, og de erklæres ved hjælp af en typeer-
&_ klæring.
E_k_s_._ _7_._1_
boolean b;
integer linjetæller,sidenr;
long antal _på _lager;
real moms _pct;
N
<typeerklæring'::=<typedeclarator' <navn' ,<navn'
0
T_ boolean
<typedeclarator'::= integer
long
&_ real
Af definitionen ses, at der kan erklæres 4 forskellige typer sim-
ple variable svarende til de 4 typedeclaratorer BOOLEAN, INTEGER,\f
LONG og REAL. Efter typedeclaratoren anføres en navneliste på et
eller flere navne. Når der er flere navne, adskilles de enkelte
navne med separatoren komma. Navnene er underkastet de i afsnit
6.2 beskrevne regler.
Anvendelsesmulighederne for de forskellige simple variable frem-
går af nedenstående tabel.
T_
TYPEVÆRDIOMRÅDEANVENDELSE
BOOLEANFALSELOGISKE VÆRDI
TRUE
INTEGERMIN. -8388608 HELTAL
MAX. 8388607
LONGMIN. -140737488355328 HELTAL
MAX. 140737488355327
REAL MIN. -10UU616DD REELT TAL
&_ MAX. 10UU616DD
De mulige værdier en variabel kan antage, kan tillægges variablen
på to måder:
1. Ved en værditilskrivning.
2. Ved indlæsning af en værdi.
T_ E_k_s_._ _7_._2_
a:=7;
&_ A tillægges værdien 7 ved en værditilskrivning.
T_ E_k_s_._ _7_._3_
read(in,a);
A tillægges værdien af et tal, som indlæseproceduren
&_ READ læser via zonen IN. \f
I forbindelse med erklæringer tillægges en erklæret variabel ikke
nogen bestemt værdi, og den aktuelle værdi bliver en tilfældig i
det mulige værdiområde.
T_7.2 Variabelsæt
Ved et variabelsæt forstås en sammenhængende mængde halvord,
helord eller dobbeltord, som der kan refereres til som en helhed
&_ eller enkeltvis.
T_ E_k_s_._ _7_._4_
&_ long array salg(1:3);
Der erklæres et variabelsæt bestående af 3 dobbeltord.
Reference til variabelsættet som helhed sker ved an-
vendelse af navnet SALG. Et enkelt element udpeges ved
navnet og et elementnummer.
T_ SALG(1) udpeger det første element.
SALG(2) udpeger det andet element.
&_ SALG(3) udpeger det tredje element.
T_ <variabelsæterklæring'::=
N
<typedeclarator' array <navn'(<ix') ,<navn'(<ix')
&_ O
Typedeclaratoren bestemmer størrelsen og værdiområdet for elemen-
terne i variabelsættet, og det stemmer nøje overens med de til-
svarende simple variable. IX bestemmer antallet af elementer.
Navne skal overholde de tidligere omtalte regler.
IX bestemmer antallet af elementer og elementnumrene.
\f
T_ N
<ix'::= <nedre ix':<øvre ix' ,<nedre ix':<øvre ix'
&_ O
DIMENSION Antallet af indices bestemmer dimensionen.
T_ E_k_s_._ _7_._5_
&_ integer array a(0:4), b(1:2,1:3);
De fem elementer i variabelsæt A udpeges på følgende
måde: A(0), A(1), A(2), A(3) og A(4).
Variabelsæt B er to-dimensionalt, og ved følgende
referencer opnås adgang til de enkelte elementer.
T_ B(1,1), B(1,2), B(1,3),
B(2,1), B(2,2), B(2,3),
&_ B består således af 2 3=6 elementer.
En variabel eller et udtryk kan også anvendes som index, og den
aktuelle værdi bestemmer det aktuelle index.
T_ E_k_s_._ _7_._6_
måned:=3;
salg(måned):=0;
&_ salg(måned*1):=0;
Det tredje element nulstilles.
\f
T_ E_k_s_._ _7_._7_
begin
integer maxindex;
read(in,maxindex);
begin
real array tabel(1:maxindex);
...
...
end;
&_ end;
Størrelsen af variabelsættet bestemmes af det indlæste tal, og
herved er det muligt at tilpasse størrelsen til det aktuelle be-
hov. Dette giver mulighed for en rationel udnyttelse af arbejds-
lageret.
T_ INDICERET Erfaringsmæssigt giver anvendelsen af indicerede va-
VARIABEL riable, som enkeltelementerne i variabelsæt kaldes,
&_ anledning til en del programmeringsfejl på grund af
fejlagtige indexangivelser. I det kørende program
kontrolleres indexangivelser løbende, og en forkert
angivelse resulterer i følgende fejludskrift:
T_ INDEX <det fejlagtige index'
&_ LINE ...
Et variabelsæt anvendes ofte, når der er behov for en række ens-
artede oplysninger. Ved udarbejdelsen af salgsoversigter på må-
nedsbasis kan det f.eks. være bekvemt at anvende et variabelsæt
med 12 elementer i stedet for at anvende 12 simple variable.
Det er almindeligt at anvende et variabelsæt af typen LONG til
opbevaring af alfanumeriske oplysninger.
\f
T_ 7.3 Feltvariabel
En feltvariabel anvendes ved reference til et felt i en post.
E_k_s_._ _7_._8_
integer field nr;
&_ long array field navn;
T_ <felterklæring'::=
1 N
<typedeclarator' array field <navn' ,<navn'
&_ 0 0
Typedeclaratoren bestemmer den felttype, som den erklærede felt-
variabel kan udpege, og et felt kan bestå af et halvord, et hel-
ord, et dobbeltord eller en sammenhængende kæde af en af disse
størrelser.
T_ FELT- Værdien af en feltvariabel bestemmer adressen på det
ADRESSE felt der udpeges. En adresse angives ved nummeret på et
halvord, og det er således, at halvordene i en post
&_ nummeres 1,2,3...etc..
Ved adresseangivelsen på et felt skelnes mellem et simpelt felt,
dvs. et felt der fylder et halvord, et helord eller et dobbelt-
ord og felter, der består af flere elementer.
Adressen på simple felter er nummereret på det sidste halvord,
der tilhører feltet. Simple felter, der fylder mere end 1 halv-
ord, kan kun være således placeret, at feltadressen er beskrevet
ved et lige tal.
Adressen på felter bestående af flere elementer bestemmes ved
adressen på 0 elementet. Adressen på dette element bestemmes på
tilsvarende måde som ved simple felter.
\f
T_ E_k_s_._ _7_._9_
zone z(128,1,stderror);
integer array field iaf;
&_ iaf:=10;
T_ POST I ZONEN Z Element reference
1 2 z.iaf(-4)
3 4 z.iaf(-3)
5 6 z.iaf(-2)
7 8 z.iaf(-1)
9 10 z.iaf( 0)
11 12 z.iaf( 1)
&_ 1314 z.iaf( 2)
Af eksempel 7.9 ses, at feltadressen blot udpeger elementet med
index 0, og at variabelsættet på sin vis omfatter hele posten.
Det gælder naturligvis også for varenavnet i udskriftsprogrammet
(afsnit 4.2), men anvendelse omfattede kun 3 felter.
Ved reference til et felt anføres såvel zone som feltvariabel ad-
skilt med punktum (jvf. eks. 7.9). Af eks. 7.9 ses endvidere, at
variabelsættet er en-dimensionalt.
T_O_p_g_a_v_e_ _7_._1_
Foretag de nødvendige erklæringer i udskriftsprogrammet
(afsnit 6.2) så det bliver muligt at udpeger samtlige
felter.
&_ Bestem endvidere feltadresserne.
Med en feltvariabel er det også muligt at udpege felter i et
variabelsæt. Nummereringen af halvordene, der bestemmer felt-
adresser, følger ikke altid den omtalte regel, hvorfor man skal
være mere forsigtig ved adressebestemmelsen. Se nærmere herom i
ref. 1. For en-dimensionelle variabelsæt hvor det nedre index er
1, nummeres halvordene efter den velkendte regel.
\f
T_ E_k_s_._ _7_._1_0_
integer array ia(1:6)
1 2 total (1)
3 4 total (2)
5 6 total (3)
7 8 total (4)
&_
Man ser, at halvordsnummereringen svarer til den velkendte fra
poster.
T_ O_p_g_a_v_e_ _7_._2_
Antag at salgsoplysningerne i en varepost udpeges, som
det er foreslået i den vejledende løsning til opgave
7.1. Et enkelt element, der indeholder en måneds salgs-
tal kan opfattes som et selvstændigt felt, der kan ud-
peges ved en feltvariabel. Bestem feltadressen på det
&_ felt, der indeholder salgstallet for januar.
T_7.4 Zone
Ved dataoverførsel mellem arbejdslageret og en ydre enhed kræves
en zonebuffer.
E_k_s_._ _7_._1_1_
&_ zone vare(128,1,stderror);
T_ <zoneerklæring'::= zone <navn'(<specifikation')
N
,<navn'(<specifikation')
&_ O
T_ <specifikation'::=
&_ <bufferstørrelse',<antal delbuffere',<navn' \f
En zonebuffer erklæres med deklaratoren ZONE, og den navngives på
sædvanlig måde.
For at kunne tilpasse zonebufferen til specielle formål angives i
zoneerklæringen en specifikation af zonebufferen. Specifikation-
en, der er indesluttet i en parentes, består af 3 oplysninger.
Første oplysning bestemmer zonebufferens størrelse målt i dobbelt-
ord.
Anden oplysning angiver, om zonebufferens skal opdeles i en eller
flere delbuffere.
Tredje oplysning er navnet på en procedure, der vil blive kaldt,
såfremt der skulle ske noget uforudset.
Den i eks. 7.11 viste zoneerklæring vil altid være den mest hen-
sigtmæssige i forbindelse med øvelsesopgaverne i denne bog.
Ved at anvende flere delbuffere er det muligt at effektivisere
programudførelsen, men det sker på bekostning af et større for-
brug af arbejdslager. En sådan effektivisering er kun mærkbar
ved behandling af større datamængder, hvor der foretages mange
datatransporter, og den er derfor uden betydning i øvelsesopga-
verne. Der gælder den regel, at der ved læsning af en fil altid
skal anvendes den samme bufferstørrelse, som blev anvendt ved
skrivning af filen.
T_7.5 Procedure
&_ Behandlingen af procedurer vil først finde sted i kapitel 13.
\f
T_7.6 Entydighed
Foruden de i afsnit 6.2 og 6.4.1 beskrevne regler skal der ved
valget af et navn tages hensyn til tidligere erklærede navne, da
&_ der i den samme blok ikke må erklæres flere ens navne.
T_ E_k_s_._ _7_._1_2_
begin
integer a;
longa;
read(in,a);
&_ end;
Oversættelse af programmet resulterer i fejludskriften
+DECLARATION, fordi det samme navn er erklæret to gange
i den samme blok.
Det er tilladt at erklære det samme navn i forskellige blokke,
men det frarådes, da det kan give anledning til usikkerhed ved
anvendelsen af navnet.
Når det samme navn er erklæret flere gange, gælder den regel, at
der ved anvendelse af navnet altid referes til den variabel, der
er erklæret nærmest ved referencestedet. Navnet, der er erklæret
i den inderste blok, der omslutter anvendelsstedet er det nær-
meste. Eks. 7.13 belyser dette.
\f
T_ E_k_s_._ _7_._1_3_
begin
write(out,a); 1.
begin
integer a;
write(out,a) 2.
begin
integer b;
write(out,a); 3.
end;
end;
begin
integer b;
write(out,a); 4.
&_ end;
end;
1. A er ikke erklæret, og referencen er ulovlig.
2. A er erklæret i samme blok, og referencen gælder denne
variabel.
3. A er ikke i denne blok, men i den nærmest omsluttende. Der
refereres således til samme variabel som i tilfælde 2.
4. A er ikke erklæret i denne blok eller i en omsluttende, og
referencen er ulovlig.
\f
F_ 8 UDTRYK
En variabel kan tillægges en værdi ved en værditilskrivning.
E_k_s_._ _8_._1_
a:=3*2;
Udtrykket beregnes, og resultatet overføres til
variablen A, der antager værdien 6.
I udtrykket kan der indgå konstanter, identifikatorer, operatorer
og parenteser.
E_k_s_._ _8_._2_
linje + 1
vare.nr<4000
<:varereg:'
Et udtryk bestemmer altid en værdi, og der skelnes mellem 3 typer
afhængig af resultattypen.
<aritmetisk udtryk'
<udtryk'::= <logisk udtryk'
<streng udtryk'
8.1 Aritmetisk Udtryk
Et aritmetisk udtryk bestemmer en talværdi. Det kan være et
heltal eller et reelt tal.
T_ E_k_s_._ _8_._3_
6
vare.nr
write(out,"nl",1,vare.nr,"sp",2,vare.navn)
linjetæller+1
&_ (pris-rabat)*momspct \f
T_ TALKONSTANT
&_ En talkonstant kan udgøre et udtryk
T_ IDENTIFI- Når der indgår en identifikator i et udtryk, er det
KATION identifikatorens aktuelle værdi, der indgår i bereg-
&_ ningen af udtrykket.
T_ E_k_s_._ _8_._4_
integer sum,a,b;
a:=1;
b:=2;
&_ sum:=a+b;
Når udtrykket A+B skal beregnes, benyttes de aktuelle
værdier, nemlig 1 og 2. Udtrykket bestemmer således
værdien 3.
T_ PROCEDURE-
FUNKTION En procedure, der antager en værdi, kaldes en proce-
&_ durefunktion. Procedurefunktioner kan indgå i udtryk,
og ved beregning af udtryk indgår værdien af procedure-
funktionen. Beregningen af denne værdi indebærer, at
proceduren udføres. WRITE er et eksempel på en proce-
durefunktion, og WRITE antager en heltalsværdi, der
fortæller hvor mange tegn, der er udskrevet.
T_ E_k_s_._ _8_._5_
k:=write(out,"sp",2);
Der er udskrevet 2 mellemslag, og WRITE antager værdien
&_ 2, der tillægges variablen K.
Udtryk skrives i ALGOL på tilsvarende måde som i matematikken.
Variationsmulighederne er mangfoldige, og en formel syntaksbe-
skrivelse er tilsvarende svær at læse. Den følgende beskrivelse
er ikke udtømmende, men giver et godt indtryk af kompleksiteten.
Indledningsvis kan beskrivelsen evt. overspringes, da en fuld-
stændig forståelse ikke er en forudsætning for den videre læs-
ning.
\f
T_ 1 1
<aritm.udtryk'::= <aritm.led' <aritm.udtryk'
0 0
* 1
<aritm.led'::= <aritm.led' / <factor'
//
mod 0
<factor'::= <led'
<factor'**<led'
<konstant uden fortegn'
<led'::= <variabel'
<procedure funktion'
&_ (<aritm.udtryk')
Af syntaksbeskrivelsen fremgår bl.a., at der altid skal være en
operator i følgende tilfælde:
1. Mellem to led.
2. Mellem parentes slut og det følgende led.
3. Mellem et led og en efterfølgende parentes begynd.
4. Mellem parentes slut og parentes begynd.
T_ E_k_s_._ _8_._6_
a+b
(a+b)*c
a/(b+c)
&_ (a+b)//(c-d)
Et udtryk beregnes på sædvanlig måde fra venstre mod højre. Dog
således at operatorerne med højest prioritet udføres først. (jvf.
opgave 6.2).
En variabel, der ønskes tilskrevet en værdi, må gerne indgå i
udtrykket, der bestemmer værdien.
\f
T_ E_k_s_._ _8_._7_
linjetæller:=0;
&_ linjetæller:=linjetæller+1;
Udtrykket LINJETÆLLER+1 beregnes, og ved denne bereg-
ning anvendes den aktuelle værdi, nemlig 0. Resultatet
af beregningen overføres til LINJETÆLLER, der herefter
antager værdien 1.
T_ O_p_g_a_v_e_ _8_._1_
Modificer udskriftsprogrammet (afsnit 4.2) så der sam-
tidig med udskrivning foretages en optælling af vare-
&_ poster. Dette antal ønskes udskrevet til sidst.
Når værdien af et udtryk er et decimaltal, skal man være påpasse-
lig med at gemme resultatet i en heltalsvariabel, da der sker en
afrunding på sædvanlig måde ved værditilskrivningen.
T_ E_k_s_._ _8_._8_
integer k;
&_ k:= 3/2;
Værdien 1.5 af udtrykket afrundes til 2 ved værditil-
skrivning, og K antager denne værdi.
T_8.2 Logisk Udtryk
Et logisk udtryk bestemmer en logisk værdi.
E_k_s_._ _8_._9_
true
"nl"
vare.nr<4000
&_ vare.nr<1000 and vare.nr'500
\f
T_ BOOLSK En boolsk konstant kan udgøre et udtryk.
KONSTANT
IDENTIFI- Når der indgår en identifikator i et udtryk, er det
KATOR identifikatorens aktuelle værdi, der indgår i bereg-
&_ ningen af udtrykket.
RELATION Talstørrelser kan sammenlignes i relationer.
T_ <
<=
<relation'::=<aritm.udtryk' = <aritm.udtryk'
'=
'
&_ <'
T_ BOOLSK I boolske udtryk kan der endvidere indgå boolske
&_ OPERATOR operatorer.
Formelt kan logiske udtryk beskrives på en tilsvarende måde som
aritmetiske udtryk. Følgende beskrivelse er ikke udtømmende, men
den giver et indtryk af kompleksiteten. Indledningsvis kan be-
skrivelsen evt. overspringes, da en fuldstændig forståelse ikke
er en forudsætning for den videre læsning.
T_ N
<logisk udtryk'::= <logisk udtryk' or <logisk led'
&_ 0
T_ N
<logisk led'::= <logisk led' and <factor'
&_ 0
T_ 1 <led'
<factor'::= -,
&_ 0 <relation'
\f
T_ <logisk værdi'
<led'::= <logisk variabel'
<logisk procedure funktion'
&_ (<logisk udtryk')
Af syntaksbeskrivelsen fremgår bl.a., at der i forbindelse med
negationsoperatoren kan optræde 2 operatorer i træk.
T_ E_k_s_._ _8_._1_0_
&_ a and -,b
Et logisk udtryk beregnes ved successive gennemløb fra venstre
mod højre. Først beregnes alle relationer, herefter beregnes alle
negationer, derefter beregnes konjunktioner, og til sidst
beregnes alle diskonjunktioner.
T_ E_k_s_._ _8_._1_1_
5<'7 and true or -, false and 7=8
Beregning af alle relationer giver følgende mellemresul-
&_ tat.
true and true or -, false and false
Udførelsen af negationen giver det næste mellemresul-
tat.
true and true or true and false.
Beregning af konjunktionerne giver det følgende mellem-
resultat.
true or false.
Slutresultatet opnås herefter ved udførelse af disjunk-
tionen.
\f
T_8.3 Streng Udtryk
Et streng udtryk bestemmer en streng.
E_k_s_._ _8_._1_2_
<:varereg:'
&_ <<dddd'
Der skelnes mellem to typer strenge:
T_ <tekststreng'
&_ <streng'::= <layoutstreng'
T_ TEKSTSTRENG
&_ En tekststreng er altid indesluttet i parentesen <: :'.
I denne parentes må der forekomme et vilkårligt antal tegn fra
tegnsættet. Tegnkombinationen <: eller :' må dog ikke forekomme.
T_ E_k_s_._ _8_._1_3_
<:lagerreg:'
&_ <:lageroversigt fra 1976:'
Tekststrenge anvendes til at specificere dokumentnavne til stand-
ardprocedurer samt ved udskrivningen af forklarende tekster.
T_ E_k_s_._ _8_._1_4_
open(vare,4,<:varereg:',0)
&_ write(out,<:artikeloversigt:');
Med WRITE-sætningen udskrives teksten ARTIKELOVERSIGT.
T_ LAYOUT- I layoutstrenge angives det grafiske billede, der øn-
&_ STRENG skes anvendt ved udskrivningen af talstørrelser.
\f
T_ Et tal kan udskrives på flere måder, f.eks.
5
&_ 5.00
I layoutstrenge angives et ciffer ved et d. Ovenstående grafiske
billeder repræsenteres ved følgende layoutstrenge:
T_ <<d'
&_ <<d.dd'
Ved udskrivning af negative tal er det bekvemt at reservere plads
til udskrivning af fortegnet.
Dette kan gøres således:
<<-d.dd'
Layoutstrenge kan indledes med et mellemslag, der vil blive
udskrevet først, f.eks.
<< -d.dd'
Ved udskrivning anføres layoutstrengen umiddelbart før udtrykket,
der skal skrives.
T_ E_k_s_._ _8_._1_5_
&_ write(out,<<-dd.dd',beløb);
T_ O_p_g_a_v_e_ _8_._2_
Ret udskriftsprogrammet så varenummeret udskrives med
det ønskede layout.
&_ Husk endvidere overskriften.
\f
T_8.4 Flervalgsudtryk
Konstruktionen
case <heltalsudtryk' of (udtryksliste')
kaldes et flervalgsudtryk. Udtrykslisten består af et vilkårligt
&_ antal udtryk af samme type adskilt med separatoren komma.
T_ E_k_s_._ _8_._1_6_
case kvartal af
(<:1.kvartal:',
<:2.kvartal:',
<:3.kvartal:',
&_ <:4.kvartal:')
Under udførelsen beregnes heltalsudtrykket, og værdien udpeger
det udtryk i listen, der bestemmer flervalgsudtrykkets aktuelle
værdi. Såfremt variablen KVARTAL antager værdien 2, er værdien af
flervalgsudtrykket i eks. 8.16 strengen
<:2.kvartal:'.
Et flervalgsudtryk kan antage en talværdi, en logisk værdi eller
en strengværdi. Udtrykket i udtrykslisten skal være af samme ty-
pe, og værdien af flervalgsudtrykket er af denne type.
T_ E_k_s_._ _8_._1_7_
case mulighed af (1,2,3,4,5)
&_ Flervalgsudtryk, der antager en heltalsværdi.
\f
T_8.5 Tovalgsudtryk
Et specialtilfælde af flervalgsudtrykket er det tilfælde, hvor
der kan vælges mellem to muligheder.
E_k_s_._ _8_._1_8_
&_ case mulighed af (a,b)
Valget mellem to muligheder kan udtrykkes i et tovalgsudtryk.
T_ <tovalgsudtryk'::=
&_ if <logisk udtryk' then <udtryk' else <udtryk'
T_ E_k_s_._ _8_._1_9_
if a=6 then 7 else 8
&_ if måned=1 then <:januar:' else <:andet:'
Under udførelsen beregnes det logiske udtryk, og antager det vær-
dien TRUE, bestemmer udtrykket efter THEN værdien af tovalgsud-
trykket. Når det logiske udtryk antager værdien FALSE, bestemmer
udtrykket efter ELSE værdien af tovalgsudtrykket. De to udtryk
skal være af samme type, og resultatet af tovalgsudtrykket er af
denne type.
E_k_s_._ _8_._2_0_
write(out,if måned<7 then <:første halvår:'
else <:andet halvår:');
Tovalgsudtrykket bestemmer et strengudtryk, og når
variablen MÅNED antager en værdi under 7, udskrives
FØRSTE HALVÅR, og ved andre værdier udskrives ANDET
HALVÅR.
\f
R_E_F_E_R_E_N_C_E_
1. ALGOL 7, Reference manual
2. BOSS 2, User>s manual
3. System 3, Utility Programs, part 1.
4. ALGOL 7, User>s manual, part 1.
5. ALGOL 7, User>s manual, part 2. \f
\f
«eof»