COBOL语言总结(一)

一、COBOL语言

1、COBOL简介

COBOL(Common Business Oriented Language)语言、即公用面向商业语言,是一种面向过程的高级程序设计语言,主要用于数据处理,是目前国际上应用最广泛的一种高级语言。

COBOL作为大型机上最主要的程序设计语言,迄今50多年历史。

大型机也叫主机、大机或MainFrame等,属于一种商用高端服务器。主要由IBM公司生产。

1960年4月正式发表COBOL61,目前最新版COBOL2002。

2、COBOL语法格式

COBOL程序的每行代码通常分为80列。有非标准80列的可以超过80列,写多少列都可以。

80列中的列与列之间不同的范围及其意义如下:

第1-6列:序号区

第7列:指示符区:

                        A. “ ”空,后接正常的COBOL语句。

                        B. "*" 注释符,注释当前行。

                        C. "/" 注释符,注释当前行,程序编译时,强制程序清单另起一页。

                        D. "-" 字符串连接符。

                        E. "D" Debug行标识符,Debug模式时,该行代码执行。

                        F. "B" 标明BATCH程序。

                        G. "C" 标明CICS程序。

第8-11列:A区:包括COBOL中的部/节/语句段的标识符,以及01层数据层号等

第12-72列:B区:包含过程部中的各条语句

第72-80列:说明区:用于对程序进行注释,代码修改的日期和修正记号一般写在此区。

3、COBOL程序结构

每个完整的COBOL程序代码都是由4个部组成的。这4个部依次为标志部环境部数据部过程部。部与部之间的先后顺序不可更改

3.1、标志部:

        由"IDENTIFICATION DIVISION"关键字标识,主要用来描述与程序本身相关的信息

                PROGRAM-ID:指明程序名,是必须具备的字段。其他字段都是可选的。

                AUTHOR:开发程序的程序员名

                INSTALLATION:通常指设计该程序的公司或部门

                DATE-WRITTEN:指明程序编写或修改的日期

                DATE-COMPILED:指明程序编译的日期

                SECURITY:通常用于列出具有访问该程序权限的用户

3.2、环境部:

环境部用来说明程序运行的软硬件环境,是COBOL程序中唯一与设备相关的部分,将程序中用到的内部文件与外部设备建立起来联系。

        由"ENVIRONMENT DIVISION"标识。紧跟标志部之后,没有可省略不写的。

                配置节:由"CONFIGURATION SECTION"标识:作用:指定程序同外部环境之间的一些配置信息。可省略不写

                                SOURCE-COMPUTER:指示编译程序的计算机  

                                OBJECT-COMPUTER:描述运行程序的计算机

                输入/输出节:由"INPUT-OUTPUT SECTION"标识:作用:指定程序中所用到文件同外部环境之间的对应关系

                                FILE-CONTROL:用于指定文件的对应关系,是该节点中主要用到的字段。

                                I-O-CONTROL:用于定义程序返回点,不同文件共享内存区,以及多文件

                                卷中文件的位置

3.3、数据部:

作用:程序中涉及到的全部数据(输入,输出,中间)都要在此定义,对它们的属性进行说明。主要描述一下属性:①数据类型(数值/字符)和存储形式(长度)②数据项间的关系(层次和层号) ③文件与记录的关系

        由"DATA DIVISION" 标识。紧接环境部之后。

                文件节:由"FILE-SECTION"标识。用于对程序中用到的文件里的数据进行定义。文件指逻辑文件。其文件名必须和环境部输入/输出节中由SELECT语句指定的文件名一致。

                                在文件节中,主要以FD语句实现对文件定义。在FD语句下,通过PIC语句依次定义文件中每条记录所含的数据项。

                                任何在程序中所使用的文件都需要在此处定义

                                FD是"File Descriptor"的缩写,即文件描述符的意思。

                                FD语句通过句点表示结束。

                                FD或SD下定义多个01层的场合隐含地重新定义同一区域。相当于被REDEFINES了。相当于隐形的内存共享。

                                COBOL中,01层属于最高层,需要在程序中顶格写。各层层号按顺序编写,不一定连续。COBOL中最多支持49层,因此49层为最低层

                                66层:为特殊描述符项目保留,在实际中用得较少,用于重新编制前面已定义的数据项,必须包含一个RENAMES从句。

01    AA.
    03    BB    PIC 9(4).
    03    CC    PIC 9(2).
    03    DD    PIC 9(2).
66   AE   RENAMES  BB.              //AE和BB内存共享
66   AF   RENAMES  BB   THRU   CC.  //AF从BB到CC内存共享
66   AG   RENAMES  CC   THRU   DD.  //AG从CC到DD内存共享

//66层相当于内存共享

                                77层:用于某个组的数据项,如程序中的临时变量;用于标识一个独立的初等项,它不属于其他组合的初等项。

77    BB    PIC 9(4).

//77类似于01层,是一个单独的内存存储,单变量

                                88层:主要用于条件判断中,用于标识一个条件名变量。

01    AA .
  03   BB     PIC X(3).
      88    CC1   VALUE   '110'.             //BB的值是110,CC1都为真
      88    CC2   VALUE   '111'.
      88    CC3   VALUE   '111' '112'.       //BB的值是111或112,CC3都为真
      88    CC4   VALUE   '113'.
      88    CC5   VALUE   '114' THRU '119'.  //BB的值是114到119之间,CC5都为真
      88    CC6   VALUE   '120'.
      88    CC7   VALUE   '121'.
      88    CC8   VALUE   '122'.

