Cobol语言基础

文章目录

  • 一、Cobol学习
    • 1.Cobol简介
    • 2.程序结构
      • 1.IDENTIFICATION DIVISION 标识部
      • 2.ENVIRONMENT DIVISION 环境部
      • 3.DATA DIVISION 数据部
      • 4.PROCEDURE DIVISION 过程部
    • 3.文件
      • 1.概念
      • 2.文件控制
      • 3.文件的读
      • 4.文件的写
      • 5.文件组织形式
    • 4.数据结构
      • 1.数据类型
      • 2.关键字
  • 二、遇到的问题总结

一、Cobol学习

1.Cobol简介

    COBOL语言,是一种面向过程的高级程序设计语言,主要用于数据处理,是目前国际上应用最广泛的一种高级语言。COBOL是英文Common Business-Oriented Language的缩写,原意是面向商业的通用语言。它采用 300多个英语单词作为保留字,以一种接近于英语书面语言的形式来描述数据特性和数据处理过程,因而便于理解和学习。COBOL语言是专门为企业管理而设计的高级语言,可用于统计报表、财务会计、计划编制、作业调度、情报检索和人事管理等方面。

2.程序结构

division -部
section -节
paragraphs -段
部是最高层,下面包含节,节下面包含段

1.IDENTIFICATION DIVISION 标识部

位于程序的顶部,主要定义了程序的Id,作者以及程序功能描述等信息。如果不做特别要求的话内容可以为空,只要在程序中有标识部的定义就可以。

2.ENVIRONMENT DIVISION 环境部

声明了程序运行的环境,指定了程序的输入和输出文件,有两个节组成,配置节和输入输出节
1)配置节 由两个段组成,分别是指定了程序编译的环境节(源计算机)和运行环境(目标计算机),不做过多解释。
2)输入输出节 由两个段组成 分别是文件控制(File-Control)和IO控制(I-O-Control)。

INPUT-OUTPUT SECTION.
	   FILE-CONTROL.
	   SELECT FILEN ASSIGN TO FILEOUTN. 文件FILEN是给引入的外部文件在程序中对应的逻辑文件,在程序中使用FILEN来操作FILEOUTNORGANIZATION IS SEQUENTIAL.主要用来指定该文件的组织形式,有SEQUENCIALINDEXEDRELATIVE默认(为空时)为 SEQUENCIAL
	          ACCESS IS SEQUENTIAL.

3.DATA DIVISION 数据部

用于定义程序中使用的变量,它由四个节组成

DATA DIVISION.
  FILE SECTION.           文件节(File section)用于定义文件的记录结构。
   	FD FILEN				这个命令主要是用来解析文件的,定义逻辑文件的结构
   	01 NAME PIC A(25)  
  WORKING-STORAGE SECTION.   工作存储节(Working-Storage section)用于声明程序中使用的临时变量和文件结构。本程序的过程部用到的临时变量和文件结构要在这个节声明。
   	01 WS-STUDENT PIC A(30).   
   	01 WS-ID PIC 9(5).
  LOCAL-STORAGE SECTION.     本地存储节(Local-Storage section)是类似于工作存储节。唯一的区别是每次程序开始执行时都会 分配和初始化变量
   	01 LS-CLASS PIC 9(3).     
  LINKAGE SECTION.           连接节(Linkage section)用于描述从外部程序接收到的数据名称。类似于函数体中的局部变量,只接受外部程序的数据的值,赋值给变量,不接受该变量本身。
   	01 LS-ID PIC 9(5).         

4.PROCEDURE DIVISION 过程部

过程部用于包含该程序的逻辑。它由使用数据部定义的变量的可执行语句组成。在这个部中,段和节的名称是用户定义的。在过程部中必须至少有一个语句。结束这个部的执行的最后一条语句是在调用程序中使用的STOP RUN或者是在被调用程序中使用的EXIT PROGRAM。
    过程部下可以定义一些程序节,一般我们会给每个节定义起始标志,一般是文件的节名。在这个节的尾部定义文件的结束名,一般是节名加上EXIT。

3.文件

1.概念

1).层次:数据间存在的从属关系
2).记录:具有一定层次关系的一组数据的最大集合
3).文件:多个记录可以组成一个文件。
  文件可以对应数据库中的表进行理解。每个文件对应一个Format文件,是用来定义一种格式(也可以理解为定义表中的字段)来读这个文件。
4).VASM(Virtual Storage Access Method)是一种虚拟存取方法,是cobol程序的文件的格式。

2.文件控制

1)要在环境部的输入输出节的文件控制中进行定义并与外部文件建立连接.

INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT B
               ASSIGN TO CB  CB     *是外部文件名,其实是文件的外部地址
               FILE STATUS IS STATUS-CB 					*status-cb是文件状态字,打开成功的话这个值为00,这个字作为一个变量是需要在数据部的本地工作节中进行定义
               ACCESS MODE IS DYNAMIC 						*文件的访问方式,顺序,随机和动态,顺序文件只允许顺序访问
               ORGANIZATION IS INDEXED						*文件组织形式,缺省为顺序组织
               RECORD KEY IS EXTERNALLY-DESCRIBED-KEY.		*定义文件的主键

2)要在数据部的文件节中对文件的字段进行定义,或者引入文件的copybook

DATA DIVISION.
       FILE SECTION.
       FD  CB
           LABEL RECORDS ARE STANDARD
           VALUE OF FILE-ID IS "CB". 
           COPY LLCFCB OF OLASSOURCE.
       01  CBFILE-REC.      
           COPY DD-R001 OF   CB.  			*通过copy系统中LLDCB的表的字段来定义本文件字段

3.文件的读

    读文件使用READ命令,后面直接加上要读取的文件的文件名,一次只能读一条记录,想读文件中的多条记录时,需要使用循环。顺序方式读文件一定要在文件后面加上next。
    READ FILE-NAME INVALID 操作1 通过主键读文件,如果主键无效读取不到文件,就执行操作。
1)直接使用read进行读,这种方式一次只能读到一条记录。一般会使用文件的主键进行读。

		   MOVE ID                      TO PA-ID.
           MOVE USERNAME                TO PA-USERNAME.
           READ PA INVALID KEY
                MOVE "23"               TO STATUS-PA
           END-READ.

    其中MOVE后面的字段一般是传过来的值,是你读文件时限定的条件,TO后面的字段是文件中的字段。一条MOVE TO语句就相当于SQL语句中where字句中的一个条件,查找到符合这两个条件的那条记录。
2)结合循环和游标去读,这种方式可以读到多条记录。
  使用游标读文件。先使用start限定游标位置,然后再使用read都这个文件,就是从游标的位置开始。
游标定位,定位到表中主键值不小于给定的值的位置。

	       MOVE ID           TO PA-ID.
           MOVE USERNAME     TO PA-USERNAME.
           MOVE SPACES       TO PA-AGE.
           START PA KEY NOT LESS THAN PA-KEY
                 INVALID KEY 
                 MOVE "40" TO STATUS-PA.
           IF STATUS-PA NOT = IOK
              GO TO 100-PROCESS-EXIT
           END-IF.
	   *开始读文件,这时候读文件要用到next,来移动游标
		READ PA NEXT AT END MOVE "10" TO STATUS-PA.
           IF STATUS-PA NOT = IOK
              MOVE "Y" TO END-OF-CB
              GO TO 200-PROCESS-EXIT
           END-IF.

    这种方式读文件一般要在读文件的时候,把读文件的操作包裹在循环中,在文件读到末尾时给,设置一个标志。这个标志可以作为循环时的判断条件。当读到文件末尾时,给这个标志值赋一个值,在循环的Until 里对这个字句进行判断。

4.文件的写

    使用关键字WRITE,具体格式为 write 文件名-REC(这个文件名-REC在数据部的文件节,描述该文件的时候会定义,是该文件的01层)。写文件的时候不能write文件名,要write到文件的字段结构。这个文件名-REC是要在数据部中描述文件时定义,是文件的01层。

5.文件组织形式

文件组织形式有以下三种:
1.顺序文件组织
顺序文件由按照顺序存储和访问的记录组成。以下是顺序文件组织的关键属性:
记录可以按顺序读取。读取第10条记录时,应该先阅读前面的9条记录。
记录按顺序写入。记录间不能插入新纪录。新记录总是插入在该文件的末尾。
将记录放入顺序文件后,则无法删除,缩短或延长的记录。
记录的顺序,一旦插入,就永远不会改变。
记录是可以更新的。如果新的记录的长度与旧记录的长度相同,则可以覆盖记录。
按顺序输出文件是打印的好选择。
2.索引顺序文件组织
索引顺序文件由可以按顺序访问的记录组成。也可以直接访问。它由两部分组成:
数据文件:包含顺序方案中的记录。
索引文件:包含数据文件中的主键及其地址。
以下是索引顺序文件组织的关键属性:
记录可以按顺序读取,就像顺序文件组织一样。
如果主键已知,记录可被随机访问。索引文件用于获取记录的地址,然后从数据文件中提取记录。
排序索引被保持在文件系统中,其将关键值与文件中记录的位置相关联。
也可以创建备用索引来获取的记录。
这种文件需要在定义的时候指定KEY
3.相对文件组织
相对文件由依据相对地址排序的记录组成。以下是相对文件组织的关键属性:
记录可以按顺序读取,就像顺序和索引顺序文件组织一样。
记录可以使用relative key(相对键)访问。relative key表示记录相对于文件起始地址的位置。
记录可以使用relative key插入。相对地址使用relative key计算。
相对文件提供对记录最快的访问。
这个文件系统的主要缺点是,如果某些中间记录丢失,它们也将占据空间。

