Методы решения С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 Кб (Скачать файл)

    Чтобы исправить программу, можно добавить еще одно условие 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. Условный оператор

      if a > b then begin x:=a; a:=b; b:=x; end;

    упорядочивает переменные a и b с помощью вспомогательной переменной x, записывая в переменную a минимальное из двух значений а в переменную b – максимальное. Аналогично оператор

      if b > c then begin x:=b; b:=c; c:=x; end;

    упорядочивает значения b и с.

    Очевидно, что x используется только как вспомогательная переменная, поэтому вводить ее с клавиатуры не нужно, оператор ввода должен выглядеть так:

      read(a, b, c);

    Программа работает неправильно, если минимальное  число вводится последним и попадает в переменную c. Действительно, выполняя программу для a=3, b=2 и c=1 получаем

      a b c
    readln(a, b, c, x); 3 2 1
    if a > b then begin x:=a; a:=b; b:=x; end; 2 3 1
    if b > c then begin x:=b; b:=c; c:=x; end; 2 1 3

    Чтобы исправить  ошибку, в конец программы нужно  добавить строчку, упорядочивающую a и b (точную копию первого условного оператора). Вот исправленная программа

      var a, b, c, x: integer;

      begin

        read(a, b, c);

        if a > b then begin x:=a; a:=b; b:=x; end;

        if b > c then begin x:=b; b:=c; c:=x; end;

        if a > b then begin x:=a; a:=b; b:=x; end;

        write(a,b,c);

      end.

  1. В приведенной программе две ошибки. Во-первых, условия

      y <= sin(x)

      y <= 0.5

      y >= 0

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

    Например, для точки  программа ошибочно выдаст ответ «принадлежит». Поэтому нужны два дополнительных ограничения по координате x (для заданной области – ):

      x <= pi (или, например, x <= 4)

      x >= 0

    Во-вторых, записав программу «лесенкой» с  выделением структуры

      if y <= sin(x) then

        if y <= 0.5 then

          if y >= 0 then

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

          else

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

    мы видим, что else-блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых  двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно.

    Самый простой  способ доработки программы –  использовать одно сложное условие, определяющее именно заштрихованную область (с ограничением по оси x)

      var x, y: real;

      begin

        readln(x, y);

        if (y <= sin(x)) and (y <= 0.5) and (y >= 0) and

           (x >= 0) and (x <= pi) then

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

        else

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

      end.

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