проверка ввода пользователя - PullRequest
1 голос
/ 26 октября 2010

Я почти закончил с этим, но есть две вещи, которые ставят меня в тупик в моем коде.Когда я запрашиваю у пользователя тестовую оценку, если оценка не находится в диапазоне 0-100, я хочу не принять ее, а затем сообщить им причину и запросить другой ввод.Я также хочу напечатать буквенную оценку их среднего значения рядом со средним баллом.По какой-то причине моя логика «If» не работает, когда я пытаюсь проверить, что введенный счет находится в пределах 0-100.Также я не могу понять, как получить буквенную оценку для печати, но я не получаю никакой ошибки, поэтому думаю, что я на правильном пути.Я думаю, что я мог бы в основном использовать указатели на цикле, чтобы проверить, находится ли число в диапазоне 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 ]

3 голосов
/ 26 октября 2010

Некоторые комментарии ...

отступ

Пожалуйста, постарайтесь соответствовать вашему стилю отступа.Это делает ваш код намного проще для чтения.

пробел

Будьте осторожны в управлении пробелами.Когда вы читаете книгу, журнал или веб-страницу, для разделения идей используются пустые места - абзацы, разделы и т. Д. Аналогично, для разделения ваших функций или идей внутри функций должно использоваться пустое пространство.Например:

void f1()
{
  do();
  domore();
}


void f2()
{
  doAnotherThing();
  andYetAnother();
}


void f3()
{
  do1();
  do2();

  do3();
  do4();
}

Обратите внимание, что легко увидеть, что есть 3 отдельные функции, а третья функция имеет две отдельные группы действий - do1 () и do2 () отделены от do3 () и do4 () с пустым пространством, визуально показывающим, что есть что-то похожее в do1 () и do2 (), что-то похожее в do3 () и do4 (), и что 1 & 2 чем-то отличаются от 3 & 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);

Завершающая точка с запятой завершает блок.Если оценка 1 неверна, цикл никогда не завершится.

компиляция

Я не уверен, что

while
        score2 <0 || score2 > 100;

является допустимым кодом.Вы должны поместить Parens вокруг условия.У вас также возникает проблема бесконечного цикла с конечной точкой с запятой, опять же.

получение оценок

Когда вы запрашиваете оценки, ваш код в настоящее время выглядит как

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

и если мы заменим v1 на «name» ...

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

и затем замените v2 на Score1 ...

 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 голос
/ 26 октября 2010

Часть вашего кода выглядит для меня некомпилируемой, но, кроме этого, рассмотрим разницу между следующими тремя строками кода:

while (score1 <0 || score1 > 100)

по сравнению с

if (score2 <=0)

и

if (score3 <=0)

Я думаю, вы найдете там часть вашей проблемы.Для проверки рассмотрим следующий шаблон:

do {
  //collect input
} while (something that's false if input is invalid);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...