[英]How to properly use a switch statement in while loop
我不认为我的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);
}
}
问题是您的switch语句正在检查grade
的值,但是您的输入存储在inputGrade
。 前者永远不会从空字符串中重新分配,因此点永远不会增加。
编辑:扩展下面的评论:
另外,您应始终尝试将变量尽可能地保持在本地。 除了循环外的聚合器(在这种情况下为totalXxx和yyyEntered),不需要任何其他东西。 在这种情况下,这只会使您感到困惑,因为它掩盖了问题的根源。 当switch
语句首次命中时,它将检查空字符串。 第二次,它检查第一个字符串。 当您按“ q”时,它将中断并跳过您的最后输入。 如果在循环内声明了这些输入变量,那将立即显而易见。
最后,当我在这里时,您的gpa计算中存在错误。 每分的分数应将学分的权重视为正数,而不是负数。 诸如: sum(grade * credits) / sum(credits)
如果您愿意,我可以发布固定代码,但是由于我怀疑这是一项学术练习,因此如果您自己来解决方案,那将更加有益。
您的switch语句使用的grade
似乎从未写入。 总是""
。 您将获得inputGrade
,但不会编写grade
本身。
由于它始终是“”,因此您始终无法从开关中获得任何信息
您正在将每个年级附加到您的年级上
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;
}
因此在大多数情况下,它都不适合您的任何情况。
您必须为等级分配一个单独的字符,然后在开关中使用它,或者先使用开关,然后将其附加到变量中
您正在向输入中添加换行符(“ \\ n”)( inputGrade.toUpperCase()+"\\n";
),因此所有情况都不成立。 也就是说,“ A”不等于“ A \\ n”
我认为您不应使用“ gradeEntered”,而应使用:
switch (inputGrade.toUpperCase())
尤其是因为多次运行循环后,您的“ gradeEntered”字符串将开始看起来像这样:“ A \\ nB \\ nF \\ nQ \\ n”,该字符串与您的所有情况都相去甚远。
另外,打开字符串也不是一个好习惯-这是Java的新开发,并且运行Java的较早版本的计算机将不支持-尽管您可以自己使用,但如果编译器没有抱怨,那就很好。 尽管如此,还是要养成打开char或int的习惯,因为大多数其他编程语言都不允许您打开字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.