Ответы на задачи 24 (С1)
Скачать 1.99 Mb.
|
var x0, y0: real; begin readln (x0, y0) if (x0 < 2) and (x0 > -2) and (y0 < 2) and (y0 > -2) then writeln('точка лежит внутри области') else writeln('точка не лежит внутри области'); end.
Для ответа на остальные вопросы нарисуем поле и расставим королей (в самом деле в этой задаче все равно, какого цвета поля, поэтому мы их не раскрашивали). Короли могут ходить по диагонали, поэтому чтобы дойти до поля (i,j), королю лучше сначала идти по диагонали, чтобы быстрее выйти на нужную горизонталь или вертикаль, а затем двигаться по этой горизонтали (или вертикали) к заданной клетке.
max(i,j)-1
max(9-i,j)-1
max(i,j)-1= max(9-i,j)-1 или max(i,j)= max(9-i,j) (*)
Из указанных полей только три, выделенные желтым маркером, оказываются внутри нужной области (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) Доработка программы сводится просто к замене условия, все остальное правильно.
( и ) или ( и ) В краткой форме: или . В зависимости от значения получаем Случай 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.
Если записать программу «лесенкой», становится видна еще одна ошибка. 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.
Если записать программу «лесенкой», становится видна еще одна ошибка. |