Предыдущий раздел Уровень выше Следующий раздел

Операторы ветвления и циклы

Условный оператор аналогич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:

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


Задания

  1. Введите три различных целых числа и определите максимальное и минимальное из них.
  2. Напишите программу, которая по порядковому номеру месяца печатает его название. При решении воспользуйтесь оператором switch.
  3. Напишите программу, вычисляющую сумму всех нечетных натуральных чисел, не превосходящих 1000.
  4. Напишите программу, находящую среднее арифметическое всех элементов заданного массива действительных числел.
  5. Напишите программу, определяющую второй по величине элемент массива различных действительных чисел.

Предыдущий раздел Уровень выше Следующий раздел