IF   CC3
...
END-IF.

PERFORM   PER-SEC    UNTIL   CC5.

        重要的是不同层次数据间的关系,而不是数据的层号。

                                没有PIC语句的为数据组,有PIC语句的则为单元数据项

                                PIC是"PICTURE"的缩写,PIC语句用来定义数据的类型及长度

                                "X"表示任意字符,"9"表示只能为数字,括号内代表长度

                工作存储节:由"WORKING-STORAGE SECTION"标识。作用:用于定义本程序中所需用到的各种数据

                                规定工作存储节应该写在文件节之后。程序中没有用到外部文件,文件节是可以省略的,但是工作存储节都是会存在的。因为程序中一般总会要用到本地数据的。

                联接节(LINKAGE SECTION):用来描述与调用程序间发生数据传递的数据项。(即参数)

                注:参数除了可以通过主程序的CALL语句来传送之外,也可以通过JCL的EXEC语句的PARM参数来传送。='AAAAAAA8'

3.4、过程部:

作用:编写程序要执行的语句,是程序的核心。

        由"PROCEDURE DIVISION"标识。 逻辑处理部分都在过程部中。

                        "STOP RUN"表明程序的结束

4、COBOL主程序和子程序

                1.主程序:调用其他程序的程序。

                                A. 主程序过程部的部头:PROCEDURE DIVISION.

                                B. 过程部中应该包括一个程序出口语句:STOP RUN.(逻辑上最后一句语句)

                                C. 程序最后标志结束语句,END PROGRAM 程序名.(标记此行后再无程序语句。)

                2.子程序:被其他程序所调用的程序。

                                A. 子程序过程部的头部:PROCEDURE  DIVISION  USING  从主程序中接收到的参数名1,参数名2.

                                B. 过程部中应该包括一个程序出口语句:EXIT  PROGRAM.(逻辑上最后一句语句) 

        子程序概述:PERFORM语句只能在同一程序中多次调用某一语句序列,如果被调用部分较复杂或需要被其他程序使用时,可以将其编写为单独的一个程序,即子程序,调用子程序的为主程序。

        使用子程序的优点:

                简化主程序,使程序结构清晰

                子程序功能单一,易于编写和调试,减少错误

                可由多人完成不同子程序,从而完成复杂任务

                只需重编译修改的子程序,而不必对所有源程序编译

                子程序可以重用,减少重复劳动

5、COBOL常用语句

        ①MOVE语句

MOVE语句的赋值操作,可以实现变量赋值,参数传递等多项类似的功能。

        CORRESPONDING/CORR:对应传送。  

CORRESPONDING/CORR:对应传送。
一般格式:MOVE [CORR]     数据项1     TO     数据项2.
把一个组合项中若干项传送给另一组合项中的同名的项。
对应传送与层号无关。
所谓同名,指的是它们有相同的全程受限(全程同名)

在COBOL程序中,标识名必须唯一识别。受限名的引用使用'OF'限定符。

例如:

01    TODAY-DATE.
    03    YEAR    PIC 9(4).
    03    MONTH   PIC 9(2).
    03    DAY     PIC 9(2).
01    LAST-DATE.
    03    YEAR    PIC 9(4).
    03    MONTH   PIC 9(2).
    03    DAY     PIC 9(2).
MOVE 2012 TO YEAR  OF  TODAY-DATE.
//如果限定一次还不能成为唯一,可以多次使用限定符。
MOVE 'TEST' TO IN-DATA1.        把TEST赋值给IN-DATA1变量
MOVE IN-DATA1 TO OUT-DATA1.        把IN-DATA1变量的值给OUT-DATA变量

        ②PERFORM语句:

调用函数,把一段代码写一个函数,通过PERFORM语句调用。简化代码等目的。PERFORM语句只能在同一程序中多次调用某一语句序列

PERFORM  100-COPY-PROCESS.
.....
PERFORM  100-COPY-PROCESS.
....
STOP RUN.


100-COPY-PROCESS.
    MOVE IN-DATA1 TO SAVE-REC1.
    MOVE IN-DATA2 TO SAVE-REC2.
    MOVE R-NUM TO S-NUM.

        ③ACCEPT语句:

用于接收从键盘或指定设备上获得输入数据

//用于接收从键盘或指定设备上获得输入数据
一般格式:ACCEPT    标识符   [FROM 助忆名]
ACCEPT后只能有一个标识符,标识符可以是组合项。
FROM 助忆名:指定环境中特定的设备,助忆名需要在环境部中定义。
ENVIRONMENT    DIVISION.
CONFIGRATION    SECTION.
    SPECIAL-NAMES.
        CONSOLE    IS    ABC.
ACCEPT    T    FROM    ABC.//则表示要从控制台接收数据
如:ACCEPT     TEST-DATA.
表示从数据项TEST-DATA运行JCL中的SYSIN的DD语句接收一个数据。

//固定取得系统提供的日期和时间信息
ACCEPT TEST-DATE FROM DATE.            //系统当前日期(YYMMDD)
ACCEPT TEST-DATE FROM DATE-YYYYMMDD.   //系统当前日期(YYYYMMDD)
ACCEPT TEST-DATE FROM DAY.             //一年中第几天(YYDDD)
ACCEPT TEST-DATE FROM DAY-OF-WEEK.     //当天是星期几(W)
ACCEPT TEST-DATE FROM TIME.            //系统当前时间(HHMMSS99)

        ④DISPLAY语句:

