While循环中的Java输出错误?

时间:2017-11-23 10:33:30

标签: java

package javahistogramtwo;

import java.util.Scanner;


public class JavaHistogramTwo {


    public static void main(String[] args) {
           int sum = 0;
        int count = 0;
        int mark = 0;
        int largest = 0, smallest = 0;
        int rangeOne = 0, rangeTwo = 0, rangeThree = 0, rangeFour = 0;

        System.out.println("Enter marks, -1 to finish: ");
        Scanner in = new Scanner(System.in);

        if (in.hasNextInt()) {
            {

                while (mark != -1) {
                    mark = in.nextInt();

                    if (mark < -1 || mark > 100) {
                        System.out.println("Error: Enter Valid Input Type: "
                                + "Numbers from 0 - 100 for Marks. Or -1 to finish.");
                    } else if (mark != -1) {
                        sum = sum + mark;
                        count++;

                        if (count == 1) {
                            largest = mark;
                            smallest = mark;
                        } else {
                            if (mark > largest) {
                                largest = mark;
                            }
                            if (mark < smallest) {
                                smallest = mark;
                            }

                            if (mark >= 0 && mark <= 29) {
                                rangeOne++;
                            } else if (mark >= 30 && mark <= 39) {
                                rangeTwo++;
                            } else if (mark >= 40 && mark <= 69) {
                                rangeThree++;
                            } else if (mark >= 70 && mark <= 100) {
                                rangeFour++;
                            }
                        }
                    }
                }
            }
        } else {
            System.out.println("Error 1");
        }

        System.out.print("0-29: ");
        for (int i = 0; i < rangeOne; i++) {
            System.out.print("*");
        }

        System.out.println();
        System.out.print("30-39: ");
        for (int i = 0; i < rangeTwo; i++) {
            System.out.print("*");
        }

        System.out.println();
        System.out.print("40-69: ");
        for (int i = 0; i < rangeThree; i++) {
            System.out.print("*");
        }

        System.out.println();
        System.out.print("70-100: ");
        for (int i = 0; i < rangeFour; i++) {
            System.out.print("*");
        }

        System.out.println("");
        if (count > 0) {
            System.out.println("Largest mark is: " + largest);
        } else {
            System.out.println("No data");
        }
        if (count > 0) {
            System.out.println("Smallest mark is: " + smallest);
        } else {
            System.out.println("No data");
        }
        if (count > 0) {
            double average = sum / count;
            System.out.println("Average marks: " + average);
        } else {
            System.out.println("No data");
        }

        if (count > 0) {
            System.out.println(rangeOne + rangeTwo + rangeThree + rangeFour + 
                    " Total Number of Students");
        } else {
            System.out.println("No data");
        }

        {
            System.out.println(rangeThree + rangeFour + " Number of Student Passed"
                    + " - (40 Marks or Above)");
        }
    }
}

您好。

以上是我的作业代码。

我试图以星形格式显示输入数字的数量。 如:

  • 0 - 29:**
  • 30 - 39:*
  • 40 - 69:**
  • 70 - 100:***

在这种情况下,星号代表用户输入的数量(8)。两个范围从0到29.一个范围从30-39。两个范围从40-69。三个范围从70-100。

然后我显示最大,最低和平均标记。这部分正在运作。

然后我打印出输入的学生人数。 (在这种情况下为8)。

然后使用if mark大于或等于40作为条件,显示通过学生。 (在这种情况下为5)。

我的所有显示都正确。

然而,与明星,学生人数和通过学生。这显示错误。它总是显示为比输入的少一个。所以在这种情况下,7(应该是8)星将打印出来。 7(应为8)学生将显示为输入。 4(应该是5)学生将显示为已通过。

我已经查看了我的代码。在第二个NetBeans应用程序中进行了一些更改。但我仍然遇到同样的问题而且不知道我的问题所在。

帮助将不胜感激。

感谢。 :)

有一个更清晰的例子:

  • 用户输入:
  • 15
  • 20
  • 20
  • 50
  • 60
  • 70
  • 70
  • 85
  • 99
  • 100
  • 100
  • ( - 1完成)
  • 预期输出:
  • 0 - 29:***
  • 30 - 39:
  • 40 - 69:**
  • 70 - 100:******
  • 最大标记为:100
  • 最小标记是:15
  • 平均分:62.0
  • 11名学生已进入
  • 8通过的学生人数 - (40分或以上)
  • 实际输出:
  • 0-29:** //这里有一颗失踪的明星
  • 30-39:
  • 40-69:**
  • 70-100:******
  • 最大标记为:100
  • 最小标记是:15
  • 平均分:62.0
  • 10学生总数//计算错误,应为11
  • 7通过的学生人数 - (40分或以上)//计算 错了,应该是8

1 个答案:

答案 0 :(得分:0)

许多已经告诉过您的第一个缺失输入是由于忽略了第一个等级而您的算法没有将其考虑在内。

部分if (count == 1)将在第一年级发生,但不会进行任何计算,因为它们都位于代码的else部分。

您应该做的是例如以下(来自您的代码):

if (count == 1) {
    largest = mark;
    smallest = mark;
} else {
    if (mark > largest) {
        largest = mark;
    }           
    if (mark < smallest) {
        smallest = mark;
    }
}    // Note that we close the first if-else here

// And so this part will be executed for every input mark
if (mark >= 0 && mark <= 29) {
   rangeOne++;
} else if (mark >= 30 && mark <= 39) {
    rangeTwo++;
} else if (mark >= 40 && mark <= 69) {
    rangeThree++;
} else if (mark >= 70 && mark <= 100) {
    rangeFour++;
}