Решение задач с использованием процедур Задание
1. В соответствии с индивидуальным заданием составить блок-схему и текст процедуры (функции или подпрограммы).
2. Написать главную программу, которая должна содержать:
a) интерфейс с правилами применения каждой процедуры;
b) ввод данных из файла In.txt на диске и форматный вывод их в результирующий файл Out.txt;
c) вызовы процедур с различными данными;
d) форматный вывод в файл Out.txt результатов работы каждой процедуры, пояснив их формулировками из индивидуального задания;
e) если возможно, выполнить проверку результатов работы процедур обращением к стандартным подпрограммам или функциям;
f) обработку результатов процедур в соответствии с индивидуальным заданием на главную программу и форматный вывод в файл Out.txt результатов с пояснениями.
Содержание отчета
1. Название работы и номер варианта индивидуального задания.
2. Фамилия, имя, отчество и номер группы студента.
3. Текст варианта индивидуального задания.
4. Постановка задачи, методы вычислений.
5. Графическая интерпретация (если требуется), выполненная вручную или в пакете Agrapher.
6. Блок-схемы главной программы и процедур.
7. Распечатка текста программы.
8. Распечатка файла результатов Out.txt.
При подготовке к защите ответить на контрольные вопросы.
Справочная информация
Таблица 12.
Функции для определения размеров массивов (Array – массив).
Функция
| Результат функции
| Примечания
| Size(Array)
| Целое число, количество элементов массива Array.
| Рекомендуется для определения длины одномерного массива.
| Size(Array,dim)
| Целое число - протяженность вдоль заданного измерения.
| При dim = 1 - количество столбцов двумерного массива, при dim = 2 – количество строк.
| Shape(Array)
| Целочисленный одномерный массив из протяженностей по каждому измерению массива.
| Размер результирующего массива равен количеству измерений массива Array (для двумерного массива – 2)
|
Таблица 13.
Некоторые полезные встроенные функции:
Функция
| Аргументы
| Результат
| Произведение матриц
MC = Matmul(MA,MB)
| MA – матрица M ´ N
MB – матрица N ´ P
| MC – матрица M ´ P
| Умножение матрицы на вектор
V2 = Matmul(MA,V1)
| MA – матрица M ´ N
V1 – вектор N элементов
| V2 – вектор из M элементов
| Транспонирование матрицы
MB=Transpose(MA)
| MA – матрица M ´ N
| MB – матрица N ´ M
| Cкалярное произведение векторов
S=Dot_product(V1,V2)
| V1, V2 – векторы одинаковой длины
| S – число (скаляр)
| Генератор случайных чисел
Call Random_number(M1)
| Выходной аргумент M1 – вещественная переменная или массив – псевдослучайные числа из [0; 1]
|
Комментарии к заданию
1. В составе данного проекта независимые программные единицы – главная программа и процедуры, каждая с собственной системой обозначений объектов.
2. Правила применения каждой процедуры должны быть описаны в вызывающей программе в операторе Interface.
3. Данные передаются сопоставлением аргументов – фактических в главной программе и формальных в процедуре.
4. Функция – это процедура, вызываемая из выражения по имени.
5. Аргументы функции по назначению – только входные, единственный результат связан с именем функции.
6. Результаты подпрограммы передаются в вызывающую программу через выходные аргументы (атрибут Intent(Out)) и не связан с именем подпрограммы. Количество выходных аргументов может быть любым, в том числе один или ни одного.
7. Количество фактических и формальных аргументов должно совпадать. Кроме того, попарно в порядке следования фактические и формальные аргументы должны соответствовать по типу, назначению и форме. Совпадение имен фактических и формальных аргументов не требуется, но и не запрещается.
8. Атрибут назначения каждого формального аргумента должен быть описан операторомIntent.
Пример 1 (функция)
В функции: вычислить среднее арифметическое значение N последних элементов одномерного вещественного массива.
В главной программе: вызвав функцию, вычислить среднее значение 5 последних элементов вещественного массива из 10 элементов.
Программа 1
Real Function Primer(Array,N)
Integer, Intent(In) :: N
Real, Intent(In), Dimension(1:N):: Array
Integer Len ! локальная переменная
Len = Size(Array)
... ! операторы, реализующие алгоритм функции
If(N>0)Primer=sum(Array)/N ! результирующее значение
End Function Primer
Program Main ! Главная программа – Interface и вызов функции
Implicit None
Interface
Real Function Primer(Array, N)
Integer,Intent(In) :: N
Real,Intent(In),Dimension(:) :: Array
End Function Primer
End Interface
Real Result
Real Dimension(1:10) :: Mas
... ! ввод и вывод исходных данных
Result=Primer(Mas(6:10),5) ! вызов: Mas,5-фактические аргументы
... ! вывод результатов
End Program Main
Результаты работы программы 1 в файле Out.txt
Исходный массив
2.75 -12.88 0.12 -0.09 99.55
33.77 1.11 -4.66 3.00 2.99
Среднее арифметическое 5 последних элементов
5.923
Пример 2 (подпрограмма)
В подпрограмме: найти номер и значение максимального по модулю элемента одномерного массива.
В главной программе: Используя подпрограмму, найти номера и значения максимальных по модулю элементов для нескольких массивов разной длины.
Программа 2
Далее приведена подпрограмма и главная программа, в составе которой показаны интерфейс и вызовы подпрограммы.
Subroutine MaxAbs(Array, eLem, Num)
Implicit none
Real,intent(in),dimension(:)::Array ! входной массив
Real,intent(out)::eLem ! выходной: max по модулю элемент
Integer,intent(out)::Num ! выходной: номер max по модулю
Integer Len ! локальная переменная
Len = Size(Array)
... ! операторы, реализующие алгоритм подпрограммы
eLem = ... ! результирующее значение
Num = ... ! результирующее значение
End Subroutine MaxAbs
Program Sub1 ! ФИО Лаб 6 Группа. Вар.
Implicit none
Interface ! шаблон вызываемой подпрограммы
Subroutine MaxAbs(Array, eLem, Num)
Implicit none
Real,intent(in),dimension(:)::Array ! входной массив
Real,intent(out)::eLem! выходной: max по модулю элемент
Integer,intent(out)::Num ! выходной: номер max по модулю
End Subroutine MaxAbs
End Interface
Real,dimension(1:12)::B
Real,dimension(1:10)::C
Real MaxB, MaxC ! max по модулю элементы для В,C
Integer NumB, NumC ! и их порядковые номера в массивах
... ! ввод и вывод в результирующий файл массива B
Call MaxAbs(B, MaxB, NumB)
... ! вывод в результирующий файл NumB, MaxB
... ! ввод и вывод в результирующий файл массива C
Call MaxAbs(C, MaxC, NumC)
... ! вывод в результирующий файл NumC, MaxC
End Program Sub1
Результаты работы программы Sub1
Массив В
1.0 -4.0 6.0 20.0 45.0 -71.0
4.0 -17.0 .0 .0 .0 11.0
max по модулю элемент -71.0 его номер 6 в массиве B
Массив С
-122.0 .0 45.0 71.0 4.0 -17.0
.0 .0 .0 11.0
max по модулю элемент -122.0 его номер 1 в массиве C
Контрольные вопросы
1. Назовите четыре вида программных единиц в Фортране.
2. Что такое процедура? Когда целесообразно использование процедур? Сколько разновидностей процедур в Фортане?
3. Каковы основные атрибуты функции?
4. Как результат функции передается в вызывающую программу?
5. Что в программировании называют подпрограммой? Сколько разновидностей подпрограмм в Фортане?
6. Зачем подпрограмме имя? Есть ли значение, связанное с именем подпрограммы? Как передаются результаты подпрограммы в вызывающую программу?
7. Что такое формальные и фактические аргументы? Правила согласования формальных и фактических аргументов, поясните примерами.
8. Какими по назначению могут быть формальные аргументы процедуры? Приведите примеры описания назначения формальных аргументов.
9. Где и для чего пишут интерфейсы?
10. Чем процедура отличается от функции? Сравните на примере, оформив как функцию и как подпрограмму вычисление количества повторений цикла.
Примеры задач контрольного задания
1. В функции: вычислить среднее геометрическое положительных элементов одномерного массива. Если в массиве нет положительных элементов, результат приравнять нулю. В главной программе применить функцию к трем массивам разной длины. Вывести результаты с именами массивов. Найти и вывести минимум среди полученных значений, не равных нулю.
Блок-схема функции обязательна.
2. В подпрограмме: вычислить сумму элементов, расположенных ниже, выше и на главной диагонали квадратной вещественной матрицы. В главной программе: применить подпрограмму к матрице размером 8´8. Вывести три значащих цифры результатов.
Блок-схема подпрограммы обязательна.
3. В вещественном массиве обнулить элементы, синус которых превышает 0.5 (оператор where). Как получить тот же результат без использования оператора where?
4. Исправьте ошибку
Integer i
Real, dimension(7,4):: А
write(*,10) ’Массив’,(A(i,:), i=1,4)
10 Format(a/(4F10.2))
Таблица 14.
Варианты индивидуального задания «Процедуры»
|