用于对数据实现输出操作。数据之间可以用逗号或空格隔开。

MOVE 'COBOL' TO T-LANG.

DISPLAY 'Hello World'.
DISPLAY 'THIS IS A OUT' ,T-LANG.

上面程序输出结果:

Hello World
THIS IS A OUT COBOL

        ⑤CONTINUE语句:

用来指定一个空操作,即什么也不做,用来占位置。程序将顺序执行到CONTINUE语句的下一条语句。

        ⑥OPEN语句:

用来实现对文件的打开操作。在对文件进行任何处理之前,必须通过OPEN语句打开。OPEN语句可指定该文件在打开后是用于输入操作还是输出操作。

文件操作有一个文件状态字(FILE-STATUS)

一般格式:OPEN  INPUT/OUTPUT/I-O/EXTEND     FILE1.
OPEN  INPUT  CUSTOMER-FILE
      OUTPUT  PRINT-FILE.
OPEN  INPUT IN-FILE1  IN-FILE2.

INPUT:输入文件,打开的文件只能读取。
OUTPUT:输出文件,打开的文件只能写入。覆盖的形式写入。
I-O:输入输出文件,打开的文件可以读取也可以写入。
EXTEND:输出文件,打开顺序文件,只能写入,将记录插入到现有文件的末尾

        ⑦CLOSE语句:

用于关闭已打开的文件。CLOSE语句同样可以出现在程序的任何位置,不过该语句通常写于程序结尾或最后一条读写文件的语句之后。

CLOSE CUSTOMER-FILE PRINT-FILE.
CLOSE IN-FILE1.
CLOSE IN-FILE2.

        ⑧READ语句:

从外部文件读取数据存储到指定的数据项中。

用于从文件中读取数据。使用READ语句读取文件时,实际上是将文件中的数据读到由FD语句所定义的变量之中。

        READ语句每次只能读取一条。因此通常将READ语句置于一个循环结构体中,以顺次读取到文件中的每一条记录。    

        READ语句中包含有AT  END选项。该选项表示的意思是当读到文件末尾时将采取何种操作。

OPEN  INPUT  CUSTOMER-FILE.
READ  CUSTOMER-FILE
            AT  END  MOVE  'Y'  TO  EOF-FLAG
END-READ.
PERFORM  100-READ-NEXT
        UNTIL  EOF-FLAG  =  'Y'.
CLOSE  CUSTOMER-FILE.
STOP RUN.

100-READ-NEXT.
    READ  CUSTOMER-FILE
            AT  END  MOVE  'Y'  TO  EOF-FLAG
    END-READ.

        ⑨WRITE语句:

WRITE语句用于对文件进行写入。将内存数据输出到外部设备(外部文件PS、VSAM)

WRITE CUSTOMER-RECORD.

        ⑩CALL语句:

调用子程序

CALL '程序名' USING  参数1  .

        ⑪ENTRY语句

定义程序的入口开始执行,其他程序通过call entry定义入口名称进行使用。

ENTRY   '入口名'   USING   参数1 ...

其他程序通过
CALL '入口名'.    进行调用

        ⑫ STRING语句:

合并字符串,用来将多个非数值型数据项的值连接后发送到一个接收数据项中,在合并过程中可以删除某些指定的字符

下划线"_"代表一个空格。 

一般格式:
STRING	str1    DELIMITED    BY    symbol1
	    str2    DELIMITED    BY    symbol2
	INTO    strn
	WITH POINTER   position1
    ON  OVERFLOW   per语句...
    END-STRING.
77    A    PIC    X(4)    VALUE    'ABC'.
77    B    PIC    X(4)    VALUE    'JKL'.
77    C    PIC    X(4)    VALUE    'XYZ'.
77    D    PIC    X(16)    VALUE    '****************'.

DELIMITED  BY  SIZE:按发送项的长度全部传送到接收项。

例:
STRING  A,B,C  DELIMITED BY SIZE  INTO D.
结果D='ABC_JKL_XYZ_****'

DELIMITED  BY  SPACE:将发送项空格之前的字符串传送到接收项

例:
STRING  A,B,C  DELIMITED BY SPACE  INTO D.
结果D='ABCJKLXYZ*******'(末尾七个*)

DELIMITED  BY  字符常量:使用其他字符作为定界符,各个发送项可以使用不同的定界符

例:
STRING  A DELIMITED BY 'B' 
        B DELIMITED BY 'L'
        C DELIMITED BY 'M'
INTO D.
结果D='AJKXYZ_*********'(末尾九个*)

可以在传送中插入所需字符

例:
STRING  A,'*',B,'=',C  DELIMITED BY SPACE  INTO D.
结果D='ABC*JKL=XYZ*****'(末尾五个*)

POINTER:如果不想从接收项的最左端开始接收字符,可以使用POINTER短语指定从某一字符位开始接收字符

例:
MOVE  3  TO  P.
STRING  A,B,C  DELIMITED BY SPACE  
WITH  POINTER  P
INTO D.
结果D='**ABCJKLXYZ*****'(头部两个,末尾五个*)

ON  OVERFLOW:如果接收项的字符个数不足,则发生溢出,可以进行溢出处理

