ВЫРАЖЕНИЯ, ОПИСЫВАЮЩИЕ СЛОЖНЫЕ УСЛОВИЯ
Для проверки тех или иных состояний переменных в программе нам потребуются выражения с логическим результатом. Опираясь на них, мы сможем выполнять или не выполнять те или иные действия.
Для примера, рассмотрим, как с помощью подобных выражений проверять различные свойства чисел и их принадлежность к указанным промежуткам.
пример:
Составить выражение, отвечающее на вопрос «хранится ли в переменной z четное число?»
boolean t=z%2==0; \\ четное
Проверить, является ли значение в переменной s целым:
boolean t=s==(int)s;
Проверить, принадлежит ли переменная промежутку [-3,8.5)
boolean t=k>=-3 && k<8.5;
Проверить, является ли переменная m по модулю больше 5.
boolean t=n<-5 || n>5;
boolean t1=Math.abs(n)>5;
Проверить, принадлежит ли переменная v следующему промежутку: (-6;0) (0;6) {7}
boolean t=v>-6 && v<0 || v>0 && v<6||v==7;
boolean t1=v>-6 && v<6 && v!=0 ||v==7;
ПОРЯДОК ВЫПОЛНЕНИЯ ОПЕРАТОРОВ РАЗНЫХ ГРУПП
1. префиксные инкременты и декременты
2. действия в скобках
3. арифметические действия
4. операторы сравнения
5. логические операторы
6. присваивание
7. постфиксные инкременты и декременты
Ветвление в программах.
Ветвление – это ситуация в программе, при которой, в зависимости от некоторого логического условия, выполняются либо не выполняются предопределенные разработчиком действия.
Проверка каждого условия в программе создает отдельно ветвь алгоритма, которая будет выполняться в определенных условиях. Если условие составить неправильно, то ветвь может выполняться всегда, или, наоборот, никогда.
if (условие) действие;
На месте условия может стоять любое выражение с логическим значением, а на месте действия может располагаться любая допустимая команда ЯП java, которая будет выполняться в том и только в том случае, когда условие истинно.
На месте действие вместо одной команды может содержаться целый набор команд. В таком случае их необходимо сгруппировать с помощью оператора блока
{ - открывает блок
} – закрывает блок
Выражения, состоящие из оператора блока, не требуется завершать «;», в отличие от всех остальных выражений.
Для наглядного форматирования кода принято внутренность любого кода смещать вправо на два пробела или tab(табуляция) относительно начала или конца блока.
Это становится критически необходимым, когда 1 блок вкладывается в другой, и эта вложенность оказывается многократной.
пример:
int z=(int)(Math.random()*10);
if(z%2==0) System.out.print(“число четное”);
int z=(int)(Math.random()*10);
if(z%2==0) {
System.out.print(“создано число”+z);
System.out.print(“ и оно четное”);
}
К любому оператору if может быть добавлен необязательный блок else, действия внутри которого выполняются только в том случае, если условие у оператора if – ложно.
if (условие) {
\\ действие выполняется если условие истинно
} else {
\\ действие выполняется если условие ложно
}
пример:
int z=…;
if(z%2==0) {
System.out.print(“число четное”);
} else {
System.out.print(“число нечетное”);
}
Возможно использование вложенных друг в друга условных операторов для реализации более чем двух ветвей программы.
пример:
int z=…;
if(z>0) {
System.out.print(“положительно”);
}
if(z==0) {
System.out.print(“нулевое”);
}
if(z<0) {
System.out.print(“отрицательно”);
}
В представленном примере в независимой переменной z всегда будут выполняться 3 условия (проверки). Это не рационально, потому что условия в данном случае являются взаимоисключающими: если число оказалось положительным, то оно одновременно не будет ни отрицательным ни нулем.
Число проверок можно сократить следующим образом:
int z=…;
if(z>=0) {
if(z==0) {
System.out.print(“нулевое”);
} else {
System.out.print(“положительно”);
} else {
System.out.print(“отрицательно”);
}
В представленном примере в лучшем случае будет 1 проверка, в худшем – 2.
Очередность проверок следует выбирать с учетом тех вероятностей, которые следуют из условия задачи.
В данном случае выполняется меньше проверок, если вероятней выпадение отрицательного числа на отрезке [2?;99].
Рассмотрим пример, когда с помощью условного оператора надо проверить совпадение конкретной переменной с некоторым набором значений.
Предположим, что нам нужно выполнять различные действия в зависимости от того будет ли переменная z равняться -1,0 или 1
if(z==-1) {…
} else {
if(z==0){…
} else {
if(z==1){…
}
Если бы потребовалась работать не с тремя, а с четырьмя значениями в наборе, то оптимальный код выглядел бы так:
if(z==-1) {…
} else {
if(z==0){…
} else {
if(z==1){…
} else {
…
}
}
Для более локаничной записи проверок подрядидущих взаимоисключающих условий принято использовать связку else if:
if(z==-1) {…
} else if(z==0){…
} else if(z==1){…
} else {…
}
Действия, которые будут помещены в последний блок else в данном случае будут выполняться не только для z==2, но и для любых других значений незатронутых вышестоящими условиями.
Если потребуется выполнить последний набор действий только для z==2, то последний блок нужно заменить на else if
-//-
}else if(z==2){…
}