cobol学习笔记(11)工作存储节 WOKING-STORAGE SECTION FILLER

  入出力レコード以外に、中間の演算や処理の為に必要なデータ項目は、この節に書く。
  また、データ項目にあらかじめ値を設定しておく事ができる。
  初期値を設定するものに以下のものがあります。

FILLER

メモリは確保するが、特に名前は付けない場合には、FILLERと記載します。

系统的关键字,其所描述的数据具有特殊的意义,不能通过其他用户自定义的数据名取代。

主页是占用记录为准,但在程序中不会用到。

cobol学习笔记(10)FD语句 FD ファイル記述

1、 FD语句主要用来描述与文件记录相关的物理信息,如记录实际格式,长度等。

RECORDING MODE IS F : 用于指明文件记录的格式。F表示 Fixed-length。通常,大多文件都是定长的。

2、 LABEL RECORDS ARE STANDARD:缺省为STANDARD。还可以取OMITTED,OMITTED表示忽略文件记录的标号。当指定为OMITTED时,将对应于用作输出打印的文件。也可写为:LABEL RECORD IS STANDARD.

3、 RECORD CONTAINS 132 CHARACTERS:标明每条文件记录包含132个字符。标准情况下输出的文件中的记录是包含132个字符的。同时,此处所指定的字符个数需要与后面由PIC语句指定的总字符数一致。

4、 DATA RECORD IS PRINT-LINE:指明该文件所包含的记录名。

FD语句语法格式如下:

FD FILE-NAME

    BLOCK CONTAINS N RECORDS

    RECORD CANTAINS N CHARACTERS

    LABEL RECORD IS OMITTED/STANDARD

     (OR: LABEL RECORDS ARE OMITTED/STANDARD)

    RECORDING MODE IS F

    DATA RECORD IS RECORD-NAME.

BLOCK CONTAINS N RECORDS:该从句用于指明在一个数据块中包含有多少条数据记录。通常情况下,N的值为0,表示在程序的执行过程中动态地对数据记录组块。

FD语句下所有的数据组和数据项组成了该文件的一条记录。

实际,在文件节(FILE SECTION)中,FD语句下定义的数据组和数据项是对相应文件记录逻辑上的一个划分。

【用途】
通称FD句と呼ばれ、ファイルの記述をおこなう。環境部のINPUT-OUTPUT SECTIONに記述したSELECT句のファイルに対して必ず対応するFD句を記述しなければならない。

ファイル記述項

COBOLプログラムでは,ファイル記述項がファイル節の中の最高レベルを表す.ファイル節の見出しに続けてファイル記述項を書く.ファイル記述項は,レベル指示語FD,ファイル名及び幾つかの独立な句の並びで構成し,レコードやブロックの大きさ,ラベルレコードの有無,ラベル項目の値,ファイルを構成するレコードの名前及び論理的な印字ページの行数を指定する.ファイル記述項自体は,分離符の終止符でとめる.

レコード記述の構造

レコード記述(record description)は,レコードの性質を記述する一群のデータ記述項で構成する.

データ記述項は,レベル番号とそれに続くデータ名又はFILLER句及び幾つかの必要な独立した句の並びで構成する.レコード記述は,階層構造を有する.ある項に書く句は,それに従属する項があるかないかによって異なる.

初期値

ファイル節のデータ項目の初期値は,不定である.

機能

ファイル記述項は,ファイルの物理的な構造,識別及び順ファイルに関連するレコード名の情報を与える.

cobol学习笔记(9)COBOL的数据描述

程序中所有数据间的关系在数据部中通过层指示符和层号来定义。

层指示符(level indicator)和其描述条目一起指定了程序中的每个文件。FD是文件描述的层指示符,SD是sort-merge文件描述的层指示符。

层号(level-number)和其描述条目一起指定了具体数据的属性。层号包括范围[01,49]中的一位或两位整数,以及3个特殊层号:66、77、88。

基本数据项(elementary items)是数据的基本划分。

组数据项(group items)是基本数据项的组合。组还可以组合成包含一个或多个子组的更大的组。不带GROUP-USAGE从句的组是英数字型的组,无论其所包含的基本数据项是如何表示的。GROUP-USAGE的用法为:

