T.M. SoftStudio

feci quod potui, faciant meliora potentes

Купить полную версию курса "Введение в вычисления с Java" (русскоязычная версия, лекции, тесты, лабораторные работы)

Введение в вычисления с Java. Правила области видимости, логические выражения и операторы ветвления

Неделя 4

Лекция 21

Операторы ветвления if-else-if

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

В качестве простого примера, если вы находитесь в здании, и вы хотите посетить определенный этаж, один из способов сделать это – ходьба по лестнице, или использование лифта.

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

Когда вы находитесь в лифте, Вы должны решить, на какую кнопку нажать в зависимости от этажа, что вы хотите посетить.

До сих пор все программы, которые вы писали, могли только выполнить выражения программы последовательно.

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

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

Мы также не обрабатывали оценки, которые вне диапазона, когда мы писали нашу программу Coursegrade.

Вы должны быть в состоянии справиться с этими проблемами, узнав выражения ветвления.

Мы обсудим три различных типа операторов ветвления.

А именно, выражения if, if-else и switch.

В общем, все эти выражения состоят из двух основных частей.

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

Вторая является частью действия, которая выполняет соответствующее действие, когда условие выполнено.

Здесь показан синтаксис для выражения if. Обратите внимание, что if это зарезервированное Java слово.

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

Если условие истинно, тогда действие, представленное выражением, будет выполнено.

Если условие ложно, тогда блок действия пропускается.

Обратите внимание, что если есть только одно выражение в if блоке, фигурная скобка может быть опущена.

Давайте теперь взглянем на пример использования if выражения.

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

Мы можем легко написать наш собственный метод вычисления абсолютного значения.

Этот абсолютный метод принимает один целочисленный аргумент и возвращает целое число, которое является абсолютным значением фактического аргумента в качестве параметра.

Тело программы использует if выражение, чтобы проверить меньше ли нуля значение.

Если это так, то значение будет установлено как отрицательное от первоначального, что сделает его положительным.

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

Метод вернет значение как результат в конце.

Мы рассмотрим следующее выражение ветвления if-else.

Вот его синтаксис.

Первая часть if блока выглядит так же, как и раньше.

Однако здесь есть и вторая часть, которая начинается с ключевого слова else, за которым следует блок выражений.

Поток управления для if-else выражения может быть представлен ​​в виде блок-схемы справа.

В начале if выражения сначала вычисляется условие.

Если if правда, операторы внутри if блока выполняются.

В противном случае, выполняется блок else.

Но не оба блока вместе.

Опять же, фигурные скобки можно опустить, если есть только один оператор либо в блоке if или блоке else.

Давайте сначала посмотрим на простой пример с использованием if-else выражения, а затем мы вернемся к более интересному примеру.

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

Тело метода состоит из одного единственного выражения if-else.

Булево выражение проверяет, если первое значение больше, чем второе значение.

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

В противном случае, величина второго параметра возвращается.

Пример Moveforward

Давайте посмотрим на другой пример.

Это метод moveForward, который мы видели в классе автомобиля, после того как мы исправили направление движения вдоль текущей ориентации машины.

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

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

Один из подходов заключается том, чтобы в первую очередь определить максимальное расстояние, которое автомобиль мог бы путешествовать с количеством бензина в баке, так как gasInTank и gasMileage оба даются как переменные экземпляра.

Максимальное расстояние можно вычислить путем деления gasInTank на gasMileage, а затем умножить его на 100.

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

И мы должны сделать приведение выражения справа, потому что там результат типа double.

Как только мы получим максимальное расстояние, то мы сравним расстояние, которое нужно проехать, с максимальным расстоянием.

Мы должны сделать это сравнение с помощью абсолютного значения расстояния, потому что оно может быть положительным или отрицательным.

Если абсолютная величина расстояния больше мaxDist, то есть не достаточно бензина, чтобы закончить поездку.

В противном случае, ничего лишнего не должно быть сделано, если есть достаточно бензина.

Теперь мы можем думать о том, что следует предпринять, если там не хватает бензина, чтобы проехать данную дистанцию.

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

Возьмем второй вариант.

То есть, чтобы использовать весь бензин, чтобы переместить автомобиль на расстояние мaxDist.

Другими словами, мы хотим заменить указанное расстояние на мaxDist.

Будет ли это достаточно хорошо?

Ну, это если расстояние всегда положительно.

Но машина может перемещаться вперед, а может и назад, когда расстояние отрицательно.

Таким образом, мы должны проверить, если расстояние отрицательно.

Если это так, то расстояние должно быть установлено как обратное мaxDist, таким образом, автомобиль будет двигаться назад, как указано.

В противном случае, расстояние устанавливается в значение мaxDist.

Это может решить проблему, как описано, но если вы будете изучать это более тщательно, так, как if-else выражение написано, там действительно может быть две интерпретации.

Мы можем интерпретировать, что else будет спаренным со вторым if.

Но только из синтаксиса, как указано, if-else выражение еще может также идти с первым if.

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

Теперь ясно, что значение расстояния будет заменено только если запрашиваемое расстояние больше, что мaxDist.

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

Так что это часть кода, который мы могли бы вставить в метод moveForward.