Пример оформления подпрограммы-функции


Задача: написать универсальную подпрограмму-функцию, которая вычисляет модуль вектора из пространства Rn для любых значений n и любых типах переменных, используемых для описания координат вектора.

Пусть a=(a1, a2, …an) это n-мерный вектор. Eго модуль (длина) вычисляется по формуле n 0.5

|a| = ∑ ai2

i=1

Program NNN;

{ прагматика - обязательное пояснение назначения подпрограммы:

Все параметры подпрограммы - «входные», т.е. передают информацию из головной программы в подпрограмму.

Vec – массив с элементами (координатами) вектора,

N – количество элементов вектора (размерность вектора)

NmType – номер типа переменных, которые используются

для описания координаты вектора:

1- массив из чисел INTEGER,

2- массив из чисел REAL,

3- массив из чисел DOUBLE }

Function ModV(Var Vec; n, NmType: integer): double;

Var s: double; j: integer;

{поскольку в подпрограмму передается только адрес оперативной памяти, где размещаются координаты вектора Vec , а о структуре этой переменной подпрограмме ничего не известно, то для обработки этой информации необходимо предусмотреть несколько (все?) возможностей.

Вводим переменную с именем R, которая размещена в том же месте оперативной памяти, где находятся данные о координатах вектора, но структура R - известна! }

R: array[1..10000] of real Absolute Vec;

{ Аналогично описываем две вспомогательные переменные с другими структурами }

I: array[1..10000] of integer Absolute Vec;

D: array[1..10000] of double Absolute Vec;

Begin

S:=0; {чистим рабочую ячейку подпрограммы, в которой будем

накапливать сумму квадратов координат вектора}

If NmType=1 then {если в подпрограмму переданы координаты в массиве

из переменных типа Integer, то для вычислений используем

вспомогательную переменную с именем I }

for j:=1 to n do s:=s+1.0*I[j]*I[j];

If NmType=2 then {если в подпрограмму переданы координаты в

массиве из переменных типа Real, то для вычислений используем

вспомогательную переменную с именем R }

for j:=1 to n do s:=s+R[j]*R[j];

If NmType=3 then {если в подпрограмму переданы координаты в массиве

из переменных типа double, то для вычислений используем

вспомогательную переменную с именем D }

for j:=1 to n do s:=s+D[j]*D[j];

ModV:=Sqrt(s); {вносим искомый результат - длину вектора

в ячейку с именем ModV – дубляж имени подпрограммы!}

End; {оператор завершающий описание нововведенной подпрограммы-функции}

{Описание (отведение места в памяти) переменных головной программы:

Var V: array[1..3] of real;

b: array[1..2] of integer;

J: integer;

P: real;

BEGIN {обрабатывается трехмерный вектор V,

координаты которого описаны переменными типа REAL}

For i:=1 to 3 do {заполнение координат вектора случайными числами и печать их}

begin V[i]:=random; writeln(V[i]:10:5); end;

{в переменной Р помещается удвоенное значение длины вектора V }

P:=2.0*ModV(V, 3, 2);

<семантика: Вычислить функцию ModV для фактических, т.е. действительно существующих в оперативной памяти, параметров-аргументов: V, 3, 2. Вычисленное значение функции умножить на два, результат поместить в переменную P >

Write(‘удвоенная длина вектора V=’, p:10:5);

{обрабатывается двухмерный вектор b с координатами типа INTEGER}

For i:=1 to 2 do {заполнение координат вектора случайными числами и печать их}

begin b[i]:=random(2000); writeln(b[i]:5) end;

{вычисляем и печатаем длину вектора b}

Write(‘длина вектора B=’, ModV(b, 2, 1):10:5);

END.



Дата добавления: 2021-12-14; просмотров: 289;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.011 сек.