GROUP-USAGE [IS] NATIONAL.

每个组数据项和基本数据项都是一个单独的条目,都必须被赋予一个层号。

01:它是最高层,必须从A区开始。可以是英数字型组数据项、NATIONAL组数据项或基本数据项。
02~49:可以从A区或B区开始。层次越低的数据项被赋予越大的层号,它们之间不必是连续的。
66:必须包含一个RENAMES从句,用于重新编制前面已定义的数据项。

格式:
66 DATA-1 RENAMES DATA-2 [THROUGH/THRU DATA-3].

例1——————————-

01 RECORD-I

    05 DN-1… .

    05 DN-2… .

    05 DN-3… .

    05 DN-4… .

66 DN-6 RENAMES DN-1 THROUGH DN-3.

图示:

│DN-1│DN-2│DN-3│DN-4│

┕━━━DN-6━━━┙

例2——————————-

01 RECORD-II

    05 DN-1… .

        10 DN-2… .

        10 DN-2A… .

    05 DN-1A REDEFINES DN-1.

        10 DN-3A… .

        10 DN-3… .

        10 DN-3B… .

    05 DN-5… .

66 DN-6 RENAMES DN-2 THROUGH DN-3.

图示:

┍━━━DN-1 ━━━━┑

│DN-2 │   DN-2A   │DN-5 │

┍━━━DN-1A━━━━┑

│DN-3A │DN-3│DN-3B│

┕━━DN-6━━┙

77:必须从A区开始。用于标识工作存储节或连接节中的一个独立的数据描述条目。它不是其它项目的细分项,本身也不能细分。
88:标识与条件变量的某个特定值相关的条件名。
01 AGE-GROUP     PIC 99.             //条件变量(conditional variable)

    88 INFANT    VALUE 0.            //条件名(condition name),下同

    88 BABY      VALUE 1, 2.

    88 CHILD     VALUE 3 THRU 12.

    88 TEENAGER VALUE 13 THRU 19.

用法:

IF INFANT //如果AGE-GROUP的值为0

   …     //执行语句

数据对齐规则:

数据在基本数据项中的对齐标准取决于接收它的数据项的类型。

数字型(numeric):按假定的小数点对齐,如果需要,会发生截断或以0填充。如果没有显式地指定小数点,则认为小数点紧接在字段的最右边。
数字编辑型(numeric-edited):按小数点对齐,如果需要,会在任意一端发生截断或以0填充。
内部浮点数(internal floating-point):小数点被假定紧接在字段的最左边,数据向左对齐,指数被相应地调整。
外部浮点数(external floating-point):数据向左对齐,指数被相应地调整。
英数字型(alphanumeric)/英数字编辑型(alphanumeric-edited)/字母型(alphabetic)/DBCS:左对齐,如果需要,会在右端发生截断或以空格填充。如果指定了JUSTIFIED/JUST从句,则右对齐。
national/national-edited:同上,区别是用Unicode空格(NX’0020’)进行填充。

数据描述从句:

FILLER:指定程序中不被显示提到的数据项。如果省略了数据名及FILLER,则相当于使用了FILLER。在INITIALIZE语句中,FILLER数据项将被忽略。

BLANK WHEN ZERO/ZEROS/ZEROES:当数据项的值为零时,该项只包含空格。只能用于数字型和数字编辑型的基本数据项,且其PICTURE字符串不包含S或*,必须被显式或隐式地描述为USAGE DISPLAY或USAGE NATIONAL。不能用于日期字段。

JUSTIFIED/JUST [RIGHT]:右对齐。只用于英数字型(alphanumeric)/英数字编辑型(alphanumeric-edited)/字母型(alphabetic)/DBCS/national/national-edited。

OCCURS:指定一个表(数组),其元素可以通过下标来访问,下标从1开始。OCCURS不能用于01、66、77和88层的项目。多维表通过嵌套OCCURS来实现,其下标格式为(m,n,k…)或(m n k…)。格式:

OCCURS INT-1 [TO INT-2] [TIMES] DEPENDING [ON] DATA-1

ASCENDING/DESCENDING [KEY] [IS] DATA-2…

INDEXED [BY] IDX-1… .

其中,INT-2必须比INT-1大。

