01 (537404), страница 10
Текст из файла (страница 10)
18. Построчно заполнить массив А (66 элементов) ниже побочной диагонали значениями, элементов массива R из 15-ти элементов.
19. Определить минимальные нечетные значения в строках целочисленного массива X (45 элементов) и записать их в одномерный массив Z.
20. Разместить одномерный массив R из 12-ти элементов в двумерном массиве G (43 элементов) по строкам, считывая элементы массива R в обратным порядке.
21. Определить суммы и произведения элементов главной и побочной диагоналей матрицы {aij} (i,j=1,4) и записать результат в одномерный массив B из 4-х элементов.
22. Вычислить средние арифметические значения элементов строк массива D (44 элементов) и записать их в одномерный массив T.
23. Определить средние геометрические значения элементов столбцов массива Z(44 элементов) и записать их в одномерный массив X.
24. Составить программу умножения матрицы {aij} (i,j=1,4) на вектор {xi} (i=1,4).
25. Составить программу разложения матрицы {aij} (i,j=1,3) на симметричную и кососимметричную составляющие.
26. Заполнить одномерный массив D из 10-ти элементов значениями элементов верхнего треугольника матрицы {aij} (i,j=1,4), для которых выполняется условие .
27. Дана квадратная матрица А пятого порядка. Вычислить диагональные элементы матрицы В, равной А2, и записать их в одномерный массив.
28. Переписать элементы матрицы {aij} (i,j=1,4), расположенные в шахматном порядке, начиная с а11, в одномерный массив В из 8-ми элементов.
29. Вычислить произведение матрицы А четвертого порядка на ее транспонированную матрицу и поместить элементы побочной диагонали в одномерный массив В.
30. Проверить наличие в двумерном массиве T (43 элементов) значений, указанных в одномерном массиве R из 3-х элементов. Найденные значения вывести на печать.
Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 7
ПОДПРОГРАММЫ
С п р а в о ч н а я и н ф о р м а ц и я
Все рассмотренные до настоящего момента программы были организованы в виде единой программы, структура которой отражала алгоритм решения задачи. Однако, на Фортране программа может состоять из одной или нескольких программных единиц, под которыми понимают совокупность команд, задающих необходимые действия над данными для получения требуемого результата. Это обусловлено тем, что программы часто могут иметь многократно повторяющиеся последовательности команд, используемые для обработки различных данных. Поэтому составление программы существенно упрощается, если такие блоки команд оформляются как независимые программные единицы и к ним обращаются требуемое количество раз с разными данными. При этом программа, реализующая общий алгоритм решения задачи, называется главной, а выделенные независимые программные единицы – подпрограммами.
Для выделения многократно используемых блоков команд в Фортране предусматриваются оператор-функция, подпрограмма-функция и подпрограмма общего вида. Для выбора между ними следует придерживаться следующих рекомендаций:
-
если многократно повторяющиеся вычисления описываются одним арифметическим выражением, то используется оператор-функция, в противном случае – одна из подпрограмм;
-
если результатом повторяющихся вычислений является одно единственное значение, то используется подпрограмма-функция, в остальных случаях - подпрограмма общего вида.
***Замечание. Программные единицы любого типа не должны обращаться сами к себе прямо или косвенно.
Оператор-функция – это определение некоторой математической функции, часто используемой в данной программной единице. Он предназначен для использования только в той программной единице, где описан. Определение оператора-функции задается в виде:
имя ([параметр_1 [, параметр_2]...]) = выражение,
где имя | – имя оператора-функции; |
параметр_i | – формальные параметры (i=1, 2, ...); |
выражение | – арифметическое выражение, содержащее описание математической функции через формальные параметры. |
Результат вычисления оператора-функции передается через его имя, поэтому оно должно иметь тип, который определяется по правилам объявления типа для переменных. Имя оператора-функции нельзя использовать для описания других объектов в данной программной единице.
Под формальными параметрами понимают имена фиктивных переменных, которым в памяти ЭВМ не отводится место. Они используются лишь для записи часто встречающейся математической функции в виде арифметического выражения. Формальные параметры должны следовать за именем оператора-функции, разделяться запятыми и подчиняться следующим требованиям:
-
не допускается повторение имен формальных параметров;
-
в качестве формального параметра нельзя использовать переменную с индексом (элемент массива);
-
одни и те же имена формальных параметров могут быть использованы в описаниях нескольких операторов-функций.
Все определения операторов-функций в данной программной единице должны предшествовать выполняемым операторам.
Обращение к оператору-функции выполняется путем указания его имени непосредственно в арифметическом выражении, как к библиотечным функциям. При этом в скобках после имени оператора-функции указываются так называемые фактические параметры – имена переменных, константы или арифметические выражения, для значений которых должна быть рассчитана функция. В данном случае важно совпадение количества, типов и порядка следования формальных и подставляемых на их место фактических параметров.
Выполнение оператора-функции можно описать следующей последовательностью действий:
-
вычисляются выражения, используемые в качестве фактических параметров;
-
их значения приводятся в соответствие со списком формальных параметров и используются для вычисления указанного арифметического выражения;
-
тип результата вычисления арифметического выражения определяется по общим правилам, а затем преобразуется к типу, соответствующему имени оператора-функции;
-
результат возвращается в выражение программной единицы, вызвавшее оператор-функцию.
Работу с оператором-функцией можно продемонстрировать на следующем примере: написать программу, позволяющую вычислить и распечатать таблицы значений функций:
на отрезке [0, 5] с шагом 0,5 при a = 2, b = -8 и c = 3.
Программа, реализующая расчет указанной таблицы, имеет вид:
123456789.............................................................72 73.......80
Par(A, B, C, X) = A*X*X + B*X + C
Open(1, File = 'prog.res')
Do 2 X = 0., 5.25, 0.5
Y1 = Par(2.0, -8.0, 3.0, X**2)
Y2 = Par(2.0, -8.0, 3.0, X/2.)
Y3 = Par(2.0, -8.0, 3.0, X-1.)
2 Write(1, 1) X, Y1, Y2, Y3
1 Format(' X = ', F3.1, ' Y1 = ', F7.2, ' Y2 = ', F5.2, ' Y3 = ', F5.2)
Close(1)
End
Подпрограмма-функция по своему применению похожа на оператор-функцию, так как используется для вычисления единственного значения и вызывается непосредственно в арифметическом выражении прямым указанием своего имени. Отличия подпрограммы-функции от оператора-функции состоят в том, что она является отдельной программной единицей и для вычисления требуемой величины позволяет использовать более одного оператора. Первым оператором подпрограммы-функции должен быть оператор Function, который определяет ее имя и список формальных параметров:
[тип] Function имя [*длина] ([параметр_1 [, параметр_2]...])
где тип | – необязательный параметр, указывающий тип возвращаемого результата (Real, Integer); |
имя | – имя подпрограммы-функции; |
длина | – объем памяти в байтах, выделяемый для записи результата. Объявляется только совместно с параметром тип; |
парметр_i | – формальные параметры (i=1, 2, ...). |
Тип результата, возвращаемого подпрограммой-функцией, определяется типом (явно или по умолчанию) имени функции. Например:
Function Prog(A, B) | – возвращает вещественный результат длиной в четыре байта; |
Integer Function Prog(A, B) | – возвращает целый результат длиной в четыре байта; |
Real Function Prog*8(A, B) | – возвращает вещественный результат длиной в восемь байт. |
Формальные параметры в подпрограмме могут отсутствовать, но наличие скобок в ее описании обязательно. В качестве формальных параметров могут использоваться имена переменных, массивов и внешних подпрограмм. Если в качестве формального параметра использован массив, то он должен быть описан с использованием в качестве индексов других формальных параметров.
Подпрограмма-функция должна иметь следующую структуру:
-
оператор Function;
-
группа операторов, реализующая вычислительный алгоритм;
-
оператор присваивания, в котором имени подпрограммы-функции передается значение результата вычислений;
-
оператор Return;
-
оператор End.
Например:
123456789.............................................................72 73.......80
Function Prog(A, B, C, N)
...............
Prog = Result
Return
End
Оператор End указывает на конец текста подпрограммы-функции и может быть использован в ней только один раз. Оператор Return означает логическое завершение вычислений в подпрограмме и возврат полученного значения и управления вызвавшей ее программной единице. Оператор Return может употребляться в подпрограмме несколько раз.
Обращение к подпрограмме-функции выполняется путем указания ее имени непосредственно в арифметическом выражении. При этом в скобках после имени оператора-функции указываются ее фактические параметры. В качестве фактических параметров могут использоваться выражения, имена массивов и других подпрограмм. Количество, тип и порядок следования формальных и фактических параметров должны совпадать. Фактический параметр, являющийся именем подпрограммы, должен быть описан в программной единице, вызывающей подпрограмму-функцию. Для его описания используется оператор External в форме:
External имя_подпрограммы [, ...].
Например:
123456789.............................................................72 73.......80
External Fir
An = Prog(X, A, Fir)
..........
End
Function Prog(A, B, F)
..........
Return
End
Работу с подпрограммой-функцией иллюстрирует следующий пример: написать программу для вычисления максимальных значений элементов квадратных матриц A, B и C, имеющих порядки 4, 7 и 3, соответственно. Программа будет иметь вид:
123456789.............................................................72 73.......80
Dimension A(4, 4), B(7, 7), C(3, 3)
Real Max_1, Max_2, Max_3
Open(1, File = 'prog.dat')
Open(2, File = 'prog.res')
Read(1, 1) ((A(i, j), j = 1, 4), i = 1, 4)
1 Format(9X, 4F6.2)
Read(1, 2) ((B(i, j), j = 1, 7), i = 1, 7)
2 Format(7F6.2)
Read(1, 3) ((C(i, j), j = 1, 3), i = 1, 3)
3 Format(12X, 3F6.2)
Max_1 = Poisk(4, A)
Max_2 = Poisk(7, B)
Max_3 = Poisk(3, C)