为什么下面的if语句需要一个NEXT SENTENCE,因为语句的IF和ELSE部分都有一个语句。
问题:为什么这是if语句中的错误。
CHECK-PARM.
IF NAME = 'SW89JS' THEN 1183
E-NAME = 'FALSE'
预期动词或“NEXT SENTENCE”,但找到“E-NAME”。声明被丢弃了。
ELSE
E-NAME = 'TRUE'
“电子名称”无效。跳到下一个动词,句点或过程名称定义。
P-NAME = 'SW89JS'
END-IF.
答案 0 :(得分:1)
由于它是在这个答案中埋葬的地方,我将重复听到,甚至将它扩展一点。
您有一个正在测试的值。从名称来看,它可能来自JCL中EXEC卡上的PARM。
测试值,在值的结果上设置一个标志(TRUE / FALSE文字),稍后再使用。
使用88,您可以将该parm值作为标志本身。
01 NAME PIC X(6).
88 IT-IS-SW89JS VALUE "SW89JS".
现在你永远不会让你的旗帜失去一步,因为你只有一面旗帜。少了一个要理解并可能出错的旗帜。
因为我们在COBOL中没有assignments
。
MOVE 'TRUE' TO E-NAME
或
MOVE data-name-with-value-true TO E-NAME
或
01 FILLER PIC X VALUE SPACE.
88 IT-IS-SW89JS VALUE "Y".
SET IT-IS-SW89JS TO TRUE
或
01 NAME PIC X(6).
88 IT-IS-SW89JS VALUE "SW89JS".
最后忘记了其他任何事情。
COBOL与许多其他语言不同。没有字符串,你可能知道它们。没有数组,你可能知道它们。没有任务。没有布尔。没有用户编写的功能。几个内在函数。没有公共功能库。它确实有其他一些东西: - )
评论中的几点。
COBOL是一种固定的语言。固定长度字段,固定长度表。 30字节字段中的数据长度为30个字节。就数据所代表的内容而言,字段内容的长度是程序员必要时必须解决的问题。大多数情况下我们不需要它,所以我们不需要解决它。
固定性也有限制。因此,我们想办法以不同的方式做事,所以我们没有限制,等待破产,悬在我们头上。我们不只是选择一个看起来可能使我们的生活变得容易的函数(编写的代码更少),无论它如何执行任务。通常我们还没有函数,我们编写特定的代码,通过CALL重用于特定的系统或系统集。
COBOL程序可能需要更长的时间来编写(我说可能因为90%以上的时间是通过复制一个接近你想要的程序开始的问题,然后使其具体化)但该程序可能有30年的寿命。它的生命可能会多次改变。它可能永远不会改变,但在此期间需要多次理解。
从概念上讲,COBOL是一种与赋值/字符串/数组完全不同的语言。如果你应该在没有经过培训的情况下拿起COBOL,那么会有很多陷阱。
是的,布鲁斯马丁,我想COBOL确实有一个任务:COMPUTE
。左侧只能是数字或数字编辑,虽然可以有多个字段,右侧只能有数字(或内部函数返回数字)。它只支持基本的数学运算符(+, - ,,/,* )。如果需要,它允许舍入最终答案,并允许拦截“溢出”(ON SIZE ERROR
)。
它可以用作简单的任务:
COMPUTE A = B
这将生成与以下相同的代码:
MOVE B TO A
有些人这样做,虽然我从来没有真正解决过原因。有传言说这意味着你可以使用ON SIZE ERROR(如果你使用它,不要忘记END-COMPUTE)来捕获溢出。
然而,我总是把我的字段变得足够大,或者在我想要的结果时故意截断,所以我真的不明白。
简而言之,欢迎来到COBOL。不要指望它与您使用的任何其他语言一样。
答案 1 :(得分:0)
比尔说,问题是:
E-NAME = 'FALSE'
在 Cobol (与大多数其他语言不同)中,每个语句都以控制字开头 e.g。
Compute abc = 123
Move 'FALSE' to E-NAME
Perform abc
Call 'xyz'
使用 Cobol ,左侧上的控制字会告诉您该语句正在做什么。
同样,比尔说,在Cobol中,布尔值通常使用88级来定义:
01 FILLER PIC X VALUE SPACE.
88 IS-ENAME VALUE "Y".
88 ENAME-OFF VALUE "N".
并且您的代码变为
IF NAME = 'SW89JS' THEN
Set ENAME-OFF to true
ELSE
Set IS-ENAME to true
Move 'SW89JS' to P-NAME
END-IF.