COBOL语言程序设计许毅第四章数据部(一)4.1概述1、数据部的作用数据部(DATADIVISION)是整个COBOL程序中唯一描述数据的部分。凡是在程序中涉及的全部数据(输入数据、输出数据以及中间数据),都要在数据部中加以说明描述两种数据:孤立数据项组合组合数据项——数据是相互关联的,也就是说存在内在联系这是COBOL程序数据的最大特点程序过程部中出现的所有数据项都应当在数据部中对它门的属性进行说明。包括:(1)每一个数据项的类型(是数值型或字符型…),它们在内存中的存储形式。它们的长度(占多少字节)。(2)数据项间的相互关系。有的数据项之间有从属关系.例如一个组合项包括若干个初等项。哪些数据项是文件记录中的一部分?哪些数据项与文件无关,即不从属于记录。(3)描述记录与文件的关系,即内存中的输入输出记录区是与哪一个文件有关联(4)文件的属性。由多个记录组成一个“物理块”,一个记录包含多少个字节?文件有无标号记录等。2、数据的层次和层号COBOL中把有从属关系的数据用层次(level)关系来描述。数据的层次结构是:记录-组合项-初等项。逻辑上不能再细分的项,称为初等项(亦称基本项.Elementaryitem)。包含苦干个初等项的项称组合项(Groupitem)。数据项的最高层次是记录(Record)。在一个记录中可以分为若干层次。如有一“工人的每周工时记录”,其数据关系如下:TIME-RECORD是记录名,WEEKS-END-DATA和HOURS-WORKED是组合项我们在数据部中按照以下方式来表示:01TIME-RECORD.03NAMEPICX(20).03WORKER-NUMBERPIC9(6).03WEEKS-END-DATE.05MONTHPIC99.05DAY-NUMBERPIC99.05YEARPIC99.03HOURS-WORKED.06REGULARPIC99.06OVERTIMEPIC99.层次规定如下:(1)用来描述数据的层次结构的层号从01开始,到49,即可用的层号为01—49。记录的层次最高,定为01层号(2)从属项的层号比其上属项的层号高。即层号小的组合项包含层号大的数据项(组合项或初等项)。层号不必要求连续。(3)如果几个数据项都从属于同一组合项但互不从属,则这几个数据项应具有相同的层号3、数据部的结构数据部中通常用到的有以下几个节:(一)文件节(FILESECTION)用来描述程序中用到的输入文件和输出文件及其记录中各数据项的属性。(二)工作单元节(WORKING-STORAGESECTION)用来描述程序中用到的中间数据项。(三)联接节(LINKAGESECTION)用来描述与调用程序间发生数据传递的数据项。(四)报表节(REPORTSECTION)为了完成报表编制功能,此节用来规定欲输出的报表的“体裁”,设计各报表栏的打印形式和方法等。后面两个部分将在以后介绍。4.2文件节(FILESECTION)1、文件节的作用程序中每一个输入或输出文件都要在文件节中加以描述。(1)文件名和文件属性。(2)文件中包括的记录的名字。(3)每个记录中数据的层次关系。(4)记录中各数据项的数据形式和占内存的大小。举例如下页:DATADIVISION.FILESECTION.FDACCOUNTS-RECEIVABLE(文件名)LABELRECORDISSTANDARD.DATARECORDISRECEIVABLE.01RECEIVBLE.(记录名)02ACCOUNTPIC9(6).02FILLERPICX(3).02AMOUNTPIC9(6).02NAMEPICX(65).2、文件描述文件描述从FD(FILEDESCRIPTION)开始。FD后面跟文件名。此文件名为程序中使用的内部文件名LABELRECORDISSTANDARD表示“标号记录是标准”的。COBOL处理的磁盘磁带文件一般都有标号,故需要如此声明对于卡片文件、打印文件等没有标号的文件则应写成:LABELRECORDISOMITTEDDATARECORDISRECEIVABLE.表示文件中包含的记录名(RECEIVABLE)。这一项可以省略最简单的文件描述体的一般格式3、记录描述记录描述由01层号开头,后跟记录名:01RECEIVABLE.注意本行末尾的句点在数据部的文件节要描述出记录的层次关系以及描述每个初等项的类型和长度如果记录下面不再分项,则如下表示01RECEIVABLEPICX(80).4、数据项描述在每一个初等项的名字后跟一个PIC子句,用来描述数据的类型和长度。例如:ACCOUNTPIC9(6).数值型,6位FILLERPICX(3).字符型,3个字符AMOUNTPIC9(6).数值型,6位NAMEPICX(65).字符型,65个字符5、文件节的书写格式FD从A区开始,01层必须从A区开始,其他层号可以从A区也可以从B区开始。最好按照层次关系写成缩进形式:FD…01A02B03C…6举例(例4.1)000100IDENTIFICATIONDIVISION.000200PROGRAM-ID.EXAM4A1.000400ENVIRONMENTDIVISION.000600INPUT-OUTPUTSECTION.000700FILE-CONTROL.000800SELECTABCASSIGNTOINFILE.000850SELECTXYZASSIGNTOOUTFILE.000900DATADIVISION.001000FILESECTION.001100FDABCLABELRECORDISSTANDARD.00120001APICX(80).001250FDXYZLABELRECORDISSTANDARD.00130001B.00140002FILLERPICX.00150002CPICX(80).001600PROCEDUREDIVISION.001700K.OPENINPUTABC.001710OPENOUTPUTXYZ.001800T.READABCATENDGOTOJ.001810MOVEATOC.001900WRITEB.002000GOTOT.002100J.DISPLAY'PROGRAMEND'.002200CLOSEABC.002210CLOSEXYZ.002300STOPRUN.运行程序的JCL//P390R1JOBACCT#,P390,CLASS=A,//MSGCLASS=H,MSGLEVEL=(1,1),//NOTIFY=&SYSUID//RUNCBLEXECPGM=EXAM4A1//STEPLIBDDDSN=P390.THQ.LOAD,DISP=SHR//INFILEDDDSN=P390.THQ.COBOL(EXAM4A1),//DISP=SHR//OUTFILEDDDSN=P390.RESULT.DAT,//DISP=(NEW,CATLG,DELETE),//UNIT=3390,SPACE=(CYL,(10,1))//SYSPRINTDDSYSOUT=*//SYSOUTDDSYSOUT=*4.3字型子句(PIC子句)PIC是Picture的缩写,用来描述每一个初等数据项:数据项的类型(数值、字符、字母……),数值型的数据是否包含正负号、小数点数据项占多大的内存域是否需要按打印的要求准备相关字符($、+、-、*)例如01A.02A1PIC9999.02A2PICAAAA.02A3PICXXXX.A是记录名,下属三个初等项。A1是数值型,A2是字母型,A3是字符型。分别由四位构成。一般来说,其在内存中也是4个字节1、数值型数据的描述(一)”9”描述符表示在该位置上可以放入一个0~9之间的数字。01APIC999.表示A可以放入000~999之间任一个三位数。999可以记为9(3)注意:1、在数值型的数据中只能放0~9之间的数字,不能放空格,输入的时候是从左到右进入,如对于上面的声明,针对ACCEPTA,如果只从控制台输入一个“1”,那么系统自动在后面补零,那么系统内部的值是100。如果要输入1,则应该输入0012、用”9”描述符只能表示整数,如果输入小数,则被略去3、如果送入一个负号,则负号被略去注意,2、3点指的是用MOVE传递数据的情况,从控制台输入数据的情况随系统不同处理方式不定(二)”V”描述符指出在数值数据结构中隐含的小数点位置03MPIC999V99.表示M共5位,可以放0~9的数字。前三位与后两位之间有一个隐含的小数点。注意:这个小数点不占内存,而是由编译器处理的。MOVE215.63TOMMOVE1215.637TOM注意,M只能存放5个数字,那么,该语句执行过后M的值是215.63。更多的例子如下:^说明(1)V在描述符的最后,相当于没有小数点(2)一个数据的描述符中只能出现一个V(3)运算时,按隐含的小数点位置对准进行运算。例如(4)显示时,只将内存中的内容显示出来,小数点不会显示出来。如果想显示小数点,使用后面介绍的编辑型数据(三)P描述符当数值很大,后面有若干0,可以使用P描述符。如:01APIC9PPPPPPPPP或01APIC9P(9)其在内存中只保存一位数字9,但,运算的时候,其相当于9×109当数值很小的时候,如0.000023,可以如下描述:01BPICPPPP99或P(4)99。表示在两个数字前,还有4个0。注意,4个0前是小数点和一个前导0。如图:则B的值为0.000023B23注意:(1)P必须出现在全部“9”之前或全部“9”之后,如99P99的写法是错误的。P表示前导0的时候前0前还有一个小数点。(2)用“P”,则小数点的位置已经确定。V和P不能相矛盾。如:PPV99(00.43)是错误的(3)如果“9”之后有n个P,表示内存中的数应乘以10n。如果在“9”之前有n个P,则应乘以10-(n+k),其中k为9的个数。举例:(4)显示或打印的时候P并不打印(和V相似),上表中AMOUNT如果直接输出的话就是1802(5)P描述符在商业上不常用,主要用于科技计算。但是请注意,COBOL语言本身主要不是用于科学计算。(四)S描述符负号如何表示?需要一个“S”描述符,如:02DPICS99.可以将一个正的或负的数存放在D中,如:MOVE-12TOD.注意:如上描述的数据D只有二位,S不计入数据项长度。系统可以在最后一位的数放上一个标志位表示负数例如:上表中^表示隐含的小数点位置,4表示对于C这种描述的数据项,在4所在的字节里面,放入一个负号标记。表示整个数值是负的,即表示-1112.34注意(1)S必须是最左边的一个描述符(2)在内存中,S不占位,在运算时,S起作用。输出的时候,按内存实际信息输出。例如:在IBMZ900中,-12的输出是1k2字母型数据的描述字母型数据项用A描述符,在这种类型的数据项中只允许存放字母和空格(注意和后面字符型的区别)。例如:02TPICAAAA.表示T中可以放入4个字母MOVE‘ABCD’TOT则内存中内容如右图TABCDIDENTIFICATIONDIVISION.PROGRAM-ID.EXAM4A2.ENVIRONMENTDIVISION.INPUT-OUTPUTSECTION.FILE-CONTROL.SELECTPRINT-FILEASSIGNTOSYSPRINT.DATADIVISION.FILESECTION.FDPRINT-FILERECORDCONTAINS16.01T.02FILLERPICX.02T1PICA(5).02T2PICA(3).02T3PICA(2).02T4PICA(5).PROCEDUREDIVISION.S.OPENOUTPUTPRINT-FILE.MOVE'THIS'TOT1.MOVE'