java - 使用无效输入的break循环

时间:2014-10-12 00:09:25

标签: java while-loop

我正在创建一个根据输入计算用户成绩的程序。一切都很好,除了我需要处理输入无效条目的用户。

示例:用户在一行中输入三个考试成绩(例如95 90 87)。如果其中一个分数是负数(95 90 -87),我需要程序不输入这三个分数并指定一个字母等级,而是提示用户正确地重新输入分数。

这是我的代码:

public class GradeCalculator {

    public static void main(String[] args) {
        int classSum = 0;       // variable used to hold sum of entire classes exams
        int classExams = 0;     // variable used to hold number of exams taken by whole class

        Scanner s = new Scanner(System.in);

        System.out.println("Welcome to Gradecalculator!");
        System.out.println("Please enter the number of students:");
        int students = s.nextInt();

        System.out.println("Please enter the number of exams:");
        int exams = s.nextInt();   

        int i = 0;
        int studentnumber = 1;
        int sum = 0;

        while (i < students) {    // loop until it matches number of students entered above
            i++;
            sum = 0;

            System.out.println("Enter student " + studentnumber++ + "'s name :");
            String studentname = s.next();

            System.out.println("Enter exam scores :");

            int input = 0;
            for (; input < exams; input++) {   
                int n = s.nextInt();
                sum+=n;

                if (n < 0) {
                    System.out.println("Invalid exam scores, reenter: ");  //if one of the scores entered is     negative, display message
                }
            }

            double average = sum/exams;        // assign letter grade based on average of exams
            if (average <= 100 && average >= 90) {
                System.out.println("Letter grade: A");
                System.out.println(studentname + " gets 4 stars! ****");
            } if (average <= 89 && average >= 80) {
                System.out.println("Letter grade: B");
                System.out.println(studentname + " gets 3 stars! ***");
            } if (average <= 79 && average >= 70) {
                System.out.println("Letter grade: C");
                System.out.println(studentname + " gets 2 stars! **");
            } if (average <= 69 && average >= 60) {
                System.out.println("Letter grade: D");
                System.out.println(studentname + " gets 1 star! *");
            } if (average <= 59) {
                System.out.println("Letter grade: F");
                System.out.println(studentname + " gets 0 stars!");
            }

            classSum += sum;             // add sum of this student's scores to the classSum
            classExams += exams;   // add exams taken by this student to amount of exams taken by whole class
        }

        int classAverage = classSum/classExams; // compute class average
        System.out.println("Class statistics:");
        System.out.println("\tAverage: " + classAverage);
    }
}

显然,我将此代码放在错误的位置:

                if (n < 0) {
                    System.out.println("Invalid exam scores, reenter: ");  //if one of the scores entered is     negative, display message
                }
            }

因为这是输入负分时得到的输出:

Enter exam scores :
70 70 -70
Invalid exam scores, reenter: 
Letter grade: F
joe gets 0 stars!

正如你所看到的,它仍然会分配一个字母等级和星星,并要求下一个学生的名字。我需要它来重新输入这个学生的分数。无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:1)

你可以从for循环中的输入中减去一个,这样它就会停留在那个循环中而其他输入也不会被消除(并且还要确保总和不会添加那些负输入)< / p>

int input = 0;
for (; input < exams; input++) {   
    int n = s.nextInt();
    if (n>=0)
      sum+=n;
    else {
        input--;
        System.out.println("Invalid exam score entered, reenter: ");  
     }

}

答案 1 :(得分:0)

编辑:使用交互式输入,这应该更加用户友好。

您需要重置循环计数器以再次启动循环:

// Delete first output and counter variable initialization before loop
for (int input = 1; input < exams; input++) {   
    System.out.println(String.format("Enter %d. exam score: ", input + 1));

    int n = s.nextInt();

    if (n < 0) {
        System.out.println("Invalid value (must be positive)!");
        input--; // Reenter last value
    } else {
        sum+=n; // Only use correct scores.
    }
}