Чтобы исправить программу, можно добавить еще одно условие y >= 0 (это отсекает «красную зону») и объединить все четыре условия в одно сложное условие:
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.
14) Условный оператор
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.
15) В приведенной программе две ошибки. Во-первых, условия
y <= sin(x)
y <= 0.5
y >= 0
выделяют не только заштрихованную область, но и аналогичные области в каждой полуволне (на рисунке они обозанчены красным цветом).
Например, для точки
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] Аналогичная ситуация возникает при решении уравнения методом деления отрезка пополам (кто помнит :-).