2016-10-10 82 views
1

我正在研究計算特定學期GPA的方法,我的問題是在添加條件語句後成績不會添加到tGrade中。刪除「if」和「else if」會解決我的問題,但它會給出錯誤的輸出,所以關於我可能會做錯什麼的想法?整數不加起來

public double computeGPA(ArrayList<Course> courseTaken) { 
    double cGPA; 
    int tGrade = 00; 
    int tUnits = 00; 

    for (int x=0; x<courseTaken.size(); x++) { 
     for(int y=1; y<courseTaken.size(); y++) { 
      if(courseTaken.get(x).getCGrade()>=97) { 
       courseTaken.get(x).setCGrade(4); 
      } else if (courseTaken.get(x).getCGrade()>=89 && courseTaken.get(x).getCGrade()<=96) { 
       courseTaken.get(x).setCGrade(3); 
      } else if (courseTaken.get(x).getCGrade()>=80 && courseTaken.get(x).getCGrade()<=88) { 
       courseTaken.get(x).setCGrade(2); 
      } else if (courseTaken.get(x).getCGrade()>=74 && courseTaken.get(x).getCGrade()<=79) { 
       courseTaken.get(x).setCGrade(1); 
      } else { 
       courseTaken.get(x).setCGrade(0); 
      } 

      tGrade = courseTaken.get(x).getCGrade()+courseTaken.get(y).getCGrade(); 
      tUnits = courseTaken.get(x).getCUnits()+courseTaken.get(y).getCUnits(); 
     } 
    } 

    cGPA = (tGrade*tUnits)/tUnits; 
return cGPA; 
} 

到目前爲止,問題是代碼直接導致else語句破壞其他語句。要添加,數據存儲在一個文本文件中,並且課程的每個對象的等級都大於85.

+2

可讀性提示:儘量避免重複呼叫太多。使用課程course = courseToken.get(x); int grade = course.getCGrade();'以...開頭...(你確定你確實想修改你正在閱讀的值嗎?這聽起來不是一個好主意 - 尤其是當你使用以後相同的課程...你確定你甚至需要嵌套循環?) –

+0

或更好(因爲你似乎沒有使用索引除了從列表中檢索),使用for-each循環:'for (課程課程:courseTaken)' – marstran

+0

如果語句除非絕對必要,否則不要包含if if(i> = 97){...} else if(i> = 89 && i <= 96){...}',第二&&陳述總是真實和多餘的。 – Compass

回答

0

所以在閱讀完一些內容後,我就想到了這一點。當然不是最好的方法來做到這一點(重複調用,每個循環可能會更好,更多),但我會繼續改進。

public double computeGPA(ArrayList<Course> courseTaken) { 
    double cGPA; 
    double tUnits = 00; 
    double tGrade = 00; 

    for(int y=0; y<courseTaken.size(); y++) { 
     tUnits += courseTaken.get(y).getCUnits(); 
    } 

    for(int x=0; x<courseTaken.size(); x++) { 
     if(courseTaken.get(x).getCGrade()>=97) 
      tGrade += courseTaken.get(x).getCUnits()*4; 
     else if(courseTaken.get(x).getCGrade()>=93 && courseTaken.get(x).getCGrade()<=96) 
      tGrade += courseTaken.get(x).getCUnits()*3.5; 
     else if(courseTaken.get(x).getCGrade()>=89 && courseTaken.get(x).getCGrade()<=92) 
      tGrade += courseTaken.get(x).getCUnits()*3; 
     else if(courseTaken.get(x).getCGrade()>=85 && courseTaken.get(x).getCGrade()<=88) 
      tGrade += courseTaken.get(x).getCUnits()*2.5; 
     else if(courseTaken.get(x).getCGrade()>=80 && courseTaken.get(x).getCGrade()<=84) 
      tGrade += courseTaken.get(x).getCUnits()*2; 
     else if(courseTaken.get(x).getCGrade()>=75 && courseTaken.get(x).getCGrade()<=79) 
      tGrade += courseTaken.get(x).getCUnits()*1.5; 
     else if(courseTaken.get(x).getCGrade()>=70 && courseTaken.get(x).getCGrade()<=74) 
      tGrade += courseTaken.get(x).getCUnits()*1; 
     else 
      tGrade += courseTaken.get(x).getCUnits()*0; 

    } 
    cGPA = tGrade/tUnits; 

return cGPA; 
}//computeGPA 
-1

只是爲了提高可讀性和效率,我建議查看switch語句而不是使用大量的if語句。

例如,如果改爲:

If (x==1){ } 
If (x==2){ } 

...等等,你可以測試一個變量,並檢查使用情況。

Switch(x){ 
    case 1: 
      System.out.print("1") 
      break; 
    case 2: 
     System.out.print("2") 
     break; 
} 

無論你想測試多少值。很抱歉,如果寫得不好,我現在就在手機上。

+0

我的代碼中使用的switch語句的問題是,我設置的條件是值的範圍(即93到96),而不是具體的值,如果我使用switch語句,那麼我最終會得到更多的代碼行。雖然我會考慮如果我只處理8到10個特定值。 – Helquin