DEPENDING ON从句定义不定长的表。DATA-1必须是整数数据项,其当前值代表了表中当前的元素个数。

ASCENDING/DESCENDING KEY短语指定表中的数据必须按升序或降序排列。DATA-2…必须按其重要性的降序列出。所有KEY的个数不能超过12个,所有KEY的长度和不能超过256。

INDEXED BY定义表的索引。可以为一个特定的表创建索引(用INDEXED BY),此索引也可以用于其它表,只要两个表具有相同数目及相同长度的元素;也可以单独创建一个索引(用USAGE [IS] INDEX),此索引可以用于任何一个表。例:

05 TABLE-ITEM PIC X(8) OCCURS 10 INDEXED BY INX-A.

77 INX-B USAGE IS INDEX.

    PERFORM VARYING INX-B FROM 1 BY 1 UNTIL INX-B > 10

      DISPLAY TABLE-ITEM(INX-B)

    END-PERFORM.

PICTURE/PIC [IS]:指定基本数据项的一般特征和编辑要求。PICTURE从句不可用于INDEX数据项、RENAMES主语、POINTER和内部浮点数。

picture符号的含义:

A:容纳一个拉丁字母或空格。占据数据项大小中的一个字符位。
B:容纳一个空格。占据数据项大小中的一个字符位。
E:标示外部浮点数中指数的起点。占据数据项大小中的一个字符位。
G:一个DBCS字符。占据数据项大小中的一个字符位。
N:一个DBCS字符或NATIONAL字符。占据数据项大小中的一个字符位。
P:指定假定的十进制缩放位置,不计入数据项大小。
    只能在picture字符串的最左边或最右边指定一串连续的P。例:PPP999的值范围为0~.000999,
    S999PPP的值范围为-999000~-1000、0、1000~999000。
S:正负号指示符,不计入数据项大小,如果指定了SIGN … SEPARATE,则占据数据项大小中的一个字符位。
    S只能是picture字符串最左边的一个字符。
V:指定假定小数点的位置,不计入数据项大小。当小数点位于picture字符串最右边时,V是多余的。
    V只能在给定的picture字符串中出现一次。
X:容纳计算机英数字符集中任意一个被允许的字符。占据数据项大小中的一个字符位。
Z:代表一个先头数字字符位,当该位为0时,将用空格代替。占据数据项大小中的一个字符位。
9:一个数字。占据数据项大小中的一个字符位。
0:数字0。占据数据项大小中的一个字符位。
/:斜杠。占据数据项大小中的一个字符位。
,:逗号。占据数据项大小中的一个字符位。
.:一个编辑字符,代表用于对齐的小数点。另外也代表一个句号位,占据数据项大小中的一个字符位。
+、-:用于编辑项的正负号控制符。占据数据项大小中的一个字符位。
        "+"表示对于正值将输出"+"表示正数,负值将输出"-"表示负数;
        "-"表示对于正值将输出空表示正数,负值将输出"-"表示负数。
*:代表一个先头数字字符位,当该位为0时,将用*代替。占据数据项大小中的一个字符位。
   紧跟在其中任一符号后的括号内的无符号非0整数表示该符号连续出现的个数。

REDEFINES:用不同的数据描述条目描述同一块计算机内存区域。

格式:
level-number [DATA-1/FILLER] REDEFINES DATA-2.

DATA-1及其下级项不能包含VALUE从句。DATA-2的描述项可以有REDEFINES从句,不可以有OCCURS从句,但DATA-2可以是OCCURS数据项的下级项。DATA-1和DATA-2必须具有相同级别,但层号不必相同,且不能是66或88。DATA-1的长度可以比DATA-2的长度大,这不会改变DATA-2的长度。

如果 A REDEFINES B. 则 MOVE A TO B 和 MOVE B TO A 的结果可能是未定义的。

SIGN:为带符号数字项指定运算符的位置和表现形式。

格式:
[SIGN [IS]] LEADING/TRAILING [SEPARATE [CHARACTER]].

该从句只能用于一个用语为DISPLAY或NATIONAL且其picture字符串中包含S的基本数字数据项,或者至少包含一个此类数据项的组数据项。当用于后者时,SIGN从句只作用于组中包含的如前者的数据项,其它数据项将不受此从句影响。USAGE NATIONAL必须包含SEPARATE短语。

