Cobol+
上传用户:hblyhb
上传日期:2017-11-18
资源大小:2074k
文件大小:14k
- Cobol基础学习报告
- Cobol简介
- Cobol是Common Business-Oriented Language(公用面向商业的语言)的缩写。依据美国国家标准协会(ANSI)与1974年规定的标准,cobol包括内核(Nucleus)和下列11大功能处理模块
- ? Table Handling(表格处理)
- ? Sequential I/O(顺序I/O)
- ? Relative I/O(相对I/O)
- ? Indexed I/O(索引I/O)
- ? Sort-Merge(排序/合并)
- ? Report Writer(报表写入)
- ? Segmentation(分段)
- ? Library(库)
- ? Debug(调试)
- ? Inter-Program Communication(程序间通信)
- ? Communication(通信)
- COBOL格式
- 1。标识部(IDENTIFICATION DIVISION):用于标识程序名。
- 2。环境部(ENVIRONMENT DIVISION):用于说明程序运行的环境。
- 3。数据部(DATA DIVISION):用于说明程序中涉及的所有数据。
- 4。过程部(PROCEDURE DIVISION):是程序的核心部分,它决定计算机应进行什么操作。
-
- Cobol书写格式如下:
- 第1 至 6 列为 “标号区”;
- 第7列为“续行标志区”;
- 第8至此11列,称为“A区”。程序中有些内容如部头,节头,段头,层号 01,层号 77 及文件描述符FD等应从A区开始写;
- 第12至此72列,称为“B区”。写程序中的正文部分。如过程部中的句子只能从B区开始写;
- 第73至80列,称为“注释区”。
- Cobol程序四大部详细说明
- 标识部(IDENTIFICATION DIVISION):标识部是cobol程序的开始,是必要元素,表示程序及其他有关信息。
- 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。 输入输出控制描述体]]
- 数据部(DATA DIVISION):用于说明程序中涉及的所有数据。
- Cobol要求程序数据部中的定义所有程序引用的数据,如文件记录,变量,表格和报表。数据项的定义包括名称,特征与其他数据项的关系。
- 数据部的节:数据部包含程序使用的所有局部数据的定义(数据描述)。COBOL将数据分成节,针对COBOL程序使用的每种数据,每个节前面有节标题。每个节都是可选的,但程序使用的所有数据部都应在数据部的某个节中定义。
- 文件节(FILE SECTION):文件节中有程序使用的每个文件的项目,包括打印文件和海量存储(磁盘和磁带)文件。每个文件描述中包括文件所含记录的定义。
- 工作存储节(WORKING-STORAGE SECTION):这个节包含程序所需的临时结果和初始化静态数据的数据。
- 连接节(LINKAGE SECTION):这节只用于子程序。连接节包含调用程序传递的数据(即参数)。
- 通信节(COMMUNICATION SECTION):通信节描述作为程序间接口的数据和信息控制系统,用以实现与通信设备相关的消息分析的COBOL方法。
- 报表节(REPROT SECTION):报表节描述实现COBOL报告编写工具的系统所需的数据。
- COBOL的数据类型称为数据类别(category).五个数据类别是numeric,numeric-edited,alphabetic,alphanumeric和alphamumeric-edited.
- COBOL的数据组成层次结构:可以将基本项目组成层次结构,称为组数据项或组。组可以分为子组,最终分成基本项目不能再划分。COBOL程序中数据项的定义从层号开始,这是个整数,将项目放进组中。01层是最高层。49层是描绘数据的最低层。77层项目用于某个组的数据项。如程序中的临时变量。66层和88层是特殊层。
- 过程部(PROCEDURE DIVISION):COBOL程序前三个部定义程序使用的数据和环境,而过程部则包含对数据进行操作的程序逻辑。下面是过程部中常用的基本的过程语句:
- 输入输出语句
- 1。ACCEPT语句:直接从终端键盘或系统指定的输入设备上输入数据。
- ACCEPT 标识符 [FROM 助忆名]
- 注:
- A。标识符(identifier)指的是能唯一地标识一个数据项的数据名,不能唯一地标识一个数据项的数据名不是标识符。标识符可以是组合项。
- B。在ACCEPT语句中如不写FROM部分,如ACCEPT A ,则表示从系统隐含指定的设备上读入一个数据给A。 如果不想从指定的设 备上输入,则要用FROM 选项, 这时“助忆名”需要在环境部中事先说明和那种外部设备相联系。
- 2。DISPLAY语句:从计算机内存中输出到某一指定的输出设备上。
- DISPLAY { 标识符1,常量1}[标识符2,常量2]。。。[UPON 助忆名]
- 3。READ语句:COBOL语言中数据的输入输出主要是通过对外部文件的读写进行的。READ 语句就是从外部文件上读入数据输出到程序中的数据项中。在程序中用到的所有文件都需要在环境部中指定程序中用到的文件名与实际外部文件的联系。数据部也要对文件加以描述。指定数据结构各数据项所占的内存单元长度以及数据形式。
- COBOL 的存取是以文件为对象以记录为单位的
- 。WRITE语句:将内存中的数据输出到外部设备,主要是由WRITE 语句来完成的。WRITE语句的最简单的格式为:
- WRITE 记录名
- (注意WRITE语句的操作对象是记录,所以是‘记录名’而不是‘文件名’)
- 5。OPEN语句:程序中如果需要读写文件,则该文件必须先用OPEN语句打开,系统在执行READ,WRITE以前先检查该文件是否已在规定的外部设备上准备就绪。
- OPEN语句的一般格式为:
- INPUT 文件名1 [,文件名2]。。。
- OPEN OUTPUT 文件名3 [,文件名4]。。。 。。。
- 6。CLOSE语句:当对一个文件的读或写的操作已完成,就应关闭该文件。
- CLOSE语句的一般格式为:
- CLOSE 文件名 1 [,文件名2]。。。
- 算数运算语句有ADD语句,SUBTRACT语句,MUTIPLY语句,DIVIDE语句。
- 传送语句:move语句,转移语句:GO TO 语句,条件语句:IF语句,停止语句:STOP语句
- COBOL简单程序编译:
- 000001 IDENTIFICATION DIVISION.
- 000002 PROGRAM-ID. LPTEST.
- 000003 AUTHOR. LIPING.
- 000004 ENVIRONMENT DIVISION.
- 000005 DATA DIVISION.
- 000006 PROCEDURE DIVISION.
- 000007 000-MAIN.
- 000008 DISPLAY "HELLO WORLD!".
- 000009 STOP RUN.
- 上面是一个简单的显示HELLO WORLD的COBOL程序。COBOL程序需要用下面的JCL语句来编译。
-
- 000100 //ST071P JOB ACCT#,
- 000200 // ST071,
- 000300 // NOTIFY=ST071
- 000400 //STEP1 EXEC PROC=IGYWCLG
- 000500 //COBOL.SYSIN DD DSN=ST071.COBOL.HELLO,DISP=SHR
- ACCEPT
- 从键盘或其他输入设备读取数据。
- ACCEPT A FROM DEV. 从DEV读取数据到A,也可以省略FROM DEV,表示从键盘读取。
- ACCEPT A FROM DATE/DAY/DAY-OF-WEEK/TIME.读取日期,表示为6个字符,如990909(1999年9月9日)。
- 读取当前日期在年度(前2位)中为第几天(后3位),表示为6个字符,如1994年4月1日表示为94091。
- 读取当前星期几,表示为1位字符。1表示星期一,7表示星期日。
- 读取当前时间,表示为8位字符。精确到毫秒。如下午2:41表示为14410000。
- DISPLAY
- 将数据写入输出设备。如监视器(monite),系统输出流和操作员控制台(console)。
- DISPLAY AAAAA BBBBB [UPON DEV] [WITH NO ADVANCING]
- 如果使用UPON选项,dev要与special-names段中的硬件名相关联。
- 如果使用no advancing选项,则输出最后一个字符后输出设备仍然保持原位,使下一条display语句还在该位置显示。否则可能到下一行显示。
- INITIALIZE
- 初始化数据,数字和数字编辑数据项初始化为0,其他初始化为空格。
- INSPECT TALLYING
- 计算项目中该字符串出现的次数。
- INSPECT AA TALLYING BB FOR ALL “EE”. 从AA中查找有多少个EE,将个数写入BB。
- INSPECT AA TALLYING BB FOR CHARACTERS BEFORE “E”. 从AA中查找E前面有多少个字符,将个数写入BB。
- INSPECT AA TALLYING BB FOR CHARACTERS AFTER “C” BEFORE “E”. 从AA中查找C后面E前面有多少个字符,将个数写入BB。
- INSPECT AA TALLYING BB FOR LEADING “E”. 从AA中第一个字符开始查找有多少个E,如果没有就结束操作,有就将个数写入BB,直至没有。
- INSPECT AA TALLYING BB FOR LEADING “E” AFTER “C”. 从AA中C后面开始查找有多少个E,如果没有就结束操作,有就将个数写入BB,直至没有。
- 组合例子:
- 77 CS PIC X(9) VALUE "REELWHEEL".
- 77 COUNT-0.
- 77 COUNT-1.
- 77 COUNT-2.
- MOVE 0 TO COUNT-0,COUNT-1,COUNT-2.
- INSPECT CS TALLYING
- COUNT-0 FOR ALL "E",
- COUNT-1 FOR LEADING "W" AFTER "L",
- COUNT-2 FOR CHARACTERS.
- 程序首先判断的是字符"R",执行COUNT-0 FOR ALL "E",因为第一个字符不是"E",所以程序转而执行COUNT-1 FOR LEADING "W" AFTER "L",也不符合要求,
- 于是程序执行COUNT-2 FOR CHARACTERS,COUNT-2 =1。然后字符串往下一位,判断"E",执行COUNT-0 FOR ALL "E",符合要求,则COUNT-0=1。
- 有了满足条件的判断,则余下的判断不再执行,字符串再往下一位,判断"E",则COUNT-0=2。接着判断"L",则COUNT-2 =2。以此类推,最后结果为COUNT-0=4,
- COUNT-1=1,COUNT-2=4。
- INSPECT REPLACING
- 用另一个字符串替换这个字符串。
- 还用上面的例子。
- INSPECT CS REPLACING ALL "E" BY "Y". 结果"RYYLWHYYL"
- INSPECT CS REPLACING CHARACTERS BY "Z" AFTER "L". 结果"REELZZZZZ"
- INSPECT CS REPLACING LEADING "E" BY "Y". 结果不变
- INSPECT CS REPLACING LEADING "E" BY "Z" AFTER "H". 结果"REELWHZZL"
- INSPECT CS REPLACING FIRST "E" BY "I". 结果"RIELWHEEL"
- INSPECT CS REPLACING FIRST "EE" BY "00",ALL "WH" BY "TH",CHARACTERS BY SPACE. 结果" 00 TH "
- INSPECT CONVERTING
- 就是INSPECT REPLACING的缩写。
- INSPECT CS CONVERTING "EE" TO "00". 也可以加上BEFORE,AFTER。
- STRING
- 将几个字符串合并成一个字符串。
- STRING A DELIMITED BY SPACE," !" DELIMITED BY SIZE INTO C.假设A中的内容是"HELLO",则结果是"HELLO !".
- DELIMITED BY SPACE意思是碰到空格,或到A的结尾或C的结尾,则合并A字符串结束。
- DELIMITED BY SIZE意思是到" !"的结尾或C的结尾,则合并" !"字符串结束。
- STRING A INTO B POINTER C ON OVERFLOW PROC1 NOT ON OVERFLOW PROC2.
- 将A字符串复制到B中由C开始的地址处。如果C小于1或大于B的长度,或A的长度大于B中C到结尾处的长度,则发生
- OVERFLOW溢出,执行PROC1。
- UNSTRING
- 将一个字符串中的字符按照要求放入多个变量中。
- UNSTRING AAA [DELIMITED BY [ALL] B [OR [ALL] C] ...] INTO { C [DELIMITER IN D] [COUNT IN E] } ...[WITH POINTER F] [TALLYING IN G] [ON OVERFLOW PROC1] [NOT ON OVERFLOW PROC2] [END-UNSTRING]
- 将AAA中的字符放入C,如果还有其他变量,如C2,则等C放满后放入C2。
- DELIMITED BY和STRING中的作用一样。表示将AAA中到B为止的字符取出。如果有OR,则表示到B或C字符为止的字符取出。如果有ALL,则如果几个相同的B在一起,则认为是一个B。
- DELIMITER IN 将B放入D,知道是哪个字符为分隔符。
- COUNT IN 实际复制到C中的字符数放入E中。
- WITH POINTER 和STRIGN中一样。
- TALLYING IN 计算有几个接受项。访问一个新的接受项,G值加1。
- 例子:
- 03 CITY PIC X(10).
- O3 ZIP PIC X(10).
- 77 TEST PIC X(20).
- MOVE "NEW YORK,NY 10017" TO TEST.
- UNSTRING TEST DELIMITED BY "," INTO CITY,ZIP.
- 执行结果CITY值是NEW YORK.ZIP的值是NY 10017。
- 逻辑和控制语句
- IF (A [NOT] > B) 等价于 IF (A [NOT] GREATER THAN B)
- IF (A [NOT] < B) 等价于 IF (A [NOT] LESS THAN B)
- IF (A [NOT] = B) 等价于 IF (A [NOT] EQUAL TO B)
- IF (A >= B) 等价于 IF (A GREATER THAN OR EQUAL TO B)
- IF (A <= B) 等价于 IF (A LESS THAN OR EQUAL TO B)
- IF A IS [NOT] NUMERIC 数字和可选符号
- IF A IS [NOT] ALPHABETIC A~Z,a~z字符和空格
- IF A IS [NOT] ALPHABETIC-LOWER a~z字符和空格
- IF A IS [NOT] ALPHABETIC-UPPER A~Z字符和空格
- IF A IS [NOT] CLASS-NAME SPECIAL-NAMES定义的字符集
- 例如:SPECIAL-NAMES.
- CLASS MYDEFINE IS "12345+ABCDE-".
- 判断变量是否定义了数值。这个变量是88层的,且要与一个数据项关联。
- 03 STATE PIC XX.
- 88 CON VALUES ARE "A","B","C".
- IF CON ...
- 判断厂家定义运行开关的开/关状态。
- SPECIAL-NAMES.
- SWITCH-A ON STATUS IS A-ON ,OFF STATUS IS A-OFF.
- IF A-ON...
- 若开关在开位置,则IF A-ON返回TRUE。
- IF A IS [NOT] POSITIVE 判断是否大于0
- IF A IS [NOT] NEGATIVE 判断是否小于0
- IF A IS [NOT] ZERO 判断是否等于0
- COBOL支持NOT ,AND ,OR 操作。
- PERFORM
- 过程调用,但是不传递参数。
- PERFORM PROC1 [THROUGH PROC2]
- 执行完PROC1再执行PROC2.没有THROUGH(THRU)就只执行PROC1.
- PERFORM PROC1 [THRU PROC2] N TIMES
- 执行PROC1[或者还有PROC2]N次。
- PERFORM PROC1 [THRU PROC2] [WITH TEST BEFORE/AFTER] UNTIL A NOT EUQAL 0.
- 执行PROC1[或者还有PROC2]直到A不等于0。WITH TEST BEFORE/AFTER指定在第一次执行之前还是之后判断条件。默认是BEFORE,执行之前判断。
- PERFORM PROC1 [THRU PROC2] [WITH TEST BEFORE/AFTER] VARYING A FROM B BY C UNTIL CONDITION1 [AFTER D FROM E BY F UNTIL CONDITION2].
- 相当于FOR循环,将A的值从B开始,以C为单位递增,直到满足CONDITION1。AFTER语句是一个嵌套的FOR 循环。VARYING是外循环,AFTER是内循环。A,B可以是索引。
- 过程也可以直接写入PERFORM中。但是THROUGH就不好用了。语法如下 :
- PERFORM 过程语句 END-PERFORM.
- PERFORM N TIMES 过程语句 END-PERFORM.
- PERFORM [WITH TEST BEFORE/AFTER] UNTIL CONDITION 过程语句 END-PERFORM.
- PERFORM [WITH TEST BEFORE/AFTER] VARYING A FROM B BY C UNTIL CONDITION1 过程语句 END-PERFORM.
- IF语句
- IF CONDITION THEN STATEMENTS1/NEXT SENTENCE ELSE STATEMENTS2 END-IF/NEXT SENTENCE/ENDIF
- NEXT SENTENCE将跳出IF操作语句执行下一条语句。
- IF语句中不要使用.句号。.句号将结束所有IF语句。要结束一个嵌套的IF语句,可以使用END-IF或者NEXT SENTENCE.如
- IF A IF B END-IF ELSE C END-IF.或者
- IF A IF B ELSE NEXT SENTENCE ELSE C END-IF.
- EVALUATE
- 相当于SWITCH CASE语句。
- EVALUATE A
- WHEN B ...
- WHEN 0 THRU 100 ...(FROM 0 TO 100)
- WHEN OTHER ...
- [END-EVALUATE]
- 首先得到A的结果,和WHEN语句的参数比较,如果和B相等,就执行B后的操作,执行完了不再执行后面的WHEN语句。如果不等就执行下一条WHEN语句。如果没有相等的就执行WHEN OTHER语句。
- EVALUATE A ALSO B
- WHEN C ALSO D ...
- WHEN E ALSO F ...
- WHEN OTHER ...
- 对于有多个判断条件的,要多个条件同时满足。如上要C=A同时D=B,才执行WHEN语句。
- CONTINUE
- 继续执行下面的程序。
- GO TO
- GO TO PROC1 [DEPENDING ON N] DEPENDING ON N将跳转到清单中的第N个PROC.
- EXIT
- 一般为最后一句话。
- STOP
- STOP RUN 结束程序。
- ALTER
- ALTER PROC1 TO PROC2. 不懂什么意思,反正已经从标准中废除了这个语句。
- ENTER
- 使其他编程语言中的语句可以放进当前源程序中。
- ENTER LANGUAGE-NAME [ROUTINE-NAME]
- LANGUAGE 是厂家指定可以输入COBOL的任何语言,这个语句后面是其他编程语言的语句,然后要用ENTERCOBOL表示返回COBOL语言。
- 如果无法将其他语言的程序直接放入,可以用ROUTINE-NAME引用其他语言编写的程序。