[Pascal] Значение k-й производной записанного по убывающим степеням многочлена в точк
Значение k-й производной записанного по убывающим степеням многочлена в точке t0, f: сигма(R) > R, f(дельта) = 0.
Требования и рекомендации к выполнению задания:
Цитата:
1) Алгоритм решения задачи должен быть однопроходным и не должен использовать дополнительную память, пропорциональную размеру входного файла (использование массивов для хранения входной последовательности запрещено);
2) Возможны 2 варианта реализации последовательности в виде входного файла: а) файл имеет тип Text, создается с помощью стандартного текстового редактора и просматривается тоже стандартными средствами; б) файл имеет тип file of X, создается и просматривается специальной отдельной программой (или программами) генерации и просмотра;
3) Рекомендуется использовать схему вычисления индуктивной функции, в которой на каждом шаге основного цикла из входного файла читается и обрабатывается 1 элемент последовательности (в этом случае инвариант цикла и ограничивающая функция стандартны);
4) Программа должна выводить поочередно обрабатываемые элементы входного файла, а также другие (промежуточные) данные в виде, позволяющем проанализировать и понять процесс формирования окончательного результата как автору программы, так и проверяющему задание;
5) Выходные данные (включая те, что необходимы для понимания работы алгоритма) должны выводиться на экран для оперативного анализа результатов (в режиме отладки) и в выходной файл (в режиме формирования отчета) для демонстрации проверяющему работоспособности программы;
6) Требуется протестировать основные особые случаи входных данных (например, входной файл пуст или содержит лишь 1 элемент), корректную обработку последнего элемента файла, проверить, учитывается ли наличие стационарного значения индуктивной функции и т. п.
2) Возможны 2 варианта реализации последовательности в виде входного файла: а) файл имеет тип Text, создается с помощью стандартного текстового редактора и просматривается тоже стандартными средствами; б) файл имеет тип file of X, создается и просматривается специальной отдельной программой (или программами) генерации и просмотра;
3) Рекомендуется использовать схему вычисления индуктивной функции, в которой на каждом шаге основного цикла из входного файла читается и обрабатывается 1 элемент последовательности (в этом случае инвариант цикла и ограничивающая функция стандартны);
4) Программа должна выводить поочередно обрабатываемые элементы входного файла, а также другие (промежуточные) данные в виде, позволяющем проанализировать и понять процесс формирования окончательного результата как автору программы, так и проверяющему задание;
5) Выходные данные (включая те, что необходимы для понимания работы алгоритма) должны выводиться на экран для оперативного анализа результатов (в режиме отладки) и в выходной файл (в режиме формирования отчета) для демонстрации проверяющему работоспособности программы;
6) Требуется протестировать основные особые случаи входных данных (например, входной файл пуст или содержит лишь 1 элемент), корректную обработку последнего элемента файла, проверить, учитывается ли наличие стационарного значения индуктивной функции и т. п.
Я смог написать программу для вычисления только первой производной по схеме Горнера:
Код:
program work5;
(****************************************************************)
var { значение производной в точке t0 }
ValueDerivative : real;
{ значение полинома в точке t0 }
ValuePolinom : real;
{ коэффициент одночлена из файла inputfile.txt }
k : real;
{ точка, в которой считаем значение производной n-го порядка от полинома }
t0 : real;
{ Порядок производной }
OrderDerivative : integer;
{ Файл с входными данными }
InputPolinom : text;
{ Файл с результатом работы программы }
OutputPolinom : text;
(****************************************************************)
begin
{ устанавливаем связь между файловой переменной и именем файла }
Assign( InputPolinom, 'inputfile.txt' );
Assign( OutputPolinom, 'outputfile.txt' );
{ подготовка к записи в файл }
Rewrite(OutputPolinom);
{ подготовка файла к чтению }
Reset(InputPolinom);
{ блок ввода }
Write( 'Введите порядок производной: ' );
Readln( OrderDerivative );
Write( 'Введите t0: ' );
Readln( t0 );
ValuePolinom := 0;
ValueDerivative := 0;
{ вычисляем значение полинома и производной от полинома в точке t0 }
while ( not EOF( InputPolinom )) do
begin
{ считываем значение коэффициента при одночлене из файла inputfile.txt }
Read( InputPolinom, k );
ValueDerivative := ValueDerivative * t0 + ValuePolinom;
ValuePolinom := ValuePolinom * t0 + k;
end;
Writeln( 'ValueDerivative = ', ValueDerivative );
Readln;
{ записываем полученное значение в файл outputfile.txt }
Writeln( OutputPolinom, ValuePolinom ) ;
Writeln( OutputPolinom, ValueDerivative ) ;
{ заканчиваем работу с файлами inputfile.txt outputfile.txt }
close( InputPolinom );
close( OutputPolinom );
end.
(****************************************************************)
var { значение производной в точке t0 }
ValueDerivative : real;
{ значение полинома в точке t0 }
ValuePolinom : real;
{ коэффициент одночлена из файла inputfile.txt }
k : real;
{ точка, в которой считаем значение производной n-го порядка от полинома }
t0 : real;
{ Порядок производной }
OrderDerivative : integer;
{ Файл с входными данными }
InputPolinom : text;
{ Файл с результатом работы программы }
OutputPolinom : text;
(****************************************************************)
begin
{ устанавливаем связь между файловой переменной и именем файла }
Assign( InputPolinom, 'inputfile.txt' );
Assign( OutputPolinom, 'outputfile.txt' );
{ подготовка к записи в файл }
Rewrite(OutputPolinom);
{ подготовка файла к чтению }
Reset(InputPolinom);
{ блок ввода }
Write( 'Введите порядок производной: ' );
Readln( OrderDerivative );
Write( 'Введите t0: ' );
Readln( t0 );
ValuePolinom := 0;
ValueDerivative := 0;
{ вычисляем значение полинома и производной от полинома в точке t0 }
while ( not EOF( InputPolinom )) do
begin
{ считываем значение коэффициента при одночлене из файла inputfile.txt }
Read( InputPolinom, k );
ValueDerivative := ValueDerivative * t0 + ValuePolinom;
ValuePolinom := ValuePolinom * t0 + k;
end;
Writeln( 'ValueDerivative = ', ValueDerivative );
Readln;
{ записываем полученное значение в файл outputfile.txt }
Writeln( OutputPolinom, ValuePolinom ) ;
Writeln( OutputPolinom, ValueDerivative ) ;
{ заканчиваем работу с файлами inputfile.txt outputfile.txt }
close( InputPolinom );
close( OutputPolinom );
end.
Возможно ли вообще выполнить исходное задание с такими условиями? Т.е. коэффициенты нельзя считать в массив, степень полинома неизвестна(степень не является входным данным), а алгоритм при этом должен быть однопроходным.
Направьте в правильное русло, ибо я уже остатки мозга поломал.
Может есть какая-то модификация схемы Горнера?