END SUB
Параметр "имя процедуры" задаёт имя процедуры, которое может иметь длину до 31 символа, но не может содержаться больше ни в одном операторе SUB данной программы. "Список параметров" представляет собой список формальных параметров, разделённых запятыми, которые определяют переменные передаваемые процедуре при её вызове. (Любой процедуре может быть передано не более 16 параметров).
Обращение к процедуре осуществляется с помощью оператора CALL. Рассмотрим программу, которая определяет и вызывает процедуру ADD.
SUB ADD 9(a, b, c, d)
S= a+ b+ c+ d
Print S
END SUB
w=1: x=2: y=0: z=3
CALL ADD(w, x, y, z)
Процедуру позволяют передавать в качестве аргументов целые массивы. То, что аргумент процедуру является массивом, показывается добавлением к имени переменной круглых скобок, в которых заключена числовая константа, значение которой указывает на размерность массива, но не на его размер. Проиллюстрируем это:
SUB ANNA (A(1),N,K)
'Переменная K возвращает количество нулевых
'элементов в одномерном массиве A чисел с обычной
'точностью, который содержит N+1 элемент
K=0
for i=0 to N
if A ( i )=0 then K=K+1
NEXT i
END SUB
Наличие A(1) в списке параметров определяет первый аргумент процедуры ANNA как одномерный массив. При этом ничего не сообщается о величине этого массива. Эта задача возлагается на второй аргумент- N. Вызов процедуры ANNA осуществляется следующим образом:
N=100: DIM X(N)
CALL ANNA (X(),N,L)
PRINT L
END
Затем, это Turbo Basic осуществляет контроль числа и типов аргументов в вызовах процедур и функций в программе на соответствие их числа и типу формальных параметров в соответствующих определениях. Для правильной организации взаимосвязи основной программы с подпрограммой или процедурой важно помнить, что глобальные переменные, значения которых используются до и после вхождения в программу (процедуру), могут быть в ней изменены.
Чтобы помочь решению этой проблемы, в Turbo Basic предусмотрены "локальные" переменные для процедур, которые существуют только в той программной структуре, где они объявлены. Это является достаточно веским основанием, чтобы вообще отказаться от подпрограмм. Локальные переменные могут быть массивами; просто надо задать размерность массива после того, как его имя объявлено локальным. Например, в программе
cls
option base 1
k=5
dim X(k), y(k)
for i=1 to k
read X( i )
Y( i )= X( i )
next i
data 1, 2, 3, 4, 5
CALL Dammy (X(), k s)
print "Сумма равна"; s
print x(1); x(2); x (3); x (4); x(5)
print y(1); y(2); y (3); y(4); y(5)
end
'Процедура вычисления суммы элементов массива
SUB Dammy (X(1), k, s)
LOCAL Y( )
dim Y(k)
s=0
for m=1 to k
s= s+ X(m)
Y(m)= X(m)^2
next m
END SUB
Сумма равна 15
1 2 3 4 5
1 2 3 4 5
элементы массива Y после выполнения процедуры Dammy не изменили своего значения, так как этот массив объявлен "локальным" и является рабочим в данной процедуре.
Включение процедур в исходную программу позволяет делить её на отдельные частицы, которые могут быть сохранены и использованы с другими программами.
Процедура, как отдельная часть программы, может быть сохранена на диске в виде программного файла, к которому можно обращаться с помощью специального оператора
$ INCUDE имя файла
Каждый дисковый файл имеет имя, которое может содержать до восьми символов и расширения имени, состоящего из точки, за которой следует не более трёх символов. Например,
BAI.BAS – программный файл(программа написанная на BASIK)
OPAL.PAS – программа написанная на PASCAL
MISHEL.DAT – файл данных
Использование стандартных процедур
Для решения задач матричной алгеброй
QBASIС, не содержит библиотеки стандартных подпрограмм, для решения типовых математических задач. Однако потребность в программах, реализующих стандартные математические методы, часто возникает при решении инженерно-технических и научных проблем.
В качестве иллюстрации рассмотрим использование библиотеки стандартных процедур для решения задач матричной алгеброй.
1) Процедура GMTRA производит транспонирование матрицы A размером N´M c образованием результирующей матрицы R размером M´N.
Обращение: CALL GMTRA (A( ), n1, R(), n1, n, m)
Описание параметров
N- число строк матрицы А и столбцов матрицы R;
M- число столбцов матрицы А и строк матрицы R;
n1- число элементов в матрицах А и R(n1=N´M).
Пример пользования:
$ INCLUD "GMTRA.BAS"
option base 1
cls
n=2: m=3
dim A(n, m), R(m, n)
for i=1 to n
for j=1 to m
read A(i, j): next: next
DATA 1, 2, 3, 4, 5, 6
n1=n´m
CALL GMTRA (A( ), n1, R( ),n1, n, m)
print "Результирующая матрица"
for i=1 to m
for j=1 to n
print R(i, j);
next j
next i
end
Результирующая матрица
1 4
2 5
3 6
2) Процедура GMADD производит сложение матриц А и В размером
N´M c образованием результирующей матрицы R размера N´M
Обращение: CALL GMADD (A( ), n1, B( ), n1, R( ), n1)
где n1- число элементов матриц А, В и R (n1=N´M).
Пример использования:
$ INCLUDE "GMADD.BAS"
option base 1
cls
n=2: m=3
dim A(n, m), B(n, m), R(n, m)
for i=1 to n
for j=1 to m
read A(i, j): next: next
DATA 1, 2, 3, 4, 5, 6
for i=1 to n
for j=1 to m
read B(i, j): next: next
DATA 0, 1, 0, 1, 0, 1
n1=n*m
CALL GMADD (A( ), n1, B( ), n1, R( ), n1)
print "Сумма матриц А+В=R"
for i=1 to n
for j=1 to m
print R(i, j);
next j
end
Сумма матриц А+В=R
1 3 3
5 5 7
3) Процедура GMSUB производит вычитание двух матриц А и В размером
N´M c образованием результирующей матрицы R размером N´M.
Обращение: CALL GMSUB (A( ),n1,B( ),n1,R( ),n1)
где n1- число элементов матриц А, В и R (n1=N´M)
Пример использования:
$ INCLUDE "GMSUB.BAS"
option base 1
cls
n=2: m=3
dim A(n, m),B(n, m),R(n, m)
for i=1 to n
for j=1 to m
read A(i, j): next: next
DATA 1, 2, 3, 4, 5, 6
for i=1 to n
for j=1 to m
read B(i, j): next: next
DATA 0, 1, 0, 1, 0, 1
n1=n*m
CALL GMSUB (A( ), n1, B( ), n1, R( ), n1)
print "Разность матриц А-В=R"
for i=1 to n
for j=1 to m
print R(i, j);
next j
next i
end
Разность матриц А-В=R
1 1 3
3 5
4) Процедура PGM2 вычисляет определитель det (A) матрицы А размер
N´M
Обращение: CALL PGM (n, A(), n1, D)
Описание параметров:
А- имя вводимой матрицы;
n- число строк и столбцов матрицы;
n1- число элементов матрицы A(n1-n*n);
D- значения определителя.
Примечание. После работы процедуры массива А портится.
Пример использования:
$INCLUDE "PGM2. BAS"
option base 1
cls
n=3
dim A(n, n)
for i=1 to n
for j=1 to n
read A(i, j): next: next
DATA 3, 2, 1, 5, 3, 6, 4, 3, 6
n1=n*m
CALL PGM2 (n, A( ), n1, D)
print "Определитель матрицы А равен"; D
end
Определитель матрицы А равен –8,999999046325684
5) Процедура GMPRD производит умножение матрицы А размером N´M
на матрицу В размером M´L с получением результирующей матрицы R
размером N´L.
Обращение: CALL GMPRD (A( ), n1, B( ), n2, R( ), n3, N, M, L)
Описание параметров:
N- число строк матрицы А и R;
М- число столбцов в матрице А и строк в матрице В;
L- число столбцов матриц В и R;
n1- число элементов (N*M) матрицы А;
n2- число элементов (M*L) матрицы В;
n3- число элементов (N*L) матрицы R;
Пример пользования.
$INCLUDE "GMPRD. BAS"
option base 1
cls
n=2: m=3: l=3
dim A(n, m), B(M, l), R(n, l)
for i=1 to n
for j=1 to m
read A(i, j): next: next
DATA 3, 2, 1, 2, 1, 3,4, 3, 0
n1=n*m: n2=m*l: n3=n*l
CALL GMPRD (A( ), n1, B( ), n2, R( ), n3, n, m, 1)
print "Программирование матриц А´В"
for i=1 to n
for j=1 to l
print R (i, j);
next j
next i
end
Произведение матриц А´В
19 13 7
46 31 19
6) Процедура MINV производит обращение квадратной матрицы А
порядка N.
Обращение: CALL MINV (n, A( ), n1, D)
Описание параметров:
А- имя обращаемой матрицы;
n- порядок матрицы;
n1- число элементов матрицы А(n1=n*n)
D- определитель матрицы А.
Примечание. После работы процедуры в массиве А хранится обратная матрица.
Пример использования.
$INCLUDE "MINV. BAS"
option base 1
cls
n=3
dim A(n, n)
for i=1 to n
for j=1 to n
read A(i, j): next: next
DATA 3, 2, -1, 1, 1, 2, 2, 2, 5
n1=n*m
CALL MINV (n, A( ), n1, D)
print using "Определитель матрицы А равен #. #"; D
print "Обратная матрица"
for i=1 to n
for j=1 to n
print using "###. #", A(i, j)
next j
next i
end
Определитель матрицы А равен 1.0
Обратная матрица:
1.0 -12.0 5.0
-1.0 17.0 –7.0
0.0 –2.0 1.0
7) Процедура SIMQ реализует решение системы линейных уравнений
АХ=В.
Обращение:
CALL SIMQ (n, A( ), n1, B( ), n)
Описание параметров:
n- число уравнений;
А- матрица коэффициентов при неизвестных размера N´N.
n1- число элементов матрицы А(n1=N*N);
B - столбец свободных членов (массив размерности N).
Примечание. После выполнения процедуры массивы А и В портятся; результаты (решение системы) хранятся в массиве В.
Пример использования.
$INCLUDE "SIMQ. BAS"
cls
n=3
dim A(n, n), B(n)
for i=1 to n
for j=1 to n
read A(i, j): next: next
DATA 1, 1, 1, 1, 0, -1, 1, 2, 1
For i=1 to n
read B(i): next
DATA 6, -2, 8
N1=n*m
CALL SIMQ (n, A( ), n1, B( ), n)
print "Решение системы уравнений"
for i=1 to n
print B(i);
next i
end
Решение системы уравнений
1 2 3
Заметим, что система линейных уравнений АХ=В можно решить используя известные процедуры MINV и GMPRD:
Х=А-1В
Например решение системы уравнений
|2 –4 3| |x1| |1|
| 1 3 2 | |x2| = |4|
|3 –5 4| |x3| |1|
может быть выполнено с помощью программы
$INCLUDE "MINV. BAS"
$INCLUDE "GMPRD. BAS"
option base 1
cls
n=3: m=3: l=1
dim A(n, m), B(m, l), X(n, l)
for i=1 to n
for j=1 to n
read A(i, j): next: next
DATA 2, -4, 3, 1, 3, 2, 3, -5, 4
for i=1 to n
for j=1 to l
read B(i, j): next: next
DATA 1, 4, 1
n1=n*n: n2=m*l:n3=n*l
CALL MINV (n, A( ), n1, D)
CALL GMPRD (A( ), n1, B( ), n2, X( ), n3, n, m, l)
print"Решение системы'
for i=1 to n
for j=1 to l
print using "##. #", X(i, j)
Дата добавления: 2015-02-10; просмотров: 909;