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