Условный оператор аналогичeн условному оператору Ruby, его общая форма такова:
if (логическоеВыражение) { . . . } else { . . . }
Здесь логическоеВыражение может быть любым фрагментом кода, результатом вычисления которого является величина типа boolean.
В Ruby мы пользовались оператором elseif. Обратите внимание, что в языке Java его следует заменить на else if:
class TestIf { public static void howBig(int i) { if (i < 10) { System.out.println ("меньше 10"); } else if (i < 20) { System.out.println ("между 10 и 20"); } else if (i < 30) { System.out.println ("между 20 и 30"); } else { System.out.println( "больше или равно 30" ); } } public static void main(String[] args) { howBig(7); howBig(15); howBig(23); howBig(105); } }
Тело оператора не обязательно заключать в фигурные скобки, если оно состоит из единственного выражения.
if (i < 10) System.out.println ("Меньше 10"); else System.out.println ("Больше или равно 10");
Тернарный оператор ? : идентичен такой же условной операции в Ruby. Например, строка
(counter == 0) ? i++ : i--;
означает то же самое, что и
if (counter == 0) i++; else i--;
Длинная форма записи более наглядна, однако при компиляции программы в байт-код в обоих случаях получится одинаковый результат. Вот еще один пример использования тернарного оператора.
Пример
Следующая программа определяет четность введенного числа.
import java.io.*; class TestOdd { public static void main(String[] args) throws Exception{ BufferedReader r = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Введите целое число: "); int i = Integer.parseInt(r.readLine()); String str = i % 2 == 0 ? "четно" : "нечетно"; System.out.println("Число "+i+" " + str); } }
При выборе из большего числа альтернатив удобнее использовать оператор switch (аналог оператора when в языке Ruby). Ниже приведен его общий вид.
switch (выражение) { case значение1: блок1; break; case значение2: блок2; break; . . . case значениеN: блокN; break; default: блокN+1; }
Выражение (должно быть целого или символьного типа) сравнивается последовательно со всеми значениями, указанными после ключевых слов case. При совпадении с одним из них выполняется соответствующий блок операторов.
Оператор break завершает выполнение блока, а при его отсутствии управление передается следующему блоку. Если совпадений не будет обнаружено, то выполняется блок, следующий за ключевым словом default.
Сравните использование конструкций выбора в языках Java и Ruby:
Java | Ruby |
---|---|
char test; String answer; . . . switch (test) { case 'Y': case 'y': answer = "Нет!"; break; case 'N': case 'n': answer = "Да!!!"; break; default: answer = "Что?"; } System.out.println(answer); |
. . . case test when 'Y', 'y' answer = "Нет!"; when 'N', 'n' answer = "Да!!!"; else answer = "Что?"; end puts(answer); |
Цикл while в языке Java работает точно также, как и в Ruby. Его общий вид таков:
while (логическоеУсловие) { . . . }
Вариацией цикла while является оператор do while. При его использовании тело цикла будет обязательно выполнено хотя бы один раз.
do { . . . } while (логическоеУсловие);
Пример
Следующий фрагмент программы печатает числа от 1 до 5 включительно.
int i = 1; while (i <= 5) { System.out.println(i); i += 1; }
Оператор for языка Java, наоборот, значительно отличается от одноименного итератора в языке Ruby:
for (инициализация; проверка; изменение) { . . . }
В круглых скобках содержаться три блока, разделенные символом ; (точка с запятой):
- инициализация
- блок, задающий начальные условия; может включать объявления переменных;
- проверка
- блок, задающий условия завершения работы цикла;
- изменение
- блок, изменяющий значения переменных.
Эту конструкцию, как правило, применяют для повторения цикла фиксированное число раз. Следующая программа демонстрирует его использование.
for (int i = 0; i < 10 ; i++) { System.out.println(i); }
Пример
Рассмотрим программу для вычисления факториала введенного числа с помощью цикла for.
import java.io.*; class Fact { public static void main(String[] args) throws Exception{ BufferedReader r = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Введите натуральное число: "); int n = Integer.parseInt(r.readLine()); if (n > 0) { int fact = 1; for (int i = 1; i <= n ; i++) { fact *= i; } System.out.println("Факториал числа " + n + " равен " + fact); } else { System.out.println(n + " - не натуральное"); } } }
Приведенный на рисунке пример запуска этой программы иллюстрирует еще одно отличие языка Java от Ruby. В то время как в Ruby диапазон целых чисел не ограничен, тип int в Java не обладает этим свойством. Число 12! еще способно разместиться в ячейке памяти, отведенной под целое число, а факториалы достаточно больших чисел уже нет! Сравните результаты вычисления факториала с результатами расчетов, полученных в программе Kcalc или в электронных таблицах.
В Java версии 1.1 был добавлен класс BigInteger, поддерживающий целые числа произвольного размера. При использовании этого класса математические операции выполняются заметно медленее.
Пример
Ниже приведена программа, вводящая с клавиатуры массив действительных чисел и печатающая сумму всех его элементов.
Сначала введем количество элементов массива, а затем заполним его элементами, одним за другим. Обратите внимание, что первый элемент массива имеет индекс 0, а последний - на единицу меньший, чем его длина.
import java.io.*; class TestSum { public static void main(String[] args) throws Exception{ BufferedReader r = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Введите количество " + "элементов массива: "); int n = Integer.parseInt(r.readLine()); double a[] = new double[n]; // создали массив double s = 0.0; // обнулили сумму for (int i = 0; i < n; i++) { System.out.print("Введите " + (i+1) + "-й элемент массива: "); a[i] = Double.parseDouble(r.readLine()); s = s + a[i]; } System.out.println("Сумма = " + s); } }
Задания
- Введите три различных целых числа и определите максимальное и минимальное из них.
- Напишите программу, которая по порядковому номеру месяца печатает его название. При решении воспользуйтесь оператором switch.
- Напишите программу, вычисляющую сумму всех нечетных натуральных чисел, не превосходящих 1000.
- Напишите программу, находящую среднее арифметическое всех элементов заданного массива действительных числел.
- Напишите программу, определяющую второй по величине элемент массива различных действительных чисел.