Ответы на экзаменационные вопросы № 1-34 по дисциплине "Программирование" (Средства модульного программирования в системе Турбо-Паскаль. ООП. Объекты в динамической памяти), страница 15

cos x,              ln 5x,              x2-3x+5 для каждой из которых задан интервал [a, b] и шаг h.

Program pr_type;

type func=function(x: real): real;     {объявлен процедурный тип для функции с одним вещественным аргументом и результатом вещественного типа}

{$F+}             {директива дальнего вызова включена}

function f1(x: real): real;

begin

f1:=cos(x)

end;

function f2(x: real): real;

begin

f2:=ln(5*x)

end;

function f3(x: real): real;

begin

f3:=sqr(x)-3*x+5

end;

{$F-}              {директива дальнего вызова отключена }

{***********процедура вывода таблицы произвольной функции на заданном отрезке с заданным шагом*********************}

procedure print_table(f: func; a, b, h: real);

var       xp: real;

begin

xp:=a;

while xp<=b do

begin

writeln(xp:8:2, f(xp):8:2);

xp:=xp+h

end;

writeln

end;

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

begin

print_table(f1, -3.14, 3.14, 0.5);

print_table(f2, 0.5, 125, 0.2);

print_table(f3, -5, 5, 0.5);

end.

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

var       fn: func;          i: integer;

begin

write(‘введите номер функции   ’); readln(i);

case i of

1:         fn:=f1;

2:         fn:=f2;

3:         fn:=f3

end;

print_table(f, 1, 5, 0.5)

end.


 

Написать  подпрограмму вычисления значения определенного интеграла любой функции y=f(x) на отрезке [a, b] по формуле Ньютона: где  n=3m  - число разбиений отрезка кратное 3. x0=a,   x3m=b,             xi=x0+ih  (i=0, 1, …, 3m) yi=f(xi)   (i=0, 1, …, 3m) - значение функции в точке xi Используйте эту подпрограммe для вычисления интеграла program vich_int_newt;

type func=function(xx:real):real;

{$f+}

function f1(x:real):real;

begin

f1:=ln(2+sin(x))

end;

function f2(x:real):real;

begin

f2:=x*x;

end;

{$f-}

function Integral_Newton(a,b:real; n:integer; f:func): real;

var h,xi,yi,s1,s2,s3:real; i,m:integer;

begin

m:=n div 3;

h:=(b-a)/(3*m);

s1:=f(a)+f(b);  s2:=0;  s3:=0;

xi:=a;

for i:=1 to (3*m-1) do

begin

xi:=xi+h;

yi:=f(xi);

if i mod 3=0 then s2:=s2+yi

else s3:=s3+yi;

end;

Integral_Newton:=3/8*h*(s1+2*s2+3*s3)

end;

begin

writeln('Вычисление интеграла методом Ньютона');

writeln('интеграл функции ln(2+sinx) на интервале  ',0,'  ',Pi);

writeln('равен    ', Integral_Newton(0,Pi,150,f1):3:3);

readln

end.

9.Распределение памяти в системе Турбо-Паскаль. Динамическая память.

Постановка задачи.  

Проблема: при решении задач, в которых предполагается обработка массивов, встает вопрос об объявлении типов массива, определении переменных и выделении памяти для хранения элементов массивов. Например, объявлен тип:  

const number = 15000;  

type massiv = array[0..number] of longint;  

var chisla : massiv;  

Какие бы конкретные обработки не включались в данной задаче, пройдет все. Однако, проблемы начнутся в том случае, если потребуется обработка не 15000, а 20000 тысяч элементов типа longint. При попытке запуска данной редакции той же программы возникнет сообщение:   

«Error 22: Structure too large.»

Это значит: «Ошибка 22: Структура чересчур объемиста»  

Теперь в меню Help можно выбрать пункт Error messages, а затем выбрать пояснение о сути ошибки. Оно гласит, что максимальный размер для структурированных типов составляет 65520 байт. Что это значит? Для хранения одного элемента типа longint требуется 4 байта памяти, а для массива из 15000 элементов – 60000 байт. При этом раскладе программа работает правильно. Если же потребуется хранение 20000 элементов, то это значит и 80000 байт памяти. Таким образом, превышается максимальный объем памяти. Выход из данной ситуации, в том числе и для работы с массивами, большими 20000 элементов, в языке Паскаль возможен и представляется в виде использования динамической памяти и указателей.  

Динамическая память.