SYNCHRONIZED:指定基本数据项在内存的自然边界上的对齐方式。可用于基本数据项和01层组数据项。

格式:
SYNCHRONIZED/SYNC [LEFT/RIGHT].

USAGE:指定数据在内存中的表示格式。可用于除66和88外的任意层次的数据描述条目。组数据项的USAGE将作用于组内每一个基本数据项。当USAGE没有被显式地指定时,将默认为如下的USAGE:

DISPLAY:当PICTURE从句只包含G、N以外的符号。
NATIONAL:当PICTURE从句只包含一个或多个N,并且编译器选项NSYMBOL(NATIONAL)有效。
DISPLAY-1:当PICTURE从句只包含一个或多个N,并且编译器选项NSYMBOL(DBCS)有效。

计算项(computational items)用于算术运算,必须是数字型。其最大长度为18位数,除了PACKED-DECIMAL项外。如果编译器选项ARITH(COMPAT)有效,PACKED-DECIMAL的最大长度为18位数;如果ARITH(EXTEND)有效,则PACKED-DECIMAL的最大长度为31位数。其PICTURE字符串只能包含:9、S、V、P。COMP-1和COMP-2不能有PICTURE字符串。计算项包括以下用语(COMP是COMPUTATIONAL的缩写,二者等价):

BINARY:二进制数据项。负数用其绝对值的2的补码表示。所占内存取决于其PICTURE从句中定义的十进制数的个数。
位数:         内存:

1~4           2个字节

5~9           4个字节

10~18       8个字节

二进制数是big-endian的,运算符包含在最左边的位上。

PACKED-DECIMAL:内部十进制数据项。PICTURE字符串中每2个十进制数占用一个字节的内存,除了最右边的字节只包含1个十进制数及符号。
COMP:等价于BINARY。
COMP-1:内部浮点数据项(单精度)。4字节长。
COMP-2:内部浮点数据项(双精度)。8字节长。
COMP-3:等价于PACKED-DECIMAL。
COMP-4:等价于BINARY。
COMP-5:本地二进制数据项。其取值范围可达到本地二进制表示所能容纳的范围,而不受限于PICTURE字符串中9的个数所指的值。
PIC:                   内存:       取值范围:

S9(01)~S9(04) 2个字节      2^(-15)~2^15-1

S9(05)~S9(09) 4个字节      2^(-31)~2^31-1

S9(10)~S9(18) 8个字节      2^(-63)~2^63-1

9(01)~9(04)      2个字节      0~2^16-1

9(05)~9(09)      4个字节      0~2^32-1

9(10)~9(18)      8个字节      0~2^64-1



cobol学习笔记(8)COBOL的基本结构 例

//标识部
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. PGMNAME. //指定本程序名。此段是必须的,并且必须排在标识部的最前头。

//环境部
000003 ENVIRONMENT DIVISION.

//配置节
000004 CONFIGURATION SECTION.

000005 SOURCE-COMPUTER. IBM-PC WITH DEBUGGING MODE. //WITH从句指定启用调试代码。

000006 OBJECT-COMPUTER. IBM-PC.

000007 SPECIAL-NAMES.
000008     CURRENCY-SIGN IS $. //指定货币符号为"$"。
000009     DECIMAL-POINT IS COMMA. //在PIC字符串或数字字面值中交换逗号","和小数点"."的功能。

//输入输出节
000010 INPUT-OUTPUT SECTION.
000011 FILE-CONTROL. //命名程序所用文件,并将其与外部文件相关联。
000012     SELECT INPUT-FILE ASSIGN TO "IN.DAT".

//数据部
000013 DATA DIVISION.

//文件节
000014 FILE SECTION. //定义数据文件的结构。
000015 FD INPUT-FILE. //File Description.后面的文件名必须与前面SELECT语句中的一致。
000016 01 INPUT-RECORD-1 PIC X(100). //描述文件属性及与其关联的数据记录(可以是多个)。
000017 01 INPUT-RECORD-2 //同一存储区域的另一种定义。重定义INPUT-RECORD-1。
000018     03 ITEM-1 PIC X(20).
000019     03 ITEM-2 PIC X(80).

