if语句中的错误 [英] Errors in if Statement

查看:135
本文介绍了if语句中的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的if语句中有一个但不是两个都出现以下错误.

I'm getting the following errors in one, but not both, of my if statements.

 165  IGYPS2000-S   Expected a data-name, but found "TO".  The "ADD" statement was discarded.

 169  IGYPS2096-S   An incomplete condition was found in a conditional expression.  The operand(s) was(were) discarded.

 169  IGYPS2079-S   Expected a verb or "NEXT SENTENCE", but found ""F"".  The statement was discarded.            




           IF MARITAL-STATUS-IN = "S"
           ADD 1 TO SINGLE-COUNT
           ADD 1 TO OVERALL-COUNT
           ADD SALARY-IN TO SINGLE-TOTAL
           ADD SALARY-IN TO OVERALL-TOTAL
           IF GENDER-IN = "M"
               ADD 1 TO SINGLE-MALE-COUNT
               ADD SALARY-IN TO SINGLE-MALE-TOTAL
           IF GENDER-IN = "F"
               ADD 1 TO SINGLE-FEMALE-COUNT
               ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
       END-IF.

       IF MARITAL-STATUS-IN = "M"
           ADD 1 TO MARRIED-COUNT
           ADD 1 TO OVERALL-COUNT               line 165
           ADD SALARY-IN TO MARRIED-TOTAL
           ADD SALARY IN TO OVERALL-TOTAL
           IF GENDER-IN = "M"
               ADD 1 TO MARRIED-MALE-COUNT
               ADD SALARY-IN TO MARRIED-MALE-TOTAL
           IF GENDER-IN "F"
               ADD 1 TO MARRIED-FEMALE-COUNT
               ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
       END-IF.

如果您需要查看我的代码,请告诉我.这是我第一次写嵌套if.

If you need to see anymore of my code just let me know. This is my first time writing nested if's.

推荐答案

piet.t和Bruce Martin正确地发现了使您获得那些编译器诊断信息的错误.您将错误的行列为165并没有帮助.

piet.t and Bruce Martin have correctly spotted the errors which are giving you those compiler diagnostics. You did not help by listing the wrong line as number 165.

避免此问题的一个简单方法是让编译器嵌入诊断程序,并在编译结束时列出它们.确实,这不是您安装时的默认设置是很不寻常的.

An easy thing to do to avoid this problem is to get the compiler to embed the diagnostics, as well as listing them at the end of the compile. Indeed it is unusual for this not to be the default at your installation.

要解决它不是默认设置,可以执行以下操作:

To get around it not being the default you can do this:

CBL FLAG(I,I)

从第12列开始,并在进行测试时使其成为程序源中的第一行.

Start that in column 12, and make it the first line in the program source whilst you are testing.

我首先说:从严重性I到严重程度,在编译列表的末尾列出诊断消息".第二个我说:从严重性I开始,将诊断消息嵌入到源的编译列表中."

The first I says "list diagnostic messages at the end of the compile listing, from severity I upwards". The second I says "embed diagnostic messages in the compile listing of the source, from severity I upwards".

所有编译器选项和有关使用它们的方法的信息都包含在《企业COBOL编程指南》中,可从IBM的Internet上免费获得.

All compiler options and information about ways to use them is included in the Enterprise COBOL Programming Guide, available for free on the internet from IBM.

列表的相关部分看起来像这样(我只是在粘贴而不参考实际列表):

