COBOL学习
发布时间:2026/10/16 9:04:40 锦皓数字建站

COBOL 程序的基础知识概述1.COBOL 是什么怎么来的COBOLCommon Business-Oriented Language中文可以理解为“面向商业的通用语言”。它是在 1959 年由美国国防部牵头搞出来的目标很明确做一种适合商业数据处理的编程语言。它希望做到跨平台、可读性强并且能把业务逻辑表达得比较清楚。20 世纪 60 到 80 年代它在银行、保险、政府和大企业系统里用得非常多直到现在很多老系统里还在跑 COBOL。2.COBOL 的语言特点COBOL 有几个很鲜明的特点像自然语言关键字都是英文单词比如 READ、WRITE、IF、PERFORM非程序员也能大致看懂。面向数据处理核心是文件操作支持复杂的数据结构定义和记录处理。可移植不绑定硬件能在 IBM z/OS、UNIX、Windows 等多种系统上跑。强类型、格式严格变量必须明确指定类型和长度程序结构也有固定格式。3.基本程序结构组成程序由 4 个部组成的。这 4 个部依次为标志部、环境部、数据部以及过程部。部与部之间的先后顺序不可更改。标志部说明程序名称、作者、版本等元信息。环境部说明程序跟外部环境的关系比如文件和计算机的对应关系。数据部定义程序里用到的所有数据。过程部写程序逻辑是程序的主体。3.1 标志部关键字IDENTIFICATION DIVISION标识程序名称、作者、版本等元信息。标志部中主要包含以下字段PROGRAM-ID、AUTHOR、INSTALLATION、DATE-WRITTEN、DATE-COMPILED、SECURITY。PROGRAM-ID用于指明程序名是必须具备的字段。其他字段则都是可选的。AUTHOR开发程序的程序员名3.2 环境部环境部主要用于指定该程序同外部系统环境之间的各种对应关系在标志部之后。如果没有任何内容可以省略不写。关键字ENVIRONMENT DIVISION环境部包含有两个节为配置节和输入/输出节。3.2.1 配置节主要用于指定程序同外部环境之间的一些配置信息。关键字ENVIRONMENT DIVISION字段SOURCE-COMPUTER编译程序的计算机。OBJECT-COMPUTER运行程序的计算机。SPECIAL-NAMES指定货币符号、选择小数点、提供开关名和定义字母表。3.2.2 输入/输出节在 COBOL 程序中数据主要保存在文件中。数据的输入和输出通常是以文件为对象进行的。因此输入/输出节主要用于指定程序中所用到文件同外部环境之间的对应关系。关键字INPUT-OUTPUT SECTION字段FILE-CONTROL指定文件的对应关系是该节中主要用到的字段。I-O-CONTROL定义程序返回点、不同文件共享的内存区以及多文件卷中文件的位置。3.3 数据部数据部在环境部之后。COBOL 程序中所用到的各项数据都统一在数据部中定义因此数据部十分重要。数据部中常用的有 3 个节分别为文件节、工作存储节以及连接节。关键字DATA DIVISION3.3.1 文件节对程序中用到的文件里的数据进行定义。文件是指程序中的逻辑文件。其文件名必须和环境部输入/输出节中由SELECT语句指定的文件名一致。关键字FILE-SECTION在文件节中主要是通过FD语句实现对文件的定义。在FD语句下通过PIC语句依次定义文件中每条记录所包含的数据项。任何在程序中所使用到的文件都需要在此处定义。FD是 “File Descriptor” 的缩写文件描述符的意思。以下两点需要注意FD语句主要用来描述与文件记录相关的物理信息如记录实际的格式、长度等。FD语句通过句点表示结束。定义的数据实际上主要分为两大类型。其中一类为数据组另一类为单元数据项。数据组是由多个单元数据项或数据分组所组成的。FD语句下所有的数据组和数据项组成了该文件的一条记录。在文件节中各条FD语句下所定义的数据组和数据项是对相应文件记录逻辑上的一个划分。在COBOL中01层属于最高层需要在程序中顶格写。各层层号必须按顺序书写但不一定连续。在COBOL中最多支持49层因此49层为最低层。除01层外还存在几个比较特殊的层如下。66层:为特殊描述符项目保留在实际中用得较少。77层:用于某个组的数据项如程序中的临时变量。88层:用于条件判断中。区分数据组和单元数据项的方式是看该数据后是否有PIC语句。没有PIC语句的为数据组有PIC语句的则为单元数据项。PIC实际上是PICTURE的缩写。PIC语句用来定义数据的类型及长度。需注意其中“X”和“9”的区别。“X”表示任意字符“9”则表示只能为数字。二者后面括号中的数值则表示相应数据的长度。数据长度也可直接通过连续书写“X”或“9”表示。例如01TEST-DATAPICX(20).01TEST-DATAPICXXX.....01TEST-DATAPIC9(7).01TEST-DATAPIC999.3.3.2工作存储节工作存储节主要用于定义本程序中所需用到的各种数据。其中数据的定义方式同在文件节中的类似不过此处定义的数据与文件是没有直接关系的。工作存储节应该写在文件节之后。如果程序中没有用到外部文件文件节是可以省略的。但工作存储节则通常都是会存在的。因为程序中一般会要用到本地数据的。关键字WORKING-STORAGE SECTION工作存储节中的数据也是需要使用PIC语句定义其类型和长度的。此外在使用PIC语句对数据定义的同时也可以使用VALUE从句对其赋初值。并且对于FILLER描述的数据项通常是必须使用VALUE从语对其赋初值。例如以下代码便将字符“ABC”赋予了 TEST-CHAR将数字123赋予了TEST-NUM将空格赋予了 FILLER所描述的数据项。01TEST-CHARPICX(3)VALUEABC.01TEST-NUMPIC9(3)VALUE123.01FILLERPICX(5)VALUESPACES.3.4 过程部过程部是COBOL程序中的最后一个部。COBOL程序的所有逻辑处理部分都是在过程部中编写的。过程部是程序的主体部分程序的处理都是在过程部中实现的。关键字PROCEDUREDIVISION过程部中的程序代码是由COBOL语句所组成的。同时可以将实现某一特定功能的多条语句定义为一个语句段。语句段在COBOL中类似于函数的概念可以直接通过语句段名对其进行调用。语句段名需要在程序中顶格写。关于过程部中的语句有一点需要特别注意就是语句之后的句点“.”。通常情况下语句之后有无句点并无太大影响但对于以下两种情况需要特别注意。(1)语句段名之后必须有句点。(2)句点能够起到界点同一条件下处理范围的作用。这一点同后面要讲到的END-IF或者END-PERFORM等标识符功能类似并可用句点将其替换。需要注意的是COBOL中的语句是可以换行书写的。但换行书写时语句中所包含的单个选项或者变量名在每行内需要书写完整不能将其拆分成两行。当程序逻辑代码完全结束后通常使用“STOPRUN”语句表明程序的结束。在子程序中也可使用“GOBACK”语句或“EXIT PROGRAM”语句表示程序的结束。过程部常用语句包括OPEN打开文件READ读取记录MOVE数据传送PERFORM调用段IF-ELSE条件判断WRITE输出记录CLOSE关闭文件下面基于前文在文件节中定义的CUSTOMER-FILE和PRINT-FILE以及工作存储节中定义的WS-CUST-NAME、WS-TOTAL-AMOUNT、WS-COUNT给出一个完整的过程部示例。该示例从客户文件中逐条读取记录将客户姓名与金额汇总后写入打印文件并统计处理记录条数PROCEDUREDIVISION.MAIN-PROCESS.OPENINPUTCUSTOMER-FILE*以输入方式打开客户文件OUTPUTPRINT-FILE*以输出方式打开打印文件MOVE0TOWS-COUNT*计数器WS-COUNT清零PERFORMREAD-PROCESS*调用READ-PROCESS段读取并处理记录PERFORMUNTILWS-EOFY*循环执行直到文件结束标志为YPERFORMREAD-PROCESS*再次调用读取处理段END-PERFORM*循环结束PERFORMPRINT-SUMMARY*调用打印汇总段CLOSECUSTOMER-FILE*关闭客户文件PRINT-FILE*关闭打印文件STOPRUN.*结束程序运行READ-PROCESS.READCUSTOMER-FILE*从客户文件读取一条记录ATEND*若已读到文件末尾MOVEYTOWS-EOF*设置文件结束标志为YNOTATEND*若成功读取到记录MOVECLIENT-NAMETOWS-CUST-NAME*将客户姓名传送到工作存储项ADDPRI-FINANCETOWS-TOTAL-AMOUNT*累加金额到汇总项ADD1TOWS-COUNT*计数器加1PERFORMWRITE-LINE*调用输出段打印该行END-READ.*READ语句结束WRITE-LINE.MOVEWS-CUST-NAMETOPRINT-LINE(1:20)*将姓名放入打印行前20位MOVEWS-TOTAL-AMOUNTTOPRINT-LINE(21:9)*将金额放入打印行后续位置WRITEPRINT-LINE*将打印行写入打印文件MOVESPACESTOPRINT-LINE.*清空打印行准备下一行PRINT-SUMMARY.MOVETOTAL RECORDS:TOPRINT-LINE(1:15)*写入汇总标题MOVEWS-COUNTTOPRINT-LINE(16:4)*写入总记录数WRITEPRINT-LINE.*输出汇总行在上面的示例中OPEN语句同时打开了输入文件CUSTOMER-FILE和输出文件PRINT-FILEREAD语句配合AT END/NOT AT END判断是否读到文件末尾MOVE语句用于在文件记录、工作存储项与打印行之间传送数据ADD语句完成金额累加与计数PERFORM语句反复调用READ-PROCESS段直到文件结束IF-ELSE结构则体现在AT END/NOT AT END的条件分支中WRITE语句将处理结果输出到打印文件最后用CLOSE关闭所有文件并以STOP RUN结束程序。需要说明的是示例中PRINT-LINE(1:20)这种带下标范围的写法用于对打印行的指定位置进行赋值属于 COBOL 中较为常用的字符串定位技巧。通过过程部前面在数据部中定义的各种数据项真正被“用”了起来这也正是 COBOL 程序“先定义、后使用”这一设计思想的体现。总结COBOL 程序的基础知识主要内容可概括为以下几点语法格式COBOL 每行代码分为 80 列其中第 7 列为指示符区写入*表示注释行第 8~11 列为 A 区用于书写部、节、段标识符及 01 层号第 12~72 列为 B 区用于书写过程部语句第 73~80 列为说明区。下面给出一个完整的 COBOL 程序示例用于直观展示第 7 列注释符、A 区/B 区书写规范以及数据名称的命名规则。示例中每一行都标注了其内容所对应的列位置000100IDENTIFICATIONDIVISION.*第8~11列(A区)部标识符000200PROGRAM-ID.SAMPLE-PGM.*第8~11列(A区)PROGRAM-ID顶格书写000300AUTHOR.XXX.*第8~11列(A区)AUTHOR顶格书写000400ENVIRONMENTDIVISION.*第8~11列(A区)部标识符000500INPUT-OUTPUTSECTION.*第8~11列(A区)节标识符000600FILE-CONTROL.*第8~11列(A区)节内段名顶格书写000700SELECTCUSTOMER-FILEASSIGNTOS-SYSIN.*第12~72列(B区)SELECT语句000800SELECTPRINT-FILEASSIGNTOS-SYSOUT.*第12~72列(B区)SELECT语句000900DATADIVISION.*第8~11列(A区)部标识符001000FILESECTION.*第8~11列(A区)节标识符001100FDCUSTOMER-FILE*第8~11列(A区)FD语句顶格书写001200RECORDINGMODEISF.*第12~72列(B区)FD从句00130001CUST-RECORD.*第8~11列(A区)01层号顶格书写00140005ACCOUNT-NOPIC9(10).*第12~72列(B区)数据项定义00150005CLIENT-NAMEPICX(20).*第12~72列(B区)数据项定义00160005PRI-FINANCEPIC9(7).*第12~72列(B区)数据项定义001700FDPRINT-FILE*第8~11列(A区)FD语句顶格书写001800RECORDINGMODEISF*第12~72列(B区)FD从句001900LABELRECORDSAREOMITTED*第12~72列(B区)FD从句002000RECORDCONTAINS132CHARACTERS*第12~72列(B区)FD从句002100DATARECORDISPRINT-LINE.*第12~72列(B区)FD从句00220001PRINT-LINEPICX(132).*第8~11列(A区)01层号顶格书写002300WORKING-STORAGESECTION.*第8~11列(A区)节标识符00240001WS-CUST-NAMEPICX(20).*第8~11列(A区)01层号顶格书写00250001WS-TOTAL-AMOUNTPIC9(7).*第8~11列(A区)01层号顶格书写00260001WS-COUNTPIC9(4).*第8~11列(A区)01层号顶格书写00270001WS-EOFPICX(1)VALUEN.*第8~11列(A区)01层号顶格书写002800PROCEDUREDIVISION.*第8~11列(A区)部标识符002900MAIN-PROCESS.*第8~11列(A区)段名顶格书写003000OPENINPUTCUSTOMER-FILE*第12~72列(B区)过程部语句003100OUTPUTPRINT-FILE*第12~72列(B区)过程部语句003200MOVE0TOWS-COUNT*第12~72列(B区)过程部语句003300PERFORMUNTILWS-EOFY*第12~72列(B区)过程部语句003400READCUSTOMER-FILE*第12~72列(B区)过程部语句003500ATEND*第12~72列(B区)过程部语句003600MOVEYTOWS-EOF*第12~72列(B区)过程部语句003700NOTATEND*第12~72列(B区)过程部语句003800MOVECLIENT-NAMETOWS-CUST-NAME*第12~72列(B区)过程部语句003900ADDPRI-FINANCETOWS-TOTAL-AMOUNT*第12~72列(B区)过程部语句004000ADD1TOWS-COUNT*第12~72列(B区)过程部语句004100MOVEWS-CUST-NAMETOPRINT-LINE(1:20)*第12~72列(B区)过程部语句004200MOVEWS-TOTAL-AMOUNTTOPRINT-LINE(21:9)*第12~72列(B区)过程部语句004300WRITEPRINT-LINE*第12~72列(B区)过程部语句004400END-READ*第12~72列(B区)过程部语句004500END-PERFORM*第12~72列(B区)过程部语句004600MOVETOTAL RECORDS:TOPRINT-LINE(1:15)*第12~72列(B区)过程部语句004700MOVEWS-COUNTTOPRINT-LINE(16:4)*第12~72列(B区)过程部语句004800WRITEPRINT-LINE*第12~72列(B区)过程部语句004900CLOSECUSTOMER-FILE*第12~72列(B区)过程部语句005000PRINT-FILE*第12~72列(B区)过程部语句005100STOPRUN.*第12~72列(B区)过程部语句对上述示例中各列位置的说明如下第 1~6 列序号区示例中每行开头的000100、000200等即为序号用于标识行号通常不作要求可留空。第 7 列指示符区示例中每行末尾的*即注释符表示该位置之后的内容为注释。若将*写在行首第 7 列则整行成为注释行。第 8~11 列A 区部标识符如IDENTIFICATION DIVISION、节标识符如WORKING-STORAGE SECTION、段名如MAIN-PROCESS以及01层号均从 A 区开始顶格书写。第 12~72 列B 区过程部中的各条语句如MOVE、DISPLAY、STOP RUN书写在 B 区即从第 12 列开始缩进书写。第 73~80 列说明区用于书写注释示例中*之后的内容即属于说明区。同时示例中的数据名称也遵循了命名规则WS-CUST-NAME、WS-TOTAL-AMOUNT均由字母、数字和中划线组成中划线位于名称中间而非开头或结尾且未与MOVE、DISPLAY、STOP等程序关键字重名。数据名称由字母、数字和中划线组成中划线不可位于开头或结尾且不能与程序关键字重名。四部结构一个完整的 COBOL 程序由标志部、环境部、数据部、过程部 4 个部依次组成顺序不可更改。标志部通过IDENTIFICATION DIVISION标识其中PROGRAM-ID为必填字段环境部通过ENVIRONMENT DIVISION标识用于建立逻辑文件与物理文件的对应关系。文件节由FILE-SECTION标识通过FD语句定义与外部文件相关联的记录结构数据来源于外部文件数据项不能指定初始值适用于读写外部文件的场景。工作存储节由WORKING-STORAGE SECTION标识通过01层号直接定义程序内部的临时数据项可通过VALUE从句指定初始值适用于存放中间计算结果、计数器、标志位等临时数据。过程部核心语句过程部由PROCEDURE DIVISION标识是程序的核心。常用语句包括OPEN打开文件、READ读取记录、MOVE数据传送、PERFORM调用段、IF-ELSE条件判断、WRITE输出记录以及CLOSE关闭文件配合AT END/NOT AT END可完成对文件记录的处理与汇总。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。