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

print

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

print

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

print

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

print "Обратная матрица"

for i=1 to n

for j=1 to n

print using "###. #", A(i, j)

next j

print

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; просмотров: 853;


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

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.051 сек.