cobol学习笔记1231培训资料.docx
《cobol学习笔记1231培训资料.docx》由会员分享,可在线阅读,更多相关《cobol学习笔记1231培训资料.docx(17页珍藏版)》请在冰豆网上搜索。
![cobol学习笔记1231培训资料.docx](https://file1.bdocx.com/fileroot1/2023-1/11/b7c805fc-b3bb-4fe8-ac29-5e5ff4f5a2f6/b7c805fc-b3bb-4fe8-ac29-5e5ff4f5a2f61.gif)
cobol学习笔记1231培训资料
COBOL学习笔记_20121231
cobol语言.修订版.(上册+下册).pdf
2012-12-14(1~22)
COBOL语言特点:
(1)适合数据处理(算术计算量小而逻辑处理多;输入输出数据量大;数据间有一定逻辑关系,即层次关系;大量分类排序;对报表要求高、多样化等)
(2)接近自然语言英语,易于理解
(3)通用性强,易于移植
(4)结构严谨,层次分明,每个程序分为4部分(division:
标示部Identificationdivision、环境部envroNmentdivision、数据部datadivision、过程部proceduredivision)、每部分分为若干节(section有节头标示,类似部头)、节下面分为若干段(paragraph有段头标示)。
每一部分都有固定格式。
(5)缺点是比较繁琐。
不乱程序逻辑如何,都必须按照四大部分生成,对每部分都必须定义和说明,即使该部分实际上没有内容,也要写出头部,导致源程序冗长。
=================
一个简单的COBOL程序:
Code:
IDENTIFICATIONDIVISION.
PROGRAM-ID. EXAM1.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
S. DISPLAY 'THISISACOBOLPROGRAM.'
STOP RUN.
=================
IDENTIFICATIONDIVISION:
用来指定源程序名称,也可写入其他信息(如作者、日期、保密等)。
ENVIRONMENTDIVISION:
程序中用到的数据文件名和计算机的设备的对应关系,即把某一数据文件和一外部设备关联起来。
此外,还可以指定目标程序中使用的专门控制方法和程序所用内存区的大小。
DATADIVISION:
程序用到的所有数据的类型和占用内存的情况。
PROCEDUREDIVISION:
用来给出程序要执行的命令,是计算机产生相应的操作。
部下面可以有节,节下面有段;或者部下面直接是段。
=================
以上四个部分,只有过程部是执行部分,是核心部分。
过程部中,每段由若干句(Sentence)组成,每句以句号加一个以上的空格来结束的。
一个句子只能由一个语句组成,一个语句加一个句号后跟一个或多个空格形成一个句子。
一个句子可以包含多个子句(Clause),每个子句也有一个动词,指定某一方面的功能。
除了过程部外,环境部和数据部也可以包含子句,如SELECT子句、文件描述子句等。
=================
COBOL每行80列,每行分为几个区:
(1)1~6列为“标号区”,一般前3列表示页号,后3列表示本页行号。
标号应当按照从小到大顺序填写,但可以不连续。
可以填标号,也可以不填写,对程序没有影响。
(2)第7列:
“续行标志区”,写上续行符"-",表示本行是续上一行后面的。
一般只有拆分字符需要两行紧连或者一个长的字符串需要拆成两行时才使用,否则可以空着。
不推荐使用续行符,容易导致错误。
(3)第8~11列,称为"A区",程序的某些部分,如部头、节头、段头、层号01、层号77以及文件标示符FD等应从A区开始书写。
可以从第8列开始,也可以不从,但必须在8~11列的任何一列开始。
(4)第12~72列,称为"B区",是程序的正文部分,过程部的句子必须从B区开始写,不能写入A区中。
(5)第73~80列,为“注释区”,一般是简单说明,程序编译和执行时都不会理会该区内容。
80列的划分区,只是对程序有以上限制,对于数据而言没有以上分区限制,即输入数据可以从第1列用到第80列。
所有字母应大写;相邻两个字之间应该留一个或以上空格;运算符和等号两边必须各留一个空格;过程部中左括号的左侧和右括号的右侧都要留一个空格,内侧不必留空格;逗号、句号、分号的左边不能留空格,右边必须留空格;一个空格和多个空格作用相同,但引号中的除外;允许一行写几个语句,也可以一个语句写在多行上。
=================
COBOL字符集:
COBOL程序中允许出现的字符(引号内的除外)。
数字:
0~9
大写字母:
A~Z
专用字符15个:
加号+
减号或连接号-
乘号或星号*
除号/
等号=
逗号,
句号或小数点.
分号;
引号'或"
括号()
小于号 <
大于号 >
空格
货币符号$
#,!
?
%等字符属于系统字符集但不属于COBOL字符集,不能在程序中出现(引号内除外)。
=================
COBOL字分为两类:
保留字和用户字(非保留)。
保留字指在COBOL中已规定作专门用途的字,代表特定的含义,不能另作他用。
=================
数据名就是由程序设计者定义的一片内存区域,即用一个符号代表一个地址。
长度只能是1~30个字符之间;只能由字母、数字和连接符"-"组成,至少含一个字母,连接符不能出现在名称的两端,不能出现空格;不能使用COBOL保留字,一般使用连接符是避免使用保留字的好方法,或者使用X或数字开头的名称;最好使用望文生义的单词命名。
=================
常量包括数值常量(NumericalLiteral)、非数值常量(NonnumericalLiteral)和表意常量(FigurativeConstant)三类。
数值常量不能超过18位数字;至少要有一个数字,不能含有超过一个符号;数字之间不能有空格。
非数值常量指用引号引起来的字符串;非数值含量不能参与运算;如果想把引号也放入常量,需要使用QUOTE保留字实现,如DISPLAYQUOTE'ABCD'QUOTE,表示'ABCD'六个字符,但QUOTE本身不能替代引号;非数值常量不能超过120个字符。
表意常量就是指用保留字表示的一些特殊常量,如用ZERO表示0,SPACE表示空格等。
=================
COBOL的数据具有层次的特征,类似于一颗倒立的树或者是金字塔结构,一般将这样的一条数据称之为一个记录(record)。
为了反映数据在一个层次结构中的层次,引入了层号的概念,使用2位数来表示。
层号小表示较高的层次。
记录是具有一定层次关系的一组数据项的最大集合。
是内存中具有独立逻辑含义的最大可存取项,层号为01。
记录下分为几项,不能继续分的称为初等项或基本项(Elementitem)。
初等项是数据的基本单位;如果还能继续分,称为组合项(GroupItem),组合项下可以是组合项或者初等项。
多个记录可以组成一个文件。
但文件一般存储在外部,不在内存中,内存中最大存取项是记录。
2012-12-19
23~28
过程部是COBOL的核心部分,应当以过程部为主体,找出几部分之间的关系。
过程部的特点:
(1)过程部是程序的第四部分
(2)过程部都以一个动词开始,如MOVE、READ、WRITE、IF。
表示计算机应当执行的操作。
(3)动词后面一般都跟着一个操作的对象,可以是数据文件或者数据名。
(4)过程部一律写在B区上,即第12列开始,可以写在一行或者多行,续行也从B区开始。
=========
输入输出
1、ACCEPT语句
从键盘终端或者指定输入设备获取少量输入数据。
ACCEPT标识符[FROM助忆名]
这里的标识符必须是可以唯一的标识一个数据项的数据名。
如部->节->段->数据项的情况下,使用OF关联上下关系,保证标识符的唯一性,如
01A.
02B1.
03C...
03D...
02B2.
03C...
03D...
必须写成COFB1和COFB2区分两个不同的C
以上[]内的内容表示是可选项,{}内的内容表示其中各项可多选一,...表示之前的{}或[]的内容可以重复多次,有下划线的保留字表示必写,没有的表示可以省略。
以上的FROM省略时表示从系统默认输入设备获取数据,如键盘,增加时,表示从指定设备获取数据,助忆名表示从一个设备名,具体的名称可以在ENVIRONMENTDIVISION中定义:
ENVIRONMENTDIVISION.
CONFIGURATIONSECTION. 配置节
SPECIAL-NAMES. 专用字段
CONSOLEISABC. 将输入设备定义为助忆名:
ABC
ACCEPTTFROMABC.
表示从输入设备获取数据并赋值给变量T。
ACCEPT之后只能跟一个标识符,不能跟多个。
=========
2、DISPLAY语句
用于少量数据输出到指定外设上。
DISPLAY{标识符|常量}[标识符|常量]...[UPON助忆名]
默认在屏幕上显示数据,使用UPON指向指定的设备名输出
每执行一次DISPLAY,总是从一个新行开始;如果一行显示不完,会自动换行显示。
正式程序中,一般都不使用ACCEPT和DISPLAY,以提高系统效率,减少手工干预。
=========
3、READ语句
READ文件名RECORD[INTO标识符][;ATEND执行语句]
分号可以省略
例如READIN-FILE,表示从IN-FILE文件中读取数据,IN-FILE称为“内部文件名”,它与外部文件名之间的关系是通过ENVIRONMENTDIVISION中指定的,如:
Code:
ENVIRONMENTDIVISION.
INPUT-OUTPUTSECTION. 输入输出节
FILE-CONTROL. 文件控制段
SELECTIN-FILEASSIGNTO外部文件名.
2012-12-21(29~38)
内部文件名的长度不能超过30byte,只能由数字、字母和连接符组成,必须至少包含一个字母。
每执行一次READ语句,只读取文件中的一条记录,为避免误解,可以加上关键字RECORD,如:
READIN-FILERECORD
其中,RECORD是可选项,是否写,效果一样。
在计算机内存中专门开辟一片存储单元存放读入记录,所以大小应当等于一条记录的大小。
每次读取下一条记录,会冲掉前一条记录的内存区域,所以必须在处理下一条之前保存处理结果,内存中不会保存前一条记录信息。
输入记录区样例:
Code:
DATADIVISION.
FD IN-FILELABELRECORDISSTANDARD.
01 IN-RECORD.
02DATE-IN.
03YEARPIC99. (表示2位整数)
03MONTHPIC99.
03DAYyPIC99.
02PRODUCT-CODEPIC9(4).
02CUSTOMER-CODEPIC9(4).
02QUALITYPIC9(6).
02UNIT-PRICEPIC9(6).
FD是FileDescription(文件描述)的缩写,表示从该行起是“文件描述体”。
LABELRECORDISSTANDARD表示“标号记录是标准的”,所有磁盘和磁带文件都必须这样。
文件结尾有“文件结束标志”,READ读到文件结束标志后,会给出一个“文件结束”信息,允许程序进行处理,由"ATEND"子句来处理,如:
READIN-FILEATENDSTOPRUN.
以上STOPRUN表示中止运行,也可以写其他语句。
=========
4、WRITE语句
WRITE记录名[FROM标识符][{BEFORE|AFTER}ADVANCING{{标识符2|整数}[LINE|LINES]|{助忆名|PAGE}}]
将内存中的数据写入外部设备,输出文件也在内存区开辟一个“输出文件记录区”
输出设备的选择:
Code:
ENVIRONMENTDIVISION. (环境部)
INPUT-OUTPUTSECTION. (输入输出节)
FILE-CONTROL. (文件控制段)
SELECTOUTPUT-FILEASSIGNTO输出设备名.
输出设备名可以用打印机,如PRINTER或磁盘文件名等。
LABELRECORDISOMITTED.表示“标号记录是省略的”,凡输出是打印机的,一律这样写。
如果输出是磁盘文件,则修改为LABELRECORDISSTANDARD.
输出内存记录区样例:
Code:
DATADIVISION.
FDOUTPUT-FILELABELRECORDISOMITTED.
01OUTPUT-RECORD.
02DATE-OUTPUT.
03YEAR PIC99.
03MONTH PIC99.
03DAYY PIC99.
02PRODUCT-CODE9(4).
02CUSTOMER-CODEPIC9(4).
02QUALITYPIC9(6).
02UNIT-PRICEPIC999.
02TOTALPIC9(4).
如果在ENVIRONMENTDIVISION指定输出设备为PRINTER,则执行WRITEOUTPUT-RECORD,自动会在打印机执行输出。
COBOL提供了行距控制,如下:
Code:
MOVET1TOOUTPUT-RECORD.
WRITEOUTPUT-RECORDAFTERADVANCING2LINES.
表示打印OUTPUT-RECORD之前先空2行。
也可以用
Code:
WRITEOUTPUT-RECORDAFTERADVANCING2LINES.
表示先打印OUTPUT-RECORD再空2行。
上面的2行,可以用数据名来表示,如
Code:
WRITEOUTPUT-RECORDAFTERADVANCINGALINES.
这里,A为DATADIVISION定义的一个整数变量。
如果需要一些特殊控制,如要移动到页末或者不换行,可以使用专用名控制,具体可查询COBOL编译器ENVIRONMENTDIVISION专用字段描述。
WRITER语句的记录的第一个字符称为“纵向走纸控制”,即第一个字符不会被打印出来,这个问题和系统有关。
可以从内存区另一个数据项的内容获取内容输出给要输出的记录区,然后再输出,如:
Code:
WRITEOUTPUT-RECORDFROMT1AFTER3.
相当于:
Code:
MOVET1TOOUTPUT-RECORD.
WRITEROUTPUT-RECORDAFTER3.
=========
5、OPEN语句
OPEN{INPUT|OUTPUT文件名1[,文件名2]...}...
读写文件前,必须先执行OPEN语句打开文件。
可以一次打开多个文件,如:
OPENINPUTx1,x2,x3
OUTPUTx4,x5,x6.
=========
6、CLOSE语句
CLOSE文件名1[,文件名2]...
对文件操作完毕后,应关闭文件。
有一个OPEN,应该对应有一个CLOSE。
2012-12-25(39~50)
1、ADD语句
ADD{标识符1|常量1}[,标识符2|常量2]…TO|GIVING标识符m[,标识符n]…
ADDATOB=>A+B=B
ADDA,BTOC=>A+B+C=C
ADDA,BGIVINGC=>A+B=C
ADDA,BTOC,D=>A+B+C=C;A+B+D=>D
2、SUBTRACT语句
SUBTRACT{标识符1|常量1}[,标识符2|常量2]…FROM标识符m[,标识符n]…[|常量m[,常量n]…GIVING标识符k[,标识符p]…]
SUBTRACTBFROMA=>A–B=A
SUBTRACTB,CFROMA=>A–B–C=A
SUBTRACTB,CFROMA,T=>A–B–C=A;T–B–C=T
SUBTRACTB,CFROMAGIVINGX=>A–B–C=X
注意:
GIVING之后不能跟常量。
如果不带GIVING,则FROM部分后面也不能带常量。
3、MULTIPLY语句
MULTIPLY{标识符1|变量1}BY标识符2[,标识符3]…[|常量2[,常量3]…GIVING标识符m[,标识符n]…]
MULTIPLYABYB=>A*B=B
MULTIPLYABYBGIVINGC=>A*B=C
MULTIPLYABYB,C=>A*B=B;A*C=C
注意:
GIVING之后不能跟常量。
如果不带GIVING,则BY部分后面也不能带常量。
4、DIVIDE语句
DIVIDE{常量1|标识符1}{INTO|BY}{标识符2[,标识符3]…}[|常量2[,常量3]…GIVING标识符4[,标识符5]…]
DIVIDEAINTOB=>B/A=B
DIVIDEAINTOBGIVINGC=>B/A=C
DIVIDEABYBGIVINGC=>A/B=C
注意:
如果除不尽,多余的位数被截掉,即小数会被截去。
总结:
一个语句只能进行单一运算,不能在一个语句进行两种不同的运算。
加法和减法可以一次进行多个值的计算,但乘法和除法不可以。
5、计算语句COMPUTE
用于复杂的四则运算
COMPUTET=(A+B)*C/D=>(A+B)*C/D=T
优先级:
(从高到低)
括号>单目运算符(正负号)>乘方(**)>乘除>加减
同等级运算法按从左往右优先级
所有运算符两侧应留一个空格
括号外侧留一个空格、内侧可以不要留空格
COMPUTE语句计算速度较慢,由于COBOL很少用于科学计算,不常使用COMPUTE语句。
2012-12-29(50~77)
MOVE语句
MOVE{标识符1|常量1}TO标识符2[,标识符3]…
MOVE语句用来实现数据的传送,将数据从一个内存域送到另一个内存域。
仅指内存中的传送,不是内存和外部设备间的传送。
可以将常量(数值常量、非数值常量、表意常量)或一数据项内容传送给另一数据项。
传输规则:
MOVEATOB
A成为发送项,B称为接收项。
1、发送项和接收项类型和长度一致,则按字节一一传送。
2、发送项和接收项类型都是数值数据项,长度不一致,则按“小数点对齐”原则处理。
接收项大于发送项,则多余位补零。
接收项小于发送项,则截断(从左边算起)。
3、对字母或字符数据(非数值型数据),按照“左对齐”原则处理。
接收项大于发送项,则多余位补空格。
接收项小于发送项,则从右端截断。
4、可以将一个初等项内容传给另一个初等项,也可以将一个组合项内容传给另一个初等项,也可以将一个初等项内容传给另一个组合项。
GOTO语句
GOTO过程名1[[,过程名2]…DEPENDINGON标识符]
节名或段名称为过程名,代表一段过程。
DEPENDING表示根据标识符的值转到哪一个过程名后面执行,如:
GOTOA,B,CDEPENDINGONI.
表示I=1,转到过程A,I=2,转到过程B,I=3,转到过程C,否则执行下一个语句。
GOTO是无条件转移语句。
条件语句IF
1、关系运算符
关系运算符的作用是对两个数值型或字符型数据大小进行比较。
大于ISGREATERTHAN或者>
小于ISLESSTHAN或者<
等于ISEQUALTO或者=
不大于NOTGREATERTHAN或者NOT>
不小于NOTLESSTHAN或者NOT<
不等于NOTEQUALTO或者NOT=
2、关系运算规则
(1)数据量之间的比较,按照值进行比较
(2)字母数据之间的比较,按照ASCII码大小比较,或者EBCDIC码大小比较,但共同的归类就是字母顺序,当长度不同时,补足空格后从左到右的顺序比较每一位(注意,空格比任何字母都小)。
(3)字符型数据的比较,也是按照从左到右的顺序比较,但字符代码大小比较,和系统有关,或者按照ASCII码大小比较,或者EBCDIC码大小比较。
3、IF语句的两种形式
IF条件{语句组|NEXTSENTENCE}[ELSE{语句组2|NEXTSENTENCE}]
(1)IF条件语句组
(1)IF条件语句组1ELSE语句组2
NEXTSENTENCE表示条件满足(或不满足时)执行IF下面的语句
停止语句STOP
STOP{RUN|常量}
说明:
(1)执行后程序将中止
(2)STOP常量,表示程序暂时挂起,并显示该变量的值,一般用于调试;暂停后,从键盘输入适当的命令,可以使程序继续进行
结构化程序设计的三种结构:
顺序结构、选择结构和循环结构,并由这三种基本机构派生出其他基本结构,这些基本结构应当具备以下特征:
(1)只有一个入口,一个出口
(2)没有死循环
(3)没有死语句(永远不会执行的语句)
程序=算法+数据结构+程序设计方法+程序环境
标识部IDENTIFICATIONDIVISION
标识部的作用是标识一个COBOL程