Пример 1.2 выполнения задания
Найти значение функции
(1.2),
упростив вычисления за счет использования скобочных форм и/или дополнительных переменных (в этом предложении и в дальнейшем конструкция «А и/или Б» обозначает «или А, или Б, или А и Б одновременно»). Для контроля правильности результата выполнить вычисление по формуле (1.2) без использования скобочных форм и дополнительных переменных.
Проверить работу программы на значениях A=(1; -1; 2; -2; 4; -4), X=(0,5; 2).
program Project1_2;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
var
A, B, C, X, Y1, Y2: Real;
begin
{Ввод исходных данных}
Write('Введите X и A : ');
ReadLn(X,A);
B:=A/2;
C:=Sqr(B);
{Вычисление выражения}
{ - с использованием дополнительных переменных}
Y1:=(Power(B,X)-Log10(B+1))/C/(B-1);
{ - непосредственно по формуле (1.2)}
Y2:=(Power(A/2,X)-Log10(A/2+1))/(IntPower(A/2,3)-Sqr(A/2));
{Вывод вычисленных значений с надписями}
WriteLn(' Y1 Y2 ');
WriteLn(Y1:12:7,' ',Y2:12:7);
ReadLn;
end.
Представленная программа не предусматривает обработку исключений (см. Приложение 2), поэтому введём в задание дополнительные условия: при возникновении любого исключения, связанного с вычислением функции, предусмотреть в программе его обработку с выводом типа исключения и завершением работы программы нажатием клавиши Enter. В соответствие с ним в программу следует включить обработки всех (из числа рассмотренных в Приложении 2) исключений для вещественных данных, например, так.
program Project1_2;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
var
A, B, C, X, Y1, Y2: Real;
begin
{Ввод исходных данных}
Write('Введите X и A : ');
ReadLn(X,A);
B:=A/2;
C:=Sqr(B);
try
{Попытка вычислить выражения}
{ - с использованием дополнительных переменных}
Y1:=(Power(B,X)-Log10(B+1))/C/(B-1);
{ - непосредственно по формуле (1.2)}
Y2:=(Power(A/2,X)-Log10(A/2+1))/(IntPower(A/2,3)-Sqr(A/2));
except
{Вычислить выражение не удалось}
on EZeroDivide do
begin
WriteLn('Исключение типа "деление на 0" ');
WriteLn('Невозможно вычислить Y при A =',A,' и X =',X);
WriteLn('Нажмите Enter для завершения работы программы.');
ReadLn;
Halt; //Завершить выполнение программы
end;
on EInvalidOp do
begin
WriteLn('Исключение типа "невыполнимая операция" ');
WriteLn('Невозможно вычислить Y при A =',A,' и X =',X);
WriteLn('Нажмите Enter для завершения работы программы.');
ReadLn;
Halt; //Завершить выполнение программы
end;
on EOverflow do
begin
WriteLn('Исключение типа'
,’ "переполнение вещественной переменной" ');
WriteLn('Переменная не может хранить вычисленное значение');
WriteLn('Нажмите Enter для завершения работы программы.');
ReadLn;
Halt; //Завершить выполнение программы
end;
end;//try except
{Вывод вычисленных значений с надписями}
WriteLn(' Y1 Y2 ');
WriteLn(Y1:12:7,' ',Y2:12:7);
ReadLn;
end.
Это позволит по каждому из исключений вывести краткое пояснение на русском языке о причине его возникновения, однако потребует дублирования операторов
WriteLn('Нажмите Enter для завершения работы программы.');
ReadLn;
Halt;
так как запрещено совмещение с операторами on других операторов (в блоке except допускается использовать либо только операторы on, либо только другие операторы).