【问题标题】:Why are the correct array values not getting printed?为什么没有打印正确的数组值?
【发布时间】:2021-12-18 18:46:32
【问题描述】:

我正在尝试仅使用嵌套 if else 来打印 rollNumber 数组的标记。但是,我得到的输出是:

111 Honors
111 First Division
333 Fail

而输出应该是

111 Honors
222 First Division
333 Fail
444 Second Division

我哪里错了?我写的代码如下:

public class JavaApplication53 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int rollNumber[]={111, 222, 333, 444};
        int marks[]={81, 75, 43, 58};
        
        for(int i=0; i<rollNumber.length; i++) {
            if(marks[i]>49) {
                if(marks[i]>79) {
                    System.out.println(rollNumber[i] + " Honors");
                
                    if(marks[i]>59){
                        System.out.println(rollNumber[i] + " First Division");
                    } else {
                        System.out.println(rollNumber[i] + " Second Division");
                    }
                }
            } else {
                System.out.println(rollNumber[i]+ " Fail");
            }
        }
    }
}

【问题讨论】:

  • 只有切向相关但一致的缩进有助于更容易地理解嵌套结构。 (并且可能会帮助您查看逻辑错误。)
  • @JohnnyMopp 你说得对——我在脑海中做了压痕,但仍然没有看到;直到我格式化它才变得非常明显。
  • 可以指定规则吗?
  • @AdriaanKoster 有规则,只是执行不正确,例如,如果标记 > 79,则对
  • @DaveNewton 你会接受一个不正确的实现作为你的需求规范吗?另外,我认为如果 OP 自己花时间写下规范,他可能会更好地理解这个问题。

标签: java arrays if-statement nested


【解决方案1】:

我不知道预期的行为究竟是什么,但这显然是一个问题:

if(marks[i]>79) {
    System.out.println(rollNumber[i] + " Honors");                
        if(marks[i]>59){
            System.out.println(rollNumber[i] + " First Division");
        } else {
            System.out.println(rollNumber[i] + " Second Division");
        }
        

如果marks[i] > 79,它总是> 59,所以永远不会输入else

编辑:您可以使用类创建域模型,而不是使用数组并使用索引 i 从中获取相应的值:

class Category {
    final String name;
    final int boundary;

    Category(String name, int boundary) {
        this.name = name;
        this.boundary = boundary;
    }
}

class Grade {
    final int mark;
    final int rollNumber;

    Grade(int mark, int rollNumber) {
        this.mark = mark;
        this.rollNumber = rollNumber;
    }
}

(省略获取器和设置器)

这可以阐明你的代码的含义。

编辑 2:然后你可以这样做

  Category[] categories = new Category[]{
        new Category("Honors", 80),
        new Category("First Division", 60),
        new Category("Second Division", 50),
        new Category("Fail", Integer.MIN_VALUE)
    };

    Grade[] grades = new Grade[]{
        new Grade(81, 111),
        new Grade(75, 222),
        new Grade(43, 333),
        new Grade(58, 444)
    };

    for (Grade grade : grades) {
        for (Category category : categories) {
            if (grade.mark >= category.boundary) {
                System.out.printf("%s %s%n", grade.rollNumber, category.name);
            }
        }
    }

【讨论】:

  • 是的,你在逻辑部分是绝对正确的。我现在看到了。
【解决方案2】:

你的逻辑是错误的。如果你已经测试了&gt;79,那么在if 子句中测试&gt;59 是没有意义的。请改用else 子句。最里面的if 应该在它所在的ifelse 中。

if(marks[i]>79) {
......
} else {
    //move this if from the if clause to here: else clause
    if(marks[i]>59){
      .......
    }
}

或者,系统化是值得的,这样您就不会混淆自己。您从测试最低点 - 49 - 开始,然后测试最高点 - 79。也许 49、59、79 可以避免混淆,如下所示:

if(marks[i]>49) {
    if(marks[i]>59) {
        if(marks[i]>79) {
            System.out.println(rollNumber[i] + " Honors");
        } else {
            System.out.println(rollNumber[i] + " First Division");
        }
    } else {
        System.out.println(rollNumber[i] + " Second Division");
    }
} else {
    System.out.println(rollNumber[i]+ " Fail");
}

或者:

if(marks[i]>79) {
    System.out.println(rollNumber[i] + " Honors");
} else if(marks[i]>59) {
    System.out.println(rollNumber[i] + " First Division");
} else if(marks[i]>49) {
    System.out.println(rollNumber[i] + " Second Division");
} else {
    System.out.println(rollNumber[i]+ " Fail");
}

【讨论】:

  • 你刚刚进入我的脑海。有趣的是你是如何实现这个逻辑的。我解决了,我的不一样。谢谢。
  • 很高兴我能对@KonarkBaggal 有所帮助!
【解决方案3】:

我改进了您的代码。使用这个。

public static void main(String[] args) {
    int rollNumber[]={111, 222, 333, 444};
    int marks[]={81, 75, 43, 58};
    
    for(int i=0; i<rollNumber.length; i++) {
        if(marks[i]>79) {
            System.out.println(rollNumber[i] + " Honors");
        } else if(marks[i]>59) {
            System.out.println(rollNumber[i] + " First Division");
        } else if(marks[i]>49) {
            System.out.println(rollNumber[i] + " Second Division");
        } else {
            System.out.println(rollNumber[i] + " Fail");
        }
    }
}

希望问题会好转!

【讨论】:

  • 给一个人一条鱼,你喂他一天;教一个人钓鱼,你就可以养他一辈子
  • @AdriaanKoster 感谢您的建议。
  • @SunghyeonLee 谢谢你的代码。只是我已经用 else if 结构实现了这个逻辑。我只是在挑战自己使用嵌套的 if...else 结构来改进我的基础知识。我成功了。
  • @AdriaanKoster 确实是正确的建议。
猜你喜欢
  • 2020-07-13
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多