DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

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

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦95f1634f3⟧ TextFile

    Length: 171264 (0x29d00)
    Types: TextFile
    Names: »D56«

Derivation

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

TextFile

                                                 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»