IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION,
COBOL 经典面试题库(中英文版) 收藏
Q1) Name the divisions in a COBOL program ?.
A1)
PROCEDURE DIVISION.
Q:列举 COBOL 的 DEVISION
A:标识部,环境部,数据部,过程部
Q2) What are the different data types available in COBOL?
A2) Alpha-numeric (X), alphabetic (A) and numeric (9).
Q:COBOL 有哪些可用的数据类型
A:字符型(这里指的是包含字母和数字),字母型,数字型
Q3) What does the INITIALIZE verb do? - GS
A3) Alphabetic, Alphanumeric fields & alphanumeric edited items are set to SPACES. Numeric,
Numeric edited items set to ZERO. FILLER , OCCURS DEPENDING ON items left untouched.
Q:INITIALIZE 这个词做了些什么
A:将字母,字符,数字区域都置成空格(置空),将数字区置 0, FILLER 和 OCCURS
DEPENDING ON 项不处理
Q4) What is 77 level used for ?
A4) Elementary level item. Cannot be subdivisions of other items (cannot be qualified), nor can
they be subdivided themselves.
Q:77 层有什么作用
A:基本层数据项,不能用做细分别的层,也不能被细分
Q5) What is 88 level used for ?
A5) For condition names.
Q:88 层有什么作用
A:条件逻辑层
Q6) What is level 66 used for ?
A6) For RENAMES clause.
Q:66 层有什么作用
A:重命名层
Q7) What does the IS NUMERIC clause establish ?
A7) IS NUMERIC can be used on alphanumeric items, signed numeric & packed decimal items
and unsigned numeric & packed decimal items. IS NUMERIC returns TRUE if the item only
consists of 0-9. However, if the item being tested is a signed item, then it may contain 0-9, + and
- .
Q:IS NUMERIC 这个子句怎么确定(也就是说确定句子的真值)
A:IS NUMERIC 用在字符项,带符号数字和压缩十进制项以及不带符号数字和压缩十进制
项。如果目标项只含 0~9 则返回 TRUE。但是,如果待测项目是个带符号数,那么他就含有
0-9 还有+和-
1
Q8) How do you define a table/array in COBOL?
A8) ARRAYS.
05 ARRAY1 PIC X(9) OCCURS 10 TIMES.
05 ARRAY2 PIC X(6) OCCURS 20 TIMES INDEXED BY WS-INDEX
Q:COBOL 中怎么建表/数组
A:如上.
Q9) Can the OCCURS clause be at the 01 level?
A9) No.
Q:OCCURS 子句能用在第一层吗
A:不能
Q10) What is the difference between index and subscript? - GS
A10) Subscript refers to the array occurrence while index is the displacement (in no of bytes) from
the beginning of the
array. An index can only be modified using PERFORM, SEARCH & SET. Need to have index for
a table in order to
use SEARCH, SEARCH ALL.
Q:索引和下标有什么区别
A:下标指的是数组位置,而索引表示距离数组头的位移。
下标可以指定数组中任意中位置的元素(只要知道其下标),下标只能是数字型常量或者数
字型变量(但是不能在指定的时候修改,如:A(K+1)这样是不行的,要修改的话要在指
定的外部改,如:ADD 1 TO K,而索引的话是从表头/数组头开始检索(以 BY N 的指定检
索规律往后滚)
再者,索引只能通过 PERFORM, SEARCH 和 SET 来修改,如果要在一个表中使用 SEARCH,
SEARCH ALL,那这个表就要有索引(因为 SEARCH, SEARCH ALL 的参数中指定索引,
所以即使其有很多限制还是得用它)
Q11) What is the difference between SEARCH and SEARCH ALL? - GS
A11) SEARCH - is a serial search.
SEARCH ALL - is a binary search & the table must be sorted ( ASCENDING/DESCENDING
KEY clause to be used & data loaded in this order) before using SEARCH ALL.
Q:SERACH 和 SERACH ALL 有什么区别
A:SEARCH 是顺序查找
SERACH ALL 是 2 叉查找(相信数据结构学过 2 叉树的都不会陌生),在使用 SEARCH ALL
前表必须有一个递增/递减的 KEY,并且表已经按照其 KEY 值排序了,这样才能使用
SEARCH ALL
Q12) What should be the sorting order for SEARCH ALL? - GS
A12) It can be either ASCENDING or DESCENDING. ASCENDING is default. If you want the
search to be done on an
array sorted in descending order, then while defining the array, you should give DESCENDING
KEY clause. (You
2
must load the table in the specified order).
Q:为了使用 SEARCH ALL,存贮顺序是怎么样的
A:他必须是递增或者是递减的,默认地政。如果你想在一个递减顺序存贮的表/数组使用搜
索的话,那么当定义表/数组的时候你应该加一个 DESCENDING KEY 子句(这之前表要已
经按指定的顺序排序了)
Q13) What is binary search?
A13) Search on a sorted array. Compare the item to be searched with the item at the center. If it
matches, fine else repeat the process with the left half or the right half depending on where the
item lies.
Q:什么是 2 叉查找
A:将你要找的目标项与数组的正中项比较,找到就结束搜索,没找到则继续如此循环(比
较下一个中值),取哪一半取决于目标值大于中值还是小于中值
PS:联想 2 叉树的查找规律就很好理解,因为所谓的“表“本身也就是数组
Q14) My program has an array defined to have 10 items. Due to a bug, I find that even if the
program access the
11th item in this array, the program does not abend. What is wrong with it?
A14) Must use compiler option SSRANGE if you want array bounds checking. Default is
NOSSRANGE.
Q:我的程序有个数组定义了 10 项。因为有个 BUG,我发现即使访问第 11 项,程序也不异
常终止。那是出了什么问题
A: 必 须使 用 编 译器 的 一 个选 项 SSRANGE , 如 果你 想 检 查数 组 的 超界 问 题 。 默认 是
NOSSRANGE
Q15) How do you sort in a COBOL program? Give sort file definition, sort statement syntax and
meaning. - GS
A15) Syntax: SORT file-1 ON ASCENDING/DESCENDING KEY key…. USING file-2
GIVING file-3.
USING can be substituted by INPUT PROCEDURE IS para-1 THRU para-2
GIVING can be substituted by OUTPUT PROCEDURE IS para-1 THRU para-2.
file-1 is the sort (work) file and must be described using SD entry in FILE SECTION.
file-2 is the input file for the SORT and must be described using an FD entry in FILE SECTION
and SELECT
clause in FILE CONTROL.
file-3 is the out file from the SORT and must be described using an FD entry in FILE SECTION
and SELECT
clause in FILE CONTROL.
file-1, file-2 & file-3 should not be opened explicitly.
INPUT PROCEDURE is executed before the sort and records must be RELEASEd to the sort
work file from the input procedure.
3
OUTPUT PROCEDURE is executed after all records have been sorted. Records from the sort
work file must be RETURNed one at a time to the output procedure.
Q:怎么在一个 COBOL 程序中排序?给出排序文件的定义,排序语法和意思
A:语法就是 SORT file-1 ON ASCENDING/DESCENDING KEY key…. USING file-2 GIVING
file-3.
USING 后程序的输入接口,这个地方可以替换成一个输出过程,也就是说写一个过程往
USING 这个接口中导数据(要在这个过程中 READ,AT END,……),这个过程在将数据
释放到执行排序的文件中之前执行,GIVING 后是输出借口,用法类似。
此例中输入文件是 file-2 输出文件是 file3(这样个文件必须在文件区中用 FD 和在文件控制中
用到 SELECT)真正执行排序的 file-1,这里需要注意的是 file-1 中的文件区不能用 FD,应该
用 SD,file-2 和 3 还是一样(用 FD),具体可以看一下书上的例子
Q16) How do you define a sort file in JCL that runs the COBOL program?
A16) Use the SORTWK01, SORTWK02,….. dd names in the step. Number of sort datasets
depends on the volume of data
being sorted, but a minimum of 3 is required.
Q:怎么在 JCL 中定义一个排序文件来跑这个 COBOL 程序
A:用 SORTWK01, SORTWK02,…..作为 DATA SET NAME。用多少取决于你要排序的数量,
但是至少 3 个。
Q17) What is the difference between performing a SECTION and a PARAGRAPH? - GS
A17) Performing a SECTION will cause all the paragraphs that are part of the section, to be
performed.
Performing a PARAGRAPH will cause only that paragraph to be performed.
Q:执行一个区和一个段有什么区别
A:简单来说的话就是区的概念比段大,执行一个区就要执行其内部所有段,执行段的话只
执行该段。
Q18) What is the use of EVALUATE statement? - GS
A18) Evaluate is like a case statement and can be used to replace nested Ifs. The difference
between EVALUATE and
case is that no ‘break’ is required for EVALUATE i.e. control comes out of the EVALUATE as
soon as one match is
made.
Q:EVALUATE 语句有什么作用
A:EVALUATE 就象个 CASE 语句(多重开关语句,学过 C 的总知道吧),不同点在于
EVALUATE 不需要 BREAK,一旦匹配就跳出 EVALUATE 语句了
Q19) What are the different forms of EVALUATE statement?
A19)
EVALUATE EVALUATE SQLCODE ALSO FILE-STATUS
WHEN A=B AND C=D WHEN 100 ALSO ‘00′
imperative stmt imperative stmt
WHEN (D+X)/Y = 4 WHEN -305 ALSO ‘32′
4
imperative stmt imperative stmt
WHEN OTHER WHEN OTHER
imperative stmt imperative stmt
END-EVALUATE END-EVALUATE
EVALUATE SQLCODE ALSO A=B EVALUATE SQLCODE ALSO TRUE
WHEN 100 ALSO TRUE WHEN 100 ALSO A=B
imperative stmt imperative stmt
WHEN -305 ALSO FALSE WHEN -305 ALSO (A/C=4)
imperative stmt imperative stmt
END-EVALUATE END-EVALUATE
Q20) How do you come out of an EVALUATE statement? - GS
A20) After the execution of one of the when clauses, the control is automatically passed on to the
next sentence after the
EVALUATE statement. There is no need of any extra code.
Q:怎么跳出一条 EVALUATE 语句
A:象 18 题目说的那样,一旦匹配了某一个“WHEN“语句就自动跳出了,不需要什么额
外的代码来跳出
Q21) In an EVALUATE statement, can I give a complex condition on a when clause?
A21) Yes.
Q:在一个 EVALUATE 语句的某个 WHEN 分支中能否再插入复杂的情况(也就是嵌套)
A:当然可以,当多个参数作为控制变量的时候 1 个 WHEN 内部可以嵌套更多的情况
Q22) What is a scope terminator? Give examples.
A22) Scope terminator is used to mark the end of a verb e.g. EVALUATE, END-EVALUATE; IF,
END-IF.
Q:什么是结束终止符
A:结束终止符是搭配一些范围指令的,也就是标识一些范围指令的结束。如:EVALUATE,
END-EVALUATE; IF, END-IF 如果没有该结束符,该条语句将终止不了
Q23) How do you do in-line PERFORM? - GS
A23) PERFORM … …
END-PERFORM
Q:怎么使用内嵌的 PERFORM
A:PERFORM … …
END-PERFORM
所谓内嵌也就是 PERFORM 被嵌在某些比如循环语句中担当执行主体,同时通过 UNTIL 来
指定结束判定
Q24) When would you use in-line perform?
5
A24) When the body of the perform will not be used in other paragraphs. If the body of the
perform is a generic type of code
(used from various other places in the program), it would be better to put the code in a separate
Para and use
PERFORM Para name rather than in-line perform.
Q:什么时候使用内嵌式 PERFORM
A:当该段 PERFORM 的内容不被其他段用到,只在某些局部代码中(当然 PERFORM 的
主体所用到的参数也都是局部的,例如循环)使用,如果 PERFORM 主体的代码是一般的
(用到了别的程序段的变量),还是使用 PERFORM Para name 这样的形式比较好(也就是
相对与内于 PERFORM 的外部 PERFORM)。
Q25) What is the difference between CONTINUE & NEXT SENTENCE ?
A25) They appear to be similar, that is, the control goes to the next sentence in the paragraph. But,
Next Sentence would
take the control to the sentence after it finds a full stop (.). Check out by writing the following
code example, one if
sentence followed by 3 display statements (sorry they appear one line here because of formatting
restrictions) If 1 > 0
then next sentence end if display‘line 1′ display‘line 2′. display‘line 3′. *** Note- there
is a dot (.) only at the end of
the last 2 statements, see the effect by replacing Next Sentence with Continue ***
Q:CONTINUE 和 NEXT SENTENCE 有什么不同
A:两者比较相似,都是将程序控制权交给下一句,但是用 NEXT SENTENCE 的时候,只
有当碰到句结束符(就是句末的‘.’)才会将执行下句
这道题我用了 2 个例子测试了一下:
1:IF TEST-NUMERIC > 0
THEN NEXT SENTENCE
END-IF
DISPLAY ‘LINE1′ DISPLAY ‘LINE2′. DISPLAY ‘LINE3′.(请注意代码中的‘.’
号)
结果输出:LINE3
2:IF TEST-NUMERIC > 0
THEN CONTINUE
END-IF
DISPLAY ‘LINE1′ DISPLAY ‘LINE2′. DISPLAY ‘LINE3′.
结果输出:LINE1
LINE2
LINE3
相信已经区别已经比较明显了,NEXT SENTENCE 是靠句末的结束符(也就是‘.‘)来判
断下一句的,而 CONTINUE 是通过句头的保留字(这例中是 DISPLAY)来判断下一句的
Q26) What does EXIT do ?
A26) Does nothing ! If used, must be the only sentence within a paragraph.
Q:EXIT 语句有什么作用
A:什么都不做,如果用到的话,肯定是作为一段的唯一的一句话,注意:这里不是子程序
6
中用的 EXIT PROGRAME
Q27) Can I redefine an X(100) field with a field of X(200)?
A27) Yes. Redefines just causes both fields to start at the same location. For example:
01 WS-TOP PIC X(1)
01 WS-TOP-RED REDEFINES WS-TOP PIC X(2).
If you MOVE ‘12′ to WS-TOP-RED,
DISPLAY WS-TOP will show 1 while
DISPLAY WS-TOP-RED will show 12.
Q:能不能把 X(100)的区域重定义成 X(200)
A:可以,重定义只是相当于把两个区域的首地址放在一起,从上面这个例子也很好理解
A28) Can I redefine an X(200) field with a field of X(100) ?
Q31)1 Yes.
Q:能不能把 X(200)的区域重定义成 X(100)
A:可以,原因同上
Q31)2 What do you do to resolve SOC-7 error? - GS
Q31) Basically you need to correcting the offending data. Many times the reason for SOC7 is an
un-initialized numeric item.
Examine that possibility first. Many installations provide you a dump for run time abend’s ( it can
be generated also
by calling some subroutines or OS services thru assembly language). These dumps provide the
offset of the last
instruction at which the abend occurred. Examine the compilation output XREF listing to get the
verb and the line
number of the source code at this offset. Then you can look at the source code to find the bug. To
get capture the
runtime dumps, you will have to define some datasets (SYSABOUT etc ) in the JCL. If none of
these are helpful, use
judgement and DISPLAY to localize the source of error. Some installation might have batch
program debugging
tools. Use them.
Q:怎么解决 SOC-7 错误
A:基本上你要看一下一些比较奇怪的数据,很多导致 SOC7 的原因都是因为数据项的初始
化。
首先检查所有的可能性。某些功能可能提供一个空间用来存贮那些运行时间 ABEND,并且
提供最近一次运行时间 ABEND 的偏移量的说明(也就是位于队列中的位置),检查编译器
的输出 XREF 队列以获得一些关键字。然后你就能看下源代码找出 BUG。为了捕获一些运
行时间的信息,你需要在 JCL 中建一个 DATASET(象 SYSABOUT 这样的),如果这些都
没用,那么再审查一下 ERROR 出现的位置判断一下原因。有些软件安装了会提供批处理程
序调试工具,那么可以就可以用这些工具了。
PS:以上大意就是说 SOC-7 这个错误多半是因为数据项初始化造成的,然后你应该到运行
7
后编译器的返回信息中去找这些 ERROR 出现的地方(我们常用的话应该就是走查 LOG),
查的时候多注意下数据项的初始化问题。
Q32) How is sign stored in Packed Decimal fields and Zoned Decimal fields?
Q32) Packed Decimal fields: Sign is stored as a hex value in the last nibble (4 bits ) of the storage.
Zoned Decimal fields: As a default, sign is over punched with the numeric value stored in the last
bite.
Q:在内部十进制区域和显示十进制区域符号是怎么存贮的
A:内部十进制是一个数字占 4 位(半字节),内存中用 16 进制来存,最后在追加 4 位作为
符号,如-4=01001101(末尾的 1101 表示负,1100 表示正),而我们用于显示的十进制,符
号并不占空间,只是在最后一位上标识一下
Q33) How is sign stored in a comp-3 field? - GS
Q33) It is stored in the last nibble. For example if your number is +100, it stores hex 0C in the last
byte, hex 1C if
your number is 101, hex 2C if your number is 102, hex 1D if the number is -101, hex 2D if the
number is -102 etc…
Q:COMP-3 区怎么存储符号
A:COMP-3 采用的是内部十进制的存储方式,所谓内部十进制就是压缩式的外部十进制存
储方式,上题讲过外部十进制每个数值都用 1 个字节存储,但前 4 位是存符号的,这样比较
浪费存储空间,所以内部十进制的存储方式就用半个字节(4 位)存储一个数字,在最后增
加 4 位作为符号(1100(C)为正,1101(D)为负)
Q34) How is sign stored in a COMP field ? - GS
Q34) In the most significant bit. Bit is ON if -ve, OFF if +ve.
Q:COMP 区怎么存储符号
A:COMP 是采用定点二进制的方式存储数据,也就是将一个十进制的数值转化成二进制再
进行存储,因为机器存储的形式也是二进制,所以定点二进制的读取是最快速的,因为 COMP
型的数据是用做计算(也就是说不用再转化成十进制打印),使用定点二进制将会非常高效。
这样的存储方式符号是保存在最高有效果位上,如:10=(00001010)₂,
-10=(00011010)₂
Q35) What is the difference between COMP & COMP-3 ?
Q35) COMP is a binary storage format while COMP-3 is packed decimal format.
Q:COMP 和 COMP-3 什么区别
A:这之前讲过了,COMP 采用定点二进制存储,COMP-3 采用内部十进制存储
Q36) What is COMP-1? COMP-2?
Q36) COMP-1 - Single precision floating point. Uses 4 bytes.
COMP-2 - Double precision floating point. Uses 8 bytes.
Q:COMP-1 是什么?什么是 COMP-2
A:其实之所以定义计算型数据(COMP~COMP-3)以区别 DISPLAY(能计算,但是要用
于打印)是为了考虑效率,因为大家知道文件导入(也就是 USER 使用的数据)一般是十
进制的,而机器存储都是二进制,那么当定义的数据光用来计算不用打印,处于效率考虑会
8