返回首页

COBOL 数据类型与变量

COBOL 数据类型与变量

本章讲解 COBOL 的数据声明方式,重点掌握 PIC 子句、层级编号与常用数据类型。

目录

  1. 数据层级与编号
  2. PIC 子句(图像子句)
  3. 常用数据类型
  4. VALUE 子句与初始化
  5. USAGE 子句(存储方式)
  6. 常量与特殊字面量
  7. 实战: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.

要点:

  1. WS-GRID 是二维表(12 行 × 20 列),用嵌套 OCCURS 实现
  2. WS-SNAKE 用 OCCURS 240 定义蛇身坐标数组
  3. PIC 9(2) 表示 2 位数字,足够表示坐标 1~20
  4. PIC X 单字符用于显示符号
  5. X"..." 十六进制字面量存储 ANSI 转义序列
  6. COMP-5 用于与 C 库函数交互

上一章: 基础入门
下一章: 过程部与语句