- •Ответы на задачи с1:
- •Var a,b: real;
- •Var a,b: real;
- •Var a,b: real;
- •Var a,b: real;
- •Var x0, у0, у: real;
- •Var a, b, с, d, xl, x2: real;
- •Var a, b: integer;
- •Var a, b: integer;
- •Var х, у, z: real;
- •Var х, у, z: real;
- •Var X, у, rl,r2:real;
- •Var X, у, rl,r2:real;
- •Var X, у, rl,r2:real;
- •Var x0, y0: real;
- •Var x0, y0: real;
- •Var a, b: real;
- •Var X,y: real;
- •Var X,y: real;
- •Var X,y: real;
- •Var a, b, c, X: integer;
- •Var X, y: real;
- •Var X, y: real;
- •Var X, y: real;
- •Var X, y: real;
- •Var X, y: real;
- •Var x0, y0: real;
- •Var X, y: real;
- •Var X, y: real;
- •Var X, y: real;
- •22 Http://kpolyakov.Narod.Ru
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.
-
Особенность этой задачи в том, что одной из ограничительных линий используется гипербола, которая состоит из двух ветвей. Одна из этих ветвей на исходном рисунке не показана. Использованное в программе условие 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.
-
Сразу замечаем, что в программе 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):