Московский государственный индустриальный университет
Опубликован: 27.09.2006 | Доступ: свободный | Студентов: 3331 / 379 | Оценка: 4.17 / 3.79 | Длительность: 24:17:00
Специальности: Программист
Лекция 2:

Основы языка Java

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >

Логические и условные операторы

Все программы, которые мы писали до сих пор, были линейными, т.е. все действия в них выполнялись последовательно именно в том порядке, в котором в них располагались операторы. Иногда, однако, требуется опускать или многократно повторять некоторые из них. Делать это позволяют управляющие конструкции языка Java, к которым принадлежат условные операторы, операторы циклов и операторы обработки исключений. С первыми из них мы познакомимся в этом параграфе, а циклы и исключения отложим до "Рекурсия, итерация и оценки сложности алгоритмов" .

Простейшими конструкциями, предназначенными для изменения порядка выполнения операторов, являются условные операторы if, if-else и switch. Применение первых двух из них требует использования логических выражений и логических операторов, к рассмотрению которых мы сейчас и перейдем.

Подробному изложению основ теории предикатов (именно так называют по-научному логические выражения) посвящен следующий параграф, а сейчас ограничимся некоторой минимальной информацией. Любые объекты одного и того же типа можно сравнивать на равенство и неравенство — первый из операторов обозначается в языке Java символами ==, а второй — с помощью символов !=. Стандартные математические обозначения для них — это = и \ne соответственно.

Следует помнить, что при использовании этих операторов для величин ссылочных типов, проверяется факт равенства (или неравенства) ссылок, а не содержимого объектов. Сравнение на равенство двух экземпляров совершенно одинаковых объектов, в частности, даст результат F.

Объекты числовых типов можно сравнивать между собой также и с помощью таких операторов, как < (меньше), <= (меньше или равно), > (больше) и >= (больше или равно), математическими обозначениями для которых являются <, \leqslant, > и \geqslant.

Из простейших логических выражений, к которым относятся логические переменные и результаты сравнений, можно конструировать более сложные, используя следующие логические операторы: унарный оператор отрицания !, бинарные операторы логического И (And) & , логического Или (Or) |, исключающего Или (Xor) ^, равенства ==, неравенства !=, условного И (short circuit And) && и условного Или (short circuit Or) ||, а также тернарный оператор условия ?:.

В математической теории исчисления предикатов отрицание принято обозначать символом \lnot (или просто !), операторам логического Или и И соответствуют дизъюнкция \lor и конъюнкция \land, а равенство (эквивалентность) обозначают символами \Leftrightarrow, \equiv или просто =.

Отрицание логического выражения, имеющего значение F ( Ложь ), есть T ( Истина ), и наоборот. Дизъюнкция истинна, если истинен хотя бы один из ее аргументов, а конъюнкция — только при истинности обоих. Исключающее Или истинно тогда и только тогда, когда истинен ровно один из аргументов, а назначение и истинность остальных логических операторов будут описаны чуть позже.

Управляющая конструкция if-else в зависимости от значения логического выражения позволяет выполнять различные части программного кода. В общей форме этот оператор записывается следующим образом:

if (логическое_выражение) блок1; [ else блок2; ]

Если условие, задаваемое заключенным в круглые скобки логическим выражением истинно, то будет выполняться блок1, иначе — блок2. Часть else может и отсутствовать.

Управляющие конструкции if и if-else могут быть вложенными, и с помощью блока (block) (заключения нескольких операторов в фигурные скобки) позволяют помещать в каждую из двух своих ветвей произвольное число операторов. Это позволяет разделить поток управления программы на произвольное число частей.

Эту же задачу часто удобнее решать с помощью оператора switch, общий вид которого таков:

switch (выражение) {
      case значение1: 
        блок 1;
        break;
      case значение2: 
        блок 2;  
        break;
        ...  
      case значениеN: 
        блокN;  
        break;  
      default:  
        блок N+1;
   }

Выражение, которое должно иметь целочисленный тип, сравнивается со всеми значениями (тоже целочисленными), указанными после ключевых слов case. Если оно оказывается совпадающим с одним из них, то управление передается соответствующему блоку операторов, а если совпадения не обнаруживается, то управление передается блоку default (если таковой существует, ибо он не является обязательным). После выполнения того блока, на который было передано управление, оператор break вызывает завершение выполнения оператора switch. При отсутствии оператора break управление просто будет передано следующему блоку за только что выполненным.

Рассмотрим использование описанных операторов на примере решения следующих несложных задач.

Задача 2.4.Напишите программу, вводящую три целых числа, и печатающую максимальное из них.

Текст программы

public class MaxVal3 {
    public static void main(String[] args) throws Exception {    
        int a = Xterm.inputInt("Введите первое число -> ");
        int b = Xterm.inputInt("Введите второе число -> ");
        int c = Xterm.inputInt("Введите третье число -> ");
        int max;

        if (a > b)   max = a;
        else         max = b;
        if (c > max) max = c;
	
        Xterm.println("Максимальное число из введенных = "+max);
    }
}

В этой программе переменной max сначала присваивается максимальное значение из двух чисел — a и b, а затем, если третье число c больше этой величины, переменной max присваивается его значение.

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

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева