Книга: Основы программирования с Java
Назад: Локальные переменные, переменные класса и экземпляра
Дальше: Выражение

Вопросы

Задача

Каким будет значение следующего логического выражения в Java – true или false?

0.1* 0.1 == 0.01

Ответ: false.

Объяснение

Числа с плавающей точкой не представлены точно в компьютере. Таким образом, результат "0,01", который получают путем умножения 0,1 на 0,1, отличается от "0,01", представленным 0,01 напрямую.

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

В качестве примера, если мы действительно хотим проверить 0,1 * 0,1 == 0,01, можно записать логическое выражение и проверить, будет ли результат истинным или ложным.

Math.abs(0.1 * 0.1 – 0.01) < 0.0001;

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

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, который мы видели в классе автомобиля, после того как мы исправили направление движения вдоль текущей ориентации машины.

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

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







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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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







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







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







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

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







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

Назад: Локальные переменные, переменные класса и экземпляра
Дальше: Выражение