2016-10-10 43 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