COBOL 基本动词
COBOL动词用于过程部中的数据处理。每个语句总是以COBOL动词开头。有几种具有不同动作类型的COBOL动词。
Input(输入)/Output(输出)动词
输入/输出动词用于从用户获取数据,并显示COBOL程序的输出。下面两个动词用于这一过程:
Accept动词
Accept 动词用于从操作系统或直接从用户获取诸如日期,时间和天等数据。如果程序从用户接收数据,那么就需要通过JCL传递。在从操作系统获取数据时,FROM选项则如下面例子所示:
ACCEPT WS-STUDENT-NAME.
ACCEPT WS-DATE FROM SYSTEM-DATE.
Display动词
Display动词用于显示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-DATE FROM DATE.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 *
TutorialsPoint
/*
当你编译和执行上面的程序,会产生以下结果:
Name : TutorialsPoint
Date : 2014-08-30
Initialize(初始化)动词
Initialize 动词被用来初始化组项或基本项。数据名为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(移动)动词
移动动词是用来将数据从源数据复制到目标数据的。它可以用于基本和组数据项。对于组数据项,使用MOVE CORRESPONDING/CORR。在尝试其它选项的时候,MOVE CORR不工作;但是在大型机服务器上工作。
对于从字符串移动数据,则使用MOVE(x:l),其中x是起始位置,l是长度。如果目标数据项PIC子句少于源数据项PIC子句,则数据将被截断。如果目标数据项PIC子句多于源数据项PIC子句,则将添加额外的ZEROS或SAPCES字节。从下面的例子可以清楚的看到:
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
合法移动
下表给出了有关合法移动的信息:
字母 | 字母数字 | 数字 | |
---|---|---|---|
字母 | 可能 | 可能 | 不可能 |
字母数字 | 可能 | 可能 | 可能 |
数字 | 不可能 | 可能 | 可能 |
Add(加法)动词
加法动词用于两个或多个数字相加,并将结果存储在目标运算对象中。
语法
以下为两个或多个数字相加的语法:
ADD A B TO C DADD A B C TO D GIVING EADD 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(减法)动词
减法动词用于减法运算。
语法
下面给出的是减法运算的语法:
SUBTRACT A B FROM C DSUBTRACT A B C FROM D GIVING ESUBTRACT 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(乘法)动词
乘法动词用于乘法运算。
语法
下面是两个或多个数字相乘的语法:
MULTIPLY A BY B CMULTIPLY A BY B GIVING E
在语法句1中,A和B相乘,结果存储在B(B=AB)。A和C相乘,结果存储在C(C=AC)。
在语法句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(除法)动词
除法动词用于除法运算。
语法
下面是除法运算的语法:
DIVIDE A INTO BDIVIDE 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
Compute(计算)语句
计算语句用于在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