Выбор метода Оператор 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
k 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, выбирая метод в зависимости от уравнения и собственных соображений.