Решение задач с использованием процедур
Задание
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.
Варианты индивидуального задания «Процедуры»
Вариант 1 В подпрограмме 1: транспонировать матрицу. Логический выходной параметр равен .true., если транспонирование выполнимо (иначе .false.) В подпрограмме 2: перемножить две матрицы. Логический выходной параметр равен .true., если умножение матриц выполнимо (иначе .false.) |
В главной программе: используяподпрограммы, на примере двух матриц A и B показать, что (AB)T = ATBT. Размеры матриц (не квадратных) выберите сами. Работу подпрограммы 1 проверить, вызвав функцию Transpose, подпрограммы 2 – функциюMatmul. После обращения к каждой подпрограмме выводить сформированную матрицу или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу. |
Вариант 2 В функции: вычислить произведение ненулевых элементов одномерного массива, расположенных между максимальным и минимальным элементами. Если между максимумом и минимумом нет ненулевых элементов, результат приравнять нулю. Для проверки вывести координаты максимума и минимума в массиве. |
В главной программе: применить функцию к трем массивам разной длины, вывести результаты с именами массивов. Найти и вывести максимум среди полученных значений. |
Вариант 3 В подпрограмме: координаты седловых элементов матрицы записать в двумерный массив размером 2´N, в котором каждому элементу соответствует столбец, а N – количество седловых элементов. Седловым считать элемент матрицы, значение которого строго меньше его «соседей» по горизонтали и строго больше «соседей» по вертикали. Учесть, что количество «соседей» элемента колеблется от 2 до 4 в зависимости от его положения в матрице. |
В главной программе: воспользоваться подпрограммой для двух матриц, для каждой вывести таблицу с координатами седловых элементов и их значениями. |
Вариант 4 В функции: методом трапеций найти по таблице значений f(x) |
В главной программе: составить две таблицы значений в интервале [a, b] = [–1, 1.4] с шагом n1 = 0,2 и n2 = 0,04. Применив функцию, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции. В правильности вычислений убедиться средствами пакета Agrapher. |
Вариант 5 В подпрограмме: создать матрицу, в которой каждый отрицательный элемент исходной матрицы заменен средним арифметическим его «соседей» по горизонтали и по вертикали при условии, что все «соседи» неотрицательны. Учесть, что количество «соседей» элемента колеблется от 2 до 4 в зависимости от его положения в матрице. Как выходной аргумент создать двумерный массив, в который записать координаты замененных элементов матрицы. |
В главной программе: воспользоваться подпрограммой для двух матриц разных размеров, для каждой вывести измененную матрицу и координаты замененных элементов. |
Вариант 6 В функции: реализовать циклический сдвиг матрицы на n элементов вправо, влево, вверх или вниз в зависимости от заданного режима. Значение n может превышать протяженность матрицы по любому измерению. |
В главной программе: ввести матрицу и многократно сдвигать ее, меняя направление и величину сдвига в диалоге и используя функцию. После каждого обращения к подпрограмме выводить направление, величину сдвига и полученную в результате матрицу. Работу программы прекратить после ввода слова, отличного от слов Up, Down, Left, Right (например, Stop). |
Вариант 7 В подпрограмме: по значениям трех коэффициентов квадратного уравнения найти его корни (действительные или комплексные). Логический выходной параметр равен .true., если корни действительные (иначе .false.). |
В главной программе: используя подпрограмму, найти корни 10 уравнений, коэффициенты которых расположены в двумерном массиве размером 3´10 (каждому уравнению соответствует столбец массива). Результаты оформить в виде таблицы. |
Вариант 8 В функции: вычислить определенный интеграл как площадь под кривой по формуле трапеций , где n – количество значений функции Y в одномерном массиве, а Dx – постоянный шаг изменения аргумента. |
В главной программе: сформировать массивы значений функции y = exp(–x/5) в интервале [-2, 2]: a) с шагом Δx1 = 0.1 b) с шагом Δx2 = 0.01. Вычислить определенный интеграл для каждого из этих массивов, сравнить вычисленные значения с определенным интегралом, вычисленным по первообразной функции. |
Вариант 9 В подпрограмме: умножить матрицу на вектор. Логический выходной параметр равен .true., если умножение матрицы на вектор выполнимо (иначе .false.) |
В главной программе: на примере двух матриц A и B и вектора V показать, что (A+B)V = AV+ BV. Размеры матриц и вектора выберите сами. Работу подпрограммы проверить, вызвав функцию Matmul. После каждого обращения к подпрограмме выводить сформированный вектор или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу. |
Вариант 10 В функции: с точностью ε вычислить приближенное значение функции ex при заданных значениях x и ε. Вычисления проводить суммированием членов ряда Тейлора. |
В главной программе: значение ε ввести в диалоге и вывести в результирующий файл. Используя функцию, составить и вывести таблицу значений ex, изменяя значение аргумента от xnдо xk с шагом Δx (10 значений). Для проверки дополнить таблицу значениями ex, вычисленными по стандартной программе. |
Вариант 11 В подпрограмме: вычислить математическое ожидание и дисперсию случайной величины, значения которой находятся в одномерном массиве. Примечание: дляравномерно распределенной случайной величины математическое ожидание и дисперсия вычисляются по формулам |
В главной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать два одинаковых по длине одномерных массива X и Y, значения которых находятся в интервале [0; 10]. Используяподпрограмму, на примере этих массивов показать, что D(X+Y) = D(X) +D(Y). После каждого обращения к подпрограмме выводить результаты с пояснениями. |
Вариант 12 В функции: с точностью ε вычислить приближенное значение функции cos x при заданных значениях x и ε. Вычисления проводить суммированием членов ряда Тейлора (использовать рекуррентную формулу). |
В главной программе: Значение ε ввести в диалоге и вывести в результирующий файл. С помощью функции составить вывести таблицу значений cos x, изменяя значение аргумента от xnдо xk с шагом Δx (10 значений). Для проверки дополнить таблицу значениями cos x, вычисленными по стандартной программе. |
Вариант 13 В подпрограмме 1: вычислить скалярное (внутреннее) произведение двух векторов.Логический выходной параметр равен .true., если умножение выполнимо (иначе . false.) В подпрограмме 2: вычислить матрицу – внешнее произведение двух векторов. Логический выходной параметр равен.true., если умножение выполнимо (иначе . false.) |
В главной программе: применить подпрограммы к двум векторам. Для проверки подпрограммы 1 вызвать функцию Dot_product, подпрограммы 2 – функциюMatmul. После обращения к каждой подпрограмме выводить результат умножения или аварийное сообщение о невозможности его получения. После аварийного сообщения завершить программу. |
Вариант 14 В функции: методом прямоугольников вычислить по таблице значений f(x). |
В главной программе: составить две таблицы значений в интервале [a, b] = [–1.5, 1.5] с шагом n1 = 0,2 и n2 = 0,04. Применив функцию, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции. В правильности вычислений убедиться средствами пакета Agrapher. |
Вариант 15 В подпрограмме 1: сортировать одномерный массив по убыванию методом последовательного нахождения минимального элемента массива и перестановки его в начало массива. В подпрограмме 2: сортировать одномерный массив по убыванию методом «пузырька». В каждой подпрограмме: подсчитать количество перестановок элементов при сортировке. |
В главной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать одномерный массив, значения которого находятся в интервале [0,10]. Обратившись к подпрограммам, сортировать этот массив по убыванию. Вывести массив до и после сортировки. Сравнить полученные массивы и количества перестановок. |
Вариант 16 В функции 1: любым способом сортировать одномерный массив по убыванию. В функции 2: объединить два отсортированных по убыванию массива, не нарушив сортировки. |
В главной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать два одномерных массива разной длины, значения которых находятся в интервале [0; 100]. Обратившись к функции 1, отсортировать эти массивы по убыванию. Вывести массивы до и после сортировки. Используя функцию 2, объединить эти массивы. Вывести объединенный массив. |
Вариант 17 В подпрограмме: перемножить две матрицы. Логический выходной параметр равен .true., если умножение матриц выполнимо (иначе . false.). |
В главной программе: на примере трех матриц A, B и C показать, что (A+B)C= AC+ BC. Размеры матриц (не квадратных) выберите сами. Работу подпрограммы проверить, вызвав функцию Matmul. После обращения к каждой подпрограмме выводить сформированную матрицу или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу. |
Вариант 18 В функции: методом парабол (Симпсона) вычислить по таблице значений f(x). |
В главной программе: составить две таблицы значений в интервале [a, b] = [1.5, 2.5] с шагом n1 = 0,1 и n2 = 0,02. Применив функцию, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции. В правильности вычислений убедиться средствами пакета Agrapher. |
Вариант 19 В подпрограмме: вычислить длины сторон, периметр и площадь многоугольника по координатам его вершин. Координаты вершин многоугольника расположены в двумерном массиве, в котором каждой вершине соответствует столбец (первая строка содержит координату x, вторая – координату y). |
В главной программе: последовательно читая из файла координаты вершин треугольника, четырехугольника, пятиугольникаи применяя к ним подпрограмму, составить таблицу (длины сторон, периметр и площадь). В отчете привести графическую интерпретацию. |
Вариант 20 В функции: получить логическое значение (.true. или .false.), определяющее, расположен ли максимальный отрицательный элемент одномерного массива ранее минимального положительного элемента. Для проверки вывести координаты найденных элементов массива. |
В главной программе: применить функцию к трем массивам разной длины. В соответствии с результатами вывести сообщения, указав имена массивов. |
Вариант 21 В подпрограмме: методом касательных (Ньютона) вычислить действительный корень уравнения y = (x – 0.5)2 + 1.3e–0.15x + 1.1e–1.5x в интервале [a, b] с абсолютной погрешностью ε. Логический выходной параметр равен .true., если корень существует (иначе . false.). |
В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: дважды применить подпрограмму к каждому из найденных интервалов, приняв абсолютную погрешность равной 10-3 и 10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции. |
Вариант 22 В функции: сформировать матрицу B(m,n) в соответствии с исходной матрицей A(m,n) по правилу . |
В главной программе: прочесть из файла две матрицы разных размеров и применить к ним функцию. Вывести исходные и результирующие матрицы. |
Вариант 23 В подпрограмме: на интервале [a, b] разбить кривую линию, заданную уравнением, на n участков и вычислить ее длину на этом интервале. |
В главной программе: используя подпрограмму, вычислить длину линии, заданной уравнением на интервале [–1, 5] при n1 = 20 и при n2 = 40. Сравнить результаты. В правильности вычислений убедиться средствами пакета Agrapher, вычислив длину линии на заданном интервале по формуле . |
Вариант 24 В функции: вычислить сумму элементов диагонали, параллельной главной диагонали матрицы. Диагональ задаётся координатами ее верхнего элемента. |
В главной программе: применить функцию ко всем диагоналям, параллельным главной диагонали матрицы A(6,6), начиная с левого нижнего угла. Составить и вывести одномерный массив из полученных значений. |
Вариант 25 В подпрограмме 1: определить количество и составить массив простых чисел в интервале [1; N], используя определение простых чисел. В подпрограмме 2: определить количество и составить массив простых чисел в интервале [1; N], используя алгоритм «Решето Эратосфена». |
В главной программе: последовательно применив обе подпрограммы, найти простые числа среди первых 200 чисел натурального ряда. Сравнить результаты применения подпрограмм. |
Вариант 26 В функции: подсчитать количество отрицательных элементов внутри прямоугольного фрагмента матрицы M, диагонально противоположными вершинами которого являются элементы с индексами (i1,j1) и (i2,j2). |
В главной программе: В каждой из четырех матриц разных размеров найти максимальный и минимальный элементы и применить функцию к прямоугольнику, вершинами которого они являются. Вывести таблицу с координатами найденных вершин и количеством отрицательных элементов в прямоугольнике для каждой матрицы. В исходных данных предусмотреть различное взаимное расположение максимума и минимума для этих матриц. |
Вариант 27 В подпрограмме: методом половинного деления вычислить действительный корень уравнения y = (x – 0.6)3 – (x + 4)2 + x + 26.8 в интервале [a, b] с абсолютной погрешностью ε. Логический выходной параметр равен .true., если корень существует (иначе . false.). |
В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: дважды применить подпрограмму к каждому из найденных интервалов, приняв абсолютную погрешность равной 10-3 и 10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции. |
Вариант 28 В функции: вычислить произведение трех наименьших по модулю ненулевых элементов целочисленной матрицы. Если в матрице меньше трех ненулевых элементов, результат приравнять нулю. |
В главной программе: применить функцию к трем целочисленным матрицам, разным по размеру. Вывести соответствующие сообщения с именами массивов. |
Вариант 29 В подпрограмме: Найти координаты точек, в которых прямая, заданная уравнением kx+b, пересекает стороны треугольника; координаты вершин треугольника расположены в двумерном массиве размером 2´3 (каждой вершине соответствует столбец массива, первая строка содержит координату x, вторая – координату y). Логический выходной параметр равен .true., если прямая пересекает треугольник (иначе .false.) |
В главной программе: ввести коэффициенты уравнений пяти прямых и координаты вершин треугольника. Применив подпрограмму к каждой из прямых, составить таблицу (коэффициенты уравнений, координаты точек пересечения прямых со сторонами треугольника). В отчете привести графическую интерпретацию. |
Вариант 30 В функции: составить двумерный массив локальных минимумов матрицы (каждой вершине соответствует столбец массива, первая строка содержит координату x, вторая – координату y).. Локальным минимумом считать элемент матрицы, значение которого строго меньше его «соседей» по горизонтали и по вертикали. Учесть, что количество «соседей» элемента колеблется от 2 до 4 в зависимости от его положения в матрице. |
В главной программе: применить функцию к трем матрицам разных размеров. Вывести полученные массивы. |