例:
77    D    PIC    X(10).
STRING  A,B,C  DELIMITED BY SIZE  INTO D
        ON OVERFLOW  DISPLAY  'OVER FLOW'.
结果D='ABC_JKL_XY''OVER FLOW'

注意:

        接收数据项必须是初等项。

        指针必须是一个整型的初等项。

        STRING语句结束后,接收项中未送入的字符位置上保持原有内容,而不是自动设置空格。

STRING
	FIRST-NAME    DELIMITED    BY    SPACE
	 '    '    DELIMITED    BY    SIZE
	LAST-NAME    DELIMITED    BY    SPACE
	INTO    FULL-NAME.
        //STRING 合并字符串用于合并的字符串后面都要加上DELIMITED BY 子句。
        //DELIMITED    BY 子句后面有两个选项,分别为SPACE 和SIZE
        //SPACE:找到前面用于合并的字符串中第一次出现空格的地方。
        //将该空格以前的部分进行合并,空格以后的内容包括该空格在内不参与合并操作。
        //SIZE:将前面对应的用于合并的字符串中的全部内容进行合并。

        ⑬UNSTRING语句:

拆分字符串,相当于STRING语句的逆运算。

将一个发送字符串拆成若干个接收字符串,是STRING语句的逆操作。

下划线"_"代表一个空格。

一般格式:
UNSTRING	str1    DELIMITED    BY    symbol1
	INTO    strn1 [DELIMITER IN str3] [COUNT IN str4]....
	WITH POINTER   position1
    TALLYING  IN  str8
    ON  OVERFLOW   per语句...
    NOT  ON  OVERFLOW   per语句...
    END-STRING.
77    A    PIC    X(23)    VALUE    'DATE PRODUCT QUANTITY'.
77    B    PIC    X(5).
77    C    PIC    X(8).
77    D    PIC    X(8).

DELIMITED:设置分解时的定界符。自左向右累计字符,直到遇见定界符,符号左面的内容按MOVE语句的规则传送到接收项。

例:
UNSTRING  A  DELIMITED  BY  SPACE  INTO  B,C,D.
结果:B='DATE_'、C='PRODUCT_'、D='QUANTITY'
//将字符串A分解,如果B项接收长度满了则C开始接收,如果C项接收长度满了D开始接收。

如果发送字符串被DELIMITED分解界定符,分解份数多于接收侧个数,则只取前几份接收侧个数。若分割份数少于接收侧,则不够的份数不传值。

例:
UNSTRING  A  DELIMITED  BY   'T'    INTO  B,C,D.
结果:B='DA___'、C='E_PRODUC'、D='_QUAN___'

COUNT:用于计算已经传到接收项的字符数量。

例:
UNSTRING  A  DELIMITED  BY   'T'    INTO  B  COUNT IN W. 
结果:B='DA___'、W=2

DELIMITER:是定界符存储短语,如果使用多个定界符,在传送接收项时,同事把界定符存储。

例:
77    X    PIC  X(1).
77    Y    PIC  X(1).
77    Z    PIC  X(1).
UNSTRING A DELIMITED BY 'T' OR ALL ' ' OR 'R' INTO B DELIMITER IN X
                                                   C DELIMITER IN Y 
                                                   D DELIMITER IN Z.
结果:B='DA___'、C='E_______'、D='P_______'、X='T'、Y='_'、Z='R'

POINTER指针短语,指定从发送项的某位开始发送。

例:
77    U    PIC  9(1).
MOVE  2  TO  U.
UNSTRING  A  DELIMITED  BY   'T'    INTO  B  POINTER  U.
结果:B='A____'、U=4

TALLYING接收项计数短语,用来记录实际接收项的项数。 

例:
77    N    PIC  9(1).
UNSTRING  A  DELIMITED  BY   'M'    INTO  B,C,D  TALLYING IN N.
结果:B='DATE_'、C='________'、D='________'、N=1

溢出短语OVERFLOW。

UNSTRING   FULL-NAME  	
	DELIMITED    BY    ' '
	INTO   FIRST-NAME  LAST-NAME.
//通过' '进行拆分 FULL-NAME

        ⑭INSPECT语句:

替换字符串

//1.全体字符进行替换		
INSPECT    SOURCE-STRING		
	REPLACING   ALL   'A'   BY   'B'.	
//替换后生成的新字符串覆盖以前的字符串		
		
//2.对前缀字符串进行替换		
INSPECT语句中加上"LEADING"实现		
//所谓前缀:指从字符串开头处连续出现的一串字符.		
		
//3.对首字符进行替换		
//INSPECT语句中加上"FIRST"实现		
INSPECT    TEST-STRING		
	REPLACING   FIRST   '*'   BY   'B'.	

//4.TALLYING 用来计算CCC在AAA出现的次数,结果放到BBB中
INSPECT  AAA  TALLYING  BBB  FOR  ALL CCC.

        ⑮FUNCTION语句:

字符串转换,在后加LOWER-CASE或者UPPER-CASE选项。

MOVE   FUNCTION   LOWER-CASE(SOURCE-STR)   TO    NEW-STR.	
//LOWER-CASE只是临时对其进行转换,转换后结果只在该条语句有效。		
//LOWER-CASE并不将转换结果保存到原字符串中,若要保存转换后的字符串,
//通常用MOVE语句将其保存到一个新的字符串变量中。

将字符串转换为具体数值
FUNCTION语句实现,在后加NUMVAL或者NUMVAL-C选项。
FUNCTION   NUMVAL(SOURCE-STR1) + FUNCTION   NUMVAL(SOURCE-STR2)  .
必须使用NUMVAL-C因为字符串中有$或者有分隔符逗号。
FUNCTION   NUMVAL-C(SOURCE-STR1) + FUNCTION   NUMVAL-C(SOURCE-STR2)  .
转换后数值数据的长度不能超过18个数字。

        ⑯NEXT SENTENCE语句:

调到下一个句号(.)后面的语句,而不是NEXT SENTENCE后的语句

        ⑰SET、SEARCH语句:

 SET  KEY TO  1.  //SET 对索引的赋值,把1赋值给KEY //SET KEY  UP  BY  1.  KEY自增1。
 SEARCH  AAA
     AT  END
         //语句段
     WHEN  BBB(KEY) = CCC
         //语句段
 END-SEARCH.
//SEARCH检索(线性检索)
//1.WHEN后表达式如果不满足,就使KEY自动加1,如果满足表达式情况就进行相应的语句段操作,查询操作停止。
//2.AT END 没检索到时执行的操作.

        ⑱COPY语句:

将预先写好的文本复制到源程序的源代码中。COPY语句可用在COBOL的任意地方.

类似于大机预加载会把COPY语句的文件内容加载到程序中。

1.COPY AAA500.
============================
COPY文引入的时候可以加REPLACING 参数替换代码中指定字符
2.COPY AAA500  REPLACING BBB  BY  BBA.//把AAA500文件内容BBB替换为BBA
3.COPY AAA500  REPLACING //BBB//  BY  //BBA//
                      //CCC//  BY  //CCA//
                      //DDD//  BY  //DDA//.
//把AAA500文件内容BBB替换为BBA
//把AAA500文件内容CCC替换为CCA
//把AAA500文件内容DDD替换为DDA
4.COPY AAA500 DISJOINING BBB JOINING BBA AS PREFIX .//把AAA500文件中变量名的头从BBB替换为BBA.
5.
REPLACE PREFIX IS (I).
COPY AAA500.
REPLACE PREFIX OFF.
//把AAA500文件中变量名的开头添加一个前缀I

        ⑲INITIALIZE语句:

初始化语句

将数据项的值设为初始值。字符型初始化成空格,数字型初始化为0.用于组合项时,相当于将所有的基本项都初始化。

INITIALIZE语句对FILLER的VALUE值无效,(保留VALUE值),除非指定其有效。

        ⑳GO TO语句:

无条件转移语句,用来改变程序的执行顺序,程序执行到此将无条件转移到指定的标号(段名/节名),

        由于打乱了原来程序正常的执行顺序,降低了程序的可读性,因此,严禁使用

//程序执行到此语句时,无条件的转到指定的节或者段去.
1.GO  TO  S-1.  
//I=1时,转到A段,I=2时,转到B段以此类推,当1≤I<5时会正常跳转,否则执行此语句的下一语句。
2.GO TO A,B,C,D,E DEPENGING ON I.

        (21)IF语句:

条件分支语句

        (22)EVALUATE语句:

条件分支语句

        (23)EXIT PROGRAM语句:

与STOP RUN做相同处理

        (24)EXIT语句:

提供一组过程的公共出口,或者说它指出了被调用过程的逻辑终点,一般用作PERFORM语句序列的出口。EXIT语句必须是段中唯一的语句,前面必须有段名。

        (25)STOP语句:

STOP RUN:表明程序的结束,停止语句。STOP RUN在逻辑上应该是程序的最后一个语句。STOP RUN执行后,程序停止运行,停止后不能再接着运行,如需要,可重新运行一次。主程序一般通过STOP RUN语句结束运行单元。

STOP 定数:定数,程序执行到此暂停,根据用户入力数据来执行相应的操作。(属于非互换性对应,不适用移行)

STOP    'INPUT Y/N'.  
//执行到此STOP时,将INPUT Y/N的信息弹窗显示,等待用户通过打键决定下一步执行操作。
//弹窗并显示消息

        互换性的例子。人们常用的自行车,它的零件都是按照互换性生产的。如果自行车的某个零件坏了,可以在五金商店买到相同规格的零件更换,恢复自行车的功能。这些自行车零件,在同一规格内都可以互相替换使用,它们都是具有互换性的零部件。

STOP   ABORT:程序异常终止。

STOP   ABORT.//程序异常终止。     System.exit(-1);
//和CALL  'ABORT'.//当成是一个意思理解

        (26)GOBACK语句:

返回语句。停止运行,将控制权返回给上一级。子程序必须用GOBACK,而不能用STOP,因为STOP停止的是一个RUN UNIT(运行单元).

        (27)LENGTH OF:

取得一个项目的长度

        (28)

6、COBOL基本数据类型

        ①9型:数字型

05  VAL PIC  9(06) VALUE 999999.   //表示在该位置上可以放入一个0-9之间的数字 ,称数字型

        ②S9型:符号+数字型---->详见附录1:最后一位+符号变化。

03  TS   PIC S9(04).  //如果想在数据项中放入一个带符号的数,可以用该描述符。
//系统在内存中该数据项的最后一个字节中,放入一个标记,表示此数为负或正。

        ③S9V9:小数型

05  WK  PIC S9(02)V99.  //“V”描述符:支持在数值型数据结构中隐含的小数点位置
                        //数据显示为99.99,实际输出时没有点,实际占4位

        ④编辑型:编辑型 

