Смекни!
smekni.com

Методы решения С1 (стр. 3 из 4)

· если 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 (

и
), то есть, в качестве примера можно привести пару
при любом
(которое вообще не влияет на результат).

В программе вводится переменная

, которая нигде не используется. Поэтому это – лишняя часть программы, можно убрать
из списка объявляемых переменных и списка ввода в операторе readln.

Простейший и (в данной задаче) наиболее логичный вариант доработки программы – добавить еще один условный оператор для правильного разделения Случая 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)

Первое условие в программе, x*x+y*y >= 4, означает «вне круга». Если выполняются одновременно второе и третье условия, x <= 2 и y <= x, точка находится в секторе между прямыми
и
, в который входит заштрихованная область. Таким образом, выполнение всех трех условия означает «вне круга и в секторе». Однако, этому условию удовлетворяет не только заштрихованная область, но еще и вся бесконечная область, выделенная на рисунке красным цветом. Поэтому для любой точки в «красной зоне», например, для точки (1;­ –2), программа выдаст неправильный ответ «принадлежит».

Если записать программу «лесенкой», становится видна еще одна ошибка.

if x*x+y*y >= 4 then

if x <= 2 then

if y <= x 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)

Записанные в программе условия означают «ниже синусоиды» и в секторе между прямыми
и
, в который входит заштрихованная область. Однако, этому условию удовлетворяет не только заштрихованная область, но еще и вся бесконечная область, выделенная на рисунке красным цветом. Первое пересечение синусоиды с осью абсцисс происходит при
, поэтому программа выдает неверный ответ «принадлежит», например, для точки (-4;0), которая в самом деле не принадлежит заштрихованной области.

Если записать программу «лесенкой», становится видна еще одна ошибка.

if y >= -1 then

if y <= sin(x) then

if y >= x-1 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)

Эта задача полностью аналогична задаче 11 (рисунки симметричны). Вот основная часть программы с выделенной структурой:

if x*x+y*y >= 4 then

if x >= -2 then

if y <= -x then

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

else

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

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

) вообще не выдается никакого сообщения.