Ответ:
Примеры чисел x, y, при которых программа неверно работает:
1, 0 (пишет не принадлежит, а должна писать принадлежит)
3, 1 (пишет не принадлежит, а должна писать принадлежит)
2, 2 (ничего не пишет, а должна писать не принадлежит)
Пример доработки программы:
var
x, y: real;
c: string;
begin
readln(x, y);
c := 'не принадлежит';
if y >= 0 then
if y <= 1 then
if x >= 0 then
if x <= pi then
if (x > pi / 2) or (y <= sin(x)) then c := 'принадлежит';
write(c);
end.
Ещё пример доработки программы:
var
x, y: real;
begin
readln(x, y);
if y >= 0 then
if y <= 1 then
if x >= 0 then
if x <= pi then
if (x > pi / 2) or (y <= sin(x)) then write('принадлежит')
else write('не принадлежит')
else write('не принадлежит')
else write('не принадлежит')
else write('не принадлежит')
else write('не принадлежит');
end.
Объяснение:
Исходная программа вообще давала правильный ответ лишь для точек указанного прямоугольника, у которых игрек равен синусу икс, а также для точек в левой половине прямоугольника, лежащих выше синуса икс.
А для точек вне прямоугольника она не писала никакого ответа, т.к. сообщение "не принадлежит" выводится после else, которое принадлежит к последнему if, а до него дело даже и не доходит, ведь срабатывает одно из четырёх условий, идущих перед ним.
Если исходный алгоритм встроить в цикл для отрисовки графика (что я и сделал для проверки, заменив лишь вывод текстовых сообщений на установку переменной в единицу или ноль и добавив округления в условие последнего if), то можно получить отрисовку лишних линий на всю область графика из за того, что последнее значение было 1, а для точек выше- алгоритм его уже не меняет, пока координаты вновь не попадут в прямоугольник.