2016-10-10 6 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 course = courseToken.get(x);を使用してください。 int grade = course.getCGrade(); 'で始まる...(あなたは本当にあなたが読んでいる値を変更したいと思っていますか?それは良いアイデアのようには聞こえません。後で同じコース...ネストされたループが必要なのは確かですか? –

+0

またはそれより良い(リストから取得する以外の目的でインデックスを使用しているようではないので)for-eachループを使用します: 'for (コースコース:courseTaken) ' – marstran

+0

if(i> = 97)else if(i> = 89 && i <= 96){...}'、if 2番目の&&ステートメントは常に真で余分です。 – 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

可読性と効率性のために、if文をたくさん使用する代わりにswitch文を調べることをおすすめします。例えば

代わり場合、:ように

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

関連する問題