МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ, МЕХАНИКИ И ОПТИКИ
В.Ф. Звягин, Н.А. Яньшина, В.Н. Голыничев Практикум по современному Фортрану в курсе Информатики Учебное пособие
Санкт-Петербург 2010
3 Оглавление Введение ......................................................................................................... 4 1. Лабораторные работы ............................................................................... 5 1.1. Вычисления по формулам ................................................................. 5 1.2. Вычисление логических выражений .............................................. 16 1.3. Построение графиков функций ...................................................... 23 1.4. Попадание точки в заданную область плоскости ......................... 32 1.5. Приближенное вычисление функции – сумма степенного ряда . 39 1.6. Решение задач с одномерными массивами ................................... 50 1.7. Решение задач с двумерными массивами ...................................... 58 1.8. Решение задач с использованием функций ................................... 71 1.9. Решение задач с использованием подпрограмм ........................... 81 1.10. Механизмы присоединения данных............................................. 93 2. Элементы языка программирования Фортран ..................................... 98 2.1. Текст программы на Фортране ....................................................... 98 2.2. Синтаксис языка Фортран, выражения .......................................... 98 2.3. Оператор присваивания ................................................................. 103 2.4. Ветвления и циклы ......................................................................... 103 3. Ввод и вывод в Фортране ..................................................................... 107 3.1. Бесформатный ввод/вывод ............................................................ 108 3.2. Форматный вывод .......................................................................... 108 4. Вычисления с массивами. .................................................................... 111 4.1. Характеристики массива ............................................................... 111 4.2. Размещение массива в памяти компьютера ................................ 112 4.3. Секции массивов и неявный Do в списках ввода/вывода .......... 114 5. Программы, модули и механизмы обмена данными ......................... 114 5.1. Двухуровневая структура программ ............................................ 115 5.2. Трёхуровневая структура модуля ................................................. 116 5.3. Вызов процедур и использование модулей ................................. 117 5.4. Обмен данными в проекте............................................................. 119 6. Встроенные функции Фортрана .......................................................... 121 6.1. Числовые функции ......................................................................... 121 6.2. Функции редукции массивов ........................................................ 122 6.3. Линейная алгебра и генератор случайных чисел........................ 127 6.4. Функции для определения размеров массивов ........................... 127 7. Справочные материалы ........................................................................ 128 7.1. Инструкция для работающих в DevStudio................................... 128 7.2. Пакет Agrapher для построения графиков ................................... 130 7.3. Уравнения ....................................................................................... 131 7.4. Вычисление средних значений ..................................................... 132 7.5. Перевод ключевых слов, операторов и терминов Фортрана ..... 133 8. Литература ............................................................................................. 134 Практикум по современному Фортрану
4
Введение Традиционный подход к решению задач на компьютере: используя библиотечные процедуры, составить алгоритм, продумать ввод и вывод, написать программу, скомпилировать, собрать, отладить, выполнить и получить результаты. Программирование задач на Фортране в среде Windows – предмет обучения в курсе Информатики. Название языка Fortran произошло от Formula Translator – переводчик формул. В истории программирования Фортран – живой классический язык. Не одно поколение программистов выросло на Фортране, и если кому-то кажется, что Фортран из прошлого, то его новейшие возможности, например, для суперкомпьютеров – как раз из будущего. Фортран критиковали за «примитивность», но именно простота помогает ему жить и развиваться, сохраняя преемственность и проходя стандартизацию: − 1954, Фортран – первый язык программирования, Джон Бэкус, IBM; − Ф66 первый стандарт языка – универсальность и преемственность; − Ф77 ввёл в обиход структурное программирование; − современный Фортран Ф90, Ф95 стал вехой в развитии языка: − массивы – описание, функции редукции, конструкторы, секции, конформность массивов, выражений, ветвлений, циклов; − указатели, рекурсивные процедуры; − модульное программирование, механизмы передачи данных; − Ф03, Ф08 – объектно-ориентированное программирование. ФXX – это Фортран по годам, живой классический язык программирования, стабильный, развивающийся, нацеленный в будущее, только в нём: − история насчитывает 56 лет, чего попросту нет у других языков; − автоматизировано построение параллельных приложений; − сочетается строгая классика в изучении основ программирования и конструирование сверхсложных проектов при помощи модулей; − действия над векторами и матрицами наравне со скалярами, работа с комплексными числами наравне с вещественными; − накоплены численные библиотеки (IMSL, NAG, LAPACK, BLAS, Intel MKL), с высокопроизводительными вычислениями (MPI, PVM), с графическими интерфейсами (Quickwin, FORTRAN/TK). Наиболее популярные компиляторы Фортрана: по стандарту Ф95, Ф03 – Intel fortran compiler 9,10,11 для многоядерных компьютеров и суперкомпьютеров, свободно распространяемый для Linux; по стандарту Ф90-Ф95 – Fortran Power Station 4.0 и 5, 6 фирмы Compaq. Информация о Фортране размещена в Интернете: www.npac.syr.edu , netlib.org – набор библиотек, www.j3 – fortran.org – стандарт языка, наш сайт – http://twcad.ifmo.ru, http://parallel.ru/tech/tech_dev/newfortran.html , free compilers –http://www.thefreecountry.com/compilers/fortran.shtml.
Практикум по современному Фортрану
5
1. Лабораторные работы 1.1. Вычисления по формулам Задание Составить программу, которая: 1. вычисляет значения двух эквивалентных пар числовых формул y1 ∼ y2 и z1 ∼ z2, с указанными в варианте индивидуального задания значениями исходных данных. 2. выводит в файл out.txt исходные данные и результаты вычислений. Примечания: a) две числовых формулы эквивалентны, если для всех возможных значений переменных их математические значения равны; b) программируя, нельзя заменять формулы индивидуального задания (кроме sec x) эквивалентными значениями, но рекомендуется вводить вспомогательные (промежуточные) переменные. Содержание отчета 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Текст задания, формулы в том виде, как они приведены в варианте индивидуального задания. 4. Области допустимых значений (ОДЗ) переменных для y1, y2. 5. Математическая запись формул вычисления промежуточных переменных (если они используются в программе). 6. Распечатки текста программы и результатов работы программы с тремя комплектами исходных данных. При подготовке к защите ответить на контрольные вопросы. Справочная информация 1. Порядок выполнения операций в соответствии их старшинством (приоритетом) показан в таблице. Операции
Знаки операций
Старшинство
Вычисление функций
Ссылки на функции
1
Возведение в степень
**
2
Умножение, деление
*, /
3
Сложение, вычитание
+, –
4
Примечание: Для изменения порядка выполнения операций используются скобки (только круглые).
Практикум по современному Фортрану
6 2. Реализация некоторых математических выражений средствами Фортрана показана в таблице. В формуле
В Фортране
В формуле
В Фортране
tg х
Tan(x)
2
Sqrt(2.)
Cos(x)
ctg х
Cotan(x)
x
Sqrt(x)
1/Сos(х)
arcsin x
Аsin(x)
В Фортране
В формуле
sin х
Sin(x)
cos х sec х
n
│b│
Abs(b)
π
2*Аsin(1.)
x
при х>0 x**(1./n) при х<0 и n нечетн. -(-x)**(1./n)
Примечание: х – вещественный аргумент тригонометрических функций и функции Sqrt(x). 3. Тип результата числовой операции (целочисленный или вещественный) выбирается автоматически по типу операндов (существенно понимание этого механизма для операции деления): a) если операнды целые, в результате целочисленной операции получается целое число (например, 7/4 => 1); b) если операнды вещественные,в результате получается вещественное число (например, 7./4. => 1.75); c) если операнды разных типов (например, целого и вещественного), перед выполнением операции они приводятся к типу, имеющему наибольший диапазон значений (в примере 7./4 => 7./4. – к вещественному); затем выполняется операция для этого типа с соответствующим результатом: (7./4 => 7./4. => 1.75). b 4. Возведение в степень a выполняется следующим образом: a) возведение в целую степень b выполняется путем b-кратного умножения основания a; b) возведение в вещественную степень b выполняется по формуле
e b⋅ln a . Внимание! Отрицательные и нулевые значения нельзя возводить в вещественную степень. Комментарии к заданию 1. Имена переменных предпочтительно выбирать со смыслом (например, длина окружности С=2πR : Circle=2*Pi*Radius). 2. Громоздкие формулы рекомендуется упрощать, вводя промежуточные переменные для частей формулы: повторяющиеся части формулы, числители и знаменатели дробей и так далее.
Практикум по современному Фортрану
7 3. Поиск ошибок облегчится, если по выражению, написанному в программе, восстановить исходную формулу. Типичные ошибки Формула –Y
X
В программе Правильно x**(-y)
Неправильно
Пояснения
x**-y
Синтаксическая ошибка. Знаки операции записывать подряд не разрешается. Синтаксическая ошибка. В неправильной записи cos воспринимается компилятором как переменная, а не функция. В правильной записи после имени функции – аргумент в скобках, а не операция. Сначала вычисляется функция, затем результат возводится в степень.
cos2x
cos(x)**2
cos**2(x)
2x+b
2*x+b
2x+b
Синтаксическая ошибка. Знак операции опускать нельзя.
a bc
a/(b*c)
a/bc
В неправильной записи из-за пропущенного знака умножения вместо переменных b и c используется переменная bc
cos x2
cos(x**2)
cos(x)**2
В неправильной записи порядок операций соответствует формуле cos2x.
а/((b+c)*d)
а/(b+c)*d
В неправильной записи порядок операций соответствует формуле a ⋅d b+c
X**(2*y)
x**2*y
В неправильной записи порядок операций соответствует формуле X2Y.
4./7.
4/7
В неправильной записи операнды – целые числа, результат – целая часть частного, для 4/7 это 0. Для получения вещественного результата (в примере 0.5714…) хотя бы один из операндов должен быть вещественным.
x**(1./3.) при x>0
x**(1/3)
В неправильной записи результат деления 1/3 равен 0 и общий ответ X0=1.
a (b + c )d
2Y
X
Дробь 4 7
3
x
Практикум по современному Фортрану
8 Формула
3
3
В программе Правильно x**(1./3.) при x>0
x
− 27
Пояснения
Неправильно
В неправильной записи порядок операций соответствует формуле
x**1./3.
x1 . 3
-27**(1./3.) (-27)**(1./3.)
В неправильной записи в вещественную степень возводится отрицательное число.
Пример Исходное значение аргумента: x=3.3 x 2 + 2 x − 3 + ( x + 1) x 2 − 9 y1 = ; y2 = x 2 − 2 x − 3 + ( x − 1) x 2 − 9
x+3 x−3
Область допустимых значений (ОДЗ) x>3 Промежуточные переменные Повторяющаяся часть формулы: s1 = x 2 − 9 yd = x 2 − 2 x − 3 + ( x − 1) * s1 Знаменатель формулы y1: Программа Program Formula ! вычисления по формулам ! студент (фамилия, имя) группа № работа № вариант № Implicit None ! отменяет умолчание при определении типа переменных ! все переменные должны быть объявлены Real :: x=3.3 ! инициализация переменной x (дано в задании для отладки) Real y1, y2, YD, s1 ! потом z1,z2-объявить здесь же !------------- далее – исполняемые операторы программы Open(6,file=’result.txt’)! если закомментировать «open», то ! вывод – на экран (по умолчанию устройство №6 – экран монитора) ! диалог для ввода данных: пригласить к вводу Write(*,*)’х=?’ и читать Read(*,*) x Write(6,*) ’При х=’,x s1 = Sqrt(x**2-9) ! повторяющаяся часть формулы yd = x**2 - 2*x - 3 + (x-1)*s1 ! знаменатель y1 y1 = (x**2 + 2*x - 3 + (x+1)*s1) / yd; y2 = Sqrt(x+3) / Sqrt(x-3); Write(6,*) ’y1=’, y1, ’y2=’, y2 Write(6,*) ’|y2-y1|=’, Abs(y2-y1)!в y1 и y2 совпали 6 – 7 значащих цифр !------------- далее – добавить вычисление z1,z2 End Program Formula
Практикум по современному Фортрану
9 Последовательность работы над программой 1. Отладить программу с исходными данными, указанными в задании. Отладка считается завершенной, если значения y1 и y2 и значения z1 и z2 попарно совпадают с точностью 6 – 7 значащих цифр. 2. Определить область допустимых значений (ОДЗ) исходных данных. 3. Организовать диалог для ввода исходных данных. Для этого нужно добавить в программу: a) приглашение к вводу данных: оператор Write(*,*) с указанием имен данных и ОДЗ; b) ввод данных с консоли: оператор Read(*,*)<список имен вводимых переменных >). Получить результирующие значения y1 и y2, z1 и z2 4. Для обработки трех комплектов данных следует подготовить файл In.txt с тремя комплектами данных в соответствии с ОДЗ. Изменить программу так, чтобы она получала данные автоматически из файла (диалог закомментировать): a) открыть файл In.txt для чтения данных (оператор Open); b) используя цикл, получить три комплекта результатов do k=1,3 − ввести один комплект данных из файла In.txt; − вычислить y1 и y2, z1 и z2; − вывести результаты с указанием имен переменных; enddo Контрольные вопросы к защите работы 1. Что называется программой на алгоритмическом языке? а) файл на диске; б) файл, внутри которого есть слово program; в) дайте свой вариант ответа. Примечание. Вы просматриваете на экране текстовый файл. Можете ли Вы утверждать, что это файл с программой? 2. Вы работаете с интегрированной средой IDE. Что должно обязательно присутствовать в имени файла с программой на Фортране 90: а) хотя бы одна буква; б) слово fortran; в) свой вариант ответа – приведите примеры имен файлов с программами на Фортране 90. 3. Как записать комментарий в программе? а) начать его с красной строки; б) начать его с «//» ; в) дайте свой вариант ответа. Приведите примеры комментариев. 4. Какие числовые типы данных используют в Фортране? Приведите примеры числовых констант.
Практикум по современному Фортрану
10 5. Можно ли вещественную константу 6420 записать на Фортране без десятичной точки? Если можно, то как это сделать? 6. Как записать на Фортране комплексное число 19+4i ? 7. Какие имена переменных в программе записаны верно, а какие нет? а) F1 б) Y(X) в) X_1 г) Б5 д) Z.8 е) 3J ж) β4 8. Как правильно вызвать функцию sinx ? а) sinX б) sinx в) sin(x) 9. Определите значение переменной M в результате вычисления: integer:: N=1 integer:: M M = 1/((2*N+1)*(2*N+2))
10. В каком порядке выполняются операции в числовом выражении? а) со скобками; б) без скобок. Разъясните оба случая. 11. Определите значение переменной В в результате вычисления: real:: А=2.0 real:: B B = -A**2
12. Исправьте ошибки: 4 записан как sqrt(4); a) b) комплексный корень − 4 c) комплексный корень − 4 d) комплексный корень − 4 e) вещественный корень 4
записан как sqrt(-4); записан как sqrt(-4.0); записан как sqrt(-4,0); записан как sqrt(4,0).
13. Почему на Фортране нельзя возводить отрицательное число в вещественную степень? 14. Записать в Фортране известные величины: дюжина, число π, число e, скорость света c = 3.108 а) в виде констант; б) как значения, точные для компьютера. 15. Определите значения переменных В и C в результате вычисления: real:: А=2.0 real:: B, C B = 1/2*A;
16. Как формулу
3
C = 1/(2*A)
− 1 / 8 записать в Фортране?
Указание. Правильность ответов на вопросы: (9), (11), (15), (16) проверьте на компьютере. Пример контрольного задания 1. Расположите константы в порядке возрастания (представить в одинаковой форме): 24.0; 2.4Е+2; 0.24Е-3 . 2. b - вещественная переменная, равная 4.0. Что получим в результате вычисления: 1/2*b; 1/(2*b); b**(1/2); 1/b*2 . Практикум по современному Фортрану
11 3. Формула
3
x была записана как x**1/3 – исправьте ошибки. −5
4. Запишите на Фортране формулу
3 sin x + 4 cos 2 x 2 −
1 2x
5. Чему будут равны значения переменных m, n, k, c, c1 после выполнения программы? В ответах учесть тип переменных. integer:: m, n, k real:: a=7.2, b=1.8, c, c1 m = a n = b c = a/b+b c1 = m/n+b k = a/b+b end
Варианты индивидуальных заданий № Данные
1
a=8.6 b=1.3 c=3.3 α=0.75
a=3.5 2
b=-2.1 α=0.1
Формулы
(
)
y1 = a 2 − b 2 − c 2 + 2bc :
a+b−c ; a+b+c
y 2 = (a + c ) − b 2 ; 2
z1 = 2 sin 2 (3π − 2α ) ⋅ cos 2 (5π +2α ) ; z 2 =
1 1 ⎛5 ⎞ − sin⎜ π − 8α ⎟ 4 4 ⎝2 ⎠
a 2 − b 2 a 3 − b3 y1 = − 2 2 ; a-b a -b cos2α z1 = 2 ; ctg α − tg 2 α
ab ; a+b 1 z 2 = sin 2 2α 4
y2 =
2
a=3.5 3
b=0.72 α=0.62
⎛ a2 + a a2 − b2 − a2 − a a2 − b2 ⎞ ⎟ ⎜ ⎠ ⎝ y1 = ; y2 = ⎛ a ⎞ b 3 + − 2 ⎟⎟ 2 a b ⎜⎜ b a ⎝ ⎠
1 z1 = 1 − sin 2 2α + cos2α ; 4 y1 =
4
a=4.3 α=0.43
( − 4 + (a
) − 4)
2
a+ b a −b
)
2
;
z 2 = cos 2 α +cos 4 α
a 3 − 3a 2 + 4 + a 2 − 4 a 2 − 1 a 3 + 3a 2
(
a2 −1
;
y2 =
(a − 2) (a + 2)
a +1 a −1
;
z1 = cosα + cos2α + cos6α + cos7α ; α 5 z 2 = 4cos ⋅ cos α ⋅ cos4α 2 2 Практикум по современному Фортрану
12 № Данные m=0.4 5
n=2.1 α=0.43
6
7
a=15.1 α=1.23
a=12.3 α=0.43
Формулы
y1 =
(m-1)
m − (n − 1) n
m 3 n + mn + m 2 − m tgα − secα z1 = ; cosα − ctgα
z 2 = tgα ⋅secα
⎛ 1+ a + a2 1-a + a 2 +2− y1 = ⎜⎜ 2 + 2 a a 2a-a 2 ⎝
⎞ ⎟⎟ ⎠
−1
(5 − 2a ) ;
8
y=0.8 α=0.81
x=1.4 9
⎛π ⎞ z1 =cos α + sin α + cos 3α + sin3α ; z 2 = 2 2 cos α ⋅ sin⎜ + 2α ⎟ ⎝4 ⎠
⎛a+2 y1 = ⎜⎜ − ⎝ 2a
z1 =
a 2a + 2
+
β=0.82
sin 2α + sin 5α − sin 3α ; cosα + 1 − 2sin 2 2α
z 2 = 2sin α
y2 =
1 ; x+ y
α⎞ α⎞ ⎛ 11 ⎛3 z1 = cos 2 ⎜ π − ⎟ − cos 2 ⎜ π + ⎟ ; 4⎠ 4⎠ ⎝8 ⎝8
z2 =
2 α sin 2 2
y1 =
10
α=0.75
2 3
x + 2 ⋅ 3 xy + 4 y
(x 3
4
)
2 3
− 8 y ⋅ 3 x : 3 xy
1
y2 =
;
3
; x −2 y
z 1 = (cosα − cosβ) − (sinα − sinβ) ; α −β z 2 = −4sin 2 ⋅ cos(α + β) 2 2
y1 = a=2.3
1 ; a+ 2
⎞ a− 2 ⎟⎟ ⋅ ; y2 = a + 2 a − 2a ⎠ 2
y( x − y ) x y1 = 2 − ; x + y2 x4 − y4
y=2.8 α=0.66
4 − a2 y2 = ; 2
2
2
x=3.2,
m− n ; m
y2 =
;
2
(2a + 1)3 + (2a − 1)3 4a + 2 4 a − 1 2
⎛π ⎞ sin⎜ + 3α ⎟ ⎝2 ⎠ z1 = ; 1 − sin (3α − π)
;
y2 =4a − 4a 2 − 1 ;
3 ⎞ ⎛5 z 2 = ctg⎜ π + α ⎟ 2 ⎠ ⎝4
Практикум по современному Фортрану
13 № Данные a=0.7 11
x=0.44 y=0.82
12
a=5.1 α=0.1
a=5.3 13
b=2.1 α=0.75
a=1.7 14
m=1.8
x=5.3 α=0.3 β=0.1
17
(
b=4.8 α=0.23
) (
y2 =
)
-1 ; a2 + a +1
1 z1 = cos 4 x + sin 2 y + sin 2 2 x − 1 ; z 2 = sin ( y + x ) ⋅ sin ( y − x ) 4
y1 = z1 =
y1 =
a +1
1
:
a a +a+ a
a 2- a
y2 = a − 1 ;
;
sin α − sin3α + sin5α ; cos α − cos3α + cos5α
(a 3
)(
− b2 ⋅
2
3
z 2 = tg3α
)
a −3 b
y2 = a − b ;
;
a 4 + 3 ab 3 − 3 a 3 b − 3 b 4
z 2 = cos 2α − 2 cos 2 α
z1 = cos4α − sin 4α ⋅ctg2α ; 1 2
a + ab −1
y1 = a
−
1 3
−a
−
1 6
b
1 3
−
+b
−
2 3
−
a 3
b
5 6
y2 = a ;
;
z2 =
z1 = cos4α ⋅ tg2α − sin 4α ;
y1 =
α=0.43 β=0.58
16
a2 + 2 1 1 y1 = + − ; 1− a3 2 1 + a 2 1- a
b=2.8 α=0.22
15
Формулы
z1 =
y1 =
(
4m m + m 2 − 1
(m +
)
4
)
2
m2 −1 −1
y2 =
;
tg2α + ctg3β ; ctg2α + tg3β x + x 2 − 4x x − x − 4x 2
z2 =
−
x − x 2 − 4x x + x − 4x 2
;
2tgα tg 2 α − 1
1 m2 −1
;
tg2α tg3β
y2 = x 2 − 4 x ;
z1 =sin (α + β) ⋅sin (α − β) ⋅ sec 2 α ⋅sec 2 β ; z 2 = tg 2 α − tg 2 β y1 =
z1 =
b 2 − 3b − (b − 1) b 2 − 4 + 2 b 2 + 3b − (b + 1) b 2 − 4 + 2
cos4α + 1 ; ctg α − tg α
⋅
b+2 ; b−2
y2 =
1-b ; 1+ b
1 z 2 = sin 4α 2 Практикум по современному Фортрану
14 № Данные
Формулы
2x − 3 5 4 1 1 1 1 = = y y + −1 − 2 + + + ; ; 2 3 x 4x 4 x −1 4 x 2 2 x 2 x Примечание. При x ≤4 y1 ∼ y2 ; при x>4 y1 ∼ y3 y1 =
18
x1=2.8 x2=4.8 α=0.97
x=1.4 19
⎛7 ⎞ ⎛9 ⎞ z1 = sin 2 ⎜ π − 2α ⎟ − sin 2 ⎜ π − 2α ⎟ ; ⎝8 ⎠ ⎝8 ⎠
x 3 + xy 2 − x 2 y − y 3
y1 =
β=0.34
y + 4 x y − 4 xy − x 5
4
y=2.8 α=0.5
z2 =
4
4
4
5
(
cos 2 α − cos 2β z2 = sin 2 α ⋅ sin 2β
2
2
20
a=5.1 α=0.3
2
⎛1+ a 1+a ⎞ ⎛ 1 − a 1+a ⎞ ⎟ −⎜ ⎟ y1 =⎜⎜ − − ⎟ ⎜ 1+a 1 − a ⎟ ; 1 +a 1 + a ⎝ ⎠ ⎝ ⎠
y2 =
16a a ; 1 − a 2 ⋅ (a − 1)
(
)
z1 =(1 + sec2α + tg 2α ) ⋅ (1 − sec2α + tg 2α ) ;
(
21
x=0.3 α=0.77
)
⎛ 1 ⎞ y1 = 1 − x 2 + 1 : ⎜⎜ + 1 − x ⎟⎟ ; ⎝ 1+x ⎠ cos(3π − 2α ) z1 = ⎛5 ⎞; 2 sin 2 ⎜ π + α ⎟ ⎝4 ⎠ 2
22
a=12.3 α=0.24
a=2.3 23
b=1.89 α=0.23
)
y2 = − 4 x + 4 y ;
;
z1 = ctg α − ctg β ; 2
sin 4α 2
⎛ a 1 ⎞⎟ ⎛ a − 1 ⎜ y1 = ⎜⎜ − ⎜ a +1 − ⎟ 2 a 2 ⎝ ⎠ ⎝ sin 2α −sin3α +sin 4α z1 = ; cos 2α − cos 3α + cos 4α y1
a +1⎞ ⎟; a − 1 ⎟⎠
z 2 = 2 tg 2α
y2 = 1 + x ; 5 ⎞ ⎛ z 2 = tg⎜ α − π ⎟ 4 ⎠ ⎝
y2 =
1-a ; a
z 2 = tg3α
2 ( 2a − b ) +2b 2 -3ab 4a 2 − 3ab = :
y 2 = a-b ; ; 2a -1 + b 2 2 + ab 2 1 ⎛α⎞ ⎛α⎞ z1 = sin 6 ⎜ ⎟ − cos 6 ⎜ ⎟ ; z 2 = sin 2 α − 4 cos α 4 ⎝2⎠ ⎝2⎠
(
)
Практикум по современному Фортрану
15 № Данные
24
25
b=3.8 α=0.28
p=0.7 α=0.54
Формулы
2b + 2 b 2 − 4
y1 =
b2 − 4 + b + 2
⎛ 17 ⎞ ⎛ 15 ⎞ z1 = sin 2 ⎜ π − 2α ⎟ − cos 2 ⎜ π − 2α ⎟ ; ⎝8 ⎠ ⎝8 ⎠
⎛ y1 = ⎜⎜ 1 − p 2 ⎝
(
x=4.3 α=1.23
m=2.3 28
a=6.3 29
)
−
1 2
2
(
2 m−
y1 =
cosα + sinα ; cosα − sinα
2
1 2
1-a + 4a − 4a
α=0.1 β=0.7
z1 =
2 ; 1− p4
(
)
y3 =
m y1 ∼ y3
при m > 1.5
⎛3 ⎞ z 2 = ctg⎜ π − α ⎟ ⎝2 ⎠
m 2 + m − 6 − (m − 3) m 2 − 4
3 4
; y2 =
y2 = x 2 + x + 1 ;
m 2 − m − 6 − (m + 3) m 2 − 4
1+2a − a
1 2
z 2 = tg 2α + sec 2α
1 2
+
y2 =
;
z1 =(cos α − cos β) + (sin α − sin β)
y1 =
−
;
− cos4α 2
m
При m ≤ 1.5 y1 ∼ y2 ;
1 4
)
b+2
8cos 2 2α z2 = sin 6α
y2 = − m ;
;
3
z2 =
⎞ ⎟⎟ + 2 1 − p 4 ⎠
x4 − x3 − x + 1 y1 = 3 2 x −3 ; x -5 x +7 x-3 sin 4α cos2α z1 = ⋅ ; 1 + cos4α 1 + cos2α
α=0.23 β=1.2
− 1+ p
2
(2m + 3)2 − 24m
Примечание.
z1 =
27
(
1 2
z1 =tgα + ctgα + tg3α + ctg3α ;
y1 = m1=0.47 m 2=2.47 26 α=0.1
)
−
1
y2 =
;
2
;
− m+2 m-2
z 2 = 4sin 2
1 4
a −2 ⎞ ⎛ ⎜ a − 1⎟ ⎟ ⎜ ⎠ ⎝
sin α + cos(2β − α ) ; cos α − sin(2β − α )
1 4
2
;
y2 =
z2 =
4
;
α -β 2
1 ; a −1
1 + sin 2β cos 2β
Практикум по современному Фортрану
16 № Данные
Формулы
y1 = m1=0.65 m 2=1.65 30 α=1.43
m 5 + m 4 ⋅ 3 2 + 3 4m 9 m3 − 1 − 1
m3 y2 = m− 2 Примечание.
1 − 2 sin 2 α z1 = ; 1 + sin 2α
;
(
)
y 3 = − m 2 + m3 2 + 3 4 ; При m>1 y1 ∼ y2 ;
при m ≤1
z2 =
y1 ∼ y3
1 − tgα 1 + tgα
1.2. Вычисление логических выражений Задание 1. Представить графически каждое из трех неравенств А, В и С из варианта индивидуального задания в виде заштрихованных областей плоскости, а затем записать соответствующие им отношения на Фортране. 2. Составить три системы неравенств, записать соответствующие им логические выражения и показать графическую интерпретацию выражений, каждого на своем рисунке: a) объединение областей – логическое сложение неравенств A+B+C; b) пересечение областей – логическое умножение неравенств A٠B٠C; c) дополнительная логическая формула, указанная в правой колонке таблицы с вариантами индивидуальных заданий. 3. На каждом из трех рисунков указать координаты двух контрольных точек (всего шесть точек) так, чтоб одна точка попала в заштрихованную область (истина), а другая нет (ложь). 4. Написать программу, которая для каждой из выбранных точек: a) вводит координаты точки и прогноз – словесное предсказание о нахождении точки в области (точка попала или точка не попала); b) вычисляет значение соответствующего логического выражения; c) выводит в файл out.txt координаты точки, прогноз, значение логического выражения. Содержание отчета 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента.
Практикум по современному Фортрану
17 3. Текст задания; неравенства и формула в том виде, как они приведены в варианте индивидуального задания. 4. Графическая интерпретация исходных неравенств (рисунки 1а, 1b, 1с из примера). 5. Три системы неравенств в математической символике и их графическая интерпретация – рисунки 2a, 2b, 2c из примера. На каждом из рисунков 2a, 2b, 2c должны быть нанесены две контрольные точки с указанием их координат. 6. Распечатка программы и результатов из соответствующих файлов. При подготовке к защите ответить на контрольные вопросы. Справочная информация Порядок выполнения операций в логических выражениях определяется их старшинством (приоритетом). В таблице, приведенной ниже: − L1, L2 – логические выражения; − a, b – численные или строковые выражения. В отношениях можно сравнивать не только числа, но и строки – они сравниваются в соответствии с алфавитом. Операция
Логические операции
Операции отношения
Вычисление значений a,b
Фортран-77
Фортран-90
Числовые или символьные операции.
Старшинство 1
Больше чем
a.GT.b
a>b
2
Больше или равно
а.GE.b
a >= b
2
Меньше чем
а.LT.b
a
2
Меньше или равно
а.LE.b
a <= b
2
Равно
а.EQ.b
a==b
2
Не равно
а.NE.b
a /= b
2
Отрицание
.NOT.L1
3
Конъюнкция
L1.AND.L2
4
Дизъюнкция
L1.OR.L2
5
Эквивалентность
L1.EQV.L2
6
Неэквивалентность
L1.NEQV.L2
6
Комментарии к заданию 1. В математической логике логическое умножение иначе называют конъюнкцией, сложение – дизъюнкцией, отрицание – инверсией. 2. Обозначения в логической формуле: B ⋅ C – отрицание логического произведения В и C, B + C – отрицание логической суммы В и C.
Практикум по современному Фортрану
18 3. Если точки выбраны правильно, результаты вычислений должны соответствовать прогнозам о расположении точек. 4. Данные следует читать из исходного файла In.txt, результаты записывать в файл Out.txt. 5. Графическую интерпретацию неравенств и выражений изобразить вручную или в пакете Advanced Grapher (уметь и то, и другое). Пример Индивидуальное задание включает в себя три неравенства, например, x > 0 (A) y > 0 (В) y ≥ x (C) Неравенства А, В, С входят в логические формулы А+В+С, А ⋅ В ⋅ С, общие для всех вариантов, и в дополнительную логическую формулу, например, A ⋅ B + C . Подготовка проходит в три этапа: 1. графическая интерпретация исходных неравенств и запись на Фортране соответствующих отношений (в строгих неравенствах границы не входят в заштрихованную область, и их на рисунке следует показать пунктиром вместо сплошных линий.) x>0
y>0
y≥x
Рис.1а
Рис.1b
Рис.1c
x>0
y>0
y>=x
2. системы неравенств, их графическая интерпретация, логические выражения, соответствующие системам неравенств
Логическое сложение
Система неравенств
Графическая интерпретация
A+ B+C
⎡x > 0 ⎢y > 0 ⎢ ⎢⎣ y ≥ x
Контрольные точки
Логическое выражение
TRUE (-1, 1); FALSE (-0.5, -1)
x>0. .OR. y>0. .OR. y>=x Истина для точек в I или II или IV квадрантах или выше прямой y=x
Рис.2а
Практикум по современному Фортрану
19
Дополнительная формула
Логическое умножение
Система неравенств
Графическая интерпретация
Контрольные точки
Логическое выражение
A⋅ B ⋅C
⎧x > 0 ⎪ ⎨y > 0 ⎪y ≥ x ⎩
TRUE (0.5, 1); FALSE (1, -1)
Рис.2b
AB + C
⎡⎧ x > 0 ⎢⎨ ⎢⎩ y > 0 ⎢y ≥ x ⎣
x>0. .AND. y>0. .AND.y>=x Истина для точек в I квадранте и выше прямой y = x
TRUE (-1.5, -1); FALSE (1.5, 1)
.NOT. (x>0. .AND. y>0.) .OR. y>=x Истина для всех точек во II, III или IV квадрантах или выше прямой y=x
Рис.2c
3. исходные данные программы вводятся оператором Read(1,*) x, y, prognos
! координаты точки и прогноз
Данные подготовить в файле In.txt (прогноз – в апострофах): –1, 1, ’внутри ’ -0.5, –1, ’вне’ далее аналогично для остальных контрольных точек. Программа ! Пример программы для одной контрольной точки: Program Logical_expressions ! логические выражения ! студент (фамилия, имя) группа № работа № вариант № Implicit None ! все переменные должны быть объявлены Logical A, B, C, ILI ! ILI – результат для операции OR ! (не забудьте добавлять описания новых переменных) Real x, y ! координаты точек Character*6 prognos ! строка длиной 6 символов Open(1, file=’In.txt’) ! файл с исходными данными Open(6, file=’Out.txt’) ! файл результатов !***** ! операция OR: для объединения областей Read(1,*) x, y, prognos ! вводятся координаты одной точки и прогноз ! логические операторы присваивания: A = x>0; B = y>0; C = y>x ! операции отношения ILI = A .OR. B .OR. C ! логическая операция Write(6,*)’для OR ’, prognos, ’ (’, x, ’,’, y, ’) ответ ’, ILI !***** ! Для каждой из остальных пяти контрольных точек добавить операторы, ! аналогичные части программы от «!*****» до «!*****» ! Не забудьте добавить описания типов дополнительных переменных. End Program Logical_expressions
Практикум по современному Фортрану
20 Контрольные вопросы к защите работы 1. Что называется логическим выражением, бывает ли оно смешанным? Могут ли в него входить числа? 2. Приведите три основные и две дополнительные логические операции с таблицами истинности и примерами. 3. Шесть операций отношения с примерами. 4. Логические константы. 5. Как логическую константу “истина” задать с именем ON? 6. В каком порядке выполняются операции в логической формуле? а) со скобками; б) без скобок. Разъясните оба случая. 7. Даны вещественные A=-3, B=4; строки wef=‘fifty’ и Bref=‘first’. Опишите все переменные с указанными значениями и вычислите: A /= B/2-5; -27.**(1./3) == -A; -27**(1/3) == A; .not.wef > Bref; Wef(1:2) == Bref(1:2).or.A
⎧3 sin x > 4 cos x 2 8. Запишите систему неравенств ⎨ в виде логического ⎩x < 2 выражения на Фортране. 9. Исправьте ошибки в логических выражениях: a) sinx>2..and..4.cos2x; b) -27.**(1./3) =-3; c) 2..ne.8..or..not..3=0 .
Пример контрольного задания 1. Объявите тип переменной L1 (оператор Фортрана) и вычислите ее значение real:: A=21.0 integer:: M=21 L1 = A/5==M/5
2. Даны неравенства для вычисления значений логических переменA = x<2 , B = y ≤ x – 3 , C = (x 2 – 1) + y ≤ 2 . ных: − Запишите L1= A + B + C : а) в виде системы неравенств, б) в виде логического выражения. − Вычислите значения A, B, C, L1 при x = 1; y = – 0.5 . 3. Дан фрагмент программы: A = x>0; B = y<0; C = y2<-x+1 L1 = B .or. A .and. C
− Объявите типы всех переменных (операторы Фортрана). − Приведите графическую интерпретацию всех логических переменных. Практикум по современному Фортрану
21 4. Упростите выражение A ⋅ A + B (А и В – логические значения). Варианты индивидуальных заданий №
Неравенство A
Неравенство B
Неравенство C
Дополнительная логическая формула
1
x≤0
y>0
y≤−
x2 +3 3
AB + C
2
x>0
y≤0
x2 + y2 < 1
AB + C
3
x>0
y>0
y2 −3 ≤ x 3
AB + C
4
x≤0
y>0
x2 + y2 ≤ 1
AB + C
5
x≤0
y>0
y > x2 – 2
AB + C
6
x≤0
y>0
y > - x2 + 2
AB + C
7
x≤0
y>0
x2 + y2 ≤ 1 4
AB + C
8
x>0
y>0
x2 +
y2 ≤1 4
AB + C
9
x≤0
y>0
y2 ≤ x +1 2
AB + C
10
x>0
y>0
y ≤ x2 – 2
AB + C
11
x≤0
y≤0
y ≤ - x2 + 2
CA+ B
y≤0
x2 + y2 ≤ 1 4
CA+ B CA+ B
12
x>0
13
x>0
y≤0
y2 x + >1 4
14
x>0
y>0
y2 > x +1 2
CA+ B
15
x≤0
y≤0
x2 + y2 > 1
CA+ B
2
Практикум по современному Фортрану
22 №
Неравенство A
Неравенство B
Неравенство C
Дополнительная логическая формула
16
x>0
y>0
y > x2 – 2
A+ B +C A+ B +C
17
x≤0
y≤0
x2 y ≤ − +3 3
18
x>0
y>0
y > – x2 + 2
A+ B +C
19
x>0
y≤0
y2 −3 ≤ x 3
A+ B +C
20
x>0
y>0
x2 + y2 > 1
A+ B +C
21
x>0
y≤0
y > x2 – 2
A+ B +C
22
x>0
y>0
y ≤ - x2 + 2
BA+ C
23
x>0
y>0
x2 + y2 >1 4
BA+ C
24
x≤0
y≤0
x2 +
y2 ≤1 4
BA+ C
25
x>0
y≤0
y2 ≤ x +1 2
BA+ C
26
x>0
y≤0
y ≤ x2 – 2
BA+ C
27
x>0
y≤0
y > - x2 + 2
BA+ C
28
x≤0
y≤0
x2 + y2 >1 4
BA+ C
29
x≤0
y>0
x2 +
y2 >1 4
A + CB
30
x≤0
y≤0
y2 > x +1 2
A + CB
Практикум по современному Фортрану
23 1.3. Построение графиков функций Задание 1. Для каждого участка графика определить границы и составить уравнение y = fi(x). 2. Написать программу табуляции функции по участкам fi(x). Строки <аргумент><значение функции> записать в файлы Fi с расширением .txt. Для контроля и отчета создать файл Out.txt, в котором для каждого участка линии выведен заголовок и координаты не более чем 10 точек. 3. Используя приложение Advanced Grapher (далее AGrapher), вывести на экран разноцветные графики функций fi(x) из соответствующих файлов, подготовленных программой. 4. График, созданный в AGrapher, предъявить преподавателю. Содержание отчета 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Текст задания и график функции в том виде, как он приведен в варианте индивидуального задания. 4. Таблица участков графика (смотрите пример), в которой для каждого участка указаны границы, уравнения, шаг табуляции, количество выполнений цикла. 5. Блок – схема программы. 6. Распечатки программы и контрольного файла Out.txt. При подготовке к защите ответить на контрольные вопросы. Комментарии к заданию 1. Приложение Advanced GRAPHER распространяется бесплатно, адрес сайта http://www.alentum.com/agrapher/. Рекомендации по работе с AGrapher смотрите в разделе 7.2. 2. Таблицу основных уравнений смотрите в разделе 7.3. 3. После разбиения графика на участки следует выбрать шаг табуляции каждого участка. Для прямолинейных участков шаг выбирается из расчета 2-5 точек на участок. На криволинейном участке с целью улучшения изображения в AGrapher шаг выбирается более мелкий, до 50 точек. Для прямой, параллельной оси Х выводятся две точки (без цикла). 4. Для табуляции каждого участка использовать оператор цикла DO x=xn,xk,step ... enddo Практикум по современному Фортрану
24 Здесь х – переменная цикла; xn, xk – начальное и конечное значения x, step - шаг изменения х. 5. Количество повторений цикла рассчитывается по формуле: ⎛ ⎛ xk − xn + step ⎞ ⎞ ⎟⎟ ⎟⎟ или M = Max ⎜⎜ 0, Int ⎜⎜ step ⎝ ⎠⎠ ⎝
⎛ ⎛ xk − xn ⎞ ⎞ M = Max ⎜⎜ 0, Int ⎜⎜ + 1⎟⎟ ⎟⎟ ⎝ step ⎠⎠ ⎝
Из-за применения в расчетах функции Int (преобразование в целый тип) при вещественных значениях xn, xk, step можно потерять конечное значение переменной цикла. Возможные варианты предотвращения этой ошибки: a) при вещественных значениях xn, xk или step конечное значение в операторе цикла всегда записывать в виде xk + step/2.0; b) построить цикл не по вещественной переменной x, а по целой I (do I=1,M). Здесь М – количество повторений цикла, рассчитанное вручную при написании программы. При этом в цикле придется пересчитывать целочисленную переменную I в вещественную переменную x оператором х=xn+step*(I-1). В этом случае ошибка вычислений не накапливается; c) выражать угол alpha в целых градусах, а не в радианах, и при этом использовать функции sind, cosd; d) координаты последней точки участка вывести после цикла. Пример Функция задана графически на интервале [-2, 3]
Уравнения участков графика №
Границы участка
Уравнение
Шаг цикла
Количество точек
Примечание
1
[-2, 0]
y =x/2 +1
1
3
Прямая пересекает оси в точках (-2,0) и (0,1). Уравнение прямой в отрезках.
2
[0, 1] α∈[0, 90▫]
x = cos α y = sin α
3
31
Параметрические уравнения окружности радиуса R=1 с центром в начале координат.
3
[1, 3]
y = -1
нет
2
Горизонтальная прямая (параллельна оси Х)
Практикум по современному Фортрану
25 Программа Program Function_graph ! Табуляция функции ! студент (фамилия, имя) группа № работа № вариант № Implicit None Real x, y, alpha Integer,parameter :: tabl=6 ! имени tabl присвоен номер устройства 6 Integer k ! номер точки криволинейного участка ! участки для AGrapher Open(1,File=’L3_F1.txt’)! 1 – координаты точек прямой Open(2,File=’L3_F2.txt’)! 2 – координаты точек дуги окружности Open(3,File=’L3_F3.txt’)! 3 – горизонталь (координаты граничных точек) Open(tabl,File=’Out.txt’)! контрольный текстовый файл Write(tabl,*)’прямая’ Do x= -2, 0, 1 y = 0.5*x+1 Write(1,*)x,y; Write(tabl,*)’(x,y)=’,x,y Enddo Write(tabl,*)’дуга окружности’ k=0 ! начальная установка счетчика точек на дуге окружности Do alpha=0,90,3 ! аргумент функций Sind, Cosd - в градусах, шаг цикла - целый x=Cosd(alpha) y=Sind(alpha) Write(2,*)x,y k=k+1 ! в tabl печатается каждая 5-я точка, Mod(k,5) – остаток от деления k на 5 if(Mod(k,5)==1) Write(tabl,*)’(x,y)=’, x,y Enddo Write(tabl,*)’Горизонталь - две точки без цикла’ Write(tabl,*) ’(1,-1) ==> (3,-1,)’ Write(3,*) 1,-1; Write(3,*) 3,-1 End Program Function_graph
Контрольные вопросы к защите работы 1. Что такое цикл? 2. Назовите три вида циклов. 3. Приведите блок-схему и пример бесконечного цикла. 4. Приведите блок-схему и пример итеративного цикла. 5. Приведите блок-схему и пример цикла по переменной. 6. Объясните формулу для числа повторений цикла по переменной. 7. Приведите подробную блок-схему цикла по переменной. 8. Как предотвратить возможную потерю последнего выполнения тела цикла по вещественной переменной? Варианты решения с объяснениями.
Практикум по современному Фортрану
26 9. Подсчитайте количество повторений циклов: a) do alpha=0,90,2 ; b) do alpha=90,0,2 ; c) do alpha=90,0,-2 ; d) do alpha=0,9 ; e) do alpha=9,0 ; f) do alpha=1.57, 3.14, 0.3 . 10. Поясните на блок-схемах роль оператора Enddo в каждом из трех видов циклов. 11. Поясните на блок-схемах роль оператора Exit в каждом из трех видов циклов. 12. Поясните на блок-схемах роль оператора Сycle в каждом из трех видов циклов. Пример контрольного задания 1. Рассчитайте количество повторений цикла do x=3.15, 2.12, 1.3 2. Напишите оператор цикла по переменной для вывода на экран значений x и tg x, если x изменяется от –100о до –200о, шаг выберите сами. Приведите блок-схему этого оператора. 3. Для фрагмента программы x = 0.0 Do k = 2, 8, 2 x = x + 0.8 if (x<2 .or. x>3) then y = x*2 + 1.0/k else exit endif write(1, *) x, y enddo ! выполните следующее:
a) приведите блок-схему; b) опишите типы всех переменных; c) напишите, какие и сколько значений x и y будут выведены на устройство 1 в результате работы цикла. 4. Напишите оператор цикла Do while для вывода на экран значений x и y = sin2x + cos2x, если x изменяется от –π/4 до 1,5π с шагом π/10. Приведите блок-схему этого оператора.
Практикум по современному Фортрану
27 Варианты индивидуальных заданий №
Графики
1
2
3
4
5
Практикум по современному Фортрану
28 №
Графики
6
7
8
9
10
11
Практикум по современному Фортрану
29 №
Графики
12
13
14
15
16
17
Практикум по современному Фортрану
30 №
Графики
18
19
20
21
22
23
Практикум по современному Фортрану
31 №
Графики
24
25
26
27
28
29
Практикум по современному Фортрану
32 №
Графики
30
1.4. Попадание точки в заданную область плоскости Задание 1. Область заштрихована и ограничена линиями контура. 2. Определить графики линий контура: a) для каждой i-ой линии контура задать область определения и уравнение y = fi(x) – проверить уравнения в Agrapher; b) написать программу табулирования fi(x), полученные таблицы импортировать в Agrapher, настроив линии – красным цветом, точки удалить – график должен повторять рисунок индивидуального задания; c) сохранить график в файле area.agr (этот график используется в дальнейшем). 3. Описать математически систему неравенств, обеспечивающую попадание произвольной точки в заштрихованную область – проверить правильность системы неравенств в AGrapher. 4. Рисунок индивидуального задания накрыть прямоугольной сеткой, в узлах которой находятся точки для проверки системы неравенств: a) прямоугольник должен на 10-20% перекрывать заданный контур с каждой из четырех сторон; b) рекомендуемое число узлов сетки – 20-40 по каждой оси. Определить параметры сетки: начальное и конечное значения x и y, шаг изменения x и y. 5. Дополнить программу из пункта 2: a) сгенерировать узлы сетки, используя ее параметры; b) проверить соответствие координат каждой точки сетки системе неравенств, используя для этого единственный оператор IF; c) записать координаты точки (x, y) в один из двух файлов: если точка в пределах заштрихованной области – в файл in.txt, если точка за пределами заштрихованной области – в файл out.txt. 6. Дополнить график в Agrapher: a) прочитать график контурных линий из файла area.agr ; b) импортировать таблицы из файлов in.txt и out.txt ; c) установить для точек из in.txt и out.txt разные цвета и удалить линии, соединяющие точки; Практикум по современному Фортрану
33 d) предъявить преподавателю результат на экране. Содержание отчета 1. Название работы, номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Рисунок в том виде, как он приведен в варианте задания. 4. Уравнения всех линий, ограничивающих заштрихованную область. 5. Система неравенств координат всех точек заштрихованной области. 6. Блок – схема и распечатка текста программы. При подготовке к защите ответить на контрольные вопросы. Комментарии к заданию 1. В системе неравенств показать объединение квадратной скобкой, пересечение – фигурной скобкой. 2. Таблицу основных уравнений смотрите в разделе 7.3. 3. При составлении системы неравенств рекомендуется рассматривать область по отдельным фрагментам, что поможет в решении задачи. Система неравенств в этом случае представляется объединением групп неравенств, соответствующих этим фрагментам. 4. Рекомендуется воспользоваться симметрией заданной области, иногда это помогает уменьшить количество неравенств. 5. Генерируя точки – узлы сетки, воспользуйтесь вложенными циклами для задания координат x,y для точек. Пример На рисунке показана заштрихованная область и ограничивающий ее пунктирный прямоугольник. Точка находится в пределах заданной области, если она принадлежит хотя бы одному из двух фрагментов В или A, причем из-за |x|<3 вертикальные стороны прямоугольника A -пунктирные. Система неравенств: ⎡⎧ y ≥ 2 ⎢⎪ ⎢⎨ у ≤ 4 ⎢⎪ x < 3 ⎢⎩ ⎢⎧ x 2 + y 2 ≤ 9 ⎢⎨ ⎢⎣⎩ x ≤ 0
(фрагмент A)
(фрагмент B )
Границы прямоугольника, содержащего область: –4 ≤ x ≤ 4; –4 ≤ y ≤ 5 В качестве шага изменения x и y выбрано 0.4 .
Практикум по современному Фортрану
34 Блок-схема программы. Начало Табуляция линий - границ области Открытие файлов In.txt и Out.txt x = -4, 4, 0.4 Конец цикла
Конец цикла
Конец
y = -4, 4, 0.4
A = (y >= 2) и (y <= 4) и (|x| < 3) B = (x + y <= 9) и (x <= 0) да
x, y => в файл «In.txt»
А или В
нет
x, y => в файл «Out.txt»
Программа. Program Region ! Попадание точки в область плоскости ! студент (фамилия, имя) группа № работа № вариант № Implicit none Real x, y Integer, parameter:: inside=1, outside=2 ! Номера устройств Logical A, B Open(inside, file=’in.txt’) ! координаты точек внутри области Open(outside, file=’out.txt’)! координаты точек вне области Open(3, file=’3.txt’) ! прямоугольник, ограничивающий фрагмент A Open(4, file=’4.txt’) ! прямоугольник, ограничивающий фрагмент В ! Табуляция линий – границ области (файлы на устройствах 3 и 4) . . . ! цикл по Y внутри цикла по X - перебор точек сетки Do X = -4, 4, 0.4 Do Y = -4, 5, 0.4 A = y>=2 .and. y<=4 .and. abs(x)<3 ! фрагмент A В = x*x + y*y <= 9 .and. x<=0 ! фрагмент B If (A .or. B) then Write(inside, *) x, y Else Write(outside, *) x, y End If End Do End Do End Program Region
Практикум по современному Фортрану
35 Контрольные вопросы к защите работы 1. Как в логическом выражении распределяются приоритеты между операциями отношения, числовыми, логическими? 2. Пять логических операций (три основные и две дополнительные) с таблицами истинности и примерами. 3. Приоритеты логических операций в логическом выражении. 4. Шесть операций отношения с примерами. 5. Запись на Фортране логических констант. 6. Что называется циклом? Его стандартная блок-схема в программе. 7. Объясните формулу числа повторений цикла по переменной. 8. В каких случаях целая переменная цикла лучше вещественной? 9. Как по-другому можно назвать цикл по переменной? Приведите пример. 10. Приведите блок-схему и пример вложенных циклов. 11. Приведите блок-схему, пример одноблочного условного оператора. 12. Приведите блок-схему, пример двухблочного условного оператора. 13. Приведите блок-схему и пример условного оператора без блоков. Пример контрольного задания 1. Напишите условный оператор для вычисления значения переменной. ⎧2 3 при х < 2 , ⎪9 x ⎪⎪ 1 Y = ⎨ sec 2 при 2 ≤ х < 4 , x ⎪ ⎪ 3 e x + 2 при х ≥ 4 ⎪⎩ 2. Подсчитайте количество выведенных строк Do a = 22, 9, -8 Do b = 3, 19, 11 write(*, *) a, b enddo enddo
Какие значения a и b будут выведены? 3.
При каких значениях координат точка [x, y] находится в заштрихованной области плоскости? Опишите эти условия: a) в виде системы неравенств; b) в виде логического выражения (без промежуточных переменных).
Практикум по современному Фортрану
36 4. Напишите по блок-схеме фрагмент программы на Фортране. a=0 Конец цикла
x = 2, 3, 0.2 x < 2.5 a = a + 2x нет
a =a +x
a > 10
да
Варианты индивидуальных заданий №
Рисунки
№
1
2
3
4
5
6
Рисунки
Практикум по современному Фортрану
37 №
Рисунки
№
7
8
9
10
11
12
13
14
15
16
Рисунки
Практикум по современному Фортрану
38 №
Рисунки
№
17
18
19
20
21
22
23
24
25
26
Рисунки
Практикум по современному Фортрану
39 №
Рисунки
№
27
28
29
30
Рисунки
1.5. Приближенное вычисление функции – сумма степенного ряда Задание 1. Составить программу Pro1, которая для рекомендованного в индивидуальном варианте значения аргумента x = x0 и заданного значения точности ε: a) вычисляет значение функции f(x) с помощью встроенной функции Фортрана; b) вычисляет приближенное значение f(x), суммируя члены ряда Тейлора, и определяет их количество, необходимое для достижения заданной точности ε; c) формирует три текстовых файла для пакета AGrapher: − зависимость значения члена ряда an от n; − зависимость частичной суммы членов ряда Sn от n; − значение встроенной функции f(x), одно и то же при всех значениях n; для построения графиков принять ε = 10-4; d) выводит в текстовый файл Out.txt результаты суммирования с пояснениями: − значение ε; − значение аргумента x = x0; − f(x), вычисленное по стандартной программе; − значение суммы членов ряда; Практикум по современному Фортрану
40 − количество членов ряда, составивших его сумму; − модуль разности f(x) и суммой ряда. 2. С помощью пакета AGrapher построить графики зависимостей по трем текстовым файлам, созданным в программе Pro1. 3. Составить программу Pro2, модифицировав программу Pro1: a) значение аргумента x функции f(x) изменять от xn до xk с шагом Δx из расчета 10 – 15 значений; b) исключить формирование текстовых файлов для графиков; c) результаты вычислений оформить в виде таблицы (каждая строка таблицы соответствует одному значению x и содержит форматированные результаты). 4. Выполнить программу Pro2 дважды с разными значениями ε: a) со степенью точности, соответствующей визуальному восприятию графиков; b) со степенью точности, достижимой при использовании вещественных переменных типа Real. Содержание отчета 1. Название работы, номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Вариант индивидуального задания (функция, её разложение в ряд Тейлора и область определения аргумента функции). 4. Рекуррентная формула и расчет коэффициента рекурсии с последующей его проверкой для двух членов ряда. 5. Блок-схемы программ Pro1 и Pro2. 6. Распечатки текстов программ Pro1 и Pro2. 7. Распечатка результатов работы программы Pro1. 8. Рисунок или распечатка графиков, построенных в AGrapher по трем файлам, созданным в Pro1. 9. Распечатки двух таблиц с результатами программы Pro2. При подготовке к защите ответить на контрольные вопросы. Справочная информация 1. Запись бесконечного ряда Тейлора: ∞
∑a n =0
n
= a 0 + a1 + a 2 + ... + a n + ... , здесь an – общий член ряда;
S0, S1,… Sn,… называют частичными суммами бесконечного ряда, n
S0 = a0 , S1 = a0 + a1, …, S n = ∑ ak = a0 + a1 + a2 + ... + an , … k =0
Практикум по современному Фортрану
41 2.
3.
Сходящимся называется ряд, у которого последовательность часS n = S , иначе ряд тичных сумм имеет конечный предел S, т.е. lim n →∞ называется расходящимся. S называется суммой сходящегося ряда. Нахождение этой суммы является целью лабораторной работы. Величина n! называется “n-факториал” и вычисляется по формуле n
n! = 1 ⋅ 2 ⋅ 3 ⋅ … ⋅ (n – 1) ⋅ n = (n – 1)! ⋅ n
или
n! = ∏ k k =1
при 0! = 1. Комментарии к заданию 1. Обратите внимание на то, что в Вашем индивидуальном задании: a) нумерация членов ряда может начинаться не с «0», а с «1» (n=1); b) a0 может быть функцией от x или константой; c) сумме может предшествовать слагаемое или сомножитель. 2. При суммировании ряда необходимо решить следующие задачи: a) упростить вычисления - свести их к простейшим операциям; b) уменьшить число этих операций и время расчета; c) уменьшить погрешность вычислений. Эти задачи решает рекуррентная формула, позволяющая вычислить значение очередного члена ряда, используя уже найденное значение предыдущего. Рекуррентная формула имеет вид: an+1 = an ⋅ Tn, где Tn – коэффициент рекурсии. 3. Возможно суммирование только конечного количества членов ряда. a n = 0 . Следовательно, начиная с некотоДля сходящегося ряда lim n →∞ рого n, отношение |an| > ε перестанет выполняться для любого положительного ε. Этим значением n и следует ограничиться при суммировании бесконечного ряда. 4. Во избежание зацикливания программы вследствие ошибок, значение n следует ограничить, для чего в программе предусмотрена переменная Nmax (равная, например, 100). При n > Nmax суммирование прекращается и выдается сообщение с дополнительной информацией (в том числе значение an). Аварийное сообщение может появиться, если: a) значение |an| приближается к ε. Возможно, ряд просто «не успел» сойтись и достаточно увеличить значение Nmax ; b) значение |an| на порядки превышает ε, то есть ряд не сходится. В этом случае следует проверить: − находится ли x в области определения аргумента; − достижима ли задаваемая погрешность вычислений ε при использовании вещественных переменных типа Real ; Практикум по современному Фортрану
42 − нет ли ошибок в рекуррентной формуле, алгоритме или программе. Пример Рассмотрим вычисление функции sin x. Разложение этой функции в ряд Тейлора имеет следующий вид ∞ ( − 1 ) n x 2 n +1 x3 x5 x7 f ( x ) = sin x = ∑ = x− + − +K, где x < ∞ 3! 5! 7! n = 0 ( 2 n + 1 )! Расчет коэффициента рекурсии Формула для вычисления общего члена ряда an =
(− 1)n x 2 n +1 , (2 n + 1)!
где n = 0, 1, 2, ...
При n = 0, a0 = x. Каждый следующий член ряда an+1 можно вычислить с помощью рекуррентной формулы
an+1 = an ⋅ Tn,
где n = 0, 1, 2, … .
Коэффициент рекурсии Tn определяется из соотношения a Tn = n +1 , где n = 0, 1, 2, … . an Выполним подстановки n +1 ( − 1) ⋅ x 2(n +1)+1 x 2n ⋅ x 3 n a n +1 = = (− 1) ⋅ (− 1) – подставлено n+1 вместо n (2(n + 1) + 1)! (2n + 3)!
an
n 2n ( − 1) ⋅ x 2 n +1 ⋅x n x = = (− 1) (2n + 1)! (2n + 1)!
2n ⎡ ⋅x ⎤ x 2n ⋅ x 3 ⎤ ⎡ n n x = Tn = ⎢(− 1) ⋅ (− 1) ⎥ : ⎢(− 1) (2n + 3)!⎦ ⎣ (2n + 1)!⎥⎦ ⎣ n ( − 1) ⋅ (− 1) x 2 n ⋅ x 3 (2n + 1)! 2 (2n + 1)! ( ) = ⋅ ⋅ = − 1 ⋅ ⋅ x (2n + 3)! x 2 n ⋅ x (2n + 3)! (− 1)n
– подставлено an+1, an
Чтобы сократить факториалы, рассмотрим числитель и знаменатель отдельно (2n + 1)! = 1 ⋅ 2 ⋅ 3 ⋅ … ⋅ (2n + 1) (2n + 3)! = 1 ⋅ 2 ⋅ 3 ⋅ … ⋅ (2n + 1) ⋅ (2n + 2) ⋅ (2n + 3) 1 Tn = (− 1)⋅ x 2 ⋅ Коэффициент рекурсии (2n + 2)(2n + 3) − x2 a n +1 = a n ⋅ Рекуррентная формула для расчетов (2 n + 2 )(2 n + 3 )
Практикум по современному Фортрану
43 Проверка рекуррентной формулы Подставив n = 0 в формулу общего члена ряда an, получаем a0 = x. Далее определим по рекуррентной формуле a1 и a2, сверяя результаты с соответствующими членами ряда: x3 x3 1 2 a1 = a0 ⋅ T0 = x ⋅ ( − x ) ⋅ =− =− при n = 0 2⋅3 2⋅3 3! 3 5 1 x x x5 2 ( ) a = a ⋅ T = − ⋅ − x ⋅ = = при n = 1 2 1 1 2⋅3 4 ⋅ 5 2 ⋅ 3 ⋅ 4 ⋅ 5 5! Совпадение полученных значений с членами ряда показывает, что коэффициент рекурсии рассчитан правильно. Блок-схема алгоритма суммирования ряда В алгоритме реализуются те же действия, что и при проверке рекуррентной формулы. Одна переменная an используется в программе при вычислении всех членов ряда a0 , a1 , … an , принимая перечисленные значения по очереди. Суммирование членов ряда выполняется в цикле do while «пока |An| > eps», аварийный выход из цикла при N > Nmax.
Начало F= sinx; N= 0; An = x; Sum=An Вывод для графиков зависимости An, Sum, F от N(N= 0) Конец цикла
N=N+1(An нумеруются с "0")
пока | An | > eps
− x⋅x ; (2 N + 2 ) ⋅ (2 N + 3 ) Sn = Sn + An ; N = N +1 An = An ⋅
Результаты: x, F, Sum, N, |F-Sum|
Вывод для графиков зависимости An, Sum, F от N
Конец
да
N > Nmax
нет
Аварийноесообщение Stop
Практикум по современному Фортрану
44 Программа суммирования ряда для одного значения аргумента Program Pro1 ! суммирование ряда – первая версия – для одного х ! студент (фамилия, имя) группа № работа № вариант № Implicit None Real:: x = 1.1 ! рекомендованный x0 Real:: eps = 1E-04 ! методическая погрешность Integer:: N ! номер члена ряда Integer:: Nmax=100 ! максимально допустимое значение члена ряда Real An, Sn, F ! член ряда, сумма, функция Real Delta ! модуль разности между Sn и F ! список переменных, выводимых при достижении заданной точности: Namelist /result/ x, F, Sn, n, Delta ! список переменных, выводимых при аварийном предупреждении: Namelist /avaria/ x, An, Sn, F, N, Nmax !-------------начало выполнения программы Open(1, file = ’Out.txt’) ! файл с результатами Open(2, file = ’An.txt’) ! файл для AGrapher – зависимость An от N Open(3, file = ’Sn.txt’) ! файл для AGrapher – зависимость Sn от N Open(4, file = ’F.txt’) ! файл для AGrapher – F (одинаково при всех N) Write(1, *) ’Точность вычисления ’, eps ! ***** Суммирование ряда выполнить по блок-схеме, приведенной выше; внести изменения с учетом индивидуального задания. Для вывода аварийного сообщения используйте оператор Write(1,avaria) ! ***** ! РАСЧЕТ ЗАКОНЧЕН Delta = ABS(F–Sn) !модуль разности между частичной суммой Sn и функцией F Write(1,result) !вывод результатов End Program Pro1
Результаты работы Pro1 1. Файл Out.txt, в который выведены исходные данные (eps и x) и вычисленные значения F, Sn, n, Delta = ABS(F – Sn). Если Delta < eps, то результаты удовлетворительны. Соотношение Delta > eps означает, что ряд сходится, но не к ожидаемому значению. В этом случае следует проверить: − достижима ли задаваемая погрешность вычислений ε при использовании вещественных переменных типа Real. Возможно, следует использовать переменные типа Real*8; − рекуррентную формулу, алгоритм и программу. 2. Файлы An.txt, Sn.txt, F.txt с данными для графиков. Построив графики с помощью пакета AGrapher, убедитесь, что lim An = 0 , lim S n = sin(x) . n→∞ n →∞
Практикум по современному Фортрану
45 Программа Pro2, дополненная циклом по значениям аргумента х Для программы Pro2 создать проект, скопировать в него текст Pro1 для дальнейших изменений, которые следует проводить в два этапа. 1. Повторить суммирование для 10 – 15 значений x из [xm , xk] с шагом xh и вывести неформатированные результаты для каждого x Program Pro2 ! суммирование ряда для различных значений x . . . Real:: xm=-1.6, xk=1.6, xh=0.2 ! границы и шаг изменения х !!! Исключить открытие файлов для AGrapher и вывод в них Do x = xm, xk+xh/2, xh ! добавить цикл ! ***** Суммирование ряда для x выполнить как в Pro1 ! РАСЧЕТ ЗАКОНЧЕН Write(1,*) ’x=’, x, ’ F=’, F, ’ Sn=’, Sn, & ’n=’, n, ’ |F-Sn|=’, Delta ! вывод строки таблицы EndDo End Program Pro2
Проанализировать результаты, сравнив Delta и eps; если они удовлетворительны для всех значений x, перейти к следующему этапу. 2. Окончательная редакция программы с форматным выводом a) добавить операторы Format 5 Format(’Точность вычисления ряда ’,E7.1) 12 Format & (’|’,F6.1, 2(’ |’, F7.4), ’ |’, I7, 4x, ’ |’, e9.2, ’ |’)
b) провести вычисления, используя форматный вывод Write(1, 5) eps ! вывод значения методической погрешности Write(1,12)x, F, Sum, N, Delta ! вывод строки таблицы
c) «шапку» и «донышко» таблицы можно “нарисовать” в файле Out.txt, когда результаты уже выведены по формату из (a), а затем использовать их при составлении форматов Write(1,10) ! перед циклом по х вывод «шапки» таблицы Write(1,11) ! после цикла по х вывод «донышка» таблицы 10 Format& ! «шапка» таблицы (’+-------+---------+---------+-----------+----------+’/& ’| x | станд | Тейлор |Членов ряда| Разница |’/& ’+-------+---------+---------+-----------+----------+’) 11 Format& ! «донышко» таблицы (’+-------+---------+---------+-----------+----------+’)
Примечание. Выбор формата для вывода значений функции f(x) и суммы ряда определяется значением точности ε; например, при ε = 10–3 достаточно выводить эти значения с точностью до третьего десятичного знака, при ε = 10–5 – с точностью до пятого знака и т.д.
Практикум по современному Фортрану
46 Контрольные вопросы к защите работы 1. Что такое сходящийся ряд? Условие сходимости ряда (предел). Покажите на графике для своего задания. 2. При каком условии прекращается суммирование ряда в выбранном алгоритме? 3. Зачем в алгоритм введено ограничение количества членов ряда? Каковы возможные причины нарушения этого ограничения? Значения каких переменных помогут понять его причину? 4. Зачем нужна рекуррентная формула? 5. Зачем нужна проверка вычислений? Проверьте коэффициент рекурсии для своего варианта работы на примере элемента a11. 6. Что можно сказать о значении функции, вычисленном по стандартной программе, будет ли оно точным? Значения каких переменных вычисляются точно? 7. С какой целью в программах используют цикл do while? 8. С какой целью в программах используют оператор exit? 9. Напишите операторы, соответствующие выводу строки (символ «˜» означает пробел): «при˜х˜=˜0.05˜sin(x)˜=˜˜.85E-05» 10. Сократите запись формата Format (’|’, F12.7, ’|’, F12.7, ’|’, F12.7, ’|’)
11. Исправьте ошибку Real:: f integer:: n write (1, 7) f, n 7 Format (I6, 5x, ’|’, e11.4)
12. Как в программе Pro1 заменить цикл do while бесконечным циклом do? Приведите блок-схему и фрагмент программы. 13. Что меняется в результатах программы Pro2 при изменении значения точности ε, покажите на своих результатах. Объясните, почему. Пример контрольного задания 1.
Пример вывода формулы коэффициента рекурсии с проверкой для двух членов ряда (задача, аналогичная вариантам индивидуальных заданий).
2. Составьте блок-схему и напишите оператор do while для вывода в файл Out.txt значений a и b = a 2 − 2 , если начальное значение a = 8 и каждое следующее a равно половине предыдущего с противоположным знаком. Выполнение цикла прекратить при недопустимом значении a. a) a и b выводить по формату “E9.3” с названиями переменных. Практикум по современному Фортрану
47 b) Показать все выводимые строки с пробелами. c) Чему равно значение a после выхода из цикла?
3. Как будут выглядеть выведенные строки (покажите с пробелами)? На каком устройстве? Real:: f=2700000, z=-0.00017 write (*, 4) f, z write (*, 5) f, z 4 Format (F7.1) 5 Format (2E9.2)
4. Напишите оператор Format, соответствующий выводу строки (символ «˜» означает пробел): ˜:˜˜.68E-04˜:˜˜.75E-02˜:˜˜.13E-03˜: Варианты индивидуальных заданий Значения a0 и x0 рекомендуются для программы Pro1 Разложение функции в степенной ряд
№
1
⎛ nπ ⎞ n x cos ⎜a + ⎟ ∞ x 2 cos a 2⎠ ⎝ = cos a − x ⋅sin a− +K cos(x + a) = ∑ 2 ! n ! n =0
π⎞ ⎛ cos ⎜ α + ⎟ = − sin α 2⎠ ⎝
Примечание
3
4
x 2n x2 x4 x6 Ch x = ∑ =1+ + + +K 2! 4! 6! n = 0 ( 2 n)! ∞
ln e
∞ x +1 1 1 1 ⎛1 ⎞ 2 K = 2∑ = + + + ⎜ ⎟ 2 n +1 x −1 ⎝ x 3x 3 5 x 5 ⎠ n = 0 ( 2n + 1 )x
−x
x <∞ 0
π 2
a0 = 1.5 x0 = 1.5
Гиперболический косинус 2
Аргумент
( − 1 )n x n x2 x3 x4 = ∑ =1− x + − + −K 2! 3! 4! n! n=0 ∞
x <∞ х0 = 3.5
x >1 х0 = 1.4
x <∞ х0 = ±1.4
Ареа-косинус 1⋅ 3 ⋅ 5 ⋅K⋅ ( 2n − 1 ) = 2n n =1 2 ⋅ 4 ⋅ 6 ⋅ K⋅ 2n ⋅ 2n ⋅ x ∞
Arch x = ln2 x − ∑
5
1⋅ 3 1⋅ 3 ⋅ 5 ⎡ 1 ⎤ = ln2 x − ⎢ + + + K⎥ 2 4 6 ⎣2⋅ 2⋅ x 2⋅ 4⋅ 4⋅ x 2⋅ 4⋅6⋅6⋅ x ⎦ Примечание
(
x >1 х0 = 1.1
)
Archx = ln x + x2 −1 при x >1
Практикум по современному Фортрану
48 Разложение функции в степенной ряд
№
6
∞ 1⋅ 3⋅K⋅ ( 2n −1) ⋅ x2n+1 arcsin x = x + ∑ = n ( n ) K ⋅ ⋅ ⋅ ⋅ + 2 4 2 2 1 n=1
7
ln (x + 1 ) =
10
ln x = ∑
( − 1 ) n x n +1 x2 x3 x4 x = − + − +K ∑ n +1 2 3 4 n =0
(x − 1 ) n +1
n = 0 (n
+ 1 )x n +1
x − 1 (x − 1 ) 2 (x − 1 ) 3 = + + +K x 2x 2 3x 3 n +1
2 n +1
3
Ареа-синус ∞ 2!⋅x3 4!⋅ x5 6!⋅x7 ( −1) n⋅(2n)!⋅ x2n+1 Arshx = ∑ n 2 = x− + 2 2 − 3 2 +K 4⋅3 4 (2!) ⋅5 4 (3!) ⋅7 n=0 4 (n!) ⋅( 2n +1)
(
)
Arsh x = ln x + x2 +1
−1 < x ≤ 1 х0 = ±0.6
x>
1 2
х0 = 0.6
5
∞ π ( −1) x π x x +∑ = −x+ − +K 2 n=0 2n + 1 2 3 5 π arcctg x= − arctg x Примечание 2
Примечание 11
х0 = 0.8
∞
arcctg x =
9
x <1
x3 1⋅ 3⋅ x5 1⋅ 3⋅ 5⋅ x7 1⋅ 3⋅ 5⋅ 7 ⋅ x9 + + + =x+ +K 2 ⋅ 3 2 ⋅ 4 ⋅ 5 2 ⋅ 4 ⋅ 6 ⋅ 7 2 ⋅ 4 ⋅ 6 ⋅ 8⋅ 9
∞
8
Аргумент
x ≤1 х0 = ±0.7
x <1 х0 = 0.95
при x < 1
∞ ⎡ ⎤ x 2 n +1 x3 x5 x7 1+ x = 2∑ = 2⎢ x + + + +K ⎥ ln 1− x 3 5 7 n=0 2n + 1 ⎣ ⎦
nπ ⎞ ⎛ x n sin⎜ a + ⎟ x 2 sin a 2⎠ ⎝ sin(x + a) = ∑ = sin a + x⋅ cos a − +K 12 n! 2! n=0 π⎞ ⎛ sin ⎜α + ⎟ = cos α Примечание 2⎠ ⎝ ∞
x <1 х0 = 0.8
x <∞ 0
π 2
a0 = 1.5 x0 = 1.5
Ареа-тангенс 13
∞
∑
Arth x =
n=0
Примечание 14
e
x
=
∞
∑
n=0
x 2 n +1 x3 x5 x7 = x + + + +K 2n + 1 3 5 7 1 1+ x Arth x = ln при x <1 2 1− x
xn x2 x3 x4 =1+ x + + + +K 2! 3! 4! n!
x <1 х0 = 0.8
x <∞ х0 = ±1.4
Практикум по современному Фортрану
49 Разложение функции в степенной ряд
№
Гиперболический синус 15
x 2 n +1 x3 x5 x7 = x+ + + +K Sh x = ∑ 3! 5! 7! n = 0 ( 2 n + 1 )! ∞
16
⎡ x −1 (x −1)3 (x −1)5 ⎤ (x −1)2n+1 lnx = 2∑ 2 = + + + K ⎢ ⎥ 2n+1 3 5 n=0 ( 2n +1)(x +1) ⎣ x +1 3(x +1) 5(x +1) ⎦
17
∞ ( − 1 ) n +1 π π 1 1 1 = − + 2 − 5 +K arctg x = + ∑ 2 n +1 2 n = 0 ( 2n + 1 )x 2 x 3x 5x
18
2!⋅x3 4!⋅x5 π ∞ (2n)!x2n+1 6!⋅x7 π arccos x = − ∑ n 2 = − [ x+ + + +K ] 2 n=0 4 (n!) (2n +1) 2 4⋅ 3 42 (2!)2 5 43(3!)2 7
19
ln ( 1 − x) = − ∑
∞
∞
n =1
⎡ ⎤ x2 x3 x4 xn = −⎢x + + + +K ⎥ 2 3 4 n ⎣ ⎦
20
(x ⋅ ln a) n (x ⋅ ln a) 2 (x ⋅ ln a) 3 = 1 + x ⋅ln a + + +K a =∑ 2! 3! n! n =0
21
cos x =
∞
x
( − 1 )n x 2n x2 x4 x6 = − + − +K 1 ∑ ( 2 n) ! 2 ! 4 ! 6 ! n=0 ∞
( − 1 ) n x 2 n +1 x3 x5 x7 arctg x = ∑ = x− + − +K ( 2n + 1 ) 3 5 7 n=0 ∞
22
23
e−x
2
=
∞
( − 1 )n x 2n x4 x6 x8 2 = − + − + −K x 1 ∑ n ! 2 ! 3 ! 4 ! n=0
Аргумент
x <∞ х0 = 3.5
x> 0 х0 = 0.2
x >1 х0 = 1.2
x <1 х0 = 0.8
−1 ≤ x < 1 х0 = ±0.6
x <∞ a0 = 1.5 x0 = 3.5
x <∞ х0 = 2.5
x ≤1 х0 = 0.8
x <∞ х0 = 1.2
Ареа-косинус ∞
(2n)! = 2 2n n =1 4 (n !) ⋅ 2n ⋅ x
Arch x = ln2 x − ∑ 24
⎡ 2! ⎤ 4! 6! = ln2 x − ⎢ + 2 + 3 + K⎥ 2 2 2 4 6 ⎣ 4 ⋅ 2 ⋅ x 4 (2!) ⋅ 4 ⋅ x 4 (3!) ⋅ 6 ⋅ x ⎦ Примечание
(
x >1 х0 = 1.1
)
Archx = ln x + x2 −1 при x >1
(x − 1 ) 2 (x − 1 )3 ( − 1 ) n (x − 1 ) n +1 = (x − 1 ) − + +K ln x = ∑ 2 3 (n + 1 ) n =0 ∞
25
n
0 < x≤2 х0 = 0.3 х0 = 1.7
Практикум по современному Фортрану
50 Разложение функции в степенной ряд
№
( − 1 )n x 2n x2 x4 x6 =1− + − +K ∑ 3! 5! 7! n = 0 ( 2 n + 1 )! ∞
26
sin x = x
27
arctgx = −
1 1 π ∞ ( − 1 ) n +1 π 1 +∑ = − − + − +K 2 x 3x 3 5 x 5 2 n =0 ( 2n + 1 )x 2n +1
Аргумент
x <∞ Х0 = 4.5
x < −1 Х0 = 1.2
Ареа-котангенс 28
∞
1
1 1 1 + + +K 3 x 3x 5x5 1 1+ x Arcth x = ln при x >1 2 x −1
∑ ( 2 n + 1 ) x 2 n +1
Arcth x =
n=0
Примечание
=
x >1 Х0 = 1.3
Ареа-синус
( −1) n⋅1⋅ 3⋅K⋅ ( 2n −1) ⋅ x2n+1 Arsh x = x + ∑ 2⋅ 4⋅K⋅ 2n ⋅ ( 2n +1) n=1 ∞
29
=x−
3
5
x 1⋅ 3⋅ x 1⋅ 3⋅ 5⋅ x +K − + 2⋅ 3 2⋅ 4⋅ 5 2⋅ 4⋅ 6⋅ 7
(
Х0 = 0.95
)
Arsh x = ln x + x2 +1
Примечание
arcsin x = 30
x <1
7
∞
∑
n=0
при x < 1
( 2 n )! x 2 n + 1 = 2 n 4 ( n !) ( 2 n + 1 )
= x+
2 !⋅ x 4 !⋅ x 6 !⋅ x + 2 + 3 +K 2 2 4 ⋅3 4 ( 2 !) 5 4 ( 3 ! ) 7 3
5
7
x <1
1.6. Решение задач с одномерными массивами Задание 1. Написать программы Vector1 и Vector2, в каждой из которых: a) ввести 12 вещественных чисел из файла In.txt в одномерный массив и вывести этот массив в результирующий файл Out.txt ; b) дополнительные параметры, если они есть в варианте задания, ввести в диалоге с клавиатуры и вывести в файл Out.txt ; c) вычислить значения трех переменных, которые входят в состав выражения, и значение выражения ; d) по мере вычисления переменных и выражения выводить их значения в файл Out.txt, поясняя формулировками из индивидуального задания. 2. В программе Vector1 вычисления проводить, используя циклы по переменной (без встроенных функций для массивов). Практикум по современному Фортрану
51 3. В программе Vector2 те же значения вычислить без do с помощью встроенных функций для массивов и, если надо, оператора where. 4. Сравнить результаты работы программ Vector1 и Vector2. 5. Данные и результаты выводите в файл Out.txt только по формату. Содержание отчета 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Текст варианта индивидуального задания. 4. Единые блок-схемы каждой из программ Vector1 и Vector2. 5. Распечатки программ Vector1 и Vector2. 6. Распечатки файлов Out.txt программ Vector1 и Vector2
При подготовке к защите ответить на контрольные вопросы. Комментарии к заданию 1. Встроенные функции для массивов смотрите в разделе 6.2. 2. Формулы для вычисления средних значений – в разделе 7.4. 3. При подготовке исходных данных в файле In.txt воспользуйтесь текстовым редактором. Для отладки в файле подготовьте числа, значения которых соответствуют индивидуальному заданию - среди них должны быть числа отрицательные, положительные, большие D и так далее. 4. Если вычисление какой-либо переменной невозможно из-за отсутствия в массиве подходящих элементов, вывести соответствующее сообщение (смотри пример). 5. Все переменные, используемые как индексы элементов массива и счетчики, должны быть целого типа. 6. Имена переменных в программе не должны совпадать с именами встроенных функций.
1. 2. 3. 4.
Пример В массиве M из 12 вещественных чисел найти: A – среднее арифметическое отрицательных элементов, больших D (D <0, ввести с клавиатуры); B – номер минимального положительного элемента; C – среднее гармоническое ненулевых элементов с четными номерами; Z = A + B – C.
Далее приведены фрагменты блок-схем программ Vector1 и Vector2. Для отчета следует из фрагментов составить единые блок-схемы программ.
Практикум по современному Фортрану
52 Блок-схемы A – среднее арифметическое отрицательных элементов, больших D. Vector1: вычисление A с помощью цикла Notr = 0; A = 0;
да
- количество элементов - сумма элементов Конец цикла i = 1, 12 нет
D < M(i) < 0
Notr = Notr + 1 А = А + M(i)
нет
да
Notr > 0
Сообщение*
A = A / Notr
Vector2: вычисление A с помощью встроенных функций Notr = Count (M < 0. and. M > D) нет
Notr > 0
Сообщение*
да
A= Sum (M, mask = M < 0. and. M > D) A = A / Notr
* - сообщение: «В массиве нет отрицательных элементов, больших D»
B – номер минимального положительного элемента. Vector1: вычисление В с помощью циклов B = 0 - нет положительных элементов Конец цикла i = 1, 12 нет
M( i ) > 0 да B = i - номер первого элемента > 0
Exit нет
j = i +1, 12 нет
Конец цикла
B=0 да Сообщение**
0 < M (j) < M (B) да B =j
Практикум по современному Фортрану
53
Vector2: вычисление В с помощью встроенных функций B = Count ( M > 0 ) да
B=0
нет
Num = MinLoc (M, mask = M>0) (Num - одномерный целочисленный массив) B = Num(1)
Сообщение**
** - сообщение: «В массиве нет положительных элементов»
C – среднее гармоническое ненулевых элементов с четными номерами. Vector1: вычисление С с помощью цикла Cnt = 0 - количество ненулевых элементов С = 0 - сумма обратных величин i = 2, 12, 2
Конец цикла да
нет
M( i ) = 0 да
Cnt = Cnt + 1 С= С + 1 / M(i)
Cnt = 0 или С=0
Сообщение***
C = Cnt / С
Vector2: вычисление С с помощью встроенных функций C = 0; Cnt = 0; MasObr = 0 MasObr (1 : 6) - массив обратных величин элементов с четными номерами нет
Where (M(2:12:2) = 0)
MasObr = 1/M(2:12:2)
да Cnt = Count ( MasObr /= 0 ); С = Sum (MasObr) да Сообщение***
Cnt = 0 или C = 0
нет C = Cnt / С
*** - сообщение: «Все элементы массива с четными номерами равны 0»
Практикум по современному Фортрану
54 Программа Program Vector1 ! или Vector2 ! студент (фамилия, имя) группа № работа № вариант № Implicit None Real,dimension(1:12):: M Real,dimension(1:6) :: MasObr ! для программы Vector2 Real:: A, C, D, Z Integer B, i, Notr, Cnt Open(1,FILE=’In.txt’) ! файл с исходным массивом Open(2,FILE =’Out.txt’) ! результирующий файл Write(2,*) ’Программа Vector1’ ! или Vector2 Read(1,*)M ! ввод массива Write(2,10) M ! вывод массива в 2 колонки с заголовком для контроля Write(*,*) ’Input D < 0’ ! диалог для ввода значения D <0 Read(*,*) D Write(2,14) ’D =’, D, ’- должно быть отрицательным’
! ***** По блок-схемам, составленным с учетом индивидуального задания, написать операторы программы Vector1 (или Vector2) для вычисления и форматного вывода трех переменных и результирующего выражения. Выводить значения переменных по мере их вычисления, поясняя формулировками из индивидуального задания. Пример оператора Where для программы Vector2: MasObr=0; Where(M(2:12:2)==0) MasObr=1/M(2:12:2)
! ***** End Program Vector1
!
или Vector2
Результаты программ Vector1 и Vector2 Содержимое файла Out.txt в результате работы программ Vector1 или Vector2 для приведенного примера задания:
Программа Vector1 (или Vector2) Исходный массив ⋅ ⋅ ⋅ 6 строк в 2 колонки с исходным массивом D = -12.00 - должно быть отрицательным A = -17.05 - среднее арифметическое элементов D<M<0 B = 10 - номер минимального положительного элемента C = 25.13 - средне гармоническое элементов с нечетными номерами Z =
34.77 = A + B – C
Контрольные вопросы к защите работы 1. Что в программировании называют массивом? 2. Приведите характеристики одномерного массива. 3. Примеры описания одномерного массива, диапазон индекса. Что объявлено в программе? Real C(7), D(7), B(-7:0), U(0:7) Как лучше описать тип и форму этих массивов в Фортран-90? Допустим ли оператор присваивания Практикум по современному Фортрану
55 U = cos(C**2)- 3*B ? 4. Как для массива real, dimension(1:12):: A с помощью триплетов задать секции: − из всех элементов массива в обратном порядке? − из последних 8 элементов массива? − из первой трети массива? − из элементов массива с нечетными номерами? 5. Как работает оператор where? Приведите примеры оператора where а) без блока; в) с одним блоком; с) с двумя блоками. 6. Назовите семь фунций редукции массива и укажите особенности их применения к одномерным массивам. 7. Назовите четыре функции для работы с минимумами и максимумами в массиве с примерами для одномерных массивов. 8. Назовите функции редукции, возвращающие значение логического типа. Как оно формируется? 9. У каких функций редукции нет аргумента Array? 10. Что получим в результате применения функций редукции к одномерным массивам, насколько актуален аргумент dim? 11. В программе объявлен массив: Real, dimension(1:10):: A Что произойдет при выполнении каждого из операторов? Read(1,*) A(10) Write(*,*) A(10) Read(*,*) A(11) Write(*,*) A(11) Write(*,11) A(8:10) Напишите оператор format для последнего оператора Write. Напишите форматный вывод пяти последних элементов массива A. Пример контрольного задания
1. Дан массив из 20 элементов. С использованием циклов написать программу вычисления переменной (аналогичные задачи смотрите в вариантах заданий). Блок-схема обязательна. Вывести по формату исходный массив и результирующее значение. 2. Решить аналогичную задачу с помощью встроенных функций. 3. В программе используется вещественный массив из 100 элементов. Напишите операторы для вывода элементов массива в виде: a) заголовок «Исходный массив»; b) элементы массива по четыре в строке.
Практикум по современному Фортрану
56 4. В файле data.txt – 12 чисел натурального ряда. Как будут выглядеть выведенные на экран строки (с пробелами)? Program ReWriter Integer, dimension(1:12):: Mas = 0 Open(1,file = ’data.txt’) Read(1,*) Mas(3), Mas(5); Write(*,11) Mas(3:5) 11 Format (I4) End Program ReWriter
Варианты индивидуальных заданий №
Выражение
1
A B+ C +1
2
R+Q+S R⋅Q⋅S + 2
R – произведение положительных элементов с нечетными номерами; Q – последний положительный элемент с четным номером; S – среднее гармоническое положительных элементов.
3
E ⎞ ⎛ ⎜H + ⎟G H + 1⎠ ⎝
H – количество нулей среди N последних элементов; E – номер минимального элемента; G – среднее квадратичное элементов с четными номерами.
4
U+
Определение переменных A – сумма отрицательных элементов с четными номерами; B – максимальный элемент среди N первых элементов; C – среднее геометрическое положительных элементов.
1 S – сумма положительных элементов, меньших D; S + T + 1 T – минимальный по модулю ненулевой элемент (со знаком); U – среднее арифметическое N первых элементов.
5
X Z+ 10 + Y
X – количество элементов со значениями из интервала [A, B]; Y – модуль минимального элемента; Z – среднее арифметическое элементов с нечетными номерами.
6
U +S R +1
U – произведение элементов с четными номерами; R – номер максимального по модулю элемента; S – среднее арифметическое N последних элементов.
7
A⋅ B C+2
8
R +S Q +1
9
H +G (E + 1)(H + 1)
A – произведение ненулевых элементов; B – последний отрицательный элемент с нечетным номером; C – среднее арифметическое положительных элементов. R – сумма всех элементов; Q – номер первого нулевого элемента; S – среднее геометрическое положительных среди N последних элементов. H – сумма положительных среди N первых элементов; E – номер первого отрицательного элемента; G – среднее арифметическое отрицательных элементов.
Практикум по современному Фортрану
57 №
Выражение
10
X Y+ 10 + Z
Определение переменных X – количество элементов, меньших D, с нечетными номерами; Y – максимальный по модулю элемент (со знаком); Z – среднее квадратичное положительных элементов. A – произведение положительных элементов;
A+ B B – последний положительный элемент с четным номером; 11 C + A ⋅ B + 1 C – среднее квадратичное N первых элементов. 12
13
T ⋅V + U U +1
V – сумма отрицательных элементов, больших D, (D<0) ; T – номер максимального элемента; U – среднее геометрическое положительных среди N первых элементов.
(U+T) (S+2)
S – сумма модулей отрицательных элементов; T – номер минимального по модулю ненулевого элемента; U – среднее квадратичное N последних элементов.
H +G 14 (E + 1)(H + 1)
15
X +Z Y +2
16
A B+ C +1
17
C+
H – произведение модулей отрицательных элементов; E – номер последнего положительного элемента: G – среднее арифметическое элементов с четными номерами. X – сумма элементов, больших D, с четными номерами; Y – номер максимального отрицательного элемента; Z – среднее квадратичное всех элементов. A – среднее гармоническое отрицательных элементов; B – номер второго нулевого элемента; C – количество отрицательных элементов с четными номерами.
A – сумма положительных элементов; A B + 10 10 + A B – номер минимального положительного элемента; C – среднее гармоническое ненулевых элементов.
18
X +Z Y +2
X – количество положительных элементов с четными номерами; Y – номер последнего нулевого элемента: Z – среднее гармоническое ненулевых элементов, больших D.
19
A⋅ B C+2
A – произведение отрицательных элементов; B – максимальный по модулю элемент (со знаком); C – среднее арифметическое модулей отрицательных элементов.
E ⎞ ⎛ ⎟G 20 ⎜ H + H + 1⎠ ⎝
21
U+
H – количество отрицательных элементов; E – минимальный элемент среди N последних элементов; G – среднее квадратичное элементов с четными номерами.
S – количество положительных элементов; 1 S + T + 1 T – минимальный положительный элемент; U – среднее арифметическое элементов.
Практикум по современному Фортрану
58 №
Выражение
22 C +
A B + 10 10 + A
Определение переменных A – первый положительный элемент с четным номером; B – сумма элементов с нечетными номерами; C – среднее гармоническое ненулевых среди N первых элементов.
23
U +S R +1
U – произведение ненулевых среди N первых элементов; R – номер максимального по модулю элемента; S – среднее геометрическое положительных элементов.
24
R +S Q +1
R – максимальный элемент с четным номером; Q – количество ненулевых элементов; S – среднее гармоническое положительных элементов.
25
(U+T) (S+2)
S – сумма N последних элементов; T – максимальный отрицательный элемент; U – среднее квадратичное элементов с четными номерами. A – количество элементов, больших D;
A+ B B – первый положительный элемент с четным номером; 26 C + A ⋅ B + 1 C – среднее арифметическое N первых элементов. 27
H +1 (C + 2 )E
H – сумма элементов со значениями из интервала [A, B]; E – последний положительный элемент с четным номером; C – среднее арифметическое положительных элементов.
28
(H + E ) ⋅ C (E + C + 4 )
H – произведение элементов со значениями из интервала [A, B]; E – номер минимального по модулю ненулевого элемента; C – среднее геометрическое положительных среди N последних элементов.
29
R+Q+S R⋅Q⋅S + 2
R 30 + U+T R +1
R – количество элементов, меньших D; Q – модуль минимального элемента; S – среднее квадратичное положительных элементов. U – минимальный элемент с номером из интервала [K, L]; T – среднее арифметическое элементов с нечетными номерами. R – количество нулей среди N последних элементов.
1.7. Решение задач с двумерными массивами Задание 1. Написать программу, которая: a) вводит из файла In.txt на диске количество строк и столбцов матрицы, вводит матрицу в динамический массив; b) выводит по формату матрицу A с заголовком в файл Out.txt ; c) вводит с клавиатуры дополнительные параметры, если они есть в варианте индивидуального задания; Практикум по современному Фортрану
59 d) выполняет первую часть индивидуального задания, используя вложенные циклы (встроенными функциями для массивов не пользоваться); e) выполняет вторую часть индивидуального задания с использованием встроенных функций для массивов; f) выводит по формату результаты работы программы, поясняя смысл каждого значения формулировками из индивидуального задания. 2. Дополнить программу внешним циклом, в котором последовательно ввести матрицы разных размеров, и выполнить для каждой из них индивидуальное задание. Содержание отчета 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Текст варианта индивидуального задания. 4. Блок-схема программы. 5. Распечатка текста программы. 6. Распечатка файла результатов Out.txt.
При подготовке к защите ответить на контрольные вопросы. Комментарии к заданию 1. Встроенные функции для массивов смотрите в разделе 6.2. 2. Формулы для вычисления средних значений – в разделе 7.4. 3. Каждую матрицу готовить в файле In.txt следующим образом: a) M, N (M и N – количество строк и столбцов матрицы ); b) матрица, содержащая M строк и N столбцов. Далее пункты a) и b) повторяются для каждой следующей матрицы. 4. Рекомендуется выбрать M ≤ 10 и N ≤ 10 и для контроля вывести М и N в файл результатов Out.txt. Справочная информация 1. Размещение двумерного массива в памяти компьютера В Фортране принято, что элементы двумерного массива размещаются в линейной памяти компьютера по столбцам, то есть первый индекс массива ⎧a11 a12 a13 ⎫ изменяется быстрее. Например, матрица ⎨ a a a ⎬ размещается в ⎩ 21 22 23 ⎭
массиве A(1:2, 1:3) в следующем порядке: {a11a21 a12a22 a13a23}. Для матрицы, подготовленной, как в математике – по строкам {a11a12a13 a21a22a23}, чтение Read(1,*) A приведет к ошибочному размещению {a11a12
Практикум по современному Фортрану
60 a13a21 a22a23}. Оператор Write(2,*) A выводит массив в порядке размещения его в памяти, то есть по столбцам {a11a21a12 a22a13a23}. Внимание! Последовательность операторов Read(1,*) A; Write(2,*) A приведет к получению при выводе правильной матрицы, хотя из-за неправильного размещения массива в памяти результаты работы программы будут неожиданными. 2. Ввод и вывод двумерного массива Для ввода матрицы по строкам следует изменять индексы элементов массива, как показано ниже (ввод без формата) Integer:: M=2, N=3, str, stlb ! M строк, N столбцов Real, dimension(1:M,1:N):: A ! циклы по секциям-строкам Read(1,*)(A(str,1:N),str=1,M) ! или (диапазон индекса столбца по умолчанию) Read(1,*)(A(str,:),str=1,M) ! или вложенные неявные циклы Read(1,*)((A(str,stlb),stlb=1,N),str=1,M) Вывод матрицы по строкам аналогичен, но обязательно по формату. Повторитель в операторе Format равен длине строки матрицы: Write(2,1)(A(str,:),str=1,M) 1 format(‘Матрица’/3(f5.1)) !повторитель – константа ! или 1 format(‘Матрица’/ (f5.1)) ! N значений в строке В угловых скобках в качестве повторителя – целочисленная переменная или выражение. 3. Динамические массивы Размер статического массива не может быть изменен в процессе вычислений, что не всегда удобно при решении задач. Этого неудобства можно избежать, применяя динамические массивы. Работа с динамическим массивом требует (смотри пример программы): a) описать динамический массив с атрибутом Allocatable, указывая количество измерений и не указывая размеров; b) определить размер массива оператором ввода или присваивания (для двумерного массива – количество строк и столбцов, для одномерного – количество элементов); c) разместить массив в памяти оператором Allocate; d) выполнить действия с массивом; e) освободить память оператором Deallocate.
Практикум по современному Фортрану
61 Пример 1. В каждой строке целочисленной матрицы найти первый элемент, не равный нулю, и изменить его знак. Вывести исходную матрицу, координаты найденных в каждой строке элементов и результирующую матрицу. Если в строке все элементы равны нулю, вывести сообщение с номером этой строки. 2. Составить и вывести одномерный массив из сумм отрицательных элементов каждого столбца преобразованной матрицы. Блок-схема алгоритма Часть I цикл по строкам i = 1, M
Конец цикла
Num = 0 - Номер первого ненулевого элемента строки Конец цикла
цикл по столбцам j = 1, N
Exit Num = 0 да Сообщение*
да
A(i, j) = 0 нет Num = j
Вывод матрицы A
нет A(i, Num) = - A(i, Num) ** - вывод i, Num Часть II
B = Sum (A, dim = 1, mask = A < 0) Вывод массива B
* — «В строке i все элементы равны 0» ** — «Координаты первого ненулевого элемента строки = [i, Num]» Программа Program Matrix ! студент (фамилия, имя) группа № работа № вариант № Implicit None Integer, Allocatable, dimension(:,:):: A ! динамическая матрица Integer, Allocatable, dimension(:):: B ! динамический массив
Практикум по современному Фортрану
62 Integer M, N Integer i, j
! размеры матрицы по измерениям ! переменные циклов
Open(1,FILE=’In.txt’) ! файл с исходной матрицей Open(2,FILE=’Out.txt’) ! результирующий файл Read(1,*)M,N ! ввод размеров (строк-M, столбцов-N) Allocate(A(1:M,1:N),B(1:N))! размещение динамических массивов в памяти ! ввод массива Read(1,*)(A(i,:),i=1,M) ! неявный цикл по секциям-строкам матрицы
! *****
По блок-схеме, составленной для индивидуального задания, написать операторы программы. Не забудьте добавить необходимые описания переменных и массивов.
! ***** Deallocate(A)! освобождение динамической памяти End Program Matrix
Результаты работы программы Содержимое файла Out.txt для приведенного примера задания (одна матрица): В исходной матрице 3 строки и 5 столбцов Исходная матрица 0 -123 -33 12 -5 0 0 0 0 0 0 0 12 0 1 Координаты первого ненулевого элемента строки = [ 1, 2] В строке 2 все элементы равны 0 Координаты первого ненулевого элемента строки = [ 3, 3] Преобразованная матрица 0 123 -33 12 -5 0 0 0 0 0 0 0 -12 0 1 Массив B – суммы отрицательных элементов столбцов 0 0 -45 0 -5
Контрольные вопросы к защите работы 1. Что такое двумерный массив? Его аналоги в математике на примере двух массивов. Описание двумерных массивов в Fortran 90, диапазон индекса. 2. Форма – основная характеристика массива, напишите примеры конформных (одинаковых по форме) массивов. 3. Укажите порядок размещения элементов двумерных массивов в памяти компьютера. Приведите пример. 4. В программе объявлен двумерный массив A(12,12). Как его описать в Fortran 90? Как записать в программе ссылку: а) на полный массив, б) на секцию массива, в) на элемент массива?
Практикум по современному Фортрану
63 5. Допустим ли оператор присваивания применительно к объявленным массивам? Почему? Real A(2, -3:3), B(0:1, 0:6), C(-2:-1, 1:7) A = cos(B**2)- 3*C 6. Поясните правила записи выражений в операторах присваивания с массивами на примерах. 7. Как работает оператор where? Приведите примеры оператора where а) без блока; в) с одним блоком; с) с двумя блоками. 8. Назовите 4 функции для работы с минимумами и максимумами в массиве; приведите примеры для двумерных массивов. 9. Назовите 7 фунций редукции массива и приведите три примера их примененения к двумерным массивам. 10. Каковы тип и форма результата для функций редукции при работе с двумерным массивом ? 11. Что произойдет при выполнении оператора Read? Real, dimension(1:12, 1:12) A Read(1,*) A(1, 12) 12. Как ввести первую строку массива, объявленного оператором Real, dimension(1:20, 1:12):: A? 13. Как вывести вторую строку массива, объявленного оператором Real, dimension(1:20, 1:12):: A? 14. Что будет выведено при выполнении оператора Write? Real, dimension(1:12, 1:12):: A Write(*,*) A(12,12) 15. Что и как будет выведено при выполнении оператора Write? Real, dimension(1:12, 1:12):: A Write(*,11) A(10:12, 10:12) 11 Format(F10.2) Пример контрольного задания 1. С использованием циклов решить задачу, аналогичную заданиям I из вариантов заданий. Составить блок-схему и написать программу. Вывести найденное значение по формату.
2. С помощью встроенных функций решить задачу, аналогичную заданиям II из вариантов заданий. 3. Записать операторы для вывода элементов правой нижней четверти матрицы. Массив объявлен оператором: Real, dimension(1:8, 1:10):: A 4. В файле data.txt подготовлены данные в виде целочисленной матрицы 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 Практикум по современному Фортрану
64 Что будет выведено на экран монитора (с пробелами) в результате работы программы, если добавить вывод массива? Program podvoh Integer, dimension(3,5):: Mas = 0 Open(1,file = ’data.txt’) Read(1,*) Mas(2, 1:5:2) ! добавьте вывод всего массива по формату End Program podvoh
Варианты индивидуальных заданий По умолчанию все массивы вещественные и обе части задания выполняются для одной и той же матрицы. Вариант 1
I. Сформировать одномерный массив из элементов, расположенных по «периметру» матрицы (элементы первой и последней строк и первого и последнего столбца). Элементы «периметра» выбирать по часовой стрелке, начиная с верхнего левого элемента (элемента a11). Вывести сформированный одномерный массив. II. Составить и вывести одномерный массив из средних квадратичных значений элементов каждого столбца матрицы. Вариант 2
I. Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен сумме элементов матрицы А из области, определяемой индексами i,k в соответствии с рисунком. Вывести результирующую матрицу. II. Составить и вывести одномерный массив из сумм положительных элементов с четными номерами строк в каждом столбце матрицы A. Вариант 3
I. Если сумма положительных элементов матрицы больше произведения модулей ее отрицательных элементов, сформировать одномерный массив из положительных элементов матрицы, иначе массив формировать из ее отрицательных элементов. При формировании одномерного массива матрицу просматривать построчно. Вывести: ° вычисленные значения суммы и произведения; ° полученный одномерный массив. II. Составить и вывести одномерный массив из максимальных отрицательных элементов среди второй половины каждой строки матрицы. Если таких элементов в строке нет, соответствующий элемент одномерного массива должен быть равен 0.
Практикум по современному Фортрану
65 Вариант 4
I. Отобрать в матрицу B только те строки матрицы A, элементы которых расположены в порядке возрастания. Если в матрице A таких строк нет, вывести сообщение, иначе вывести: ° номера строк матрицы A, помещенных в матрицу B; ° полученную матрицу B. II. Найти и вывести сумму положительных элементов матрицы A с двумя нечетными индексами. Вариант 5
I. В каждой строке матрицы каждый отрицательный элемент, расположенный между двумя положительными, заменить их полусуммой. Вывести преобразованную матрицу. II. Найти значение максимального элемента из заштрихованной части преобразованной матрицы и вывести это значение и координаты его в матрице. Границы заштрихованной части выберите сами. Вариант 6
I. Записать в одномерный массив максимальные отрицательные элементы каждой строки матрицы. Для строк матрицы, не содержащих отрицательных элементов, в результирующий массив записать 0. Вывести полученный одномерный массив. II. Составить и вывести одномерный массив из средних квадратичных значений элементов с четными номерами строк в каждом столбце матрицы. Вариант 7
I. Найти среднее арифметическое значение максимальных по модулю элементов строк матрицы. Вывести: ° значения максимальных по модулю элементов строк (со знаком); ° полученное значение. II. Составить и вывести одномерный массив из количеств элементов со значениями в интервале [C, D] в каждой строке матрицы. Вариант 8
I. В каждом столбце целочисленной матрицы подсчитать сумму положительных элементов с четными значениями и записать ее в одномерный массив. Вывести полученный массив. II. Составить и вывести одномерный массив из минимальных положительных элементов среди первой половины каждого столбца матрицы. Если таких элементов в столбце нет, соответствующий элемент одномерного массива должен быть равен 0. Практикум по современному Фортрану
66 Вариант 9
I. Вычислить среднее арифметическое значение элементов каждого столбца матрицы без учета минимального и максимального элементов этого столбца; записать это значение в одномерный массив. Вывести: ° значения минимума и максимума столбцов; ° полученный одномерный массив. II. Составить и вывести одномерный массив из сумм элементов со значениями из интервала [C, D] в каждом столбце матрицы. Вариант 10
I. Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен сумме элементов матрицы А из области, определяемой индексами i,k в соответствии с рисунком. Вывести результирующую матрицу. II. Найти и вывести среднее геометрическое положительных элементов матрицы А с двумя четными индексами. Если таких элементов в матрице нет, вывести сообщение. Вариант 11
I. Преобразовать целочисленную матрицу, удалив из нее строки, содержащие нулевые элементы, и сдвинув оставшиеся строки. Если нулевых элементов в матрице нет, вывести сообщение. Вывести: ° номера удаленных строк или сообщение; ° преобразованную матрицу. II. Составить и вывести одномерный массив из максимальных отрицательных элементов каждого столбца преобразованной матрицы. Если отрицательных элементов в столбце нет, соответствующий элемент одномерного массива должен быть равен 0. Вариант 12
I. Преобразовать целочисленную матрицу, переставив на первое место столбец с наибольшим количеством нулей (сдвинуть остальные столбцы). При отсутствии в матрице нулевых элементов вывести сообщение, иначе вывести преобразованную матрицу. II. Найти значение минимального ненулевого элемента
в заштрихованной части преобразованной матрицы и вывести это значение и его координаты в матрице. Границы заштрихованной части выберите сами. Если таких элементов в матрице нет, вывести сообщение.
Практикум по современному Фортрану
67 Вариант 13
I. Сформировать и вывести квадратную матрицу B из элементов квадратной матрицы А. Каждый элемент bik должен быть равен сумме элементов матрицы А из области, определяемой индексами i,k в соответствии с рисунком. II. Составить и вывести одномерный массив из количеств элементов, меньших D, с четными номерами строк в каждом столбце матрицы А. Вариант 14
I. Если модуль суммы отрицательных элементов целочисленной матрицы больше суммы ее положительных элементов, сформировать одномерный массив из первых элементов строк матрицы, иначе массив формируется из последних элементов строк матрицы. Если в матрице нет положительных или отрицательных элементов, вывести сообщение, иначе вывести: ° суммы отрицательных и положительных элементов матрицы; ° результирующий массив. II. Найти и вывести координаты и значение максимального элемента матрицы с двумя четными индексами. Вариант 15
I. Найти максимальный и минимальный по модулю ненулевые элементы матрицы и поменять их местами. Вывести: ° координаты найденных элементов; ° преобразованную матрицу. II. Составить и вывести одномерный массив из произведений ненулевых элементов с нечетными номерами столбцов в каждой строке преобразованной матрицы. Если таких элементов в строке нет, соответствующий элемент одномерного массива должен быть равен 0. Вариант 16
I. Записать в одномерный массив столбец матрицы с максимальным количеством отрицательных элементов. При отсутствии отрицательных элементов в матрице вывести сообщение. Вывести: ° количество отрицательных элементов в столбцах или сообщение; ° результирующий одномерный массив. II. Составить и вывести одномерный массив из сумм квадратов отрицательных элементов каждой строки матрицы. Если отрицательных элементов в строке нет, соответствующий элемент одномерного массива должен быть равен 0.
Практикум по современному Фортрану
68 Вариант 17
I. Если в каждой строке целочисленной матрицы А есть равный нулю элемент, то сформировать матрицу B из строк матрицы А с четными номерами, иначе - из ее строк с нечетными номерами. Вывести: ° номера строк, в которых нет нулей; ° полученную матрицу. II. Составить и вывести одномерный массив из количеств отрицательных элементов с четными номерами столбцов в каждой строке матрицы А. Вариант 18
I. Заменить максимальный элемент матрицы A средним арифметическим его соседей. Соседями элемента aij в матрице считать элементы ai-1,j , ai+1,j , ai,j-1 , ai,j+1 .Следует учесть, что в зависимости от положения элемента aij в матрице у него может быть 2, 3 или 4 соседа. Вывести: ° координаты и значение максимального элемента матрицы; ° преобразованную матрицу. II. Найти и вывести количество ненулевых элементов преобразованной матрицы с двумя нечетными индексами. Вариант 19
I. Назовем допустимым преобразованием матрицы перестановку двух строк или двух столбцов. С помощью допустимых преобразований добиться того, чтобы наибольший по модулю элемент матрицы располагался в ее левом верхнем углу. Вывести преобразованную матрицу после каждой перестановки (строки или столбца). II. Составить и вывести одномерный массив из средних арифметических значений элементов с нечетными индексами столбцов в каждой строке преобразованной матрицы. Вариант 20
I. Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен максимальному элементу матрицы А из области, определяемой индексами i,k в соответствии с рисунком. Вывести результирующую матрицу. II. Составить и вывести одномерный массив из минимальных модулей ненулевых элементов каждой строки матрицы A. Если в строке все элементы равны 0, соответствующий элемент одномерного массива должен быть равен 0.
Практикум по современному Фортрану
69 Вариант 21
I. Найти координаты и значение максимума из минимальных элементов каждого столбца матрицы. Вывести: ° координаты минимальных элементов столбцов; ° координаты и значение максимума. II. Составить и вывести одномерный массив из произведений ненулевых элементов каждого столбца матрицы. Если в столбце все элементы равны 0, соответствующий элемент одномерного массива должен быть равен 0. Вариант 22
I. Найти минимальный по модулю ненулевой элемент в каждой строке квадратной матрицы и поменять его местами с элементом этой же строки, находящимся на побочной диагонали матрицы. Вывести: ° координаты найденных в строках элементов; ° преобразованную матрицу. II. Найти и вывести координаты максимального элемента со значением в интервале [C, D] в преобразованной матрице. Если таких элементов в матрице нет, вывести сообщение. Вариант 23
I. Записать в одномерный массив модули разности первого и последнего отрицательных элементов каждого столбца матрицы. Для столбцов, содержащих менее двух отрицательных элементов, в результирующий массив записать (-1) и вывести сообщение. Вывести: ° для каждого столбца – значения первого и последнего отрицательных элементов или сообщение; ° полученный одномерный массив. II. Составить и вывести одномерный массив из максимальных модулей элементов каждой строки матрицы. Вариант 24
I. Сформировать матрицу B из элементов матрицы А. Каждый элемент bik должен быть равен максимальному элементу матрицы А из области, определяемой индексами i,k в соответствии с рисунком. Вывести результирующую матрицу. II. Составить и вывести одномерный массив из минимальных положительных элементов с четными индексами столбцов в каждой строке матрицы A. Если таких элементов в строке нет, соответствующий элемент одномерного массива должен быть равен 0. Практикум по современному Фортрану
70 Вариант 25
I. Поменять местами первый и второй положительные элементы в каждом столбце матрицы. Для столбцов матрицы, содержащих менее двух положительных элементов, вывести сообщение. Вывести: ° координаты элементов, найденных в каждом столбце; ° преобразованную матрицу. II. Составить и вывести одномерный массив из сумм отрицательных элементов каждой строки преобразованной матрицы. Вариант 26
I. Удалить из целочисленной матрицы строки и столбцы, заполненные нулями (оставшиеся строки и столбцы сдвинуть). Вывести результирующую матрицу после каждого удаления (строк или столбцов). II. Найти и вывести произведение ненулевых элементов матрицы со значениями в интервале [C, D]. Если таких элементов в матрице нет, вывести сообщение. Вариант 27
I. Рассматривая построчно целочисленную матрицу А, сформировать три одномерных массива, поместив в массив В - четные элементы, в массив С - элементы, кратные 3, в массив D - элементы, кратные 5. Возможна запись элемента в два или три массива. Вывести полученные одномерные массивы. II. Найти и вывести сумму отрицательных элементов матрицы с двумя четными индексами. Вариант 28
I. Сформировать квадратную матрицу B из элементов квадратной матрицы А. Каждый элемент bik должен быть равен максимальному элементу матрицы А из области, определяемой индексами i,k в соответствии с рисунком. Вывести результирующую матрицу. II. Найти и вывести сумму отрицательных элементов матрицы, больших D (D < 0). Если таких элементов в матрице нет, вывести сообщение. Вариант 29
I. В каждом столбце целочисленной матрицы найти количество рядом стоящих пар одинаковых элементов. Результаты записать в одномерный массив. Вывести полученный массив. II. Составить и вывести одномерный массив из сумм последних K элементов каждой строки матрицы. (K меньше числа элементов в строке матрицы). Практикум по современному Фортрану
71 Вариант 30
I. Умножить матрицу A на вектор B. Произведением матрицы A(M, N) и вектора B(N) является вектор C(M), каждый элемент которого вычисn
ляется по формуле c j = ∑ a jk ⋅ bk . Вывести полученный массив. k =1
II. Найти и вывести координаты и значение минимального элемента матрицы. При поиске минимума исключить из рассмотрения первую и последнюю строки и первый и последний столбцы. 1.8. Решение задач с использованием функций Задание 1. Составить функцию в соответствии с индивидуальным заданием. В алгоритме функции использовать циклы (встроенными функциями для массивов не пользоваться). 2. Написать главную программу, которая должна содержать интерфейс с правилами применения функции и выполнять следующие действия: a) ввод данных из файла In.txt на диске и форматный вывод их в результирующий файл Out.txt; b) вызовы функции с различными данными; c) форматный вывод в файл Out.txt результатов работы функции с пояснениями каждого значения формулировками из индивидуального задания; d) если возможно, проверку результатов работы функций обращением к стандартным функциям; e) обработку результатов, полученных в функции, в соответствии с индивидуальным заданием на главную программу и форматный их вывод в файл Out.txt с пояснениями. Содержание отчета 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Текст варианта индивидуального задания. 4. Блок-схемы функции и главной программы. 5. Распечатка текста программы. 6. Распечатка файла результатов Out.txt. При подготовке к защите ответить на контрольные вопросы. Справочная информация Функции для определения размеров массивов смотрите в разделе 6.4. Практикум по современному Фортрану
72 Комментарии к заданию 1. Приступая к выполнению задания, внимательно прочтите раздел 5. 2. В составе данного проекта две независимые программные единицы – главная программа и функция, каждая с собственной системой обозначений объектов. 3. Правила применения функции должны быть описаны в главной программе в операторе Interface. 4. Функция – это процедура, вызываемая из выражения по имени. 5. Данные передаются сопоставлением аргументов – фактических в главной программе и формальных в вызываемой функции. 6. Аргументы функции по назначению – только входные, единственный результат связан с именем функции. 7. Количество фактических и формальных аргументов должно совпадать. Кроме того, попарно в порядке следования фактические и формальные аргументы должны соответствовать по типу, назначению и форме. Совпадение имен фактических и формальных аргументов не требуется, но и не запрещается. Пример В функции: вычислить среднее арифметическое значение N последних элементов одномерного вещественного массива. В главной программе: вызвав функцию, вычислить среднее значение 5 последних элементов вещественного массива из 10 элементов. Программа Real Function Primer(Array, N) Integer, Intent(In) :: N Real, Intent(In), Dimension(:) :: Array Integer Len ! локальная переменная Len = Size(Array) ... ! операторы, реализующие алгоритм функции Primer = ... ! результирующее значение End Function Program Main ! Главная программа – Interface и вызов функции Implicit None Interface Real Function Primer(Array, N) Integer, Intent(In) :: N Real, Intent(In), Dimension(:) :: Array End Function End Interface Real Result Real Dimension(1:10) :: Mas ... ! ввод и вывод исходных данных
Практикум по современному Фортрану
73 Result=Primer(Mas,5) ! вызов функции; Mas, 5 – фактические аргументы ! вывод результатов ... End
Результаты работы программы в файле Out.txt Исходный массив 2.75 -12.88 0.12 -0.09 99.55 33.77 1.11 -4.66 3.00 2.99 Среднее арифметическое 5 последних элементов 7.242
Контрольные вопросы к защите работы 1. Что такое процедура? Когда целесообразно использование процедур? Сколько разновидностей процедур в Фортане? 2. Назовите четыре вида программных единиц в Фортране. 3. Что такое встроенная функция, операторная функция и процедурафункция? Чем они отличаются? Приведите примеры. 4. Как вызывают функцию? 5. Каковы основные атрибуты функции? 6. Передача данных между вызывающей и вызываемой программами. Что такое формальные и фактические аргументы? Приведите примеры. 7. Поясните примерами правила согласования формальных и фактических аргументов. 8. Как результат функции передается в вызывающую программу? 9. Атрибут Intent. Какими по назначению могут быть формальные аргументы функции? Приведите примеры. 10. Приведите пример описания интерфейса функции. Где и для чего используются интерфейсы? Когда интерфейс обязателен? Пример контрольного задания
1. В функции: вычислить сумму элементов, расположенных ниже главной диагонали квадратной вещественной матрицы. В главной программе: применить функцию к матрице размером 8×8. Вывести результат с точностью до четвертого десятичного знака. 2. Напишите интерфейс функции Radius, которая находит радиус окружности, проходящей через три точки, заданные своими координатами. Определите формальные аргументы. Покажите, как использовать эту функцию для трех точек: A (3.7, 6.1), В (12.6, 2.11) и С (11.5, 8.2)?
Практикум по современному Фортрану
74 3. В вещественном массиве обнулить элементы, синус которых превышает 0.5 (с оператором where). Как получить тот же результат без использования оператора where? 4. Исправьте ошибку
Real, dimension(7,4):: А write(*,10) ’Массив’,(A(I,:), I=1,4) 10 Format(a/(4F10.2))
Варианты индивидуальных заданий По умолчанию все массивы вещественные. Вариант 1
В функции: вычислить среднее геометрическое положительных элементов одномерного массива. Если в массиве нет положительных элементов, результат приравнять нулю. В главной программе: применить функцию к трем массивам разной длины. Вывести результаты с именами массивов. Найти и вывести минимум среди полученных значений, не равных нулю. Вариант 2
В функции: вычислить площадь треугольника по трем его сторонам. Если треугольник построить нельзя, принять площадь равной нулю. В главной программе: в столбцах исходной матрицы X(3,6) расположены длины сторон треугольников. Используя функцию, получить площади шести треугольников и записать их в одномерный массив. Вывести таблицу с длинами сторон и площадью треугольников. Вариант 3
В функции: вычислить произведение ненулевых элементов одномерного массива, расположенных между максимальным и минимальным элементами. Если между максимумом и минимумом нет ненулевых элементов, результат приравнять нулю. Для проверки вывести координаты максимума и минимума в массиве. В главной программе: применить функцию к трем массивам разной длины, вывести результаты с именами массивов. Найти и вывести максимум среди полученных значений.
Практикум по современному Фортрану
75 Вариант 4
В функции: вычислить среднее квадратичное элементов одномерного массива, расположенных между первым и вторым нулевыми элементами. Если в массиве меньше двух нулевых элементов, результат принять равным (-1). Если первый и второй нулевые элементы являются соседними, результат приравнять нулю. В главной программе: применить функцию к трем массивам разной длины. Вывести результаты в порядке убывания, указав имена массивов. При отрицательном или нулевом результате функции вывести сообщение. Вариант 5
В функции: вычислить модуль разности между средним арифметическим и средним геометрическим элементов одномерного массива. Для проверки вывести среднее арифметическое и среднее геометрическое значения. В главной программе: применить функцию к двум массивам: массиву Z(20), составленному из модулей исходного массива X(20), и массиву Y(20), каждый элемент которого определяется по формуле yi=xi*xi+1, где xi – элемент исходного массива Х. Вывести результаты, указав имена массивов. Вариант 6
В функции: вычислить среднеквадратическое отклонение от среднего в одномерном массиве X(1:n) по формуле σ =
1 n ( xi − x ) 2 , где n – ∑ n i =1
длина массива, x – среднее арифметическое его элементов. Для проверки вывести среднее арифметическое значение. В главной программе: применить функцию к трем массивам разной длины. Вывести результаты в порядке возрастания, указав имена массивов. Вариант 7
В функции: получить логическое значение (.true. или .false.), определяющее, расположен ли максимальный отрицательный элемент одномерного массива ранее минимального положительного элемента. Для проверки вывести координаты найденных элементов массива. В главной программе: применить функцию к трем массивам разной длины. В соответствии с результатами вывести сообщения, указав имена массивов.
Практикум по современному Фортрану
76 Вариант 8
В функции: найти сумму элементов, расположенных по периметру прямоугольного фрагмента матрицы M, диагонально противоположными вершинами которого являются элементы с индексами (i1,j1) и (i2,j2). В главной программе: в каждой из четырех матриц разных размеров найти максимальный и минимальный элементы и применить функцию к прямоугольнику, вершинами которого они являются. Вывести таблицу с координатами найденных вершин и суммой элементов, расположенных по периметру прямоугольника. В исходных данных предусмотреть различное взаимное расположение максимума и минимума для этих матриц. Вариант 9
В функции: вычислить сумму максимальных по модулю элементов строк двумерного массива. Для проверки вывести значения максимальных по модулю элементов строк массива. В главной программе: применить функцию к трем матрицам разных размеров. Вывести результаты в порядке убывания, указав имена матриц. Вариант 10
В функции: найти максимальный по модулю элемент (со знаком), расположенный выше главной диагонали матрицы. В главной программе: применить функцию к трем матрицам разных размеров. Вывести найденные значения в порядке возрастания, указав имена матриц. Вычислить и вывести среднее арифметическое полученных значений. Вариант 11
В функции: подсчитать количество элементов одномерного массива, отличающихся от среднего арифметического менее чем на 1. Для проверки вывести среднее арифметическое значение. В главной программе: применить функцию к трем массивам разной длины. Вывести результаты в порядке убывания, указав имена массивов.
Практикум по современному Фортрану
77 Вариант 12
В функции: вычислить сумму элементов диагонали, параллельной главной диагонали матрицы. Диагональ задаётся координатами ее верхнего элемента. В главной программе: применить функцию ко всем диагоналям, параллельным главной диагонали матрицы A(6,6), начиная с левого нижнего угла. Составить и вывести одномерный массив из полученных значений. Вариант 13
В функции: вычислить сумму элементов диагонали, параллельной побочной диагонали матрицы. Диагональ задаётся координатами нижнего элемента. В главной программе: применить функцию ко всем диагоналям, параллельным побочной диагонали матрицы A(6,6), начиная с левого верхнего угла. Составить и вывести одномерный массив из полученных значений. Вариант 14
В функции: получить логическое значение (.true. или .false.), определяющее, расположен ли максимальный элемент одномерного массива в его первой половине. В главной программе: проанализировать три массива разной длины, по результатам вывести сообщения, указав имена массивов. Вариант 15
В функции: подсчитать количество отрицательных элементов внутри прямоугольного фрагмента матрицы M, диагонально противоположными вершинами которого являются элементы с индексами (i1,j1) и (i2,j2). В главной программе: В каждой из четырех матриц разных размеров найти максимальный и минимальный элементы и применить функцию к прямоугольнику, вершинами которого они являются. Вывести таблицу с координатами найденных вершин и количеством отрицательных элементов в прямоугольнике для каждой матрицы. В исходных данных предусмотреть различное взаимное расположение максимума и минимума для этих матриц.
Практикум по современному Фортрану
78 Вариант 16
В функции: вычислить определенный интеграл как площадь под кривой n −1
по формуле прямоугольников S = ∑ Δx ⋅ y i , где n – количество значений i =1
функции Y в одномерном массиве, а Δx – постоянный шаг изменения аргумента. В главной программе: сформировать массивы значений функции y = exp(–x3/2) в интервале [-2, 2]: a) с шагом Δx1 = 0.1 b) с шагом Δx2 = 0.01. Вычислить определенный интеграл для каждого из этих массивов, сравнить вычисленные значения с определенным интегралом, вычисленным по первообразной функции. Вариант 17
В функции: с точностью ε вычислить приближенное значение функции ex при заданных значениях x и ε. Вычисления проводить суммированием членов ряда Тейлора. В главной программе: значение ε ввести в диалоге и вывести в результирующий файл. Используя функцию, составить и вывести таблицу x значений e , изменяя значение аргумента от xn до xk с шагом Δx (10 знаx чений). Для проверки дополнить таблицу значениями e , вычисленными по стандартной программе. Вариант 18
В функции: получить логическое значение (.true. или .false.), определяющее, каждому ли положительному элементу одномерного массива предшествует отрицательный элемент. В главной программе: проанализировать три массива разной длины, по результатам вывести сообщения, указав имена массивов. Вариант 19
В функции: подсчитать количество отрицательных элементов между максимальным и минимальным элементами одномерного массива. В главной программе: применить функцию к столбцам матрицы A(5,10). Результаты оформить в виде одномерного массива. Вывести элементы полученного массива в две строки.
Практикум по современному Фортрану
79 Вариант 20
В функции: получить логическое значение (.true. или .false.), определяющее, есть ли одинаковые элементы в двух целочисленных матрицах. В главной программе: сравнить попарно три матрицы, разные по размеру. Вывести соответствующие сообщения с именами массивов. Вариант 21
В функции: вычислить определенный интеграл как площадь под кривой n −1 ( yi +1 + yi ) по формуле трапеций S = ∑ Δx ⋅ , где n – количество значений 2 i =1 функции Y в одномерном массиве, а Δx – постоянный шаг изменения аргумента. В главной программе: сформировать массивы значений функции y = exp(–x/5) в интервале [-2, 2]: a) с шагом Δx1 = 0.1 b) с шагом Δx2 = 0.01. Вычислить определенный интеграл для каждого из этих массивов, сравнить вычисленные значения с определенным интегралом, вычисленным по первообразной функции. Вариант 22
В функции: вычислить периметр n-угольника по координатам вершин, расположенным в столбцах двумерного массива XY(1:2,1:n). Каждой вершине многоугольника соответствует один столбец. В главной программе: применить функцию к 4-угольнику, 5-угольнику и 6-угольнику. Вывести периметры с именами фигур в порядке возрастания периметров. В отчете привести графическую интерпретацию. Вариант 23
В функции: получить логическое значение (.true. или .false.), определяющее, принадлежит ли точка с координатами (x,y) внутренней области эллипса с длинами полуосей а и b и центром в точке с координатами (x0,y0). В главной программе: длины полуосей и координаты центра эллипса ввести в диалоге. Проанализировать 8 точек с координатами из массива Pt(2,8), в котором каждой точке соответствует столбец. Вывести параметры эллипса, а для каждой точки – ее координаты и сообщение: точка внутри или вне эллипса. В отчете привести графическую интерпретацию результатов.
Практикум по современному Фортрану
80 Вариант 24
В функции: найти в матрице максимум среди локальных минимумов. Локальным минимумом считать элемент матрицы, значение которого строго меньше его «соседей» по горизонтали и по вертикали. Учесть, что количество «соседей» элемента колеблется от 2 до 4 в зависимости от его положения в матрице. Для проверки вывести координаты и значения всех локальных минимумов. В главной программе: применить функцию к трем матрицам разных размеров. Вывести полученные значения, указав имена массивов. Вариант 25
В функции: вычислить произведение трех наименьших по модулю ненулевых элементов целочисленной матрицы. Если в матрице меньше трех ненулевых элементов, результат приравнять нулю. В главной программе: применить функцию к трем целочисленным матрицам, разным по размеру. Вывести соответствующие сообщения с именами массивов. Вариант 26
В функции: вычислить радиус окружности, вписанной в треугольник. Координаты вершин треугольника расположены в столбцах двумерного массива XY(1:2,1:3). Одна из формул для вычисления радиуса вписанной окружности: r =
( p - a)( p - b)( p - c) , где a, b, c – стороны треугольp
ника, p – его полупериметр. В главной программе: применив функцию к трем треугольникам, вывести таблицу с координатами вершин треугольников и радиусом вписанной окружности. В отчете привести графическую интерпретацию. Вариант 27
В функции: используя формулу Герона, получить логическое значение (.true. или .false.), определяющее, принадлежит ли точка с координатами (x, y) треугольнику. Координаты вершин треугольника расположены в столбцах двумерного массива XY(2, 3). Точку, лежащую на стороне треугольника, считать принадлежащей треугольнику. В главной программе: ввести координаты вершин треугольника и применить функцию к трем точкам. Вывести таблицу с координатами точек и словами «внутри» или «вне» в зависимости от результата функции. В отчете привести графическую интерпретацию.
Практикум по современному Фортрану
81 Вариант 28
В функции: с точностью вычислить приближенное значение функции cos x при заданных значениях x и ε. Вычисления проводить суммированием членов ряда Тейлора. В главной программе: Значение ε ввести в диалоге и вывести в результирующий файл. С помощью функции составить вывести таблицу значений cos x, изменяя значение аргумента от xn до xk с шагом Δx (10 значений). Для проверки дополнить таблицу значениями cos x, вычисленными по стандартной программе. Вариант 29
В функции: получить логическое значение (.true. или .false.), определяющее, представляют ли элементы одномерного массива возрастающую последовательность. В главной программе: проанализировать три массива разной длины, по результатам вывести сообщения, указав имена массивов. Вариант 30
В функции: найти в одномерном массиве число с максимальным синусом. В главной программе: применить функцию к трем массивам разной длины. Вывести таблицу с именами массивов, найденными значениями и значениями синусов от них с точностью до четвертого десятичного знака. 1.9. Решение задач с использованием подпрограмм Задание 1. В соответствии с индивидуальным заданием составить подпрограммы (встроенными функциями для массивов не пользоваться). 2. Написать главную программу, которая должна содержать интерфейс с правилами применения каждой подпрограммы и выполнять следующие действия: a) ввод данных из файла In.txt на диске и форматный вывод их в результирующий файл Out.txt; b) вызовы подпрограмм с различными данными; c) если возможно, проверку результатов работы подпрограмм обращением к стандартным подпрограммам или функциям; d) форматный вывод в файл Out.txt результатов работы каждой подпрограммы с пояснениями выводимых величин (использовать формулировки из индивидуального задания).
Практикум по современному Фортрану
82 Содержание отчета 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Текст варианта индивидуального задания. 4. Постановка задачи, методы вычислений. 5. Графическая интерпретация (если требуется), выполненная вручную или пакетом Agrapher. 6. Блок-схемы главной программы и подпрограмм. 7. Распечатка текстов главной программы и подпрограмм. 8. Распечатка файла результатов Out.txt. При подготовке к защите ответить на контрольные вопросы. Справочная информация Встроенные функции по линейной алгебре смотрите в разделе 6.3. Комментарии к заданию 1. Проект должен состоять из независимых программных единиц – главной программы и подпрограмм, каждая с собственной системой обозначений объектов. 2. Правила применения каждой подпрограммы должны быть описаны в вызывающей программе в операторе Interface. 3. Подпрограмма Subroutine – процедура, вызываемая оператором Call имя_подпрограммы(аргументы). 4. Для передачи данных используются аргументы – фактические в главной программе и формальные в подпрограмме. 5. Результаты подпрограммы передаются в вызывающую программу через выходные аргументы (атрибут Intent(Out)) и не связаны с именем подпрограммы. Количество выходных аргументов может быть любым, в том числе ни одного. 6. Если все фактические аргументы позиционные (без ключевых слов), то количество фактических и формальных аргументов должно совпадать. Кроме того, в этом случае попарно в порядке следования фактические и формальные аргументы должны соответствовать по типу, назначению и форме. Совпадение имен фактических и формальных аргументов не требуется, но и не запрещается. 7. Атрибут назначения каждого формального аргумента (Intent) должен быть описан. Пример В подпрограмме: найти номер и значение максимального по модулю элемента одномерного массива.
Практикум по современному Фортрану
83 В главной программе: используя подпрограмму, найти для нескольких массивов разной длины номера и значения элементов, максимальных по модулю. Программа Далее приведена главная программа, в составе которой показаны интерфейс и вызовы подпрограммы. Program Sub1 ! ФИО Лаб10 Группа. Вар. Implicit none Interface ! шаблон вызываемой подпрограммы Subroutine MaxAbs(Mas, eLem, Num) Implicit none Real,intent(in),dimension(:)::Mas ! входной массив 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 4.0 -17.0 .0 max по модулю элемент
20.0 45.0 -71.0 .0 .0 11.0 -71.0 его номер 6 в массиве B
Массив С -122.0 .0 45.0 71.0 4.0 .0 .0 .0 11.0 max по модулю элемент -122.0 его номер
-17.0 1 в массиве C
Контрольные вопросы к защите работы 1. Назовите четыре вида программных единиц в Фортране. 2. Что называют процедурой в программировании? Сколько видов процедур в Фортане? 3. Что такое внешняя программная единица и внутренняя процедура? Каков механизм присоединения данных носителя? Приведите примеры.
Практикум по современному Фортрану
84 4. Оформите как процедуру вычисление количества повторений цикла и значения переменной цикла при нормальном завершении цикла. 5. Зачем процедуре имя? Есть ли ответ, связанный с именем процедуры? Как передаются результаты подпрограммы в вызывающую программу? 6. Что такое формальные и фактические аргументы? Правила согласования формальных и фактических аргументов, поясните примерами. 7. Какими по назначению могут быть формальные аргументы процедуры, приведите примеры описания назначения формальных аргументов. 8. Где и для чего пишут интерфейсы? Когда интерфейс обязателен? 9. Одинаковые по порядку аргументы должны ли иметь одинаковые имена: − в интерфейсе, − в вызывающей программе, − в вызываемой процедуре. 10. Надо ли оператор Implicit none писать везде: − в интерфейсе, − в вызывающей программе, − в вызываемой процедуре. 11. Чем подпрограмма отличается от функции? Сравните на примере, оформив как функцию и как подпрограмму вычисление количества повторений цикла. Пример контрольного задания
1. В подпрограмме: используя циклы, вычислить три суммы элементов квадратной вещественной матрицы, расположенных a) ниже, b) выше, c) на главной диагонали. В главной программе: применить подпрограмму к матрице размером 8×8. Вывести три значащих цифры результатов. Блок-схема подпрограммы обязательна. 2. Напишите интерфейс подпрограммы Radius для нахождения радиуса и длины окружности, которая проходит через три точки, заданные своими координатами. Покажите, как применить подпрограмму к трем точкам: A (3.7, 6.1), В (12.6, 2.11) и С (11.5, 8.2).
Практикум по современному Фортрану
85 Варианты индивидуальных заданий Вариант 1
В подпрограмме: методом парабол (Симпсона) вычислить определенный интеграл функции f(x) на интервале [a, b] с абсолютной погрешностью ε. Первоначально разбить интервал на 10 участков. На каждой следующей итерации удваивать количество участков. Вычисления прекратить, когда результат интегрирования будет отличаться от предыдущего не более чем на ε. Выходные аргументы – значение интеграла и количество итераций, потребовавшихся для достижения точности. b
В главной программе: Применив подпрограмму, вычислить
dx
∫ sin a
2
x
на
интервале [1.5, 2.5] с точностью ε = 10 и ε = 10 . Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher. -2
-4
Вариант 2
В подпрограмме: перемножить две матрицы. Логический выходной аргумент равен . false., если матрицы невозможно перемножить из-за несоответствия их размеров (иначе . true.). В главной программе: на примере трех матриц A, B и C показать, что (A+B)C= AC+ BC. Размеры матриц (не квадратных) выберите сами. Работу подпрограммы проверить, вызвав функцию Matmul. После обращения к каждой подпрограмме выводить сформированную матрицу или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу. Вариант 3
В подпрограмме: вычислить математическое ожидание и дисперсию случайной величины, значения которой находятся в одномерном массиве. Примечание: для равномерно распределенной случайной величины математическое ожидание и дисперсия вычисляются по формулам n
n
M ( x) =
∑ xi i =1
n
D( x) =
∑[ x − M ( x)] i =1
2
i
n
В главной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать два одинаковых по длине одномерных массива X и Y, значения которых находятся в интервале [0; 10]. Используя подпрограмму, на примере этих массивов показать, что M(X+Y) = M(X) +M(Y) и D(X+Y) ≅ D(X) + D(Y). После каждого обращения к подпрограмме выводить результаты с пояснениями. Практикум по современному Фортрану
86 Вариант 4
В подпрограмме 1: определить количество и составить массив простых чисел в интервале [1; N], используя определение простых чисел. В подпрограмме 2: определить количество и составить массив простых чисел в интервале [1; N], используя алгоритм «Решето Эратосфена». В главной программе: последовательно применив обе подпрограммы, найти простые числа среди первых 200 чисел натурального ряда. Сравнить результаты применения подпрограмм. Вариант 5
В подпрограмме: по значениям трех коэффициентов квадратного уравнения найти его корни (действительные или комплексные). Логический выходной аргумент равен .true., если корни действительные (.false., если нет действительных корней). В главной программе: используя подпрограмму, найти корни 10 уравнений, коэффициенты которых расположены в двумерном массиве размером 3×10 (каждому уравнению соответствует столбец массива). Результаты оформить в виде таблицы. Вариант 6
В подпрограмме: методом половинного деления вычислить действитель2 ный корень уравнения y = sin(0.9x) – (x – 0.4) + 3.1 в интервале [a, b] с абсолютной погрешностью ε. Логический выходной аргумент равен .true., если в этом интервале существует единственный корень (.false., если корень не единственный, или в интервале корней нет). В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: применить подпрограмму к каждому из найденных интервалов при ε =10-2 и ε =10-4. Проверить решение, подставив корни в уравнение. В отчете представить график функции. Вариант 7
В подпрограмме: умножить матрицу на вектор. Логический выходной аргумент равен . false., если умножение матрицы на вектор невозможно из-за несоответствия их размеров (иначе . true.). В главной программе: на примере двух матриц A и B и вектора V показать, что (A+B)V = AV+ BV. Размеры матриц и вектора выберите сами. Работу подпрограммы проверить, вызвав функцию Matmul. После каждого обращения к подпрограмме выводить сформированный вектор или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу. Практикум по современному Фортрану
87 Вариант 8
В подпрограмме: методом трапеций вычислить определенный интеграл функции f(x) на интервале [a, b] с абсолютной погрешностью ε. Первоначально разбить интервал на 10 участков. На каждой следующей итерации увеличивать количество участков на 50%. Вычисления прекратить, когда результат интегрирования будет отличаться от предыдущего не более чем на ε. Выходные аргументы – значение интеграла и количество итераций, потребовавшихся для достижения точности. В главной программе: Применив b
∫ (2 x
4
подпрограмму,
)
− x 2 + 1 dx на интервале [–1, 1.4] с точностью
вычислить
ε = 10-2 и ε = 10-4.
a
Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher. Вариант 9
В подпрограмме: координаты седловых элементов матрицы записать в двумерный массив размером 2×N, в котором N – количество седловых элементов, а каждому седловому элементу соответствует столбец. Седловым считать элемент матрицы, значение которого строго меньше его «соседей» по горизонтали и строго больше «соседей» по вертикали. Учесть, что количество «соседей» элемента матрицы в зависимости от его положения колеблется от 2 до 4. В главной программе: воспользоваться подпрограммой для двух матриц, для каждой вывести таблицу с координатами седловых элементов и их значениями. Вариант 10
В подпрограмме 1: транспонировать матрицу (m ≠ n). В подпрограмме 2: перемножить две матрицы (m ≠ n). В обеих подпрограммах: матрицы не обязательно квадратные; логический выходной аргумент равен . false., если выполнение действий невозможно из-за несоответствия размеров матриц (иначе . true.). В главной программе: используя подпрограммы, на примере двух квадратных матриц A и B показать, что (AB)T = ATBT. Размеры матриц n×n выберите сами. Работу подпрограммы 1 проверить, вызвав функцию Transpose, подпрограммы 2 – функцию Matmul. После обращения к каждой подпрограмме выводить сформированную матрицу или аварийное сообщение о невозможности получения результата. После аварийного сообщения завершить программу.
Практикум по современному Фортрану
88 Вариант 11 b
В подпрограмме: по таблице значений f(x) вычислить
∫ f ( x)dx методом a
трапеций. В главной программе: составить таблицы значений f ( x) = x e в интервале [a, b] = [0.3, 1.7] с шагом n1 = 0,1 и n2 = 0,02. Применив подпрограмму, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher. 2 0.2 x
Вариант 12
В подпрограмме 1: вычислить С – скалярное (внутреннее) произведение двух векторов C = ∑ Ai ⋅ Bi . Логический выходной аргумент равен . false., i
если перемножить векторы невозможно из-за несоответствия их размеров (.true., если перемножение векторов возможно). В подпрограмме 2: вычислить матрицу M – внешнее произведение двух векторов, элементы которой вычисляются по формуле: Mi,k=AiBk. В главной программе: применить подпрограммы к двум векторам. Для проверки подпрограммы 1 вызвать функцию Dot_product, подпрограммы 2 – функцию Matmul. После обращения к каждой подпрограмме выводить результат умножения или аварийное сообщение о невозможности его получения. После аварийного сообщения завершить программу. Вариант 13
В подпрограмме: методом прямоугольников вычислить определенный интеграл функции f(x) на интервале [a,b] с абсолютной погрешностью ε. Первоначально разбить интервал на 10 участков. На каждой следующей итерации увеличивать количество участков на 50%. Вычисления прекратить, когда результат интегрирования будет отличаться от предыдущего не более чем на ε. Выходные аргументы – значение интеграла и количество итераций, потребовавшихся для достижения точности. В главной программе: Применив b
∫ (2 x
3
подпрограмму,
вычислить
)
− 3x + 4 dx на интервале [–1.5, 1.5] с точностью ε = 10-2 и ε = 10-4.
a
Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher.
Практикум по современному Фортрану
89 Вариант 14
В подпрограмме: сформировать матрицу B(m,n) в соответствии с исход⎛ n ⎞ ⎜ ∑ aik ⎟ − ai j ⎝ k =1 ⎠ ной матрицей A(m,n) по правилу bi j = ⎛ m . ⎞ − a a ⎜∑ k j ⎟ ij ⎝ k =1 ⎠ В главной программе: применить подпрограмму к двум матрицам разных размеров. Вывести исходные и результирующие матрицы. Вариант 15 b
В подпрограмме: по таблицам значений f(x) вычислить
∫ f ( x)dx
мето-
a
дом прямоугольников. В главной программе: составить таблицы значений f ( x ) = x sin x в интервале [a, b] = [1.5, 3] с шагом n1 = 0,1 и n2 = 0,01. Применив подпрограмму, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher. 2
Вариант 16
В подпрограмме: вычислить длины сторон, периметр и площадь выпуклого многоугольника по координатам его вершин. Координаты вершин расположены в двумерном массиве размером 2×N, в котором N – количество вершин, а каждой вершине соответствует столбец. В главной программе: последовательно читая из файла координаты вершин треугольника, четырехугольника, пятиугольника и применяя к ним подпрограмму, составить таблицу (длины сторон, периметр и площадь). В отчете привести графическую интерпретацию. Вариант 17
В подпрограмме 1: отсортировать одномерный массив по убыванию любым способом. В подпрограмме 2: объединить два отсортированных по убыванию массива, не нарушив сортировки. В главной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать два одномерных массива разной длины со значениями в интервале [0; 100]. Отсортировать эти массивы по убыванию (подпрограмма 1). Вывести массивы до и после сортировки. Объединить массивы (подпрограмма 2). Вывести объединенный массив.
Практикум по современному Фортрану
90 Вариант 18
В подпрограмме: преобразовать матрицу, заменив каждый отрицательный элемент матрицы средним арифметическим его «соседей» по горизонтали и по вертикали при условии, что все «соседи» неотрицательны. Учесть, что количество «соседей» элемента колеблется от 2 до 4 в зависимости от его положения в матрице. Координаты замененных элементов матрицы записать в двумерный массив размером 2×N, в котором N – количество элементов, а каждому элементу матрицы соответствует столбец. В главной программе: воспользоваться подпрограммой для двух матриц разных размеров, для каждой вывести измененную матрицу и координаты замененных элементов. Вариант 19
В подпрограмме: реализовать циклический сдвиг матрицы на n элементов вправо, влево, вверх или вниз в зависимости от заданного режима. Значение n может превышать размер матрицы по любому измерению. В главной программе: ввести матрицу и многократно сдвигать ее, используя подпрограмму. Направление и величину сдвига задавать в диалоге. После сдвига выводить его направление и величину и полученную в результате матрицу. Работу программы прекратить после ввода слова, отличного от слов Up, Down, Left, Right (например, Stop). Вариант 20
В подпрограмме 1: определить количество и составить массив простых чисел в интервале [1, N], используя определение простых чисел. В подпрограмме 2: определить количество и составить массив простых чисел в интервале [1, N], используя алгоритм «Решето Сундарама». В главной программе: последовательно применив обе подпрограммы, найти простые числа среди первых 200 чисел натурального ряда. Сравнить результаты применения подпрограмм. Вариант 21
В подпрограмме: решить систему линейных уравнений AX = B методом Гаусса. Здесь A – матрица коэффициентов уравнения, B – вектор свободных членов, X – вектор корней системы. Логический выходной аргумент равен .true., если система имеет решение, и притом единственное (иначе . false.). В главной программе: применить подпрограмму к двум системам из пяти и шести линейных уравнений. Применить функцию Matmul к матрице A и вектору X и сравнить полученный вектор с вектором B.
Практикум по современному Фортрану
91 Вариант 22
В подпрограмме 1: отсортировать одномерный массив по убыванию методом последовательного нахождения минимального элемента массива и перестановки его в начало массива. В подпрограмме 2: отсортировать одномерный массив по убыванию методом «пузырька». В каждой подпрограмме: подсчитать количество перестановок элементов при сортировке. В главной программе: с помощью генератора псевдослучайных чисел RANDOM_NUMBER создать одномерный массив, значения которого находятся в интервале [0; 10]. Обратившись к подпрограммам, отсортировать этот массив по убыванию. Вывести массив до и после сортировки. Сравнить полученные массивы и количества перестановок. Вариант 23
В подпрограмме: Найти координаты точек, в которых прямая, заданная уравнением kx+b, пересекает стороны треугольника; координаты вершин треугольника расположены в двумерном массиве размером 2×3 (каждой вершине соответствует столбец массива). Логический выходной аргумент равен .true., если прямая пересекает треугольник (иначе .false.) В главной программе: ввести коэффициенты уравнений пяти прямых и координаты вершин треугольника. Применив подпрограмму к каждой из прямых, составить таблицу (коэффициенты уравнений, координаты точек их пересечения со сторонами треугольника). В отчете привести графическую интерпретацию. Вариант 24
В подпрограмме: методом половинного деления вычислить действитель3 2 ный корень уравнения y = (x – 0.6) – (x + 4) + x + 26.8 в интервале [a, b] с абсолютной погрешностью ε. Логический выходной аргумент равен .true., если в этом интервале существует единственный корень (иначе . false.). В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: применить подпрограмму к каждому из найденных интервалов при ε =10-3 и ε =10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции.
Практикум по современному Фортрану
92 Вариант 25
В подпрограмме: методом касательных (Ньютона) вычислить действи2 –0.15x + 1.1e–1.5x в тельный корень уравнения y = (x – 0.5) – 2.3e интервале [a, b] с абсолютной погрешностью ε. Логический выходной аргумент равен .false., если корень в этом интервале не существует, или метод Ньютона неприменим (.true., если корень вычислен). В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: применить подпрограмму к каждому из найденных интервалов при ε =10-3 и ε =10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции. Вариант 26
В подпрограмме: методом хорд вычислить действительный корень 4 3 2 уравнения y = (x + 1.5) + (x + 1.2) – x – 15.3 в интервале [a, b] с абсолютной погрешностью ε. Логический выходной аргумент равен .true., если в этом интервале существует единственный корень (иначе .false.). В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: применить подпрограмму к каждому из найденных интервалов при ε =10-3 и ε =10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции. Вариант 27
В подпрограмме: методом касательных (Ньютона) вычислить действи3 тельный корень уравнения y = 1.2cos(1.3x + 0.5) –x + 3.1 в интервале [a, b] с абсолютной погрешностью ε. Логический выходной аргумент равен .false., если корень в этом интервале не существует, или метод Ньютона неприменим (.true., если корень вычислен). В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: применить подпрограмму к каждому из найденных интервалов при ε =10-3 и ε =10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции.
Практикум по современному Фортрану
93 Вариант 28
В подпрограмме: на интервале [a, b] разбить кривую линию, заданную уравнением, на n участков и вычислить ее длину на этом интервале. В главной программе: используя подпрограмму, вычислить длину ли−0.3 x
−1.5 x
−e + 3,8 на интервале [–1, 5] нии, заданной уравнением y = e при n1 = 20 и при n2 = 40. Сравнить результаты. В правильности вычислений убедиться средствами пакета Agrapher, b
вычислив длину линии на интервале по формуле D =
∫
1 + [ f ' ( x)]2 dx .
a
Вариант 29 b
В подпрограмме: по таблице значений f(x) вычислить
∫ f ( x)dx методом a
парабол (Симпсона).
1 в инx2 +1 тервале [a, b] = [–1.5, 1.5] с шагом n1 = 0,3 и n2 = 0,03. Применив подпрограмму, вычислить величину интеграла. Сравнить полученные значения с интегралом, вычисленным по первообразной функции и средствами пакета Agrapher. В главной программе: составить таблицу значений f ( x) =
Вариант 30
В подпрограмме: методом хорд вычислить действительный корень 1.4x – (x + 0.3)2 +1.8 в интервале [a, b] с абсолютной уравнения y = e погрешностью ε. Логический выходной аргумент равен .true., если в этом интервале существует единственный корень (иначе . false.). В пакете Agrapher построить график функции и определить интервалы нахождения корней. В главной программе: применить подпрограмму к каждому из найденных интервалов при ε =10-3 и ε =10-5. Проверить решение, подставив корни в уравнение. В отчете представить график функции. 1.10. Механизмы присоединения данных Задание 1. Реализовать два проекта, которые содержат: a) ввод данных из файла In.txt на диске и форматный вывод их в результирующий файл Out.txt; b) вызовы процедур с различными данными для отладки; Практикум по современному Фортрану
94 e) если возможно, проверку результатов работы процедур обращением к стандартным подпрограммам или функциям; c) форматный вывод в файл Out.txt результатов работы каждой процедуры с пояснениями выводимых величин (использовать формулировки из индивидуального задания). 2. Проект Container – применить механизм присоединения объектов носителя. 3. Проект Module3 – применить механизм присоединения объектов модуля. Содержание отчета. 1. Название работы и номер варианта индивидуального задания. 2. Фамилия, имя, отчество и номер группы студента. 3. Текст варианта индивидуального задания. 4. Постановка задачи, методы вычислений. 5. Описание механизмов обмена данными. 6. Графическая интерпретация (если требуется), выполненная вручную или пакетом Agrapher. 7. Блок-схемы главной программы и подпрограмм. 8. Распечатки текстов всех программных единиц. 9. Распечатки файлов результатов Out.txt. При подготовке к защите ответить на контрольные вопросы. Комментарии к заданию 1. Приступая к выполнению задания, прочтите раздел 5. 2. В проекте Container расчетная процедура – это внутренняя процедура, присоединяющая объекты носителя, которым является внешняя программа. 3. В проекте Module3 расчетная процедура – это модульная процедура, присоединяющая объекты используемого модуля. 4. Расчетные процедуры в виде внутренней и модульной процедуры не являются самостоятельными программными единицами. 5. Вызов внутренней или модульной процедуры не требуют Interface. Пример В подпрограмме: ввести одномерный массив из файла in.txt; найти и вывести в файл out.txt номер и значение максимального по модулю элемента массива. В главной программе: применить подпрограмму к нескольким массивам, предварительно вводя длину каждого массива из файла in.txt. Применить механизмы присоединения объектов носителя и модуля.
Практикум по современному Фортрану
95 Проект Container Главная программа Container – единственная самостоятельная программная единица. В программу Container вложена внутренняя подпрограмма Subroutine OneArray. Программа Container является носителем данных dArr для подпрограммы OneArray. Переменные ARR, LocArrr, MaxARR, NumARR локальны в подпрограмме OneArray. Динамический массив ARR локализован в подпрограмме OneArray. Его переменная длина dARR определена до входа в подпрограмму. Команды allocate и deallocate не нужны – массив размещается автоматически при входе в подпрограмму и освобождается при выходе. Программа Program Container ! внешняя программа Implicit none Integer:: dARR ! длина массива Open(1,File='In.txt') ! файл исходных данных Open(2,File='Out.txt') ! результирующий файл Read(1,*) dARR; ! ввод длины массива из файла in.txt Call OneArray('B') Read(1,*) dARR; ! ввод длины массива из файла in.txt Call OneArray('C') contains Subroutine OneArray(ArrName) ! внутренняя подпрограмма Implicit none character,intent(in):: ArrName ! однобуквенное имя массива Real, dimension(1:dARR)::ARR ! локальный динамический массив Integer,dimension(1:1)::LocArr Real::MaxARR ! max по модулю – локальный Integer::NumARR ! номер max по модулю – локальный Read(1,*) ARR Write(2,2) ArrName, ARR ! ввод/вывод массива ARR LocArr=maxLoc(Abs(ARR)); NumARR=LocArr(1); MaxARR=ARR(NumARR) Write(2,3) MaxARR , NumARR, ArrName 2 format(/' Массив ', a/ ( 6F8.1) ) 3 format(' max по модулю элемент ', F8.1, ' его номер', i3,' в массиве ', a) End Subroutine OneArray ! конец внутренней подпрограммы End Program Container
Результаты работы программы Container Массив В 1.0 -4.0 6.0 4.0 -17.0 .0 max по модулю элемент
20.0 45.0 -71.0 .0 .0 11.0 -71.0 его номер 6 в массиве B
Массив С -122.0 .0 45.0 71.0 4.0 .0 .0 .0 11.0 max по модулю элемент -122.0 его номер
-17.0 1 в массиве C
Практикум по современному Фортрану
96 Проект Module3 – использование общедоступных объектов модуля. В этом проекте две самостоятельные программные единицы – модуль Mo и головная программа UseModule, которые: 1. можно компилировать порознь, но модуль должен компилироваться раньше главной программы; 2. могут быть единым текстом, но модуль должен располагаться перед главной программой. Модуль Mo содержит модульную процедуру ProArray, которая размещена внутри модуля. Процедура ProArray – без аргументов. Интерфейс процедуры явный, его описывать не надо. Все объекты, кроме массива ARR, размещены в модуле. Главной программе UseModule, использующей модуль, доступны объекты ArrN, dARR (public) Локальные переменные модуля MaxARR и NumARR (privait) доступны в процедуре ProArray и недоступны в программе UseModule. Массив ARR локализован в процедуре ProArray, аналогичный динамический массив используется в предыдущем примере. Программа Module Mo ! ФИО Лаб10 № группы, № варианта Implicit none Integer,public::ArrN, dARR ! порядковый № массива, длина массива Integer, private:: NumARR ! номер max по модулю элемента – локальный Real, private:: MaxARR ! max по модулю элемент – локальный Contains ! внутренняя процедура модуля Subroutine ProArray() Implicit none Real,dimension(1:dARR)::ARR ! динамический автоматический массив Integer,dimension(1:1)::LocArrr ! вектор Real AbsARR Read(1,*) ARR; Write(2,2) ArrN,ARR ! вывод и вывод массива ARR LocArrr=maxloc(Abs(ARR)); NumARR = LocArrr(1) MaxARR = ARR(NumARR) ! max по модулю элемент Write(2,3) MaxARR, NumARR, ArrN 2 format(/’ Массив №’, i5/ ( 6F8.1) ) 3 format(’ max по модулю элемент ’,F8.1, & ’ его номер’, i3, ’ в массиве №’,i5) End Subroutine proArray end Module Mo Program UseModule ! ФИО Лаб10 № группы, № варианта use Mo ! использует модуль Mo, доступны ArrN, dARR , процедура proArray Open(1,File='In.txt') ! файл исходных данных Open(2,File='Out.txt') ! результирующий файл do ArrN=1,100000 ! читаем до 100000 массивов Read(1,*, end=100) dARR; Call ProArray() enddo 100 Write(2,*) ’ Все данные прочитаны’ End Program UseModule
Практикум по современному Фортрану
97 Результаты работы программы UseModule Массив № 1 1.0 -4.0 6.0 4.0 -17.0 .0 max по модулю элемент Массив № 2 22.0 .0 45.0 .0 .0 .0 max по модулю элемент Все данные прочитаны
20.0 45.0 .0 .0 -71.0 его номер 71.0 4.0 11.0 71.0 его номер
-71.0 11.0 6 в массиве №
1
-17.0 4 в массиве №
2
Контрольные вопросы к защите работы 1. Назовите четыре вида программных единиц в Фортране. 2. Назовите три вида программ. 3. Назовите два вида процедур. 4. Что называется подпрограммой? 5. Что такое внешняя и внутренняя программа? 6. Какие программные единицы могут быть только внешними, какие программы могут быть внутренними? 7. Какие объекты внешней программы не видимы во внутренней программе? 8. Чем модуль отличается от программ? 9. Каков механизм присоединения данных носителя? Примеры. 10. Опишите механизм присоединения объектов модуля, примеры. 11. Какие объекты модуля не видимы в программе, использующей его? 12. Когда интерфейс обязателен, когда желателен, когда не нужен? 13. Нужен ли оператор interface для модульной программы? Пример контрольного задания Вычисление количества повторений цикла оформить как: 1. внешнюю функцию function; 2. внешнюю подпрограмму subroutine; 3. внутреннюю процедуру – функцию или подпрограмму; 4. модульную процедуру – функцию или подпрограмму. Варианты индивидуальных заданий Варианты индивидуальных заданий смотрите в разделе 1.9.
Практикум по современному Фортрану
98
2. Элементы языка программирования Фортран 2.1. Текст программы на Фортране
Программу на Фортране оформляют в виде простого (plain) текста: − символ «!» открывает комментарий – до конца строки; − упрощают чтение текста программы пустые строки и пробелы (вне имен и ключевых слов); − каждый оператор и каждый блок пишут с новой строки, при необходимости перенося на следующую строку (символ переноса «&»); − компиляторы поддерживают две формы записи текстов программ с расширениями: *.f90, *.f03 – современная свободная форма для новых текстов, *.for – устаревшая фиксированная форма (для преемственности с Фортран-77). Пример оформления текста программы на Фортране: 1
Начало программы
Program Fortran90FreeForm
2 3
! площадь круга Real R; integer i ! комментарий
строка-комментарий 2 простых оператора в одной строке
4 5 6
Do i=1,10 ! цикл по 10 радиусам Write(*,*)’ R=?’; Read(*,*) R
Начало конструкции Do
7 8 9
’ S =’, 3.14* R**2
Write(*,*)’ R =’, R, & ! пол-оператора End do End Program Fortran90FreeForm
Начало блока с переносом по & строка-продолжение End+Do = конец конструкции Do End+Program=конец программы
Все операторы и блоки пишутся с новой строки. Существует две возможности указать конец строки – клавиша <Enter> и символ «;»: − используя «;», в одной видимой строке (строка 3) компонуют простые операторы; − <Enter> предшествует конструкции (строки 4-8) и блоку (строки 5-7); − специальных символов окончания оператора и блока в Фортране нет; − в языках Си и Паскаль не так – операторы не привязаны к строкам. 2.2. Синтаксис языка Фортран, выражения
К простейшим элементам синтаксиса языка относят: константы, имена, знаки и имена операций, метки, ключевые слова. Имена и ключевые слова Имя дают константе, переменной, операции, массиву, производному типу данных, классу, конструкции, процедуре, модулю, интерфейсу. Действует следующее соглашение об именах:
Практикум по современному Фортрану
99 − − − −
имена состоят из латинских букв, цифр 0÷9, символов «_», «$»; первым символом имени может быть только буква или символ «$»; строчные и прописные буквы не различаются; пробелы и знаки препинания, кириллица, греческие буквы, знаки операций и другие специальные символы в именах недопустимы; − длина имени не более 31 символа. Объекты программ, в отличие от однобуквенных математических обозначений (s=v*t), принято именовать со смыслом: Space=Velocity*Time. Ключевые слова (основные – смотри раздел 7.5) – это имена, используемые в языке программирования Фортран для операторов, атрибутов, некоторых операций, конструкций, встроенных функций. Эти имена составлены по тем же правилам, за некоторыми исключениями: − .true. и другие ключевые слова в логике обрамляются точками; − целое в диапазоне 1:99999 используют как метку (для format). В Фортране соглашение о ключевых словах гибкое: нет резервирования, как в Си. Ключевые слова могут использоваться в качестве обычных имен, лишь бы не возникало двусмысленности. Программисту не обязательно помнить все ключевые слова – ему поможет компилятор. Пример двусмысленности по ключевому слову max Real :: a=2, b=3, c, max ! max – простая переменная max=a; C = max(a,b) ! здесь max()-встроенная функция Фиксируется ошибка inconsistent usage of MAX – неподходящее использование слова MAX . Константы и переменные встроенных типов Константу нельзя изменить в процессе исполнения программы, она может быть записана явно как 3.14 или иметь имя, например Pi. Переменная – это именованный объект, значение которого можно изменить. Имеется пять встроенных типов: − числовые: целые integer, вещественные real, комплексные complex; − логические logical и строковые (символьные) character. Тип
Примеры явных констант
Разновидности и диапазоны порядков
Пояснения
integer
–2147
integer*1 *2 *4 ±1010
Точное значение
real
-1.76 1e7 1.2e7 1.3D+123 1.2Q-1234
real* 4 10±38 7 цифр ±308 real* 8 10 17 цифр ± 4932 real*16 10 33 цифры
Неточное представление, неточное вычисление
complex
(-1.76 , 1)
Пара вещественных чисел
неточно
logical
.true. .false.
Logical*1 *2 *4
1 бит
character
‘х=’
character*1 *32767
Кодировка ANSI
“O’K”
Практикум по современному Фортрану
100 Каждому типу соответствует своя область допустимых значений, особый способ хранения в памяти ПК, объём памяти, набор операций ПК. Атрибут именованной константы parameter, тип и значение входят в ее описание: real,parameter:: Pi =3.141593. Выражения Выражение – осмысленная математическая формула, записанная по правилам языка программирования. В отличие от математики формула записывается в виде строк текста; объекты именуются, имена функций указаны в описании языка и доступны в помощи. В выражение могут входить: − константа, переменная, элемент массива; − массив, секция массива; − ссылка на функцию с аргументами в скобках, например, cos(х-0.2) ; − операция с одним операндом, например, –х ; − операция с несколькими операндами, например, x+y+z ; − парные круглые скобки ( ). В зависимости от типов объектов, входящих в выражения, различают: − арифметические (числовые) выражения с числовым результатом – выполняются операции над числами целого, вещественного и комплексного типа, выражения могут быть смешанными; − логические выражения с логическим результатом: логические операции выполняются над логическими величинами, операции отношения – над числами или строками; − строковые выражения со строковым результатом – выполняются строковые функции и операция сцепления строк. Арифметическое выражение Операнды арифметического (по-другому – числового) выражения могут быть целого, вещественного или комплексного типа. В числовом выражении допускаются операции: Операция
Порядок
Пример
Примечания
Вычисление функции
1
sin(X)
одноместная (унарная) операция
Возведение в степень
2
X**2
несколько подряд – справа налево
Смена знака
3
–X
одноместная (унарная) операция
Деление, умножение
4
X/Y, X*Y
несколько подряд – слева направо
Сложение, вычитание
5
X+Y, X-Y несколько подряд – слева направо
Знаки двухместных (бинарных) операций возведения в степень, умножения, деления, сложения и вычитания записываются между операндами. В отличие от математики, знак операции умножения опускать нельзя. Численное значение результата зависит от порядка выполнения операций; скобки, если надо, порядок действий изменяют скобки; разрешаются толь-
Практикум по современному Фортрану
101 ко круглые. В выражении без скобок операции выполняются в порядке старшинства. В компьютере имеются два комплекта арифметических операций для целых и для вещественных чисел. Действия над комплексными числами выполняются программно по правилам, известным из математики с помощью команд для вещественных чисел. Фортран автоматизирует выбор комплекта операций, руководствуясь типом операндов. Если операнды однотипны, то этого же типа будет и результат. Для операций с операндами разных типов результат всегда в наиболее широком классе из числа операндов. Из математики множества чисел расширяются так: целые – шире – вещественные – шире – комплексные. Обратите внимание, что выбор из двух разных операций деления производится по общему правилу: − при делении вещественных чисел в результате – вещественное число, например, 2./3.=0.666667; − при делении целых чисел в результате – целое число, равное целой части частного, например, 8/3=2 или 2/3=0; − при делении разнотипных операндов в результате – вещественное число, например, 2./3=>2./3.=0.6666667 или 2/3.=>2./3.=0.666667 . n x Операция возведения в степень a и a вычисляется программно: − при integer n операция a**n выполняется как n-кратное умножение a*a*a* ..*a, поэтому a**n=0 при n<0 и integer a, например, 3**(-2)=1/3**2=1/9=0; ln a x
=e , сле− при real x операция a**x выполняется как a = e довательно, должно быть a > 0 . Все переменные, используемые в выражении, должны быть определены к моменту его вычисления. При вычислении по формулам следует анализировать ОДЗ, чтобы избегать числовых операций с неопределенным результатом: − деление на нуль x/0; − деление нуля на нуль 0/0, 0.0/0.0, 0/0.0, 0.0/0; − возведение нулевого основания в нулевую или отрицательную степень 0**0 0**(-2); − недопустимо возведение отрицательного основания в вещественную степень, как в (-8)**(1./3), но допустимо -(8**(1./3)) . x
x ln a
Строковое выражение Операнды строкового выражения должны быть строкового типа. В строковом выражении допускается только одна операция – сцепление строк или конкатенация. Сцепление обозначается «//», например s=s1//s2, символы в строке s нумеруются слева направо как 1,2,…len(s), len(s)≥len(s1)+len(s2). Подстрока – это подряд несколько символов строки.
Практикум по современному Фортрану
102 Пример: результат вычисления ba =ab(14:26)//ab(1:13) – строка, в которой меняются местами первая и вторая половины алфавита: Character*26 :: ba, ab=’abcdefghijklmnopqrstuvwxyz’
Логическое выражение Логическое выражение принимает значение «истина» или «ложь» и строится из: − логических переменных; − пяти логических операций с операндами логического типа; − шести отношений, которые сравнивают либо два числовых выражения, либо два символьных выражения. Результат вычисления отношения – это либо .true. – «истина» либо .false.– «ложь». В Фортране шесть операций отношения Отношения
Фортран 90 сейчас пишут так
В стиле Фортран 77, устаревающее
меньше чем A
a
a .lt. b
меньше или равно A≤b
a<=b
a .le. b
равно A=b
k==m
a .eq. b
не равно A≠b
k/=m
a .ne. b
больше или равно A≥b
a>=b
a .ge. b
больше чем a>b
a>b
a .gt. b
Отношения вычисляются после вычисления их операндов. Например, при A=2, B=0 для отношения A+3 >B порядок действий такой: сначала вычисляется А+3 и получается 5; затем 5 сравнивается с В, которое равно 0; результат вычисления выражения 5>0 – «истина». Логические операции выполняются после вычисления отношений. В Фортране пять логических операций Операция
Старшинство
Отрицание НЕ
Обозначение .not.
1
Пример .not.a
Конъюнкция И
.and.
2
a.and.b
Дизъюнкция ИЛИ
.or.
3
a.or.b
Эквивалентность
.eqv.
4
a.eqv.b
Неэквивалентность
.neqv.
4
a.neqv.b
Операция .not.a является, как и (–x), одноместной (унарной) и пишется перед операндом, остальные знаки логических операций записываются между операндами. Две логические операции могут следовать в выражении непосредственно друг за другом, только если второй операцией является операция отрицания. Например, допустимо a.and. .not.b.
Практикум по современному Фортрану
103 Введем обозначения: T – «истина» и F – «ложь». Строки и столбцы таблиц истинности помечены значениям операндов, а на пересечении строки и столбца записан результат двухместной операции .AND. F T
F F F
T F T
.OR. F T
F F T
T T T
.EQV. F T
F T F
T F T
.NEQV. F T
F F T
T T F
Операция .not. – одноместная и дает результат «истина», если значение операнда «ложь», и результат «ложь», если значение операнда «истина» .NOT.
F T
T F
Пример логического выражения: a>3 .and. a<5. Выражение истинно, когда оба отношения истинны, то есть а∈(3,5). Сложные выражения вычисляются в следующем порядке: − числовые операции или строковые операции; − операции отношения; − логические операции. 2.3. Оператор присваивания
Оператор присваивания записывается в виде: переменная = выражение В зависимости от типов переменной и выражения различают: числовое присваивание, символьное присваивание, логическое присваивание. Выполнение оператора состоит в вычислении выражения справа от «=» и присвоения результата переменной слева от «=». После выполнения присваивания прежнее значение переменной утрачивается. В отличие от математических формул знак «=» трактуется не как тождество, а как присваивание. Поскольку выражение вычисляется раньше, чем выполняется присваивание, одно и то же имя может быть указано в операторе одновременно слева и справа от знака «=». Например, k=k+1 означает, что текущее значение переменной k увеличивает на 1. К моменту выполнения оператора переменные, входящие в выражение, должны быть определены. Тип числового выражения назначается автоматически и если он не совпадет с типом переменной, то выполняется преобразование значения вычисленного выражения к типу переменной. 2.4. Ветвления и циклы Конструкция if Под блоком в Фортране понимают один или несколько выполняемых операторов внутри составного оператора. Передача управления извне Практикум по современному Фортрану
104 внутрь блока запрещена. Конструкции if различаются по числу блоков 0, 1, 2, 3, …. Для реализации многоблочного разветвления имеется расширение elseif (условие) then и конструкция, называемая переключателем Select case по целочисленной или символьной переменной. Двухблочный (структурный) условный оператор Конструкция If
Блок-схема да
нет
условие
блок_then
блок_else
If (логическое_выражение) then блок_then между then и else else блок_else между else и endif endif
Одноблочный условный оператор (нет блока_else) Блок-схема
условие нет
да блок_then
Конструкция If
If (логическое_выражение) then блок_then между then и endif endif
Безблочный, по-другому логический, условный оператор Блок-схема
условие нет
да Простой оператор
Конструкция If
If (логическое_выражение) оператор Пример If (x<0) y=abs(x) – единственный простой оператор
Конструкция DO Циклом в программе называют группу (блок) многократно выполняемых операторов. Конструкция do обрамляет цикл do … …блок_do… enddo Имеется три разновидности циклов в Фортране: − бесконечный цикл; − итеративный цикл (цикл по условию); Практикум по современному Фортрану
105 − цикл по переменной (с заранее известным числом повторений). Бесконечный цикл Конструкция Do
Блок-схема
do блок_do, в том числе if (на_выход) exit enddo ! только повтор do
Do Блок DO
Чтобы выполнение цикла когда-либо закончилось, среди операторов блока_DO должен быть хотя бы один exit с условием выхода из цикла. Цикл по условию (итеративный цикл) Конструкция Do
Блок-схема
пока <условие> да Блок DO
Если условие выполняется, цикл продолжается
нет
Do while(условие) Продолжение блок_do программы enddo ! только повтор do
Цикл по переменной Переменная в операторе DO – предпочтительнее целая, но также допускается вещественная или вещественная двойной точности. Формула ⎛
⎛ xk − xn + step ⎞ ⎞ ⎟⎟ ⎟⎟ . step ⎝ ⎠⎠
расчета числа повторений цикла k = Max ⎜⎜ 0, Int ⎜⎜ ⎝
Начало xn, конец xk и шаг step – константы, переменные или выражения одного из перечисленных типов. Опуская подробности, цикл рисуют так: Конструкция Do
Блок-схема
do x = xn, xk, step Блок DO
Продолжение программы
do переменная = xn, xk, step блок_do enddo
Практикум по современному Фортрану
106 Переменная цикла изменяется по закону арифметической прогрессии. Для понимания того, как это происходит, покажем подробную блок-схему, в которой проясняются все детали и правила для цикла по переменной. Функция int() вычисляет целую часть указанного частного. Результат функции max : max (0, +) => + max (0, –) => 0 max (0, 0) => 0 . Подробная блок-схема цикла по переменной Блок-схема
Начало x = xn Количество повторений k = Max(0, Int(xk - xn) / step + 1) 1) да k = 0? 4) нет Конец цикла блок_do 2) 3)
x = x + step k=k-1
Пояснения Здесь х – переменная цикла; xn, xk, step – константы, переменные или выражения. 1) do x=xn,xk,step 2) блок_do 3) enddo 4) продолжение программы enddo – это пункт (3), включающий в себя три действия: − изменение переменной x, − уменьшение k на 1, − переход к (1).
Цикл не выполнится ни разу, то есть k=0, если ⎧ xn < xk ⎧ xn > xk или ⎨ ⎨ ⎩step < 0 ⎩step > 0 Шаг цикла step регламентируется следующим образом: − step≠0; − эквивалентны Do i= 1,10,1 и Do i = 1,10 – по умолчанию step=1; − если step>0, x возрастает, по окончании цикла x > xk; − если step<0, x убывает, по окончании цикла x < xk. В соответствии с подробной блок-схемой цикла по переменной выполнение цикла регламентируется следующим образом: − переменная x в операторе do изменяется автоматически, поэтому изменять ее в блоке_DO запрещено; − не разрешается входить внутрь блока_DO извне, поскольку в этом случае не определено число повторений цикла k и переменная x; − переменные xn, xk, step можно изменять в цикле, это не повлияет на число повторений уже запущенного цикла; − оператор Cycle, встретившийся в блоке_DO, прерывает пункт (2) и вызывает переход к enddo – пункту (3);
Практикум по современному Фортрану
107 − оператор Exit, встретившийся в блоке_DO, прерывает цикл, завершает его досрочно и вызывает переход к пункту (4); − при нормальном завершении цикла переменная x достигает значения x = xn + step *k, а при досрочном выходе сохраняется достигнутое значение x из [xn,xk]. Цикл по вещественной переменной x имеет неустойчивый характер: − при некоторых xn, xk, step цикл выполняется для значения x = xk; − при других xn, xk, step цикл пропускает значение x = xk. Причина: ошибка в k и накопление погрешности округления x=x+step. Такой цикл можно переделать, возможны два варианта: − переделать радикально – построить цикл по целой переменной int, через которую выразить вещественную переменную x. Количество повторений k при этом следует рассчитать перед циклом integer int,k; real x k = . . . ! количество повторений цикла do int = 0, k-1 ! k – число повторений цикла x = xn + int * step ! содержимое прежнего блока_DO enddo
− «подправить» цикл по вещественной переменной, «обманув» DO и переписав его так: do x = xn, xk + step/2, step . Среди операторов блока_DO может встретиться конструкция DO. В этом случае говорят о вложенном цикле. Оценивая количество повторений оператора WRITE внутри вложенного цикла, необходимо помнить, что при каждом повторении внешнего цикла, внутренний цикл повторяется заново: Пример вложенных конструкций DO DO y = -1.0, 1.1, 0.2 DO x = -1.0, 1.1, 0.2 WRITE(1,*) x,y ENDDO ENDDO
! ! !
11 раз 11 раз 121 раз
В файл будет выведена 121 пара значений х и y.
3. Ввод и вывод в Фортране Ввод/вывод осуществляется операторами read/write (по-русски «читаем/пишем»). После операторов read и write в скобках записываются аргументы. Первый аргумент (целое) – условный номер устройства, с которого/на который осуществляется ввод/вывод. Всегда открыта для ввода/вывода консоль, имеющая номер 0 или обозначаемая символом «*». Второй аргумент – ссылка на формат ввода/вывода. Символ «*» в качестве второго аргумента означает, что ввод/вывод выполняется без формата. Бесформатную форму чаще всего применяют при вводе и для отладочной печати. Если важны не только сами значения, но и форма их представления, то используют форматный вывод. Практикум по современному Фортрану
108 3.1. Бесформатный ввод/вывод
Бесформатный ввод/вывод выполняется под управлением списка read(u,*) список_переменных write(u,*) список_переменных_констант_выражений Пример: прочитать переменные p и k и вывести их для контроля: integer k; real p read(1,*)p, k ; write(2,*)’p=’, p, ’k=’, k
Обмен данными происходит в порядке следования элементов списка. В операторе read с устройства №1 читается сначала p, потом k. В операторе write на устройство №2 в одной строке выводятся последовательно: надпись «p=», значение p, надпись «k=», значение k. Данные для ввода подготавливают через запятую, пробел или <Enter> – конец строки. Запись одинаковых чисел упрощает повторитель, например 8,8,8,8,8,8,8, легче записать как 7*8 (в данном случае «7*» – это повторить 7 раз следующее число). Ввод/вывод по списку переменных, с каждой как «p= значение_p»: Namelist /имя_Namelist / список_переменных ! подробности – в помощи read(u,имя_Namelist) или write(u,имя_Namelist)
3.2. Форматный вывод
Вывод без формата, применимый при отладке программ, дискомфортен для пользователя. Для создания привлекательного программного продукта требуется максимум внимания уделить оформлению результатов. Сочетая гибкость и математическую строгость, форматный вывод тут незаменим. Фортран выгодно отличается от других языков тем, что ввод и вывод – операторы языка, и можно выверить форматы еще при компиляции. Концепция форматного вывода Фортрана настолько продумана, что практически не изменялась с момента его появления. Формат размещают в любом месте программы и пишут следующим образом m format(СД), где m – метка, по которой один или несколько операторов write ссылаются на оператор format, СД – список дескрипторов. Пример: real radius = 1 Open (2, file=’Out.txt’) write(2,55) 2*3.14*radius 55 format(1x,'длина окружности'/2x,'с=',F5.2)
Здесь оператор write, используя оператор format с меткой 55, выводит в файл Out.txt две строки (символ «˜» означает пробел) длина окружности ˜˜c=˜6.28 Дадим разъяснения:
– «длина окружности» и «с=» – пояснительные надписи; − символ «/» – признак перехода к новой строке при выводе; − 2x – 2 пробела, F5.2 – поле вещественного числа шириной в пять позиций с двумя цифрами, выводимыми после десятичной точки. Практикум по современному Фортрану
109 Уникальный СД может быть записан внутри оператора write в виде строковой константы, например, write(2, "(1x,'c=',F5.2 ) ") c
Внимание! Такой СД не контролируется компилятором, и ошибки, в отличие от использования оператора format, выявятся на этапе счета. Независимо от того, где записан СД (в операторе format или в операторе write), должны соблюдаться правила: 1. СД заключен в скобки, элементы СД разделены запятыми или, между строками, символом «/»; 2. повторяющуюся последовательность дескрипторов заменяет повторитель, записанный перед дескриптором; например, вместо i4,i4 пишут 2i4; 3. повторяющуюся группу дескрипторов заменяет повторитель, записанный перед скобками, заключающими эту группу; например, вместо 1x,i4,i4,i4, 1x,i4,i4,i4 пишут 2(1x,i4,i4,i4) или, еще короче, 2(1x,3i4). Все повторители – явные целые константы или целочисленное выражение в угловых скобках (< >); 4. дескрипторы в Фортране обозначены одной, реже двумя латинскими буквами, и подразделяются на: − дескрипторы числовых данных I, F, E, D и универсальный G; − дескрипторы нечисловых данных A, L, и универсальные Z, G; − оформительские дескрипторы: ”текст”, ’текст’, X, P, SS, SP, T, TR, TL, «:», «\», «/». Дескрипторы числовых данных Тип
Дескрипторы
Примеры
integer k
Iw
write(1,"(1x,I5)")k
real x
Fw.d - без порядка Ew.d - с порядком Gw.t - с порядком и без
write(1,"(1x,F7.2)")x write(1,"(1x,E11.2)")x write(1,"(1x,G11.2)")x
double precision d Dw.d - двойная точность
write(1,"(1x,D20.13)")b
Пояснения к форматному выводу чисел: 1. w-общая ширина поля, задаваемая по усмотрению программиста, число будет прижато к правому краю и дополнено слева пробелами, если число не поместится в отведенное поле, то увидим «*****»; 2. для вещественных чисел количество цифр задается параметрами: d – сколько цифр после десятичной точки в дескрипторах F, E, D; t – сколько значащих цифр в универсальном дескрипторе Gw.t, сам компьютер «решит», выводить число с порядком (E) или без него (F); 3. для вывода чисел с большим по модулю или неизвестным порядком рекомендуется применять E, D, G.
Практикум по современному Фортрану
110 Дескрипторы нечисловых данных Выводимая строка прижимается к левому краю поля. Тип
Дескрип тор
Примеры
Примечания
Logical M
Lw
write(1,"(1x,L5)")M
Вывод только «T» или «F»
Character[*c] S
Aw
write(1,"(A5)") S
Усекается или дополняется справа пробелами в зависимости от соотношения w и c.
Character[*c] S
A
write(1,"(1x,A)")S
ширина поля c, указана в описании.
Взаимодействие операторов WRITE и FORMAT 1. Оператор write write(номер устройства, ссылка на формат) список вывода пояснения: − куда выводить – направление вывода в виде номера устройства; − что выводить – в списке вывода перечислены выводимые данные, этот список просматривается однократно; − как выводить – данные из списка вывода запрашиваются по мере просмотра СД оператора Format. 2. Оператор format описывает, как выводить данные, интерпретируя список дескрипторов метка format(список дескрипторов), пояснения: − по дескриптору данных запрашивается и выводится элемент списка вывода; если дескриптор данных не подходит элементу списка вывода, то сообщается expected descriptor об ожидавшихся дескрипторах; − по другим дескрипторам выводятся надписи, пробелы, перенос строк; − по концу СД – просмотр повторяется на участке сканирования. Длина списка вывода может быть равной, больше или меньше длины СД. Когда список вывода длиннее, чем СД, просмотр автоматически зацикливается на участке сканирования, который определяется однозначно: − оператор format без внутренних скобок format ( .. .. ) ↑____∞___| – повторение по скобкам формата ; − оператор format с внутренними скобками format((..)..(..(..)..)..) ↑____∞________| повторение по последней паре скобок внутри оператора format . Практикум по современному Фортрану
111 Принцип сканирования реализуется по следующим правилам: − каждый новый оператор write начинает вывод с новой строки, устанавливается начало списка вывода и начало списка дескрипторов; − если встретился дескриптор данных, запрашивается и превращается в текст очередной элемент списка вывода; − попутно исполняются встретившиеся оформительские дескрипторы: по дескриптору «X» вставляются пробелы, вносятся текстовые константы, по дескриптору «/» переносятся строки; − участок сканирования циклически просматривается и интерпретируется до тех пор, пока не будут обработаны все элементы списка вывода; − при возврате к началу участка сканирования вывод продолжается с новой строки; − по концу списка вывода продолжится просмотр и исполнение оформительских дескрипторов до ближайшего дескриптора данных или до дескриптора «:» . Пример. Вывести два целых по формату с одним числовым полем i2. integer::x=12,y=100 Open (2, file=’Out.txt’) write(1,33) x, y ! x, y – список вывода 33 format(1x, i2) ! (1x, i2) – участок сканирования
Поскольку длина списка вывода больше длины списка дескрипторов, возникает сканирование, то есть повторение формата и перенос строки. Повторяется весь список дескрипторов, так как внутри формата скобок нет. В файл Out.txt выведется две строки, начинающиеся с пробела – дескриптор 1х (символ «˜» означает пробел) ˜12 ˜**
Формат пригоден для вывода любого количества целых чисел, которые по величине не превышают 99. Вместо трехзначного числа 100 выведется «**», поскольку ширина поля вывода равна 2 (дескриптор i2).
4. Вычисления с массивами. Массив – множество однотипных переменных или констант с общим именем, доступных по индексу (индексам). Понятиям вектор и матрица из математики в Фортране соответствуют массивы с одним и двумя индексами (допустимо 7). 4.1. Характеристики массива
В современном Фортране свойства объектов описывают так: список_атрибутов :: список_объектов Характеристики массива. 1. Имя массива, как объекта. 2. Тип массива integer, real, complex, logical, character. Практикум по современному Фортрану
112 3. Количество измерений или ранг массива – допускается от 1 до 7. 4. Протяженность – неотрицательное число, указывающее на количество возможных значений индекса по выбранному измерению, например, число строк или число столбцов матрицы. 5. Диапазон индекса – [нижняя:]верхняя границы индекса; если нижняя граница не указана, она равна 1, верхняя - это протяженность. 6. Форма (shape) массива – вектор из протяженностей в порядке описания измерений, измеряется функцией shape(array); форма характеризует порядок размещения элементов в памяти компьютера. Одинаковые по форме массивы называются конформными. 7. Число элементов равно произведению протяженностей по всем измерениям массива, измеряется функцией size(array). 8. Объем памяти, занимаемой массивом, равен памяти, приходящейся на один элемент, помноженной на число элементов; ограничивается объемом памяти компьютера. 9. Когда и как массив размещается в памяти компьютера. 10. Назначение массива как аргумента процедуры: – intent(in) – входной аргумент, – intent(out) – выходной аргумент, – intent(inout) – входной-выходной аргумент. 11. Прочие атрибуты: public, pointer, private, parameter, save, target. Предупреждение. Выбор элемента неописанного массива компилятор воспринимает как вызов функции. Пример. Подсчитать s – среднее и D – среднее отклонение 1 10 1 10 S = ∑ xk и D = ∑ xk − S . 10 k =1 10 k =1 В раннем Фортране массив суммировали поэлементно, в Фортране-90 всё выглядит проще – «читаем – считаем – печатаем результат». Важный принцип современного Фортрана – везде, где используется простая переменная, можно использовать массив, как X в примере abs(X-s). Program sumX ! sum(X)-встроенная функция суммирования вектора Real,Dimension(1:10)::X; real s read(1,*)X; s=sum(X)/10; print *, 'среднее =',s print *, 'среднее отклонение D=',sum(abs(X-s))/10 End Program sumX
4.2. Размещение массива в памяти компьютера
Говоря о размещении массива в памяти, следует прояснить: − какой объем памяти требуется; − в каком порядке элементы массива хранятся в памяти; − когда массив размещают в памяти.
Практикум по современному Фортрану
113 В каком порядке элементы массива хранятся в памяти В большинстве случаев программисту этого не надо знать. В ряде случаев при передаче массива целиком подразумевается именно этот порядок: − при подготовке данных для ввода; − при написании форматов вывода; − при задании начальных значений для элементов массива. Порядок хранения стандартизован в Фортране: для одномерного массива – по возрастанию индекса, для матрицы – по столбцам, для многомерного массива – самый быстрый первый индекс, медленнее второй, наконец, последний – самый медленный, каждый из индексов пробегает все значения по возрастанию, например, dimension P(1:2,1:2,1:2) read(1,*) P ! читать весь массив – понимают как read(1,*) P(1,1,1), P(2,1,1), P(1,2,1), P(2,2,1), P(1,1,2), P(2,1,2), P(1,2,2), P(2,2,2)
Предупреждение. Размещение массива в памяти стандартно и никак не зависит от порядка ввода. Когда массив размещают в памяти Форма статического массива, (предыдущий пример), известна при компиляции – shape(P)=(/2,2,2/); массив размещается в памяти при запуске программы. Форма динамического массива не определена при компиляции, например, Real,allocatable,Dimension(:,:) :: Matrix, Matr1, Matr2, X(:)
Известно лишь количество измерений массивов: два для Matrix и один для X. Запустив программу, сначала определяют протяженности, а затем динамически размещают массивы в памяти оператором allocate( X(1:N), Matrix(1:M,1:N), Matr1(1:N ,1:M), Matr2(1:N,1:N) )
Освобождают память оператором deallocate( X, Matrix, Matr1, Matr2 )
Массив как аргумент процедуры размещен до входа в процедуру; в нее передается его адрес, независимо от способа написания размерности: Dimension(1:N) - в виде переменной; Dimension(1:10) - в виде константы; Dimension(:) – без указания размерности; Dimension(*) – в виде массива, перенимающего форму; Dimension(1:N,1:M) – в виде массива с перераспределением памяти между строками и столбцами, например 3*4=4*3=2*6=6*2=12.
В любом случае количество элементов можно узнать с помощью функции size(array), а для матрицы число строк – size(Matrix,dim=1), число столбцов – size(Matrix, dim=2). Пример (массивы X, Y, P, Q конформны): real,dimension(1:11):: X,Y ! массивы X,Y по 11 элементов real,dimension(-5:5):: P,Q ! P,Q – по 11 элементов с номерами 5,.. 0,.. 5 Y=sin(X+0.5)/4 + 2.1; p= Y/2; Q=P-1
Практикум по современному Фортрану
114 4.3. Секции массивов и неявный Do в списках ввода/вывода
Неявным Do называют конструкцию вида (v, i=iн,iк,is) в которой v – список переменных или выражений, зависящих от i; это могут быть элементы массива. Скобки ограничивают область действия цикла по i. Допускается вложение циклов. Поскольку речь идет об индексах, то i, iн, iк, is – целые величины. Неявный Do используют, если требуется изменить стандартный порядок ввода или вывода Неявный Do
Задание
Используя секции
read(*,*)(M(1,j),j=1,3)
read(*,*)M(1,:)
Ввод второго столбца read(*,*)(M(i,2),i=1,3)
read(*,*)M(:,2)
Ввод первой строки Ввод диагонали матрицы
read(*,*)(M(i,i),i=1,3) В данных - диагональ матрицы
Вывод матрицы по строкам с номерами
write(*,1)(i,M(i,1:3),i=1,3) 1 format(1x,'№',i1,':',3i3)
5. Программы, модули и механизмы обмена данными Простейшую задачу реализуют одной программой. Сложную задачу разбивают на подзадачи, которые реализуют в виде нескольких программ. Главная программа вызывает процедуры, те в свою очередь другие процедуры, и т.д. Объекты, обрабатываемые многими программами, помещают в централизованное хранилище – модуль. Программы и модули, объединяют термином программная единица (ПЕ) – это конструкции четырех видов: Программные единицы Программы – носители данных для внутренних процедур
Главная программа Program P use модуль Описания действия Contains пачка внутренних процедур, с импортом описания внешней программы-носителя end Program P
Процедуры
Модуль
Подпрограмма
Функция
Subroutine S (аргументы) use модуль Описания объектов действия Contains пачка внутренних процедур с импортом описания внешней программы-носителя End Subroutine S
Function F (аргументы) use модуль описания объектов, включая имяF действия, включая имяF=выражение Contains пачка внутренних процедур с импортом описаний внешней программы-носителя End Function F
Module M use другой_модуль Описания объектов действий нет contains модульная процедура contains ..внутрен. процедуры end мод. процедура ..модульные процедуры End Module M
Практикум по современному Фортрану
115 Программы состоят из описаний объектов и действий над ними, модули – только из централизованных описаний объектов и процедур доступа к ним из других программ и модулей. Процедуры вызывают, чтобы выполнить предусмотренные действия, среди которых также могут быть новые вызовы процедур. Помимо возникающих цепочек вызовов программ в сложной задаче строятся цепочки использования модулей. Циклы в цепочке вызовов программ (рекурсия, то есть вызов самое себя) допустимы, а циклы в цепочке использований модулей (тавтология) недопустимы. 5.1. Двухуровневая структура программ
Решая сложную задачу, программист выстраивает систему обозначений объектов, комбинируя компоненты проекта: − внешние программы, имеющие независимые системы обозначений, могут компилироваться отдельно от других ПЕ проекта; − вложенные процедуры, не будучи самостоятельными компонентами, импортируют обозначения носителя данных (внешней программной единицы); − внешние ПЕ импортируют общедоступные обозначения из модуля; − сопоставляются аргументы вызывающей/вызываемой программ. Во внешнюю программу после оператора contains может быть вложена одна или несколько внутренних процедур. Модульная и внутренняя процедура компилируются только в составе внешней ПЕ, внутреннюю нельзя вызывать извне. Кроме того, они импортируют обозначения носителя данных – внешней ПЕ. Программа может быть без оператора contains и без внутренних процедур, как в Фортране-77– не было внутренних процедур. П р о г р а м м н ы е е д и н и ц ы (ПЕ) Программы Главная программа
Подпрограмма
Функция
Модуль как хранилище данных (только внешний)
Program P
Subroutine S(аргументы)
Function F(аргументы)
Module M
ПЕ может быть только внешней
ПЕ может быть внешней внутренней, модульной
ПЕ может быть внешней внутренней, модульной
Mодульные процедуры
Процедуры
Объект модуля доступен по имени в ПЕ, где модуль использовали
Разновидности программ. В проекте одна главная программа и любое количество процедур и модулей. В таблице, приведенной ниже, объекты пронумерованы [1-7], а курсивом выделены части, необязательные в той или иной разновидности: Практикум по современному Фортрану
116 1. у внешней функции (Function) аргументы только входные, в наличии все виды объектов [1-7], но видимыми являются [1-4]; 2. у внешней подпрограммы (Subroutine) аргументы могут быть входными, входными-выходными и выходными, и с ее именем [2] не связывают результатов; 3. модульная процедура (Function, Subroutine) аналогична внешней, но вложена в модуль. В ПЕ, использующей модуль, можно вызывать модульные процедуры, но не их внутренние процедуры; 4. главная программа (Program) может быть только внешней, не имеет аргументов [3] и с ее именем [2] не связывают результатов; 5. внутренняя процедура не самостоятельна – она вложена во внешнюю или в модульную программу, импортируя её обозначения. Саму её не компилируют и не вызывают извне. Видимыми объектами являются [1-7]. Заголовок имя_внешней_программы(аргументы) ! уровень 1 ! делает объекты модуля видимыми [1] use имя_модуля [2] описание имя_внешней_программы ! только для функции [3] описание аргументов ! видимы из внутренних процедур [4] описание переменных ! видимы из внутренних процедур действия над всеми видимыми объектами [1-4] внешней программы имя_внешней_программы = выражение ! только для функции [2] contains ! уровень 2 - внутренние процедуры Заголовок имя_внутренней_процедуры(аргументы) [5] описание имя_внутренней_процедуры ! только для функции [6] описание аргументов [7] описание переменных действия над всеми (внутри и вне) видимыми объектами [1-7] имя_внутренней_процедуры=выражение ! для функции [5] end Заголовок имя_внутренней_процедуры .. .. пачка внутренних_процедур.. .. end Заголовок имя_внешней_программы
5.2. Трёхуровневая структура модуля
Модуль, как трёхуровневая структура, может содержать модульные процедуры, которые могут содержать внутренние процедуры. Имена общедоступных public-объектов (public-по умолчанию) - заимствуют его модульные и их внутренние процедуры, а также все, кто использует этот модуль, как-то: другие модули, внешние программы и, транзитом, их внутренние процедуры. Можно вызывать модульные процедуры используемого модуля, тогда как их внутренние процедуры недоступны. Private-объекты доступны только модульным процедурам и их внутренним процедурам.
Практикум по современному Фортрану
117 Module имя_модуля ! уровень 1 [1] use имя_другого_модуля [2] описания производных типов данных [3] public ! описания общедоступных переменных (по умолчанию) [4] private ! описания переменных, доступных только в модуле [5] описания интерфейсов [6] описания списков Namelist ! действий в модуле нет contains процедура МодПроцИмя(параметры) ! уровень 2 – модульная [7] описание функции МодПроцИмя ! только для функции [8] описания параметров ! видимы из внутренних процедур [9] описания переменных ! видимы из внутренних процедур действия над всеми видимыми объектами [1-9] МодПроцИмя = выражение ! только для функции [7] contains
процедура ВнтПроцИмя(параметры) ! уровень 3 – внутренняя [10] описание функции ВнтПроцИмя ! только для функции [11] описания параметров [12] описания переменных действия над всеми видимыми объектами [1-12] ВнтПроцИмя = выражение ! только для функции [10] End процедура ВнтПроцИмя .. .. пачка внутренних процедур … End процедура МодПроцИмя .. .. пачка модульных процедур …. End module имя_модуля
5.3. Вызов процедур и использование модулей
Различают два вида процедур: − Function – процедура-функция, вызываемая в выражении, например, p=имя_функции(аргументы), аргументы только входные – Intent(In); способы определения функции разнообразны – встроенные, операторные, внутренние, внешние, модульные, чистые, однако вызов любой из них аналогичен простейшей встроенной функции z = (x+y) / max(x,y); − Subroutine – процедура-подпрограмма, вызываемая оператором вызова call имя(аргументы), аргументы входные – Intent(In), выходные – Intent(out), изменяющиеся – Intent(Inout). Неисполняемый оператор использования модуля use имя_модуля пишут сразу после заголовка ПЕ. Любая ПЕ может использовать модуль, присоединяя общедоступные объекты с атрибутом public.
Практикум по современному Фортрану
118 Передача данных через аргументы процедуры. Объекты вызывающей программы в скобках после имени вызываемой процедуры называют фактическими аргументами. Объекты вызываемой программы в скобках после имени в заголовке процедуры, называют формальными аргументами. Количество фактических и формальных аргументов должно совпадать. Попарно в порядке следования фактические и формальные аргументы должны соответствовать по типу, назначению и форме. Совпадения имен сопоставляемых фактических и формальных аргументов не требуется, но и не запрещается. Память под формальные аргументы, в том числе и под массивы, в процедуре не резервируется: из вызывающей программы передается адрес объекта, с которым работает процедура. Возвращаемое значение функции связано с её именем и по форме может быть скаляром, вектором, матрицей, многомерным массивом, описываемым атрибутом dimension. На аргументы накладывается ряд ограничений: 1. формальные аргументы могут быть только переменными и массивами; 2. фактические входные аргументы могут быть: − переменными, константами, выражениями, − массивами, секциями массивов элементами массивов, − именами внешних или встроенных функций; 3. фактические выходные и изменяющиеся аргументы могут быть только переменными, элементами массив, массивами, секциями массивов. В вызывающей ПЕ, лучше в используемом модуле, для внешней процедуры пишут оператор Interface, который описывает правила её вызова. Для модульных и внутренних процедур интерфейсы считаются явными и их описывать не надо. Оператор Interface описывает: − вид процедуры Function или Subroutine; − имена и порядок следования формальных аргументов; − формальный аргумент пишут с атрибутом intent – назначение, имеющим одно из трёх значений: intent(in), intent(out), intent(inout). До Фортрана-90 интерфейса не было, так надо ли его описывать: 1. встроенным, внутренним и модульным процедурам интерфейс не требуется; 2. интерфейс помогает исключить ошибки вызова внешних процедур; 3. интерфейс обязателен или должен быть явным: − для процедур с необязательными и ключевыми аргументами, − для функций с атрибутом dimension , − для чистых (pure) функций и подпрограмм.
Практикум по современному Фортрану
119 Операторы End, Stop, Return К оператору End применимы следующие правила: 1. после оператора End рекомендуется повторять заголовок ПЕ Subroutine name(аргументы) Операторы End Subroutine name ;
2. End – это последний оператор ПЕ, не только конец текста, но и нормальное завершение программы, что означает: − в главной программе – закрытие файлов, освобождение памяти и возврат в ОС, − в процедуре – освобождение динамической памяти и возврат в вызывающую программу. Оператор Stop по действию похож на End главной программы, только может встретиться в любом месте проекта – это, скорее всего, прекращение приложения из-за ошибки, на консоли – stop program terminated. Оператор Return по действию похож на End процедуры. Смысл оператора Return в следующем: он может появляться в любом месте любой из процедур – это всегда досрочное завершение активной процедуры. 5.4. Обмен данными в проекте
ПЕ проекта получают данные и формируют результаты. Помимо передачи данных через аргументы в Фортране-90 появились два новых способа поимённого доступа к объектам: − вложенные процедуры импортируют объекты носителя данных; − объекты модуля общедоступны (public и по умолчанию public) там, где его используют (use), кроме локальных (private) объектов. Присоединение данных носителя Носителем данных может быть: − внешняя программа для своих внутренних процедур; − модуль для своих модульных процедур; − модульная процедура для своих внутренних процедур. Пример: попадают ли пять точек в круг? Program Host integer :: i; real :: R=5 ! радиус real,public,dimension(1:2) :: x0=(/1,1/) ! координаты центра real, dimension(1:2,1:5):: Array Open(1,File='In.txt'); Open (2,File='Out.txt') write(2,22) R,x0; read(1,*) Array do i = 1,5 if(InCircle(Array(:,i)) write(2,2)Array(:,i),'внутри круга' enddo 2 format ('Точка с координатами [', f6.2, ',', f6.2, '] - ',a) 22 format ('Окружность радиуса ', f6.2,& ' с координатами центра [', f6.2, ',', f6.2, ']')
Практикум по современному Фортрану
120 contains logical function InCircle(x) !модульная процедура: точка в круге? real,intent(in),dimension(1:2):: x ! аргумент - координаты точки real:: R=1 ! радиус InCircle = sum((x-x0)**2) < R*R end function InCircle end Program Host
Вложенная функция InCircle манипулирует с объектами носителя так: − x0 присоединяется; − секция Array(:,i) передается через аргументы как x в процедуре; − функция пользовалась бы локальным R=1, а не одноименным R=5 из главной программы, о чем нет даже предупреждения; − чтобы воспользоваться R=5 главной программы, надо удалить зачеркнутую строку real:: R=1 из процедуры InCircle. Присоединение данных модуля Модуль – централизованное хранилище общедоступных объектов, описываемых в проекте однократно. Оператор «use имя_модуля» размещают вслед за заголовком программной единицы – и тогда появляется доступ к объектам модуля: константам, переменным, массивам (атрибут public по умолчанию), интерфейсам процедур, спискам Namelist, производным типам данных, модульным процедурам, обслуживающим объекты модуля. Пример: попадают ли 5 точек в круг радиуса 5 с центром в точке (1,2)? Module Mo real,dimension(1:2)::p0=(/1,2/) ! x,y - координаты центра real,public:: R=1 ! инициализация радиуса real,dimension(1:2,1:5)::P ! 5 точек (x,y) contains function InCircle() logical,dimension(1:5)::InCircle InCircle=(p(1,:)-p0(1))**2+(p(2,:)-p0(2))**2 < R**2 end function InCircle end Module Mo Program Use_Module use Mo R=5 ! изменение радиуса Open(1,File='In.txt'); Open(2,File='Out.txt') read(1,*) P; write(2,22) R,p0, P 22 format('Радиус:',f6.1,' центр:[',f6.1,',',f6.1,']'/& 'Точки:'/(2f6.1) ) write(2,*) InCircle() ! логический вектор для точек if( all(InCircle()) ) write (2,*) 'все точки внутри круга' end Program Use_Module
Радиус real::R=1 указан в модуле. В главной программе написать real::R=5 нельзя – это вызовет ошибку, а вычислить R=5 можно.
Практикум по современному Фортрану
121 Оператор use может исключать ошибки, вызванные коллизией имен: − с помощью оператора use Mo, only: x0, InCircle можно ограничить список используемых имен модуля; − заменив имя R на несуществующее имя R_null (use Mo, R_null=>R), можем писать оператор real::R в главной программе. Приписав объекту модуля атрибут private – локальный, можно запретить к нему доступ извне модуля. Проектируя модуль, следует избегать общедоступных (public) тривиальных имен вроде i, j, k, a и т.п.
6. Встроенные функции Фортрана Встроенные функции являются неотъемлемой частью языка Фортран и их имена входят в число ключевых слов. В учебниках на русском языке наиболее полное описание имеется в [10]. У каждой функции – уникальное имя, типы аргументов. У многих функций имеются необязательные и ключевые аргументы. Многие функции заимствуют у одного из своих аргументов форму (такие функции называют элементными) и тип возвращаемого значения (такие функции называют родовыми). В Фортране-90 числовые функции стали элементными и родовыми: если аргумент – массив, то и результат – конформный массив того же типа, полученный применением функции поэлементно. Ряд математических функций, как max, min, abs,… являются родовыми, заимствующими тип у своего аргумента. В зависимости от выполняемых действий функции принято разбивать на группы. При работе с тригонометрическими функциями величину угла задают в радианах или в градусах, добавляя окончание d к имени функции. 6.1. Числовые функции Функция
Возвращаемое значение
max(a1, a2, a3,..)
Максимум из значений аргументов: max(-8.3,6.0,2.0)=6.0; все аргументы должны быть либо целые, либо вещественные.
min(a1, a2, a3,..)
Минимум из значений аргументов: min(-8.0,6.0,2.0) = –8.0; все аргументы должны быть либо целые, либо вещественные
abs(a)
|а| – абсолютная величина аргумента.
mod(a,p)
Остаток от деления первого аргумента на второй; mod(1, 2)=1; . mod(18,2)=0
int(a)
Целая часть аргумента; int(-5.7) = –5; int(0.9)=0
nint(a)
Ближайшее к аргументу целое число (округление): nint(-5.7) = –6; nint(0.9)=1
sign(a,b)
Абсолютное значение первого аргумента со знаком второго: sign(1.0,-1.0E-25) = –1.0
sqrt(x)
Квадратный корень из аргумента (аргумент ≥ 0)
exp(x); log(x); log10(x)
Экспонента еx ; натуральный логарифм lnx (x>0); десятичный логарифм lgx (x>0).
Практикум по современному Фортрану
122 Функция
Возвращаемое значение
sin(x); cos(x); tan(x); cotan(x)
sin x; cos x; tg x; ctg x (угол – в радианах, вещественное значение)
sind(x); cosd(x); tand(x); cotand(x)
sinx; cosx; tgx; ctgx (угол – в градусах)
asin(x)
arcsinx (|x|<1.0). Результат – в радианах. (-π/2
acos(x)
arccosx (|x|<1.0). Результат – в радианах. (0
atan(x)
arctgx. Результат – в радианах. (π/2
sinh(x); cosh(x); tanh(x)
shx, chx, thx - синус, косинус, тангенс гиперболический
6.2. Функции редукции массивов
Редукция в переводе с английского – «сокращение»; применительно к функциям – количество измерений результата меньше, чем у исходного массива. Количество измерений уменьшается на 1 или до 0. Аргументы функции, указанные в квадратных скобках, необязательны и могут отсутствовать. Ключевые слова аргументов функций: 1. Array – числовой массив; 2. Dim - номер сокращаемого измерения, возможны два варианта: − если аргумент Dim не указан, результат – скаляр (0 измерений); − Dim указывает номер измерения, исчезающего в результате. Для одномерного массива в обоих случаях в результате – скаляр; 3. Mask – свойство массива Array для участия в подведении итогов. Важное требование: Array и Mask – конформные массивы. Для одномерных массивов это означает, что у них равное количество элементов. Mask задают в виде логического выражения от числового массива, чтобы гарантировать конформность. Каждый аргумент может быть: − позиционным – под порядковым номером в списке аргументов функции, без ключевых слов «array=»,« mask=»,« dim=»; − ключевым – аргумент задается с ключевыми словами «array=», «mask=», «dim=» независимо от номера в списке аргументов. Одномерные массивы Все ответы в примерах, приведенных ниже, получены для одномерного вещественного массива: Real, dimension(1:7)::
Ar;
Массив Ar=[ 2.1, -0.7, 0.0, 17., -12., 0.4, -35.5 ] Номера элементов 1 2 3 4 5 6 7
Положение экстремума Integer,dimension(1:1):: Num Num = MaxLoc(array [,mask]) ! Num(1)- номер максимума Num = MinLoc(array [,mask]) ! Num(1)- номер минимума Практикум по современному Фортрану
123 Для одномерного массива возвращается целочисленный однокомпонентный вектор с номером минимального (MinLoc) или максимального (MaxLoc) элемента массива Array = Ar. Примеры 1. Найти номер максимального элемента одномерного массива Ar. Integer, dimension(1:1):: Num Integer M Num=MaxLoc(Ar); M = Num(1)
Можно применить к вектору MaxLoc(Ar) любую функцию редукции, тогда получим скаляр: M=Sum(MaxLoc(Ar)) В результате: М = 4 – для максимального элемента Ar(4) = 17.0 2. Найти номер минимального положительного элемента массива Ar. Integer, dimension(1:1):: Num Integer M Num=MinLoc(Ar,mask=Ar>0); N=Num(1) или Num = Sum(MinLoc(Ar,mask=Ar>0));
В результате: N=6 – для минимального положительного элемента Ar(6)=0.4 . Итоговые числовые функции с редукцией массивов Для одномерного массива результат редукции – это скаляр, как итог по всему массиву. Итоговые числовые функции перенимают тип у массива: Real,dimension(1:5):: Ar; Real value Value = MinVal(array[,dim] [,mask]) ! Value = MaxVal(array[, dim][,mask]) ! Value = Sum(array[, dim][, mask]) ! Value = product(array[, dim][, mask])
минимум максимум сумма ! произведение
Примеры 1. Найти значение минимального положительного элемента массива Ar Real Zmin Zmin=MinVal(Ar,mask=Ar>0) или Zmin=MinVal(Ar,1,Ar>0)
В результате: Zmin = 0.4 2. Найти значение максимального элемента Ar из интервала [0.1, 17.6] Real Zmax Zmax = MaxVal(Ar, mask =Ar>0.1.and.Ar<17.6)
В результате: Zmax = 17.0 3. Найти сумму квадратов положительных элементов секции Ar(1:7:3) Real SumQu SumQu = Sum(Ar(1:7:3)**2, mask=Ar(1:7:3)>0)
В результате: SumQu = Ar(1)2 + Ar(4)2 = 2.12 + 172 = 293.41 Внимание! Типичная ошибка – Array и mask разной длины:
Практикум по современному Фортрану
124 − ошибка выявится при компиляции
SumQu=Sum(array=Ar(1:7:3)*2,mask=Ar>0)
− ошибка не может быть выявлена при компиляции
SumN = Sum(array = Ar(1:N),mask = Ar>0)
4. Найти произведение модулей ненулевых элементов секции Ar(3:7) Real Prod Prod = Product(abs(Ar(3:7)), mask=Ar(3:7)/=0)
В результате: Prod = Ar(4) * Ar(5) * Ar(6)* Ar(7) = 17.0*12.0*0.4*35.5 = 2896.8 Итоговые логические функции с редукцией массивов Итоговые логические функции возвращают логическое значение: Any(mask[,dim]) – результат «истина», если в массиве есть элементы со свойством mask; иначе говоря, это логическое ИЛИ элементов маски; All(mask[, dim]) – результат «истина», если все элементы массива со свойством mask; иначе говоря, это логическое И элементов маски. Примеры 1. Есть ли в массиве Ar элементы, по модулю большие 30 ? Logical L1 L1 = Any(abs(Ar)>30) ! В результате: L1 = .TRUE.
Другой пример if(Any(abs(Ar)>30))print *,’в Ar есть элементы > 30’
2. Все ли элементы секции массива Аr(5:7) отрицательны? Logical L2 L2 = All(Ar(5:7)<0) !
В результате: L2=.FALSE.
Другой пример: if(.not.All(Ar(5:7)<0))print *,’ Аr(5:7) – не вся секция < 0’
Итоговый счетчик Возвращается целое число – количество элементов, со свойством mask int=count(mask[,dim])– сколько элементов удовлетворяет mask. Пример Найти количество элементов массива Аr, по модулю больших 11. Integer K11 K11 = Count(abs(Ar)>11)
В результате: K11=3 – три элемента: Ar(4), Ar(5) >11, Ar(7) Двумерные массивы Положение экстремума Возвращается целочисленный двухкомпонентный вектор с номером строки и столбца, где расположен экстремум. В примерах везде рассматри-
Практикум по современному Фортрану
125 вается матрица Matr и целочисленный вектор Num для хранения местоположения экстремума: Real, dimension(1:2,1:5) :: Matr. Integer, dimension(1:2):: Num 1
Вещественный массив (матрица)
1 2
-11 -21
2
3
4
5
–12. –22.
–13. –23.
–14. –24.
–15. 0.
Num = MaxLoc(array[,mask]) ! координаты максимума Num = MinLoc(array[,mask]) ! координаты минимума Примеры 1. Найти координаты максимального элемента массива Matr Integer, dimension(1:2):: Num Num = MaxLoc(Matr)
В результате: Num= [ 2, 5 ] для Matr(2,5) = 0. 2. Найти координаты максимального отрицательного элемента Matr Integer, dimension(1:2):: Num Num = MaxLoc(Matr, Matr<0)
В результате: Num = [ 1, 1 ] для Matr(1, 1) = –11. 3. Найти номер max по модулю элемента первой строки массива Matr Integer, dimension(1:1):: Num ! поиск максимума в первой строке (одно измерение) Num = MaxLoc(abs(Matr(1,1:5))); N = Num(1)
В результате: Num(1) = 5; N = 5 для Matr(1, 5) = –15. 4. Найти номер min элемента > (-20) в третьем столбце массива Matr Integer, dimension(1:1):: Num ! поиск минимума в третьем столбце (одно измерение) Num=MinLoc(Matr(1:2,3),Matr(1:2,3)>-20)); N=Num(1)
В результате: Num=[ 1 ]; N = 1 для Matr(1, 3) = –13. Редукция двумерных массивов Обсуждая аргумент dim, будем говорить о суммировании, имея в виду и другие операции. Для двумерного массива аргумент dim может отсутствовать или принимать значения из {1,2}: − нет dim: возвращаемое значение – скаляр, сумма по всему массиву; − dim =1: возвращаемое значение – вектор-строка, полученная в результате суммирования строками; − dim =2: возвращаемое значение – вектор-столбец, полученный в результате суммирования столбцами. Числовые функции заимствуют тип результата у массива array: MinVal(array[,dim][, mask]) – минимальное значение; MaxVal(array[,dim][, mask]) – максимальное значение; Sum(array[,dim][, mask]) – сумма; Практикум по современному Фортрану
126 Product(array[,dim][, mask]) – произведение. Примеры 1. В матрице Matr найти минимум среди элементов, больших (-20) Real S S = MinVal(Matr, mask=Matr>-20)
Аргумент dim отсутствует. В результате число: S = -15.0 2. Найти max элементы в каждом столбце Matr (вектор-строка) Real, dimension(1:5) S S = MaxVal(Matr, dim=1)
В результате массив: S(1:5)= [ –11.0, –12.0, –13.0, –14.0, 0.0 ] 3. Найти вектор-столбец с построчными суммами элементов матрицы Matr, больших –22.5 Real, dimension(1:2) S S = Sum(Matr, dim=2, mask=Matr > -22.5)
В результате массив: S(1)=– 11.0 – 12.0 – 13.0 – 14.0 – 15.0, S(2)=21.0 – 22.0 + 0.0 => S(1:2)= [ – 65.0, – 43.0 ] 4. Найти вектор-столбец с построчными произведениями ненулевых элементов матрицы Matr с нечетными индексами столбцов. Real, dimension(1:2) S S=product(Matr(:,1:5:2),2,mask=Matr(:,1:5:2)/=0)
В результате массив: S(1) = (-11)*(-13)*(-15) = –2145.0 S(2)= (-21)*(-23) = 483.0 Логические функции возвращают логическое значение или массив: any(mask[,dim]) – результат «истина», если в массиве есть элементы со свойством mask, то есть логическое ИЛИ элементов маски; all(mask[,dim]) – результат «истина», если все элементы со свойством mask, то есть логическое И элементов маски. Примеры 1. Есть ли в матрице Matr элементы, по модулю превышающие 30? Logical L L = Any(abs(Matr)>30)
Аргумент dim отсутствует. Результат – скаляр, L = .FALSE. 2. В каждой строке матрицы Matr: есть ли элементы > (–1)? Logical, dimension(1:2) L L = Any(Matr>-1, dim=2)
Результат логический массив (вектор-столбец) L(1:2) =[.false.,.true. ] 3. В каждом столбце матрицы Matr: все ли элементы отрицательны? Logical, dimension(1:5) L L = All(Matr<0, dim=1)
Результат – логический массив (вектор-строка) L(1:5)=[.true.,.true.,.true.,.true., .false. ]
Практикум по современному Фортрану
127 Итоговый счетчик возвращает целое число или целочисленный массив – количество элементов, удовлетворяющих условию mask Count(mask[,dim]) Примеры 1. Подсчитать количество отрицательных элементов в матрице Matr. Integer K; K = Count(Matr<0) Аргумент dim отсутствует. В результате – число K=9 2. Подсчитать количество отрицательных элементов в каждой строке матрицы Matr Integer,dimension(1:2) K K = Count(Matr<0, dim=2) Результат – целочисленный массив (вектор-столбец) K(1:2)= [5, 4] 6.3. Линейная алгебра и генератор случайных чисел
В этом разделе описываются действия над матрицами и векторами, которые должны иметь подходящие размерности, как принято в линейной алгебре. Для статических массивов эти соотношения контролируются. Функция
Аргументы
Результат
Умножение матриц 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]
6.4. Функции для определения размеров массивов
Для всех функций: Array – массив, dim – номер измерения. Функция Size(Array)
Результат
Примечания
Целое число, количество Рекомендуется для определения элементов массива Array. длины одномерного массива.
Целое число – протяжен- При dim = 1 определяется количеSize(Array,dim) ность вдоль заданного ство строк двумерного массива, при dim = 2 – количество столбцов. измерения. Shape(Array)
Целочисленный вектор из протяженностей по каждому измерению массива.
Число компонент результирующего вектора равно количеству измерений массива Array (для двумерного массива – это 2) Практикум по современному Фортрану
128
7. Справочные материалы 7.1. Инструкция для работающих в DevStudio
Компактная (110мб) среда разработки программ MS Developer Studio (DevStudio) – для обучения Fortran Power Station (FPS40) и Cи++. Новая cборная среда – это MS Visual Studio, C++, C# плюс Intel Fortran compiler. DevStudio снабжена текстовым редактором, компиляторами, сборщиком, отладчиком. По клавише – запуск программы (FPS40 скомпилирует, скомпонует и выполнит новую версию программы). FPS40 воспринимает программы в свободном формате с расширением f90. Работу с FPS40 начинают с создания проекта: − создайте свою папку в некириллическом каталоге, как ../myProject; − создайте новый проект; File | New | Project WorkSpace | Console Application; − задайте сверху справа некириллическое имя проекта; − внизу через Browse выберите место для размещения проекта ..myProject и нажмите кнопку – создать проект; − по кнопке Save all обязательно сохраните весь проект. Два варианта включения текста программы в состав проекта: − включить в проект ранее записанную программу lab.f90 через меню Insert | File into project ==> выбрать ..myProject\lab.f90; − создать текст программы Lab.f90 внутри DevStudio File | New | Text File Создание текста программы внутри DevStudio и включение в проект: − выбрать в меню File | New | Text ; − File | Save as ==> задать имя программы вроде Lab1.f90 и выбрать место для размещения программы .. myProject; − набрать текст программы; − щелкнуть на панели инструментов по кнопке Compile для первой компиляции и на вопрос «включать ли программу в проект?» дать утвердительный ответ. Удобно помимо программы включать в проект следующие тексты: − исходные данные создать как новый текст – через меню Insert | File into project ==> выбрать myProject \in.txt, тогда при выполнении программы данные читаются из файла в текущем каталоге проекта с именем, указанным в операторе open. − текст результатов включается в проект под именем, указанным в операторе open. Все тексты, кроме программы, именуйте, используя расширение .txt, чтобы они были доступны в любом тестовом редакторе. Тексты программы и результатов составят распечатку для отчета.
Практикум по современному Фортрану
129 Вызов FPS40 и окончание работы Вызов FPS40 – четырехцветный ярлычок MS Developer Studio. Чтобы закончить работу с программой и сохранить всю информацию, достаточно закрыть приложение, щелкнув по крестику в верхнем правом углу окна приложения. При повторном входе продолжается последний проект. Варианты создания программы – переключатель Debug | Release : − Debug – отладочный вариант программы (запуск ) ; − Release – чистовой вариант программы (запуск +) . Варианты запуска программы на выполнение: − отладка: после коррекции щелкните по клавише ; FPS40 скомпилирует, скомпонует и выполнит программу в отладочном режиме; − то же, что – на панели инструментов «стрелка вниз» (всплывет надпись «go»); − дополнительные возможности по отладке программы: - – отладка пошаговая, - вместо – , чтобы не «нырять» в подпрограмму, - – отладка до места, указанного курсором, - чередование , , при «хитрой» отладке, - , : мышку на переменную – появится её значение; − без отладки: +, либо через меню Build | execute Lab1.exe с паузой для просмотра консоли; − при работе под Vista не пользуйтесь Debug. Редакторы простых текстов для набора программ Традиционно текст программы, адресованный компилятору с Фортрана или Cи, готовится редактором простых текстов (plain-текстов), т.е. текстов без рисунков, мультимедиа и прочих встроенных объектов. Редакторы: − в составе Developer Studio, Visual Studio для Windows; − редактор в составе FAR (кодировки Windows/ANSI и DOS/ASCII); − многооконный MULTI-EDIT 8.0 для Windows и DOS; − блокнот Windows; − Geany под Linux и другие. Инструменты – мышь и клавиатура. Объекты, с которыми работают редакторы – файлы на диске, окна на экране и текстовые блоки в окнах. При создании текста на Фортран-90 следует называть файл имя.f90, на Фортран-03 – имя.f03 . Работая в среде Windows, пользуются редакторами, которые придерживаются кодировки ANSI, принятой в Windows. Выбирая кодировку для набора текста программы, следует знать: − в DOS используется только кодировка ASCII; − в Windows для файлов используются обе кодировки ANSI и ASCII и только ASCII для общения с консолью.
Практикум по современному Фортрану
130 Кодировки ASCII и ANSI для Windows в английской части совпадают, и сообщение на английском языке write(*,*) ’waiting for data’ выведется, независимо от кодировки. В русской части кодировки различаются, поэтому сообщение на русском языке write(*,*) ’жду данных’ выведется успешно, если его набирали в кодировке ASCII, как положено для вывода на консоль в Windows. Если русский текст подготовлен в среде Windows, на экране увидим абракадабру (кодировка ANSI – не для консоли). Рекомендации: 1. текст, выводимый на экран, писать по-английски, например, в диалоге вместо «Введите» писать «Input», либо пользоваться редактором FAR для смены кодировок; 2. текст результирующего файла с русскими словами печатать для отчета из оболочки DevStudio. Традиции оформления текста на Фортране В Фортране придерживаются следующих правил оформления имен: − прописные и строчные буквы не различаются компилятором; − кириллицу используют в оформлении результатов и в комментариях; − пробелы вне ключевых слов и имен, а также пустые строки используются свободно по усмотрению программиста. В Фортране операторы, конструкции и блоки привязаны к строкам текста. Каждая программная единица, каждый составной оператор, каждый блок составного оператора и каждый простой оператор пишутся с новой строки после нажатия клавиши <Enter>. Чтобы короткие операторы не удлиняли текст по вертикали, их разделяют невидимым концом строки «;». Традиционно вложенные конструкции выделяются уступами. Кроме того, разрешается именовать управляющие конструкции, что упрощает их восприятие, например, C1: DO do if(условие 1) cycle c1 if(условие 2) exit c1 enddo ENDDO C1
! к следующей итерации внешнего цикла ! выход сразу из двух циклов
На один и тот же формат по метке ссылаются несколько операторов вывода: write(*,23) ‘начало’; write(*,23) ‘конец’; 23 format(2x,a) Оператор перехода по метке goto считается устаревшим, хотя из языка он не исключен. Рекомендуется в программах не использовать goto. 7.2. Пакет Agrapher для построения графиков
Назначение пакета: вывод на экран и печать графиков функций одной переменной. Пакет прост, его можно применять при выполнении лабораторных, курсовых и дипломных работ.
Практикум по современному Фортрану
131 − Grapher - американский пакет, без русификации; даёт возможность исчерпывающей настройки графика, имеет презентабельный вид. − Agrapher, http://www.alentum.com – российский, для обучения распространяется в России свободно; установите его с русским меню. − Вызов пакета Agrapher в Windows – через ярлык или меню программ в кнопке Пуск. Имеется панель инструментов и контекстное меню. Освоение пакета облегчается обратной связью через картинку. Шесть способов задания графиков в Agrapher: 1. по формуле Y(X); 2. по формуле X(Y); 3. параметрическое задание X(t),Y(t), например, для окружности; 4. по таблице X,Y, задаваемой в самом пакете Agrapher; 5. по системе неравенств, задаваемой логической формулой, как в работах по логике – лучше всего показывать со штриховкой (>0); 6. по импортируемой таблице – меню Файл | импорт таблицы (расширение txt по умолчанию). В процессе открытия или после него: − к показу можно привлечь как линии, так и точки; − можно сменить цвет, размер и форму вывода точек; − можно сменить цвет, толщину и стиль линий. Настройки графика можно сохранить как используемые по умолчанию. Есть сглаживание, численное интегрирование и аналитическое дифференцирование. Agrapher предложит вариант масштабирования, затем: − график масштабируется парными стрелками панели инструментов; − одинарные стрелки панели вызывают смещение графиков; − утопленная кнопка выделения фрагмента позволит увеличить обведенный нажатой мышкой прямоугольный фрагмент, как на картах; − выбрав в меню «свойства графика», можно изменить его настройки, в пункте «построение» можно сменить интервалы по X и Y; − после изменения масштаба следует подправить дробные засечки и метки на осях в «свойствах» графика. 7.3. Уравнения Уравнения прямой
Прямая параллельна оси Х, пересекает ось Y в точке (0,b).
y=b
Прямая параллельна оси Y, пересекает ось X в точке (a,0).
x=a
Прямая проходит через точку (x1,y1) под углом α к оси Х.
(y-y1) = k(x-x1)
k = tg α
Прямая пересекает ось Y в точке (0,b) под углом α к оси Х.
y = kx+b
0 ≤ α<π
y = kx
α ≠ π/2
Прямая проходит через (0,0) под углом α к оси Х.
Практикум по современному Фортрану
132 y − y1 x − x1 = y2 − y1 x2 − x1
Прямая проходит через две точки (x1,y1) и (x2,y2), где x1≠x2, y1≠y2.
Прямая пересекает ось Х в точке (a,0), ось Y в точке (0,b) x y + = 1 или y = (уравнение прямой в отрезках). a b Длина отрезка, соединяющего две точки (x1,y1) и (x2,y2)
b x+b a
(x2 − x1 )2 + ( y2 − y1 )2
Уравнения окружности
(x-x0)2 + (y-y0)2 = R2
Уравнение окружности радиуса R с центром (x0,y0).
⎧ x = x0 + R cos α ⎨ y = y + R sin α 0 ⎩
Параметрические уравнения окружности радиуса R с центром в точке (x0,y0). Аргумент α: 0 ≤ α<2π
Уравнения эллипса, оси которого совпадают с осями координат
Каноническое уравнение эллипса с длинами полуосей а и b ( x − x0 )2 ( y − y 0 )2 + =1 и центром в точке (x0,y0). a2 b2 ⎧ x = x0 + a cos α ⎨ y = y + b sin α 0 ⎩
Параметрические уравнения эллипса с длинами полуосей а и b и центром в точке (x0,y0) 0 ≤ α ≤ 2π Уравнения параболы
Уравнение параболы, ось которой параллельна оси Х, а вершина – в точке (x0,y0).
x =± (y – y0)2 + x0
Уравнение параболы, ось которой параллельна оси Y, а вершина – в точке (x0,y0).
y = ± (x – x0)2 + y0
7.4. Вычисление средних значений
Средние значения множества чисел а1, а2, а3, …, аn: Среднее арифметическое
(a1+ a 2 + a 3 +... + a n ) / n
Среднее геометрическое
Gn = n a1 ⋅a 2 ⋅a 3 ⋅... ⋅a n
Qn =
Среднее квадратичное
Среднее гармоническое
Mn =
(
1 2 a1 + a22 ... + an2 n
)
n , 1 1 1 1 где ai≠0, n – количество ai≠0 + + + ... + a1 a2 a3 an
Практикум по современному Фортрану
133 7.5. Перевод ключевых слов, операторов и терминов Фортрана Allocatable – динамический массив ↓ allocate – разместить в памяти deallocate – освободить память Assignment – присваивание Associate[F03]-выполняемый синоним Array – массив, Array(1:7:2) – секция BackSpace – назад на 1 запись в файле Call SubrName – вызов процедуры Case и CaseDefault – это случаи в ↓ Select Case – перечисление случаев Character – строковый тип Close – закрыть файл Common – общий блок памяти – устарел Compiling – компиляция Complex – комплексный тип Contains–далее вложенные процедуры Cycle – на следующий проход цикла Data – инициализация, устаревшая Declarations – объявления Descriptors i f e l a g дескрипторы данных Dimension – размерность массива Do…EndDo 3 цикла: бесконечный Do i =1,9,2 ... End Do по переменной i Do While(условие) – по условию Double Precision– двойная точность End – конец ПЕ, как end function имя – конец конструкции, как end do Enum[F03] – перечисление (целые) Equivalence – синонимы по описанию Exit – выход из цикла Expression - выражение Exponentials – возведение в степень extends[F03] расширяемые типы, ООП External Intrinsic имя процедуры Forall[F95] – параллельный цикл Format - формат ввода-вывода Statement Function - операторная функция Function – процедура-функция GoTo – переход, устарели все виды If(условие)then оператор 0,1,2.. блоков Else или Elseif – «иначе» для End If двух- и много- блочного IF Implicit None – всё описывать Initializing-инициализация real::x=5.2 Inquire – справка о файле
Integer – целый тип Intent(in)|(out)|(inout) –аргумент вх|вых Interface –интерфейс процедуры.. Labels - метки в диапазоне 1:99999 Logical – логический тип Map -группа полей-синонимов структуры mixed type arithmetic - смешение типов Module – модуль Namelist – список для ввода-вывода Nullify – отцепить указатель Open – открыть файл Optional – необязательный аргумент Operator – операция рус. , не путайте Parameter – константа с именем Pause – пауза – устарела Pointer – указатель Print – вывод на консоль (экран) Procedure – процедуры в интерфейсе Procedure [F03] –объявление процедур Program – главная программа Private – внутренний объект модуля Pure – чистая процедура Public – доступный объект модуля Quadruple число четверно́й то́чности Read – чтение из файла или с консоли Real – вещественный тип Return – возврат из процедуры Rewind – к началу файла Save – хранить не в стеке Single Precision – одинарная точность Statement – оператор языка Stop – конец работы приложения Subroutine – процедура-подпрограмма Target – на кого указывает pointer .true. .false. .and. .or. .not. .eqv. .neqv. – логика Type поле.. endType -производный тип Type(имя)структура.. структура %поле Union..endUnion map-контейнер Use – использовать модуль Where..end Where -параллельный IF Write – записать в файл, на консоль [..] или (/ .. /) – конструктор массива & Continuation Lines – перенос строк ! Comment – комментарий «;» или <Enter> – конец строки в Fortran
Практикум по современному Фортрану
134
8. Литература 1. Алгазин С.Д., Кондратьев В.В. Программирование на Visual Fortran – М.: ” Диалог МИФИ”, 2008. – 472 с. 2. Артёмов И.Л. FORTRAN: основы программирования. – М.: ”Диалог МИФИ”, 2007. –304 с. 3. Бартеньев О.В. ФОРТРАН для студентов. М: ”Диалог МИФИ”,1999. – 400 с. 4. Бартеньев О.В. Современный Фортран. М: ”Диалог МИФИ”, 1999. – 400 с. 5. Голыничев В.Н., Звягин В.Ф., Фрейман И.А., Щупак Ю.А., Яньшина Н.А. Практикум по информатике. Санкт-Петербург: - "СанктПетербургский государственный институт точной механики и оптики (Технический университет) ". 2001. - 94с. 6. Мак-Кракен Д., Дорн У. Численные методы и программирование на Фортране.– 2-е изд.: Пер. с англ. – М.: ”Мир”, 1977. – 584 с. 7. Немнюгин С.А., Стесик О.Л. Современный Фортран. ”Спб,БХВ”, 2003. – 496с. 8. Программирование на Фортране77: Пер. с англ./ Дж. Ашкрофт, Р.Элдридж, Р.Полсон, Г.Уилсон. – М.: ”Радио и связь”, 1990. –272 с. 9. ФОРТРАН 90. Международный стандарт. Пер. с англ. – М.: Финансы и статистика, 1998. – 416 с. 10. Рыжиков Ю.И. Программирование на Фортране Power Station для инженеров – Спб, ”КОРОНА принт”, 1999. – 160с. 11. Рыжиков Ю.И. Современный Фортран. Спб, ”Корона принт”, 2004. 288с.
Практикум по современному Фортрану