2010-10-26 3 views
1

Я почти закончил с этим, но есть 2 вещи, которые бросают меня в мой код. Когда я запрашиваю у пользователя тестовую оценку, если оценка не находится в диапазоне 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); 
} 

} 

ответ

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 & 2 как-то отличаются от 3 & 4.

Если это не имеет смысла, не стесняйтесь игнорировать :) (но я бы предложил вам прочитать базовую визуальную проектную книгу)

скобы

Это хорошая идея, чтобы привыкнуть использовать фигурные скобки вокруг всех условных блоков - это очень ясно, где начинается и заканчивается блок.Например,

 
if(condition) 
    line1; 
    line2; 

отличается от

 
if(condition) 
{ 
    line1; 
    line2; 
} 

В первом случае line1 будет выполняться, если и только если условие истинно, но line2 будет оценивать независимо от того, что - обманывающие отступов. Во втором случае обе строки1 и строка2 будут выполняться тогда и только тогда, когда условие истинно.

В первом случае намерение неясно - сделал ли оригинальный разработчик винт с отступом (для педантичных, игнорировать языки, которые используют отступы для управления циклами)? Или он забыл скобки? Если первый случай, были написаны следующим образом, мы знаем ответ:

 
if(condition) { 
    line1 
} 
    line2 

Конечно, если отступы были последовательны через файл, намерение следующего кода будет понятно, а также:

 
if(condition) 
    line1 
line2 

бесконечный цикл

Обратите внимание на завершающая точка с запятой, что у вас есть на

 
while 
     (score1 <0 || score1 > 100); 

Конечная точка с запятой завершает блок. Если score1 недействителен, цикл никогда не выйдет.

сборник

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

 
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 с «именем» ...

 
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 счетом 1 ...

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

+1 для подсказок стиля и переменных имен – jball

+0

Благодарим вас. Я согласен с jball, что вы сделали действительно хорошую и полную работу, объясняя все это. – Josh

1

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

while (score1 <0 || score1 > 100) 

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

if (score2 <=0) 

и

if (score3 <=0) 

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

do { 
    //collect input 
} while (something that's false if input is invalid); 
+0

Ah. Поэтому вы предлагаете использовать цикл while while вместо цикла while. Мне тяжело заниматься обучением, поэтому спасибо за помощь. Я изменил свой код выше, но я думаю, что я изменил его на то, что может быть более неправильным, чем раньше. – Josh

+0

Цикл, показанный выше, является синтаксисом, который должен иметься в вашем коде, в том числе '{}' вокруг кода, запрашивающего ввод пользователя, и '()' вокруг выражения, оценивающего ввод после ключевого слова 'while' в конце цикла. – jball

Смежные вопросы