Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kpolyakov.narod.ru answC1.doc
Скачиваний:
2
Добавлен:
09.12.2018
Размер:
579.58 Кб
Скачать

Var X, y: real;

begin

readln(x, y);

if (y <= x*x) and (y <= x+2) and (y <= 2-x) and (y >=0) then

write('принадлежит')

else

write('не принадлежит');

end.

  1. Особенность этой задачи в том, что одной из ограничительных линий используется гипербола, которая состоит из двух ветвей. Одна из этих ветвей на исходном рисунке не показана. Использованное в программе условие x*y >= 1 равносильно условию для положительных (это область выше показанной ветви гиперболы) и условию для отрицательных (это «красная» область ниже второй, не показанной ветви).

Далее замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x*y >= 1 then

if x <= 2 then

if y <= 2 then

write('принадлежит')

else

write('не принадлежит');

Это значит, что, например, при невыполнении первого условия (x*y >= 1) (или при выполнении первого и невыполнении второго) вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else-блок, не срабатывает. Таким образом, для точки (0,0), например, программа работает неправильно – не выводит ответ вообще.

Кроме того, с учетом второй ветви гиперболы, системе из трех условий, которую использовал программист, удовлетворяют точки не только в «серой» области (которая нужна по условию задачи), но и в «красной» (см. рисунок). Поэтому, например, для точки (-2,-2) будет ошибочно выдано сообщение «принадлежит».

Для исправления этих ошибок нужно добавить условие x > 0 и объединить все 4 условия с помощью операции И (в паскале – and) в одно сложное условие в одном условном операторе:

Var X, y: real;

begin

readln(x, y);

if (x*y >= 1) and (x <= 2) and (y <= 2) and (x > 0) then

write('принадлежит')

else

write('не принадлежит');

end.

  1. Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if y >= 0 then

if y <= 1 then

if x >= 0 then

if x <= pi then

if y <= sin(x) then

write('принадлежит')

else

write('не принадлежит');

Это значит, что, например, при невыполнении первого, второго или третьего условий вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else-блок, не срабатывает. Таким образом, для точки (-1,0), например, программа работает неправильно – не выводит ответ вообще.

Кроме того, в программе есть и другая ошибка. Легко видеть, что первые 4 условия определяют прямоугольник, в котором заключена нужная нам область – это правильно. В то же время пятое условие (y <= sin(x)) «отсекает» область, обозначенную желтым цветом, это неправильно. Таким образом, например, для точки (3;0,8), находящейся в «желтой» области, программы выдает неправильный ответ: «не принадлежит».

Поэтому нужно в пятом условии к области y <= sin(x) добавить еще область x >= pi/2 (с учетом первых четырех условий, добавляется прямоугольник, показанный на рисунке красной рамкой). Объединение областей выполняется с помощью логической операции ИЛИ (в Паскале – or). Таким образом, вместо пятого условия нужно использовать сложное условие

( y <= sin(x)) or (x >= pi/2)

Кроме того, полученные 5 условий нужно объединить в одно сложное с помощью операции И (в Паскале – and):

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]