Методы решения С1

Автор работы: Пользователь скрыл имя, 05 Мая 2010 в 20:46, задача

Краткое описание

решения задач
Ответы на задачи С1:
Программа работает неправильно, если a и b не равны нулю и имеют разные знаки: в этом случае уравнение не имеет решений (поскольку модуль – неотрицательная величина), а программа выдаст два решения. Хотя в задании сказано «Приведите пример таких чисел a, b, x,…», значение x ни на что не влияет (см. далее), в ответе можно указать любое число x. Например,
Лишняя часть программы – ввод x, поскольку это не исходные данные, а результат. Поэтому вместо оператора
readln(a,b,x);
правильнее написать
readln(a,b);
Возможная доработка программы – добавить еще один условный оператор, обрабатывающий неучтенный случай (a и b не равны нулю и имеют разные знаки), при котором нет решений:
var a,b,x: real;
begin
readln(a,b);
if a = 0 then
if b = 0 then
write ('любое число')
else write ('нет решений')
else
if b = 0 then
write('x = 0')
else
if a*b < 0 then
write('нет решений')
else write('x =',b/a,' или x =',-b/a);
end.
обратите внимание, что для проверки условия «a и b имеют разные знаки» использовано произведение a*b, которое больше нуля, когда два значения имеют одинаковые знаки, и меньше нуля – когда разные

Содержимое работы - 1 файл

answC1.doc

— 330.00 Кб (Скачать файл)
  • черный король [его координаты (1,1)] идет по диагонали k-1 шагов, где k=min(i,j) до клетки с координатами (i,i) (если i<=j) или до клетки (j,j) (если i>=j); затем он делает оставшееся количество шагов, max(i,j)-k, по горизонтали или вертикали, так что его общее число шагов равно

    max(i,j)-1

  • аналогично белый король [его координаты (8,1)] идет по диагонали q-1 шагов, где q=min(9-i,j) до клетки с координатами (9-i,9-i) (если 9-i<=j) или до клетки (j,j) (если 9-i>=j); затем он делает оставшееся количество шагов,  max(9-i,j)-q, по горизонтали или вертикали, так что его общее число шагов равно

      max(9-i,j)-1

 
 
  • таким образом, нас интересуют клетки (i,j), для которых

      max(i,j)-1= max(9-i,j)-1    или    max(i,j)= max(9-i,j)   (*)

(1,8) (2,8)             8
(1,7)               7
              (8,6) 6
        (5,5)       5
                4
                3
                2
           
1
1 2 3 4 5 6 7 8  

    Чтобы найти все пары (i,j), для которых верно полученное равенство, рассмотрим сначала левую половину доски (i<=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)

    Доработка программы  сводится просто к замене условия, все  остальное правильно.

  1. Попробуем прежде всего найти математическое решение неравенства . Оно истинно, если числитель и знаменатель дроби имеют один знак, или оба положительные, или оба отрицательные. При получаем:

    (

    и
    ) или (
    и
    )

    В краткой форме: или . В зависимости от значения получаем

      Случай 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.

  1. Первое условие в программе, 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.

  1. Записанные в программе условия означают «ниже синусоиды» и в секторе между прямыми и , в который входит заштрихованная область. Однако, этому условию удовлетворяет не только заштрихованная  область, но еще и вся бесконечная область, выделенная на рисунке красным цветом. Первое пересечение синусоиды с осью абсцисс происходит при , поэтому программа выдает неверный ответ «принадлежит», например, для точки (-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.

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

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

      if x >= -2 then

        if y <= -x then

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

        else

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

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

Информация о работе Методы решения С1