验证用户输入

时间:2010-10-26 18:51:16

标签: java while-loop

我差不多已完成了这项工作,但有两件事让我的代码难以理解。 当我向用户询问测试分数时,如果分数不在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);
 }

}

2 个答案:

答案 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 ...

替换v2
 public 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);