如何在while循环中正确使用switch语句

时间:2013-10-23 01:21:34

标签: java while-loop switch-statement

我不认为我的switch语句对我的代码做了任何事情,我是java的新手,所以我不确定如何在switch语句中使用while loop语句GPA。我正在尝试输入每个成绩/学分,以便找到System.out.print,但我为成绩添加了package exercises; import java.text.DecimalFormat; import javax.swing.JOptionPane; import javax.swing.JTextArea; public class GPA_Calculator { public static void main(String[] args) { String greeting = "Hello, this program will calculate your GPA. You will be asked \n"+ "to enter your letter grade for each class, then you will be asked to enter \n"+ "the corresponding number of credits for that class. Once all the grades and credits\n"+ "have been entered, the program will display your GPA."; JOptionPane.showMessageDialog(null,greeting,"Greeting - Introduction",1); char gradeEntered; String grade = ""; String creditEntered = ""; String inputGrade = ""; String inputCredit = ""; String enterGradePrompt = "Enter your letter grade (A, B, C, D, F)\n"+ "Enter Q to display your results\n\n"; String enterCreditPrompt = "Enter the credit hours for your course (0, 1, 2, 3, 4, 5, 6)\n"+ "Enter Q to display your results\n\n"; int points = 0, sum = 0, credits = 0, gradeCount = 0; while(!inputGrade.toUpperCase().equals("Q")) { inputGrade = JOptionPane.showInputDialog(null,enterGradePrompt,"Enter grade",1); gradeEntered = inputGrade.charAt(0); grade += inputGrade.toUpperCase()+"\n"; inputCredit = JOptionPane.showInputDialog(null,enterCreditPrompt,"Enter grade",1); creditEntered += inputCredit+"\n"; if(inputCredit.toUpperCase().equals("Q")) continue; credits = Integer.parseInt(inputCredit); credits++; switch (gradeEntered){ case 'A': points = 4; break; case 'B': points = 3; break; case 'C': points = 2; break; case 'D': points = 1; break; case 'F': points = 0; break; } sum += gradeEntered; gradeCount++; } // Prevents "Q" from being printed in results grade = grade.substring(0,grade.length()-2); creditEntered = creditEntered.substring(0,creditEntered.length()-2); DecimalFormat df = new DecimalFormat("#.##"); double gpa = sum / gradeCount; String results = "The courses you entered are:\n\n"+ "Grade "+"Hours \n"+ grade+" "+creditEntered+"\n"+ "Resulting in a GPA of "+df.format(gpa)+"\n\n"+ "This program will now terminate!"; JOptionPane.showMessageDialog(null, new JTextArea(results), "results from the Invitation list generator",1); } ,并且无论输入什么,它都表示值0。请帮忙!

{{1}}

}

4 个答案:

答案 0 :(得分:1)

问题是您的switch语句正在检查grade的值,但您的输入存储在inputGrade中。前者永远不会从空字符串中重新分配,因此点数永远不会增加。

编辑:要扩展以下评论:

  • 未检查while或do / while循环中的条件。你在循环中检查它并且爆发,这很好,因为你可以做一个无限循环并让断点终止它。但是,它不应该在循环条件中重复。
  • 你应该尽早检查这个状况。如果用户输入'q',那么在循环内执行任何操作都没有任何意义(同时,您也不必拥有之后尝试剥离它的部分)。

此外,您应该始终尝试将变量保持在本地。除了循环之外的聚合器(在这种情况下为totalXxx和yyyEntered)之外,没有必要。在这种情况下,它只会让你感到困惑,因为它掩盖了问题的根源。当switch语句第一次命中时,它会检查空字符串。第二次,它检查第一个字符串。当你点击'q'时,它会中断,并跳过你的最后一个输入。如果这些输入变量是在循环内声明的,那就很明显了。

最后,当我在这里时,你的gpa计算中有错误。每个分数的分数应该将学分的权重视为积极的,而不是负的。就像是: sum(grade * credits) / sum(credits)

如果你愿意,我可以发布固定代码,但由于我怀疑这是一个学术练习,如果你自己找到解决方案会更有益。

答案 1 :(得分:1)

您的switch语句使用grade,似乎永远不会写入。它总是""。 您获得了inputGrade,但您没有写信给grade

因为它总是“”,所以你的开关总是得不到任何东西

答案 2 :(得分:0)

您要将每个年级追加到您的gradeEntered

gradeEntered += inputGrade.toUpperCase()+"\n"; // at a point this is something like A\nB\nC\nD\nE.... so it will not match anyway
switch (gradeEntered) {
    case "A":  points = 4;
        break;
    case "B":  points = 3;
        break;
    case "C":  points = 2;
        break;
    case "D":  points = 1;
        break;
    case "F":  points = 0;
        break;
    }

所以大部分时间都不符合你的任何情况。

你必须有一个单独的成绩字符,并在开关或第一次使用开关中使用它,然后将它附加到你的变量

答案 3 :(得分:-1)

您要在输入中添加换行符(“\ n”),(inputGrade.toUpperCase()+"\n";),这样您的所有案例都无效。 也就是说,“A”不等于“A \ n”

我认为你不应该使用“gradeEntered”而是使用:

switch (inputGrade.toUpperCase())

特别是因为在多次运行循环之后,你的“gradeEntered”字符串将开始如下所示:“A \ nB \ nF \ nQ \ n”,这与你的所有情况相差甚远。

此外,打开字符串不是一个好习惯 - 它是java中的一个新的开发,并且不会被运行旧版本的java的计算机支持 - 虽然为了你自己的用途,如果编译器没有抱怨那么它很好。不过,最好养成切换字符或整数的习惯,因为大多数其他编程语言都不允许你打开字符串。