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

Var X,y: real;

begin

readln(x,y);

if (x*x+y*y >= 4) and (x >= -2) and

(y <= -x) and (y >= 0) then

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

else

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

end.

  1. Условный оператор

if a > b then begin x:=a; a:=b; b:=x; end;

упорядочивает переменные a и b с помощью вспомогательной переменной x, записывая в переменную a минимальное из двух значений а в переменную b – максимальное. Аналогично оператор

if b > c then begin x:=b; b:=c; c:=x; end;

упорядочивает значения b и с.

Очевидно, что x используется только как вспомогательная переменная, поэтому вводить ее с клавиатуры не нужно, оператор ввода должен выглядеть так:

read(a, b, c);

Программа работает неправильно, если минимальное число вводится последним и попадает в переменную c. Действительно, выполняя программу для a=3, b=2 и c=1 получаем

a

b

c

readln(a, b, c, x);

3

2

1

if a > b then begin x:=a; a:=b; b:=x; end;

2

3

1

if b > c then begin x:=b; b:=c; c:=x; end;

2

1

3

Чтобы исправить ошибку, в конец программы нужно добавить строчку, упорядочивающую a и b (точную копию первого условного оператора). Вот исправленная программа

Var a, b, c, X: integer;

begin

read(a, b, c);

if a > b then begin x:=a; a:=b; b:=x; end;

if b > c then begin x:=b; b:=c; c:=x; end;

if a > b then begin x:=a; a:=b; b:=x; end;

write(a,b,c);

end.

  1. В приведенной программе две ошибки. Во-первых, условия

y <= sin(x)

y <= 0.5

y >= 0

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

Например, для точки программа ошибочно выдаст ответ «принадлежит». Поэтому нужны два дополнительных ограничения по координате x (для заданной области – ):

x <= pi (или, например, x <= 4)

x >= 0

Во-вторых, записав программу «лесенкой» с выделением структуры

if y <= sin(x) then

if y <= 0.5 then

if y >= 0 then

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

else

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

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

Самый простой способ доработки программы – использовать одно сложное условие, определяющее именно заштрихованную область (с ограничением по оси x)

Var X, y: real;

begin

readln(x, y);

if (y <= sin(x)) and (y <= 0.5) and (y >= 0) and

(x >= 0) and (x <= pi) then

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

else

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

end.

  1. В приведенной программе две ошибки. Во-первых, условия

y <= x

y <= -x

y >= x*x-2

выполненные одновременно, выделяют только область, обозначенную на рисунке синим цветом, а не всю заштрихованную область (серую). То есть для точек, попавших в серую область, но не попавших в синюю (например, для точки ), ответ будет неверный.

Во-вторых, записав программу «лесенкой» с выделением структуры

if y <= x then

if y <= -x then

if y >= x*x-2 then

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

else

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

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

Самый простой вариант добаботки – построить одно сложное условие, причем для того, чтобы охватить всю серую область, условия y < x и y < -x должны быть связаны с помощью логической операции «ИЛИ» (в Паскале – or):

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

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

else

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

Обратите внимание, что два первых условия, связанные с помощью or, взяты в скобки, потому что иначе операция and выполнится раньше, чем or, и результат будет неверный.

Вот полная программа:

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