Паскаль. Основы программирования

Выбор метода Оператор Caseof


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

Структура оператора выбора в Turbo Pascale следующая:

Case I of

   Const1 : S1;

   Const2 : S2;

   ............

  ConstN : SN;

  else S

end;

В этой записи: I - выражение порядкового типа, значение которого вычисляется; Const1, Const2, ..., ConstN - константы, с которыми сравнивается значение выражения I; S1, S2, ..., SN - операторы, из которых выполняется тот, с соответствующей константой которого совпадает значение выражения I; S - оператор, который выполняется, если значение выражения I не совпадает ни с одной из констант Const1, ..., ConstN.

Ветвь оператора else является необязательной. Если она отсутствует и значение I не совпадает ни с одной из перечисленных констант, весь оператор рассматривается как пустой. В отличие от оператора if перед словом else точку с запятой можно ставить.

Если для нескольких констант нужно выполнить один и тот же оператор, их можно перечислить через запятую (или даже указать диапазон, если это возможно), сопроводив их одним оператором.

Пример 1



Program

Problem1; { Вычисление значений функций }

   uses WinCrt;

   var

     i : integer;

     x : real;

   begin

     { Инструкция }

     write('Введите значение аргумента '); readln(x);

     writeln('Наберите соответствующий номер для');

     writeln('вычисления значения нужной вам функции');

     writeln('1 - sin(x), 2 - cos(x), 3 - exp(x), 4 - ln(x)');

     readln(i);

     Case I of

       1 : writeln('Значение sinx = ', sin(x):1:8);

       2 : writeln('Значение cosx = ', cos(x):1:8);

       3 : writeln('Значение exp(x) = ', exp(x):8:8);

       4 : writeln('Значение ln(x) = ', ln(x):8:8)

     end

   end.

Пример 2.

    Case I of

         0, 2, 4, 6, 8 : writeln('Четная цифра');


         1, 3, 5, 7, 9 : writeln('Нечетная цифра');

         10..100       : writeln('Числа от 10 до 100');

       else

         writeln('Отрицательное число или больше 100')

       end;

Обратимся к поставленной задачи - выбора метода уточнения корня в зависимости от воли пользователя и особенностей заданной функции.

{ Основная программа }

   begin

     write('Введите левый конец промежутка a = '); readln(a);

     write('Введите правый конец промежутка b = '); readln(b);

     write('Введите точность вычисления корня eps = '); readln(eps);

     writeln('Для выбора метода решения, введите его номер ');

     writeln('1 - метод хорд, 2 - метод касательных');

     writeln('   3 - комбинированный метод'); readln(k);

     Case

of

       1 : вызов процедуры метода хорд;

       2 : вызов процедуры метода касательных;

       3 : вызов процедуры комбинированного метода;

     end;

     writeln('Корень уравнения равен x = ', x:12:t(eps));

     writeln('С точностью до eps = ', eps:1:t(eps))

   end.

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

{ Процедура уточнения корня методом хорд }

   Procedure chord1(a, b, eps : real; var

x : real);

      var

        x1, min : real;

      begin

        minimum(a, b, eps, min);

        x1 := a;

        repeat

          x := x1 - ((b - x1)*fx(x1))/(fx(b) - fx(x1));

          x1 := x

        until abs(fx(x))/min < eps

      end;

Она названа Chord1, потому что в программе будет еще одна процедура под именем Chord, которая помогает в работе комбинированному методу.

Процедура вычисления  корня  по  методу касательных может стать такой:

 Procedure Tangent2(a, b, eps : real; var

x : real);

      var

        min : real;

      begin

        minimum(a, b, eps, min);

        if fx(a)*derivat2(a, eps) > 0

          then tangent1(a, b, eps, min, x)



          else tangent1(b, a, eps, min, x)

      end;

Она названа Tangent2, так как сама  использует  процедуру tangent1:

   Procedure tangent1(a, b, eps, min : real; var x : real);

      var

        x1 : real;

      begin

        x1 := a;

        repeat

          x := x1 -  fx(x1)/derivat1(x1, eps);

          x1 := x

        until abs(fx(x))/min < eps

      end;

А эта процедура названа tangent1,  потому  что  процедура под именем  tangent используется в работе комбинированного метода, процедура которого может быть такой:

{ Комбинированный метод }

   Procedure Combination(a, b, eps : real; var x : real);

      var

        z : real;

      begin

        repeat

          if fx(a)*derivat2(a, eps) > 0

            then

              begin

                tangent(a, b, eps, z);

                chord(b, a, x);

                b := z; a := x

              end

            else

              begin

                tangent(b, a, eps, z);

                chord(a, b, x);

                b := x; a := z

              end

        until abs(z - x) < eps

      end;

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

Задание 3

Составьте полностью программу. Используйте ее для вычисления корней уравнений из предыдущего задания 2, выбирая метод в зависимости от уравнения и собственных соображений.

 


Содержание раздела