我差不多已完成了这项工作,但有两件事让我的代码难以理解。 当我向用户询问测试分数时,如果分数不在0-100范围内,我想不接受它然后告诉他们原因并要求另一个输入。 我还想在平均分数旁边打印平均成绩。 出于某种原因,当我尝试检查以确保输入的分数在0-100之内时,我的If逻辑语句不起作用。 此外,我无法弄清楚如何获得字母等级打印,但我没有得到任何错误输出所以我认为我在正确的轨道上。我认为我可以主要在while循环中使用指针来检查数字是否在0-100范围内。我将不胜感激。 这是我的代码:
import java.text.DecimalFormat;
import java.util.Scanner;
public class GradeReport
{
String name;
int score1, score2, score3;
double average;
String grade;
public GradeReport() //creates the first constructor
{
Scanner sc = new Scanner (System.in);
System.out.println ("Enter student's name: ");
name = sc.nextLine();
System.out.println ("Enter first grade: "); //try while loops to get grade in between 0-100
score1 = sc.nextInt();
while
(score1 <0 || score1 > 100);
System.out.println("please enter a grade 0-100"); //checks that score is inclusive 1-100
System.out.println ("Enter second grade: ");
score2 = sc.nextInt();
while
score2 <0 || score2 > 100;
System.out.println("please enter a grade 0-100");//checks that score is inclusive 1-100
System.out.println ("Enter third grade: ");
score3 = sc.nextInt();
while
score3 <0 || score3 >100;
System.out.println("please enter a grade 0-100");//checks that score is inclusive 1-100
}
public GradeReport (String v1, int v2, int v3, int v4)
{
name = v1; //these are to initialize the variables so that I don't get null for the second set of results.
score1 = v2;
score2 = v3;
score3 = v4;
}
public void calculateAvg()
{
average = (double)((score1 + score2 + score3) / 3.0);
}
public String calculateGrade()
{
if (average >= 90)
grade = "A";
else if (average >= 80)
grade = "B";
else if (average >= 70)
grade = "C";
else if (average >= 60)
grade = "D";
else
grade = "F";
return grade;
}
public String toString()
{
DecimalFormat fmt = new DecimalFormat ("0.00"); //to format average to 2 decimal places
String gradeReport = name + "\n " + Double.toString(score1) + "\t" + Double.toString(score2)+ "\t" + Double.toString(score3) + "\n" + fmt.format(average) + grade;
return gradeReport;
}
public static void main (String[] args)
{
GradeReport gr1 = new GradeReport();
GradeReport gr2 = new GradeReport("Col Een", 76, 76, 75);
gr1.calculateAvg();
gr1.calculateGrade();
gr2.calculateAvg();
gr2.calculateGrade();
System.out.println(gr1);
System.out.println(gr2);
}
}
答案 0 :(得分:3)
一些评论......
缩进
请尽量与缩进风格保持一致。它使您的代码更容易阅读。
空白
小心如何管理你的空白。当您阅读书籍,杂志或网页时,会使用空格来分隔想法 - 段落,部分等。同样,应使用空白区域来分隔您的功能或功能内的想法。例如:
void f1() { do(); domore(); } void f2() { doAnotherThing(); andYetAnother(); } void f3() { do1(); do2(); do3(); do4(); }
请注意,很容易看到有3个单独的函数,第三个函数有两个独立的事物组 - do1()和do2()与do3()和do4()与空格分开,在视觉上表明do1()和do2()有类似的东西,do3()和do4()有类似的东西,而1&amp; 2与3&amp; 4有所不同。
如果这没有意义,请随意忽略:)(但我建议你阅读一本基本的视觉设计书)
拉条
养成在所有条件块周围使用大括号的习惯是个好主意 - 它使得块的开始和结束位置非常清晰。例如,
if(condition) line1; line2;
与
不同if(condition) { line1; line2; }
在第一种情况下,当且仅当条件为真时,line1才会执行,但无论什么都行,line2将进行评估 - 缩进是欺骗。在第二种情况下,当且仅当条件为真时,line1和line2都将执行。
在第一种情况下,目的还不清楚 - 原始开发人员是否搞砸了缩进(对于迂腐,忽略使用缩进来管理循环的语言)?或者他/她是否忘记了牙箍?如果第一个案例写成如下,我们就知道答案了:
if(condition) { line1 } line2
当然,如果缩进在文件中是一致的,那么以下代码的意图也是明确的:
if(condition) line1 line2
无限循环
请注意
上的尾随分号while (score1 <0 || score1 > 100);
后面的分号结束了块。如果score1无效,则循环将永远不会退出。
汇编
我不确定
while score2 <0 || score2 > 100;
是有效的代码。你应该把这些情况放在一边。你再次使用尾随分号也遇到了无限循环问题。
获得成绩
当您要求成绩时,您的代码目前看起来像
score = readLine() while(...) System.out.println(...)
这意味着您阅读用户输入,然后进入循环,在其中打印消息。请记住:循环从while
开始的地方开始,因此在第一次迭代后读取输入永远不会发生。您需要读取用户在循环的每次迭代中编写的值。
score = readline() while(score is invalid) { print error score = readline() }
变量命名
如果现在没有意义,请忽略此部分 - 认为这是对您稍后会学到的内容的不良介绍。
如果您有选项,则应始终有意义地命名变量。 GradeReport构造函数有4个变量,如果您无权访问源代码,则其目的完全不明确:
public GradeReport (String v1, int v2, int v3, int v4)
您可以为变量使用与类槽相同的名称,并且可以使用this
关键字进行区分。如果我们首先在构造函数中为所有类变量插入this
,并保持其余不变,则变为:
public GradeReport (String v1, int v2, int v3, int v4) { this.name = v1; //these are to initialize the variables so that I don't get null for the second set of results. this.score1 = v2; this.score2 = v3; this.score3 = v4; }
如果我们用“name”替换v1 ......
public GradeReport (String name, int v2, int v3, int v4) { this.name = name; //these are to initialize the variables so that I don't get null for the second set of results. this.score1 = v2; this.score2 = v3; this.score3 = v4; }
然后用score1 ...
替换v2public GradeReport (String name, int score1, int v3, int v4) { this.name = name; //these are to initialize the variables so that I don't get null for the second set of results. this.score1 = score1; this.score2 = v3; this.score3 = v4; }
答案 1 :(得分:1)
你的一些代码看起来不可编译,但除此之外,请考虑以下三行代码之间的区别:
while (score1 <0 || score1 > 100)
与
相比if (score2 <=0)
和
if (score3 <=0)
我想你会在那里找到问题的一部分。要进行验证,请考虑以下模式:
do {
//collect input
} while (something that's false if input is invalid);