Условный оператор if имеет следующий синтаксис:
if ( проверочное выражение ) код для исполнения если истина;
Теперь поймём, как это работает. А работает это очень просто. Если проверочное выражение в скобках истинно (имеет значение true), то выполняется код, который указан после закрытия скобок. Если проверочное выражение ложно (имеет значение false), то код после скобок не выполняется, программа пропускает эту строчку и выполняет последующие команды.
При этом проверочное выражение может быть как простым, так и сложным, состоящим из нескольких простых. В таком случае оценивается итоговое значение всего выражения. Если его значение true, то код после скобок выполняется, если ложно, то не выполняется.
Код для исполнения также может состоять как из одной команды, так и из блока операторов. В случае если код состоит из нескольких операторов, он помещается в фигурные скобки { } В таком случае конструкция выглядит следующим образом:
if ( проверочное выражение )
{
команда 1;
команда 2;
...
команда n;
}
Возникает логичный вопрос. А чем же оператор if отличается от условного оператора, рассмотренного в предыдущем уроке - ()? : ; Всё просто. Результатом выполнения тернарного оператора ()? : является значение. Он сам принимает значение, которое расположено слева или справа от двоеточия в зависимости от истинности выражения в скобках. При применении оператора if выполняется одна команда или несколько команд, результатом его выполнения не является значение.
В текущем уроке мы рассмотрим как решить такую задачку. На входе задаётся сумма покупки. При этом если сумма покупки меньше 1000 рублей, скидка не применяется. Если сумма покупки от 1000 до 5000, скидка составляет 3%. Если сумма покупки от 5000 до 10000, то скидка составляет 7%. Если сумма покупки больше 10000, то размер скидки - 10%. На выходе программа должна выдавать сумму покупки с учётом скидки и сам размер скидки.
Итак, самое время вспомнить по существование такого понятия как алгоритм. Нам нужно решить, какой должна быть последовательность действий для решения задачи.
Алгоритм у нас следующий:
1. Задать сумму покупки.
2. Определить размер скидки.
3. Посчитать сумму покупки с учётом скидки.
4. Вывести на экран размер скидки и сумму покупки с учётом скидки.
Это в общем.
А при наличии тех инструментов, которые у нас есть на данный момент, которые мы изучили, более подробно алгоритм в виде схемы следующий:
Напомню, что программа - это перечень команд. В программе, которую мы напишем в текущем уроке, часть команд выполнятся в любом случае. Другая часть выполнится только при выполнении определённых условий. Таким образом, имеет место быть условное ветвление.
Возвращаясь к нашему алгоритму. Действия, описанные в прямоугольниках, осуществляются последовательно, друг за другом, для них нет альтернатив. Ромбами мы обозначили те места алгоритма, в которых в зависимости от заданных условий выполняются те или иные действия, т.е. есть варианты.
Пробежимся по алгоритму на паре примеров.
Пример 1. Сумма покупки 500 рублей.
Идём с первой команды по стрелкам.
- Объявить переменную sum и присвоить ей значение 500.
- Объявить переменную skidka и присвоить ей начальное значение 0
Эти две команды выполняются в любом случае. Итак, на текущий момент значения переменных sum - 500, skidka - 0.
Следующее действие - ромб:
- Находится ли сумма покупки в интервале от 1000 до 5000.
Если находится, то есть идём по стрелке Да, то переменной skidka присвоить значение 0,03 (то есть 3%).
Но в нашем примере сумма покупки не находится в этом интервале, соответственно, мы идём по стрелке Нет, то есть фактически никаких действий не производим.
Значение переменной skidka сохранилось - оно по прежнему равно 0.
Теперь у нас следующий ромб:
- Находится ли сумма покупки в интервале от 5000 до 10000.
Если находится, то есть идём по стрелке Да, то переменной skidka присвоить значение 0,07 (то есть 7%).
Сумма покупки не находится и в этом интервале, соответственно, мы идём по стрелке Нет, то есть фактически никаких действий не производим.
Значение переменной skidka также сохранилось - 0.
И последний ромб:
- Проверить, больше ли 10000 сумма покупки.
Если больше, то переменной skidka присвоить значение 0,1 (то есть 10%).
Это условие также не выполняется, соответственно, действий никаких не производится, т.е. переменная skidka всё ещё равна 0.
Следующее действие:
- Посчитать сумму покупки со скидкой. Считается она простой формулой sum * (1 - skidka).
И, наконец:
- Вывести на экран сумму покупки со скидкой и размер скидки.
Итак, все данные у нас есть. Остаётся воспользоваться оператором вывода System.out.println();
Причём сразу стоит обратить внимание на границы сумм. В первом случае 1000 включительно, 5000 не включительно. Во втором случае 5000 включительно, 10000 не включительно. В третьем случае 10000 включительно. Заранее нужно определиться с этим моментом для того, чтобы при решении задачи использовать нужные операторы: > или >= , < или <= .3.
Пока наша задача простейшая, алгоритм для неё также простейший. Фактически я бы сказал, алгоритм можно не писать, а держать в уме. На практике конечно задачи несоизмеримо сложнее и алгоритмы для них значительно сложнее. Их не получится держать в уме. Поэтому как бы не хотелось их изучать, но придётся.
Пробежимся по алгоритму ещё на одном примере.
Пример 2. Сумма покупки 8000 рублей.
Опять идём с первой команды по стрелкам.
- Объявить переменную sum и присвоить ей значение 8000.
- Объявить переменную skidka и присвоить ей начальное значение 0
На текущий момент значения переменных sum - 8000, skidka - 0.
Следующее действие - ромб:
- Находится ли сумма покупки в интервале от 1000 до 5000.
Если находится, то есть идём по стрелке Да, то переменной skidka присвоить значение 0,03 (то есть 3%). Но в нашем примере сумма покупки не находится в этом интервале, соответственно, мы идём по стрелке Нет, то есть фактически никаких действий не производим. Значение переменной skidka сохранилось - оно по прежнему равно 0.
Следующий ромб:
- Находится ли сумма покупки в интервале от 5000 до 10000.
Если находится, то есть идём по стрелке Да, то переменной skidka присвоить значение 0,07 (то есть 7%). Теперь сумма покупки находится в интервале от 5000 до 10000, соответственно переменной скидка присваиваем значение 0,07 (или 7%).
И последний ромб:
- Проверить, больше ли 10000 сумма покупки.
Если больше, то переменной skidka присвоить значение 0,1 (то есть 10%). Это условие также не выполняется, соответственно, действий никаких не производится, т.е. значение переменной skidka не меняется, оно по прежнему составляет 0,07.
Далее 2 последних действия - считаем сумму покупки с учётом скидки и выводим значения скидки и суммы покупки с учётом скидки на экран.
Итак, мы пробежались по нашему алгоритму на двух примерах. Теперь переведём наш алгоритм в код.
Как обычно создаём новый класс с именем Skidka и объявляем главный метод main
class Skidka
{
public static void main (String[] args)
{
}
}
Далее двигаемся по порядку по нарисованному алгоритму:
Объявим переменную sum и присвоим ей начальное значение
int sum = 6000;
Для простоты пусть это будет целочисленное число. А вот для переменной, которая будет содержать в себе размер скидки, мы будем использовать вещественный тип float.
float skidka = 0.0f;
Затем проверяем, лежит ли значение переменной sum в интервале от 1000 до 5000.
if ( (sum >= 1000) && (sum < 5000) ) skidka = 0.03f;
Если условие в скобках выполняется (то есть если значение всего сложного выражения равно true), то переменной skidka будет присвоено значение 0,03.
Чтобы программа работала правильно обращаем внимание на то, включительно или не включительно мы обозначаем границы интервала, то есть в каком месте мы используем оператор > или >= , а в каком < или <=. Ещё раз делаю на этом акцент.
Теперь проверяем, лежит ли значение переменной sum в интервале от 5000 до 10000.
if ( (sum >= 5000) && (sum < 10000) ) skidka = 0.07f;
Если условие в скобках выполняется, то переменной skidka будет присвоено значение 0,07.
Осталось проверить, больше ли сумма покупки 10000.
if (sum >= 10000) skidka = 0.1f;
Если да, то переменной skidka присваиваем значение 10%, то есть 0,1.
В данном случае в скобках простое выражение, в отличие от предыдущих, в которых были составные.
Теперь считаем сумму покупки со скидкой.
Для этого для наглядности объявим ещё одну переменную sum_skid и присвоим ей значение суммы со скидкой
float sum_skid = sum * (1 - skidka);
Переменную мы объявляем типа float, т.к. полученные значение могут не быть целочисленными.
Выведем на экран значения скидки и суммы покупки с учётом скидки
System.out.println("Размер скидки составляет " + (Skidka * 100) + " процентов");
System.out.println("Сумма покупки с учётом скидки составляет " + sum_skid + " рублей");
Далее сохраняем программу под именем Skidka.java
Компилируем и запускаем
Проверяем. Сумма покупки составляла у нас 6000 рублей. Скидка 7%. 6000 * 0,93 (то есть на 100% - 7%) = 5580 рублей. Программа сработала верно.
Отдельно хочу сакцентировать внимание на типе данных float - вещественные числа с плавающей точкой. Этот тип данных не является высокоточным. Его точность составляет примерно 7 знаков после запятой. Его не следует применять в случаях, когда необходима высокая точность. Его аналог - это тип double. Его точность уже составляет порядка 16 знаков после запятой. Но данные типа double занимают в памяти места в 2 раза больше, чем данные типа float.
Почему так происходит? Всё дело в том, что в компьютере вся информация хранится в виде битов, т.е. по сути в виде последовательности нулей и единиц. Любой бит может принимать значение 0 или 1. Другими словами компьютер использует двоичную систему счисления. Привычная нам десятичная система счисления содержит 10 цифр - от 0 до 9, в том время как двоичная - всего 2 цифры: 0 и 1.
Если провести некую аналогию, то натуральную дробь в некоторых случаях нельзя точно представить в виде десятичной. Например,
1/3 = 0,33333333333333
3 в периоде.
Точно также в некоторых случаях десятичную дробь нельзя представить точно в двоичном виде. Точность теряется.
Пока можно на этом не заморачиваться, а просто принять к сведению, что float не имеет высокую точность и в дальнейшем иметь это в виду.
Обязательно попробуйте прогнать программу для всех вариантов значений суммы покупки. Поменяйте значение переменной с суммой покупки на 500, 2000, 9000, 15000 и проверьте, каким будет в каждом случае результат.
На всякий случай напоминаю, что после смены значения переменной файл с кодом нужно сохранить, ещё раз скомпилировать командой javac Skidka.java и запустить.
Конечно есть ещё тысяча и один способ решения рассмотренной задачи, куча разных алгоритмов. Например, с помощью условного (тернарного) оператора, описанного в предыдущем уроке. Но для понимания, как работает оператор if решили мы её именно так, как решили. А вы сможете решить эту задачу с применением тернарного оператора? Если да, пишите код в комментариях!
При этом прошу писать код только тех, для кого это действительно сложная задача, кто горд собой, что придумал новое решение!
Выводы из урока:
- Оператор if проверяет значение простого или сложного выражения. Если итоговое значение простого или сложного выражения равно true, т.е. оно истинно, то оператор выполняет одну команду или блок команд, содержащихся в фигурных скобках { }. Если значение проверяемого выражения false, то команда или блок команд не выполняются.
- Оператор if позволяет реализовать один из вариантов условного ветвления в программе. То есть в зависимости от заданных условий выбирается то или иное направление работы программы.
- Типы данных float и double имеют ограниченную точность. float - примерно 7 знаков после запятой, double - примерно 16 знаков после запятой.
Ссылка на предыдущий урок
Ссылка на следующий урок
Ссылка на содержание курса