//工作存储节,描述程序处理过程中所涉及的不属于文件的数据记录。
//此存储区在运行单元开始时被分配,在运行单元结束时被销毁,在此过程中将保持其最后使用值。
000020 WORKING-STORAGE SECTION.
000021 01 WORK-FIELD PIC X(20).

//连接节,用于被调用程序,描述从调用程序传递过来的数据。
000022 LINKAGE SECTION.
000023 01 LNK-FIELD PIC X(10).

//过程部,被调用程序可以包含USING从句用于接收调用程序传递的参数数据,主调程序不需要。
//BY REFERENCE是默认值,可以省略。
000024 PROCEDURE DIVISION USING BY REFERENCE LNK-FIELD.

//过程部处理逻辑的细分。
000025 PGMNAME-START SECTION.
000026     PERFORM P-PROC-1-RTN.
000027     PERFORM P-PROC-2-RTN.
000028     EXIT PROGRAM.                  //返回调用程序(同GOBACK)。

000029 P-PROC-1-RTN SECTION.
000030 P-PROC-1.
000031     DISPLAY "first program:".
000032 P-PROC-1-EXT.
000033     EXIT.

//相当于CONTINUE,其后的任何语句都会被执行。

000034 P-PROC-2-RTN SECTION.
000035 P-PROC-2.
000036     DISPLAY "HELLO, WORLD!".
000037 P-PROC-2-EXT.
000038     EXIT.

cobol学习笔记(7)COBOL的程序结构 PROCEDURE DIVISION 过程部 手続き部

実際に処理を行う手続き節(SECTION)を記述します。
一つの「xxSECTION」から「EXIT」までが一つの節になります。

过程部是COBOL程序的最后一个部分。程序的主体:程序的逻辑运算在此操作。
包含程序运行时要执行的所有语句,对数据操作的程序逻辑。
1.每个程序分为四大节(模块),
• 前处理(初始化变量,设定初始值等)
• 主处理(程序业务处理部分)
• 后处理(程序正常结束时的出口)
• 错误处理(程序异常结束时的出口)

2.对于子程序,PROCEDURE DIVISION 后应列出LINK节中定义的参数。
如:   PROCEDURE    DIVISION USING LINK-INPUT-DATA LINK-OUTPUT-DATA.

3.程序结束。
• 主程序 STOP RUN.
• 子程序 GO BACK.

过程部的组件包括语句、句子、段和节。
(1) 语句(statement):以动词开头的单词、直接数和分隔符的组合。语句应一律从B区(12列开始)开始写,续行也应从B区开始。
(2) 句子(sentence):以英文句号(.)结尾的一系列语句。
(3) 段(paragraph):由段名、句号分隔符和零或几条句子组成。段的最后一条语句要用英文句号结束。
(4) 节(section):由节标题加上保留字SECTION和分隔符句号。
注:段名应在节中保持唯一性、节名应在程序中保持唯一性。段名不能与节名重复。引用段名时可以用所属的节限定如下:GO TO PARA-1 IN SECTION-22.

过程部的部头格式为:

PROCEDURE DIVISION [USING [[BY] REFERENCE/VALUE] DATA-1…] [RETURNING DATA-2].

USING短语用于子程序,指定程序被调用时所接收的参数。DATA-1…必须是LINKAGE SECTION中定义为01层或77层的数据项,但在调用程序的CALL语句的USING短语中指定的数据项可以是其数据部中定义的任意层的数据项。DATA-1…的数据描述项中可以包含REDEFINES从句。可以从非COBOL程序CALL COBOL程序,或者从系统命令向COBOL主程序传递用户参数。调用程序与子程序的USING短语中的标识符是按位置而不是名字来对应的,相应的标识符必须包含相同的字节数,尽管它们的数据描述不必相同。BY REFERENCE和BY VALUE短语作用于其后的所有参数,直到出现另一个此短语。

RETURNING短语指定一个用于接收程序结果的数据项,这是一个输出参数。DATA-2必须是LINKAGE SECTION中定义为01层或77层的数据项。此短语不能用于包含ENTRY语句的程序、嵌套程序和主程序。

过程部的结束由以下之一标识:

碰到嵌套程序的标识部部头。
END PROGRAM记号。
到达程序的尾部,后面再没有任何代码行了。