4.数据结构

1.数据类型

常用的字符主要有 9型,X(Char 字符)型,字母型。9型的可以直接赋给X型,反过来不可以。数值常量不可以赋给X型。
具体语法规则是:01 A PIC 9(10) 定义一个变量A,这个变量是10位的9型

01 B PIC X(10)  定义一个变量B,这个变量是10位的字符型。

变量在定义时可以在最后加上VALUES来定义一个初始值。

2.关键字

1.输入输出
(1)ACCEPT
    用于接收从操作系统或者从用户获取注入日期,时间和天等数据。ACCEPT一般要搭配FROM进行使用。具体用法如:ACCEPT WS-DATE FROM SYSTEM-DATE.
(2)DISPLAY
    
2.算数运算
(1)MOVE 一般搭配To使用 赋值语句 MOVE A TO B 把A的值赋给B
(2)DIVIDE 除法运算
(3)COMPUETR X = A ?B
    加减乘的运算都可以使用此语句。不同的运算只需要改变占位符中的类型。除法运算是不能使用这个语句的。
3.其他
(1)REDEFINES
    重定义子句用于定义具有不同数据描述的存储。如果一个或多个数据项不被同时使用,那么可以将相同的存储用于另一个数据项。因此,可以使用不同的数据项来引用相同的存储。具体用法如下所示:

01 WS-OLD PIC X(10).
	01 WS-NEW1 REDEFINES WS-OLD PIC 9(8).
	01 WS-NEW2 REDEFINES WS-OLD PIC A(10).

    重定义项的级数和重定义项必须是相同的,它不能是66或88级数。不要使用有重定义项的VALUE子句。在文件节(File section)中,不要使用01级数的重定义子句。重定义所定义的必须是你想要重新定义的下一个数据描述。一个重新定义的项目将始终具有相同的值。
(2)PERFORM
    使用格式 PERFORM 过程1 THRU 过程1的结束,过程1一般是一个过程节的开始,过程1的结束一般是这个过程节的结束,后面加上整数+TIMES(或者UNTIL+条件)能够实现循环。

PERFROM P1 THRU P1-EXIT
	UNTIL 条件

    执行P1程序,直到满足UNTIL后面的条件就跳出循环,类似于Java中的dowhile循环,只不过条件的判断之后进行的操作正好相反。
(3)INITALIZE
    用来初始化组项或基本项。数据名为RENAME的子句不能被初始化。数字数据项由ZEROES代替。字母数字或字母数据项由SPACES 代替。如果我们包含REPLACING术语,则数据项可被初始化为给定替换值。
(4)INSPECT
检查语句,一般搭配VARYING进行使用,可以实现计数的功能。

二、遇到的问题总结

1.ZERO,ZEROS,ZEROES具有相同的含义和作用
2.小数点在大型机中DISPLAY不显示
3.定点二进制定义长度及其在内存中的占位数

定义 占位数
9 (01) - 9 (04) 2
9 (05) - 9 (09) 4
9 (10) - 9 (18) 8

4.主程序调用子程序,给子程序传入值,并获得子程序的返回值
①在主程序进行调用 CALL 子程序 USING 变量1,变量2… 要传给子程序的变量和要接收的都要在这个地方进行定义
②在子程序的数据部的LINKAGE SECTION中定义对应变量,类似于函数定义的形参列表,名字可以不一致,但是长度和类型要和主程序传过来的要一致。
③要注意子程序在数据部LINKAGE SECTION中定义的变量名称和子程序本身定义的变量重名,一般可以在LINKAGE SECTION的中定义的同名变量后面加上OF文件名。
④子程序的最后要用ROLLBACK而不是直接STOP RUN,可以正常回到主程序。
5.Call调用子程序的时候,若使用动态调用,则可以在主程序中使用Cancel 子程序的语法,把内存中这个子程序销毁。

你可能感兴趣的:(语言,cobol)