用来描述在程序中只是作为输出数据时增加或改变某些所需的符号,起编辑作用。不能用于计算。

03  KIN  PIC 99.99.
03  WT  PIC ZZ9.9.        //Z代表空格
03  WT1  PIC ***,***.
03  WT2  PIC 99B99B99.    //B代表空格
03  WT3  PIC 9(4)CR.      //整数不显示CR,负数才显示CR
03  WT4  PIC 9(4)DB.      //整数不显示DB,负数才显示DB
03  WT5  PIC $99999.
03  WT6  PIC -999.
03  WT7  PIC +9(5).
03  WT8  PIC 9999099099.  //直接插入 0表示插入字符0

        ⑤COMP:定点二进制数

        COMP-1:浮动小数点

        COMP-2:内部长浮点型

        COMP-3:压缩十进制数

        COMP-4:压缩十进制数

        COMP-5:压缩十进制数

01  WK1  PIC S9(04) COMP.   //实际占两位
01  WK2    USAGE COMP-2.
01  WK3  PIC S9(11) COMP-3.  //实际占6位
01  WK4  PIC S9(009)  COMP-4.

        ⑥BINARY:二进制数

01  WK  PIC S9(09) BINARY.

        ⑦BIT型:比特型:以一个比特位为存储单位。只能存放0和1这两种值。

03  WK.             
  05  WK1    PIC   1(001)  BIT  OCCURS  8.  //定义一个数组,每一项是一比特,共有8比特。
             //COBOL语言中的表(TABLE)类似于其他高级语言中的数组(ARRAY)
             //1. OCCURS子句不能出现在77层,因为77层是独立的数据项。
             //2.OCCURS子句不能用于01层。
             //3.只有当OCCURS所说明的数据是初等项时,才能在该数据项的描述中使用PIC子句。
             //4.不能用VALUE子句对表赋初值,不能同时用OCCURS子句和VALUE子句来描述同一数据项。

        ⑧X型:字符型数据(半角)非数值型,不能用于计算

01  WK   PIC  X.  //字符型数据由任意的COBOL字符组成的数据。

        ⑨N型:汉字型(全角)  J型(同N型)

02  WK  PIC  N(004) VALUE IS NC'新規作成' .  //一个汉字占两个字节

        ⑩G型:汉字型(全角)

07  FILLER   PIC  G(18) USAGE DISPLAY-1.

        ⑪A型:字母型

07  WK     PIC  A.   //这种类型的数据项中只能放字母或空格

        ⑫常量:非数值常量

