COBOL 数据类型与变量
本章讲解 COBOL 的数据声明方式,重点掌握 PIC 子句、层级编号与常用数据类型。
目录
数据层级与编号
PIC 子句(图像子句)
常用数据类型
VALUE 子句与初始化
USAGE 子句(存储方式)
常量与特殊字面量
实战:snake.cob 的数据声明
1. 数据层级与编号 COBOL 用层级编号(Level Number) 组织数据,形成树状结构。
1 2 3 4 01 WS-EMPLOYEE. 05 WS-NAME PIC X(20). 05 WS-AGE PIC 9(3). 05 WS-SALARY PIC 9(7)V99.
规则:
01 是最高层(顶层记录),每个 01 是一个独立数据项
02 ~ 49 是子层级,数字越大层级越深
05、10 等只是习惯用法,关键是层级递增
特殊层级号:
66:RENAMES 子句(重命名)
77:独立数据项(无子项,不能有下级)
88:条件名(Condition Name)
组合项 vs 基本项
组合项(Group Item) :有下级的数据项,如 WS-EMPLOYEE
基本项(Elementary Item) :最底层、有 PIC 的数据项,如 WS-NAME
1 2 3 4 01 WS-DATE. *> 组合项 05 WS-YEAR PIC 9(4). *> 基本项 05 WS-MONTH PIC 9(2). *> 基本项 05 WS-DAY PIC 9(2). *> 基本项
77 层级 1 77 WS-COUNTER PIC 9(4) VALUE 0.
用于声明独立的简单变量,不能有子项。
88 条件名 为某个数据项定义”命名条件”,使代码更可读:
1 2 3 4 5 6 7 8 01 WS-FLAG PIC 9 VALUE 0. 88 GAME-OVER VALUE 1. 88 GAME-ACTIVE VALUE 0. *> 使用 IF GAME-OVER DISPLAY "游戏结束" END-IF
2. PIC 子句(图像子句) PIC(PICTURE)定义数据的类型、长度和格式 ,是 COBOL 最核心的概念。
字符类型符号
符号
含义
示例
X
任意字符(字母/数字/符号)
PIC X(10) = 10 个字符
A
仅字母
PIC A(5)
9
数字(显示用)
PIC 9(3) = 3 位数字
V
隐含小数点(不占存储)
PIC 9(3)V99
S
符号位(正负)
PIC S9(5)
P
假定小数点(缩放)
PIC 9(3)P(2)
Z
前导零替换为空格
PIC ZZ9
,
千位分隔符(编辑用)
PIC Z,ZZ9
.
实际小数点(编辑用)
PIC 999.99
$
货币符号
PIC $9,999.99
+ -
正负号(编辑用)
PIC +999
重复计数 用括号表示重复次数:
1 2 3 PIC X(30) *> 等价于 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX PIC 9(4) *> 等价于 9999 PIC 9(3)V99 *> 3 位整数 + 2 位小数
数值型 vs 编辑型
数值型(Numeric) :只含 9、S、V、P,可参与算术运算1 2 PIC 9(4) *> 0 ~ 9999 PIC S9(5)V99 *> 带符号,5 位整数 2 位小数
编辑型(Edited) :含 Z、,、.、$ 等,仅用于显示 ,不能运算1 2 PIC ZZZ9 *> 显示时前导零变空格 PIC $9,999.99 *> 显示为 $1,234.56
3. 常用数据类型 3.1 字符型 1 2 01 WS-NAME PIC X(20) VALUE "Alice". 01 WS-ADDRESS PIC X(50).
3.2 整数型 1 2 01 WS-COUNT PIC 9(3) VALUE 100. *> 0 ~ 999 01 WS-SCORE PIC 9(4) VALUE 0. *> 0 ~ 9999
3.3 带符号数 1 01 WS-TEMP PIC S9(3) VALUE -50. *> -999 ~ 999
3.4 小数 1 2 01 WS-PRICE PIC 9(5)V99 VALUE 12345.67. *> V 是隐含小数点,不占存储空间
3.5 显示格式(编辑型) 1 2 01 WS-DISPLAY-AMT PIC Z,ZZ9.99. *> 数值 1234.5 显示为 " 1,234.50"
4. VALUE 子句与初始化 VALUE 为数据项指定初始值:
1 2 3 4 5 01 WS-COUNT PIC 9(3) VALUE 0. 01 WS-NAME PIC X(10) VALUE "COBOL". 01 WS-FLAG PIC X VALUE "Y". 01 WS-MSG PIC X(20) VALUE SPACES. *> 全空格 01 WS-NUM PIC 9(3) VALUE ZEROS. *> 全零
特殊字面量:
字面量
含义
SPACES / SPACE
全空格
ZEROS / ZERO / ZEROES
全零
HIGH-VALUES
最大值(0xFF)
LOW-VALUES
最小值(0x00)
QUOTES
引号字符
注意: 组合项(有子项的 01)不能用 VALUE,只有基本项可以。
5. USAGE 子句(存储方式) USAGE 定义数据在内存中的存储格式,影响精度与性能。
USAGE
说明
示例
DISPLAY
默认,每个数字占 1 字节(字符形式)
PIC 9(4)
COMP / BINARY
二进制整数,运算快
PIC 9(4) COMP
COMP-1
单精度浮点
PIC ... COMP-1
COMP-2
双精度浮点
PIC ... COMP-2
COMP-3 / PACKED-DECIMAL
压缩十进制,每字节 2 位数字
PIC 9(5) COMP-3
COMP-5
原生二进制(按机器字节序)
PIC 9(6) COMP-5
示例(来自 snake.cob):
1 01 WS-DELAY-US PIC 9(6) COMP-5 VALUE 200000.
COMP-5 用于传给 C 函数 usleep,因为需要原生二进制格式。
6. 常量与特殊字面量 数值字面量 1 2 MOVE 100 TO WS-COUNT. COMPUTE WS-X = 3.14 * 2.
字符字面量 1 2 MOVE "Hello" TO WS-NAME. MOVE 'World' TO WS-NAME. *> 单双引号均可
十六进制字面量 1 2 01 WS-CLEAR-SEQ PIC X(7) VALUE X"1B5B324A1B5B48". *> X"..." 表示十六进制字节序列(ANSI 清屏转义)
象征常量(Figurative Constants) 1 2 MOVE SPACES TO WS-LINE. MOVE ZEROS TO WS-COUNT.
7. 实战:snake.cob 的数据声明 分析 snake.cob 中的关键数据声明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 *> ---- 网格: 0=空 1=蛇身 2=食物 ---- 01 WS-GRID. 05 WS-ROW OCCURS 12 TIMES. 10 WS-CELL OCCURS 20 TIMES PIC 9. *> ---- 蛇的坐标数组 (最多 240 节, 索引1=头) ---- 01 WS-SNAKE. 05 WS-SEG OCCURS 240 TIMES. 10 WS-SX PIC 9(2). 10 WS-SY PIC 9(2). 01 WS-SNAKE-LEN PIC 9(3) VALUE 3. *> ---- 方向: 1=上 2=下 3=左 4=右 ---- 01 WS-DIR PIC 9 VALUE 4. *> ---- 显示用 ---- 01 WS-DISP-CHAR PIC X. 01 WS-BODY-CHAR PIC X VALUE "o". 01 WS-FOOD-CHAR PIC X VALUE "*". 01 WS-WALL-CHAR PIC X VALUE "#". 01 WS-CLEAR-SEQ PIC X(7) VALUE X"1B5B324A1B5B48". *> ---- 延时 (微秒) ---- 01 WS-DELAY-US PIC 9(6) COMP-5 VALUE 200000.
要点:
WS-GRID 是二维表(12 行 × 20 列),用嵌套 OCCURS 实现
WS-SNAKE 用 OCCURS 240 定义蛇身坐标数组
PIC 9(2) 表示 2 位数字,足够表示坐标 1~20
PIC X 单字符用于显示符号
X"..." 十六进制字面量存储 ANSI 转义序列
COMP-5 用于与 C 库函数交互
上一章: 基础入门 下一章: 过程部与语句