1

我不认为我的switch语句对我的代码做任何事情,我是新手,java所以我不确定如何switchwhile loop. 我正在尝试获取输入的每个成绩/学分,以便我可以找到GPA,但我System.out.print为成绩添加了一个,它说无论输入什么都值得 0。请帮忙!

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);
}

}

4

4 回答 4

1

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

编辑:扩展下面的评论:

  • 未检查 while 或 do/while 循环中的条件。您正在循环内部检查它并中断,这很好,因为您可以创建一个无限循环并让中断终止它。但是,它不应该在循环条件中重复。
  • 你应该尽早检查这种情况。如果用户输入“q”,则在循环内执行任何操作都是没有意义的(此外,您不必在之后尝试剥离它的部分)。

此外,您应该始终尽量将变量保留在本地。除了聚合器(在本例中为totalXxx 和yyyEntered)之外,不需要任何东西。在这种情况下,它只会让您感到困惑,因为它掩盖了问题的根源。当switch语句第一次命中时,它会检查空字符串。第二次,它检查第一个字符串。当您点击“q”时,它会中断并跳过您的最后一个输入。如果这些输入变量在循环内声明,那将立即显而易见。

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

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

于 2013-10-23T01:26:15.103 回答
1

您的 switch 语句正在使用grade,它似乎永远不会被写入。它总是""。你得到inputGrade,但你不写给grade自己。

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

于 2013-10-23T01:26:51.907 回答
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;
    }

所以大多数时候它不会与你的任何情况相匹配。

要么你必须有一个单独的 char 用于等级并在 switch 中使用它,要么首先使用 switch 然后将它附加到你的变量中

于 2013-10-23T03:35:40.953 回答
-1

您正在为您的输入添加一个换行符 ("\n"), ( inputGrade.toUpperCase()+"\n";) 所以您的所有案例都不是有效的。即“A”不等于“A\n”

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

switch (inputGrade.toUpperCase())

特别是因为在多次运行循环之后,您的“gradeEntered”字符串将开始看起来像这样:“A\nB\nF\nQ\n”,这与您的所有案例相去甚远。

此外,打开字符串不是一个好习惯——它是 java 中的一个新开发,运行旧版本的 java 的计算机不会支持它——尽管供您自己使用,如果编译器没有抱怨那就没问题了。不过,最好养成打开字符或整数的习惯,因为大多数其他编程语言都不允许您打开字符串。

于 2013-10-23T03:34:51.707 回答