象征常量			            象征常量的内容		
ZERO(ZEROS,ZEROES)		    一个或多个数字0或者字符"0"		
SPACE(SPACES)			    一个或多个空白或空格		
HIGH-VALUE(HIGH-VALUES)	    将对应的二进制码全部置为1		
LOW-VALUE(LOW-VALUES)		将对应的二进制码全部置为0		
QUOTE(QUOTES)			    引号 (")		
ALL			                相应字符连接而成的字符串		
01    TEST-DATA    PIC  X(10).				
MOVE   SPACES   TO  TEST-DATA.			//TEST-DATA为10个连续的空格
MOVE   ALL   'ABC'   TO   TEST-DATA.	//TEST-DATA为'ABCABCABCA'
MOVE   LOW-VALUES   TO   TEST-DATA.		//TEST-DATA为10个连续的0

        ⑬EXTERNAL:引用相同的数据区域。内存共享。变量共享等等

        ⑭VALUE:给变量赋初值。

        ⑮OCCURS:数组,动态游标DEPENDING ON

        ⑯INDEXED:OCCURS语句中INDEXED有的场合,指定数组的下标。 

02  KT1  OCCURS  1  INDEXED  K1  PIC 9(14).
SET      K1    TO    1.																																							
SEARCH   KT1  VARYING   K1  AT  END  GO   TO   K2																																							
WHEN  KT1  (K1)  =  F4 (V)																																							
MOVE  ZEROS   TO  F1																																							
GO    TO    F2.

        ⑰COLUMN:指定输出位置。COLUMN NUMBER短语 表示此项目是打印项目,并指定打印行上的打印位置。

02  M1   PIC 9(04)  COLUMN  114.

        ⑱REDEFINES:用于对同一块内存区域进行重定义。通过REDEFINES语句可以定义多个指向同一内存区域的变量。

WORKING-STORAGE SECTION.
01  TEST-AREA.
     05  TEST-A        PIC X(4).
     05  TEST-B    REDEFINES    TEST-A.
     05  TEST-C    REDEFINES    TEST-A.
PROCEDURE DIVISION.
    MOVE 'TEST' TO TEST-A.
    DISPLAY TEST-A.
    DISPLAY TEST-B.
    DISPLAY TEST-C.
        STOP RUN.

上面程序输出结果:

TEST
TEST
TEST

注意:REDEFINES语句不能用于对66层,88层数据进行重定义。同时,不能对文件节中的01层数据重定义。不过,对于工作存储节中的01层数据则是可以重定义的。

REDEFINES命令:同层变量共用一个内存空间。

当REDEFINES的变量长度不一致时,开辟的共同存储区域的大小和大size一致。

        ⑲16进制文字常量:H"hh"                X"30"

        16进制汉字常量:K"hh"

        汉字区点常量:J"hh"

        ⑳SIGN 指定符号位置的表现形式:

                LEADING:指定符号位在左边显示。
                TRAILING:指定符号位在右边显示。

03  K1     PICTURE IS S9(007)	
           USAGE   IS  DISPLAY
           SIGN    IS  LEADING SEPARATE.  //DISPLAY 显示符号位,并且占1byte

        (21)BLANK WHEN ZERO:项目值为零时,清空为空白。

03  P1  PIC       ZZZ.Z  BLANK  WHEN  ZERO.	
03  P2  PIC       999.9  BLANK  WHEN  ZERO.	
03  P3  PIC       -9(5)  BLANK  WHEN  ZERO.	

补充:COBOL语言总结(二)

7、COBOL基本运算

        7.1.算数运算

                ①算数加运算ADD

1.NUM2=NUM1+NUM2      NUM1值不变,NUM2值被覆盖。
	ADD   NUM1   TO   NUM2				
		ON   SIZE   ERROR			
		DISPLAY   'OVER   FLOW!'			
	END-ADD				
					
2.可以多个数值相加、NUM3=NUM1+NUM2+NUM3      NUM1值不变, NUM2值不变,NUM3值被覆盖。						
	ADD   NUM1   NUM2   TO   NUM3				
		ON   SIZE   ERROR			
		DISPLAY   'OVER   FLOW!'			
	END-ADD				
				
3.ADD使用GIVING子句,不覆盖原值。省略END-ADD					
	ADD   NUM1   NUM2   TO   NUM3				
		GIVING   TOTAL.			
TOTAL=NUM1+NUM2+NUM3      NUM1值不变, NUM2值不变,NUM3值不变。					

                ②算数减运算SUBTRACT

1.NUM3=NUM3-NUM1-NUM2     NUM1值不变, NUM2值不变,NUM3值被覆盖。
SUBTRACT   NUM1   NUM2   FROM   NUM3.					
END-SUBTRACT	
				
2.RESULT=NUM3-NUM2-NUM1      NUM1值不变, NUM2值不变,NUM3值不变。ROUNDED四舍五入。				
	SUBTRACT  NUM1   NUM2   FROM   NUM3				
		GIVING   RESULT			
		ROUNDED.			

                ③算数乘运算MULTIPLY

MULTIPLY与*  都表示算数乘运算。	
1.NUM2 =	NUM2 * NUM1	
	MULTIPLY   NUM1   BY   NUM2		
		ON   SIZE   ERROR	
		DISPLAY   'OVER   FLOW'	
	END-MULTIPLY.		

                ④算数除运算DIVIDE   

DIVIDE与/  都表示算数除运算。	
1.NUM2=NUM2 /NUM1
	DIVIDE   NUM1   INTO   NUM2	
	END-DIVIDE.	

                ⑤乘方运算**

COMPUTE(计算)  主要是通过算数表达式进行算数运算的。乘方的运算符 **

COMPUTE   RESULT  =  NUM1  **  NUM2	
	ON   SIZE   ERROR
	DISPLAY   'OVER   FLOW'
END-COMPUTE	

                ⑥复合运算 括号运算

                ⑦统计运算

计算总和:COMPUTE   sum-name=  FUCTION  SUM(name1   name2   name3  ...)
计算中位数:COMPUTE   middle-name=  FUCTION  MEDIAN(name1   name2   name3  ...)
计算平均数:COMPUTE   average-name=  FUCTION  MEAN(name1   name2   name3  ...)

                ⑧四舍五入运算  ROUNDED

ROUNDED选项对运算结果进行四舍五入是对运算结果中第一位小数进行舍入操作的。

不加ROUNDED,默认计算结果取整的话,结果会被截断。例57.9--->57 

加上ROUNDED,对57.9进行四舍五入处理-->58

                ⑨运算结果溢出报错ON  SIZE  ERROR

运算结果溢出:当结果数据长度超过保存结果数据的变量所定义的长度时。当运算结果溢出时,可以使用ON  SIZE  ERROR选项进行报错

                ⑩REMAINDER语句:用于除法语句(DIVIDE)求余数

        7.2.关系运算

                关系运算主要是对两个操作数间大小的关系进行比较。(=、>、<、>=、<=、NOT=、NOT>、NOT<)

        7.3.逻辑运算

                AND、OR、NOT

8、COBOL处理VSAM文件

                VSAM即虚拟存储访问方式的意思。使用VSAM组织数据,管理数据信息的文件称为VSAM文件。

                VSAM文件对于数据的存储及管理具有很强的灵活性及高效性,因此常用来组织和存放数据。

                COBOL程序对于文件的访问,很大程度上是对VSAM文件的访问。

                VSAM文件的分类及作用?

                LDS:线性数据集

                ESDS:进入顺序数据集

                RRDS:相对记录数据集

                KSDS:索引顺序数据集,最常用

                VRRDS:变长相对记录数据集

                COBOL只是实现对VSAM文件的的读写操作。至于VSAM文件的创建,复制,删除等操作是通过JCL中的IDCAMS实用程序实现的。

SELECT  KS-FILE  ASSIGN  TO  VKSDS
        ORGANIZATION  IS  INDEXED
        ACCESS  MODE  IS  DYNAMIC
        RECORD  KEY  IS  TEST-KEY
        FILE  STATUS  IS  TEST-STAT.
....
FD  KS-FILE
    LABEL  RECORD  IS  STANDARD
    DATA  RECORD  IS  KSRCD.
    COPY KSRCD.

说明:
    该VSAM文件在系统中的名称为VKSDS,在本程序中的名称为KS-FILE。对于
在环境部中对KS-FILE文件所指定的各项参数分别介绍如下。
ORGANIZATION:用于指定VSAM文件的逻辑结构。通常可以为SEQUENTIAL
或INDEXED,默认时为SEQUENTIAL。
ACCESS MODE:用于指定对该VSAM文件的访问模式。通常可以为SEQUENTIAL
RANDOM或DYNAMIC。其中SEQUENTIAL对应顺序访问方式,RANDOM对应直接
访问方式,DYNAMIC即可为顺序访问方式,又可为直接访问方式。
RECORD KEY:用于指定Key在程序中的名称
FILE STATUS:用于反映VSAM文件被读取或写入的状态。
通过LABEL RECORD   IS STANDARD指明该VSAM文件是否含有标号(label).
通过DATA RECORDS   IS U01-DATA.定义该VSAM文件中逻辑记录在程序中的名称。
通过COPY将逻辑记录复制到程序工作区域中。

WRITE命令或REWRITE命令对数据进行写入或改写。		
WRITE命令用于OUTPUT或I-O模式打开的VSAM文件。		
REWRITE命令只能用于以I-O模式打开的VSAM文件。		
		
DELETE命令:删除VSAM文件中记录的相应代码。		
DELETE  KS-FILE01  RECORD		
	INVALID  KEY N DISPLAY  'DELETE  FAILED'.	
VSAM文件为索引文件时,KSDS  在COBOL中还可提供指针定位的功能。代码如下:		
START  KS-FILE02  KEY < TEST-VALUE		
	INVALID KEY	
	DISPLAY 'NO SUCH RECORD'.	

后续补充

9、COBOL JCL扩展

COBOL语言总结(三)--JCL扩展

10、COBOL CICS扩展

后续补充

附录1:S9型最后一位的数字变换(EBCDIC--SJS--文字)

EBCDIC 			SHIFT_JIS		文字	
D0			        -0			P	
D1			        -1			Q	
D2			        -2			R	
D3			        -3			S	
D4			        -4			T	
D5			        -5			U	
D6			        -6			V	
D7			        -7			W	
D8			        -8			X	
D9			        -9			Y	
C0			         0			@	
C1			         1			A	
C2			         2			B	
C3			         3			C	
C4			         4			D	
C5			         5			E	
C6			         6			F	
C7			         7			G	
C8			         8			H	
C9			         9			I

eg:

变量/文件定义
01 WK-GP.												
  05 PLAYER-ID          PIC X(5).												
  05 NAME               PIC X(10).												
  05 BIRTHDATE          PIC X(8).												
  05 BIRTHDATE-REDEF REDEFINES BIRTHDATE.												
     10  YYYY           PIC 9(4).												
     10  MM             PIC 9(2).												
     10  DD             PIC 9(2).												
  05 ACHIEVEMENT.												
     10  SCORE OCCURS 3 PIC 9(2)V9(2) COMP-3.												

使用例子
合计
01 WK-GP.												
  05 FILLER          PIC X(23).												
  05 ACHIEVEMENT.												
     10  SCORE OCCURS 3 PIC 9(2)V9(2) COMP-3.												

输出人员名单
01 WK-GP.								
  05 FILLER          PIC X(5).								
  05 NAME            PIC X(10).								
  05 FILLER          PIC X(17).								

 

 对于自动化移行,最重要的是要保留和既存一样的存储长度。
如图所示,如果在X类型的数据中不包含全角字符,则不存在位数问题。
如果存在全角字符,则为了不使数据被截位,则需要对数据进行扩位。
但是根据包含全角字符个数不同扩位长度也不同。
如果一个SAM文件中,该列全角字符个数不同,则会出现扩位后数据多出空格的情况。(黄色格子)
多出的空格会否对后续代码产生影响也需要判断。(如画面显示,账票,DB位数等)
而数据中是否含有全角字符是从代码看不出来的。需要根据实际业务逐个分析。
所以这种情况在移行项目中的风险是完全无法控制的。
※上面的例子中没有考虑制御字符的影响

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

  • 46
    点赞
  • 314
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
COBOL语言是一种面向过程的高级程序设计语言,主要用于数据处理,是目前国际上应用最广泛的一种高级语言。它采用300多个英语单词作为保留字,以一种接近于英语书面语言的形式来描述数据特性和数据处理过程,因而便于理解和学习。COBOL语言是专门为企业管理而设计的高级语言,可用于统计报表、财务会计、计划编制、作业调度、情报检索和人事管理等方面。如果你想学习COBOL语言编程,我推荐你可以阅读以下两本书籍:《Beginning COBOL for Programmers》和《COBOL Programmers Swing with Java》。《Beginning COBOL for Programmers》适合新手,提供了一个简洁易懂的入门指南,涵盖了COBOL的基础知识,包括语法、数据处理和文件处理等方面。而《COBOL Programmers Swing with Java》介绍了如何使用COBOL和Java进行编程,结合了两种语言的特点,帮助读者掌握复杂系统的开发技巧。这两本书可以帮助你入门COBOL语言编程。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* [COBOL语言介绍并推荐入门书籍(10本)](https://blog.csdn.net/q6115759/article/details/131449208)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Cobol语言基础](https://blog.csdn.net/zsq_z0304/article/details/110118666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神lwz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值