The relevant part of the listing would look something like this (I'm just pasting in without reference to an actual listing):

   IF MARITAL-STATUS-IN = "S"
   ADD 1 TO SINGLE-COUNT
   ADD 1 TO OVERALL-COUNT
   ADD SALARY-IN TO SINGLE-TOTAL
   ADD SALARY-IN TO OVERALL-TOTAL
   IF GENDER-IN = "M"
       ADD 1 TO SINGLE-MALE-COUNT
       ADD SALARY-IN TO SINGLE-MALE-TOTAL
       IF GENDER-IN = "F"
           ADD 1 TO SINGLE-FEMALE-COUNT
           ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
   END-IF.

   IF MARITAL-STATUS-IN = "M"
       ADD 1 TO MARRIED-COUNT
       ADD 1 TO OVERALL-COUNT              
       ADD SALARY-IN TO MARRIED-TOTAL
       ADD SALARY IN TO OVERALL-TOTAL
 165  IGYPS2000-S   Expected a data-name, but found "TO".  The "ADD" statement was discarded.

       IF GENDER-IN = "M"
           ADD 1 TO MARRIED-MALE-COUNT
           ADD SALARY-IN TO MARRIED-MALE-TOTAL
       IF GENDER-IN "F"
 169  IGYPS2096-S   An incomplete condition was found in a conditional expression.  The operand(s) was(were) discarded.

 169  IGYPS2079-S   Expected a verb or "NEXT SENTENCE", but found ""F"".  The statement was discarded.            
           ADD 1 TO MARRIED-FEMALE-COUNT
           ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
   END-IF.

正如已经指出的那样,您在构建IF的方式上也存在一些问题:

As has been pointed out, you have some problems with the way you have constructed your IFs as well:

IF MARITAL-STATUS-IN = "S"
    ADD 1 TO SINGLE-COUNT
    ADD 1 TO OVERALL-COUNT
    ADD SALARY-IN TO SINGLE-TOTAL
    ADD SALARY-IN TO OVERALL-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO SINGLE-MALE-COUNT
        ADD SALARY-IN TO SINGLE-MALE-TOTAL
            IF GENDER-IN = "F"
                ADD 1 TO SINGLE-FEMALE-COUNT
                ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
            END-IF.

            IF MARITAL-STATUS-IN = "M"
                ADD 1 TO MARRIED-COUNT
                ADD 1 TO OVERALL-COUNT              
                ADD SALARY-IN TO MARRIED-TOTAL
                ADD SALARY IN TO OVERALL-TOTAL
                IF GENDER-IN = "M"
                    ADD 1 TO MARRIED-MALE-COUNT
                    ADD SALARY-IN TO MARRIED-MALE-TOTAL
                    IF GENDER-IN "F"
                        ADD 1 TO MARRIED-FEMALE-COUNT
                        ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
                    END-IF.

您正在使用两种不同的方法来终止您的IF. END-IF范围定界符和句号/句点.使用第二个表示您的缩进与逻辑"缩进不匹配.

You are using two different methods to terminate your IFs. The END-IF scope-delimiter and the full-stop/period. The use of the second means that your indentation does not match the "logical" indentation.

IF MARITAL-STATUS-IN = "S"
    ADD 1 TO SINGLE-COUNT
    ADD 1 TO OVERALL-COUNT
    ADD SALARY-IN TO SINGLE-TOTAL
    ADD SALARY-IN TO OVERALL-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO SINGLE-MALE-COUNT
        ADD SALARY-IN TO SINGLE-MALE-TOTAL
            IF GENDER-IN = "F"
                ADD 1 TO SINGLE-FEMALE-COUNT
                ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
            END-IF.

IF MARITAL-STATUS-IN = "M"
    ADD 1 TO MARRIED-COUNT
    ADD 1 TO OVERALL-COUNT              
    ADD SALARY-IN TO MARRIED-TOTAL
    ADD SALARY IN TO OVERALL-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO MARRIED-MALE-COUNT
        ADD SALARY-IN TO MARRIED-MALE-TOTAL
        IF GENDER-IN "F"
            ADD 1 TO MARRIED-FEMALE-COUNT
            ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
        END-IF.

请注意,我尚未纠正GENDER-IN测试的嵌套.

Note, I have not corrected your nesting for the GENDER-IN test.

使用范围分隔符结束任何条件要好得多.使用绝对最小的句号/周期.

It is much, much better to just use the scope-delimiter to end any conditions. Use an absolute minimum of full-stops/periods.

PROCEDURE DIVISION.
any-paragraph-name-or-SECTION-name.
    some code 
    . 

即:PROCEDURE DIVISION标头的末尾(如果有其中一项,则在USING上的项之后);在段落/节之前;段落/SECTION标签的结尾;一段/节的结尾;程序结束.

That is: end of PROCEDURE DIVISION header (after the items on USING if you have one of those); before a paragraph/SECTION; end of a paragraph/SECTION label; end of a paragraph/SECTION; end of the program.

那里有一些重叠,因为程序不需要其中包含段落/SECTIONS.

There is some overlap there, as a program does not require that there are paragraphs/SECTIONS within it.

使IF的内容保持简单.避免重复代码.我在下面放了一个重新排列您的代码的示例.有两种样式,一种是用于Single的嵌套IF(因为此工作的目的可能是nested-IF),另一种是已婚的.

Keep the content of your IFs simple. Avoid repeated code. I've put an example of your code, re-arranged, following. There are two styles, the nested-IF for the Single (since the purpose of this work is probably the nested-IF) and a different way for the Married.

IF MARITAL-STATUS-IN = "S"
    PERFORM COUNT-ANY-PERSON
    PERFORM COUNT-SINGLE-PEOPLE
    IF GENDER-IN = "M"
        ADD 1 TO SINGLE-MALE-COUNT
        ADD SALARY-IN TO SINGLE-MALE-TOTAL
    END-IF
    IF GENDER-IN = "F"
        ADD 1 TO SINGLE-FEMALE-COUNT
        ADD SALARY-IN TO SINGLE-FEMALE-TOTAL
    END-IF
END-IF

IF MARITAL-STATUS-IN = "M"
    PERFORM COUNT-ANY-PERSON
    PERFORM COUNT-MARRIED-PEOPLE
END-IF
    .
COUNT-ANY-PERSON.
    ADD 1 TO OVERALL-COUNT
    ADD SALARY-IN TO OVERALL-TOTAL
    .
COUNT-SINGLE-PEOPLE.
    ADD 1 TO SINGLE-COUNT
    ADD SALARY-IN TO SINGLE-TOTAL
    .
COUNT-MARRIED-PEOPLE.
    ADD 1 TO MARRIED-COUNT
    ADD SALARY-IN TO MARRIED-TOTAL
    IF GENDER-IN = "M"
        ADD 1 TO MARRIED-MALE-COUNT
        ADD SALARY-IN TO MARRIED-MALE-TOTAL
    END-IF
    IF GENDER-IN = "F"
        ADD 1 TO MARRIED-FEMALE-COUNT
        ADD SALARY-IN TO MARRIED-FEMALE-TOTAL
    END-IF
    .

已婚/单身可能是互斥的.如果是这样,请使用ELSE而不是第二项测试.男性/女性可能是互斥的.如果是这样,请使用ELSE而不是第二项测试.如果它们不是互斥的,请找出您还需要计算的内容,而不是让数据在程序中泄漏.

Married/single may be mutually exclusive. If so, use ELSE rather than the second test. Male/female may be mutually exclusive. If so, use ELSE rather than the second test. If they are not mutually exclusive, find out what else you need to count, rather then just have data slip through the program.

您应该使用88级条件名称,而不要使用文字测试.使您的程序更易于理解和维护.

You should look to use 88-level condition names, rather that test for literals. Makes your program easier to understand, and easier to maintain.

这篇关于if语句中的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