
- •Ответы на задачи с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;
- •31 Http://kpolyakov.Narod.Ru
Var X, y: real;
begin
readln(x, y);
if ((y <= x) or (y >= -x)) and (x*x+y*y <= 1) then
write('принадлежит')
else
write('не принадлежит');
end.
В
приведенной программе несколько ошибок. Во-первых, заштрихованная область ограничена тремя прямыми:x=0, y=0 и y=x/2-1 и определяется условиями
x0 > 0
y0 < 0
y0 > x0/2-1
а в программе использована совершенно другая система условий. Во-вторых, в конце программы, независимо от выполнения условных операторов, всегда выводится сообщение «не принадлежит». Например, при вводе координат (1,–3) будет выведено сообщение «принадлежитне принадлежит», поэтому для этих данных она работает неверно.
Доработать программу очень просто – нужно составить сложное условие, объединив три правильных условия с помошью операции И (and):
Var x0, y0: real;
begin
readln(x0, y0);
if (x0 > 0) and (y0 < 0) and (y0 > x0/2-1) then
write('принадлежит')
else
write('не принадлежит');
end.
П
режде всего, перепишем условия в программе так, чтобы была видна их связь с уравнениями заданных прямых:
x-y >= -2 заменим на равносильное y <= x+2
x+y <= 2 заменим на равносильное y <= 2-x
Далее замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:
if y <= x*x then
if y <= x+2 then
if y <= 2-x then
write('принадлежит')
else
write('не принадлежит');
Это значит, что, например, при невыполнении первого условия (y <= x*x) (или при выполнении первого и невыполнении второго) вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else-блок, не срабатывает. Таким образом, для точки (0,1), например, программа работает неправильно – не выводит никакого ответа.
Кроме того, системе из трех условий, которую использовал программист, удовлетворяют точки не только в «серой» области (которая нужна по условию задачи), но и в «красной» (см. рисунок). Поэтому, например, для точки (0,-1) будет ошибочно выдано соощение «принадлежит».
Для исправления этих ошибок нужно добавить условие y >= 0 и объединить все 4 условия с помощью операции И (в паскале – and) в одно сложное условие в одном условном операторе:
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) в одно сложное условие в одном условном операторе: