|
|
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: 171264 (0x29d00)
Types: TextFile
Names: »D56«
└─⟦1e8064b49⟧ Bits:30005867/disk07.imd Dokumenter (RCSL m.m.)
└─⟦this⟧ »D56«
i
T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_
1. GENERAL DESCRIPTION .................................... 1
2. SPECIFICATIONS ......................................... 2
2.1 Performance Specifications ........................ 2
2.2 Electrical Specifications ......................... 2
2.3 Environmental Specifications ...................... 2
2.4 Physical Specifications ........................... 2
3. INSTALLATION ........................................... 3
3.1 Controller Installation ........................... 3
3.2 Modem Connection .................................. 4
3.3 Switches and Strappings ........................... 4
3.3.1 Group Strapping ............................ 4
3.3.2 Clock Selection ............................ 5
4. CHECK OUT PROCEDURES ................................... 7
\f
ii
\f
1_._ _ _ _ _ _ _ _ _G_E_N_E_R_A_L_ _D_E_S_C_R_I_P_T_I_O_N_ 1.
The SMX702 is a binary synchroneous communication multiplexer
consisting of up to 32 channels, each containing a receiver and a
transmitter.
It is intended for use as interconnection media between the
RC3600 computer and datex modems using the CCITT recommendation
X.21 call and wait call procedures.
It is based on the SMX701 controller, which is used for V.24
synchroneous communication.
Only the interface is changed.
\f
F_ 2_._ _ _ _ _ _ _ _ _S_P_E_C_I_F_I_C_A_T_I_O_N_S_ 2.
2_._1_ _ _ _ _ _ _ _P_e_r_f_o_r_m_a_n_c_e_ _S_p_e_c_i_f_i_c_a_t_i_o_n_s_ 2.1
Maximum transmission speed is 9600 bps.
Interface circuits are CCITT recommendation X.27, which allows
cable length of up to 1200 m at this transmission speed.
2_._2_ _ _ _ _ _ _ _E_l_e_c_t_r_i_c_a_l_ _S_p_e_c_i_f_i_c_a_t_i_o_n_s_ 2.2
Supply voltage: +5 V +_5%
Current requirement: 3.8 A (per controller, 4 channels)
2_._3_ _ _ _ _ _ _ _E_n_v_i_r_o_n_m_e_n_t_a_l_ _S_p_e_c_i_f_i_c_a_t_i_o_n_s_ 2.3
Ambient Temperature: 10-35C
Relative Humidity: 20-80% without condensation.
Heat dissipation: 19 W
2_._4_ _ _ _ _ _ _ _P_h_y_s_i_c_a_l_ _S_p_e_c_i_f_i_c_a_t_i_o_n_s_ 2.4
Space requirement: 1 slot in the RC3600 CHS system per 4
channels.
\f
F_ 3_._ _ _ _ _ _ _ _ _I_N_S_T_A_L_L_A_T_I_O_N_ 3.
3_._1_ _ _ _ _ _ _ _C_o_n_t_r_o_l_l_e_r_ _I_n_s_t_a_l_l_a_t_i_o_n_ 3.1
Installation of the SMX702 in an already delivered system:
The communication controller must be mounted in a free slot in a
controller chassis. The controller does not use the DMA channel,
therefore the position in the priority chain is irrelevant.
a) Remove the RC2236 PCB from the position in the card cage where
the controller is to be mounted.
b) Mount the label 'SMX702-1001' on the right side and
'SMX702-1004' on the left side of the card cage to indicate
the position of the controller.
c) Remove the bottom of the CHS card cage chassis by loosening
the two screws on the front and pull it free on the slides.
d) Mount the two CBL129 in the chassis in the following order:
1) Mount the brackets with the 19 pin connectors at the back
of the chassis (A) and connect the chassis terminal.
2) Lead the free end of the CBL129 through the hole (B) in the
chassis on both sides.
3) Mount the controller board in the selected position.
4) Mount the edge connectors in the selected position (C) for
the controller.
e) Reenter the bottom of the chassis and fasten the screws.
\f
3_._2_ _ _ _ _ _ _ _M_o_d_e_m_ _C_o_n_n_e_c_t_i_o_n_ 3.2
The modem cables are connected to the 19 pin connectors on the
back of the chassis. 4 cables per controller. CBL987 (12 m) or
KBL503 (40 m) can be used.
3_._3_ _ _ _ _ _ _ _S_w_i_t_c_h_e_s_ _a_n_d_ _S_t_r_a_p_p_i_n_g_s_ 3.3
3_._3_._1_ _ _ _ _ _G_r_o_u_p_ _S_t_r_a_p_p_i_n_g_ 3.3.1
The SMX702 will normally be delivered as group 0, i.e. channel
numbers 0-3.
It is possible to run 8 groups to get a total number of 32 chan-
nels. This is done by solder straps in position 141.
Note: The boards have no interconnection except the I/O bus and
can therefore be placed anywhere in the system.
\f
3_._3_._2_ _ _ _ _ _C_l_o_c_k_ _S_e_l_e_c_t_i_o_n_ 3.3.2
It is possible to get the clock to a channel receiver and
transmitter either internally from a clock generator or from a
modem.
Four speeds can be selected internally by solder strapping as
described below.
I_n_t_e_r_n_a_l_,_ _f_o_r_ _T_e_s_t_ _P_u_r_p_o_s_e_
SMX702 delivers S clock
E_x_t_e_r_n_a_l_,_ _f_o_r_ _N_o_r_m_a_l_ _U_s_e_
The clock to the receiver and the transmitter is delivered from
the modem.
\f
\f
F_ 4_._ _ _ _ _ _ _ _ _C_H_E_C_K_ _O_U_T_ _P_R_O_C_E_D_U_R_E_S_ 4.
On installation and after repair the following test must be car-
ried out.
a) Mount the KBL502 testplug on the controller instead of CBL129.
Channel 0.1 is tested when mounted at 1001 (right side) and
channel 2.3 is tested when mounted at 1004 (left side).
b) Set clock strapping for internal clock.
c) Load the MUS system with SMX driver and testprogram RC36-00240
(the same as used for SMX701).
d) Start the program and check that no errors occur (calling in-
dicator is not used on SMX702).
For diagnostic purpose the stand alone SMX701 testprogram 44RT810
can be used. As the interface on the SMX702 is different from the
interface on the SMX701, the testplug KBL502 must be used. With
this testplug mounted and strappings for internal clock, the er-
ror reports for the SMX701 interface signals must be translated
this way:
SMX701 SMX702
transmit data T
receive data R
calling indicator C
data set ready I
carrier detect c
The T, R, C and I are X.21 interface signals.
The KBL502 makes the following loop-back connections:
T-R and C-I.
\f
F_
\f
\f
F_ 9 SÆTNINGER
SEKVENS Handlinger, der skal udføres, udtrykkes i sætninger, og
i programmer udføres sætninger i den rækkefølge, de
optræder.
T_ F_i_g_._ _9_._1_
SEKVENS
sætning 1 sætning 2 sætning 3
1 2 3 4
&_
Grafen i fig. 9.1 viser, at sætning 1 afvikles først, herefter
følger sætning 2 og til sidst sætning 3. Denne ubetingede ud-
førelse af sætningerne kaldes en sekventiel udførelse.
Når en handling er underkastet en betingelse, afbildes det i en
graf ved, at der udgår flere kanter fra en knude. Ved gennemløb
af grafen følges en af disse kanter, og værdien af betingelsen
bestemmer hvilken. Figur 9.2 illustrerer valgmuligheden mellem
flere sætninger. I valget er det kun muligt at udpege 1 af de
foreliggende sætninger.
\f
T_ F_i_g_._ _9_._2_
VALG
sætning 1
sætning 2
1 2
&_ sætning 3
Den tredje grundkonstruktion er løkken, der udtrykker, at en
sætning skal udføres gentagne gange. I en graf illustreres en løkke
ved, at der går en bane tilbage til en knude, der allerede er pas-
seret.
T_ F_i_g_._ _9_._3_
LØKKEN
sætning 2
sætning 1 sætning 3
&_
Sekvenser, valg og løkker er grundelementerne i al programmering,
og til hver af disse konstruktioner svarer en sætningstype i
ALGOL.
\f
T_ <ubetinget sætning'
<sætning'::= <valgsætning'
&_ <løkkesætning'
Fra udskriftsprogrammet erindres, at en sætning kunne være en
sammensat sætning. En kant, der symboliserer en sammensat sæt-
ning, kan opdeles i kanter, der hver især symboliserer en af
sætningerne i den sammensatte sætning. Fig. 9.4 illustrerer
dette.
T_ F_i_g_._ _9_._4_
sammensat sætning
1 4
sætning 1 sætning 2 sætning 3
1 2 3 4
&_
T_ 9.1 Ubetinget Sætning
Der skelnes mellem flere ubetingede sætninger.
<elementarsætning'
<ubetinget sætning'::= <sammensat sætning'
&_ <blok'
T_9.1.1 E_l_e_m_e_n_t_a_r_s_æ_t_n_i_n_g_
E_k_s_._9_._1_
nr:=6;
open(vare,4,<:varereg:',0);
;;
&_ goto næste;
De to første sætninger i eks. 9.1 er velkendte, nemlig en værdi-\f
tilskrivning og et procedurekald. Den tredje sætning, der skulle
befinde sig mellem de to semikoloner, er ikke nogen egentlig sæt-
ning, og den kaldes en tom sætning. Den fjerde sætning er en så-
kaldt hopsætning, men det hører ikke til god programmeringsetik
at anvende denne sætningstype.
T_ <værditilskrivning'
<elementarsætning' ::= <procedurekald'
<tom sætning'
&_ <hopsætning'
T_ VÆRDITIL-
&_ SKRIVNING Anvendelse af denne sætningstype er velkendt.
T_ N
<værditilskrivning'::= <variabel':= <udtryk'
&_ 1
:= kaldes et dynamisk lighedstegn.
Syntaksbeskrivelsen viser, at det i den samme sætning er muligt
at tillægge flere variable den samme værdi. I dette tilfælde
kræves dog typemæssig overensstemmelse mellem de variable.
T_ E_k_s_._ _9_._2_
integer, sum,total,tæller;
sum:=total:=tæller:=0;
&_ PROCEDURE-
KALD En procedure aktiveres ved at skrive procedurens navn
T_ samt en mulig parameterliste med oplysninger til pro-
ceduren.
m_ 1
<procedurekald'::=<procedurenavn' (<parameterliste')
p_ 0
&_\f
T_ N
<parameterliste'::=<parameter' ,<parameter'
&_ 0
T_ <parameter'::= <udtryk'
&_ <zone'
T_ E_k_s_._ _9_._3_
write(out,<:artikeloversigt:',"nl",1);
&_ write(out,pris+moms);
Den tilladte parameterliste er bestemt i hvert enkelt tilfælde
ved procedureerklæringen. (se kapitel 13).
T_ TOM Når der optræder to separatorer umiddelbart efter hin-
&_ SÆTNING anden, omslutter disse variable en tom sætning.
T_ E_k_s_._ _9_._4_
;;
&_ ; end
Udførelse af en tom sætning resulterer ikke i nogle operationer,
og en tom sætning har derfor normalt ingen betydning.
T_ HOP- Et program udføres sekventielt i den rækkefølge, sæt-
SÆTNING ningerne er skrevet. Med en hopsætning udpeges den næs-
&_ te sætning, der skal udføres, og sekvensen afbrydes
herved.
T_ E_k_s_._ _9_._5_
goto næste _sætning;
a:=7;
&_ næste _sætning:write(out,"nl",1);
Hopsætningen udpeger WRITE-sætningen, og værditilskriv-
ningen vil aldrig blive udført.
<hopsætning'::= goto <etikette' \f
En sætning kan navngives med en etikette, og navnet skal overhol-
de de sædvanlige regler. En sætning må ikke tildeles samme navn
som en variabel. Sætningsnavnet anbringes foran sætningen og ad-
skilles fra denne med separatoren kolon (jvf. eks. 9.5).
Etiketteangivelsen i hopsætningen viser navnet på den næste sæt-
ning, der skal udføres efter hopsætningen.
En sådan brat afbrydelse af en sekvens er ikke tilladt i følge
moderne programmeringsetik, og det frarådes på det kraftigste, da
anvendelsen af hopsætninger gør programmer vanskeligt forståe-
lige.
Med undtagelse af eks. 9.4, der viser en hopsætning, er denne
sætningstype ikke anvendt i bogen, og heraf kan bl.a. udledes, at
programmeringsopgaver kan løses på naturlig måde uden anvendelse
af hopsætninger.
T_9.1.2 S_a_m_m_e_n_s_a_t_ _S_æ_t_n_i_n_g_
En eller flere sætninger, der er indesluttet i en sætningsparen-
tes, kaldes en sammensat sætning.
<sammensat sætning'::=
N
begin <sætning'; end
&_ 1
T_ E_k_s_._ _9_._6_
begin
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
invar(vare);
&_ end
En sammensat sætning udtrykker en handling, der kun kan udføres
ved anvendelse af flere sætninger. Når flere sætninger skal ud-
føres i en løkke, er det bl.a. nødvendigt at indeslutte de enkel-
te sætninger i en sætningsparentes, så det er muligt at se, hvor\f
mange der tilhører løkken.
I eks. 9.6 består den sammensatte sætning af 3 sætninger:
1. write(out,"nl",1,vare.nr,"sp",2,vare.navn)
2. invar(vare)
3. En tom sætning mellem semikolon og END.
Det er tilladt at udelade det sidste semikolon, så den tomme
sætning forsvinder.
T_9.1.3 B_l_o_k_
Når der er behov for at erklære variable, er det nødvendigt at
åbne en blok, og det kan gøres overalt, hvor det er lovligt at
&_ anbringe en sætning.
T_ N N
<blok'::=begin <erklæring'; <sætning'; end;
&_ 1 1
Den meget fleksible oprettelse og nedlæggelse af variable, som
blok-konstruktionen giver mulighed for, muliggør en rationel ud-
nyttelse af arbejdslageret. Dette har i forbindelse med større
administrative programmer en særlig stor betydning, da disse pro-
grammer ofte indeholder en sortering af data, hvor det er ønske-
ligt, at mest muligt arbejdslager er til rådighed for sorterings-
proceduren.
\f
T_ E_k_s_._ _9_._7_
begin
begin
erklæringer
hent data fra et register og
dan hjælpeposter
end;
begin
erklæringer
sorter hjælpeposter
end;
begin
erklæringer
udskrivning
end;
&_ end;
I den skitserede programstruktur sikres, at hele ar-
bejdslageret kan udnyttes af sorteringsproceduren, da
de variable, der blev brugt i forbindelse med dannelsen
af posterne, bliver nedlagt, når blokken forlades.
Under udskrivningen er alle de tidligere variable ned-
lagt, og arbejdslageret bliver derfor udnyttet på den
bedst mulige måde.
T_ 9.2 Valgsætning
Et valg kan være et spørgsmål om noget skal udføres eller ej. Det
kan også være et spørgsmål om valget mellem to alternativer.
&_ Endelig kan det være et valg mellem en række muligheder, hvoraf
en kan udvælges. Svarende til de forskellige valgtyper findes
forskellige valgsætninger.
T_ <valgsætning'::= <betinget sætning'
&_ <case sætning'
\f
T_9.2.1 B_e_t_i_n_g_e_t_ _S_æ_t_n_i_n_g_
E_k_s_._ _9_._8_
if vare.beholdning<100 then
write(out,"nl",1,vare.nr,"sp",2,vare.navn)
WRITE-sætningen udføres kun, såfremt relationen
&_ VARE.BEHOLDNING <100 er TRUE.
T_ E_k_s_._ _9_._9_
if tæller mod 2=0
then write(out,"nl",1)
&_ else write(out,"sp",2)
Såfremt relationen TÆLLER mod 2=0 er TRUE, udføres den
første WRITE-sætning. Når relationen er FALSE, udføres
den anden WRITE-sætning.
T_ <betinget sætning'::=
if <logisk udtryk' then <ubetinget sætning'
&_ if <logisk udtryk' then <ubetinget sætning' else <sætning'
IF THEN IF THEN-sætningen anvendes, når en sætning kun skal ud-
føres, når en given betingelse er opfyldt. Den ubetin-
gede sætning udføres kun, såfremt det logiske udtryk
antager værdien TRUE. Fig. 9.4 illustrerer dette gra-
fisk.
\f
T_ F_i_g_._ _9_._4_
sætning
1 2
tom
&_ sætning
T_ O_p_g_a_v_e_ _9_._1_
Modificer udskriftsprogrammet i afsnit 4.2, så artikel-
oversigten kun omfatter de varer, der har en behold-
&_ ning, der er større end 50.
Modificer udskriftsprogrammet yderligere, så
artikeloversigten kun omfatter varer fra gruppe 3, og
som har en beholdning der er større end 50.
T_ IF THEN Et valg mellem to alternativer udtrykkes i en IF THEN
ELSE ELSE-konstruktion. Den ubetingede sætning udføres, når
det logiske udtryk antager værdien TRUE, og sætningen
efter ELSE udføres, når værdien er FALSE. Det er såle-
&_ des kun en af disse sætninger, der udføres. Fig. 9.5
illustrerer dette grafisk, og det ses bl.a. at IF-sæt-
ningen er et specialtilfælde af IF THEN ELSE-sætningen,
når sætningen efter ELSE er en tom sætning.
\f
T_ F_i_g_._ _9_._5_
sætning 1
1 2
&_ sætning 2
Den ubetingede sætning adskilles med separatoren ELSE fra den ef-
terfølgende sætning og ikke med semikolon som i de fleste andre
tilfælde.
T_ E_k_s_._ _9_._1_0_
if a=b then write(out,"nl",1) else a:=7;
if boo then
begin
a:=7;
boo:=false;
end
&_ else invar(z);
Der må aldrig forekomme semikolon foran ELSE.
T_ E_k_s_._ _9_._1_1_
En betinget sætning kan ikke følge umiddelbart efter
THEN, og det er nødvendigt at anvende en sætningspa-
rentes.
if a=b then
begin
if c=d then a:=1 else a:=2;
end else
&_ if c=d then a:=3;
\f
T_9.2.1.1 U_d_s_k_r_i_f_t_s_p_r_o_g_r_a_m_m_e_t_._ Introduktionen af betingede sætninger giver
mulighed for at ændre udkriftsprogrammet (afsnit 4.2), så den
ønskede artikeloversigt kan produceres. En udbygning af grafen
&_ fig. 4.5 afklarer problemet.
T_ F_i_g_._ _9_._6_
6
side skift ny linie
start
1 2 4 5 3
ny kolonne
&_ afslut
To valgmuligheder er tilføjet i forhold til tidligere. For det
første om der skal skiftes side eller ej, og for det andet om der
skal skiftes linje eller kolonne. Betingelsen for sideskift
bestemmes af det antal artikler, der kan stå på en side, nemlig
70. Linjeskift skal foretages efter hver anden post. For at styre
dette, er det nødvendigt at indføre en hjælpevariabel til
optælling af poster.
Den følgende programsekvens viser den centrale del af udskrifts-
programmet.
\f
T_ open(vare,4,<:varereg:',0);
invar(vare);tæller:=1;
while vare.nr <4000 do
begin
if tæller mod 70=1 then
write(out,"ff",1,
"nl",1,<:artikeloversigt:',
"nl",2,"sp",9,<:varenr varenavn:',"sp",15,
<:varenr varenavn:';
"nl",1);
if tæller mod 2=1 then
write(out,"nl",1,"sp",9) else write(out,"sp",3);
write(out,<<dddd',vare.nr,"sp",6,vare.navn);
invar(vare);tæller:=tæller+1;
&_ end;
T_ O_p_g_a_v_e_ _9_._2_
Kan styringen af overskrifter og linjeskift foretages
&_ på andre måder?
T_ 9.2.2 C_a_s_e_ _S_æ_t_n_i_n_g_
E_k_s_._ _9_._1_2_
case mulighed of
begin
write(out,<:mulighed 1:');
write(out,<:mulighed 2:');
write(out,<:mulighed 3:')
&_ end;
Hvis variablen MULIGHED har værdien 1, udføres den før-
ste WRITE-sætning, hvis variablen har værdien 2, udfør-
es den anden WRITE-sætning, og endelig udføres den tred-
je WRITE-sætning, når MULIGHED har værdien 3.
\f
T_ <case sætning'::=
case <heltalsudtryk' of
begin
<sætningsliste'
&_ end
T_ N
<sætningsliste'::= <sætning' ;<sætning'
&_ 0
Sætningerne i sætningslisten adskilles indbyrdes med semikolon.
Den sidste sætning adskilles fra den følgende sætning i program-
met med END.
T_ E_k_s_._ _9_._1_3_
case mulighed of
begin
a:=1;
a:=2;
&_ end
Sætningslisten består af 3 sætninger.
1. a:=1
2. a:=2
3. En tom sætning mellem semikolon og END.
Et udvalg mellem flere muligheder udtrykkes i en CASE-sætning.
Heltalsudtrykket bestemmer i udførelsesøjeblikket hvilken sætning
i sætningslisten, der skal udføres. Grafisk kan CASE-sætning af-
bildes ved flere kanter, der udgår fra den samme knude, og CASE-
sætningen er således en generalisering af IF-sætningerne.
\f
T_ F_i_g_._ _9_._7_
mulighed 1
mulighed 2
1- - - - - - - - - - - - - - - 2
&_ mulighed N
Sætningerne i sætningslisten nummeres 1,2,3 etc., og såfremt
heltalsudtrykket under udførelsen antager en værdi, der ikke
udpeger en sætning, afbrydes programmet med udskriften
CASE <forsøgt mulighed'
CALLED FROM LINE ...
T_9.2.2.1 A_n_v_e_n_d_e_l_s_e_ _a_f_ _C_a_s_e_._ Der ønskes udarbejdet en ny artikeloversigt,
hvor artiklerne er opdelt i 4 søjler efter beholdning. Udskriften
&_ er skiteseret i fig. 9.8.
T_ F_i_g_._ _9_._8_
BEHOLDNING
=0 <10 <100 '=100
varenr varenr behold- varenr behold- varenr behold-
ning ning ning
xxxx xxxx xxx xxxx xxxxxx
xxxx xxxx xx xxxx xxxxxx
xxxx xx xxxx xxx
xxxx xxxxxx
xxxx
&_ xxxx xxxx xx xxxx xxx xxxx xxxxxx
Artiklerne skal udskrives i stigende varenummerorden, og som fig.\f
9.8 viser, skal der så vidt muligt udskrives en artikel i hver
søjle. Kravet om, at artiklerne skal udskrives i stigende orden,
vil dog give mange tomme pladser. Der ønskes endvidere skrevet 3
stjerner efter de artikler, der har en beholdning på mere end
1000 stk. Der skal ikke tages hensyn til sideskift.
Af fig. 9.8 ses, at der skal udføres 4 forskellige ting afhængig
af beholdningen.
T_ 1. Beholdning =0
&_ Udskriv varenummeret.
T_ 2. Beholdning <10
&_ Udskriv varenummer og beholdning.
T_ 3. Beholdning <100
Udskriv varenummer og beholdning, men med et nyt
&_ layout.
T_ 4. Beholdning '=100
Udskriv varenummer og beholdning med et andet layout
end tidligere. Udskriv endvidere 3 stjerner, når be-
&_ holdningen er på mere end 1000 stk..
Et valg mellem 4 muligheder udtrykkes lettest i en CASE-sætning.
CASE-konstruktionen skal foruden de nødvendige WRITE-sætninger
også rumme sætninger til styring af linjeskift og søjleskift,
idet der ikke skal tages hensyn til formularskift. Der skal fore-
tages linjeskift, når de efterfølgende vare tilhører den samme
gruppe, som netop er behandlet eller en gruppe med mindre be-
holdning.
Selve læsningen af posterne fra vareregisteret kan naturligvis
foretages på tilsvarende måde som tidligere, og tegnes en graf
over problemet, er det blot udskriftdelen, der er forandret.
\f
T_ F_i_g_._ _9_._9_
læst post
gruppe 1
gruppe 2
start bestem
1 2 4 gruppe 3 5 3
gruppe
gruppe 4
afslut
&_
Behandlingen af de enkelte grupper kan analyseres yderligere.
T_ Gruppe 1.
&_ Der skal altid skiftes linje og udskrives varenummer.
T_ Gruppe 2.
Skift linje, såfremt forrige vare tilhørte gruppe
2, 3 eller 4. Positioner til søjle 2. Udskriv
varenummer og beholdning.
T_ Gruppe 3.
Skift linje såfremt forrige vare tilhørte gruppe 3
eller 4. Positioner til søjle 3. Udskriv varenummer
&_ og beholdning.
T_ Gruppe 4.
Skift linje såfremt forrige vare tilhørte gruppe 4.
Positioner til søjle 4. Udskriv varenummer og behold-
ning samt 3 stjerner, når beholdningen er større end
&_ 1000.
\f
Det er let at skrive CASE-konstruktionen
T_ case gruppe of
begin
<*gruppe 1*'
&_ write(out,"nl",1,<<dddd',vare.nr);
T_ <* gruppe 2 *'
begin
if forrige gruppe'1
then write(out,"nl",1,"sp",7)
else write(out,"sp",3);
write(out,<<dddd',vare.nr,"sp",4,
<<dd',vare.beholdning);
&_ end;
T_ <* gruppe 3 *'
begin
if forrige _gruppe ' 2 then write(out,"nl",1,"sp",22)
else
if forrige _gruppe = 2 then write(out,"sp",5)
else write(out,"sp",18);
write(out,<<dddd',vare.nr,"sp",4,
<<ddd',vare.beholdning);
end;
&_
<* gruppe 4 *'
T_ begin
case forrige _gruppe of
begin
write(out,"sp",33);
write(out,"sp",20);
write(out,"sp", 4);
write(out,"nl",1,"sp",37)
end;
&_\f
T_ write(out,<<dddd',vare.nr,"sp",4,
<<dddddd',vare.beholdning);
if varebeholdning '1000 then
write(out,<: ***:');
end
&_ end;
Strukturmæssigt svarer den resterende del af programmet nøje til
det velkendte udskriftsprogram (afsnit 4.2), og det er let at
gøre programmet færdigt.
begin
integer
forrige _gruppe,
gruppe;
T_
integer field
nr;
&_
long field
T_ beholdning;
&_
zone
T_ vare(128,1,stderror);
&_
nr:=6;
T_ beholdning:=22;
&_
forrige _gruppe:=4;
T_
&_ open(vare,4,<:varereg:',0);
invar(vare);
T_
&_
\f
T_ write(out,"ff",1,"sp",15,<:b e h o l d n i n g:',
"nl",2,<: = 0:',"sp",10,<:< 10:',
"sp",10,<: < 100:',"sp",10,<:'= 100:',
"nl",2,<: varenr varenr behold- varenr behold- :',
<: varenr behold-:',
"nl",1,<: ning ning :',
<: ning :',
"nl",2);
while vare.nr <4000 do
begin
if vare.beholdning = 0 then gruppe:=1 else
if vare.beholdning <10 then gruppe:=2 else
if vare.beholdning<100 then gruppe:=3 else
&_ gruppe:=4;
T_ case gruppe of
&_ begin
<* den netop udarbejdede case-konstruktion *'
end;
T_ forrige _gruppe:=gruppe;
invar(vare);
&_ end;
T_ close(vare,true);
&_ end;
T_
O_p_g_a_v_e_ _9_._3_
Modificer det netop udarbejdede program, så der skiftes
side, når der er skrevet 30 linjer på hver side. Over-
skriften skal udskrives på hver side.
\f
T_9.3 Løkke-Sætning
En løkke er styret af en betingelse, der bestemmer, hvornår
løkken skal forlades. I løkke-konstruktioner skelnes mellem to
hovedtilfælde:
1. Antal gennemløb er kendt.
&_ 2. Antal gennemløb er ukendt.
Når antallet af gennemløb er ukendt skelnes mellem to tilfælde:
T_ 1. Løkken skal ikke nødvendigvis gennemløbes. \f
9.10 viser FOR STEP-sætningen fra eks. 9.14.
T_ F_i_g_._ _9_._1_0_
WRITE
4 3
i:=i+1i <=3
2
i:=1i'3
15
&_
I tillægges først værdien 1. Fra knude 2 vælges herefter kanten,
der fører til knude 3, da I er mindre end 3. Udskrivningen fore--
tages, hvorefter udtrykket til højre for STEP (dvs. 1) adderes
til I, og man er tilbage i knude 2. Den samme bane vælges atter,
da værdien af I er 2. Denne værdi udskrives og en ny værdi be-
regnes, hvorefter I antager værdien 3, og den samme bane følges.
Ved næste ankomst til knude 2, antager I værdien 4 og løkken for-
lades.
T_ E_k_s_._ _9_._1_5_
for i:= 3 step 3 until 9 do
for k:= min step skridt until max do
&_ for k:= max step skridt until min do
Når udtrykket, der bestemmer ændringen af den kontrollerende
variabel, er negativt, angiver det første untryk den øvre grænse,
og det sidste udtryk den nedre grænse.
\f
T_ E_k_s_._ _9_._1_6_
Det totale salg af en vare ønskes beregnet. Addition af
samtlige måneders salg giver det ønskede resultat.
&_ årssalg:=vare.salg(1)+vare.salg(2)+...+vare.salg(12)
Den gentagne addition kan også udføres med følgende
programsekvens:
T_ årssalg:=0;
for måned:= 1 step 1 until 12 do
&_ årssalg:=årssalg+vare.salg(måned);
T_ E_k_s_._ _9_._1_7_
Det simple udskriftprogram (afsnit 4.2) ønskes
forbedret med en salgsanalyse.
Følgende ønskes udskrevet for hver vare:
1. Varenummer.
2. Varenavn.
3. For hver måned ønskes det procentvise salg af
&_ årssalget.
Årssalget kan beregnes som i eks. 9.16, og procentberegningen kan
herefter udføres således:
procent:=vare.salg(måned)*100/årssalg.
Der skal foretages en beregning for hver måned.
T_ for måned:= 1 step 1 until 12 do
begin
procent:=vare.salg(måned)*100/årssalg;
write(out,"sp",2,<<dd.d',procent);
&_ end \f
I procentberegning må man være opmærksom på to forhold:
1. Resultatet er et decimaltal.
2. Når årssalget er 0 kan divisionen ikke gennemføres.
Programstrukturen til beregning og udskrivning af salgsanalysen
kan nu umiddelbart skrives:
T_ årssalg:=0;
for måned:=1 step 1 until 12 do
årssalg:=årssalg+vare.salg(måned);
write(out,"nl",1,<<dddd',vare.nr,"sp",3,vare.navn);
if årssalg <' 0 then
begin
for måned:= 1 step 1 until 12 do
begin
procent:=vare.salg(måned)*100/årssalg;
write(out,"sp",2,<<ddd',procent);
end;
&_ end;
T_ O_p_g_a_v_e_ _9_._4_
&_ Skriv det fuldstændige program.
T_9.3.2 W_H_I_L_E_-_s_æ_t_n_i_n_g_
WHILE-sætningen er allerede bekendt.
<while sætning'::=
&_ while <logisk udtryk' do <sætning'
T_ F_i_g_._ _9_._1_1_
sætning
&_ 1 2 \f
Fig. 9.11 symboliserer en WHILE-sætning. Det logiske udtryk
bestemmer, om løkken skal gentages eller forlades. Når udtrykket
antager værdien TRUE, gennemløbes løkken, hvorefter det logiske
udtryk atter beregnes, og den nye værdi bestemmer, om løkken skal
gennemløbes eller forlades. Løkken forlades, når det logiske ud-
tryk antager værdien FALSE. Som det fremgår af syntaksbeskrivel-
sen og af fig. 9.11, beregnes det logiske udtryk før et evt.
gennemløb, og der er således mulighed for, at sætningen i løkken
slet ikke udføres.
T_ E_k_s_._ _9_._1_8_
årssalg:= 0;
&_ måned:= 0;
T_ while måned <12 do
begin
måned:= måned+1;
årssalg:=årssalg+vare.salg(måned);
&_ end
Programsekvens til beregning af årssalget.
T_9.3.3 R_E_P_E_A_T_-_s_æ_t_n_i_n_g_
REPEAT-sætning anvendes, når en løkke skal udføres mindst 1
gang.
<repeat sætning'::=
N
repeat <sætning' until <logisk udtryk'
&_ 1
T_ F_i_g_._ _9_._1_2_
sætning
1 2 3
&_ \f
Fig. 9.10 symboliserer en REPEAT-sætning. Sætningen, der følger
efter REPEAT, udføres. Herefter beregnes det logiske udtryk, og
når det antager værdien FALSE, gennemløbes løkken, hvorefter det
logiske udtryk atter bestemmer, hvad der skal ske. Når udtrykket
antager værdien TRUE, forlades løkken. Som det fremgår af syntaks
beskrivelsen og af fig. 9.10, beregnes det logiske udtryk efter
hvert gennemløb. Der foretages således mindst 1 gennemløb.
T_ E_k_s_._ _9_._1_9_
årssalg:=0;
måned:=0;
repeat
måned:=måned+1;
årssalg:=årssalg+vare.salg(måned);
&_ until måned=12;
T_9.3.4 F_O_R_ _s_æ_t_n_i_n_g_e_r_
WHILE- og REPEAT-sætningerne findes ikke i ældre udgaver af AL-
GOL. I stedet måtte man begrænse sig til at anvende 3 forskellige
&_ udgaver af FOR-sætningen.
T_ E_k_s_._ _9_._2_0_
for i:=1,2,3 do write(out,i);
for i:=1 step 1 until 3 do write(out,i);
&_ for i:=i+1 while i <=3 do write(out,i);
T_ <for sætning'::=
&_ for <simpel variabel':= <for liste' do <sætning'
T_ N
<for liste::= <for liste element' ,<for liste element'
0 \f
T_ <for liste element'::=
<aritm.udtryk'
<aritm.udtryk' step <aritm.udtryk' until <aritm.udtryk'
<aritm.udtryk' while <logisk udtryk'
T_9.3.4.1 F_O_R_ _D_O_
E_k_s_._ _9_._2_1_
for i:=1,9,3 do write(out,i);
For hvert FOR LISTE ELEMENT (aritm.udtryk) tilskrives kontrol-
variablen den beregnede værdi, hvorefter sætningen efter DO
udføres. I eks. 9.21 udføres WRITE-sætningen således 3 gange
svarende &_ til, at I antager værdierne 1,9 og 3.
T_ 9.3.4.2 F_O_R_ _S_T_E_P_ _U_N_T_I_L_
E_k_s_._ _9_._2_2_
for i:= 1 step 1 until 3 do write(out,i);
&_ Denne sætningstype er allerede behandlet.
T_9.3.4.3 F_O_R_ _W_H_I_L_E_
E_k_s_._ _9_._2_3_
i:=0;
&_ for i:=i+1 while i <=3 do write(out,i);
FOR WHILE-sætningen fungerer på helt tilsvarende måde som WHILE-
sætningen. Yderligere tillægges kontrolvariablen en ny værdi for
hvert gennemløb af løkken. I eks. 9.23 bliver I således optalt
til 4, før løkken forlades.
\f
F_ 10 TEGNVIS INDLÆSNING OG UDSKRIVNING
Der skelnes mellem to former for indlæsning og udskrivning.
1. Tegnvis
2. Postvis
Den tegnvise indlæsning og udskrivning anvendes i forbindelse med
læsbare medier (hulstrimmel, terminal og printer).
Postvis indlæsning og udskrivning benyttes ved registerbehand-
ling.
Til de forskellige anvendelser findes forskellige procedurer, og
i dette kapitel behandles et udvalg af procedurerne, der kan
anvendes ved tegnvis indlæsning og udskrivning.
Postvis indlæsning og udskrivning behandles i kapitel 11.
Den tegnvise behandling omfatter indlæsning og udskrivning af
. et enkelt tegn
. en tegnstreng
. et tal
Til indlæsning findes en procedure til hvert af disse formål,
mens udskrivningen af de forskellige elementer kan foretages med
den samme procedure.
T_10.1 Integer Procedure READCHAR
Med READCHAR indlæses et enkelt tegn ad gangen.
E_k_s_._ _1_0_._1_
&_ klasse:= readchar(in,tegn)
\f
Et enkelt tegn indlæses fra zonen IN.
Tegnværdien gemmes i variablen TEGN, og tegnklassen
gemmes i variablen klasse.
T_ TEGN- Tegnene er opdelt i tegnklasser. Bogstaver har f.eks.
&_ KLASSE klasse 6.
Tegnværdier og tegnklasser er beskrevet i appendix A.
T_ PROCEDURE-
&_ KALD readchar(z,tegn)
Readchar (integer) antager klasseværdien for det læste tegn.
Z (zone) angiver hvilken zone, der skal benyttes ved
indlæsning.
Tegn (integer) antager tegnværdien for det læste tegn.
T_ E_k_s_._ _1_0_._2_
Når følgende job køres, indlæses 7-tallet, og
tegnklassen 2 og tegnværdien 55 udskrives.
10 u=algol
20 begin
30 integer klasse,tegn;
40 klasse:=readchar(in,tegn);
50 write(out,"nl",1,<<ddd',klasse,tegn);
60 end
70 u
80 7
&_ 90 finis
T_10.2 Tegnstreng
Indlæsning af en tegnstreng kan bl.a. foretages med integer pro-
cedure READSTRING. Behandlingen af tegnstrenge kræver dog en
smule kendskab til den interne lagring i datamaten, og da dette
emne ligger uden for rammerne af denne bog, henvises interesse-
&_ rede til ALGOL-manualerne ref. 1, 4 og 5. \f
T_10.3 Integer Procedure Read
Med READ indlæses et eller flere tal ad gangen.
E_k_s_._ _1_0_._3_
&_ antal _læste _tal:=read(in,tal1,tal2)
To tal indlæses, og det første tal gemmes i TAL1 og det
andet tal i TAL2. READ fortæller endvidere hvor mange
tal, der er indlæst, og dette tal gemmes i variablen
ANTAL _LÆSTE _TAL.
T_ E_k_s_._ _1_0_._4_
10 u=algol
20 begin
30 integer tal;
40 read(in,tal);
50 write(out,"nl",1,tal);
60 end
70 u
80 7
&_ 90 finis
Når jobbet køres, indlæses 7-tallet, og det læste tegn
omformes til det tal, det repræsenterer, nemlig 7.
Variablen TAL tilskrives denne værdi, og 7 udskrives.
Bemærk forskellen i forhold til eks. 10.2
T_ PROCEDURE-
&_ KALD read(z,<destinationer')
Read (integer). Antal indlæste tal returneres.
Z (zone) . Angiver hvilken zone, der skal benyttes ved
indlæsningen.
Destinationer . En liste over variable, der ønskes tilskrevet
værdier.
\f
De variable i destinationsliste tillægges værdier i den række-
følge, de optræder i listen. Værdierne beregnes (jvf. eks. 10.4)
på grundlag af den tegnstreng, der læses via den specificerede
zone.
Når READ læser en tegnstreng sammensættes tegn fra klasserne 2-5
(fortegn, decimalpunktum, potentstegn og cifre) til tal. Et tal
afsluttes, når der læses et tegn af klasse '5, f.eks. bogstav,
mellemslag eller komma. Indledende tegn, der ikke tilhører
klasserne 2-5 ignoreres.
T_ E_k_s_._ _1_0_._5_
a7,90,-100,,,9.5
Når ovenstående tegnstreng læses med READ indlæses 4
&_ tal, nemlig 7,90,-100 og 9.5.
Destinationsvariablerne skal typemæssigt harmonerer med tallene,
der skal indlæses, da decimaltal ellers vil blive afrundet på
sædvanlig måde.
Ved indlæsning af et syntaktisk forkert tal tillægges destina-
tionsvariablen den højest mulige værdi for den pågældende vari-
abeltype. Eks. 10.6 viser forskellige ukorrekte tal:
T_ E_k_s_._ _1_0_._6_
- 9 Et mellemrum afslutter et tal, og det første
ciffer skal følge umiddelbart efter forteg-
net.
9,5 Der skal anvendes decimalpunktum.
&_ 9.000.00 Der må kun forekomme et decimalpunktum.
T_ O_p_g_a_v_e_ _1_0_._1_
Lav et program, der kan indlæse et antal positive
&_ heltal (maximalt 100).
Indlæsningen afsluttes første gang et negativt tal
læses. Tallene ønskes endvidere udskrevet i stigende
orden. \f
T_10.4 Integer Procedure WRITE
Med WRITE udskrives tegn, tegnstrenge og tal.
E_k_s_._ _1_0_._7_
write(out,"nl",1);
write(out,<:artikeloversigt:');
&_ write(out,vare.nr);
T_ PROCEDURE-
&_ KALD write(z,<en eller flere parametre')
Write (integer) angiver antal udskrevne tegn.
Z (zone) angiver hvilken zone, der skal
benyttes ved udskrivningen.
Parametre (udtryk af enhver type)
Parameterne beregnes og udskrives i den rækkefølge de optræder
i parameterliste.
TEGN Udskrivning af linjeskift, mellemslag og formularskift
foretages, som det allerede er vist, ved anførsel af de
pågældende boolske konstanter efterfulgt af et udtryk,
der bestemmer det antal gange tegnet skal udskrives.
T_ E_k_s_._ _1_0_._8_
write(out,"ff",1);
write(out,"nl",k);
&_ write(out,"nl",k-7);
T_ TEGN- En tegnstreng udskrives ved at anføre tegnstrengen i en
STRENG tekstparentes i procedurekaldet. Når en alfanumerisk er lagret i et
oplysning (tegnstreng) er lagret i et variabelsæt af
typen LONG, anføres blot navnet på variabelsættet i
procedurekaldet. Det må her forudsættes, at oplysningen
begynder i elementet, der udpeges med index 1. \f
T_ E_k_s_._ _1_0_._9_
write(out,<:***:');
&_ write(out,vare.navn);
En tegnstreng kan være bestemt ved et udtryk, og udtrykket kan
anføres i parameterlisten.
T_ E_k_s_._ _1_0_._1_0_
write(out,if k<2 then <:før 2:' else <:efter 2:');
write(out,
case kvartal of
(<:1. kvartal:',
<:2. kvartal:',
<:3. kvartal:',
&_ <:4. kvartal:'));
Når udskrivningen finder sted, beregnes værdien af ud-
trykket, og det er den beregnede værdi, der udskrives.
TAL Talværdier udskrives ved at anføre aritmetiske udtryk
i parameterlisten.
T_ E_k_s_._ _1_0_._1_1_
write(out,7);
write(out,k);
write(out,(salg-rabat)*momspct);
write(out,if a=b then a else d);
&_ write(out,case k of (7,9,13));
Når udskrivningen finder sted, beregnes værdien af ud-
trykket, og det er den beregnede værdi, der udskrives.
Tal kan udskrives på mange måder, og for hvert udtryk i parame-
terlisten kan det ønskede grafiske billede specificeres.
\f
T_ E_k_s_._ _1_0_._1_2_
write(out,
<<dd', a,
<<-dd', b,
<< -dd', c,
<<-d.d', d,
<<bddd', e,
&_ <<zddd', f);
LAYOUT Et grafisk billede angives i en layoutstreng, der spe-
cificerer det antal positioner, der skal udskrives.
Hvert D i layoutstrengen angiver en position. Neden-
stående liste viser et udvalg af de mange muligheder
eksemplificeret ved udskrivning af tallet 5.
LAYOUT POSITIONER BEMÆRKNING
T_
D <<dd' _ 5_ Tallet optager 2 positioner.
- <<-dd' _ _ 5_ Tallet optager 3 positioner,
hvoraf en er reserveret til
fortegn for negative tal.
Space << -dd' _ _ _ 5_ Indledningsvis udskrives 1
space, hvorefter tallet ud-
skrives som beskrevet i for-
rige eksempel.
. <<-d.d' _ 5_ ._ 0_ Tallet optager 4 positioner,
hvoraf første postion er
reserveret til fortegn. Tallet
udskrives med 1 decimal.
B <<bddd' _ _ _ 5_ 4 positioner benyttes, men
tallet 0 erstattes med 4
mellemslag.
Z <<zddd' 0_ 0_ 0_ 5_ 4 positioner benyttes, og
foranstillede nuller
udskrives.
&_ Et grafisk billed benyttes indtil et nyt anføres.
\f
T_ E_k_s_._ _1_0_._1_3_ T_T_
write(out,<<ddd',salg,stk,<<-d.d',rabatpct);
O_p_g_a_v_e_ _1_0_._2_
Lav et program, der kan indlæse et antal varenumre og
udskrive de pågældende vareposter. Udskrivningen ønskes
foretaget som skitseret i fig. 2.2.
Tallet 4000 kan evt. bruges til at markerer afslutning-
&_ en på en serie varenumre.
\f
F_ 11 ANVENDELSE AF BAGGRUNDSLAGERET
På baggrundslageret kan såvel tegnvis som postvis indlæsning og
udskrivning anvendes. Tegnvis indlæsning og udskrivning anvendes,
når baggrundslageret anvendes som mellemlager til en ydre enhed,
f.eks. printeren. Postvis indlæsning og udskrivning benyttes i
forbindelse med registerhåndtering, jvf. håndteringen af det
velkendte vareregister.
Før en anvendelse er det nødvendigt at tilknytte en zone til den
ønskede fil, og anvendelse af zonen skal afsluttes med en fri-
givelse af den tilknyttede fil. Tilknytning og frigivelse fore-
tages med hhv. proceduren OPEN og proceduren CLOSE. Disse proce-
durer kaldes med forskellige parametre, hvoraf flere sigter mod
en mere avanceret anvendelse, end det er muligt at beskrive i
denne bog. I de følgende beskrivelser er disse parametre blot be-
skrevet ved de værdier, der skal benyttes ved løsning af bogens
opgaver, og som det vil være naturligt at anvende i de fleste
tilfælde.
11.1 Proceduren OPEN
T_
Med proceduren OPEN tilknyttes en zone til et område på
baggrundslageret.
E_k_s_._ _1_1_._1_
&_ open(vare,4,<:varereg:',0);
T_ PROCEDURE-
&_ KALD open(z,modekind,filnavn,giveup)
Z (Zone)
T_ zonen der ønskes tilknyttet.
Modekind (integer)
4 anvendes i forbindelse med baggrundslageret.
Fil navn (streng)
En tekststreng, der angiver navnet på det område, som
zonen skal tilknyttes.
&_\f
T_ Giveup (integer)
0 anvendes normalt, og STDERROR bliver kaldt i
&_ fejlsituationer.
STDERROR vil f.eks. blive kaldt såfremt en zone er forsøgt til-
knyttet et ikke eksisterende onmråde, og læsning eller udskriv-
ning påbegyndes. Ved det første forsøg på læsning eller udskriv-
ning kaldes STDERROR, og der udskrives en fejludskrift på formen.
T_ GIVEUP 0 ALGOLCHECK
CALLED FROM <procedure navn'
CALLED FORM LINE ....
DEVICE STATUS <område navn'
STOPPED
&_ PROCESS DOES NOT EXIST
T_11.2 Procedure CLOSE
Med procedure CLOSE afsluttes anvendelsen af en zone og et til-
knyttet område frigives herved. Zonen kan herefter evt. tilknyt-
tes et andet område ved anvendelse af OPEN.
E_k_s_._ _1_1_._2_
&_ close(vare,true);
T_ PROCEDURE-
KALD close(z,b)
Z (zone) angiver ZONEN.
&_ B (boolean) TRUE anvendes almindeligvis.
Det er væsentligt at huske at afslutte zone anvendelsen med CLO-
SE, da man herved sikrer (ved skrivning), at den sidst behandlede
post skrives i området.
\f
T_11.3 Postvis Læsning og Udskrivning
Med INVAR indlæses en post, og med OUTVAR udskrives en post. Pro-
cedurerne kan kun anvendes i forbindelse med filer på baggrunds-
&_ lageret eller magnetbånd.
Det er endvidere umuligt at læse og skrive samtidigt ved hjælp af
den samme zone, ligesom en zone enten må anvendes til tegnvis
håndtering eller til postvis håndtering.
Poster overføres blokvis, og procedurerne udvælger den aktuelle
post og sørger for at overføre en blok, når det er påkrævet.
T_ 11.3.1 I_n_t_e_g_e_r_ _P_r_o_c_e_d_u_r_e_ _I_N_V_A_R_
Med INVAR indlæses en post. Posten forudsættes at være skrevet
med OUTVAR (jvf. afsnit 11.3.2).
E_k_s_._ _1_1_._3_
&_ invar(vare);
T_ PROCEDURE-
&_ KALD invar(z)
Invar (integer) Returværdien fortæller hvor mange halvord,
der er tilbage i den aktuelle blok.
Z (zone) Specificerer zonen, der anvendes ved ind-
læsning.
Sædvanligvis rummer zonebufferen flere poster, og efter et kald
af INVAR er den næste post i zonebufferen tilgængelig, og der kan
referes til felterne ved hjælp af feltvariable. Når samtlige
poster er gjort tilgængelige, bevirker et efterfølgende kald af
INVAR, at en ny blok indlæses, og første post gøres tilgængelig.
\f
T_ E_k_s_._ _1_1_._4_
invar(vare);
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
k:=vare.nr;
for i:=1 step 1 until 3 do
&_ artikelnavn(i):=vare.navn(i);
T_11.3.2 I_n_t_e_g_e_r_ _P_r_o_c_e_d_u_r_e_ _O_U_T_V_A_R_
Med OUTVAR udskrives en post. Posten opbygges før skrivningen i
et variabelsæt.
T_ E_k_s_._ _1_1_._5_
long nr,stk;
integer field længde, checksum;
long field felt_1, felt_2;
real array post(1:3);
&_ zone z(128,1,stderror);
T_ længde:=2;
checksum:=4;
felt_1:=8;
&_ felt_2:=12;
open(z,4,<:datafil:',0);
T_ repeat
read(in,nr,stk);
post.længde:=12;
post.checksum:=0;
post.felt_1:=nr;
post.felt _2:=stk;
outvar(z,post);
&_ until nr<0;
close(z,true);
Programsekvensen viser, hvorledes en række talpar kan
indlæses og gemmes på baggrundslageret. De to første\f
felter POST.LÆNGDE og POST.CHECKSUM udgør den interne
del af posten, mens de øvrige felter udgør brugerdelen.
Længden angiver det antal halvord af variabelsættet,
som en post omfatter. En post behøver ikke nødvendigvis
at udfylde hele variabelsættet. Den aktuelle checksum
beregnes automatisk.
T_ PROCEDURE-
&_ KALD outvar(z,ra)
Outvar (integer) Returværdien fortæller hvor mange
halvord, der er tilbage i den ak-
tuelle blok.
Z (zone) Specificerer zonen, der anvendes
ved udskrivningen.
Ra (real array eller zone).
Posten, der skal udskrives, skal
foreligge i et real array eller i
en zone. Postformatet skal overhol-
de konventionen, der er beskrevet i
eks. 11.5.
T_ Et kald af OUTVAR bevirker, at posten, der findes i variabelsæt-
tet/zonen, overføres til zonebufferen, hvorfra den videreføres
til baggrundslageret, når zonebufferen er fyldt.
E_k_s_._ _1_1_._6_
Eksemplet viser et program, der kan kopiere vareregi-
steret.
\f
T_ begin
integer field nr;
zone vare, nyvare(128,1,stderror);
nr:=6;
open(vare,4,<:varereg:',0);
open(nyvare,4,<:varekopi:',0);
repeat
invar(vare);
outvar(nyvare,vare);
until vare.nr=4000;
close(vare,true);
close(nyvare,true);
&_ end;
T_ O_p_g_a_v_e_ _1_1_._1_
Lav et program, der kan lave et nyt vareregister, hvor-
til der kun overføres poster, hvis beholdning er for-
skellig fra 0. Slutposten ønskes endvidere ændret, så
den kommer til at rumme et felt, der fortæller hvor
&_ mange poster, der findes i registeret.
\f
F_ 12 KOMMENTARER
I et program kan der indføres kommentarer, der ingen betydning
har for udførelsen af programmet, men udelukkende tjener til at
gøre programmet lettere læseligt.
12.1 Comment
E_k_s_._ _1_2_._1_
comment dette er en kommentar;
Indholdet mellem separatoren COMMENT og separatoren semikolon
betragtes som en kommentar, der ingen indflydelse har på program-
afviklingen.
<kommentar'::=
comment <forklarende bemærkning';
Kommentarer kan indsættes efter semikolon og efter BEGIN. Bemærk-
ningen må ikke indeholde semikolon.
T_12.2 END
Efter END er det ligeledes muligt at anføre en kommentar.
Kommentaren kan afsluttes med semikolon, ELSE eller END.
E_k_s_._ _1_2_._2_
end dette er en kommentar;
end dette er også en kommentar else
&_ end dette er minsandten også en kommentar end
Et manglende semikolon efter END kan resultere i, at en normal
sætning fejlagtigt bliver en kommentar.
\f
T_ E_k_s_._ _1_2_._3_
end
&_ sum:=0;
Da SUM:=0 findes mellem END og semikolon, opfattes sæt-
ningen som en kommentar, og nulstillingen foretages
ikke.
T_ 12.3 Kommentar Parentes
E_k_s_._ _1_2_._4_
<* kommentar parentes *'
Indholdet i parentesen <* *' opfattes som en kommentar. Parente-
sen gør det muligt at lave veldokumenterede programmer, da den
&_ kan anbringes overalt, hvor det er tilladt at skrive mellemslag.
\f
13 PROCEDURER
Til hjælp ved input/output operationer findes, som det bl.a.
fremgår af kapital 10 og 11 en række standardprocedurer. De al-
mindeligste matematiske funktioner (sin, cos etc.) er sammen med
forskellige andre hjælpefunktioner tilgængelige som standardpro-
cedurer, dvs. at de umiddelbart kan anvendes.
E_k_s_._ _1_3_._1_
Standardproceduren SQRT beregner kvadratroden af et
tal, og med følgende programsekvens kan et tal ind-
læses, og kvadratroden af tallet udskrives.
read(in,tal);
write(out,<<dd.dd',sqrt(tal));
Da det ligger uden for rammerne af denne bog at beskrive anven-
delsen af de forskellige standardprocedurer, skal der blot på
dette sted henvises til ALGOL-manualerne hvor samtlige standard-
procedurer er beskrevet.
Formålet med standardprocedurerne er at understøtte forskellige
almindeligt anvendte funktioner, der ved selvkodning ville kræve
en del teknisk/matematisk indsigt, og standardprocedurerne tjener
således til at lette anvendelsen af datamaten.
Det behagelige i overalt fra et program at kunne få udført en
given funktion ved blot at kalde en procedure kan man opnå ved at
lave sine egne procedurer.
E_k_s_._ _1_3_._2_
procedure sideskift;
begin
write(out,"ff",1,"sp",15,
<:artikeloversigt:',
"nl",1);
end;
\f
Ved kald af ovenstående procedure foretages en simpel
udskrivning. Proceduren aktiveres ved at anvende navnet
SIDESKIFT.
En procedure skal erklæres, og den skal derfor anbringes sammen
med de velkendte erklæringer. En procedure erklæres ved hjælp af
declaratoren PROCEDURE.
E_k_s_._ _1_3_._3_
begin
integer linje;
integer field nr;
long array field navn;
zone vare(128,1,stderror);
procedure sideskift;
begin
write(out,"ff",1,"sp",15,
<: a r t i k e l o v e r s i g t:',
"nl",1);
end;
nr:=6; navn:=6; linje:=0;
open(vare,4,<:varereg:',0);
invar(vare);
while vare.nr <4000 do
begin
if linje mod 45 = 0 then sideskift;
linje:=linje+1;
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
invar(vare);
end;
close(vare,true);
end;
\f
3.1 Opbygning
En procedure består af to dele:
. Procedurehoved
. Procedurekrop.
Procedurehovedet består af declaratoren PROCEDURE og procedure-
navnet.
E_k_s_._ _1_3_._4_
procedure sideskift;
PARAME- I procedurer, hvor der er behov for at overføre para-
TERLØS metre, som det er kendt fra standardprocedurer, skal
parameterlisten ligeledes specificeres i
procedurehoved. Da mulighederne herfor er mangfoldige,
er der af pladsmæssige hensyn valgt kun at omtale
parameterløse procedurer.
PROCEDURE-En behandling af procedurefunktioner, dvs. procedurer
FUNKTION der returnerer med en værdi, er af samme grund undladt,
og når det er tilfældet, reduceres procedurehoved til
proceduredeclaratoren og procedurenavnet.
PROCEDURE-Et procedurenavn er underkastet de velkendte regler for
NAVN variabelnavne. Et tidligere anvendt variabelnavn eller
etikettenavn kan således ikke anvendes. Procedurenavnet
anvendes ved kald af proceduren.
PROCEDURE-Procedurekroppen består af en sætning. Det kan evt.
KROP være en sammensat sætning eller en blok.
E_k_s_._ _1_3_._5_
begin
write(out,"ff",1,"sp",15,
<:a r t i k e l o v e r s i g t:',
"nl",2);
end; \f
Når en procedure kaldes, udføres sætningen, der udgør procedure-
kroppen, og når det er sket returneres til sætningen, der følger
umiddelbart efter procedurekaldet. En procedure forlades, når den
sidste sætning i procedurekroppen er udført.
I procedurekroppen er der adgang til samtlige variable, der er
erklæret i omliggende blokke eller i samme blok som proceduren.
13.2 Procedureerklæring
En procedure skal som tidligere omtalt erklæres, og det må ske i
blokåbningen sammen med erklæringen af de forskellige variable.
Eks. 13.3 illustrerer dette.
13.3 Procedurekald
En procedure aktiveres ved hjælp af procedurenavnet.
E_k_s_._ _1_3_._6_
if linje mod 45 = 0 then sideskift
Over alt inden for den blok, hvor proceduren er erklæret, kan den
aktiveres. Når proceduren er vel udført fortsættes med sætningen,
der følger umiddelbart efter procedurekaldet.
13.4 Anvendelse
Det kan være formålstjenligt at anvende en procedure, når den
samme programsekvens skal anvendes flere forskellige steder i et
program. Kendskab til procedurebegrebet ville f.eks. have været
nyttigt i forbindelse med løsning af opgave 9.3.
I stedet for at gentage den samme programsekvens 4 gange kan der
nu laves en procedure, der skal kaldes ved sideskift.
\f
procedure sideskift;
begin
write(out,"ff",1,"sp",15,<:b e h o l d n i n g:',
"nl",2,<: = 0:',"sp",10,<:< 10.',
"sp",10,<: < 100:',"sp",10,<:'= 100:',
"nl",2,<:varenr varenr behold-:',
<:varenr behold- varenr behold-:',
"nl",1,"sp",16,<:ning:',"sp",11,<:ning:',
"sp",11,<:ning:',
"nl",2);
end;
Overalt i programmet (jvf. den vejledende løsning kan programse-
kvensen
if linje mod 30 = 1 then
write(out,"ff",1,"sp",15, . . .
. . .
"nl",2);
erstattes med
if linje mod 30 = 1 then sideskift;
Det færdige program ser herefter således ud:
begin
integer
forrige _gruppe,
gruppe,
linje;
integer field
beholdning,
nr;
zone
vare(128,1,stderror);
\f
procedure sideskift;
begin
write(out,"ff",1,"sp",15,<:b e h o l d n i n g:',
"nl",2,<: = 0:',"sp",10,<:< 10:',
"sp",10,<: < 100:',"sp",10,<:'= 100:',
"nl",2,<:varenr varenr behold- :',
<: varenr behold- varenr behold-:',
"nl",1,"sp",16,<:ning:',"sp",11,<:ning:',
"sp",11,<:ning:',
"nl",2);
end;
nr:=6;
beholdning:=22;
forrige_gruppe:=4;
linje:=0;
open(vare,4,<:varereg:',0);
invar(vare);
while vare.nr <4000 do
begin
if vare.beholdning = 0 then gruppe:=1 else
if vare.beholdning <10 then gruppe:=2 else
if vare.beholdning<100 then gruppe:=3
else gruppe:=4;
case gruppe of
begin
<* gruppe 1 *'
begin
linje:=linje+1;
if linje mod 30 = 1 then sideskift;
write(out,"nl",1,<<dddd',vare.nr);
end;
\f
<* gruppe 2 *'
begin
if forrige _gruppe ' 1 then
begin
linje:=linje+1;
if linje mod 30 = 1 then sideskift;
write(out,"nl",1,"sp",7);
end else write(out,"sp",3);
write(out,<<dddd',vare.nr,"sp",4,
<<dd',vare.beholdning);
end;
<* gruppe 3 *'
begin
if forrige _gruppe ' 2 then
begin
if linje mod 30 = 1 then sideskift;
write(out,"nl",1,"sp",22);
end else
if forrige _gruppe = 2 then write(out,"sp",5)
else write(out,"sp",18);
write(out,<<dddd',vare.nr,"sp",4,
<<ddd',vare.beholdning);
end;
<* gruppe 4 *'
begin
case forrige _gruppe of
begin
write(out,"sp",33);
write(out,"sp",20);
write(out,"sp",4);
begin
linje:=linje+1;
if linje mod 30 = 1 then sideskift;
write(out,"nl",1,"sp",37);
end forrige _gruppe;
write(out,<<dddd',vare.nr,"sp",4,
<<dddddd',vare.beholdning); \f
if vare.beholdning ' 1000 then
write(out,<: ***:');
end
end case gruppe .. ;
forrige _gruppe:=gruppe;
invar(vare);
end while vare.nr ... ;
close(vare,true);
end;
Ved at benytte en procedure til sideskift er programmet blevet
væsentlig lettere at overskue, og samtidig er det blevet lettere
at vedligeholde. En simpel ændring i overskriften vil kun kræve
en ændring i procedure SIDESKIFT, mens det vil kræve ændringer 4
steder i den vejledende løsning til opgave 9.3.
\f
14 PROGRAM DESIGN
Programmering af lidt større opgaver kan angribes på forskellige
måder. Fælles for de moderne principper er, at man skal søge at
skaffe sig et overblik over opgaven ved at nedbryde den i pas-
sende delopgaver. Det er væsentlig i den indledende fase at undgå
detaljer, der uvilkårligt vil sløre overblikket.
Som næste skridt i opgaveløsningen analyseres delopgaverne på
tilsvarende måde som den totale opgave, og delopgaverne nedbrydes
hver især til endnu mindre delopgaver.
TOP DOWN En sådan nedbrydning af opgaven kaldes et TOP DOWN
design, og det må fortsættes indtil samtlige delopgaver
er så små, at de umiddelbart kan kodes.
Metoden belyses i det følgende ved anvendelse på en konkret op-
gave.
14.1 Opgaveformulering
På grundlag af det velkendte vareregister ønskes udarbejdet en
salgstatistik, hvor salgstallene ønskes udskrevet kvartalsvis for
hver varegruppe og for salget som helhed.
Følgende udskrift ønskes.
\f
SALGSSTATISTIK
**************
1. KVARTAL 2. KVARTAL 3. KVARTAL 4.KVARTAL ÅRET
SALGxxxxxx xxxxxx xxxxxx xxxxxx xxxxxx
SALG I PCT xx.xxx.xxx.xxx.xxx.x
SALG xxxxxxxxxxxxxxxxxx xxxxxx xxxxxx
SALG I PCT xx.xxx.xxx.xxx.xxx.x
SALG xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SALG I PCTxx.xxx.x xx.x xx.x xx.x
SALGxxxxxx xxxxxx xxxxxx xxxxxx xxxxxx
SALG I PCT xx.x xx.x xx.x xx.x xx.x
*****************************************************************
SALGxxxxxx xxxxxx xxxxxx xxxxxx xxxxxx
SALG I PCT xx.x xx.x xx.x xx.x xx.x
14.2 Første skridt
På grundlag af erfaringerne, der er erhvervet ved udarbejdelse af
de tidligere udskriftsprogrammer, er det let at dele opgaven i 3
delopgaver.
1. Der skal altid foretages initieringer.
Erklæringer, zonetilknytning etc.
2. Den egentlige behandling
3. Afslutning. Lukning af zoner etc.
I analysearbejdet er det ofte nyttigt at tegne, og ovenstående
nedbrydning kan f.eks. tegnes således:
\f
F_i_g_._ _1_4_._1_
PROGRAM
INITIERING BEHANDLING AFSLUTNING
Figur 14.1 viser, at udskriftsprogrammet skal består af 3 sek-
tioner, der skal udføres i rækkefølge. På dette grundlag er det
muligt at lave følgende grove programskitse.
begin
<* initiering *'
<* behandling *'
<* afslutning *'
end;
14.3 Andet Trin
Hver af de 3 sektioner betragtes, og de sektioner, der ikke
umiddelbart kan overskues, underkastes nedbrydningsproceduren.
Initieringssektionen er simpel, da den udelukkende består af ini-
tiering af feltvariable, tilknytning af områder etc. Yderligere
nedbrydning er unødvendig.
Det samme gælder for afslutningssektionen.
\f
Ved nedbrydning af selve behandlingen er det nyttigt at betragte
selve udskriften. Man ser, at den består af en overskrift, grup-
peoplysninger og totaler. Det kan opfattes som 3 delopgaver at
udskrive disse ting. Strukturtegningen fig. 14.1 kan udbygges i
overensstemmelse hermed.
F_i_g_._ _1_4_._2_
PROGRAM
INITIERING BEHANDLING AFSLUTNING
SKRIVBEHANDLESKRIV
OVERSKRIFT GRUPPER TOTALER
Programskitsen ajourføres.
begin
<* initiering *'
<* behandling *'
<* skriv overskrift *'
<* behandel grupper *'
<* skriv totaler*'
<* afslutning *'
end;
\f
14.4 Tredje Trin
De nye opgaver analyseres og nedbrydes evt. yderligere.
Overskriften er simpel, og nedbrydning er unødvendig.
Sektionen vedrørende totaler består af simple beregninger, hvor-
for yderligere nedbrydning er unødvendig.
Selve beregningen af grupper skal analyseres, og det bliver her-
ved klart, at den består af 4 dele.
1. Beregning af gruppe totaler.
2. Beregning af procenter.
3. Udskrivning.
4. Akkumulation til samlet salgstotal.
Strukturtegningen ajourføres.
F_i_g_._ _1_4_._3_
PROGRAM
INITIERING BEHANDLING AFSLUTNING
SKRIVBEHANDLESKRIV
OVERSKRIFTGRUPPERTOTALER
BEREGN BEREGN UDSKRIV AFSLUT
GRUPPEPCT GRUPPEGRUPPE\f
Følgende programskitse opnås, når det vælges at lade de 4 nye
sektioner udforme som procedurer.
begin
procedure beregn _gruppe;
procedure beregn _pct;
procedure udskriv _gruppe;
procedure afslut _gruppe;
<* initiering *'
<* behandling *'
<* skriv overskrift *'
<* behandel grupper *'
while flere _grupper do
begin
beregn _gruppe;
beregn _pct;
udskriv _gruppe;
afslut _gruppe;
end;
<* skriv totaler *'
<* afslutning *'
end;
14.5 Fjerde Trin
Det vil altid afhænge af et skøn, hvornår nedbrydningen skal op-
høre. I det aktuelle tilfælde er hovedstrukturen i programmet
fastlagt, og det er helt klart, hvad de enkelte dele skal inde-
holde, hvorfor yderligere nedbrydning skønnes unødvendig.
De enkelte procedurer og sektioner kan kodes, og i takt med dette
udarbejdes en liste over de nødvendige variable. Eventuelle pro-\f
grammeringsproblemer kan analyseres ved hjælp af grafer, hvis det
skønnes nødvendigt.
14.5.1 B_e_r_e_g_n_ _G_r_u_p_p_e_r_._
Samtlige vareposter i den samme gruppe skal læses, og salget
akkumuleres kvartalsvis. Desuden beregnes årssalget. Før akkumu-
leringen skal tælleværket nulstilles.
Når det erindres, at det mest betydende ciffer i varenummeret
bestemmer gruppe, er det let at skrive proceduren.
proceduren beregn_gruppe;
begin
for kvartal:=1 step 1 until 4 do
kvartalssalg(kvartal):=0;
årssalg:=0;
while vare.nr // 1000 = gruppe do
begin
for måned:=1 step 1 until 12 do
begin
kvartal:=måned//4+1;
kvartalssalg(kvartal):=
kvartalssalg(kvartal) + vare.salg(måned);
end;
invar(vare);
end;
for kvartal:=1 step 1 until 4 do
årssalg:=årssalg+kvartalssalg(kvartal);
end; \f
Variabelliste:
integer long long array
gruppe årssalg kvartalssalg(1:4)
kvartal
måned
integer field integer array field
nr salg
zone
vare(128,1,stderror)
14.5.2 B_e_r_e_g_n_ _p_c_t_._
Når salget foreligger pr. kvartal, er det let at beregne, hvor
stor en procentdel det udgør at årssalget.
procedure beregn_pct;
begin
if årssalg = 0 then
begin
for kvartal:=1 step 1 until 4 do
pct_salg(kvartal):=0;
end else
begin
for kvartal:=1 step 1 until 4 do
pct_salg(kvartal):=
kvartalssalg(kvartal)*100/årssalg;
end;
end;
Bidrag til variabellisten:
real array
pct_salg(1:4)
\f
14.5.3 U_d_s_k_r_i_v_ _G_r_u_p_p_e_
Udskrivningen af de beregnede tal er helt triviel. Procentsatser-
ne udskrives med B-layout, så nuller ikke udskrives.
procedure udskriv _gruppe;
begin
write(out,"nl",2,<:salg:',"sp",6);
for kvartal:=1 step 1 until 4 do
write(out,"sp",6,<<dddddd',kvartalssalg(kvartal));
write(out,"sp",6,<<dddddd',årssalg);
write(out,"nl",1,<:salg i pct:');
for kvartal:=1 step 1 until 4 do
write(out,"sp",7,<<bddd.d',pctsalg(kvartal));
end;
Ingen bidrag til variabellisten.
14.5.4 A_f_s_l_u_t_ _G_r_u_p_p_e_._
Det er nødvendigt at akkumulere gruppetotalerne for at kunne ud-
skrive den sidste total. Endvidere skal den næste gruppe bestem-
mes. Den nye gruppe bestemmer om løkken, der omfatter gruppebe-
handlingen, skal forlades, og den styrende variabel skal opdate-
res.
procedure afslut _gruppe;
begin
for kvartal:=1 step 1 until 4 do
total(kvartal):=total(kvartal)+kvartalssalg(kvartal);
gruppe:=vare.nr//1000;
flere _grupper:=gruppe<4;
end;
Bidrag til variabellisten:
boolean long array
flere _grupper total(1:4)
\f
14.5.5 I_n_i_t_i_e_r_i_n_g_._
Feltvariable og styrende variable initieres. Tælleværk til den
samlede total nulstilles. Vareregisteres tilknyttes, og den
første post læses.
nr:=6;
salg:=22;
gruppe:=vare.nr//1000;
flere _grupper:=gruppe <4;
for kvartal:=1 step 1 until 4 do
total(kvartal):=0;
open(vare,4,<:varereg:',0);
invar(vare);
Ingen bidrag til variabellisten.
14.5.6 B_e_h_a_n_d_l_i_n_g_._
Behandling består af 3 simple sektioner.
1. Overskrift.
write(out,"nl",1,"sp",17,
<:s a l g s s t a t i s t i k:',
"nl",1,"sp",17,
<:***************************:',
"nl",2,"sp",13,
<:1. kvartal 2. kvartal 3. kvartal :',
<:4. kvartalåret:');
\f
2. Behandling
while flere _grupper do
begin
beregn _gruppe;
beregn _pct;
udskriv _gruppe;
afslut _gruppe;
end;
3. Skriv totaler.
Totalerne udskrives lettest ved at anvende de tidligere udar-
bejdede procedurer BEREGN _PCT og UDSKRIV _GRUPPE.
årssalg:=0;
for kvartal:=1 step 1 until 4 do
begin
kvartalssalg(kvartal):=total(kvartal);
årssalg:=årssalg+total(kvartal);
end;
beregn _pct;
write(out,"nl",1);
for i:=1 step until 70 do write(out,<:*:');
udskriv _gruppe;
Bidrag til variabellisten.
integer
i
14.5.7 A_f_s_l_u_t_n_i_n_g_._
Afslutningen er helt triviel.
close(vare,true);
Ingen bidrag til variabellisten. \f
14.6 Det Sidste Trin
Variabellisten, procedurerne og de forskellige sektioner samles
til et program, og opgaven er løst.
begin
boolean
flere _grupper;
integer
gruppe,
i,
kvartal,
måned;
long
årssalg;
long array
kvartalssalg(1:4),
total(1:4);
integer field
salg;
zone
vare(128,1,stderror);
procedure beregn_gruppe;
begin
for kvartal:=1 step 1 until 4 do
kvartalssalg(kvartal):=0;
årssalg:=0;
while vare.nr // 1000 = gruppe do
begin
for måned:=1 step 1 until 12 do\f
begin
kvartal:=rtal)+kvartalssalg(kvartal);
gruppe:=vare.nr//1000;
flere_gruppe:= gruppe<4;
end;
<* initiering *'
nr:=6;
salg:=22;
gruppe:=vare.nr//1000;
flere _grupper:= gruppe<4;
for kvartal:=1 step 1 until 4 do
total(kvartal):=0;
open(vare,4,<:varereg:'0);
invar(vare);
<* behandling*'
<* skriv overskrift *'
write(out,"nl",1,"sp",17,
<:s a l g s s t a t i s t i k:',
"nl",1,"sp",17,
<:***************************:',
"nl",2,"sp",13,
<:1. kvartal 2. kvartal 3. kvartal :',
<:4. kvartal året:');
\f
procedure afslut_gruppe;
begin
for kvartal:=1 step 1 until 4 do
total(kvartal):=total(kvartal)+kvartalssalg(kvartal);
gruppe:=vare.nr//1000;
flere_gruppe:= gruppe<4;
end;
<* initiering *'
nr:=6;
salg:=22;
gruppe:=vare.nr//1000;
flere _grupper:= gruppe<4;
for kvartal:=1 step 1 until 4 do
total(kvartal):=0;
open(vare,4,<:varereg:'0);
invar(vare);
<* behandling*'
<* skriv overskrift *'
write(out,"nl",1,"sp",17,
<:s a l g s s t a t i s t i k:',
"nl",1,"sp",17,
<:***************************:',
"nl",2,"sp",13,
<:1. kvartal 2. kvartal 3. kvartal :',
<:4. kvartal året:');
\f
<* behandel grupper *'
while flere _grupper do
begin
beregn _gruppe;
beregn _pct;
udskriv _gruppe;
afslut _gruppe;
end;
<* skriv totaler *'
årssalg:=0;
for kvartal:=1 step 1 until 4 do
begin
kvartalssalg(kvartal):=total(kvartal);
årssalg:=årssalg + total(kvartal);
end;
beregn _pct;
write(out,"nl",1);
for i:=1 step 1 until 70 do write(out,<:*:');
udskriv _gruppe;
<* afslutning *'
close(vare,true);
end;
\f
15 VEJLEDENDE LØSNINGER
O_p_g_a_v_e_ _3_._1_
Arbejdslager, baggrundslager, køretid, terminal, linje-
skriver, læser og perforator.
O_p_g_a_v_e_ _3_._2_
lagereg
varereg
a2
O_p_g_a_v_e_ _3_._3_
128, 256, 512
O_p_g_a_v_e_ _4_._1_
1. Første varepost læses. Varenummeret er 10.
2. Da 10 er mindre end 4000, udføres sætningen efter
DO.
3. Posten udskrives.
4. Næste post læses, og varenummeret er 17.
5. Betingelsen, der styrer WHILE-sætningen, er stadig
opfyldt, da 17 er mindre end 4000.
6. Posten udskrives.
7. Næste post læses, og varenummeret er 209.
8. Betingelsen, der styrer WHILE-sætningen, er stadig
opfyldt, da 209 er mindre end 4000.
9. Posten udskrives.
10. Næste post læses, og varenummeret er 4000. \f
11. Betingelsen, der styrer løkken, er ikke opfyldt, og
løkken forlades.
O_p_g_a_v_e_ _5_._1_
10 u=algol list.yes
11
15 begin
20 integer sum,a,b;
25 read(in,a,b);
26 sum:=a+b;
30 write(out,sum);
40 end
O_p_g_a_v_e_ _5_._2_
20/a/salg
25/a,/salg,
26/a/salg
O_p_g_a_v_e_ _6_._1_
9 Et navn skal indledes med et bogstav.
2b Et navn skal indledes med et bogsta
b=7 = kan ikke indgå i et navn.
moms-måned - kan ikke indgå i et navn.
udbetaling af løn Mellemslag kan ikke indgå i et navn.
O_p_g_a_v_e_ _6_._2_
-30
O_p_g_a_v_e_ _6_._3_
TRUE
FALSE
FALSE
FALSE
TRUE
TRUE
O_p_g_a_v_e_ _6_._4_
Parenteser:
begin end
( )
<: :'
\f
Separatorer:
; , := while <NL' <SP'
Operatorer:
< do
Sammensatte symboler:
begin integer field long array
zone while do end
O_p_g_a_v_e_ _6_._5_
Linje 3 afsluttes med kolon.
Linje 4 afsluttes med komma.
Linje 7. Der mangler 2 kommaer omkring tekststrengen.
Linje 9. VARE og NR er adskilt med komma.
Linje 11. semikolon mangler.
Linje 12. invare_.
Linje 14. afsluttes med kolon.
O_p_g_a_v_e_ _6_._6_
Ja.
O_p_g_a_v_e_ _6_._7_
begin Tilgængelige variable
integer a;
...
... a
begin
integer b;
...
... a og b
end;
begin
integer c;
...
... a og c
begin
integer d;
...
... a c og d
end;
... a og c
end;
... a
end;
\f
O_p_g_a_v_e_ _7_._1_
integer field nr;
long field beholdning;
long array field navn;
integer array field salg;
nr:=6;
navn:=6;
beholdning:=22;
salg:=22;
O_p_g_a_v_e_ _7_._2_
Ved reference på formen VARE.JANUAR er feltadressen 24.
Der kan også referes i forhold til variabelsættet VARE.
SALG, og referencen bliver da VARE.SALG.JANUAR. Felt-
addressen er det andet halvord i variabelsættet altså 2.
O_p_g_a_v_e_ _8_._1_
begin
integer antal;
integer field nr;
long array field navn;
zone vare(128,1,stderror);
nr:=6;
navn:=6;
antal:=1;
open(vare,4,<:varereg:',0);
invar(vare);
while vare.nr <4000 do
begin
write(out,"nl",1,vare nr,"sp",2,vare.navn);
invar(vare);
antal:=antal+1;
end;
close(vare,true);
write(out,"nl",2,antal);
end; \f
O_p_g_a_v_e_ _8_._2_
write(out,"nl",1,<<dddd',vare.nr,"sp",2,vare.navn);
O_p_g_a_v_e_ _9_._1_
WRITE-sætningen erstattes med følgende IF-konstruktion:
if vare.beholdning ' 50 then
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
IF-konstruktionen udbygges:
if vare.beholdning ' 50 and vare.nr//1000=3 then
write(out,"nl",1,vare.nr,"sp",2,vare.navn);
O_p_g_a_v_e_ _9_._2_
invar(vare); tæller:=70;
while vare.nr <4000 do
begin
if tæller = 70 then
begin
write(out,"ff",1,
"nl",1,<:artikeloversigt:',
"nl",2,"sp",9,
<:varenr varenavn:',"sp",15,<:varenr varenavn:',
"nl",1);
tæller:=0;
end;
if tæller mod 2 = 0 then
write(out,"nl",1,"sp",9) else write(out,"sp",3);
write(out,<<dddd',vare.nr,"sp",6,vare.navn);
invar(vare); tæller:=tæller+1;
end; \f
O_p_g_a_v_e_ _9_._3_
begin
integer
forrige _gruppe,
gruppe,
linje;
integer field
nr;
long field
beholdning;
zone
vare(128,1,stderror);
nr:=6;
beholdning:=22;
forrige _gruppe:=4;
linje:=0;
open(vare,4,<:varereg:',0);
invar(vare);
while vare.nr <4000 do
begin
if vare.beholdning = 0 then gruppe:=1 else
if vare.beholdning < 10 then gruppe:=2 else
if vare.beholdning ' 100 then gruppe:=3 else gruppe:=4;
\f
case gruppe of
begin
<* gruppe 1 *'
begin
linje:=linje+1;
if linje mod 30 = 1 then
write(out,"ff",1,"sp",15,<:b e h o l d n i n g:',
"nl",2,<: = 0:',"sp",10,<:< 10:',"sp",10,
<: < 100:',"sp",10,<:'= 100:',
"nl",2,<:varenr varenr behold- varenr behold-:',
<: varenr behold-:',
"nl",1,<: ning ning :',
<: ning:',
"nl",2);
write(out,"nl",1,<<dddd',vare.nr);
end;
<* gruppe 2 *'
begin
if forrige _gruppe ' 2 then
begin
linje:=linje+1;
if linje mod 30 = 1 then
write(out,"ff",1,"sp",15,<:b e h o l d n i n g:',
"nl",2,<: = 0:',"sp",10,<:< 10:',"sp",10,
<: < 100:',"sp",10,<:<= 100:',
"nl",2,<:varenr varenr behold- varenr behold-:',
<: varenr behold-:',
"nl",1,<: ning ning :',
<: ning:',
"nl",2);
write(out,"nl",1,"sp",7);
end else write(out,"sp",3);
write(out,<<dddd',vare.nr,"sp" ,4,<<dd',vare.beholdning);
end;
\f
<* gruppe 3 *'
begin
if forrige _gruppe ' 2 then
begin
linje:=linje+1;
if linje mod 30 = 1 then
write(out,"ff",1,"sp",15,<:b e h o l d n i n g:',
"nl",2,<: = 0:',"sp",10,<:< 10:',"sp",10,
<: < 100:',"sp",10,<:'= 100:',
"nl",2,<:varenr varenr behold- varenr behold-:',
<: varenr behold-:',
"nl",1,<: ning ning :',
<: ning :',
"nl",2);
write(out,"nl",1,"sp",22);
end else
if forrige _gruppe = 2 then write(out,"sp",5)
else write(out,"sp",18);
write(out,<<dddd',vare.nr, "sp",4,<<ddd',vare.beholdning);
end;
<* gruppe 4 *'
begin
case forrige _gruppe of
begin
write(out,"sp",33);
write(out,"sp",20);
write(out,"sp", 4);
begin
linje:=linje+1;
if linje mod 30 = 1 then
write(out,"ff",1,"sp",15,<:b e h o l d n i n g:'
"nl",2,<: = 0:',"sp",10,<:< 10:',"sp",10,
<: < 100:',"sp",10,<:'= 100:',
"nl",2,<:varenr varenr behold- varenr behold-:',
<: varenr behold-:',
"nl",1,<: ningning :',
<: ning:',
\f
"nl",2);
end
end;
write(out,<<dddd',vare.nr,"sp",4,
<<dddddd',vare.beholdning);
if vare.beholdning ' 1000 then write(out,<: ***:');
end
end;
forrige _gruppe:=gruppe;
invar(vare);
end;
close(vare,true);
end;
O_p_g_a_v_e_ _1_0_._1_
begin
integer
index,
max,
nummer;
integer array
tal(0:100);
tal(0):=0;
max:=0;
read(in,nummer);
while nummer '= 0 do
begin
index:=max:=max+1;
while tal(index-1) ' nummer do
begin
tal(index):=tal(index-1);
index:=index-1;
end; \f
tal(index):=nummer;
read(in,nummer);
end;
for index:=1 step 1 until max do
write(out,"n1",2,<<dddd',tal(index));
end;
O_p_g_a_v_e_ _1_0_._2_
begin
integer
index,
max,
nummer,
række,
søjle;
integer array
tal(0:100);
integer field
nr;
long field
beholdning;
integer array field
salg;
integer array field
navn;
nr:=6;
navn:=6;
beholdning:=22;
salg:=22;
\f
tal(0):=0;
max:=0;
read(in,nummer);
while nummer < 4000 do
begin
index:=max:=max+1;
while tal(index-1) ' nummer do
begin
tal(index):=tal(index-1);
index:=index-1;
end;
tal(index):=nummer;
read(in,nummer);
end;
open(vare,4,<:varereg:',0);
invar(vare);
index:=1;
while index <= max do
begin
while vare.nr < tal(index) do invar(vare);
if vare.nr <' tal(index) then
write(out,"n1",3,<<dddd',tal(index),<: findes ikke:')
else
begin
write(out,"nl",3,
"nl",1,<:varenr = :',<<dddd',vare.nr,
"nl",1,<:navn = :',vare.navn,
"nl",1,<:beholdning = :',<<dddddd',vare.beholdning,
"nl",1,<:salg:',
"nl",1);
for række:=0 step 1 until 3 do
begin
write(out,"nl",1);
for søjle:=1 step 1 until 3 do
write(out,
\f
case række*3+søjle of
(<:januar :',<:maj :',<:september :',
<:februar :',<:juni :',<:oktober :',
<:marts :',<:juli :',<:november :',
<:april :',<:august :',<:december:' ),
<<dddddd',vare.salg(række*3+søjle),"sp",3);
end;
end;
index:=index+1;
end;
close(vare,true);
end;
O_p_g_a_v_e_ _1_1_._1_
begin
integer
antal;
integer field
antal _poster,
nr;
long field
beholdning;
zone
vare(128,1,stderror);
kopi(128,1,stderror);
nr:=6;
beholdning:=22;
antal _poster:=8;
antal:=0; \f
open(kopi,4,<:varekopi:',0);
open(vare,4,<:varereg:',0);
invar(vare);
while vare.nr <4000 do
begin
if vare.beholdning <' 0 then
begin
outvar(kopi,vare);
antal:=antal+1;
end;
invar(vare);
end;
vare.antal _poster:=antal;
outvar(kopi,vare);
close(kopi,true);
close(vare,true);
end; \f
APPENDIX A
T_e_g_n_v_æ_r_d_i_e_r_ _o_g_ _T_e_g_n_k_l_a_s_s_e_r_
De forskellige tegn er i datamaten repræsenteret ved tegnværdier,
der er beliggende i intervallet 0 - 127, og der er således mulig-
hed for at repræsentere 128 forskellige tegn. Dette er noget fle-
re, end man har mulighed for at anvende på en terminal, og en
række forskellige styretegn er inkluderet i tegnsættet, som be-
stemmes af de 128 forskellige tegnværdier.
Anvendelsen af de forskellige tegn har gjort det naturligt at op-
dele dem i forskellige tegnklasser. Alle bogstaver udgør f.eks.
en tegnklasse, og det samme gør alle cifre. Tegnklasserne er num-
meret fra 0 til 8.
I følgende tabel er tegnene anført i rækkefølge efter tegnværdi-
en, og for hvert tegn er det grafiske symbol angivet, eller når
et sådant ikke findes et forkortet navn. Endvidere findes tegn-
værdien og tegnklassen.
I tabellen bemærkes at cifrene 0 - 9 har tegnværdierne 48 - 57,
jvf. eks. 10.2.
Tegnklasserne bestemmer, hvorledes de forskellige indlæsningspro-
cedurer behandler tegnene. Tegn i klasse 2, der udgøres af cifre-
ne, behandles således på en speciel måde af READ-proceduren, jvf.
eks. 10.4.
Alle symbolerne i tabellen kan benyttes ved udskrivning af enkelt
tegn på tilsvarende måde som ved udskrivning af "ff", "nl" og "sp".\f
SYMBOL V K SYMBOL V K SYMBOL V K SYMBOL V K
NUL 0 0 SP 32 7 @ 64 7 96 7
SOH 1 7 ! 33 7 A 65 6 a 97 6
STX 2 7 " 34 7B 66 6 b 98 6
ETX 3 7 35 7C 67 6c 99 6
EOT47< 36 7 D 68 6 d 100 6
ENQ 5 7 % 37 7 E 69 6 e 101 6
ACK 6 7 & 38 7 F 70 6 f 102 6
BEL 7 7 > 39 5 G 71 6 g 103 6
BS 8 7 ( 40 7 H 72 6 h 104 6
HT 9 7 ) 41 7 I 73 6 i 105 6
NL 10 8 * 42 7 J74 6 j106 6
VT 11 7 + 43 3 K 75 6 k 107 6
FF 12 8 , 44 7 L 76 6 l 108 6
CR 13 0 - 45 3 M 77 6 m 109 6
SO 14 7 . 46 4 N 78 6 n 110 6
SI 15 7 / 47 7 O 79 6 o 111 6
DLE 16 7 0 48 2 P 80 6 p 112 6
DC1 17 7 1 49 2 Q 81 6 q 113 6
DC2 18 7 2 50 2 R 82 6 r 114 6
DC3 19 7 3 51 2 S 83 6 s 115 6
DC4 20 7 4 52 2 T 84 6 t 116 6
NAK 21 7 5 53 2 U 85 6 u 117 6
SYN 22 7 6 54 2 V 86 6 v 118 6
ETB 23 7 7 55 2 W 87 6 w 119 6
CAN 24 7 8 56 2 X 88 6 x 120 6
EM 25 8 9 57 2 Y 89 6 y 121 6
SUB 26 7 : 58 7 Z 90 6 z 122 6
ESC 27 7 ; 59 7 Æ 91 6 æ 123 6
FS 28 7 < 60 7 Ø 92 6 ø 124 6
GS 29 7 = 61 7 Å 93 6 å 125 6
RS 30 7 ' 62 7 94 7 126 7
US 31 7 ? 63 7 _ 95 7 DEL 127 0
\f
Tegnene er opdelt i følgende klasser:
Klasse 0.
Tegnene i denne klasse ignoreres fuldstændigt af samt-
lige indlæsningsprocedurer.
Klasse 1.
Ubenyttet.
Klasse 3.
Udgøres af samtlige cifre. Tegnene i denne klasse kan
indgå i tal, der indlæses med READ-proceduren.
Klasse 4.
Decimalpunktum er det eneste tegn i denne klasse, og
det kan indgå i tal, der indlæses med READ-proceduren.
Klasse 5.
Potentstegn er det eneste tegn i denne klasse, og det
kan indgå i tal, der indlæses med READ-proceduren.
Klasse 6.
Udgøres af samtlige bogstaver. Tegnene kan indgå i al-
fanumeriske oplysninger, der kan indlæses med forskel-
lige indlæsningsprocedurer, der ikke er beskrevet i
denne bog.
Klasse 7.
Denne klasse udgøres af forskellige tegn, der kaldes
skilletegn. De kan bl.a. benyttes som skilletegn mellem
forskellige tal, der skal indlæses med READ-proceduren.
Klasse 8.
Denne klasse består af to tegn, nemlig NL og EM. NL
terminerer en linje, og tegnet kan benyttes som skille-
tegn på tilsvarende måde som tegnene i klasse 7. EM
udgør altid det sidste tegn i en strøm af tegn, og det-
te tegn indtager en særstilling i forhold til indlæs-
ningsprocedurerne.
\f
APPENDIX B
U_d_v_a_l_g_t_e_ _M_e_d_d_e_l_e_l_s_e_r_ _f_r_a_ _B_O_S_S_
Udvalget består udelukkende af meddelelser, der kan fremkomme i
forbindelse med almindelige terminalanvendelse. Forklaringen på
andre meddelelser må findes i ref. 2.
END <JOBNAVN' ...
Normal meddelelse ved afslutningen på et job.
FILES DOES NOT EXIST
Der er specificeret et navn på et område, der ikke findes.
Det kan evt. skyldes en stavefejl.
FILE IN USE
Det specificerede område er en basisfile, og det kan ikke
benyttes til andet, før det er frigivet. Frigivelsen kan ske
med CLEAR-kommandoen, men man bør sikre sig, at indholdet i
forvejen er gemt på baggrundslageret med SAVE-kommandoen.
FILE IS NOT TEXT FILE
Det specificerede område er ikke en tekstfil. Registre, der
er skrevet med OUTVAR, er f.eks. ikke tekstfiler, og de kan
ikke læses med BOSS.
FINIS ...
Normal meddelelse i forbindelse med jobtilmelding. Det for-
ventede afslutningstidpunkt for jobbet vises.
FORBIDDEN
Der er forsøgt at anvende en kommando på et ulovligt tids-
punkt. Kommandoen kan først indtastes og udføres, efter at
jobbet, der er tilmeldt BOSS, er afviklet. Jobbet kan evt.
afbrydes med KILL-kommandoen.
\f
FORBIDDEN, THE INSTALLATION IS CLOSING
Det er ikke muligt at få afviklet flere job p.t., da opera-
tøren har forbudt det. Det kan f.eks. ske ved lukketid.
FROM <JOBNAVN' <MEDDELELSE'
En meddelelse fra en anden terminal.
ILLEGAL IDENTIFICATION
Der er anvendt et forkert projektnummer eller brugernavn ved
LOGIN-rutinen.
ILLEGAL NUMBER
Et for stort nummer er tastet.
IN: <DATO' <TID'
Normal meddelelse, der viser tidspunkt for en vellykket
LOGIN-rutine.
JOB FILE EXHAUSTED
Læsning fra JOBFILEN var umulig, da den er udtømt. Det kan
f.eks. skyldes, at der mangler et kald af FINIS-programmet.
KILLED BY OPERATOR
Jobbet blev afbrudt af operatøren.
KILLED BY USER
Jobbet blev afbrudt af brugeren med KILL-kommandoen.
LAST INPUT LINE SKIPPED
Det sidst indtastede linje blev ikke opfanget, og skal gen-
tages.
LINE TERMINATION
Den indtastede linje var for lang, og den skippes.
LINE TOO LONG
Den indtastede linje var for lang, og den skippes.
\f
LOGGED IN ...
Afsluttende meddelelse ved anvendelse af LOGOUT-kommandoen.
LOGIN CLAIMS EXCEEDED
Der er anvendt for mange områder. Flere kan rekvireres (se
ref. 2).
NAME TOO LONG
Der er anvendt et for langt navn i en kommando.
NO RESSOURCES
Samtlige ressourcer på baggrundslageret er forbrugt. Flere
kan rekvireres (se ref. 2).
NO ROOM
Der kan ikke indtastes flere rettelser. Problemet afhjælpes,
som det er beskrevet i afsnit 5.5.7.1.
NOT FOUND
En rettelse kunne ikke gennemføres på grund af et forkert
angivet grafisk billed.
OUTPUT EXCEEDED
Der er produceret mere output end tilladt. Det skyldes for-
modentlig en programfejl i øvelsesprogrammet. Tilladelse
til at producere mere output kan rekvireres (se ref. 2).
OUTPUT KILLED
Operatøren afbrød udskrivningen.
PARAM
Der mangler en parameter i forbindelse med en BOSS-kommando.
Det kan f.eks. være at områdenavnet mangler ved anvendelse
af SAVE-kommandoen.
TEMPLATE TO LONG
Der er anført et for langt grafisk billede i en rettelsekom-
mando. \f
TIME EXCEEDED
Jobbet har overskredet den tildelte køretid og afbrydes. Det
skyldes formodentlig programfejl i et øvelsesprogram. Læn-
gere køretid kan rekvireres (se ref. 2).
TYPE USER NAME AND PROJECT NUMBER
Normal meddelelse ved påbegyndelse af en LOGIN-rutine.
WHAT?
Der er tastet et ukendt kommandonavn. Kan forekomme ved
stavefejl.
\f
APPENDIX C
U_d_v_a_l_g_t_e_ _M_e_d_d_e_l_e_l_s_e_r_ _f_r_a_ _F_P_
Meddelelser fra FP forårsages af fejlagtige programkald. Det kan
f.eks. skyldes, at navnet på et program staves forkert. De fleste
fejlmeddelelser fra FP indledes på formen:
***FP
Herefter følger en forklarende meddelelse.
I ref. 3. findes en liste over samtlige meddelelser fra FP.
*** BREAK <ÅRSAG'
Fremkommer bl.a. når køretiden overskrides, og jobbet af-
brydes.
*** FP CALL <PROGRAM'
Det specificerede navn er ikke et oversat program.
*** FP JOB TERMINATION
Jobbet blev afbrudt på grund af for mange syntaksfejl i FP-
kommandoerne. Det vil ofte skyldes, at der fejlagtigt ind-
læses data, der var tiltænkt et øvelsesprogram.
*** FP NAME <PROGRAM'
Det specificerede program findes ikke.
*** FP REINITIALIZED
Meddelelsen forekommer i forbindelse med syntaksfejl, og det
er blot en orientering.
*** FP SYNTAX <DE SIDSTE TEGN'
Syntaksfejl i en FP-kommando. En del af den fejlagtige kom-
mando gengives. Syntaksfejl skyldes ofte, at data til øvel-
sesprogrammet fejlagtigt forsøges indlæst som FP-kommandoer.\f
APPENDIX E
U_d_v_a_l_g_t_e_ _M_e_d_d_e_l_e_l_s_e_r_ _f_r_a_ _A_L_G_O_L_
Udvalget består udelukkende af meddelelser, der må formodes at
kunne fremkomme ved forkert anvendelse af de sprogelementer, der
er behandlet i denne bog. Forklaringen til andre fejludskrifter
må søges i ALGOL-manualerne ref. 1, 4 og 5.
Meddelelserne fra ALGOL skyldes sædvanligvis syntaksfejl, der re-
gistreres under oversættelsen. Formatet af fejludskrifterne fin-
des beskrevet i afsnit 5.7.
ALGOL END <SEGMENTER'
Denne meddelelse fortæller, at oversættelsen blev gennem-
ført. Det oversatte program optager det anførte antal seg-
menter. Hvis der er fremkommet andre meddelelser, kan det
oversatte program alligevel afvikles, dog kun til det fejl-
ramte sted.
ALGOL SORRY <SEGMENTER'
Der er mødt så mange fejl, at oversættelsen ikke kunne
gennemføres. Det anførte antal segmenter viser, hvor mange
segmenter der er forsøgt genereret.
CALL
En procedure er kaldt med et forkert antal parametre.
COMMENT
En kommentar er placeret forkert, dvs. ikke efter BEGIN
eller semikolon.
CONSTANT
En talkonstant er skrevet ukorrekt.
+DECLARATION
En identifikator er erklæret mere end en gang i den samme
blok. \f
DELIMITER
En ulovlig delimiter er anført.
Eks.
nr=6; i stedet for det rigtige. nr:=6;
-DELIMITER
En delimiter mangler.
Eks.
Manglende semikolon mellem to sætninger.
nr:=6
salg:=22;
FOR LABEL
Det er ulovligt at hoppe direkte ind i en FOR-løkke med en
GOTO-sætning.
HEAD
Et forkert procedurehoved er angivet.
LAYOUT
En forkert layoutstreng er anført.
OPERAND
En operand manger eller optræder i en forkert sammenhæng.
-OPERAND
En operand mangler i slutningen af en konstruktion.
Eks.
kvartal:=måned//4 + ;
SOURCE EXHAUSTED
Kildeteksten er læst, men der er læst BEGIN flere gange end
END.
SUBSCRIPTS
Der er anvendt et forkert antal indices i et variabelsæt.
\f
TERMINATION
Forkert parentesstruktur. Antallet af parentes begynd stem-
mer f.eks. ikke overens med antallet af parentes slut.
TEXT
Ulovlig tekststreng. <: må ikke indgå i en tekststreng.
Fejlen opstår ofte, når slut parentesen :' skrives forkert
eller glemmes i en foregående tekststreng.
TYPE
Der indgår en forkert type i et udtryk.
Eks.
"nl":=4;
En boolsk variabel kan ikke tillægges en talværdi, men
kun en logisk værdi.
UNDECLARED
En identifikator er ikke erklæret i den aktuelle blok.
ZONE
Forkert reference til en zone.
ZONE DECLARATION
Forkert zoneerklæring. F.eks. et forkert antal kommaer.
\f
APPENDIX E
U_d_v_a_l_g_t_e_ _M_e_d_d_e_l_e_l_s_e_r_ _f_r_a_ _d_e_t_ _K_ø_r_e_n_d_e_ _P_r_o_g_r_a_m_
Når et program er konstrueret forkert, kan det ske, at den videre
afvikling må opgives, og det sker da med en fejlmeddelelse om
grunden, og hvor i programmet det er sket. (Jvf. eks. 5.27).
I ALGOL-manualerne ref. 1, 4 og 5 findes en fuldstændig liste
over fejlmeddelelserne.
BREAK <ÅRSAG'
Programudførelsen blev afbrudt, f.eks. på grund af køretids-
overskridelse. Det vil ofte skyldes, at programmet kører i
en uendelig løkke.
CASE <VÆRDI'
Den specificerede værdi udpeger en ikke eksisterende sætning
i en CASE-konstruktion.
END <ANTAL OVERFØRTE PROGRAMSEGMENTER'
Afsluttende meddelelser fra et kørende program. Der fortæl-
les i denne meddelelse, hvor mange programsegmenter der er
overført til primærlageret under programafviklingen.
FIELD <VÆRDI'
Den anførte feltværdi ligger uden for posten.
GIVEUP <ANTAL HALVORD'
Udskrives af STDERROR, når dataoverførelsen ikke kan gennem-
føres som ønsket. Antal overførte havlord er anført. Grunden
til fejludskriften kan f.eks. være et manglende kald af
OPEN. FP udskriver dokumentnavn.
MODEKIND <VÆRDI'
Forkert anden parameter i kald af OPEN. I forbindelse med
øvelsesopgaverne skal parameteren være 4.
\f
PARAM
En procedure er kaldt med en forkert parameter.
RECLEN <POSTLÆNGDE'
Den anførte postlængde er ulovlig. Postlængden skal være
større end eller lig med 4.
REAL
Fremkommer bl.a. ved forsøg på division med 0.
SYNTAX
Fremkommer når et program med syntaksfejl forsøges afviklet.
Z.LENGTH <LÆNGDE'
Der er anvendt en for lille buffer. Til øvelsesopgaverne
skal bufferstørrelsen være 128 dobbeltord.
Z.STATE <VÆRDI'
Fremkommer når en zone ulovligt anvendes til såvel skrivning
som læsning samtidigt.
\f
INDEX
Addition............................... 6.4
Adresse
felt................................. 2.2.1
ALGOL.................................. 5.7, 6
kald................................. 5.2, 5.7.1
meddelelse........................... 5.7, D
oversættelse......................... 5.2, 5.4
Arbejdslager........................... 3.1.2
anvendelse af........................ 4.1
ARRAY.................................. 6.4, 7.2
ATTENTION
signal............................... 5
AUTOLINE............................... 5.5.3
Baggrundslager......................... 3.1.3, 3.2.1, 11
BASISFILE.............................. 5.5.6
Basisprogrammel........................ 5
BEGIN.................................. 6.4
Beskrivelse
blanket.............................. 2.3
handlingsforløb...................... 4.2
post................................. 2.2.1
problem.............................. 2
register............................. 2.2
Betinget
sætning.............................. 9.2, 9.2.1
Blanketbeskrivelse..................... 2.3
Blanketindhold......................... 2.3.2
Blok................................... 3.2.1, 6.5.2.3, 9.1.3
Bogstav................................ 6.4
BOOLEAN................................ 6.4, 7.1
BOSS................................... 3.2.1
BOSS-kommando.......................... 5.3, 5.5
AUTOLINE............................. 5.5.3
CLEAR................................ 5.5.6.2\f
GET.................................. 5.5.6.1
GO................................... 5.3
KILL................................. 5.5, 5.5.1
LIST................................. 5.5.5.2
LOGOUT............................... 5.5.2
SAVE................................. 5.5.6.3
VERIFY............................... 5.5.5
BOSS-meddelelser....................... 5.5.7, B
CASE................................... 6.4, 8.4
anvendelse........................... 9.2.2.1
sætning.............................. 9.2, 9.2.2
udtryk............................... 8.4
Central enhed.......................... 3.1.1
Checksum............................... 4.2
Ciffer................................. 6.4
CLEAR.................................. 5.5.6.2
CLOSE.................................. 4.2, 11.2
COMMENT................................ 6.4, 12.1
CONVERT................................ 5.8
CPU.................................... 3.1.1
Data................................... 2.1.1
lagring.............................. 4.1
transport............................ 3.1.2, 3.2.1
Dataliste.............................. 2.2.2
Datamat
opbygning............................ 3
Datatype............................... 2.2.2
Decimaltal............................. 3.1.2, 6.3
Declarator............................. 4.1, 6.4, 7.1, 7.2, 7.3,
Delimiter.............................. 6.4
Dimension.............................. 7.2
Disjunktion............................ 6.4
Division............................... 6.4
DO..................................... 6.4
Dobbeltord............................. 3.1.2
\f
Dokument............................... 3.2.1
Editering.............................. 5.5.4
Elementarsætning....................... 6.5.2.1, 9.1, 9.1.1
ELSE................................... 6.4, 9.2.1, 12.2
END.................................... 6.4, 12.2
Erklæring.............................. 4.1, 6.5.1, 7, 7.1, 7.2,
.............................. 7.3, 7.4
Etikette............................... 9.1.1
FALSE.................................. 6.4
Felt................................... 2.1.1
adresse.............................. 2.2.1, 4.1, 7.3
erklæring............................ 7, 7.3
nøgle................................ 2.1.1
reference............................ 4.1, 7.3
variabel............................. 4.1, 7.3
FF..................................... 6.4
FIELD.................................. 6.4, 7.3
FINIS.................................. 5.2
Flervalg
sætning.............................. 9.2.2
udtryk............................... 8.4
FOR.................................... 6.4
sætning.............................. 9.3.1, 9.3.4
FP
kommando............................. 5.2, 5.6
meddelelse........................... 5.6.1, C
GET.................................... 5.5.6.1
GO..................................... 5.3
GOTO................................... 6.4, 9.1.1
Graf................................... 4.2
Grundsymbol............................ 6.4
Halvord................................ 3.1.2
Handlingsforløb........................ 4.2
Hardware............................... 3.1 \f
Helord................................. 3.1.2
Heltal................................. 3.1.2, 6.3
Hopsætning............................. 9.1.1
Identifikator.......................... 4.1, 6.2
IF..................................... 6.4, 9.2.1
udtryk............................... 8.4
IN..................................... 4.1
Index.................................. 7.2
Indlæsning
postvis..............................11, 11,3
tegnvis..............................10
INTEGER................................ 7.1
INVAR.................................. 4.2, 11.3.1
Job.................................... 5.2
afbrydelse........................... 5.5.1
afvikling............................ 5.3
navn................................. 5.3
JOBFIL................................. 5.2
Kant................................... 4.2
KILL................................... 5.5.1
Knudepunkt............................. 4.2
Kommando
BOSS................................. 5.3, 5.5
FP................................... 5.2, 5.6
Rettelse............................. 5.5.4.2
Kommentar..............................12
parentes.............................12.3
Konfiguration.......................... 3.1.1
Konjunktion............................ 6.4
Lager
arbejds.............................. 3.1.2, 4.1
baggrunds............................ 3.1.3, 3.2.1
primær............................... 3.1.2
Layoutstreng........................... 8.3, 10.4
\f
Linje
indsættelse.......................... 5.5.4.2
modifikation......................... 5.5.4.2
sletning............................. 5.5.4.2
Linjenummer............................ 5.2
tildeling............................ 5.5.3
Linjeskriver........................... 3.1.7
LIST................................... 5.5.5
LOGIN-rutine........................... 5.1
Logisk fejl............................ 5.7
Logisk værdi........................... 6.4
LONG................................... 6.4, 7.1
Læser.................................. 3.1.5
Løkke.................................. 4.2, 9, 9.3
Maskininstruktion...................... 3.1.2
Meddelelser
ALGOL................................ 5.7, D
BOSS................................. 5.5.7, B
FP................................... 5.6.1, C
kørende program...................... 5.7, E
Multiplikation......................... 6.4
Navn
job.................................. 5.3
område............................... 3.2.1
program.............................. 3.2.1
Negation............................... 6.4
NL..................................... 4.2, 6.4
NO ROOM................................ 5.5.7.1
Notation............................... 1, 5, 6
Nøglefelt.............................. 2.1.1
O...................................... 5.8
OF..................................... 6.4
Område................................. 3.2.1
navn................................. 3.2.1
\f
Opbygning
datamat.............................. 3
post................................. 4.2, 11.3.2
register............................. 2.1.1
OPEN................................... 4.2, 11.1
Operativsystem......................... 3.1.2, 3.2.1
Operator............................... 6.4
aritmetisk........................... 6.4, 8.1
logisk............................... 6.4, 8.2
relation............................. 6.4, 8.2
sekventiel........................... 4.2, 6.4
Oplysning.............................. 2.2.1
alfanumerisk......................... 2.2.2
numerisk............................. 2.2.2
Ord.................................... 3.1.2
dobbelt.............................. 3.1.2
halv................................. 3.1.2
hel.................................. 3.1.2
OUT.................................... 4.1
OUTVAR.................................11.3.2
Parentes............................... 6.4
sætning.............................. 4.2, 6.4
Perforator............................. 3.1.6
Positionsark........................... 2.3.1
Post................................... 2.1.1
beskrivelse.......................... 2.1.1
opbygning............................ 4.2, 11.3.2
slut................................. 2.1.2
Potensopløftning....................... 6.4
Primærlager............................ 3.1.2
Printer................................ 3.1.7
Problembeskrivelse..................... 2
Procedure.............................. 6.4, 13
anvendelse...........................13.4
erklæring............................ 7, 13.2
funktion............................. 8.1, 13.1
hoved................................13.1\f
kald................................. 6.5.2.1, 9.1.1, 13.3
krop.................................13.1
navn.................................13.1
opbygning............................13.1,
Program................................ 4
design...............................14
kørende.............................. 5.7
navn................................. 3.2.1
struktur............................. 6.5
Programmering.......................... 4
READ...................................10.3
READCHAR...............................10.1
REAL................................... 6.4, 7.1
Reelt tal.............................. 6.3
Register............................... 2.1
beskrivelse.......................... 2.2
opbygning............................ 2.1.1
organisation........................... 2.7.2
Rekursiv............................... 6.5.2.2
Relation............................... 8.2
REPEAT................................. 6.4, 9.3.3
Rettelseskommando...................... 5.5.4.2
SAVE................................... 5.5.6.3
Segment................................ 3.2.1
Sekvens................................ 9
Separator.............................. 6.4
Seriel................................. 2.1.2
SET.................................... 5.8
Simpel variabel........................ 4.1, 7.1
Skilletegn............................. 5.5.4.2
Slettetegn............................. 5.5.4.1
Slutpost............................... 2.1.2
Software............................... 3.2
SP..................................... 4.2, 6.4
Standard
procedure............................13 \f
variabel............................. 4.1
ZONE................................. 4.1
STEP................................... 6.4
Styreprogram........................... 3.1.2
Subtraktion............................ 6.4
Symbol
grund................................ 6.4
sammensat............................ 6.4
Syntaksfejl............................ 5.7
Sætning................................ 6.5.2, 9
betinget............................. 9, 9.2, 9.2.1
elementar............................ 9.1, 9.1.1
flervalg............................. 9.2.2
hop.................................. 9.1.1
løkke................................ 4.2, 9
parentes............................. 4.2
sammensat............................ 6.5.2.2, 9.1, 9.1.2
tom.................................. 9.1.1
tovalg............................... 9.2
ubetinget............................ 9.1
valg................................. 9, 9.2
Tal.................................... 6.3
decimal.............................. 3.1.2, 6.3
hel.................................. 3.1.2, 6.3
indlæsning...........................10.3
udskrivning..........................10.4
reelt................................ 6.3
Talkonstant............................ 6.3
Tegn
indlæsning...........................10.1
klasse...............................10.1, A
streng...............................10.2, 10.4
sæt.................................. 6.1, A
udskrivning..........................10.4
værdi................................10.1 A
Tekststreng............................ 8.3, 10.4
Terminal............................... 3.1.4
\f
THEN................................... 6.4, 9.2.1
Tovalg
sætning.............................. 9.2
udtryk............................... 8.5
TRUE................................... 6.4
Typedeclarator......................... 4.1, 7.1, 7.2
Typeerklæring.......................... 7, 7.1
Udskrivning
JOBFIL............................... 5.5.5
postvis..............................11, 11.3
tegnvis..............................10
Udtryk................................. 8
aritmetisk........................... 8, 8.1
flervalg............................. 8.4
logisk............................... 8, 8.2
streng............................... 8, 8.3
tovalg............................... 8.5
UNTIL.................................. 6.4
Valg................................... 9
Variabel............................... 4.1
felt................................. 4.1, 7.3
indiceret............................ 7.2
simpel............................... 4.1, 7.1
standard............................. 4.1
Variabelsæt............................ 4.1, 7.2
erklæring............................ 7, 7.2
VERIFY................................. 5.5.5
Værdiområde............................ 3.1.2
Værditilskrivning...................... 6.5.2.1, 9.1.1
WHILE.................................. 6.4, 9.3.2
WRITE.................................. 4.2, 10.4
\f
Zone................................... 4.1, 6.4, 7.7
anvendelse........................... 3.1.2
buffer............................... 4.1
erklæring............................ 4.1, 7, 7.4
standard............................. 4.1 \f
F_ Signal Destination Description
\f
i
T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_
1. ASSEMBLY DRAWING ....................................... 1
2. LOGIC DIAGRAM .......................................... 2
3. PLUG LIST .............................................. 8
\f
ii
\f
1_._ _ _ _ _ _ _ _ _A_S_S_E_M_B_L_Y_ _D_R_A_W_I_N_G_ 1.
\f
F_ 2_._ _ _ _ _ _ _ _ _L_O_G_I_C_ _D_I_A_G_R_A_M_ 2.
Signal Destination Description
LINE 0 J2-1 Circuit line
LINE 1 J2-3
TRM DATA J1-2 Transmit to keyboard.
TXD B 3 Transmit data.
-,DTR B 3 Data terminal ready.
-,RTS B 3 Request to send.
TXD A 2 Transmit data.
-,DTR A 2 Data terminal ready.
-,RTS A 2 Request to send.
\f
F_
\f
F_ Signal Destination Description
REQUEST TO SEND J4-4 V24 modem signals.
DATA TERMINAL
READY J4-20
XMT DATA J4-2
T(B) J4-12 X24/X27 modem signals.
T(A) J4-9
C(B) J4-14
C(A) J4-25
-,CI A 1 Calling indicator.
-,DCD A 1 Data Carrier Detect.
-,DSR A 1 Data Set ready.
RXCA 1 Receiver clock.
TXCA 1 Transmitter clock.
RXDA 1 Receiver data.
-,CTS A 1 Clear to send.
S 2 X24 modem clock.
\f
F_
\f
F_ Signal Destination Description
REQUEST TO SEND J3-4 V24 modem signals.
DATA TERM READY J3-20
XMT DATA J3-2
-,CTS B 1 Clear to send.
-,DCD B 1 Data Carrier Detect.
-,DSR B 1 Data Set Ready.
-,CI B 1 Calling indicator.
RXD B 1 Receiver data.
\f
F_
\f
F_ 3_._ _ _ _ _ _ _ _ _P_L_U_G_ _L_I_S_T_ 3.
J1: Keyboard J2: Circuit
1 -12V 1 Line 0
2 TRM DATA 2 -
3 0V 3 Line 1
4 REC DATA
5 +5V
J3: Printer J4: Communication
1 gnd 1 gnd
2 XMT DATA 2 XMT DATA
3 REC DATA 3 REC DATA
4 REQUEST TO SEND 4 REQUEST TO SEND
5 CLEAR TO SEND 5 CLEAR TO SEND
6 DATA SET READY 6 DATA SET READY
7 gnd 7 gnd
8 DATA CAR DET 8 DATA CAR DET
9 - 9 T(A)
10 - 10 I(A)
11 - 11 -,SELECT X.21
12 - 12 T(B)
13 - 13 -
14 - 14 C(B)
15 - 15 XMT CLOCK
16 - 16 S(B)
17 - 17 REC CLOCK
18 - 18 S(A)
19 - 19 R(B)
20 DATA TERM READY 20 DATA TERM READY
21 - 21 R(A)
22 CALLING INDICATOR 22 CALLING INDICATOR
23 - 23 -
24 - 24 I(B)
25 - 25 C(A)
\f
J5: CPU-board
1 +12V 26 TXD B
2 +12V 27 -,DTR B
3 +12V 28 -,RTS B
4 +5V 29 TXD A
5 +5V 30 -,DTR A
6 +5V 31 -,RTS A
M_m_m_ 7 +5V 32 TRM DATA
keyboard
P_p_p_ 8 +5V 33 REC DATA
9 0V 34 -,TXENABLE
10 0V 35 DATA OUT
11 0V 36 RX DC
12 0V 37 -,CTS A
13 0V 38 -,DCD A
14 0V 39 RXD A
15 0V 40 -,RXC A
16 -5V 41 -,TXC A
17 -5V 42 -,CTS B
18 -5V 43 -,DCD B
19 -12V 44 RXD B
20 -12V 45 -,RESET
21 -12V 46 -,DSR B
22 +5V 47 -,CI B
23 +5V 48 -,DSR A
24 0V 49 -,CT A
25 0V 50 -
\f
F_
\f
«eof»