【问题标题】:How to properly use a switch statement in while loop如何在while循环中正确使用switch语句
【发布时间】:2013-10-23 01:21:33
【问题描述】:

我不认为我的 switch 语句对我的代码有任何作用,我是 java 的新手,所以我不确定如何在 while loop 中使用 switch 语句。我正在尝试输入每个成绩/学分,以便找到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);
}

}

【问题讨论】:

  • 这是一个“while”循环,而不是“do-while”循环。
  • 对不起,我是新手。我根据下面的一些建议编辑了我的代码。我现在进行了更改。
  • 好吧,您正在添加到gradeEntered,所以它会添加每个循环,使switch 语句无用。另外,(不确定)\n 可能会影响 switch 语句。

标签: java while-loop switch-statement


【解决方案1】:

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

编辑:扩展下面的评论:

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

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

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

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

【讨论】:

  • 我将“grade”更改为“inputGrade”,无论输入什么,它仍然返回 0。我也不确定我是否以正确的方式使用“点”。
  • 好的,进一步的代码审查... * do/while 用于当你在循环之前有一个有效的状态,并且在循环之后可能是无效的。之前没有用户输入,所以这里不是这种情况 * 开关应该在用户输入之后,而不是之前。这使得它总是从先前的输入计算,从空白字符串开始。 * while 条件毫无意义,因为您在循环内检查并在“Q”上中断
  • 我必须至少使用 while 或使用 switch 语句执行 while 循环。所以我取消了'Q'的休息时间,只是使用了一个while循环。我在上面编辑了我的代码,但是循环没有看到 switch 语句。
【解决方案2】:

您的 switch 语句正在使用 grade,它似乎从未被写入。总是""。 你得到inputGrade,但你不写信给grade本身。

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

【讨论】:

  • 添加到这个,你应该做一个默认情况下,以防没有输入。
  • 您的代码中还有其他问题。正如上面的人所说,你应该有默认情况,因为如果人没有提供有效的输入,那么你永远不会清除“点”。 IE。如果我输入“A”(并且开关按您想要的方式工作),然后输入“M”,points=4 将被添加两次。一次用于“A”,一次用于“M”。此外,您假设信用将是数字或“Q”,这不是一个好主意。除了您将尝试将不是 Q 的字母解析为数字的问题之外,如果限制最多为 6 个,请将其放在那里。你的 gpa 计算在我看来也是错误的。
  • 你推荐使用 char 代替 string 吗?
  • 我确实推荐 char,但这不会导致问题。为响应您更改的代码添加了另一个答案。
【解决方案3】:

您将每个成绩附加到您的成绩输入

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 然后将它附加到你的变量中

【讨论】:

  • 我只是在使用gradeEntered += inputGrade.toUpperCase()+"\n";在结果中打印用户输入以显示成绩/学分。我想我没有意识到它正在影响 switch 语句。
【解决方案4】:

您将在输入中添加换行符 ("\n") (inputGrade.toUpperCase()+"\n";),因此您的所有案例均无效。 即“A”不等于“A\n”

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

switch (inputGrade.toUpperCase())

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

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

【讨论】:

  • P.S.您在 while 循环中使用了 inputGrade,这是一个很好的举措,就像您使用了 gradeEntered 一样,您将拥有无限循环
  • 我在 switch 语句中使用了 char,但是当计算 gpa 时,它会像 ascii 表一样显示 'A' = 97,我不知道如何解决这个问题。我还使用了 "inputGrade.toUpperCase()+"\n";"在我的代码中获取输入以显示在我的结果中。我更新了代码以显示我的更改。
  • 打开字符串非常好。生成的编译代码向后兼容旧版本的 java。 FWIW,许多语言在字符串上支持pattern matching,这就是打开字符串的目的。
  • 我并没有真正考虑已经编译的代码。我的错。但我真的不相信切换是为了模拟字符串上的模式匹配——java 已经有更好的模式匹配工具——它只是标准 switch 语句的下一个逻辑改进,以允许字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多