CHAPTER 2 过程部初步-----最基本的过程部语句
一。输入输出语句。?
1。ACCEPT语句:直接从终端键盘或系统指定的输入设备上输入数据。?
???? ACCEPT?? 标识符 [FROM 助忆名]?
注:A。标识符(identifier)指的是能唯一地标识一个数据项的数据名,不能唯一地标识一个?
????????????? 数据项的数据名不是标识符。标识符可以是组合项。?
??????? B。在ACCEPT语句中如不写FROM部分,如ACCEPT?? A? ,则表示从系统隐含指定的?
?????????????? 设备上读入一个数据给A。 如果不想从指定的设 备上输入,则要用FROM 选项,?
?????????????? 这时“助忆名”需要在环境部中事先说明和那种外部设备相联系。如:?
ENVIRONMENT??? DIVISION。(环境部)?
CONFIGRATION? SECTION。(配置节)?
SPECIAL-NAMES。(专用名段)?
CONSOLE?? IS? ABC?
如在过程部中有 ACCEPT? T? FROM ABC。 则表示要从控制台接收数据?
2。DISPLAY语句:从计算机内存中输出到某一指定的输出设备上。?
???? DISPLAY? { 标识符1,常量1}[标识符2,常量2]。。。[UPON 助忆名]?
?????????????????????? ( 标识符和助忆名的说明同上)?
???? ACCEPT语句和DISPLAY语句不必定义文件适用于少量的数据输入输出。?
3。READ语句:COBOL语言中数据的输入输出主要是通过对外部文件的读写进行的。READ 语句就是从外部文件上读入数据输 出到程序中的数据项中。在程序中用到的所有文件都需要在环境部中指定程序中用到的文件名与实际外部文件的联系。数据部也要对文件加以描述。指定数据结构各数据项所占的内存单元长度以及数据形式。?
???? COBOL 的存取是以文件为对象以记录为单位的。?
READ语句的最简单的格式为:?READ?文件名?
?
??ENVIRONMENT?DIVISION。?
??INPUT-OUTPUT?SECTION。?
??FILE-CONTROL。?
????????? SELECT????? IN-FILLE??? ASSIGN? TO????? 外部文件名。?
为了存储读入的记录,必须在内存开辟一个与文件记录长度相等的存储区,即‘输入文件纪录区’。每一个输入文件都有相应的‘输入文件纪录区’,与之一一对应。亦即在数据部中描述文件的数据结构。?
3。READ语句:
???? 假设?? IN-FILE? 文件每一记录中包含的内容为:产品代码,产品数量,产品单价,生产日期。设某一记录的具体数据?
???? 如下:0? 0? 1? 0? 0? 1? 0? 0? 0? 0? 0? 1? 0? 0? 0? 1? 9? 9? 9? 0? 3? 2? 2?
???????????????? prodcode??? quantity??????? price?????????????? year????? mon? day?
???? 如果我们希望读入该记录并对各数据项进行处理,则需要在? ‘输入纪录区’中划分出各数据项,以便存放相应的数据。定义输入纪录区以及划分记录区中各数据项的工作是由数据部来完成的。下面我们简单介绍数据部定义记录区方法,针对上面输入数据的特点,我们可以在数据部中对记录区作如下描述:?
?DATA?DIVISION。?
?FD???? IN-FILE?? LABLE??? RECORD? IS?? STANDARD。?
?01????? IN-RECORD。?? (定义记录区名为IN-RECORD)?
?????????? 02???? PROD-CODE?PIC?? 9(4)。?
?????????? 02???? PROD-QUANTITY?PIC?? 9(5)。?
?????????? 02???? PROD-PRICE?PIC?? 9(6)。?
?????????? 02???? MANU-DATE。(生产日期为一组合项)?
??????????????????? 05?? DATE-CCYY?PIC?? 9(4)。?
??????????????????? 05?? DATE-MM?PIC?? 9(2)。?
??????????????????? 05?? DATE-DD?PIC?? 9(2)。
其中,FD 即 FILE DESCRIPTION,表示从该行起是‘文件描述体’。?
LABLE RECORD IS STANDARD :所有的磁盘文件和磁带文件都必须写明此句。?
01 层定义‘输入纪录区’ 的名字为IN-RECORD,由于 01层属于FD描述体,因此也就指定了 IN-RECORD 和 IN-FILE 的关系。亦即从IN-FILE 读入的数据存放在 IN-RECORD记录区中。?
这样,在执行一次READ语句后,文件中一个记录的数据便输入到内存记录区,按排列顺序分别送到记录区中各数据项中。注意文件的各记录中的数据是不分数据项的,只是按一定的顺序把数据存放在各字节中。所以数据部对记录区中各数据项的描述应该与文件的记录中各数据排列次序和长度相一致。
READ 语句的一般形式:READ???? 文件名?? RECORD [INTO? 标识符]? [AT?? END? 执行语句] , 例如:?
????? READ? IN-FILE?? INTO TEMP-RECORD?? AT? END?? STOP? RUN? 该语句除了将读到的数据传送到IN-RECORD之外,还传送到TEMP-RECORD中。在遇到文件尾时,程序结束运行。
4。WRITE语句:将内存中的数据输出到外部设备,主要是由WRITE 语句来完成的。WRITE语句的最简单的格式为:?
????? WRITE??????? 记录名 (注意WRITE语句的操作对象是记录,所以是‘记录名’而不是‘文件名’)??
???? 与输入文件相似输出文件也要在环境部中指定所对应的实际存在的外部文件:?
??ENVIRONMENT?DIVISION。?
??INPUT-OUTPUT?SECTION。?
??FILE-CONTROL。?
????????? SELECT????? OUT-FILLE??? ASSIGN? TO????? 打印机名。?
也要在数据部中定义输出记录区:?
?DATA?DIVISION。?
?FD???? OUT-FILE?? LABLE??? RECORD? IS?? OMITTED。?
?01????? OUT-RECORD。???
?????????? 02???? PROD-CODE?PIC?? 9(4)。?
?????????? 02???? PROD-QUANTITY?PIC?? 9(5)。?
?????????? 02???? PROD-PRICE?PIC?? 9(6)。?
?????????? 02???? MANU-DATE?
??????????????????? 05?? DATE-CCYY?PIC?? 9(4)。?
??????????????????? 05?? DATE-MM?PIC?? 9(2)。?
??????????????????? 05?? DATE-DD?PIC?? 9(2)。?
LABLE RECORD IS OMITTED :凡输出设备是打印机的都必须写明此句。如输出设备是磁盘,则仍用LABLE RECORD IS STANDARD。?
01 层定义‘输出纪录区’ 的名字为OUT-RECORD,由于 01层属于FD描述体,因此也就指定了?
OUT-RECORD 和OUT-FILE 的关系。
在用WRITE 语句输出一个记录之前,应向输出记录区传送数据。如已将数据传送到上述各数据项中,则在执行 W RITE?? OUT-RECORD 语句后,则记录区中的数据通过打印机打印出来。
WRITE 语句的一般形式:???????????????????? 标识符 2?LINE?
????????????????????? BEFORE?????????????????? 整数??LINES?
?????? WRITE???? 记录名? [FROM? 标识符 1 ]?????? AFTER???????? ADVANCING????????? 助忆名???
????????????????????? PAGE?
5。OPEN语句:程序中如果需要读写文件,则该文件必须先用OPEN语句打开,系统在执行READ,WRITE以前先检查该文件是否已在规定的外部设备上准备就绪。?
????? OPEN语句的一般格式为:
??INPUT?文件名1 [,文件名2]。。。?
? OPEN? ?OUTPUT?文件名3 [,文件名4]。。。???? 。。。?
6。CLOSE语句:当对一个文件的读或写的操作已完成,就应关闭该文件。?
????? CLOSE语句的一般格式为:??
?CLOSE?文件名? 1?? [,文件名2]。。。
COBOL通过2位长度的文件状态字(FILE-STATUS)来表示文件的操作结果是否成功,常见的文件状态值及意义:?
?
二。算数运算语句
1。ADD语句:?
?格式1:ADD??? ?标识符1?,标识符2。。。? TO 标识符m [,标识符n]。。。?
???常量1?,常量2
?格式2:ADD??? ?标识符1???? ,标识符2????? ,标识符3?
???常量1???????? ,常量2????????? ,常量3
??? 。。。GIVING 标识符m [,标识符n]。。。
2。SUBTRACT语句:?
???? 格式1:SUBTRACT?????? 标识符1?,标识符2 。。。 FROM 标识符m [,标识符n]。。。?
???????????????????????????? 常量1?,常量2
???? 格式2:SUBTRACT?????? 标识符1????? ,标识符2?? 。。。? FROM????? 标识符??
?????????????? ??????? ??????????? 常量1????????? ,常量2?????????????????????????????????????? 常量?
?????GIVING 标识符n [,标识符p]。。。
3。MULTIPLY语句:?
???? 格式1:MULTIPLY??????? 标识符1???????? BY?标识符2 [,标识符3]。。。?
????????????????????????????? 常量1,?
???? 格式2:MULTIPLY??????? 标识符1???????? BY?标识符2? GIVING 标识符3 [,标识符4]。。。?
????????????????????????????? 常量1?,?常量2?
4。DIVIDE语句:?
???? 格式1:DIVIDE????????????? 标识符1???????? INTO?标识符2 [,标识符3]。。。?
????????????????????????????? 常量1 ?
???? 格式2:DIVIDE???????????? 标识符1???????? INTO?标识符2? GIVING 标识符3 [,标识符4]。。。?
??????????????????????????? 常量1? BY?常量2
???? 注意:?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??
5。COMPUTE 语句:?
???????????????? COMPUTE?????????? 标识符1? [,标识符2 ]。。。= 算术表达式?
???????????????? 运算的优先级由高到低顺序为:(),正负号? ,** ,* 或? /?? ,+ 或 -?
???????????????? 如:C = 3 ,D = 5 ,E = 2 , F = 1 则:?
???????????????? COMPUT?? A,B = -(C + D)* 2 /? E ** 3 -? F = -3?
三。传送语句 (MOVE)?
??????? MOVE 语句用来实现内存中数据的传送(而不是内存和外设之间的传送)。?
??????? MOVE语句的一般格式为:?
?MOVE????????? 标识符1??????? TO????????? 标识符2 [,标识符3]。。。?
????????????????????? 常量1???
MOVE语句的传送规则:?
?1,如果接收项和发送项在数据部中描述的类型和长度相同,则按字节一一对应传送。?
?2,如果接收项和发送项长度不相同,而二者都是数值数据项,则按小数点对齐处理。?
?3,对字母或字符数据(非数值型数据)的传送,按左对齐处理。?
?4,初等项和组合项之间可以相互传送。?
??????? 关于各类数据之间的传送规则将在第五章中介绍。?
四。转移语句(GO? TO)?
??????? 当需要使程序改变正常执行的顺序时,可以使用无条件转移语句 GO? TO 。其一般格式为:?
??????? 格式1:?GO???????? TO???? 过程名?
??????? 格式2:????? GO????????? TO??? 过程名1? [,过程名2]。。过程名n?? DEPENDING??? ON????? 标识符?
????????
??????? 注意:只能转移到段或节的开头,不能转移到段或节的当中某一语句。段名或节名为过程名。?
五。条件语句(IF)?
??????? 当需要根据给出的某些条件是否满足来决定应执行哪一部分语句时,可以使用条件语句IF。?
??????? 其一般格式为:?
???????? ?IF???????? 条件???? 语句组1?????????????? ELSE?????? 语句组1?????????????????? [END-IF]?
????? ????????????????????????? NEXT? SENTENCE??????? ????????????? NEXT? SENTENCE?
??????????????????????
???????? COBOL关系运算符: ?IS???????? GREATER???? THAN??? (>)?
???IS???????? LESS????????????? THAN??? (<)????????????????????????????????????????????
???IS???????? EQUAL????????? TO????????? (=)?
???NOT??? GREATER???? THAN??? (NOT >) (<=)?
???NOT??? LESS????????????? THAN??? (NOT <) (>=)?
???NOT??? EQUAL????????? TO???????? (NOT =)?
注意:句点在IF 语句中的特殊作用。?
?如:IF??? A >? 0??
???????????????????????????????????????????? DISPLAY??????? A。???
???????? ADD????????? A????????? TO??? TOTAL。???????????????? ??
???????? DISPLAY???????? TOTAL。?????????????? ??
?与?? IF??? A? >? 0?
?????????????? DISPLAY? A?
??????????????? ADD???????? A???? TO??? TOTAL。?
??????? DISPLAY??????? TOTAL。就不同。?
为避免出现问题应该使用显式终止符(END-IF,END-PERFORM等)代替隐式终止符(句点“。”)?
六。停止语句(STOP)?
??????? 其一般格式为:?????????? STOP????????? RUN?
?????????? 常量?
??????? STOP?? RUN? 执行后,程序停止运行,停止后不能再接着运行,如需要,可重新运行一次。?
??????? STOP? 常量,表示程序暂时挂起不往下执行,显示出此常量。?
七。返回语句(GOBACK)?
??????? 停止运行,将控制权返回给上一级。可用本语句代替STOP语句。子程序必须用GOBACK而?
不能用STOP:因为STOP停止的是一个RUN UNIT(运行单元)。?