Table of Contents
TutorialsPoint COBOL 教程
来源:易百教程
COBOL教程
简介COBOL
COBOL语言是高级语言。必须要了解COBOL的工作方式。电脑只能理解机器码,0和1的二进制流。 COBOL代码必须被转换成机器代码的使用的编译器。运行程序源代码经过编译器。编译器为任何语法错误首先检查,然后将其转换成机器语言。该编译器创建了被称为负载模块的输出文件。该输出文件包含在0和1的形式的可执行代码。
COBOL语言的演变
在20世纪50年代,当企业被在世界的西部部分越来越大,有必要对流程自动化,便于操作,这催生了高级编程语言的意思为商业数据处理。
最终,在1959年,COBOL被CODASYL(会议数据系统语言)开发。下一个版本COBOL-61发行于1961年并做了一些修改。 1968年,COBOL被批准为ANSI标准语言用于商业用途(COBOL-68)。它再次修订于1974年和1985年制定,分别取名COBOL-74和COBOL-85两个版本。 2002年,面向对象COBOL被释放,这可以使用封装的对象为COBOL编程的正常组成部分。
COBOL语言的重要性
- COBOL是第一个被广泛使用的高级编程语言。这是一个类似英语的语言,它是用户友好的。所有的指令可以被编码在简单的英语单词。
- COBOL语言也可以作为一个自文档的语言。
- COBOL语言可以做庞大的数据处理。
- COBOL与以前的版本兼容。
- COBOL具有有效的错误信息,所以Bug分辨率更容易。
COBOL语言的特点
标准语言
COBOL可以编译和在许多机器上,如IBM AS/400,个人计算机等执行的标准语言
面向业务
COBOL是专为面向业务的应用,如在金融领域,国防领域等,它可以处理文件,大数据等。
强大的语言
COBOL是一个强大的语言,它的许多调试和测试工具可用于几乎所有的计算机平台。
结构化语言
COBOL用逻辑控制结构,这使得更容易阅读和修改使用。 COBOL语言有不同的部分,所以很容易调试。
COBOL环境安装 - COBOL教程
在Windows/Linux上安装COBOL
有适用于Windows,很多免费的主机模拟器可用于书写和学习简单的COBOL程序。
一个这样的仿真器,可以按照下面给出几个简单的步骤,很容易地安装在Windows中:
http://www.jaymoseley.com/hercules/installmvs/instmvs2.htm
- 下载并安装Hercules模拟器,它可以从Hercules“主页- :www.hercules-390.eu
- 一旦在Windows机器上安装包,它会创建这样一个文件夹 C:/hercules/mvs/cobol.
- 运行命令提示符(CMD),进入目录C:/hercules/mvs/cobol on CMD.
- 对各种命令编写和执行JCL与COBOL程序的完整指南可在网址上找到
Hercules是一个开源软件实现主机System/370 和ESA/390 架构,除了最新的64位Z/架构。Hercules可以在Linux,Windows,Solaris和FreeBSD和Mac OS X上运行
用户可以连接到主机服务器,使用的方法有很多,例如瘦客户端,虚拟终端,虚拟客户端系统(VCS)或虚拟桌面系统(VDS)。每个有效用户提供的登录ID进入到Z/OS界面(TSO/ E或ISPF)。
编译COBOL程序
为了执行使用JCL在批处理模式下的COBOL程序,该程序需要编译和负载模块与所有的子程序创建。JCL使用加载模块,而不是实际程序在执行时。负载库连接起来,并提供给JCL在使用JCLLIB或STEPLIB执行的时候。
有许多可用的编译COBOL程序的主机编译器工具。有些企业公司使用变更管理工具,如Endevor,其中编译并存储每个版本的程序。这是在追踪到的程序的修改是有用的。
//COMPILE JOB ,CLASS=6,MSGCLASS=X,NOTIFY=&SYSUID
//*
//STEP1 EXEC IGYCRCTL,PARM=RMODE,DYNAM,SSRANGE
//SYSIN DD DSN=MYDATA.URMI.SOURCES(MYCOBB),DISP=SHR
//SYSLIB DD DSN=MYDATA.URMI.COPYBOOK(MYCOPY),DISP=SHR
//SYSLMOD DD DSN=MYDATA.URMI.LOAD(MYCOBB),DISP=SHR
//SYSPRINT DD SYSOUT=*
//*
IGYCRCTL是IBM COBOL编译器工具。编译器选项使用PARM参数传递。在上面的例子中,RMODE指示在程序中使用相对寻址模式的编译器。 COBOL程序正在使用SYSIN参数传递和复写簿使用由在SYSLIB程序库提供。
执行COBOL程序
下面,说明使用该输入文件MYDATA.URMI.INPUT执行该程序MYPROG并产生写入卷轴两个输出文件的JCL例子。
//COBBSTEP JOB CLASS=6,NOTIFY=&SYSUID
//
//STEP10 EXEC PGM=MYPROG,PARM=ACCT5000
//STEPLIB DD DSN=MYDATA.URMI.LOADLIB,DISP=SHR
//INPUT1 DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1 DD SYSOUT=*
//OUT2 DD SYSOUT=*
//SYSIN DD *
//CUST1 1000
//CUST2 1001
/*
MYPROG负载模块位于MYDATA.URMI.LOADLIB。这是很重要,要注意的是,上述的JCL可以用于只是一个非DB2 COBOL模块。
执行COBOL-DB2程序
对于运行的COBOL DB2 程序,IBM的专业工具被用在JCL程序; DB2区域和所需的参数作为输入传递给该实用程序。
运行的COBOL-DB2程序的步骤如下面:
- 当一个COBOL-DB2程序被编译一个DBRM(数据库请求模块)一起装入模块创建的。该DBRM包含了COBOL程序的SQL语句的语法正确检查。
- DBRM绑定到DB2的区域(环境),其中COBOL运行。这可以通过使用IKJEFT01实用的JCL来完成。
- 绑定步骤之后,COBOL-DB2 程序正在使用IKJEFT01(再次)与负载库和DBRM库作为输入到JCL运行。
//STEP001 EXEC PGM=IKJEFT01
//*
//STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
LIB('MYDATA.URMI.LOADLIB')
END
/*
在上面的例子中,MYCOBB使用IKJEFT01的COBOL-DB2程序运行。请注意,该程序的名称,DB2子系统名称(SSID),DB2的程序名称是通过在SYSTSIN DD语句指定。该DBRM库指定STEPLIB。
COBOL程序结构 - COBOL教程
COBOL程序结构包括如在下面的图片显示:
简单介绍这些分区如下:
- Sections 是程序逻辑的逻辑细分。段是段落的集合。
- Paragraphs 是分区的一段或分立。它可以是用户自定义或预定义的名称后面加上的一段,由零个或多个句子/项。
- Sentences 是一个或多个语句的组合。句子只出现在程序师。句子,必须结束有一个时期。
- Statements 其执行一些处理有意义的COBOL语句。
- Characters 是最低的层次,不能再分。
您可以互相涉及的以下示例中的上述条件与COBOL程序:
PROCEDURE DIVISION.
A0000-FIRST-PARA SECTION.
FIRST-PARAGRAPH.
ACCEPT WS-ID - Statement-1 -----|
MOVE '10' TO WS-ID - Statement-2 |-- Sentence - 1
DISPLAY WS-ID - Statement-3 -----|
.
区划
COBOL程序由4个区划组成
鉴定区划
这是每个COBOL程序的第一个也是唯一的强制性分工。编程器和编译器使用该分工鉴定程序。在此处程序唯一的ID是强制性的段落。程序ID指定的程序名称。程序名称可以由1〜30个字符组成。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY 'Welcome to yiibai'.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
Welcome to Yiibai
环境分区
环境区划用于指定输入和输出文件的程序。它由两部分组成:
- 配置部分给出了关于在其上的程序被写入和执行的系统信息。它由两段:来源计算机:用于编译程序系统。
目标计算机:用于执行程序系统。
- 输入 - 输出部分,用于指定关于在节目中要使用的文件的信息。它由两段:文件控制:给出的程序中使用的外部数据集的信息。
IO控制:提供在程序中使用的文件的信息。
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. XXX-ZOS.
OBJECT-COMPUTER. XXX-ZOS.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILEN ASSIGN TO DDNAME
ORGANIZATION IS SEQUENTIAL.
数据分区
数据分区是用来定义在该程序中使用的变量。它包括四个部分:
- 文件部分是用来定义文件的记录结构。
- 工作 - 存储部分被用于声明在程序中使用临时变量和文件结构。
- 本地存储部分与工作- 存储部分是一样的。唯一的区别是,变量将被分配并初始化每个程序开始执行时间。
- 连接段是用来形容那些从外部程序接收到的数据的名称。
COBOL程序
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILEN ASSIGN TO INPUT.
ORGANIZATION IS SEQUENTIAL.
ACCESS IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FILEN
01 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT PIC A(30).
01 WS-ID PIC 9(5).
LOCAL-STORAGE SECTION.
01 LS-CLASS PIC 9(3).
LINKAGE SECTION.
01 LS-ID PIC 9(5).
PROCEDURE DIVISION.
DISPLAY 'Executing COBOL program using JCL'.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
//INPUT DD DSN=ABC.EFG.XYZ,DISP=SHR
当编译并执行上面的程序它会产生以下结果:
Executing COBOL program using JCL
程序区划
程序分部被用于包含程序的逻辑。它包括使用数据分割定义的变量可执行语句。在这个划分,段落和章节名称是user-defined。
必须有程序师至少有一个语句。最后语句结束在执行这种划分或者是停止运行它用于调用它采用的是被称为程序的程序或退出程序。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC A(30).
01 WS-ID PIC 9(5) VALUE '12345'.
PROCEDURE DIVISION.
A000-FIRST-PARA.
DISPLAY 'Hello World'.
MOVE 'YiiBai' TO WS-NAME.
DISPLAY "My name is : "WS-NAME.
DISPLAY "My ID is : "WS-ID.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
Hello World
My name is : YiiBai
My ID is : 12345
COBOL基本语法 - COBOL教程
字符集
'字符'层次是最低的,并且不能被进一步划分。COBOL字符集有78个字符如下所示:
字符 | 描述 |
A-Z | Alphabets(Upper Case) |
a-z | Alphabets (Lower Case) |
0-9 | Numeric |
Space | |
+ | Plus Sign |
- | Minus Sign or Hyphen |
* | Asterisk |
/ | Forward Slash |
$ | Currency Sign |
, | Comma |
; | Semicolon |
. | Decimal Point or Period |
" | Quotation Marks |
( | Left Parenthesis |
) | Right Parenthesis |
> | Greater than |
< | Less than |
: | Colon |
' | Apostrophe |
= | Equal Sign |
代码表
COBOL源程序必须写在编译器可以接受的格式。 COBOL程序都写在COBOL语言编码表。有关于编码片的每一行80个字符的位置。
字符的位置被分为下列五个字段:
位置 | 字段 | 描述 |
1-6 | 列数 | 保留的行号 |
7 | 指示器 | 它可以有星号(*)表示注释,连字符( - ),表示继续和斜线(/)表示换页 |
8-11 | A区 | 所有的COBOL分区,段落和一些特殊的项目必须首先在A区 |
12-72 | B区 | 所有的COBOL语句必须开始在B区 |
73-80 | 识别区 | 它可以根据需要由程序员使用 |
例子
下面的例子显示COBOL代码表:
000100 IDENTIFICATION DIVISION. 000100
000200 PROGRAM-ID. HELLO. 000101
000250* THIS IS A COMMENT LINE 000102
000300 PROCEDURE DIVISION. 000103
000350 A000-FIRST-PARA. 000104
000400 DISPLAY “Coding Sheet”. 000105
000500 STOP RUN. 000106
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
Coding Sheet
字符串
字符字符串是通过将单个字符组成。一个字符串可以是
- 注释
- 文字
- COBOL单词
所有字符串必须用分隔符结束。分隔符用于分隔字符串。
经常使用的分隔符:空格,逗号,句号,省略号,左/右括号和引号。
注释
注释不影响程序的执行字符串。它可以是字符的任意组合。
有两种类型的注释:
注释行
注释行可以写在任何列中。编译器不检查注释行的语法和对待它的文档。
注释入口
注释入口是鉴定区划的可选段落的条目。都写在B区和程序员使用它,以供参考。
粗体字母在注释下面的例子中项目:
000100 IDENTIFICATION DIVISION. 000100
000150 PROGRAM-ID. HELLO. 000101
000200 AUTHOR. **YIIBAI**. 000102
000250* THIS IS A COMMENT LINE 000103
000300 PROCEDURE DIVISION. 000104
000350 A000-FIRST-PARA. 000105
000360/ First Para Begins - Documentation Purpose 000106
000400 DISPLAY “Comment line”. 000107
000500 STOP RUN. 000108
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
Comment Line
文字
文字是一个常数,直接硬编码在程序中。在下面的示例中“Hello World”的文字。
PROCEDURE DIVISION.
DISPLAY 'Hello World'.
有两种类型的文字:
字母数字文字
字母数字文字都包含在引号或单引号。长度可以长达160个字符。单引号或引号可以是文字,只有当它配对的一部分。文字的开始和结尾都是一样的无论是单引号或引用。
示例
下面的例子展示了有效和无效的字母数字字面值:
Valid:
‘This is valid’
"This is valid"
‘This isn’’t invalid’
Invalid:
‘This is invalid”
‘This isn’t valid’
数字文本
数字文字是数字从0到9,+, - 或小数点的组合。长度可以长达18个字符。符号不能是最右边的字符。小数点不应该出现在结尾。
示例
下面的例子展示了有效和无效的数字文本:
Valid:
100
+10.9
-1.9
Invalid:
1,00
10.
10.9-
COBOL词
COBOL词是可以保留字,或者用户自定义的字符串。长度可以长达30个字符。
用户自定义
用户定义的词被用于命名的文件,数据,记录,段落名称和段。字母,数字和连字符被允许在形成用户定义的单词。但不能使用COBOL保留字
保留字
保留字是在COBOL语言预定义的词。不同类型于我们经常使用如下所示的保留字:
- 关键字如 ADD, ACCEPT, MOVE等
- 特殊字符的词如 +, -, *, <, <=, 等
- 形象化的常数是恒定值,例如ZERO, SPACES等象征常量的所有恒定值被输入的下表中:
形象常量
象征常量 | 描述 |
HIGH-VALUES | 一个或多个字符,在最高的位置以降序 |
LOW-VALUES | 一个或多个字符在二进制表示的零 |
ZERO/ZEROES | 一个或多个零取决于变量的大小 |
SPACES | 一个或多个空格 |
QUOTES | 单引号或双引号 |
ALL literal | 用文字填充数据项 |
COBOL数据类型 - COBOL教程
数据分区是用来定义在该程序中使用的变量。为了描述COBOL数据,必须了解下列术语:
- 数据名称
- 等级数
- 图片子句
- 值子句
01 TOTAL-STUDENTS PIC9(5) VALUE '125'.
| | | |
| | | |
| | | |
Level Number Data Name Picture Clause Value Clause
数据名称
数据名称必须在数据部使用它们过程分区之前定义。他们必须是一个用户定义的名称,保留字不能用。数据名赋予参照其中实际数据被存储在存储器中的位置。它们可以是基本或分组类型。
例子
下面的例子展示了有效和无效数据名称:
Valid:
WS-NAME
TOTAL-STUDENTS
A100
100B
Invalid:
MOVE (Reserved Words)
COMPUTE (Reserved Words)
100 (No Alphabet)
100+B (+ is not allowed)
等级数
级别数是用来指定数据的记录中的级别。它们被用于基本事项和基件之间进行区分。基本项目可以分组以创建组的项目。
级别数 | 描述 |
01 | 记录描述项 |
02 to 49 | 分组初级项目 |
66 | 重命名子句项目 |
77 | 项目不能被细分 |
88 | 条件名称项 |
- 基本项目不能再分。级别数,数据名称,图片子句和值子句(可选)用于描述基本项目。
- 分组项目由一个或多个基本项目。级别数,数据名称和值子句(可选)用于描述组项目。分组级别数总是01。
例子
下面的例子展示了分组的基本事项:
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(25). ---> ELEMENTARY ITEM
01 WS-CLASS PIC 9(2) VALUE '10'. ---> ELEMENTARY ITEM
01 WS-ADDRESS. ---> GROUP ITEM
05 WS-HOUSE-NUMBER PIC 9(3). ---> ELEMENTARY ITEM
05 WS-STREET PIC X(15). ---> ELEMENTARY ITEM
05 WS-CITY PIC X(15). ---> ELEMENTARY ITEM
05 WS-COUNTRY PIC X(15) VALUE 'INDIA'. ---> ELEMENTARY ITEM
图片子句
图片子句用来定义下列项目:
- 数据类型可以是数字,字母或字母数字。数字只包含数字0到9字母组成的字母A到Z和空格。字母数字组成的数字,字母和特殊字符。
- 标志可用于数字数据。它可以是+或 - 。
- 小数点位置可用于数字数据。假定位置是小数点的位置和不包括在数据中。
- 长度限定所使用的数据项的字节数。
在PIC子句中使用的符号
符号 | 描述 |
9 | 数字 |
A | 字母 |
X | 字母数字 |
V | 隐式小数点 |
S | 符号 |
P | 假定小数 |
例子
下面的例子显示使用PIC子句:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC S9(3)V9(2).
01 WS-NUM2 PIC PPP999.
01 WS-NUM3 PIC S9(3)V9(2) VALUE -123.45.
01 WS-NAME PIC A(6) VALUE 'ABCDEF'.
01 WS-ID PIC X(5) VALUE 'A121$'.
PROCEDURE DIVISION.
DISPLAY "WS-NUM1 : "WS-NUM1.
DISPLAY "WS-NUM2 : "WS-NUM2.
DISPLAY "WS-NUM3 : "WS-NUM3.
DISPLAY "WS-NAME : "WS-NAME.
DISPLAY "WS-ID : "WS-ID.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : +000.00
WS-NUM2 : .000000
WS-NUM3 : -123.45
WS-NAME : ABCDEF
WS-ID : A121$
值子句
值条款是用来初始化数据项任择条款。该值可以是数字文字,字母文字或图形不变。它可以用于组和基本事项两种。
例子
下面的例子展示了使用VALUE子句:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 99V9 VALUE IS 3.5.
01 WS-NAME PIC A(6) VALUE 'ABCD'.
01 WS-ID PIC 99 VALUE ZERO.
PROCEDURE DIVISION.
DISPLAY "WS-NUM1 : "WS-NUM1.
DISPLAY "WS-NAME : "WS-NAME.
DISPLAY "WS-ID : "WS-ID.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : 03.5
WS-NAME : ABCD
WS-ID : 00
COBOL基本动词 - COBOL教程
COBOL动词用在程序划分进行数据处理。声明总是以一个COBOL动词。有几种COBOL动词使用不同类型,如下面的操作:
输入/输出动词
输入和输出动词用于从用户获取数据并显示COBOL程序的输出。下面两个动词用于此进程:
接受动词
从操作系统接受动词,比如日期,从用户的时间和日期,或直接获取数据。如果程序从用户接收数据,然后它需要通过JCL通过。同时由操作系统获得,然后数据选项包括如图下面的例子:
ACCEPT WS-STUDENT-NAME.
ACCEPT WS-DATE FROM SYSTEM-DATE.
显示动词
显示动词是用来显示COBOL程序的输出。
DISPLAY WS-STUDENT-NAME.
DISPLAY "System date is : " WS-DATE.
COBOL程序
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-NAME PIC X(25).
01 WS-DATE PIC X(10).
PROCEDURE DIVISION.
ACCEPT WS-STUDENT_NAME.
ACCEPT WS-DATE FROM DATE.
DISPLAY "Name : " WS-STUDENT_NAME.
DISPLAY "Date : " WS-DATE.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
//INPUT DD DSN=PROGRAM.DIRECTORY,DISP=SHR
//SYSIN DD *
YiiBai
/*
当编译并执行上面的程序它会产生以下结果:
Name : YiiBai
Date : 2014-08-30
初始化动词
初始化动词被用来初始化组项目或基本事项。用RENAME子句中的数据名称不能被初始化。数值数据项都受到ZEROES取代。字母数字或字母数据项之间用SPACES代替。如果包括REPLACING期限后的数据项可以被初始化,如图下面的例子给出的替换值:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC A(30) VALUE 'ABCDEF'.
01 WS-ID PIC 9(5).
01 WS-ADDRESS.
05 WS-HOUSE-NUMBER PIC 9(3).
05 WS-COUNTRY PIC X(15).
05 WS-PINCODE PIC 9(6) VALUE 123456.
PROCEDURE DIVISION.
A000-FIRST-PARA.
INITIALIZE WS-NAME, WS-ADDRESS.
INITIALIZE WS-ID REPLACING NUMERIC DATA BY 12345.
DISPLAY "My name is : "WS-NAME.
DISPLAY "My ID is : "WS-ID.
DISPLAY "Address : "WS-ADDRESS.
DISPLAY "House Number : "WS-HOUSE-NUMBER.
DISPLAY "Country : "WS-COUNTRY.
DISPLAY "Pincode : "WS-PINCODE.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
My name is :
My ID is : 12345
Address : 000 000000
House Number : 000
Country :
Pincode : 000000
移动动词
移动动词被用来从源数据的数据复制到目标数据。它可用于在两个初级和组数据项。对于组数据项对应MOVE/ CORR使用。在尝试,选择MOVE CORR无法正常工作,但主机服务器上它会工作。用于从一个字符串移动数据MOVE(x:l)用于其中x是起始位置和l是长度。如果目标数据项的PIC子句小于源数据项的PIC子句中的数据将被截断。此外,如果目标数据项的PIC子句多于源数据项的PIC子句则零或空间将额外的字节增加。这将是通过查看下面的例子更清楚:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
01 WS-NUM3 PIC 9(5).
01 WS-NUM4 PIC 9(6).
01 WS-ADDRESS.
05 WS-HOUSE-NUMBER PIC 9(3).
05 WS-COUNTRY PIC X(5).
05 WS-PINCODE PIC 9(6).
01 WS-ADDRESS1\.
05 WS-HOUSE-NUMBER1 PIC 9(3).
05 WS-COUNTRY1 PIC X(5).
05 WS-PINCODE1 PIC 9(6).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 123456789 TO WS-NUM1.
MOVE WS-NUM1 TO WS-NUM2 WS-NUM3.
MOVE WS-NUM1(3:6) TO WS-NUM4.
MOVE 123 TO WS-HOUSE-NUMBER.
MOVE 'INDIA' TO WS-COUNTRY.
MOVE 112233 TO WS-PINCODE.
MOVE WS-ADDRESS TO WS-ADDRESS1.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUM4 : " WS-NUM4
DISPLAY "WS-ADDRESS : " WS-ADDRESS
DISPLAY "WS-ADDRESS1 : " WS-ADDRESS1
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : 123456789
WS-NUM2 : 123456789
WS-NUM3 : 56789
WS-NUM4 : 345678
WS-ADDRESS : 123INDIA112233
WS-ADDRESS1 : 123INDIA112233
合法移动
下表给出了关于合法的移动信息:
字母 | 字母数字 | 数字 | |
字母 | Possible | Possible | Not Possible |
字母数字 | Possible | Possible | Possible |
数字 | Not Possible | Possible | Possible |
添加动词
添加动词是用来将两个或多个数字和结果存储在目标操作数。以下是其中可以使用的语法:
语法
以下是语法来将两个或多个数字:
ADD A B TO C D
ADD A B C TO D GIVING E
ADD CORR WS-GROUP1 TO WS-GROUP2
在语法-1,A,B,C添加和结果存储在C(C = A+ B + C)。 A,B,D补充和结果保存在D(D = A + B+ D)。
在语法2中,A,B,C,D添加和结果存储在E(E = A + B + C + D)
在语法3,附属小组项目中WS-Group1和WS_GROUP2相加,结果存储在WS-GROUP2。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 10.
01 WS-NUM4 PIC 9(9) VALUE 10.
01 WS-NUMA PIC 9(9) VALUE 10.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9) VALUE 10.
01 WS-NUMD PIC 9(9) VALUE 10.
01 WS-NUME PIC 9(9) VALUE 10.
PROCEDURE DIVISION.
ADD WS-NUM1 WS-NUM2 TO WS-NUM3 WS-NUM4.
ADD WS-NUMA WS-NUMB WS-NUMC TO WS-NUMD GIVING WS-NUME.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUM4 : " WS-NUM4
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
DISPLAY "WS-NUMD : " WS-NUMD
DISPLAY "WS-NUME : " WS-NUME
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : 000000010
WS-NUM2 : 000000010
WS-NUM3 : 000000030
WS-NUM4 : 000000030
WS-NUMA : 000000010
WS-NUMB : 000000010
WS-NUMC : 000000010
WS-NUMD : 000000010
WS-NUME : 000000040
减法动词
减法动词用于减法运算。以下是其中可以使用的语法:
语法
以下是语法减法运算:
SUBTRACT A B FROM C D
SUBTRACT A B C FROM D GIVING E
SUBTRACT CORR WS-GROUP1 TO WS-GROUP2
在语法-1,A,B相加,并从C结果中减去存储在C(C = C-(A + B))。 A,B被添加,并从D.结果减去存放在D(D = D-(A + B))。
在语法-2,A,B,C添加,并从D结果中减去存储在E(E = D-(A + B+ C))
在语法3,附属小组项目,在WS-Group1和WS_GROUP2被减去结果存储在WS-GROUP2。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 100.
01 WS-NUM4 PIC 9(9) VALUE 100.
01 WS-NUMA PIC 9(9) VALUE 10.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9) VALUE 10.
01 WS-NUMD PIC 9(9) VALUE 100.
01 WS-NUME PIC 9(9) VALUE 10.
PROCEDURE DIVISION.
SUBTRACT WS-NUM1 WS-NUM2 FROM WS-NUM3 WS-NUM4.
SUBTRACT WS-NUMA WS-NUMB WS-NUMC FROM WS-NUMD GIVING WS-NUME.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUM4 : " WS-NUM4
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
DISPLAY "WS-NUMD : " WS-NUMD
DISPLAY "WS-NUME : " WS-NUME
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : 000000010
WS-NUM2 : 000000010
WS-NUM3 : 000000080
WS-NUM4 : 000000080
WS-NUMA : 000000010
WS-NUMB : 000000010
WS-NUMC : 000000010
WS-NUMD : 000000100
WS-NUME : 000000070
乘法动词
乘法动词用于乘法运算。以下是其中可以使用的语法:
语法
以下是语法来将两个或多个数字相乘:
MULTIPLY A BY B C
MULTIPLY A BY B GIVING E
在语法-1,相乘A,B和存储结果B(B = A B)。相乘由C和存储结果C(C = A C)。
在语法2,相乘A,B和存储结果E(E = A * B)。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 10.
01 WS-NUMA PIC 9(9) VALUE 10.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9) VALUE 10.
PROCEDURE DIVISION.
MULTIPLY WS-NUM1 BY WS-NUM2 WS-NUM3.
MULTIPLY WS-NUMA BY WS-NUMB GIVING WS-NUMC.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : 000000010
WS-NUM2 : 000000100
WS-NUM3 : 000000100
WS-NUMA : 000000010
WS-NUMB : 000000010
WS-NUMC : 000000100
除法动词
除以动词用于除法运算。以下是其中可以使用的语法:
语法
以下是除法运算的语法:
DIVIDE A INTO B
DIVIDE A BY B GIVING C REMAINDER R
在语法-1,B除以A和结果存储在B(B= B / A)。
在语法-2,A除以B和结果除以存放在C(C = A/ B)和余数被存储在R。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 5.
01 WS-NUM2 PIC 9(9) VALUE 250.
01 WS-NUMA PIC 9(9) VALUE 100.
01 WS-NUMB PIC 9(9) VALUE 15.
01 WS-NUMC PIC 9(9).
01 WS-REM PIC 9(9).
PROCEDURE DIVISION.
DIVIDE WS-NUM1 INTO WS-NUM2.
DIVIDE WS-NUMA BY WS-NUMB GIVING WS-NUMC REMAINDER WS-REM.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
DISPLAY "WS-REM : " WS-REM
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : 000000005
WS-NUM2 : 000000050
WS-NUMA : 000000100
WS-NUMB : 000000015
WS-NUMC : 000000006
WS-REM : 000000010
计算表
计算语句用来写COBOL的算术表达式。这是一个替代加,减,乘,除。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 10.
01 WS-NUMA PIC 9(9) VALUE 50.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9).
PROCEDURE DIVISION.
COMPUTE WS-NUMC= (WS-NUM1 * WS-NUM2) - (WS-NUMA / WS-NUMB) + WS-NUM3.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 : 000000010
WS-NUM2 : 000000010
WS-NUM3 : 000000010
WS-NUMA : 000000050
WS-NUMB : 000000010
WS-NUMC : 000000105
COBOL数据布局 - COBOL教程
COBOL布局是使用每个字段的说明和值出现。以下是在COBOL中使用的数据描述项:
- 重新定义子句
- 重命名子句
- 用法子句
- 复写簿
重新定义子句
重新定义子句用于定义相同的存储与不同的数据的描述。如果一个或多个数据项都不会同时使用,则在相同的存储可用于另一个数据项。所以同一个存储可以被称为具有不同的数据项。
语法
以下是语法重新定义子句:
01 WS-OLD PIC X(10).
01 WS-NEW1 REDEFINES WS-OLD PIC 9(8).
01 WS-NEW2 REDEFINES WS-OLD PIC A(10).
以下是使用参数的详细信息:
- WS-OLD是重新定义的项
- WS-NEW1 和 WS-NEW2 是重新定义的项
重新定义的信息并重新确定项目的级别数必须是相同的,它不能是66或88级数。不要使用VALUE子句与重新定义项。在文件部分,不要使用重定义子句与01级号。重新定义的定义必须要重新定义下一个数据描述。重新定义的项目将始终具有相同的值重新定义的项。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DESCRIPTION.
05 WS-DATE1 VALUE '20140831'.
10 WS-YEAR PIC X(4).
10 WS-MONTH PIC X(2).
10 WS-DATE PIC X(2).
05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8).
PROCEDURE DIVISION.
DISPLAY "WS-DATE1 : "WS-DATE1.
DISPLAY "WS-DATE2 : "WS-DATE2.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-DATE1 : 20140831
WS-DATE2 : 20140831
重命名子句
重命名子句用于为现有的数据项赋予不同的名称。它被用于重新组数据的名称,并将它们赋予了新名字。新的数据名称可以跨组或基本项目重新命名。 66级号在重命名保留。
语法
以下是重命名子句的语法:
01 WS-OLD.
10 WS-A PIC 9(12).
10 WS-B PIC X(20).
10 WS-C PIC A(25).
10 WS-D PIC X(12).
66 WS-NEW RENAMES WS-A THRU WS-C.
重命名有可能在只相同的级别。在上面的例子中的WS-A,WS-B和WS-C处于同一水平。重命名定义必须要重命名的下一个数据描述。不要使用重命名为01,77或66级数。用于重命名数据名称必须为一个序列。当前子句数据项不能被重新命名。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DESCRIPTION.
05 WS-NUM.
10 WS-NUM1 PIC 9(2) VALUE 20.
10 WS-NUM2 PIC 9(2) VALUE 56.
05 WS-CHAR.
10 WS-CHAR1 PIC X(2) VALUE 'AA'.
10 WS-CHAR2 PIC X(2) VALUE 'BB'.
66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2.
PROCEDURE DIVISION.
DISPLAY "WS-RENAME : " WS-RENAME.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-RENAME : 56AABB
用法子句
用法子句通知,其中格式数据被存储在操作系统。它不能用于具有66或88级数。如果用法子句在组中指定了所有的基本项目将有相同的用法子句。以下是不同的选择和使用子句:
显示
数据项被存储在ASCII格式和每个字符需要1个字节。这是缺省情况下使用。
例如,计算所需的字节数:
01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY.
It requires 8 bytes as sign and decimal doesn't require any byte.
01 WS-NUM PIC 9(5) USAGE IS DISPLAY.
It requires 5 bytes as sign.
计算/ COMP
数据项被存储在二进制格式。在这个数据项必须是整数。
例如,计算所需的字节数:
01 WS-NUM PIC S9(n) USAGE IS COMP.
If 'n' = 1 to 4, it takes 2 bytes.
If 'n' = 5 to 9, it takes 4 bytes.
If 'n' = 10 to 18, it takes 8 bytes.
COMP-1
数据项是类似于实数或浮点数,并表示为单精度浮点数。内部数据存储在十六进制格式。在这种不指定PIC子句。在这里,1字等于4个字节。
COMP-2
数据项是类似龙或双并表示为双精度浮点数。内部数据存储在十六进制格式。在这种不指定PIC子句。这2个字等于8个字节。
COMP-3
数据项是包十进制格式存储。每个数字占半个字节(1四位)和符号储存在最右边四位。
例如,计算所需的字节数:
01 WS-NUM PIC 9(n) USAGE IS COMP.
Number of bytes = n/2 (If n is even)
Number of bytes = n/2 + 1(If n is odd, consider only integer part)
01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21.
It requires 2 bytes of storage as each digit occupies half a byte.
01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21.
It requires 3 bytes of storage as each digit occupies half a byte.
复写薄
COBOL复写簿选择定义数据结构的代码。如果一个特定的数据结构用于写入相同数据结构的多个程序然后代替再次,我们可以使用复写簿。我们使用COPY语句,包括复写簿程序。 COPY语句用在工作-存储部分。
例子包显示复写簿的COBOL程序:
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY ABC.
在这里,ABC是复写簿的名字。下面在ABC字帖数据项可以使用内部程序。
01 WS-DESCRIPTION.
05 WS-NUM.
10 WS-NUM1 PIC 9(2) VALUE 20.
10 WS-NUM2 PIC 9(2) VALUE 56.
05 WS-CHAR.
10 WS-CHAR1 PIC X(2) VALUE 'AA'.
10 WS-CHAR2 PIC X(2) VALUE 'BB'.
COBOL条件语句 - COBOL教程
条件语句是用于改变根据由程序员指定的特定条件下的执行流程。条件语句将总是为真或假。条件是使用在如果,计算和执行的语句。不同类型的条件如下:
- if条件语句
- 关系条件
- 签名条件
- 类条件
- 条件名条件
- 取反条件
- 组合条件
if条件语句
if语句检查的条件。如果条件为True IF块被执行,如果条件为假ELSE块被执行。
END-IF被用来结束IF块。到结束可以用来代替END-IF IF块。但最好使用END IF的多个if块。
嵌套IF:IF 模块出现另一个IF块内。没有限制嵌套IF语句。
语法
以下是语法如果条件语句:
IF [condition] THEN
[COBOL statements]
ELSE
[COBOL statements]
END-IF.
实例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
01 WS-NUM3 PIC 9(5).
01 WS-NUM4 PIC 9(6).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1 WS-NUM3.
MOVE 15 TO WS-NUM2 WS-NUM4.
IF WS-NUM1 > WS-NUM2 THEN
DISPLAY 'IN LOOP 1 - IF BLOCK'
IF WS-NUM3 = WS-NUM4 THEN
DISPLAY 'IN LOOP 2 - IF BLOCK'
ELSE
DISPLAY 'IN LOOP 2 - ELSE BLOCK'
END-IF
ELSE
DISPLAY 'IN LOOP 1 - ELSE BLOCK'
END-IF.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK
关系条件
关系的条件是用来评估真假的两个数值。数字字段的代数比较不论大小和用法子句完成。
对于非数字操作数
如果两个相同大小的非数字操作数进行比较,然后字符进行比较,从左边的对应的位置,直到结束为止。含大字符操作数被声明更大。
如果不相等大小的两个非数字操作数进行比较,然后在较短的数据项被追加了位已经结束,直到操作数的大小成为相等,然后根据在先前的点所提到的规则相比较。
语法
以下是关系的条件语句的语法:
[Data Name/Arithmetic Operation]
[IS] [NOT]
[Equal to (=),Greater than (>), Less than (<),
Greater than or Equal (>=), Less than or equal (<=) ]
[Data Name/Arithmetic Operation]
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1.
MOVE 15 TO WS-NUM2.
IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
ELSE
DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
END-IF.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 IS GREATER THAN WS-NUM2
签名条件
签名条件用于检查数字操作数的符号。操作数可以是:
语法
以下是签名条件语句的语法:
[Data Name/Arithmetic Operation]
[IS] [NOT]
[Positive, Negative or Zero]
[Data Name/Arithmetic Operation]
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC S9(9) VALUE -1234.
01 WS-NUM2 PIC S9(9) VALUE 123456.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS POSITIVE THEN
DISPLAY 'WS-NUM1 IS POSITIVE'.
IF WS-NUM1 IS NEGATIVE THEN
DISPLAY 'WS-NUM1 IS NEGATIVE'.
IF WS-NUM1 IS ZERO THEN
DISPLAY 'WS-NUM1 IS ZERO'.
IF WS-NUM2 IS POSITIVE THEN
DISPLAY 'WS-NUM2 IS POSITIVE'.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE
类条件
签名条件用来判断是否操作数只包含字母或数字数据。空间被认为是 ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER.
语法
以下是类条件语句的语法:
[Data Name/Arithmetic Operation>]
[IS] [NOT]
[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]
[Data Name/Arithmetic Operation]
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
01 WS-NUM2 PIC 9(9) VALUE 123456789.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS ALPHABETIC THEN
DISPLAY 'WS-NUM1 IS ALPHABETIC'.
IF WS-NUM1 IS NUMERIC THEN
DISPLAY 'WS-NUM1 IS NUMERIC'.
IF WS-NUM2 IS NUMERIC THEN
DISPLAY 'WS-NUM1 IS NUMERIC'.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-NUM1 IS ALPHABETIC
WS-NUM1 IS NUMERIC
条件-名称条件
一个条件名称是用户定义的名称。它包含由用户设置指定的值。它的行为就像布尔变量。他们定义了88级数。它不会有一个PIC子句。
语法
以下是用户定义的条件语句的语法:
88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC 9(3).
88 PASS VALUES ARE 041 THRU 100.
88 FAIL VALUES ARE 000 THRU 40.
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 65 TO WS-NUM.
IF PASS
DISPLAY 'Passed with ' WS-NUM ' marks'.
IF FAIL
DISPLAY 'FAILED with ' WS-NUM 'marks'.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
Passed with 065 marks
取反条件
取反条件使用NOT关键字给出。如果情况为true,我们已经不考虑在它前面,,它的最终值将为false。
语法
以下是取反条件语句的语法:
IF NOT [CONDITION]
COBOL Statements
END-IF.
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(9) VALUE 25.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
DISPLAY 'IF-BLOCK'
ELSE
DISPLAY 'ELSE-BLOCK'
END-IF.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
ELSE-BLOCK
组合条件
组合条件中包含两个或更多的条件通过使用逻辑运算符AND或OR。
语法
以下是组合条件语句的语法:
IF [CONDITION] AND [CONDITION]
COBOL Statements
END-IF.
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(2) VALUE 25.
01 WS-NUM3 PIC 9(2) VALUE 20.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
DISPLAY 'Both condition OK'
ELSE
DISPLAY 'Error'
END-IF.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
Both condition OK
计算动词
计算动词是更换一系列if-else语句。它可以被用于计算一个以上的条件。它类似于在C程序中的switch语句。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
MOVE 3 TO WS-A.
EVALUATE TRUE
WHEN WS-A > 2
DISPLAY 'WS-A GREATER THAN 2'
WHEN WS-A < 0
DISPLAY 'WS-A LESS THAN 0'
WHEN OTHER
DISPLAY 'INVALID VALUE OF WS-A'
END-EVALUATE.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-A GREATER THAN 2
COBOL循环语句 - COBOL教程
有一些任务需要执行一遍又一遍,如读取文件中的每个记录,直到结束为止。以下是在COBOL中使用的循环语句:
- 执行直通
- 执行直到
- 执行时间
- 进行时变
执行直通
完成直通所使用的序列在给第一个和最后一段的名字来执行一系列段落。执行最后一段控件后会返回。
一行进行
里面的PERFORM语句将直到结束,PERFORM达成执行。
语法
以下是语法在一行进行:
PERFORM
DISPLAY 'HELLO WORLD'
END-PERFORM.
多行执行
语句是在一个段中执行,然后控制被转移到其他段或部分。
语法
以下是多行执行的语法:
PERFORM PARAGRAPH1 THRU PARAGRAPH2
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
A-PARA.
PERFORM DISPLAY 'IN A-PARA'
END-PERFORM.
PERFORM C-PARA THRU E-PARA.
B-PARA.
DISPLAY 'IN B-PARA'.
STOP RUN.
C-PARA.
DISPLAY 'IN C-PARA'.
D-PARA.
DISPLAY 'IN D-PARA'.
E-PARA.
DISPLAY 'IN E-PARA'.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
IN A-PARA
IN C-PARA
IN D-PARA
IN E-PARA
IN B-PARA
执行直到
在执行之前,段将被执行,直到给定的条件为真。与之前的测试是默认的状态,表示条件在一段语句执行前检查。
语法
以下是执行直到的语法:
PERFORM A-PARA UNTIL COUNT=5
PERFORM A-PARA WITH TEST BEFORE UNTIL COUNT=5
PERFORM A-PARA WITH TEST AFTER UNTIL COUNT=5
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CNT PIC 9(1) VALUE 0\.
PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA WITH TEST AFTER UNTIL WS-CNT>3.
STOP RUN.
B-PARA.
DISPLAY 'WS-CNT : 'WS-CNT.
ADD 1 TO WS-CNT.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-CNT : 0
WS-CNT : 1
WS-CNT : 2
WS-CNT : 3
执行时期
在执行时期,段将被执行指定的次数。
语法
以下是执行时间的语法:
PERFORM A-PARA 5 TIMES.
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA 3 TIMES.
STOP RUN.
B-PARA.
DISPLAY 'IN B-PARA'.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
IN B-PARA
IN B-PARA
IN B-PARA
执行时变
在执行不同的段会直到,直到短语变成真的条件来执行。
语法
以下是进行改变的语法:
PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A=5.
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA VARYING WS-A FROM 1 BY 1 UNTIL WS-A=5
STOP RUN.
B-PARA.
DISPLAY 'IN B-PARA ' WS-A.
JCL执行以上COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
IN B-PARA 1
IN B-PARA 2
IN B-PARA 3
IN B-PARA 4
GO TO 语句
GO TO语句用于改变程序的执行流程。在GO TO语句传递仅在前进方向去。它用于退出该段。不同类型的GO TO语句是:
无条件GO TO
GO TO para-name.
条件GO TO
GO TO para-1 para-2 para-3 DEPENDING ON x.
如果“x”等于1,那么控制将被传递到第一段和如果'x'是等于2,则控制将被转移到第二个段落等等。
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 2.
PROCEDURE DIVISION.
A-PARA.
DISPLAY 'IN A-PARA'
GO TO B-PARA.
B-PARA.
DISPLAY 'IN B-PARA '.
GO TO C-PARA D-PARA DEPENDING ON WS-A.
C-PARA.
DISPLAY 'IN C-PARA '.
D-PARA.
DISPLAY 'IN D-PARA '.
STOP RUN.
JCL以上COBOL程序执行。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
IN A-PARA
IN B-PARA
IN D-PARA
COBOL字符串处理 - COBOL教程
在COBOL语言字符串处理语句用于对字符串执行多的功能操作。以下是字符串处理语句:
- 检查
- 字符串
- 非字符串
检查
检查动词是用来计数或字符串中的字符替换。字符串操作可以在字母,数字或字母进行。检查操作是从左至右的字符进行。是用于字符串操作的选项如下:
清点
清点选项用于计数字符串的字符。
语法
以下是tallying选项语法理:
INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS
以下是使用的参数的详细信息:
- 输入字符串:字符串的字符进行计数
- 输出计数:数据项保持的字符计数
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CNT1 PIC 9(2) VALUE 0.
01 WS-CNT2 PIC 9(2) VALUE 0.
01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
PROCEDURE DIVISION.
INSPECT WS-STRING TALLYING WS-CNT1 FOR ALL CHARACTERS.
DISPLAY "WS-CNT1 : "WS-CNT1.
INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'.
DISPLAY "WS-CNT2 : "WS-CNT2
STOP RUN.
JCL执行以上COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-CNT1 : 15
WS-CNT2 : 06
替换
替换选项用于替换的字符串的字符。
语法
以下是替换选项的语法:
INSPECT input-string REPLACING ALL char1 BY char2.
以下是使用的参数的详细信息:
- 输入字符串:字符串的字符将被从char1替换char2
示例
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
PROCEDURE DIVISION.
DISPLAY "OLD STRING : "WS-STRING.
INSPECT WS-STRING REPLACING ALL 'A' BY 'X'.
DISPLAY "NEW STRING : "WS-STRING.
STOP RUN.
JCL执行以上COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
OLD STRING : ABCDACDADEAAAFF
NEW STRING : XBCDXCDXDEXXXFF
字符串
串动词是用来连接字符串。使用STRING语句,字符的两个或更多个字符串可以被组合以形成一个更长的字符串。分隔的By子句是强制性的。
语法
以下是动词的字符串的语法:
STRING ws-string1 DELIMITED BY SPACE
ws-string2 DELIMITED BY SIZE
INTO ws-destination-string
WITH POINTER ws-count
ON OVERFLOW DISPLAY message1
NOT ON OVERFLOW DISPLAY message2
END-STRING.
以下是使用的参数的详细信息:
- ws-string1 和 ws-string2 : 要连接的输入字符串
- ws-string : 输出字符串
- ws-count : 用来计算新的连接字符串的长度
- 分隔符的指定字符串的末尾
- 指针和溢出是可选的
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30).
01 WS-STR1 PIC A(15) VALUE 'Yiibai'.
01 WS-STR2 PIC A(7) VALUE 'Welcome'.
01 WS-STR3 PIC A(7) VALUE 'To AND'.
01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
STRING WS-STR2 DELIMITED BY SIZE
WS-STR3 DELIMITED BY SPACE
WS-STR1 DELIMITED BY SIZE
INTO WS-STRING
WITH POINTER WS-COUNT
ON OVERFLOW DISPLAY 'OVERFLOW!'
END-STRING.
DISPLAY 'WS-STRING : 'WS-STRING.
DISPLAY 'WS-COUNT : 'WS-COUNT.
STOP RUN.
JCL执行以上COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-STRING : WelcomeToYiibai
WS-COUNT : 25
Unstring
Unstring动词是用来分割一个字符串中为多个子字符串。分隔的By子句是强制性的。
语法
以下是Unstring动词的语法:
UNSTRING ws-string DELIMITED BY SPACE
INTO ws-str1, ws-str2
WITH POINTER ws-count
ON OVERFLOW DISPLAY message
NOT ON OVERFLOW DISPLAY message
END-UNSTRING.
例子
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30) VALUE 'WELCOME TO TUTORIALSPOINT'.
01 WS-STR1 PIC A(7).
01 WS-STR2 PIC A(2).
01 WS-STR3 PIC A(15).
01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
UNSTRING WS-STRING DELIMITED BY SPACE
INTO WS-STR1, WS-STR2, WS-STR3
END-UNSTRING.
DISPLAY 'WS-STR1 : 'WS-STR1.
DISPLAY 'WS-STR2 : 'WS-STR2.
DISPLAY 'WS-STR3 : 'WS-STR3.
STOP RUN.
JCL执行以上COBOL程序。
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=HELLO
当编译并执行上面的程序它会产生以下结果:
WS-STR1 : WELCOME
WS-STR2 : TO
WS-STR3 : TUTORIALSPOINT




