DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦c22093fad⟧ TextFile

    Length: 183680 (0x2cd80)
    Types: TextFile
    Names: »D51«

Derivation

└─⟦1e8064b49⟧ Bits:30005867/disk07.imd Dokumenter (RCSL m.m.)
    └─⟦this⟧ »D51« 

TextFile

                   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»