COBOL学习(2)
Cobol for Z900 语言程序设计
分享请说明来源:http://www.cnblogs.com/7explore-share
INDEX
4)数据部层次和记录的概念,层号的用法(几个特殊层号),标识符
5)PIC子句,数据描述符“9” “V” “S”,编辑型描述符“.” “ ,” “B” “Z” “ +” “ –” “ $”及浮动插入正负号和‘$’的用法。
6)数据部较高技巧: SIGN子句, REDEFINES子句, RENAMES子句, JUSTIFIED子句
8) 子程序调用,GLOBAL 与EXTERNAL 的作用及区别,编译链接主程序及子程序的方法
9)表的定义方法 ,表的引用方法,SET语句,下标和位标的区别,表的检索,给表赋值的方法
1. 标识部(IDENTIFICATION DIVISION):用于标识程序名 (一般不超过8位)。
2. 环境部(ENVIRONMENT DIVISION):用于说明程序运行的环境。
3. 数据部(DATA DIVISION):用于说明程序中涉及的所有数据。
4. 过程部(PROCEDURE DIVISION):是程序的核心部分,它决定计算机应进行什么操作。
1.相当于其他语言的变量
eg.
X (内存单元名) MOVE 2 TO X
2.数据名的定名规则
(1)每个数据名的长度为1-30个字符之间。
(2)只能由字母̖数字和连接符“-”组成,而且其中至少应有一个字母。连接符只能出现在数据名的中间。
(3)数据名中不能出现空格。
(4)不应选择COBOL的保留字作为数据名。
(5)并不要求数据名是有意义的英文字。
输入输出节分为输入输出控制段与文件控制段。
输入输出控制段作用是可以指定目标程序运行时,几个文件共用 一个内存区。文件控制段是为内部文件分配外部文 件。
文件控制段 格式:
INPUT-OUTPUT SECTION. (输入输出节)
FILE-CONTROL. (文件控制段)
SELECT 内部文件名ASSIGN TO 外部文件名.
说明:SELECT的三种用法
(1)在SELECT子句的“ASSIGN TO”的后面写上磁盘上实际的文件名。 Select file1 assign to c:cob.file1.dat
(2)在SELECT子句中只指出外部设备名,在数据部的文件节中 FD描述体中用VALUE OF子句来指出实际文件名。
Select file1 assign to disk. value of file-id “c:cob.file1.dat”.( 数据部的文件节中)
(3)在大型计算机系统,在SELECT子句中用该系统指定的逻辑名作为外部文件名,然后用作业控制语句将该逻辑名与实际的设备和文件相联系。
4)数据部层次和记录的概念,层号的用法(几个特殊层号),标识符
COBOL 所处理的数据的特点
层次的概念:数据间存在的从属关系。
记录的概念:具有一定层次关系的一组数据项的最大集合,它是内存中具有独立逻辑含义的最大存取项,具有最高层次。
文件的概念:多个记录可以组成一个文件。
(1)数据的层次结构:记录 -> 组合项 -> 初等项
(2)层次的规定如下:
l 用来描述数据层次结构的层号从01开始,到49。记录的最高层次定为01号。
l 层号小的组合项包含层号大的数据项(组合项或初等项)。
l 层号不必要求连续
特殊层号:
Level Number |
Description |
01 |
Record description entry |
02 to 49 |
Group and Elementary items |
66 |
Rename Clause items |
77 |
Items which cannot be sub-divided |
88 |
Condition name entry |
有效数据名The following example shows valid and invalid data names:
Valid:
WS-NAME
TOTAL-STUDENTS
A100
100B
Invalid:
MOVE (Reserved Words)
COMPUTE (Reserved Words)
100 (No Alphabet)
100+B (+ is not allowed)
- Elementary items cannot be divided further. Level number, Data name, Picture clause and Value clause (optional) are used to describe an elementary item.
- Group items consist of one or more elementary items. Level number, Data name, and Value clause (optional) are used to describe a group item. Group level number is always 01. 参考tutorialspoint
数据部的结构
(1)文件节(FILE SECTION) 用来描述程序中用到的输入文件和输出文件及其记录中各数据项的属性。
(2)工作单元节(WORKING-STORAGE SECTION) 用来描述程序中用到的中间数据项。
(3)联接节(LINKAGE SECTION) 用来描述与调用程序间发生数据传递的数据项。
(4)报表节(REPORT SECTION) 为了完成报表编制功能,此节用来规定欲输出的报表的 “体裁“,设计各报表栏的打印形式和方法等
注:数据部还含有其他节,但实际上一般只用到了此处已列出的前3个
5)PIC子句,数据描述符“9” “V” “S”,编辑型描述符“.” “ ,” “B” “Z” “ +” “ –” “ $”及浮动插入正负号和‘$’的用法。
PIC子句
PIC既PICTURE的缩写。PIC子句用来描述每一个初等项。
它说明:(1)数据项是什么类型(2)数据项 占多大内存域
1)格式:PICTURE/PICIS描述字符串
1.数值型数据的描述: ‘9’描述符:表示该位置上可以放入一个0 ~ 9 之间的数字。
因此: 02 A PIC 999. 或 02 A PIC 9(3).
表示A可以存放000 ~ 999 之间的一个三位数。有几个9表示有几位数。
注意:(1)在数值型数据项中只能放数字不能放空格。
(2)用‘9’描述符只能表示整数,如输入小数部分,则 小数部分被舍弃。
(3)如送入一个负数,则负号被舍弃。 MOVE –123.4 TO A. (右对齐)
‘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不占位数,在传送或运算时起 作用。
这里需要说明一下主机存储数据的形式,数据是按照ASCII码存储的,所以一位实际上占有的内存是一个BYTE。
在存数值型数据中,一般使用低4bit存储该位数据,高四位为默认为F(16进制,四个1111).
默认情况下,S描述符表示的正负符号位是在最后一位数值位的高4bit,正数为C,负数则为D(16进制).
可以用SIGN指定S描述符的指定位:
77 A PIC S999 SIGN IS LEADING. 指定SIGN 存储在数值最高位byte中。
77 B PIC S999 SIGN IS TRAILING. 指定SIGN存储在数值末端位的byte中。
77 C PIC S999 SIGN IS LEADING SEPARATE. 单独设定一位存储该符号。即 C占4个字符。
编辑型描述符
- “.” 插入小数点,使数值型数据中隐含的小数点能在相应的位置显示出来
- “ ,” 插入逗号,用作分隔符
- “B” 插入空格
- “Z” 在高位零的位置浮空
- “ +” 一律加符号
- “ –” 只对负值加负号
- “ $” 插入‘$’, 可以和 ‘.’ ‘,’ ‘+’ ‘-‘一起使用浮动插入
- 浮动插入正负号($ +)(与其他符号结合使用)
eg. 以$符号为例
77 NUM1 PIC $$9.99. 77 NUM2 PIC $$$.99. 77 NUM3 PIC $$$.$$. MOVE 0.25 TO NUM1. RESULT:$0.25 MOVE 0.25 TO NUM2. $0.25 MOVE 0.25 TO NUM3. $.25
6)数据部较高技巧: SIGN子句, REDEFINES子句, RENAMES子句, JUSTIFIED子句
SIGN 子句见上文。
REDEFINES(重定义子句)
作用: 不同的数据项可以共用内存中的同一段空间。例如已给数据项A分配了一段内存空间,在经过某一段的过程后,A已经不再使用了,但它仍占着内存这部分空间,为了节约内存,可以将另一数据项B也分配在A所 占的这段内存空间。
格式:层号数据名1 REDEFINES 数据名2
举例:02 A PIC X(5).
02 B REDEFINES A PIC 9(5).
注意: 可以多次重定义,但必须紧跟出现,而且要求使用最初定义的数据名。
RENAMES(重命名子句)
- REDEFINES子句——不改变数据项长度的前提 下,重新定义数据区的名称和数据结构的形式;
- RENAMES子句——将原来已定义的数据项重 新组合成为一个新项,并以一个新名字来代表 它。
- RENAMES子句不能改变原来各初等项的类型、长度等属性。
格式:66 数据名1 RENAMES 数据名2 [THRU 数据名3]
01 A VALUE '123456'. 02 A1 PIC 9. 02 A2 PIC 9. 02 A3 PIC XX. 02 A4 PIC 99. 66 B RENAMES A1 THRU A3.
说明:
- 层号只能用66,它必须紧跟在01层记录中后 一个数据描述体之后,因为它是对记录中有关部分 重新组合和命名的。
- 如无THRU部分,则数据名1和数据名2代表的 是同一内容。
- 用THRU时,数据名2在记录中的位置应在数据名3之前,而且数据名3不应包括在数据名2之中。
- RENAMES子句只能用于工作单元节,而不能用于文件节。
JUSTIFIED(对齐子句)
作用:字符或字母型数据传送的时候是按标准的对齐方式,即“左对齐”,若想改为“右对齐”,可以用 JUSTIFIED子句。
格式:JUSTIFIED/JUST RIGHT
举例:77 B PIC X(5)JUSTIFIED RIGHT
7)标识符的概念,COBOL基本语句 :OPEN,READ,WRITE,PERFORM(循环和嵌套),MOVE, IF,EVALUATE,CLOSE,STOP RUN,算术运算语句, ROUNDED子句, ON SIZE ERROR 子句
OPEN-CLOSE FILE.
OPEN [OPTION] FILENAME. 其中的OPTION可以为
CLOSE FILENAME.
CLOSE语句:当对一个文件的读或写的操作已完成, 就应关闭该文件。
CLOSE语句的一般格式为: CLOSE文件名1 [,文件名2]…
READ 语句的一般格式
•READ文件名RECORD [INTO标识符]
[; AT END执行 语句]
[END-READ]
WIRTE语句
PERFORM(执行语句)
在一个COBOL程序中,过程部中 往往有一部分语句需要执行多次。为了让重复的部分在 程序中只出现一次,可以把重复的部分单独写成一段或 一节(有一个段名或节名),每次执行这部分语句时转 去该段,执行完转回来。这时候就需要用到执行语句 (PERFORM )。
- 执行语句的简单形式: PERFORM过程名
- 执行语句的一般形式: PERFORM过程名1 [THRU] 过程名2
- 使用PERFORM语句实现循环:
1. PERFORM过程名1 [{THRU}过程名2 ] 整数TIMES 标识符
2. PERFORM过程名1 [{THRU}过程名2 ] UNTIL 条件 #先判断UNTIL后面的条件是否满足,若不满足则执行执行语句。
3. PERFORM过程名1 [{THRU}过程名2 ] VARYING标识符1 FROM常数1 BY常数2 UNTIL 条件 标识符2 标识符3
IF语句的两种形式
(1)IF条件语句组
(2)IF条件 语句组1 ELSE 语句组2 END-IF
条件名条件说明的一般格式:
88 条件名 {VALUEIS} 常量1 [{THRU} 常量2] [常量3[[{THRU}常量4]]…]
如:
77 XPIC9(6). 88 X1 VALUE 0 THRU 99. 88 X2 VALUE 100 THRU 999. 88 X3 VALUE 1000 THRU 4999. 88 X4 VALUE 5000 THRU 100000. IF X1 MOVE 0.03 TO R. IF X2 MOVE 0.04 TO R. IF X3 MOVE 0.05 TO R. IF X4 MOVE 0.06 TO R.
EVALUATE(多分支选择语句,相当于C语言的switch case)
例如:
EVALUATE A WHEN 3 DISPLAY A WHEN 4 DIVIDE 2 INTO A DISPLAY A WHEN OTHER DISPLAY “ERROR” END-EVALUATE.
注意句点的用法(和其他语言的区别).
算术运算语句
ADD
格式1:ADD 标识符1,标识符2… TO标识符m [,标识符n]…
【常量1 ,常量2】
ADD A TO B A+B -->B ADD A,1 TO B A+1+B-->B ADD A,B TO C,D A+B+C-->C和A+B+D-->D
格式2:ADD 标识符1,标识符2,标识符3…GIVING标识符m [, 标识符n]…
TO 和GIVING 后面只能跟数据名,不能跟常量
SUBSTRACT
格式1:SUBTRACT标识符1,标识符2…FROM标识符m[, 标识符n]…
格式2:SUBTRACT标识符1,标识符2…FROM标识符m GIVING标识符n[,标识符p]…
MULTIPLY
格式1:MULTIPLY标识符1/常量1 BY标识符2 [, 标识符3]…
格式2:MULTIPLY标识符1 /常量1 BY标识符2 / 常量2 GIVING标识符3 [,标识符4]…
DIVIDE
格式1:DIVIDE标识符1 INTO标识符2 [,标识符3]… 常量1
格式2:DIVIDE标识符1 INTO标识符2 GIVING 常量1 BY 常量2 标识符3 [,标识符4]…
注意:
DIVIDE A INTO B 是指B/A---》B DIVIDE A INTO B GIVING C 是指B/A---》C DIVIDE A BY B GIVING C 是指A/B ---》C
下面的用法错误:
DIVIDE A BY B. DIVIDE A INTO 3. DIVIDE A BY 0 GIVING C.
注意:
1.一个语句只能进行一种单一的运算,不能在一个语句中实现两种不同的运算。
2.加法和减法语句可以进行两个以上的数值计算,但乘法和除法语句只能在两个量之间进行。
3.都有两种形式,即带GIVING和不带GIVING部分。
COMPUTE
COMPUTE标识符1 [,标识符2 ]…= 算术表达式
运算的优先级由高到低顺序为:(),正负号,** , * 或/ ,+ 或 -
如:
A*B*C+D3=>T
A*B*C+D3=>P
则: COMPUT T,P = A * B * C + D ** 3
注意:虽然使用COMPUTE语句会比较方便,但实际编程过程中若使用ADD,SUBSTACT,MULTIPLY,DIVIDE计算会提高程序运行效率。
ROUNDED子句
ON SIZE ERROR 子句
四舍五入处理(ROUNDED子句):
ROUNDED的作用是按照数据项的描述要求对多余位进行截断,然后对被截断的后一位 进行四舍五入处理。
如:ADD A,B GIVING C ROUNDED,E,F ROUNDED
COMPUTE A ROUNDED = B * C +D
长度溢出处理(ON SIZE ERROR 子句):当发生溢出错误时,按程序设计者事先指定的操作处理。如:
MULTIPLY A BY B GIVING C ON SIZE ERROR DISPLAY ‘SIZE ERROR’ STOP RUN. DISPLAY C.
注意:当ROUNDED 与ON SIZE ERROR 一起使用时,先按ROUNDED 作四舍五入处理,再判断是否溢出。
可以看出ROUNDED 与ON SIZE ERROR一般用于运算结果上,需要注意的是如果发生ON SIZE ERROR会忽略该此运算,保留原结果。
STOP RUN.可以于主程序,终止程序运行。
END PROGRAM PROGRAM-IDNAME. 用于子程序终止子程序运行。
主程序结束——STOP RUN.
子程序结束——EXIT PROGRAM.
IBM扩展,一并使用GOBACK
8) 子程序调用,GLOBAL 与EXTERNAL 的作用及区别,编译链接主程序及子程序的方法
举例:编一个打印一行“*”符号的子程序
主程序:
IDENTIFICATION DIVISION. (标识部) PROGRAM-ID. A. (程序名为A) ENVIRONMENT DIVISION. (环境部) …… DATA DIVISION. (数据部) …… PROCEDURE DIVISION. (过程部) …… CALL ‘B’. (调用子程序B) STOP RUN.
子程序:
IDENTIFICATION DIVISION. PROGRAM-ID. B. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 77 X PIC X(80). PROCEDURE DIVISION. MOVE ALL ’*’ TO X. DISPLAY X. END PROGRAM B.
例子2:关于参数的使用
主程序: IDENTIFICATION DIVISION. PROGRAM-ID. EX1. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 77A PIC 99 VALUE 2. 77 B PIC 99 VALUE 3. 77 C PIC 99. PROCEDURE DIVISION. S. CALL ‘SUB’ USING A, B, C. DISPLAY ‘C=‘, C. STOP RUN. 子程序SUB: IDENTIFICATION DIVISION. PROGRAM-ID. SUB. ENVIRONMENT DIVISION. DATA DIVISION. LINKAGE SECTION. 77 X PIC 99. 77 Y PIC 99. 77 Z PIC 99. PROCEDURE DIVISION USING X, Y, Z. S. COMPUTE Z=X-Y. END PROGRAM SUB.
GLOBAL & EXTERNAL
通常,数据和文件都是局部的,但也可以定义全局数据和文件— —GLOBAL子句
GLOBAL只能用于01层,其所有下层数据均具有全局特性, 可以被任何子程序引用。
但是子程序中定义同名的数据项会将父程序中GLOBAL数据项覆盖,可以使用EXTERNAL子句
EXTERNAL子句和GLOBAL有相似性。具有外部属性 的同名文件与数据,不管是在主程序还是子程序,不 管是同时编译还是单独编译,都共享同一内存区域。
9)表的定义方法 ,表的引用方法,SET语句,下标和位标的区别,表的检索,给表赋值的方法
COBOL语言中的表(TABLE)类似于其他高级语言中的数组 (ARRAY),可以避免一些重复性工作。
表的建立:
格式:OCCURS 整数TIMES (在数据部中说明)
eg:
01 TABLE. 02 A1 OCCURS 5 TIMES. 03 B1 PIC X(3). 03 B2 OCCURS 10 TIMES PIC 9(4). 03 B3 OCCURS 8 TIMES. 04 C1 PIC 9(6). 04 C2 OCCURS 20 TIMES PIC 99. 04 C3 PIC 9(4). 03 B4 PIC X(3). 02 A2 PIC X(5). 02 A3 PIC X(10).
- A1,B1,B4是一维表,引用表元素只需一个出现号。 如:A1(3),B1(5),B4(1)等。
- B2,B3,C1,C3是二维表。引用它们需用两个出现号。 如:B2(5,3), B3(4,8), C1(2,7), C3(1,8)等。
- C2是一个三维表。引用时需用三个出现号。如: C2(4,3,1)。
- A2, A3不是“表名”,而是普通的初等数据项。
给表元素赋初值(三种方法)
A.对包括所有表元素的整个表赋给一个初值,这时可以对表 的描述体上面一层的数据项赋一个初值即可。
B.联合使用OCCURS子句和REDEFINES子句来给各个表元素 赋值。
步骤: (1)先在工作单元节中定义一个组合项,它占的内存的大小和 需赋值的表一样,在该组合项中定义若干个数据项,数据项的 描述和表的元素相同。
(2)然后对这些数据项分别用VALUE子句赋以初值,由于在这 些数据项的描述中没有出现OCCURS子句,因此用VALUE赋 初值是合法的(VALUE子句和OCCURS子句不能同时用来描 述一个数据项)。这些值就是要赋给表元素的初值。
(3)把这个组合项重定义为一个表。
C.用MOVE语句赋值。
下标与位标
下标是根据表的数据名称直接使用,从1开始。
位标是自定义的数据项,是对表的索引,从0开始,表示该表(数组)的第一项。(拓展,二维表类比于二维数组)
使用位标引用表元素的方法
一.使用位标有两种方法:
一是在括号内直接写位标 名:A(I);
二是在括号内写位标名加或减一个整数, A(I+2).
二.位标所代表的出现号不能超过表的相应维的长度。
三.一个表,不论是否指定位标,都可以使用下标。但位标不能与下标混用。
四.位标可以用在IF语句中参加比较。
SET 语句
作用:将一表元素的相对地址放到指定的位标去。 如:SET I TO 10.
格式:
格式1:
SET 标识符1[,标识符2]……TO 标识符3/位标3/整数 位标1[,位标2]……
格式2:
SET 位标1 [,位标2]……UP/DOWN BY 标识符/整数
作用:给位标所代表的序号增减一个量。
表的检索SEARCH
用于顺序检索的SEARCH语句
格式:
SEARCH 表名 [VARYING 位标名1/标识符2]
[AT END 强制语句1]
WHEN 条件1 强制语句2 / NEXT SENTENCE
[WHEN 条件2 强制语句3 / NEXT SENTENCE]
……
SEARCH语句是这样执行的:从指定的表元素开始,检查是否满足WHEN后面指定的条件。如不满足,就使N(位标)增值,自动执行一个SET N UP BY 1。使N指向下一个元素的 地址,如果查到某一个元素满足指定的条件时,查表工作立即停止,执行WHEN字句中条件后面的语句
eg:
SET N TO 1. SEARCH WORKER-TABLE AT END DISPLAY‘CANNOT FIND NAME’ WHEN NAME(N)=‘ZHANG SHENG’ DISPLAY NAME(N),PAY(N).
其中N必须是位标