2015-08-23 1 views
2

Я изучаю Java через серию объяснений и упражнений, и один из них заключался в создании программы, которая отображала бы оценку количества (0-5) в соответствии с рядом пунктов (0-29, 30-34, 35-39, 40-44, 45-49, 50-60).Как иметь диапазон чисел в выражении if/else Java

System.out.println("Type the points [0-60]: "); 
double points = reader.nextDouble(); 
reader.nextLine(); 
if (points < 29) { 
    System.out.println("Grade: FAILED."); 
} else if (points <= 34) { 
    System.out.println("Grade: 1."); 
} else if (points <= 39) { 
    System.out.println("Grade: 2."); 
} else if (points <= 44) { 
    System.out.println("Grade: 3."); 
} else if (points <= 49) { 
    System.out.println("Grade: 4."); 
} else if (points >= 50) { 
    System.out.println("Grade: 5."); 
} 

Программа работает в том, что она будет давать правильную оценку из-за перекрытия в командах, но есть ли способ, чтобы создать диапазон чисел или строк, которые могли бы удовлетворить условию, если/другое заявление ? Например, если введенный номер находится между 40-44 и так далее. Детальный ответ был бы оценен, так как я новичок.

+0

Вы можете инвертировать контроль в операторах if, чтобы сделать его более понятным. Но сначала я предлагаю вам создать новую переменную, которая будет содержать оценку, а затем после тестирования использовать один 'System.out.println (« Grade: »+ gradeVar);' – itwasntme

+0

. Ваши диапазоны строго смежны, только если вы используете 'Integer ', а не' Double'. Например, для двух диапазонов «0-29, 30-34» (при условии включения ограничений), какой класс должен составлять 29,5? –

+0

Последний 'else if' должен быть просто' else'. 'If ​​(points> = 50)' ничего не делает. – Andreas

ответ

1

Если вы хотите проверить, если номер находится между некоторыми значениями использовать логический оператор AND для если высказываний типа:

if(points>=40 && points <=45) 

Чтобы получить больше ясности я хотел бы предложить вам сделать контроль инверсию, как это:

int grade; 
    if(points >49){ 
     grade=5; 
    }else if(points >44){ 
     grade=4; 
    }else if(points >39){ 
     grade=3; 
    }else if(points >34){ 
     grade=2; 
    }else if(points >29){ 
     grade=1; 
    }else{ 
     grade=0; 

    } 
    System.out.println("Gr: "+grade); //grade=0 = not passed 
+0

Как это действительно отличается от вопроса? Я не понимаю, почему перевертывание заказа делает его более ясным. --- Вы изменили, чтобы следовать тексту, заявив, что уровень 0-5, хороший, но не такой ...? – Andreas

+0

каждое условие проверяет, больше ли точек (не используя оба параметра «<' and '>»). Это может пойти другим путем и в самом конце appy grade = 5 в одиночку. Но я считаю это более легким для чтения, чем множество условий, применяемых к одиночному if. Решения yours и dasblinkenlight очень хороши, если кто-то хочет избежать «если». – itwasntme

+0

Ну, код вопроса должен был использовать 'else', а не' else if' на последнем, и отсутствовал знак '=' на 29, но ваш код не лучше, используя '> =' при первом тесте и '>' на других тестах, и я думаю, что наличие 'else' в конце, а не по умолчанию для начального значения, меньше * clear *. – Andreas

1

Я думаю, что вы могли бы искать

if(points<=44 && points>=40) 
1

Если вы хотите, чтобы проверить, является ли число между двумя значениями, вы бы использовать и в вашей, если заявление:

if (points >= 40 && points <= 44) { 
    System.out.println("Grade: 3."); 
} 
4

Разделите число на пять и составить массив из двенадцати строк с текстовым представлением оценки:

private static final String GRADE_FAILED = "FAILED"; 
private static final String GRADE_1 = "1"; 
private static final String GRADE_2 = "2"; 
private static final String GRADE_3 = "3"; 
private static final String GRADE_4 = "4"; 
private static final String GRADE_5 = "5"; 

private static String GradeStr[] = new { 
    GRADE_FAILED // 0..4 
, GRADE_FAILED // 5..9 
, GRADE_FAILED // 10..14 
, GRADE_FAILED // 15..19 
, GRADE_FAILED // 20..24 
, GRADE_FAILED // 25..29 
, GRADE_1  // 30..34 
, GRADE_2  // 35..39 
, GRADE_3  // 40..44 
, GRADE_4  // 45..49 
, GRADE_5  // 50..54 
, GRADE_5  // 55..59 
, GRADE_5  // 60..64 // Only sixty matters 
}; 

System.out.println("Grade:"+GradeStr[points/5]+"."); 

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

Важная оговорка: Этот подход работает лучше всего, когда количество опций невелико - до ста или около того. Когда ваша проблема позволяет использовать этот подход, это самый быстрый подход. Во многих случаях это также самый легкий для чтения.

+0

Я не спустил вниз, но ваш код может работать, только если точечный блок имеет тот же размер (или несколько таких). --- Также в этом случае размеры 30, 5, 5, 5, 5, 11, поэтому ваш последний блок неверен. Вы не можете обрабатывать значение 60, если, конечно, вы не исправляете код, добавляя дополнительный блок. – Andreas

+0

@ Andreas Обработка чисел с разными значениями - это то, о чем идет последний абзац. В этом коде могут возникать проблемы «за-одним», это всего лишь иллюстрация «как заменить цепочку if-then-else цепочкой с массивом». – dasblinkenlight

+0

Я не думаю, что это, как правило, хороший шаблон из-за изменчивости характера массива в зависимости от того, распределены ли границы равномерно. Если числа были 0-1000 с границей на 101, 211, 421 и 831, это не было бы хорошей моделью. – Andreas

1

Если вы хотите, чтобы проверить диапазон в пределах, если заявление, вы можете сделать это:

if(points >= 0 && points <= 29) 

Это с помощью && (и) оператора путем объединения условий вместе.

Но вам не нужно проверять диапазон в любом из if-утверждений. Выполнение того, что у вас сейчас есть, будет достаточно.

3

Вы можете использовать NavigableMap, чаще всего TreeMap. Используемый ниже метод: floorEntry. Цитирование Javadoc:

Возвращает отображение на ключ-значение, связанное с наибольшим ключом, меньшим или равным заданным ключом, или null, если нет такого ключа.

Примечание: Ваш код был пропущен = знак на 29 границе, а значение points должно быть целым числом.

Изменен использовать оценку (0-5) вместо строки, используемой в вопросе.

// Grade boundary is lower-inclusive (grade is 0-60) 
TreeMap<Integer, Integer> gradeMap = new TreeMap<>(); 
gradeMap.put(0, 0); // 0–29 
gradeMap.put(30, 1); // 30–34 
gradeMap.put(35, 2); // 35–39 
gradeMap.put(40, 3); // 40–44 
gradeMap.put(45, 4); // 45–49 
gradeMap.put(50, 5); // 50+ 

System.out.println("Type the points [0-60]: "); 
int points = reader.nextInt(); 
reader.nextLine(); 
int grade = gradeMap.floorEntry(points).getValue(); 
System.out.println("Grade: " + grade); 
Смежные вопросы