Урок 6. Задачи со сложным условием

Какие еще бывают условия в языке Си

10. Условия бывают простыми и достаточно сложными. Простое условие состоит из двух величин и одной операции отношения между ними (больше, больше или равно, меньше и т.д.).
Иногда надо написать условие, в котором объединяются два или более простых отношений. Например, фирма отбирает сотрудников возраста 25—40 лет. То есть значение возраста надо проверять дважды: чтобы оно было больше (или равно) 25 и меньше 40.
Самое простое, что приходит на ум - записать это условие непосредственно как оно выглядит. Пусть переменная v содержит значение возраста. Попробуем составить условие для условного оператора:

11. if( 25 <= v < 40) printf("Вы нам подходите\n");

12. В принципе правила (синтаксис) языка Си допускают такую запись. Однако рассмотрим, как будет работать такое условие.
В качестве примера возьмем значение возраста равное 30 и проверим это условие:

13. if( 25 <= 30 < 40) ...

14. Это условие компилятор вычисляет, как и всякое выражение, слева направо. Первое сравнение

15. 25 <= 30

16. дает значение "истина", т.е. 1. Вторая часть выражения выполняет сравнение с уже частично вычисленным выражением, т. е. проверяет:

17. 1 < 40

18. По счастью, это отношение тоже истинно, поэтому и все выражение истинно. Но возьмем другое значение возраста, v=10. Такие сотрудники фирме явно не подходят. Проверим, как будет вычисляться выражение. Первая часть

19. 25 <= 10

20. дает значение "ложь", т. е. 0, однако вторая часть

21. 0 < 40

22. явно истинна, и все выражение тоже получилось истинно. Результат далек от желаемого.
Поэтому в силу особенностей вычисления выражений длинное условие приходится разбивать на простые отношения и соединять их логическим связками, или логическими операциями. Таких операций в языке Си две:

23. && логическое И, имеет значение "истина",
если истинны оба операнда
|| логическое ИЛИ, имеет значение "истина",
если истинен хотя бы один операнд

24. В качестве операндов выступают условия, составленные из отношений или других условий:

25. условие_1 && условие_2
условие_1 || условие_2

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

27. ! логическое НЕ (отрицание условия)

28. Записывается:

29. ! условие

30. Используя отрицание, можно выразить одно логическое отношение через другое. Например, "x больше y" означает, что "неверно, что x меньше или равно y":

31. x > y равносильно !(x <= y)

32. Используя логические операции, можно составлять условия на принадлежность значения промежутку, или наоборот, его непринадлежность. Если значение должно попадать в промежуток, применяется связка И, а если оно не должно принадлежать - связка ИЛИ.
В нашей предыдущей задаче как раз проверяется условие принадлежности значения возраста промежутку, оно теперь будет выглядеть так:

33. if( 25 <= v && v < 40) printf("Вы нам подходите\n");



34. и расшифровывается буквально: если возраст больше или равен 25 И возраст меньше 40. Это условие составлено из двух операций отношения и логической связки И между ними.
Рассмотрим пример на непринадлежность значения промежутку. В медицине есть такое понятие - уязвимый возраст. Человек находится в уязвимом возрасте, если этот возраст меньше 8 лет ИЛИ больше или равен 60. Тогда для проверки на уязвимый возраст можно записать условие:

35. if( v < 8 || v >= 60) ...

36. Порядок записи операндов условия произволен, но лучше все-таки сохранять естественную нотацию. Сравним эквивалентную запись предыдущего выражения:

37. if( 60 <= v || 8 > v) ...

38. Операции логического И и логического ИЛИ можно также выразить одну через другую с помощью отрицания. В последнем примере условие можно записать:

39. if( !(8 <= v && v < 60) )...

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

Приоритет логических операций и отношений

42. В первую очередь выполняются

43. арифметические операции, затем
операция "НЕ", затем
логические отношения >, <, >=, <=, ==, !=, затем
операция "И", затем
операция "ИЛИ"

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

45. if( x*x+y*y<=r*r) ...
if( (x*x+y*y)<=(r*r) )...

Задача о кирпиче

47. Выяснить, пройдет ли кирпич с ребрами a, b, c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия.

Пусть в ячейки a, b, c, x, y введены числа. Первый вариант записи условного оператора:

48. if(x>a && y>b) printf("Кирпич пройдет\n");
else printf("Кирпич не пройдет\n");

49. Однако глядя на этот кирпич и отверстие, мы-то быстро сообразим, что так кирпич не пройдет и его надо повернуть "боком". Компьютер же этого не может видеть, и ему надо подробно разъяснить, как поворачивать этот самый кирпич. Точнее, поскольку порядок ввода значений переменных заранее неизвестен, в записи условия надо рассмотреть все варианты их сочетания. Полный вариант записи условия:

50. if(
x>a && y>b || x>b && y>a ||
x>a && y>c || x>c && y>a ||
x>c && y>b || x>b && y>c
)
printf("Кирпич пройдет\n");
else printf("Кирпич не пройдет\n");

51. Скобки в записи этого условия необязательны, нужный порядок выполнения операций соблюден.

Резюме

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

Вопросы для самопроверки

55. 1. Какие логические операции вы знаете?
2. Какая логическая операция используется для проверки принадлежности (непринадлежности) числа промежутку?
3. Как работает логическое отрицание?
4. Перечислите приоритет выполнения логических операций.

 

Задания для самостоятельной работы к уроку 6

1. Проверить, принадлежит ли число, введенное с клавиатуры, интервалу (-5.1, 3.6).
2. Известен рост трех человек. Определить, одинаков ли их рост? (вывести сообщение).
3. Даны три вещественных числа a, b, c. Проверить, выполняется ли неравенство a<b< c.
4. Даны действительные положительные числа a, b, c. Выяснить, существует ли треугольник с длинами сторон a, b, c. (Указание. В треугольнике длина стороны не может превышать сумму двух других сторон.)
5. Определить, является ли треугольник со сторонами a, b, c равнобедренным (рассмотреть все возможные сочетания длин сторон).
6. Определить, является ли треугольник со сторонами a, b, c остроугольным (воспользуйтесь теоремой Пифагора).
7. Пройдет ли мяч радиуса r в прямоугольное отверстие со сторонами x и y?
8. Записать программу вычисления площади треугольника по формуле Герона с проверкой существования треугольника с указанными длинами сторон. В случае, если треугольник не существует, вывести сообщение и выполнить выход из программы.
9. Написать программу, которая вычисляет Индекс массы тела (ИМТ) человека и выдает сообщение. Формула вычисления ИМТ:
масса тела в кг (В) разделить на рост в метрах (Р) в квадрате

В/(Р*Р)

Если ИМТ менее 18,5 то Дефицит массы тела.
Если ИМТ в диапазоне 18,5-24,9 то Нормальная масса тела.
Если ИМТ больше 24,9 то Избыточная масса тела.
Рекомендуемый вид экрана во время работы программы:

Введите в одной строке вес и рост (в м.) и нажмите <Enter>
==> 58 1.6
Ваш ИМТ=22.65625. У вас нормальная масса тела.









Последнее изменение этой страницы: 2016-04-07; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь