Задание 5 Вариант 3 Самостоятельная работа 3 ГДЗ Рабочая тетрадь Босова 11 класс (Информатика)
Программист торопился и написал программу с ошибками:
var х, у: real;
begin
readin(х,у);
if х*х+у*у < =1 then
if у < =0 then
if x < 0 then
write('принадлежит')
else
write('не принадлежит')
end.
Выясните, как работает программа при значениях х и у, принадлежащих областям А, В, С, D, Е, F, G, Н. Анализ программы проведите, заполнив таблицу:
Область
Условие х*х + у*у < = 1
Условие y < = 0
Условие х < 0
Сообщение программы
Корректность сообщения
Предложите свой вариант программы, исключающий случаи её неправильной работы.
Из-за неправильной структуры вложенного условного оператора программа не выдает сообщения, если не выполняется первое или второе условие.
program s3_v3_5;
var
x, y: real;
begin
write('x, y > ‘);
readln(x, y);
if
(x * x + y * y < 1) and ((x > = 0) and (y > = 0) or (x < = 0) and (y < = 0)) then writeln('принадлежит')
else writeln('не принадлежит')
end.
В программе проверяются три условия:
- $$x^2+y^2 \le 1$$ — точка лежит внутри или на границе единичной окружности;
- $$y \le 0$$ — точка находится на оси $$x$$ или ниже её;
- $$x < 0$$ — точка находится слева от оси $$y$$.
Из-за вложенности операторов сообщение выводится только тогда, когда выполняются все три условия одновременно. Значит, программа правильно работает только для области F. Для области G первое и второе условия выполняются, но третье — нет, поэтому программа ошибочно выводит «не принадлежит». Во всех остальных областях сообщение не выводится.
| Область | $$x^2+y^2 \le 1$$ | $$y \le 0$$ | $$x < 0$$ | Сообщение программы | Корректность сообщения |
|---|---|---|---|---|---|
| A | — | — | — | ||
| B | + | — | — | — | |
| C | + | — | — | — | |
| D | — | — | — | ||
| E | — | — | — | ||
| F | + | + | + | принадлежит | + |
| G | + | + | — | не принадлежит | — |
| H | — | — | — |
Исправим программу так, чтобы она выводила ответ для любой точки:
program s3_v3_5;
var
x, y: real;
begin
write(‘x, y > ‘);
readln(x, y);
if (x * x + y * y <= 1) and (((x >= 0) and (y >= 0)) or ((x <= 0) and (y <= 0))) then
writeln(‘принадлежит’)
else
writeln(‘не принадлежит’);
end.
Ответ
Программа правильно работает только для области F; для области G она ошибается, а для остальных областей не выводит сообщение. Исправленный вариант программы приведён выше.