cobol语言基础培训教程

COBOL 是Common Business Oriented Language 的缩写。它不仅是商业数据处理的理想语言,
而且广泛用于数据管理领域,因此COBOL 语言也被称为”用于管理的语言”。
一。COBOL 语言的特点
最适于数据处理领域:算数计算量少而逻辑处理量多,输入输出量大,数据间存在着一定的逻辑  关系,大量的分类排序;COBOL比较接近英语,容易懂;通用性强,易移植,COBOL结构严谨,层次分明。
二。COBOL的组成部分:
1。标识部(IDENTIFICATION DIVISION):用于标识程序名。
2。环境部(ENVIRONMENT DIVISION):用于说明程序运行的环境。
3。数据部(DATA  DIVISION):用于说明程序中涉及的所有数据。
4。过程部(PROCEDURE DIVISION):是程序的核心部分,它决定计算机应进行什么操作。
三。最简单的COBOL 程序举例:
COL 1 —6    7         8       12—72 73—80
IDENTIFICATION DIVISION。
PROGRAM-ID。 PSAMPLE1。
ENVIRONMENT DIVISION。
DATA DIVISION。
PROCEURE DIVISION。
DISPLAY ’THIS IS A COBOL PROGRAM.’
STOP RUN。
四。COBOL 源程序的书写格式:
第1 至 6 列为 ”标号区”。        第7列为”续行标志区”
第8至此11列,称为”A区”。程序中有些内容如部头,节头,段头,层号 01,层号 77 及文件
描述符FD等应从A区开始写。
第12至此72列,称为”B区”。写程序中的正文部分。如过程部中的句子只能从B区开始写。
第73至80列,称为”注释区”。
五。COBOL字符集包括:
数字0 — 9 ,字母 A— Z ,a — z , 专用字符:+  -  * / = , . ; ’ ( ) < > $ 及空格。属于系统字符集而不属于COBOL字符集的字符只能出现    在COBOL 程序中的字符串里。
六。常量:
COBOL 常量分为数值常量(如 100,-29),非数值常量(如 ’ABC’ )和表意常量(如 ZERO,SPACE,HIGH-VALUE,LOW-VALUE ,QUOTE ,ALL 常量)。
七。COBOL 所处理的数据的特点
层次的概念:数据间存在的从属关系。
文件的概念:多个记录可以组成一个文件。
记录的概念:具有一定层次关系的一组数据项的最大集合,它是内存中具有独立逻辑含义的最大存取项,具有最高层次。
CHAPTER   2 过程部初步
一。输入输出语句。
1。ACCEPT语句:直接从终端键盘或系统指定的输入设备上输入数据。
ACCEPT   标识符 [FROM 助忆名]
注:A。标识符(identifier)指的是能唯一地标识一个数据项的数据名,不能唯一地标识一个
数据项的数据名不是标识符。标识符可以是组合项。
B。在ACCEPT语句中如不写FROM部分,如ACCEPT   A  ,则表示从系统隐含指定的
设备上读入一个数据给A。 如果不想从指定的设 备上输入,则要用FROM 选项,
这时”助忆名”需要在环境部中事先说明和那种外部设备相联系。如:
ENVIRONMENT    DIVISION。(环境部)
CONFIGRATION  SECTION。(配置节)
SPECIAL-NAMES。(专用名段)
CONSOLE   IS  ABC
如在过程部中有 ACCEPT  T  FROM ABC。 则表示要从控制台接收数据
2。DISPLAY语句:从计算机内存中输出到某一指定的输出设备上。
DISPLAY  { 标识符1,常量1}[标识符2,常量2]。。。[UPON 助忆名]
( 标识符和助忆名的说明同上)
ACCEPT语句和DISPLAY语句不必定义文件适用于少量的数据输入输出。
3。READ语句:COBOL语言中数据的输入输出主要是通过对外部文件的读写进行的。READ 语句就是从外部文件上读入数据输 出到程序中的数据项中。在程序中用到的所有文件都需要在环境部中指定程序中用到的文件名与实际外部文件的联系。数据部也要对文件加以描述。指定数据结构各数据项所占的内存单元长度以及数据形式。
COBOL 的存取是以文件为对象以记录为单位的。
READ语句的最简单的格式为: READ 文件名
ENVIRONMENT DIVISION。
INPUT-OUTPUT SECTION。
FILE-CONTROL。
SELECT      IN-FILLE    ASSIGN  TO      外部文件名。
为了存储读入的记录,必须在内存开辟一个与文件记录长度相等的存储区,即’输入文件纪录区’。每一个输入文件都有相应的’输入文件纪录区’,与之一一对应。亦即在数据部中描述文件的数据结构。
3。READ语句:
假设   IN-FILE  文件每一记录中包含的内容为:产品代码,产品数量,产品单价,生产日期。设某一记录的具体数据
如下:0  0  1  0  0  1  0  0  0  0  0  1  0  0  0  1  9  9  9  0  3  2  2
prodcode    quantity        price               year      mon  day
如果我们希望读入该记录并对各数据项进行处理,则需要在  ’输入纪录区’中划分出各数据项,以便存放相应的数据。定义输入纪录区以及划分记录区中各数据项的工作是由数据部来完成的。下面我们简单介绍数据部定义记录区方法,针对上面输入数据的特点,我们可以在数据部中对记录区作如下描述:
DATA DIVISION。
FD     IN-FILE   LABLE    RECORD  IS   STANDARD。
01      IN-RECORD。   (定义记录区名为IN-RECORD)
02     PROD-CODE PIC   9(4)。
02     PROD-QUANTITY PIC   9(5)。
02     PROD-PRICE PIC   9(6)。
02     MANU-DATE。(生产日期为一组合项)
05   DATE-CCYY PIC   9(4)。
05   DATE-MM PIC   9(2)。
05   DATE-DD PIC   9(2)。
其中,FD 即 FILE DESCRIPTION,表示从该行起是’文件描述体’。
LABLE RECORD IS STANDARD :所有的磁盘文件和磁带文件都必须写明此句。
01 层定义’输入纪录区’ 的名字为IN-RECORD,由于 01层属于FD描述体,因此也就指定了 IN-RECORD 和 IN-FILE 的关系。亦即从IN-FILE 读入的数据存放在 IN-RECORD记录区中。
这样,在执行一次READ语句后,文件中一个记录的数据便输入到内存记录区,按排列顺序分别送到记录区中各数据项中。注意文件的各记录中的数据是不分数据项的,只是按一定的顺序把数据存放在各字节中。所以数据部对记录区中各数据项的描述应该与文件的记录中各数据排列次序和长度相一致。
READ 语句的一般形式:READ     文件名   RECORD [INTO  标识符]  [AT   END  执行语句] , 例如:
READ  IN-FILE   INTO TEMP-RECORD   AT  END   STOP  RUN  该语句除了将读到的数据传送到IN-RECORD之外,还传送到TEMP-RECORD中。在遇到文件尾时,程序结束运行。
4。WRITE语句:将内存中的数据输出到外部设备,主要是由WRITE 语句来完成的。WRITE语句的最简单的格式为:
WRITE        记录名 (注意WRITE语句的操作对象是记录,所以是’记录名’而不是’文件名’)
与输入文件相似输出文件也要在环境部中指定所对应的实际存在的外部文件:
ENVIRONMENT DIVISION。
INPUT-OUTPUT SECTION。
FILE-CONTROL。
SELECT      OUT-FILLE    ASSIGN  TO      打印机名。
也要在数据部中定义输出记录区:
DATA DIVISION。
FD     OUT-FILE   LABLE    RECORD  IS   OMITTED。
01      OUT-RECORD。
02     PROD-CODE PIC   9(4)。
02     PROD-QUANTITY PIC   9(5)。
02     PROD-PRICE PIC   9(6)。
02     MANU-DATE
05   DATE-CCYY PIC   9(4)。
05   DATE-MM PIC   9(2)。
05   DATE-DD PIC   9(2)。
LABLE RECORD IS OMITTED :凡输出设备是打印机的都必须写明此句。如输出设备是磁盘,则仍用LABLE RECORD IS STANDARD。
01 层定义’输出纪录区’ 的名字为OUT-RECORD,由于 01层属于FD描述体,因此也就指定了
OUT-RECORD 和OUT-FILE 的关系。
在用WRITE 语句输出一个记录之前,应向输出记录区传送数据。如已将数据传送到上述各数据项中,则在执行 W RITE   OUT-RECORD 语句后,则记录区中的数据通过打印机打印出来。
WRITE 语句的一般形式:                     标识符 2 LINE
BEFORE                   整数  LINES
WRITE     记录名  [FROM  标识符 1 ]       AFTER         ADVANCING          助忆名
PAGE
5。OPEN语句:程序中如果需要读写文件,则该文件必须先用OPEN语句打开,系统在执行READ,WRITE以前先检查该文件是否已在规定的外部设备上准备就绪。
OPEN语句的一般格式为:
INPUT 文件名1 [,文件名2]。。。
OPEN   OUTPUT 文件名3 [,文件名4]。。。     。。。
6。CLOSE语句:当对一个文件的读或写的操作已完成,就应关闭该文件。
CLOSE语句的一般格式为:
CLOSE 文件名  1   [,文件名2]。。。
COBOL通过2位长度的文件状态字(FILE-STATUS)来表示文件的操作结果是否成功,常见的文件状态值及意义:
二。算数运算语句
1。ADD语句:
格式1:ADD     标识符1 ,标识符2。。。  TO 标识符m [,标识符n]。。。
常量1 ,常量2
格式2:ADD     标识符1     ,标识符2      ,标识符3
常量1         ,常量2          ,常量3
。。。GIVING 标识符m [,标识符n]。。。
2。SUBTRACT语句:
格式1:SUBTRACT       标识符1 ,标识符2 。。。 FROM 标识符m [,标识符n]。。。
常量1 ,常量2
格式2:SUBTRACT       标识符1      ,标识符2   。。。  FROM      标识符
常量1          ,常量2                                       常量
GIVING 标识符n [,标识符p]。。。
3。MULTIPLY语句:
格式1:MULTIPLY        标识符1         BY 标识符2 [,标识符3]。。。
常量1,
格式2:MULTIPLY        标识符1         BY 标识符2  GIVING 标识符3 [,标识符4]。。。
常量1 , 常量2
4。DIVIDE语句:
格式1:DIVIDE              标识符1         INTO 标识符2 [,标识符3]。。。
常量1
格式2:DIVIDE             标识符1         INTO 标识符2  GIVING 标识符3 [,标识符4]。。。
常量1  BY 常量2
B          à     注意: DIVIDE    A  INTO  B    是指    B/A
DIVIDE   A  INTO  Cà B   GIVING  C     是指 B/A
DIVIDE    A  BY      B   C àGIVING  C     是指    A/B
5。COMPUTE 语句:
COMPUTE           标识符1  [,标识符2 ]。。。= 算术表达式
运算的优先级由高到低顺序为:(),正负号  ,** ,* 或  /   ,+ 或 -
如:C = 3 ,D = 5 ,E = 2 , F = 1 则:
COMPUT   A,B = -(C + D)* 2 /  E ** 3 -  F = -3
三。传送语句 (MOVE)
MOVE 语句用来实现内存中数据的传送(而不是内存和外设之间的传送)。
MOVE语句的一般格式为:
MOVE          标识符1        TO          标识符2 [,标识符3]。。。
常量1
MOVE语句的传送规则:
1,如果接收项和发送项在数据部中描述的类型和长度相同,则按字节一一对应传送。
2,如果接收项和发送项长度不相同,而二者都是数值数据项,则按小数点对齐处理。
3,对字母或字符数据(非数值型数据)的传送,按左对齐处理。
4,初等项和组合项之间可以相互传送。
关于各类数据之间的传送规则将在第五章中介绍。
四。转移语句(GO  TO)
当需要使程序改变正常执行的顺序时,可以使用无条件转移语句 GO  TO 。其一般格式为:
格式1: GO         TO     过程名
格式2:      GO          TO    过程名1  [,过程名2]。。过程名n   DEPENDING    ON      标识符
注意:只能转移到段或节的开头,不能转移到段或节的当中某一语句。段名或节名为过程名。
五。条件语句(IF)
当需要根据给出的某些条件是否满足来决定应执行哪一部分语句时,可以使用条件语句IF。
其一般格式为:
IF         条件     语句组1               ELSE       语句组1                   [END-IF]
NEXT  SENTENCE                      NEXT  SENTENCE
COBOL关系运算符:  IS         GREATER     THAN    (>)
IS         LESS              THAN    (<)
IS         EQUAL          TO          (=)
NOT    GREATER     THAN    (NOT >) (<=)
NOT    LESS              THAN    (NOT <) (>=)
NOT    EQUAL          TO         (NOT =)
注意:句点在IF 语句中的特殊作用。
如:IF    A >  0
DISPLAY        A。
ADD          A          TO    TOTAL。
DISPLAY         TOTAL。
与   IF    A  >  0
DISPLAY  A
ADD         A     TO    TOTAL。
DISPLAY        TOTAL。就不同。
为避免出现问题应该使用显式终止符(END-IF,END-PERFORM等)代替隐式终止符(句点”。”)
六。停止语句(STOP)
其一般格式为:           STOP          RUN
常量
STOP   RUN  执行后,程序停止运行,停止后不能再接着运行,如需要,可重新运行一次。
STOP  常量,表示程序暂时挂起不往下执行,显示出此常量。
七。返回语句(GOBACK)
停止运行,将控制权返回给上一级。可用本语句代替STOP语句。子程序必须用GOBACK而
不能用STOP:因为STOP停止的是一个RUN UNIT(运行单元)。
CHAPTER   3 标识部和环境部
一。标识部(IDENTIFICATION  DIVISION
IDENTIFICATION       DIVISION.
PROGRAM-ID.             程序名。
[AUTHOR。                 作者名。 ]
[INSTALLATION。     计算机设置场所。 ]
[DATE-WRITTEN。    源程序编写日期。 ]
[DATE-COMPILED。 源程序编译日期。 ]
[SECURITY。              保密程度。]
二。环境部(ENVIRONMENT  DIVISION
ENVIRONMENT          DIVISION.
CONFIGRATION         SECTION。
SOURCE-COMPUTER。     源计算机名。
OBJECT-COMPUTER。      目标计算机名。
[SPECIAL-NAMES。           专用名描述项。 ]
[INPUT-OUTPUT         SECTION。
FILE-CONTROL。      {文件控制描述体}。。。
[I-O-CONTROL。       输入输出控制描述体]]
1。CONFIGRATION  SECTION。
专有名段的一般格式:
SPECIAL-NAMES。
[DICIMAL-POINT      IS   COMMA。]
[CURRENCY   SIGN IS   非数值常量。]
[专用名                       IS    助忆名。]
2。INPUT-OUTPUT   SECTION。
INPUT-OUTPUT  SECTION 包括两个段,即:FILE-CONTROL   和 I-O-CONTROL。FILE-CONTROL段是为文件分配外部文件。I-O-CONTROL段的作用是可以指定目标程序运行时,几个文件共用一个内存区,以省内存。在此暂不作介绍。
FILE-CONTROL段的主要功能是给程序中使用的文件命名。指出存放该文件的外部设备及其它有关文件控制的信息。对文件的描述是由SELECT子句实现的。FILE-CONTROL段的一般格式:
INPUT-OUTPUT       SECTION。
FILE-CONTROL。
SELECT       文件名    ASSIGN    TO   外部文件名
[ORGANIZAION          IS ...   ]       (SEQUENCIAL , INDEXED , RELATIVE)
[ACCESS     MODE      IS ...   ]       (SEQUENCIAL, RANDOM , DYNAMIC)
[RECORD   KEY           IS  ...   ]
[FILE  STATUS    IS           ...   ]
CHAPTER   4 数据部之一
一。数据部概述。
1。 数据部的作用是定义数据项属性,描述数据结构。所有在过程部中出现的数据项都必须在数据部中对它们的属性进行说明。包括数据项的类型,数据项间的关系,记录与文件的关系,文件的属性。
2。 数据的层次和层号:COBOL中把有从属关系的数据用层次(level)关系来描述。数据的层次结构是:记录–》组合项–》初等项。如,在前面READ语句中定义的 IN-FILE 文件具有如下结构:
01      IN-RECORD。
02     PROD-CODE PIC   9(4)。
02     PROD-QUANTITY PIC   9(5)。
02     PROD-PRICE PIC   9(6)。
02     MANU-DATE。
05   DATE-CCYY PIC   9(4)。
05   DATE-MM PIC   9(2)。
05   DATE-DD PIC   9(2)。
层次规定如下:
(1)用来描述数据的层次结构的层号从01到49。记录的层次最高,定为01层号。
(2)从属项的层号比其下属项的层号高。层号不必要求连续。
(3)从属于同一组合项但不互相从属的数据项具有相同的层号。
3。数据部的结构:  数据部中通常用到的有以下几个节:
(1)FILE SECTION:描述程序中用到的输入输出文件及其记录中各数据项的属性。
(2)WORKING-STORAGE SECTION:描述程序中用到的中间数据项。
(3)LINKAGE SECTION:描述与调用程序间发生数据传递的数据项。
(4)REPORT SECTION:为了完成报表编制功能,此节用来规定欲输出的报表的
‘体裁’,设计各报表栏的打印形式和方法等。
二。文件节。
1。文件节的作用:  程序中每一个输入或输出文件都要在文件节中加以描述。内容包括:文件名和文件属性;文件中包括的记录名字;每个记录中数据的层次关系;记录中各数据项的数据形式和占内存的大小。
2。文件描述:          最简单的文件描述体的一般格式为:
FD 文件名
LABLE      RECORD        IS           STANDARD
RECORDS      ARE  OMITTED
DATA        RECORD        IS  数据名
RECORDS      ARE
3。记录描述:记录描述体由01层号开始,后跟记录名。如果记录本身就是一个初等项,则在记录名后描述记录长度;否则,数据名后跟句点,下面定义记录的数据结构。如:
DATA DIVISION。
FILE SECTION。
FD    IN-FILE
LABLE    RECORD IS STANDARD。
DATA      RECORD IS IN-FILE-RECORD。
01     IN-FILE-RECORD          PIC         X(80)。
DATA DIVISION。
FILE SECTION。
FD    IN-FILE
LABLE    RECORD IS STANDARD。
DATA      RECORD IS IN-FILE-RECORD。
01     IN-FILE-RECORD          PIC         X(80)。
或    ( 01     IN-FILE-RECORD。
05     DATE  PIC   9(8)。
05     PROD-CODE PIC   9(4)。
05     PROD-PRICE PIC   9(6)。             )
4。数据项描述: 在每一个初等项的名字后跟一个PIC子句。用它来描述数据的类型和长度。PIC子句在下面详细说明。
5。文件节的书写格式:   FD从A区开始书写,01层号也从A区开始,其它层号可以从A区也可以从B区开始。为了看起来层次分明,最好从B区开始。
三。PIC 子句。PIC即PICTURE的缩写。PIC子句用来描述每一个初等项。它说明:(1)数据项是什么类型。(2)数据项占多大内存域。(3)是否需要按打印的要求准备有关字符。PIC子句的主要作用在于描述一个初等项的一般特征和编辑要求。
1。数值型数据的描述:
‘9′描述符:  表示该位置上可以放入一个0 ~ 9 之间的数字。因此:
01          A        PIC 999。           或
01          A        PIC 9(3)。
表示A可以存放000 ~ 999 之间的一个三位数。有几个9表示有几位数。
注意:(1)在数值型数据项中只能放数字不能放空格。
(2)用’9′描述符只能表示整数,如输入小数部分,则小数部分被舍弃。
(3)如送入一个负数,则负号被舍弃。
‘V’描述符:  指出在数值数据结构中隐含的小数点的位置。小数点不占内存单元。如:
03         M         PIC   9(3)V9(2)。
注意:(1)V在描述符的最后,则等于无小数点。
(2)一个数据的描述符中只能出现一个V。
(3)进行数据传送或运算时,按隐含的小数点位置对准进行传送或运算。
(4)V表示的小数点只在传送或运算时起作用,不能被显示或打印出来。
‘S’描述符:  如果想在数据项中放入一个带符号的数,可以用’S'描述符。如:
03         M         PIC   S9(3)V9(2)。
注意:(1)S描述符必须是最左边的一个描述符。
(2)在内存中,S不占位数,在传送或运算时起作用。
2。字母型数据的描述:字母型数据项用A描述符,在这种类型的数据项中只允许存放字母或空格。
3。字符型数据的描述:由任意的COBOL字符组成的数据,称为字符型数据,它是非数值型的,不能用于计算。用X描述符来表示字符型数据。如:
03         M        PIC   X(5)。
注意:(1)字符型数据可以用X描述符,也可以用9和A描述符来描述。如描述数据
‘COB-74′可以用PIC  X(6),也可以用    PIC   A(3)X9(2)。
(2)字母型数据既可以用A描述,也可以用X。
(3)字符型数据中可以放数字。
4。编辑型描述符:编辑型数据项只是作为输出数据时增加或改变某些所需的符号,起编辑作用,它不是作计算用的。下面分别介绍编辑数据项中用到的编辑描述符。
(1)。插入小数点’。’,用’。’描述符。如:
77         T        PIC   99。99。
(2)。插入逗号’,’作分位号,用’,’描述符。如:
02         A        PIC  999,999。99。 (或PIC  9(3),9(3)。9(2))
(3)。插入空格,用’B'描述符。如:
02         A        PIC   B9(3)B。
(4)。插入正负号,用’+'或’-'描述符。如:
02         A1      PIC   +9(3)。(或 PIC   9(3)+)
02         A2      PIC   -9(3)。(或PIC  9(3)-)
注意:描述符’+',一侓加符号。描述符’-'只对负值加负号。
(5)。插入’$' 。如:
02         A1       PIC   $999。99。
02         A2       PIC  +$99999。
02         A3       PIC  -$999。9。
(6)。浮动插入正负号和’$’
02         A1       PIC  $$$99.99.
02         A2       PIC  $$$$$.$$.
02         A3       PIC  ++9.99.
(7)。取消高位零,用’Z'和’*'描述符。在高位零的位置上代以空格或’*'。如:
02         A1       PIC  Z(5)。99。
02         A2       PIC  *(5)。*(2)。
02         A3       PIC  +ZZZ,ZZZ,ZZ。ZZ。
02         A4       PIC  -*,***,***。99。
(8)。插入’DB’和’CR’字符。DB和CR只能用作固定插入,当数值为负时,在编辑型数               据项中最后两个字节中置DB或CR,数值为正时,此两字节留空格。如:
02         A1       PIC  $9(3)。99DB
02         A2       PIC  $9(3)。99CR。
5.常用数值型数据
四。工作单元节(WORKING-STORAGE SECTION)
1。工作单元节的作用:程序中用的数据项分为两部分,一部分是属于输入或输出文件的,另一部分是非输入或输出的数据。如一些中间变量或用作累计的数据项等。非输入输出的数据就应在工作单元节中描述,还可以用工作单元节来赋初值。
2。VALUE子句:用于给变量赋初值。如:
02      A        PIC       9(3)     VALUE   123。
注意: (1)只有对工作单元节中的数据项才能赋初值,不能对文件节中输入输出文件中的           数据项赋初值。
(2)如果在组合项的描述体中使用VALUE,初值只能是表意常量或非数值型常量。           对组合项整体而言,一律按字符型数据项处理。
(3)当用一个带符号的数值作初值时,相应的PIC子句中应有’S'描述符。
(4)赋初值时应该注意类型的一致性。
(5)VALUE子句给出的值应适合PIC子句的描述范围,否则会出现截断或产生错误。
CHAPTER   5 过程部之二
一。MOVE 语句的较高技巧
1。各种类型数据之间的传送规则见下表:(Y:表示合法传送。N:表示非法传送。空白:表示某些时候是合法的。)
接收项
数值型
数值型
数值编辑型
字母型
字符型
字符编辑型
组合项
发送项
整数
非整数
 
 
 
 
 
数值型整数
Y
Y
Y
N
Y
Y
Y
数值型非整数
Y
Y
Y
N
N
N
Y
数值编辑型
Y
Y
Y
N
Y
Y
Y
字母型
N
N
N
Y
Y
Y
Y
字符型
 
 
 
 
Y
Y
Y
字符编辑型
N
N
N
N
Y
Y
Y
数值常量
Y
Y
Y
N
N
N
Y
非数值常量
N
N
N
Y
Y
Y
Y
ZERO
Y
Y
Y
N
Y
Y
Y
SPACE
N
N
N
Y
Y
Y
Y
组合项
 
 
 
 
Y
Y
Y
2。用CORRESPONDING子句的传送 – 对应传送(同名传送)
对应传送的一般格式:
MOVE         CORRESPONDING             标识符1       TO        标识符2
CORR
说明:(1)如果两个组合项中包括的项不同,则只传送同名的项。
(2)传送的两者间必须有成对的同名数据项,而且这一对中必须至少有一个项是
初等项。否则不能作为对应项传送。
(3)所谓同名,指的是它们有相同的全程受限,即全程同名。
假如T1和T2的描述分别为:
01         T1。  01         T2。
02  X。        02    X。
03  X1。。。                03     X2。。。
03  X3。。。                                    03     X1。。。
02  Y1。        02    Y。
03  A1。。。                 03      A1。。。
则T1中的A1与T2中的A1就不是全程同名。
4。除法语句中的余数语句(REMAINDER 子句):DIVIDE 语句只能求商不能求余数。如想求余数,可用       REMAINDER 子句。
如:  DIVIDE        A        INTO      B            GIVING       C         REMAINDER             D
注意:(1)商和余数的值不仅取决于除数和被除数,还取决于数据部中对商和余数的描述。
(2)如用ROUNDED子句,它只对商起作用,余数不作四舍五入处理,在计算余
数时,仍按四舍五入前的值为准。
(3) 长度溢出也只检查商的值是否溢出,而不检查余数。
三。IF语句的较高技巧
1。符号条件:
数据名       IS  [NOT]          POSITIVE
算术表达式               NEGATIVE
ZERO
2。类型条件:
标识符 IS        [NOT]    NUMERIC
ALPHABETIC
3。条件名条件:用来表示条件变量当前值的名字叫条件名。条件名本身是一个条件,它有一个值(’真’或’假’),用它来检查条件变量的值是否落在条件名所代表的值的范围中,当条件变量的值落在条件名所代表的值的范围中,则此条件名所表示的条件为’真’,否则为’假’。
条件名条件的一般格式:
88           条件名        {  VALUE      IS}        常量1        [{THRU}      常量2]
[常量3       [ [{THRU}      常量4]] 。。。]
如: 02      WS-FILE-STATUS       PIC      9(2)。
88         WS-FILE-NORMAL          VALUE  0,93。
88         WS-FILE-EOF           VALUE  10。
CHAPTER   6 过程部之三
一。执行语句的作用:在一个COBOL程序中,过程部中往往有一部分语句需要执行多次。为了让重复的部分在程序中只出现一次,可以把重复的部分单独写成一段或一节(有一个段名或节名),每次执行这部分语句时转去该段,执行完转回来。这时候就需要用到执行语句(PERFORM )。
二。执行语句的一般形式:
PERFORM           过程名1        [THRU]                过程名2
三。使用PERFORM语句实现循环:
1。 PERFORM           过程名1        [{THRU}                过程名2   ]        整数         TIMES
标识符
2。 PERFORM           过程名1        [{THRU}                过程名2   ]        UNTIL     条件
3。 PERFORM           过程名1        [{THRU}                过程名2   ]
VARYING    标识符1        FROM   常数1        BY       常数2             UNTIL   条件
标识符2                            标识符3
四。执行语句的多重循环形式:COBOL 允许三重循环,其一般格式可写为:
PERFORM          过程名1        [{THRU}                过程名2   ]
[VARYING   参数1        FROM   初值1        BY       步长1             UNTIL   条件1 ]
[AFTER         参数2        FROM   初值2        BY       步长2             UNTIL   条件2 ]
[AFTER         参数3        FROM   初值3        BY       步长3             UNTIL   条件3 ]
五。出口语句(EXIT):EXIT语句提供了一组过程的公共出口,即指出了被调用过程的逻辑终点。
CHAPTER   7 各部之间的关系及程序举例
一.各部之间的关系:
IDENTIFICATION   DIVISION.
PROGRAM-ID.        PROGRAM1.
给程序加上标识以便识别.
ENVIRONMENT  DIVISION.
CONFIGRATION   SECTION.
INPUT-OUTPUT    SECTION.
FILE-CONTROL.
SELECT    PRODFILE  ASSIGN  TO FILE1.
描述程序中用到的文件与外部文件的关系及控制信息
DATA  DIVISION.
FILE   SECTION.
FD    PRODFILE    LABEL  RECORD  IS  STANDARD.
01     PROD-REC      PIC      X(200).
WORKING-STORAGE   SECTION.
01     WS-VARIBALES.
05   WS-I          PIC      9(2).
描述程序中用到的所有文件及其记录中各数据项的属性及程序中用到的所有中间数据项的描述.
PROCEDURE  DIVISION.
程序的核心部分,他决定计算机进行什么操作.如,文件的读写及其他处理
二.程序举例:
例1:
读入一组产品销售记录,每读入一个记录,计算出销售总额(数量X单价).然后打印出该产品的全部数据.数据形式如下:
1  9  9  2  1  2  3  1  0  0  0  0  0  1  A  A  A  A  0  1  0  0  5  0  0  0
1  9  9  3  1  2  3  1  1  0  0  0  0  1  B  B  B B  0  2  0  0  6  0  0  0
————————-  —————–   ————  ————  ———–
DATE                PRODCODE     CUST        AMT        PRICE
程序如下:
IDENTIFICATION       DIVISION.
PROGRAM-ID.             PEXAM1
ENVIRONMENT          DIVISION.
CONFIGRATION         SECTION.
INPUT-OUTPUT          SECTION.
FILE-CONTROL.
SELECT     INPUT-FILE         ASSIGN    TO     FILE1
ORGANIZATION                    IS      SEQUENCIAL
ACCESS    MODE                    IS      SEQUENCIAL
FILE-STATUS                          IS     WS-INPUT-FILE-STATUS.
SELECT    OUTPUT-FILE        ASSIGN  TO     P-FILE
ORGANIZATION                    IS      SEQUENCIAL
ACCESS    MODE                    IS      SEQUENCIAL
FILE-STATUS                          IS     WS-OUTPUT-FILE-STATUS.
DATA                           DIVISION.
FILLE                           SECTION.
FD      INPUT-FILE       LABEL     RECORD    IS     STANDARD.
01       IN-REC.
05      DATE            PIC    9(8).
05      PROD-CODE  PIC    9(6).
05      CUSTOMER-CODE  PIC    X(4).
05      QUANTITY  PIC    9(4).
05      UNIT-PRICE     PIC    9(4).
FD      OUTPUT-FILE       LABEL     RECORD    IS     STANDARD.
01       OUT-REC.
05      DATE            PIC    9999B99B99.
05      FILLER   PIC    X(5).
05      PROD-CODE  PIC    9(6).
05      FILLER   PIC    X(5).
05      CUSTOMER-CODE PIC    X(4).
05      FILLER   PIC    X(5).
05      QUANTITY  PIC    ZZZ9.
05      FILLER   PIC    X(5).
05      UNIT-PRICE           PIC    $(5).
05      FILLER          PIC    X(5).
05      SALES-VALUE      PIC    $(8).
WORKING-STORAGE                SECTION.
01       WS-VARIBLES.
05      WS-INPUT-FILE-STATUS  PIC    9(2).
88       WS-INPUT-FILE-SUCCESSFUL         VALUE     0.
88       WS-INPUT-FILE-EOF                          VALUE    23.
05      WS-OUTPUT-FILE-STATUS PIC    9(2).
88       WS-OUTPUT-FILE-SUCCESSFUL     VALUE     0.
PROCEDURE                                DIVISION.
A000-MAIN.
PERFORM         A100-OPEN-FILES
PERFORM         R000-READ-FILE
PERFORM         A200-PROCESS-RECORD UNTIL WS-INPUT-FILE-EOF
PERFORM         A300-CLOSE-FILES
STOP RUN
.
A000-EXIT.
EXIT
.
A100-OPEN-FILES.
OPEN INPUT        INPUT-FILE
OUTPUT    OUTPUT-FILE
IF     NOT           WS-INPUT-FILE-SUCCESSFUL
DISPLAY   ’INPUT-FILE              OPEN     NOT   SUCCESSFUL’    UPON    CONSOLE
PERFORM  Z000-ABEND
END-IF
IF     NOT            WS-OUTPUT-FILE-SUCCESSFUL
DISPLAY   ’OUTPUT-FILE         OPEN      NOT   SUCCESSFUL’    UPON    CONSOLE
PERFORM  Z000-ABEND
END-IF
.
A200-PROCESS-RECORD.
INITIALIZE  OUT-REC
MOVE           CORR         IN-REC     TO           OUT-REC
COMPUTE   SALES-VALUE   =  QUANTITY  OF  IN-REC   *   UNIT-PRICE   OF   OUT-REC
PERFORM   W000-WRITE-FILE
PERFORM    R000-READ-FILE
.
A300-CLOSE-FILE.
CLOSE         INPUT-FILE
OUTPUT-FILE
.
R000-READ-FILE.
READ  INPUT-FILE
IF     NOT   WS-INPUT-FILE-SUCCESSFUL   AND  NOT    WS-INPUT-FILE-EOF
DISPLAY   ’INPUT-FILE  READ NOT   SUCCESSFUL’    UPON    CONSOLE
PERFORM  Z000-ABEND            THRU      Z000-EXIT
END-IF
.
W000-WRITE-FILE.
WRITE  OUT-REC         AFTER     1
IF     NOT   WS-OUTPUT-FILE-SUCCESSFUL
DISPLAY   ’OUTPUT-FILE  WRITE  NOT   SUCCESSFUL’    UPON    CONSOLE
PERFORM  Z000-ABEND
END-IF
.
Z000-ABEND.
DISPLAY   ’PROGRAM   ABEND !’    UPON    CONSOLE
PERFORM  A300-CLOSE-FILES          THRU    A300-EXIT
MOVE         16                                         TO         RETURN-CODE
GOBACK
.
输出的数据形式如下:
1992 12 31     000001     AAAA      100      $5000      $500000
1993 12 31     100001     BBBB       200      $6000      $1200000
例2:
Program : INVI300    Update  inventory   file (random)
File
Description
Use
VALTRAN
Valid inventory transaction  file
Input
INVMAST
Inventory  master  file
Update
ERRTRAN
Unmatched inventory transaction file
Output
Process specifications
This program updates an inventory master file (INVMAST) based on the data in a sequential
file of valid inventory transaction records (VALTRAN). The inventory master file is indexed  by item number and updated randomly.
If the program finds a master record with the same item number as a transaction, it uses the
transaction data to update the master record .It does this by increasing the on hand quantity
in the master record by the receipt quantity in the transaction record.
If the program cannot find a master record for a transaction, it writes the transaction record on
the file of error transactions (ERRTRAN). The record format format for ERRTRAN is same as
for VALTRAN.
The basic processing requirements are:
1. Read a transaction record.
2. Read the master record with the same item number as in the transaction record.
3. If the master  record is found , update and rewrite the matching master record.
4. If the transaction is not found , write the transaction record on the file of error  transactions.
程序如下:
IDENTIFICATION DIVISION.
PROGRAM-ID. INV1300.
ENVIRONENT  DIVISON.
INPUT-OUTPUT  SECTION.
FILE-CONTROL.
SELECT  VALTRAN    ASSIGN  TO   SYS020-AS-VALTRAN.
SELECT  INVMAST     ASSIGN  TO   SYS021-INVMAT
ORGANIZATION IS  INDEXED
ACCESS                 IS    RANDOM
RECORD KEY       IS   MR-ITEM-NO
FILE STATUS        IS   INVMAST-ERROR-CODE.
SELECT  ERRTRAN    ASSIGN  TO   SYS022-AS-ERRTRAN.
DATA  DIVISION.
FILE  SECTION.
FD    VALTRAN
LABEL  RECORDS  ARE  STANDARD.
01     VALID-TRANSACTION-AREA  PIC  X(21).
FD    INVMAST
LABEL RECORDS  ARE  STANDARD.
01     MASTER-RECORD-AREA.
05   MR-ITEM-NO  PIC  X(5).
05   FILLER   PIC  X(45).
FD    ERRTRAN
LABEL  RECORDS ARE STANDARD.
01     ERROR-TRANSACTION  PIC  X(21).
WORKING-STORAGE SECTION.
01    SWITCHES.
05    VALTRAN-EOF-SWITCH PIC  X   VALUE  ’N’.
88    VALTRAN-EOF                                  VALUE  ’Y’.
05    MASTER-FOUND-SWITCH PIC  X.
88    MASTER-FOUND                               VALUE  ’Y’.
01    FILE-STATUS-FIELD.
05    INVMAST-ERROR-CODE PIC  X(2).
01    INVENTROY-TRANSACTION-RECORD.
05    IT-ITEM-NO  PIC  X(5).
05    IT-VENOR-NO  PIC  X(5).
05    IT-RECEIPT-DATE  PIC  X(6).
05    IT-RECEIPT-QUANTITY             PIC  S9(5).
01    INVENTORY-MASTER-RECORD.
05    IM-DESCRIPTIVE-DATA.
10    IM-ITEM-NO  PIC  X(5).
10    IM-ITEM-DESC  PIC  X(20).
10    IM-UNIT-COST  PIC  S9(3)V9(2).
10    IM-UNIT-PRICE         PIC  S9(3)V9(2).
05    IM-INVENTORY-DATA.
10    IM-REORDER-POINT PIC  S9(5).
10    IM-ON-HAND  PIC  S9(5).
10    IM-ON-ORDER  PIC  S9(5).
PROCEDURE DIVISION.
A000-UPDATE-INVENTORY-FILE.
OPEN             INPUT        VALTRAN
I-O               INVMAST
OUTPUT     ERRTRAN
PERFORM    B000-PROCESS-INVENTORY-TRAN      THRU     B000-EXIT
UNTIL         VALTRAN-EOF
CLOSE                  VALTRAN
INVMAST
ERRTRAN
DISPLAY      ’PROGRAM   INV1300  NORMAL  END’
GOBACK.
B000-PROCESS-INVENTORY-TRAN.
PERFORM                      B100-READ-INVENTORY-TRAN
IF      NOT                       VALTRAN-EOF
PERFORM            B200-READ-INVENTORY-MASTER
IF     MASTER-FOUND
PERFORM   B300-UPDATE-INVENTORY-MASTER
ELSE
PERFORM   B400-WRITE-ERROR-TRAN
END-IF
END-IF.
B000-EXIT.
EXIT.
B100-READ-INVENTRORY-TRAN.
READ   VALTRAN        INTO    INVENTORY-TRANSACTION-RECORD
AT   END           MOVE  ’Y'         TO        VALTRAN-EOF-SWITCH.
B100-EXIT.
EXIT.
B200-READ-INVENTORY-MASTER.
MOVE   IT-ITEM-NO                                    TO         MR-ITEM-NO
READ    INVMASST                                      INTO    INVENTORY-MASTER-RECORD
IF           INVMAST-ERROR-CODE              = ’00′
MOVE  ’Y'                                        TO         MASTER-FOUND-SWITCH
ELSE
MOVE  ’N'                                        TO         MASTER-FOUND-SWITCH
END-IF.
B300-UPDATE-INVENTORY-MASTER.
ADD     IT-RECEIPT-QUANTITY                TO          IM-ON-HAND
REWRITE  MASTER-RECORD-AREA       FROM    INVENTORY-MASTER-RECORD
IF          INVMAST-ERROR-CODE              NOT       =   ’00′
DISPLAY   ’ INV1300  REWRITE   INVMAST ERROR . ITEM  NUMBER = ’ IM-ITEM-NO
DISPLAY   ’ FILE  STATUS    = ’    INVMAST-ERROR-CODE
MOVE  ’Y'                                         TO         VALTRAN-EOF-SWITH
END-IF.
B300-EXIT.
EXIT.
B400-WRITE-ERROR-TRAN.
WRITE   ERROR-TRANSACTION                FROM   INVENTORY-TRANSACTION-RECORD.
B400-EXIT.
EXIT.
IDENTIFICATION DIVISION.
PROGRAM-ID.    PROGRAM3.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-RESP    PIC S9(8)  COMP.
88  WS-RESP-NORMAL   VALUE  0.
01  PGM3COM.
05  CUST-NO  PIC  9(8).
05  PGM3-OUT.
10  PGM3-RETURN-CODE PIC  X(2).
88  PGM3-SUCCESSFUL                    VALUE ’  ’.
88  PGM3-CUST-NBR-ERR                VALUE ’01′.
88  PGM3-CUST-NOT-FND               VALUE ’02′.
10  PGM3-AC   PIC  9(5).
10  PGM3-BAL   PIC  9(11).
01  MASTER-RECORD.
05  MASTER-KEY      PIC  9(8).
05  CUST-NAME    PIC  X(20).
05  CHECK-AC    PIC  9(5).
05  BAL    PIC  9(11).
LINKAGE SECTION.
01  DFHCOMMAREA                    PIC  X(26).
PROCEDURE DIVISION.
A000-MAIN-PROCESS.
MOVE  DFHCOMMAREA       TO      PGM3COM
INITIALIZE PGM3-OUT
PERFORM B000-VALIDATION      THRU B000-EXIT
IF      PGM3-SUCCESSFUL
PERFORM C000-PROCESS    THRU C000-EXIT
END-IF
.
A999-RETURN.
MOVE PGM3COM                 TO   DFHCOMMAREA.
EXEC CICS        RETURN     END-EXEC.
GOBACK.
*
B000-VALIDATION.
IF   CUST-NO       NOT  NUMERIC
SET PGM3-CUST-NBR-ERR    TO   TRUE
END-IF
.
B000-EXIT.
EXIT.
*
C000-PROCESS.
MOVE CUST-NO                  TO   MASTER-KEY
EXEC CICS READ FILE  (’VMASTER’)
RIDFLD(MASTER-KEY)
INTO  (MASTER-RECORD)
LENGTH(LENGTH OF MASTER-RECORD)
RESP  (WS-RESP)
END-EXEC
IF  WS-RESP    NOT            =    DFHRESP(NORMAL)
IF  WS-RESP              =    DFHRESP(NOTFND)
SET  PGM3-CUST-NOT-FND  TO   TRUE
ELSE
EXEC   CICS  ABEND  ABCODE(’ABCD’)   END-EXEC
END-IF
ELSE
MOVE CHECK-AC            TO   PGM3-AC
MOVE BAL   TO   PGM3-BAL
END-IF
.
C000-EXIT.
EXIT.
CHAPTER   8 联机及批量程序的一些差异
批量
联机
对大量数据的集中处理
对特定的少量数据操作
一般在非营业时间运行
一般在营业时间运行
对效率要求较高
对实时性要求较高
在操作系统中通过后台作业流来调度运行
在CICS平台上通过CICS激活运行
资源由作业流和程序管理
资源由CICS集中管理,程序对资源使用通过调用CICS提供的语句
一般会使用INPUT-OUTPUT SECTION.
FILE-CONTROL. FILE SECTION.
不会使用INPUT-OUTPUT SECTION.
FILE-CONTROL. FILE SECTION.
出错处理通过检测文件状态字
出错处理通过检测CICS返回状态字
CHAPTER   9 COBOL 编程规范
1.使用結構化的編程方法 ,開發一致的、可理解的和易于維護的COBOL程序 .結構化編程應遵循”KISS”法則,即:”Keep It Simple & Stupid” for EASY TO READ ,EASY TO DEBUG ,EASY TO MAINTAIN.
2.只用顺序,循环,选择3种程序結構及組合去表示程序邏輯
3.每個控制結構只有一個入口和一個出口(結構可以是一個模塊,段,節,子程序)。
4.不要爲了時空效率而犧牲清晰性。
5.程序的清晰性首先在於邏輯的清晰,然後才是格式的清晰。
6.清晰的格式有助於清晰的思維。
7.確信所有變量在被使用時都被正確地置初值。
8.避免濫用語言特色,應使程序簡潔易讀。
9.使用有意義的、簡化的變量名及詞語標號。
10.盡量使用標準的公用子程序執行既定的程序功能。
11.避免不必要的複雜的算術和邏輯表達式。
12.避免重復的控制序列以及不必要的轉移。
13.不要用注釋去精確地重復程序代碼,要使得注釋有價值。
14.嚴格控制非限制性轉移語句”GOTO”的使用,除非下面兩種情況:當不使用時將會模糊而不是澄清功能;
在同一程序單元内正向轉移。
posted @ 2015-01-14 23:05  一凡先生  阅读(5479)  评论(0编辑  收藏  举报