COBOL经典面试题库中文.docx
《COBOL经典面试题库中文.docx》由会员分享,可在线阅读,更多相关《COBOL经典面试题库中文.docx(15页珍藏版)》请在冰豆网上搜索。
COBOL经典面试题库中文
COBOL经典面试题库
Q1:
列举COBOL的DEVISION
A1:
标识部,环境部,数据部,过程部
Q2:
COBOL有哪些可用的数据类型
A2:
字符型(这里指的是包含字母和数字,字母型,数字型
Q3:
INITIALIZE这个词做了些什么
A3:
将字母,字符,数字区域都置成空格(置空,将数字区置0,FILLER和OCCURSDEPENDINGON项不处理
Q4:
77层有什么作用
A4:
基本层数据项,不能用做细分别的层,也不能被细分
(来源:
http:
//www.newcoin.info
Q5:
88层有什么作用
A5:
条件逻辑层
Q6:
66层有什么作用
A6:
重命名层
Q7:
ISNUMERIC这个子句怎么确定(也就是说确定句子的真值
A7:
ISNUMERIC用在字符项,带符号数字,浮点数,不带符号数。
如果目标项只含0~9则返回TRUE。
但是,如果待测项目是个带符号数,那么他就含有0-9还有+和-
05ARRAY1PICX(9OCCURS10TIMES.
05ARRAY2PICX(6OCCURS20TIMESINDEXEDBYWS-INDEX
Q8:
COBOL中怎么建表/数组
A8:
如上.
Q9:
OCCURS子句能用在第一层吗
A9:
不能
Q10:
索引和下标有什么区别
A10:
下标可以指定数组中任意中位置的元素(只要知道其下标,下标只能是数字型常量或者数字型变量(但是不能在指定的时候修改,如:
A(K+1这样是不行的,要修改的话要在指定的外部改,如:
ADD1TOK,而索引的话是从表头/数组头开始检索(以BYN的指定检索规律往后滚
再者,索引只能通过PERFORM,SEARCH和SET来修改,如果要在一个表中使用SEARCH,SEARCHALL,那这个表就要有索引(因为SEARCH,SEARCHALL的参数中指定索引,所以即使其有很多限制还是得用它
Q11:
SERACH和SERACHALL有什么区别
A11:
SEARCH是顺序查找
SERACHALL是2叉查找(相信数据结构学过2叉树的都不会陌生,在使用SEARCHALL前表必须有一个递增/递减的KEY,并且表已经按照其KEY值排序了,这样才能使用SEARCHALL
Q12:
为了使用SEARCHALL,存贮顺序是怎么样的
A12:
他必须是递增或者是递减的,默认地政。
如果你想在一个递减顺序存贮的表/数组使用搜索的话,那么当定义表/数组的时候你应该加一个DESCENDINGKEY子句(这之前表要已经按指定的顺序排序了
Q13:
什么是2叉查找
A13:
将你要找的目标项与数组的正中项比较,找到就结束搜索,没找到则继续如此循环(比较下一个中值,取哪一半取决于目标值大于中值还是小于中值PS:
联想2叉树的查找规律就很好理解,因为所谓的“表“本身也就是数组
Q14:
我的程序有个数组定义了10项。
因为有个BUG,我发现即使访问第11项,程序也不异常终止。
那是出了什么问题
A14:
必须使用编译器的一个选项SSRANGE,如果你想检查数组的超界问题。
默认是NOSSRANGE
Q15:
怎么在一个COBOL程序中排序?
给出排序文件的定义,排序语法和意思
A15:
语法就是SORTfile-1ONASCENDING/DESCENDINGKEYkey….USINGfile-2GIVINGfile-3.
USING后程序的输入接口,这个地方可以替换成一个输出过程,也就是说写一个过程往USING这个接口中导数据(要在这个过程中READ,ATEND,……,这个过程在将数据释放到执行排序的文件中之前执行,GIVING后是输出借口,用法类似。
此例中输入文件是file-2输出文件是file3(这样个文件必须在文件区中用FD
和在文件控制中用到SELECT真正执行排序的file-1,这里需要注意的是file-1
中的文件区不能用FD,应该用SD,file-2和3还是一样(用FD,具体可以看一下书上的例子
Q16:
怎么在JCL中定义一个排序文件来跑这个COBOL程序
A16:
用SORTWK01,SORTWK02,…..作为DATASETNAME。
用多少取决于你要排序的数量,但是至少3个。
Q17:
执行一个区和一个段有什么区别
A17:
简单来说的话就是区的概念比段大,执行一个区就要执行其内部所有段,执行段的话只执行该段。
Q18:
EVALUATE语句有什么作用
A18:
EVALUATE就象个CASE语句(多重开关语句,学过C的总知道吧,不同点在于EVALUATE不需要BREAK,一旦匹配就跳出EVALUATE语句了
Q19WhatarethedifferentformsofEVALUATEstatement?
A19
EVALUATEEVALUATESQLCODEALSOFILE-STATUS
WHENA=BANDC=DWHEN100ALSO‘00′
imperativestmtimperativestmt
WHEN(D+X/Y=4WHEN-305ALSO‘32′
imperativestmtimperativestmt
WHENOTHERWHENOTHER
imperativestmtimperativestmt
END-EVALUATEEND-EVALUATE
EVALUATESQLCODEALSOA=BEVALUATESQLCODEALSOTRUE
WHEN100ALSOTRUEWHEN100ALSOA=B
imperativestmtimperativestmt
WHEN-305ALSOFALSEWHEN-305ALSO(A/C=4
imperativestmtimperativestmt
END-EVALUATEEND-EVALUATE
Q20:
怎么跳出一条EVALUATE语句
A20:
象18题目说的那样,一旦匹配了某一个“WHEN“语句就自动跳出了,不需要什么额外的代码来跳出
Q21:
在一个EVALUATE语句的某个WHEN分支中能否再插入复杂的情况(也就是嵌套
A21:
当然可以,当多个参数作为控制变量的时候1个WHEN内部可以嵌套更多的情况
Q22:
什么是结束终止符
A22:
结束终止符是搭配一些范围指令的,也就是标识一些范围指令的结束。
如:
EVALUATE,END-EVALUATE;IF,END-IF如果没有该结束符,该条语句将终止不了
Q23:
怎么使用内嵌的PERFORM
A23:
PERFORM……
END-PERFORM
所谓内嵌也就是PERFORM被嵌在某些比如循环语句中担当执行主体,同时通过UNTIL来指定结束判定
Q24:
什么时候使用内嵌式PERFORM
A24:
当该段PERFORM的内容不被其他段用到,只在某些局部代码中(当然PERFORM的主体所用到的参数也都是局部的,例如循环使用,如果PERFORM主体的代码是一般的(用到了别的程序段的变量,还是使用PERFORMParaname这样的形式比较好(也就是相对与内于PERFORM的外部PERFORM。
Q25:
CONTINUE和NEXTSENTENCE有什么不同
A25:
两者比较相似,都是将程序控制权交给下一句,但是用NEXTSENTENCE的时候,只有当碰到句结束符(就是句末的‘.’才会将执行下句
这道题我用了2个例子测试了一下:
1:
IFTEST-NUMERIC>0
THENNEXTSENTENCE
END-IF
DISPLAY‘LINE1′DISPLAY‘LINE2′.DISPLAY‘LINE3′.(请注意代码中的‘.’号
结果输出:
LINE3
2:
IFTEST-NUMERIC>0
THENCONTINUE
END-IF
DISPLAY‘LINE1′DISPLAY‘LINE2′.DISPLAY‘LINE3′.
结果输出:
LINE1
LINE2
LINE3
相信已经区别已经比较明显了,NEXTSENTENCE是靠句末的结束符(也就是‘.‘来判断下一句的,而CONTINUE是通过句头的保留字(这例中是DISPLAY来判断下一句的
Q26:
EXIT语句有什么作用
A26:
什么都不做,如果用到的话,肯定是作为一段的唯一的一句话,注意:
这里不是子程序中用的EXITPROGRAME
01WS-TOPPICX(1
01WS-TOP-REDREDEFINESWS-TOPPICX(2.
IfyouMOVE‘12′toWS-TOP-RED,
DISPLAYWS-TOPwillshow1while
DISPLAYWS-TOP-REDwillshow12.
Q27:
能不能把X(100的区域重定义成X(200
A27:
可以,重定义只是相当于把两个区域的首地址放在一起,从上面这个例子也很好理解
Q28:
能不能把X(200的区域重定义成X(100
A28:
可以,原因同上
Q29:
怎么解决SOC-7错误
A29:
基本上你要看一下一些比较奇怪的数据,很多导致SOC7的原因都是因为数据项的初始化。
首先检查所有的可能性。
某些功能可能提供一个空间用来存贮那些运行时间ABEND,并且提供最近一次运行时间ABEND的偏移量的说明(也就是位于队列中的位置,检查编译器的输出XREF队列以获得一些关键字。
然后你就能看下源代码找出BUG。
为了捕获一些运行时间的信息,你需要在JCL中建一个DATASET(象SYSABOUT这样的,如果这些都没用,那么再审查一下ERROR出现的位置判断一下原因。
有些软件安装了会提供批处理程序调试工具,那么可以就可以用这些工具了。
PS:
以上大意就是说SOC-7这个错误多半是因为数据项初始化造成的,然后你应该到运行后编译器的返回信息中去找这些ERROR出现的地方(我们常用的话应该就是走查LOG,查的时候多注意下数据项的初始化问题。
Q30:
在内部十进制区域和显示十进制区域符号是怎么存贮的
A30:
内部十进制是一个数字占4位(半字节,内存中用16进制来存,最后在追加4位作为符号,如-4=01001101(末尾的1101表示负,1100表示正,而我们用于显示的十进制,符号并不占空间,只是在最后一位上标识一下
Q31:
COMP-3区怎么存储符号
A31:
COMP-3采用的是内部十进制的存储方式,所谓内部十进制就是压缩式的外部十进制存储方式,上题讲过外部十进制每个数值都用1个字节存储,但前4
位是存符号的,这样比较浪费存储空间,所以内部十进制的存储方式就用半个字节(4位存储一个数字,在最后增加4位作为符号(1100(C为正,1101(D为负
Q32:
COMP区怎么存储符号
A32:
COMP是采用定点二进制的方式存储数据,也就是将一个十进制的数值转化成二进制再进行存储,因为机器存储的形式也是二进制,所以定点二进制的读取是最快速的,因为COMP型的数据是用做计算(也就是说不用再转化成十进制打印,使用定点二进制将会非常高效。
这样的存储方式符号是保存在最高有效果位上,如:
10=(00001010₂,
-10=(00011010₂
Q33:
COMP和COMP-3什么区别
A33:
这之前讲过了,COMP采用定点二进制存储,COMP-3采用内部十进制存储
Q34:
COMP-1是什么?
什么是COMP-2
A34:
其实之所以定义计算型数据(COMP~COMP-3以区别DISPLAY(能计算,但是要用于打印是为了考虑效率,因为大家知道文件导入(也就是USER使用的数据一般是十进制的,而机器存储都是二进制,那么当定义的数据光用来计算不用打印,处于效率考虑会把它定义成COMP型,当然就会衍生出几类COMP以适应不用的数据类型的存储。
很明显,这里COMP-1就是采用内部短浮点(4个字节表示一个数,8位指数部分,24位表示数字部分,COMP-2用内部长浮点型(8个字节表示一个书,16位指数部分,48位表示数字部分以适应浮点数据的存储,长浮点精确度更高.
Q35:
怎么定义一个COMP-1型?
COMP-2型
A35:
不要用PICTURE描述,因为是确定分配多少内存的,直接用USAGE,如01WS-VARUSAGECOMP-1
Q36:
一个S9(7的COMP-3型占用多少字节?
A36:
占用4字节。
COMP-3用内部十进制存储,S9(7中的S是要占空间的,符号占4位,7个数字,每个4位(半个字节,所以是(4+7*4/8=4字节(字节和位的比例不要搞错了哦
Q37:
一个S9(7SIGNTRAILINGSEPARATE区域占多少字节
A37:
这里是每个符号单独分配空间(也就是没个数值用1个字节表示,就象最
常用的DISPLAY型的分配方式,算上S的空间,所以是7+1=8字节。
一般情况省略的SIGN子句都是隐含SIGNISTRAILING的
Q38:
一个S9(8COMP区域占多少字节
A38:
如果之前关于COMP的解释听懂了的话,那很显然就是4字节了(定点二进制用2字节存储1~4,4字节存储5~9,……类推,你可以自己推下,如果这块还不懂的可以问我或者查下书
Q39:
S9(8COMP型最多存储的最大值是什么
A39:
除了8个数值外不要忽略符号位
Q40:
COMPSYNC是什么
A40:
使数据项按“自然边界”排列。
SYNCHRONIZED(简写SYNC语句是同步安置语句。
不同的机器会有一个机器字的概念(以一个WORD四个字节举例,这个数字因机器各异,但往往是四个字节,两个机器字之间就是这里说的“自然边界”,也就是说机器每次从内存中取出二个字节长度的数据,但是一个数据项中含有的数值可能跨越几个机器字或者未填满机器字,这样连续读取虽然比较省空间,但是要引用某些机器字的时候要把多个拿出来重新组织(因为一个数值可能跨越多个数据字,也可能未满,机器就要判断一个机器字中哪些是前一个数值哪些是下个数值。
如果向左对齐的话就是想左“自然边界”靠,也就是说未满一个数据字的用空格(对非数字项或者零(数字项填充,填充部分不能插入其他数据项的内容,同理向右对齐就是向机器字的右“自然边界”靠,类似的在左边的空余部分填充。
按照自然边界存储相当与牺牲空间换取时间,存取效率,系统读取的机器字两段填充区域(0或者SPACE之间就是一个数值,效率很高。
Q41:
COBOL1定义的01层最大大小是多少,COBOLII中?
A41:
COBOLII中是16777215,没什么说的,自己翻书
Q42:
COBOL中如何涉及(引用调用以下这些文件
A42:
文件类型这里是COBOL在文件控制区中的文件组织访问形式(SELECT下面那句这里最好翻翻书或者事例代码反复记忆
定长文件用ORGANISATIONISSEQUENTIAL.UseRECORDINGMODEISF,BLOCKCONTAINS0
固定但是不是以块的组织形式用ORGANISATIONISSEQUENTIAL.UseRECORDINGMODEISF,不要使用BLOCKCONTAINS(因为不是以块的组织形式
变长文件用ORGANISATIONISSEQUENTIAL.UseRECORDINGMODEISV,BLOCK,CONTAINS0.在之后的文件区中的文件描述FD中不要编码记录长度为4字节
变长但是不是以块的组织形式用ORGANISATIONISSEQUENTIAL.UseRECORDINGMODEISV,同样不要使用BLOCKCONTAINS也不要编码记录长度为4字节(原因同上
ESDSVSAM文件用ORGANISATIONISSEQUENTIAL
KSDSVSAM文件用ORGANISATIONISINDEXED,RECORDKEYIS,ALTERNATERECORD作为关键字的RRDS文件用ORGANISATIONISRELATIVE,RELATIVEKEYIS
打印文件用ORGANISATIONISSEQUENTIAL.UseRECORDINGMODEISF,BLOCKCONTAINS0.(UseRECFM=FBAinJCLDCB
PS:
这道题是阐述COBOL怎么调用外部的各种文件,在文件控制区以及文件区中要定义的一些关键字,有我们最熟悉的FB(定长和VB(变长(当然我们的前提是这两类都是以BLOCK(块为单位的但是也有不为我们所知的文件类型(可能出现的情况很少,但是也确实存在,比如编译出的MODULE放的LOAD必须是V文件(文件组织形式是V当然在不写ORGANISATION这些关键字的时候都是默认为FB的,但是在处理一些复杂数据(比如VSAM数据还有和外部文件(比如JCL的连接的时候这些保留字都是要指定的,关于更具体的还是要翻书加强记忆
Q43:
COBOL中有哪些OPEN方式
A43:
有INPUT,OUTPUT,I-O,EXTEND这些OPEN模式
Q44:
当你想OPEN一个文件用来写入的时候,这属于什么方式
A44:
OUTPUT,EXTEND方式
Q45:
JCL中怎么定义在子程序中要调用的文件
A45:
就象要在主程序中调用一样使用DD语句
Q46:
能否REWRITE(重写一个ESDS文件?
能否删除ESDS中的一条记录?
A46:
能够重写(但是记录长度必须相同,但是不能删除
Q47:
文件状态92是什么?
A47:
是文件状态的一个返回码,是逻辑错误的意思,比如,打开了一个文件用来导入数据但是又想将其他数据写入这个文件
Q48:
文件状态39是什么
A48:
当你的COBOL的逻辑记录长度(LRECL或者块长度(BLOCKSIZE或者记录形式(RECFM和JCL匹配错误,文件状态参数就会返回39
Q49:
什么是静态和动态连接
A49:
在静态连接中,被调用的子程序是连接到调用程序,但是在动态连接中,被调用子程序和调用主程序的可执行模块是都存在的(分开的。
你可以在连接选项中选择DYNAM或者NODYNAM(就算你选择了NODYNAM,CALL标识符还是回把它自动转换成一个动态调用。
静态子程序下次被调用时不会再处于其初始状态,除非用INITIAL初始化或者用CANCEL。
动态的都是以初始状态存在的。
Q50:
AMODE(24,AMODE(31,RMODE(24和RMODE(ANY是什么?
(仅适用于MVS/ESA企业管理器
A50:
是编译/连接的选项卡。
基本上AMODE表示寻址方式,RMODE表示贮存方式。
AMODE(24:
24位的寻址方式
AMODE(31:
31位的寻址方式
AMODE(ANY:
是用24位还是31位的寻址方式取决于REMODE
RMODE(24:
存在虚存中超过16Meglne(MEGLINE是某种单位允许31位的程序调用24位的程序。
(OS/VSCOBOL的PGM只有24位的存址
RMODE(ANY-超过或者不到16Megline
Q51:
如果要动态连接那么要用什么编译选项
A51:
DYNAM
Q52:
SSRANGE,NOSSRANGE是什么
A52:
这在之前已经提到过了,是编译器的一个选项,用来核对数组索引或者下标的超界问题(比如只定义了10个元素程序却使用了第11个元素的情况默认情况下是NOSSRANGE,如果选了NOSSRANGE,那么当索引和下标超界的时候也不会报RUNTIMEERROR
Q53:
怎么从一个COBOL程序设置一个JCL的返回码
A53:
把你想设置的值MOVE到RETURN-CODE这个寄存器中。
RETURN-CODE寄存器并未在这COBOL程序中申明
Q54:
怎么在COBOL程序中提交一个JOB
A54:
把一个JCL用“//xxxxxxxSYSOUT=(A,INTRDR”写到一个DATASET中,A是输出组,在程序中要将这个DATASET作为OUTPUT(输出打开。
为这个文件定义一个80字节的记录格式长度
Q55:
OS/VSCOBOL和VSCOBOLII有什么区别
A55:
OS/VSCOBOL的PGM只能是24位地址的,VSCOBOLII的PGM既能24位又能31位
报表writer只支持OS/VSCOBOL
USAGEISPOINTER只支持VSCOBOLII
REFERENCE(感觉翻成“引用”合适点修改,比如:
WS-VAR只支持VSCOBOLII只有COBOLII有EVALUATE语句
范围终止符只有COBOLII中才有
OS/VSCOBOL是按照ANSI74标准,VSCOBOLII是按照ANSI85标准
VSCOBOLII程序之间允许CICS调用
Q56:
建立一个COBOL可执行程序要通过哪些步骤
A56:
DB2预编译(如果内含SQL,CICS翻译器(如果是CICSPGM,COBOL
编译器,连接编辑器,如果是DB2程序,要建立绑定DBRM的PLAN
Q57:
能不能在VSCOBOLII的PGM中调用OSVSCOBOL的PGM?
A57:
在没有CICS的环境中,是可以的,在CICS环境中不行
Q58:
COBOL和COBOLII什么区别
A58:
有五点不同,COBOLII支持结构变成(通过PERFORMS和一系列范围终止符;COBOLII引进了些新的特性(如EVALUATE,SETTOTRUE,CALL,BYCONTEXT,等等,COBOLII允许程序编址在16MB行上;COBOLII不支持一些旧的特性(如READYTRACE,REPORT-WRITER,ISAM,ETC,以及支持加强版CICS
Q59:
什么是范围终止符
A59:
一个范围终止符和其之前的动词配套使用,如,IF和END-IF,以至于前置动词和终止符一起作用。
COBOLII其他普通的词是READ,PERFORM,EVALUATE,SEARCH和STRING
Q60:
PERFORM行有什么作用?
什么时候使用?
简单介绍下它
A60:
PERFORM和END-PERFORM配套使用,所有COBOLII程序语句都在这两关键字之间。
这和COBOL的PERFORM或者PERFORMTHRU一段是一样的意思。
在PERFORM的语句中只要没有内部GOTO就一直执行直到碰到EXIT。
在行PERFORM语句中为了可读型不能超过一页的长度,他经常会引用到其他PERFORM段
Q61:
NEXTSENTENCE和CONTINUE有什么区别
A61:
(这在前面已经详细说明,这样仅就文字翻译NEXTSENTENCE当碰到‘.’转移程序控制权给下句,CONTINUE碰到范围终止符就转移程序控制权给下句。
所以用CONTINUE比用NEXTSENTENCE安全(即使忘记写‘.’也没有关系。
Q62:
COBOLII中的EVALUATE相当于取代了COBOL中的什么结构
A62:
EVALUATE相当于取代了COBOL中的IFTHENELSE的嵌套语句
Q63:
’abovetheline’和‘belowtheline’有什么意义
A63:
在IBM推出MVS/XA体系之前,80年代的程序虚拟存储都限制在16megs.程序以24位的方式仅在一个16Mb的地址空间中被编译,就好象那些程序被保存在虚存中一样。
使用COBOLII编码之后,以31位方式的编码能超过16位的界线。
(也就是