· если i<=4, то 9-i>=5>i, поэтому равенство (*) справедливо только при j>=9-i; это область выше главной диагонали и на ней;
· в силу симметрии сразу можно построить соответствующую область и в правой части доски (см. рисунок справа):
Из указанных полей только три, выделенные желтым маркером, оказываются внутри нужной области
(i=1, j=8), (i=2, j=8), (i=1, j=7),
(i=5, j=5), (i=8, j=6)
Правильное условие, определяющее нужную область, выглядит так: «клетка выше главной диагонали (или на ней) и одновременно выше второй диагонали (или на ней)». Остается записать его на Паскале:
(j>=i) and (j>=9-i)
Доработка программы сводится просто к замене условия, все остальное правильно.
10) Попробуем прежде всего найти математическое решение неравенства
(
В краткой форме:
Случай 1. При
Случай 2. При
Теперь рассмотрим случай
(
При
Случай 3. При
Случай 4. При
Запишем основную часть программы, определив принадлежность каждого else-блока и используя запись «лесенкой»:
if b > 0 then
write('x > ', a, ' или x < 0')
else
if a > 0 then
write('0 < x < ', a)
else
write(a, ' < x < 0');
Анализ условных операторов показывает, что неправильно обрабатывается Случай 2 (
В программе вводится переменная
Простейший и (в данной задаче) наиболее логичный вариант доработки программы – добавить еще один условный оператор для правильного разделения Случая 1 и Случая 2:
var a, b: real;
begin
readln(a, b);
if b > 0 then
if a > 0 then
write('x > ', a, ' или x < 0')
else
write('x < ', a, ' или x > 0')
else
if a > 0 then
write('0 < x < ', a)
else
write(a, ' < x < 0');
end.
11)
Если записать программу «лесенкой», становится видна еще одна ошибка.
if x*x+y*y >= 4 then
if x <= 2 then
write('принадлежит')
else
write('не принадлежит')
Дело в том, что любой else относится к ближайшему if, поэтому сообщение «не принадлежит» выводится только тогда, когда первые два условия выполняются, а третье – нет. Следовательно, для точки (0;0), например, программа вообще не выдаст никакого сообщения (первое условие ложно).
Чтобы исправить программу, можно добавить еще одно условие 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.
12)
Если записать программу «лесенкой», становится видна еще одна ошибка.
if y >= -1 then
if y <= sin(x) then
write('принадлежит')
else
write('не принадлежит')
Дело в том, что любой else относится к ближайшему if, поэтому сообщение «не принадлежит» выводится только тогда, когда первые два условия выполняются, а третье – нет. Следовательно, для точки (0;-2), например, программа вообще не выдаст никакого сообщения (первое условие ложно).
Чтобы исправить программу, можно добавить еще одно условие x >= -pi/2 (это отсекает «красную зону») и объединить все четыре условия в одно сложное условие:
var x,y: real;
begin
readln(x,y);
if (y >= -1) and (y <= sin(x)) and
(y >= x-1) and (x >= -pi/2) then
write('принадлежит')
else
write('не принадлежит')
end.
13)
if x*x+y*y >= 4 then
if x >= -2 then
write('принадлежит')
else
write('не принадлежит')
Для точек в «красной зоне» (см. рисунок) программа ошибочно выдает ответ «принадлежит», а для точек, в которых не выполняется первое или второе условие (внутри круга или слева от прямой