Java:对多表达式使用switch语句?

时间:2014-02-22 07:22:27

标签: java if-statement switch-statement

两个问题。我听说当你有超过3个'if'语句时最好使用switch语句。是这样的吗?

其次,有人可以查看下面的代码并给我一个关于A的想法。如何转换成switch语句,尽管是多表达式或B.解释为什么变量'grade'总是导致F。

while (!"Y".equalsIgnoreCase(exit)) 
         {
                i++;
                System.out.print("Please enter name of assignment " + i + ": ");
                assignment = user.nextLine().toUpperCase(); //consumes string + \n
                System.out.print("Please enter points earned: ");
                earned = user.nextDouble();//consumes double
                user.nextLine();//consumes \n
                System.out.print("Please enter total points possible: ");
                total = user.nextDouble();
                user.nextLine();



        System.out.print("Assignment\t"); System.out.print("Score\t"); System.out.print("Total Points\t"); System.out.print("Percentage\t\n");


        System.out.print(assignment + "\t\t"); System.out.print(earned + "\t"); System.out.print(total + "\t\t"); System.out.print(percent.format(earned / total) + "\n\t");


         // Putting user data into an array for calculation:
          double[] calc; calc = new double[4];   
                calc[i] = earned; // Array elements coincide with the current iteration loop

          double[] totalPoints; totalPoints = new double[4];
                totalPoints[i] = total;


         for ( double e : calc) // adds up all the stored data in the array
            sum += e;


         for ( double f : totalPoints) // adds up all the stored data in the array
            tot += f;




     char grade = '0';
            if (sum / tot >= 90) 
            {
                grade = 'A';
            }

            else if (sum / tot >= 80 && sum / tot <= 89.99)
            {
                grade = 'B';
            }

            else if (sum / tot >= 70 && sum / tot <= 79.99)
            {
                grade = 'C';

            }

            else if (sum / tot >= 60 && sum / tot <= 69.99)
            {
                grade = 'D';

            }

            else if (sum / tot <= 59.99)
            {
                grade = 'F';

            }
        System.out.println("Your total is " + sum + " out of " + tot + ", or " + percent.format(sum / tot) + ", and your grade is an " + grade );   

        }

4 个答案:

答案 0 :(得分:0)

在这种情况下,我认为开关案例不会很好用,但是像上面说的keppil一样,你应该用一个具有不同阈值的浮点数来评估if语句,即

private float total = sum/tot * 100;

if(total >= 90){ //etc...

因为现在正好表示sum / tot评估为小数

答案 1 :(得分:0)

当需要检查一系列值时,if语句是否合适 如果要检查特定值,则switch语句是合适的。

在你的代码中,if语句就好了。虽然您可以通过编写如下内容来改进它:

public class Grade
{
  public Grade()
  {
    float score = 95;
    float total = 100;

    char grade = getGrade(score);

    System.out.println("Score: " + score);
    System.out.println("Total: " + total);
    System.out.println("Grade: " + grade);
  }

  private char getGrade(float score)
  {
    char grade = 'F';

    if (score >= 90)
      grade = 'A';

    else if (score >= 80)
      grade = 'B';

    else if (score >= 70)
      grade = 'C';

    else if (score >= 60)
      grade = 'D';

    return grade;
  }

  public static void main(String[] args)
  {
    new Grade();
  }
}

答案 2 :(得分:0)

正如@Keppil所提到的,sum / tot可能总是产生一个介于0和1之间的值。您可能想要更改您正在比较的阈值(即:0.9而不是90等等。)

另一方面,如果您对 if(sum / tot&gt; = 90)条件不满意,您肯定知道sum / tot 严格不足超过90 。因此,如果sum / tot <= 89.99,您无需签入以下测试。顺便说一下,那将是危险的:想象一下sum / tot == 89.999?你的任何条件都不会得到满足。

我建议创建一个产生等级的方法,如下所示:

public static char gradeFor(final float tot, final float sum) {
    float ratio = tot / sum;

    if(ratio >= 0.9f) {
        return 'A';
    }

    if(ratio >= 0.8f) {
        return 'B';
    }

    if(ratio >= 0.7f) {
        return 'C';
    }

    if(ratio >= 0.6f) {
        return 'D';
    }

    if(ratio >= 0.5f) {
        return 'E';
    }

    return 'F';
}

最后一件事:似乎没有你可以返回 E 的情况......是否有意?

总结一下,我相信你可能想看看这个:

  • 确保totsum为十进制值
  • 确保您的阈值与您正在测试的值相匹配(您很可能必须将它们除以100f,如@Keppil所述)
  • 确保没有错过任何角落案例(例如tot / sum 大于89.99 低于90
  • 确保您实施的行为符合您的意图(事实上您永远不会让'E'感到困扰:p)

干杯!

答案 3 :(得分:0)

switch语句并不总是好用的。为什么?切换语句只适用于原始数据类型和枚举类型。但是,您可以对诸如bytes,double,int等原始类型使用包装类。