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