2014-10-12 58 views
-1

我正在創建一個程序,可根據用戶的輸入計算用戶的成績。除了我需要處理輸入無效條目的用戶之外,所有這一切都很好。java - 使用無效輸入的循環打開

示例:用戶在一行上輸入三個考試分數(例如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! 

正如你所看到的,它仍然指定一個字母等級和星號,並要求下一個學生的名字。我需要它而不是要求重新輸入這個學生的分數。無法弄清楚如何做到這一點。

+0

正如你在這兩個至今收到的回覆和評論,這些看,你的問題還沒有很好說明。請考慮澄清問題。 – 2014-10-12 01:02:22

回答

1

您可以減去一個從輸入內部的for循環,使其停留在該循環等方面的投入不被抹消(同時也確保總和不添加這些負輸入)

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: "); 
    } 

} 
+0

好吧,我做了這個改變,它的工作原理除了清除用戶輸入的兩個分數(比如-80和90),它只清除負分(-80)而不是兩個分數。我如何使它擺脫兩個輸入的值? – sam 2014-10-12 00:38:53

+1

是的,它不會清除90,因爲90不是無效輸入。因此,如果您想重置用戶輸入的每個分數,只需將「輸入」和「總和」變量重置爲0(並以某種方式讓用戶知道分數已被清除)。 – 2014-10-12 00:48:33

+0

但是如果我只想重新設置該特定學生的每個分數(輸入無效分數的那個分數)而不是那些在此之前輸入分數的學生,該怎麼辦?那可能嗎? – sam 2014-10-12 00:50:02

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. 
    } 
} 
+0

,但是如果我們在輸入負數時輸入第三個學生的分數,那麼不會輸入= 0是否抹去前兩個學生的分數? – sam 2014-10-12 00:20:54

+0

是的,我認爲這是你想要的。否則,你減少計數器...相應地更新了答案。 – 2014-10-12 00:24:59