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