Учебные материалы по математике | Программирование на языке фортран лабораторные | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Программирование на языке фортран лабораторные


Программирование на языке Фортран

Сборник лабораторных работ

по дисциплине

«Современные языки программирования

и программные комплексы»

В В Е Д Е Н И Е

Code::Blocks — свободная кроссплатформенная (Windows, Linux и Mac OS X) интегрированная среда разработки, которая поддерживает языки программирования С и С++.

Среда программирования Code::Blocks запускается цепочкой команд Пуск → Все программы → CodeBlocks → CodeBlocks или путем щелчка по соответствующему ярлыку на рабочем столе. Главное окно программы после запуска будет иметь вид, представленный на рис. 1.

Рис 1.

После запуска среды нужно приступать к созданию проекта. Проект это – набор файлов, генерируемых средой программирования и необходимых для последующей компиляции программы (исходные, объектные файлы), а также различные вспомогательные файлы (сохраняющие рабочее пространство и др.). Для создания программы надо выбрать пункт Create a new project.

Во втором окне (см. рис. 2) требуется выбрать тип проекта. Программы, создаваемые при выполнении лабораторных работ относятся к типу – консольное приложение, поэтому потребуется выбрать тип Console application и нажать кнопку GO.

Рис. 2.

В следующем окне осуществляется выбор места хранения создаваемого проекта и его имя (рис. 3).

Рис. 3.

Вводим название проекта и папку, в которой он будет находиться (рис. 4).

Рис. 4

Наконец в последнем окне (рис. 5), предназначенном для выбора компилятора можно оставить все как есть, и нажать кнопку Finish.

Рис. 5.

В результате выполнения вышеописанной последовательности операций будет создан проект и в него будут добавлены все необходимые файлы. Далее раскрывается рабочее окно среды Code::Blocks (рис. 6).

Рис.6.

В левой области окна на панели Management (вкладка Projects) представлена структура проекта. Видно, что в проект (в папку Sourses) автоматически добавлен файл main. f90 (файл, содержащий исходный код программы). Чтобы открыть файл для редактирования, потребуется сделать по нему двойной щелчок правой кнопкой мыши.

Замечание: файл main. f90 не пуст: среда программирования добавляет в него заготовку простейшей программы, печатающей приветствие ″Hello word!″. Это сделано для удобства программиста, который имеет возможность сохранить требуемые ему фрагменты программы (например, program и implicit none или другие операторы.)

После ввода текста программы с помощью кнопки запускается её компилирование, редактирование и выполнение.

При наличии ошибок компиляции обработка программы приостанавливается. В нижней области окна на закладке Build Messages выводится сообщение о природе замеченной ошибки, а слева от текста программы напротив ошибочного оператора ставится цветная метка (рис. 7).

Рис. 7.

При успешном выполнении программы результат выводится на экран монитора в виде окна, представленного на рисунке 8.

Рис. 8.

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 1

ОСНОВНЫЕ ПОНЯТИЯ. ПРОГРАММИРОВАНИЕ РАСЧЕТОВ ПО ФОРМУЛАМ

С п р а в о ч н а я и н ф о р м а ц и я

Программа для ЭВМ состоит из последовательности команд, реализующих алгоритм решения задачи. Каждая из команд языка Фортран состоит из ключевых слов, определяющих характер выполняемых действий над константами, переменными и выражениями. В Фортране используются пять основных типов команд (операторов): присваивание; ввод-вывод информации; передача управления; описание объектов; подпрограммы. Каждая команда на Фортране записывается в свою строку длиной 80 символов.

Основными символами языка Фортран, образующими его алфавит, являются: строчные и прописные латинские буквы A, B, C, …, Z; цифры 0, 1, 2, …, 9; пробел и специальные символы = + — * / ( _ ) , . $ ‘ :. Другие символы, в частности, буквы русского алфавита могут быть использованы только в качестве комментариев к программе.

Константа – величина, значение которой задается в явном виде и в дальнейшем не меняется. Различают следующие типы констант: числовые, логические и символьные. Числовые константы бывают целыми и вещественными.

Целая константа представляет собой целое число:

81, -1230, 0, 225, ….

В Фортран-программе целые константы записываются в форме I (Integer), которая совпадает с записью целых чисел в алгебре.

Вещественная константа – действительное число:

562,401 0,362.10-4 2,57 -0,01276 1,0273.102

В программе вещественная константа может быть записана в одной из трех форм: F, E и D.

Форма F (Fixed) — форма с фиксированной точкой, представляет собой запись вещественной константы с десятичной точкой вместо запятой:

562.401 0.0000362 2.57 -0.01276 102.73

Формы Е (Exponential) и D (Double precision) – формы с плавающей точкой, представляют собой запись вещественной константы в виде мантиссы и порядка. Константа в форме Е имеет мантиссу длиной до 7 цифр и порядок в виде двузначного числа, обозначаемый буквой Е:

0.562401E+03 0.362E-04 0.257E+01 -0.1276E-01 0.10273E+03

а константа в форме D допускает мантиссу длиной до 15 цифр, ее порядок обозначается буквой D и может быть трехзначным числом:

0.562401D+003 0.362D-004 0.257D+01 -0.1276D-01 0.10273D+03

При записи порядка в формах E и D знак "+" и нуль в крайней левой позиции величины порядка могут быть опущены.

Логическая константа используется для обозначения одного из значений: "истина" или "ложь". Значения логической константы, соответственно, задаются ключевыми словами TRUE и FALSE, заключенными между точками:

.TRUE. или. FALSE.

Символьная константа представляет собой последовательность символов, заключенную в апострофы. Апострофы служат признаками начала и конца константы и не являются ее частью. Если последовательность символов содержит апостроф, то в константе он должен записываться в виде пары апострофов. Например, слова ForTran и O’Генри соответствуют символьным константам ‘ForTran’ и ‘O»Генри’.

Переменная – символьное представление величины, которой могут присваиваться различные значения в процессе выполнения программы. Переменная характеризуется тремя параметрами: именем, типом и значением.

Имя переменной может включать в себя буквы латинского алфавита, цифры, знаки подчеркивания и $, но первым символом — всегда должна быть буква. Длина имени может быть от 1 до 31 символа, однако для распознавания используются только первые шесть. Строчные и прописные буквы в имени равносильны, а пробелы не рассматриваются как значащие. Например, имена переменных LONG, Long и L o n g воспринимаются транслятором как одно имя.

Тип переменной определяется по умолчанию или явно. По умолчанию тип переменной принимается числовым и определяется по первой букве ее имени. Если имя переменной, начинается с букв I, J, K, L, M, N, то ей приписывается целый тип, в противном случае — вещественный тип.

Явным способом тип переменной может быть определен с помощью операторов описания типов переменных:

тип[*длина] список

или

тип имя переменной[*длина] [[, имя переменной[*длина]]…],

где тип

– ключевое слово, определяющее тип переменной:

Integer – числовой целый;

Real – числовой вещественный;

Logical – логический;

Character – символьный;

длина

– объем памяти в байтах, выделяемый для переменной указанного типа;

список

имя переменной [[,имя переменной]…] – перечень имен переменных данного типа, разделенных запятыми.

Для переменных типа Integer и Real существуют две допустимые длины: стандартная – 4 байта, которая устанавливается по умолчанию, и дополнительная – 2 байта для целых переменных и 8 байт для вещественных. Переменным типа Logical указывать длину не требуется, так как она постоянна и равна 4 байтам. Длина символьных переменных может колебаться от 1 до 32767 байтов (символов). Например

Integer A, B, C*2

Real Lem, Io*8

Character First*15, SECOND*10

Операторы описания типов должны стоять в начале программы.

Выражение – это последовательность операндов (констант, переменных и функций), соединенных знаками операций и задающая некоторые вычисления. В зависимости от знаков операций, используемых в выражении, различают арифметические, логические и текстовые выражения.

Арифметическое выражение – это запись математической формулы с использованием констант, переменных, функций, знаков арифметических операций и круглых скобок. Для обозначения арифметических операций используются следующие знаки:

"+"

– сложение и

"-"

– вычитание;

"*"

– умножение и

"/"

– деление;

"**" – возведение в степень.

Правила составления арифметических выражений:

1. Все необходимые вычисления должны быть указаны явно, то есть все операнды должны быть разделены знаками арифметических операций. Например, запрещена запись 5.2A, требуется писать 5.2*A;

2. Два символа арифметических операций не могут следовать непосредственно друг за другом. Например, запрещена запись А*-B, требуется писать A*(-B);

3. Порядок выполнения арифметических операций следующий. В первую очередь вычисляются аргументы функций, затем вычисляются сами функции, затем производится возведение в степень, далее умножение и деление и, наконец, сложение и вычитание. Последовательно стоящие однотипные операции выполняются слева направо, кроме операций возведения в степень, которые выполняются справа налево;

1 2 3

D * C / K + D.

4. Использование скобок, как и в алгебре, изменяет последовательность выполнения операций;

2 1 3 4 1 3 4 2

A + B * K — D — 2; (A + B) * K — (D — 2)

5. Операция возведения в вещественную степень допустима только при положительном основании, в целую степень — при любом. Например, операция А**2.5 допустима при А > 0, а А**2 — при любых А;

6. Тип результата арифметического выражения соответствует типу одного из операндов, входящего в него и имеющего наивысший ранг. Ранги операндов определяются исходя из их типов и длин в соответствии с таблицей:

Integer*2 – ранг 1

Integer*4 – ранг 2

Real*4 – ранг 3

Real*8 – ранг 4

Например:

5*ROT

– дает результат Real*4;

I/10

– Integer*4;

J + 0.2D+6

– Real*8;

*** Замечания: – в сложных арифметических выражениях тип результата определяется поэтапно, для каждой отдельной операции, например

(N+1) * A

Первая операция – N+1 – дает целый результат, так как оба операнда целого типа. Вторая операция – умножение результата первой операции на А – дает вещественный результат, так как переменная А вещественного типа. Окончательный результат выражения Real*4.

– неучет типов операндов арифметического выражения может привести к неожиданным результатам, например

5 / 2 * 10 = 20; 64**(1 / 3) = 1;

5 / 2.* 10 = 25.0; 64**(1. / 3) = 4.0 .

Простое логическое выражение определяет соотношение между сравниваемыми величинами. Оно представляет собой логические константы и переменные или арифметические выражения, соединенные символами логических отношений, что позволяет записывать необходимые условия. Выделяют следующие логические отношения:

.EQ. (= =)

– равно;

.NE.(/= )

– не равно;

.GT. (>)

– больше;

.LT. (<)

– меньше;

.GE. (>=)

– больше или равно

(не меньше);

.LE. (<=)

– меньше или равно

(не больше).

Например, результатом выполнения логического выражения A. LT. B. будет. TRUE. (истина), если A<B, или. FALSE. (ложь), если A³B.

Простые логические выражения могут быть объединены в сложные с помощью логических операций. NOT. — "не", .AND. — "и" и. OR. — "или". При вычислении логических выражений используется следующий порядок выполнения операций. Сначала выполняются операции отношения. EQ., .NE., .GT., .GE., .LT. и. LE., а затем. NOT., .AND. и. OR.. Например, условие принадлежности величины X отрезку [-1, 3/2] или интервалу ]3, 8[ будет записываться в виде

X. GE.-1..AND. X.LE.1.5.OR. X.GT.3..AND. X.LT.8.

Для изменения порядка выполнения логических операций или повышения степени их наглядности используются скобки:

((X. GE.-1.).AND.(X. LE.1.5)).OR.(X. GT.3..AND. X.LT.8.)

Текстовое выражение служит для обработки символьных констант и переменных. Для них определена только одна операция – конкатенация – слияние символьных констант и переменных, обозначающаяся символами "//".

Например выражение ‘1 + 1 =’//’ 2′ дает ‘1 + 1 = 2’.

Встроенные библиотечные функции – это программы для вычисления элементарных математических функций (например, sin х, cos х и др.), которые хранятся в библиотеке математических программ Фортрана. Для обращения к функции в арифметическом выражении требуется указать имя функции и далее в круглых скобках фактический параметр в форме константы, переменной или выражения. Ниже в таблице приведены некоторые часто используемые библиотечные функции.

Название

функции

Математическое

обозначение

Обозначение функции

в Фортране

Показательная функция

ex

Exp(x)

Натуральный логарифм

ln x

Log(x)

Десятичный логарифм

lg x

Log10(x)

Синус

sin x

Sin(x)

Косинус

cos x

Cos(x)

Тангенс

tg x

Tan(x)

Арксинус

arcsin x

ASin(x)

Арккосинус

arccos x

ACos(x)

Арктангенс

arctg x

ATan(x)

Квадратный корень

Sqrt(x)

Абсолютное значение

½x½

Abs(x)

Целая часть числа

[x]

Int(x)

При использовании функций следует учитывать, что:

–  тригонометрические функции используют аргумент только в радианной мере;

–  аргументы, приведенных в таблице функций, и результаты их вычислений имеют вещественный тип;

Оператор присваивания – простейший выполняемый оператор Фортрана. Он не имеет ключевого слова и форма его записи имеет вид:

переменная = выражение

Действие оператора состоит в том, что переменная, стоящая слева от символа "=", получает значение, равное результату выполнения выражения, записанного справа. Например

A = c i = i + 1

Res_1 = (1.0 + Exp(x+1))/(x**2 + 1.) Str = ‘МГТУ (МАМИ)’

После вычисления выражения его результат, независимо от типа, приводится к типу переменной. Например, оператор L = 12.1 / 10.4 даст результат, равный единице.

Пример выполнения задания. Вычислить значение функции

при x = 1.5 .

Программа

program lab_1

implicit none

Real x, y

x=1.5

y= 4.*x/(x*x+1.);

print *, ‘x=’,x,’ y=’, y

end program

Результат

З а д а н и е к л а б о р а т о р н о й р а б о т е

Составить программу для вычисления по формулам. Программу протестировать на приведенных данных. Значения аргументов задавать с помощью оператора присваивания. Результаты расчета вывести на экран монитора.

1

При x = 0.5, y = 4.62759Е-02

2

При x = 1, z = 0.97728

3

При x = -1.7, y = -1.370529

4

При x = -0.6, v = -431.1837

5

При x = 0.4, y = 1.17128

6

При x = 1, z = -0.6947773

7

При x = 1, z = -0.1254594

8

При x = 0.3, y = 0.1220199

9

При x = 1, y = 4.225864

10

При x = 1.7, v = 2.943459

11

При x = 1.5, y = 0.1792445

12

При x = 1, z = 0.5330063

13

При x = -1.3, y = -6.9011946

14

При x = -0.8, v = 0.3356272

15

При x = 0.8, y = -0.296262

16

При x = 1.5, z = 1.9183795E-03

17

При x = 0.5, z = -0.1372674

18

При x = 0.3, y = 9.580337E-02

19

При x = 1, y = 1.145531

20

При x = 0.5, v = 1.293568

21

При x = 0.3, y = -1.187293

22

При x = 1, z = 05133697

23

При x = -1.3, Y = 0.6068606

24

При x = 0.5, v = 2.377286

25

При x = 0.4, y = 1. 458705

26

При x = 0.5, z = 1.441137

27

При x = 1, z = 4.4465311E-02

28

При x = 0.3, y = 0.1773368

29

При x = 1, y = 1.289237

30

При x = 0.7, v = -1.044279

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 2

ввод-вывод ИНФОРМАЦИИ

С п р а в о ч н а я и н ф о р м а ц и я

Операторы ввода-вывода служат для обмена информацией между памятью ЭВМ и ее внешними устройствами. Операторы ввода-вывода делятся на две группы: операторы передачи данных и вспомогательные операторы.

Операторы передачи данных. К ним относятся оператор ввода данных Read и оператор вывода информации Write.

Оператор ввода данных Read имеет следующую форму записи

Read ( управление ) список

где — управление – перечень управляющей информации о способе выполнения операции ввода, записываемый в общем виде как

( [ Unit= ] n, [ Fmt= ] f [, Err = s ] [, End = m ] )

Здесь n

– номер канала ввода – целая константа или переменная, принимающая значение от 0 до 32767;

f

– метка вспомогательного оператора, задающего форму ввода данных, или символ "*" при его отсутствии;

s

– метка оператора, которому следует передать управление, если при вводе данных обнаружена ошибка;

m

– метка оператора, которому следует передать управление, если при вводе данных исчерпана вся информация.

список – последовательность имен переменных, разделенных запятыми.

Оператор Read рассматривается как некоторое логическое устройство ввода, с которого будет поступать исходная информация. Канал ввода устанавливает связь этого логического устройства с физическим — клавиатурой, файлами на жестком диске и другими носителями информации. Каналы ввода с номерами *, 0 и 5 по умолчанию закреплены за клавиатурой.

Оператор вывода данных Write имеет форму записи

Write ( управление ) список

где – управление — перечень управляющей информации о способе выполнения операции вывода, записываемый в общем виде как

( [ Unit= ] n, [ Fmt= ] f ).

Здесь n

– номер канала вывода;

f

– метка вспомогательного оператора, задающего форму вывода данных, или символ "*" при его отсутствии.

список – последовательность имен переменных, разделенных запятыми.

Использование канала вывода информации в операторе Write аналогично использованию канала ввода в операторе Read. Каналы вывода с номерами *, 0 и 6 по умолчанию закреплены за экраном монитора.

Использование операторов Read и Write иллюстрируется следующим фрагментом программы:

Write(*, *) ‘ Введите А и В Þ’

Read(5, *) A, B

Write(6, *) ‘ A= ‘, A, ‘ B= ‘, B

При выполнении указанных команд на экран монитора будет выведен текст

Введите A и B Þ

и ЭВМ перейдет в состояние ожидания ввода данных. С клавиатуры надо будет набрать значения вещественных переменных A и B в форме F или E, разделенных хотя бы одним пробелом, например

2.7 0.18Е+03

и нажать клавишу "Enter". Последний оператор Write выведет на экран монитора строку

A= 2.700000 B= 180.000000

Вспомогательные операторы. К ним относятся операторы Open, Close и Format.

Оператор Open позволяет связать канал ввода-вывода, используемый в операторе Read или Write, с требуемым файлом на диске. Общая форма записи оператора

Open ( [ Unit= ] n, File = имя файла [, Status = тип ][, Err = s ] )

где n

– номер канала ввода-вывода;

имя файла

– название файла, записанное в форме символьной константы;

тип

– символьная константа, определяющая статус файла:

‘old’ – старый (ранее созданный);

‘new’ – новый (вновь создаваемый);

‘scratch’ – временный (на время работы программы);

s

– метка оператора, которому следует передать управление, если установить связь с файлом не удалось.

Оператор Close отсоединяет используемый в программе канал ввода-вывода от файла. Общая форма записи оператора

Close ( [ Unit= ] n [, Status = тип ][, Err = s ] )

где n

– номер канала ввода-вывода;

тип

– символьная константа, определяющая статус файла:

‘keep’ – сохранить файл;

‘delete’ – уничтожить;

s

– метка оператора, которому следует передать управление, если при выполнении оператора произошла ошибка.

Совместное использование операторов Read, Write, Open и Close иллюстрируется следующим фрагментом программы:

Open(5, File = ‘dat’, Status = ‘old’)

Open(6, File = ‘res’, Status = ‘new’)

Read(5, *) A, B

Write(6, *) ‘ A= ‘, A, ‘ B= ‘, B

Close(6, Status = ‘keep’)

Close(5, Status = ‘keep’)

Данный фрагмент программы отличается от приведенного выше тем, что значения переменных A и B считываются из файла dat, связанного с оператором Read по пятому каналу, а результат записывается в файл res, который связан с оператором Write по шестому каналу.

Оператор Format – вспомогательный оператор, используемый для описания форм ввода и вывода данных. Он имеет вид

метка Format ( список )

где метка

– метка оператора — обязательный параметр;

список

перечень спецификаций, отделенных друг от друга либо запятой, либо наклонной чертой "/". Спецификации определяют расположение данных во входном или выходном потоке информации и размеры областей, отводимых под числовые, логические и символьные константы.

Оператор Format является невыполняемым оператором и может располагаться в любом месте программы.

Спецификации оператора Format делятся на числовые, символьные, логические и управляющие.

К числовым спецификациям относятся спецификации I, F, E и D, записывающиеся в виде:

Iw, Fw. d, Ew. d, Dw. d,

где w – число позиций, отводимое для записи числа;

d – число позиций в поле w, отводимое для записи дробной части (мантиссы) константы.

Спецификация I используется в операциях ввода-вывода целых констант. Запись Iw указывает, что для целой константы отводится поле из w позиций. Например, по спецификации I3 можно ввести или вывести целую константу 812.

Спецификация F используется в операциях ввода-вывода вещественных констант с фиксированной точкой. Запись Fw. d указывает на то, что для константы отводится поле из w позиций, среди которых d позиций отводятся под ее дробную часть, а остальные – под знак числа, его целую часть и десятичную точку. Например, по спецификации F5.2 можно ввести или вывести вещественную константу -8.12.

Спецификация E используется в операциях ввода-вывода вещественных констант с плавающей точкой. Запись Ew. d указывает на то, что для константы отводится поле из w позиций, среди которых d позиций отводятся под ее мантиссу, а остальные — под знак числа, десятичную точку, признак порядка в виде буквы E, знак порядка и его величину. Например, по спецификации E10.3 можно ввести или вывести вещественную константу -.812E+01. При выводе обязательно должно выполняться условие

Спецификация D используется в операциях ввода-вывода вещественных констант с плавающей точкой. Bce правила, справедливые для спецификации E, справедливы и для D.

Для перечисленных спецификаций действуют следующие правила:

1. Пpи ввoдe пpoбeлы знaчeния нe имeют. Знaк плюc перед числом может отcутcтвовать.

2. Если пpи ввoдe по cпeцификaциям F и E дecятичнaя тoчкa стоит в пoлe ввoдa, то параметр d игнорируется.

3. Если количество передаваемых символов константы меньше размера поля w, то при выводе числа его последняя цифра будет напечатана в крайней правой позиции поля. Оставшиеся позиции заполняются пробелами.

4. Ecли пpи вывoдe чиcлo пpeвocxoдит шиpину выделенного пoля, тo вce пoлe зaпoлняeтcя звeздoчкaми.

5. Если при выводе дробная часть числа не помещается в отведенных d позициях, то число округляется.

6. Если пpи чтeнии констант по cпeцификaциям I, F, E и D пoлe ввoдa coдepжит зaпятую, то считывaниe cлeдующeгo пoля нaчинаeтcя co знaкa, cлeдующeгo зa зaпятoй.

К символьным спецификациям относятся спецификация A, позволяющая осуществлять ввод-вывод символьных строк.

Спeцификaция A имeeт вид A или Aw. B пepвoм cлучae A автоматически пpинимaeт размер пoля, равный длине символьной переменной из списка ввода-вывода. Во втором случае размер поля ввода-вывода определяется значением параметра w, который рекомендуется выбирать равным длине используемой символьной переменной.

Непосредственный вывод символьных строк выполняется путем заключения их в апострофы. Например вывести текст МАМИ можно включив в оператор Format запись ‘МАМИ’. При выводе текста, содержащего внутри себя апостроф, символ апострофа необходимо набрать дважды. Например, чтобы напечатать текст О’Генри необходимо в операторе Format записать ‘O»Генри’.

Управляющие спецификации. К ним относятся спецификации позиционного редактирования T и X и спецификация управления записью «/».

Спецификация T в виде Tn опpeдeляет в записи позицию n, в кoтоpую при выводе или c кoтopoй при вводе будет пepeдaвaтьcя cлeдующий cимвoл.

Спецификация X, используемая в форме nX, при ввoдe пpoпуcкaeт n позиций, а при вывoдe пишет n пpoбeлoв (n – указывать обязательно).

Спецификация «/» используется в качестве разделителя спецификации и указывает на необходимость перехода к обработке следующей записи. При вводе читается новая запись – новая строка файла. При выводе – осуществляется переход на следующую строку.

При использовании оператора Format надо учитывать следующие особенности его работы.

1. Если в нем используются повторяющиеся комбинации спецификаций I, F, E, D, A или L, то перед ними можно использовать параметр повторения, указывающий их количество. Вместо оператора Format(I4, I4, I4, F6.2, F6.2) можно записать Format(3I4, 2F6.2). Аналогичным образом можно повторять и группы спецификаций, заключая их в скобки. Например оператор Format(I4, F6.2, I4, F6.2, I4, F6.2) может быть заменен на Format(3(I4, F6.2)).

2. Если количество спецификаций в операторе Format меньше количества переменных в списке ввода-вывода, то после использования всех спецификаций работа продолжается с первой спецификации, стоящей после последней внутренней открывающей скобки.

3. При выводе данных на экран монитора или принтер первая позиция каждой выводимой строки должна оставаться свободной, так как она используется под управляющий символ терминального устройства и ее содержание не выводится.

Пример выполнения задания. Составить программу для вычисления и печати значений функции

для шести значений аргумента, принадлежащих отрезку от xmin=-3 до xmax= 1. Исходные данные задать в файле dan. Результат поместить в файл с именем res в форме:

Получено:

Y( х1 ) = y1

Y( х2 ) = y2

……………..

Составил : <Ф. И.О.>

Файл исходных данных dan

-3.0

-1.5

-2.5

-0.5

0.5

1.0

Программа

program lab_2

implicit none

Real x, y

Open(5, File = ‘dat’)

Open(6, File = ‘res’)

write(6,10)

10 format(‘Получено:’)

15 read(5,1, end=50) x

1 format(f4.1)

y= 4.*x/(x*x+1.)

write(6,20) x, y

20 format(‘Y(‘,f5.2’) = ‘,F5.2)

go to 15

50 write(6,30)

30 format(‘Составил: Иванов’)

end program

Файл результатов res

Получено:

Y(-3.00) = -1.20

Y(-1.50) = -1.85

Y(-2.50) = -1.38

Y(-0.50) = -1.60

Y( 0.50) = 1.60

Y( 1.00) = 2.00

Составил: Иванов

З а д а н и е к л а б о р а т о р н о й р а б о т е

Составить программу для вычисления значений функции для десяти значений аргумента, принадлежащих отрезку [xmin, xmax]. Исходные данные задать в файле dan. Результат поместить в файл res в форме, указанной в таблице 1..

1.

,

, форма № 1;

2.

, форма № 3;

3.

, форма № 2;

4.

, форма № 4;

5.

, форма № 3;

6.

, форма № 2;

7.

, форма № 4;

8.

, форма № 1;

9.

, форма № 1;

10.

, форма № 4;

11.

, форма № 2;

12.

, форма № 3;

13.

, форма № 4;

14.

, форма № 3;

15.

,

,форма № 2;

16.

, форма № 1;

17.

, форма № 3;

18.

, форма № 4;

19.

, форма № 2;

20.

, форма № 1;

21.

, форма № 4;

22.

, форма № 3;

23.

, форма № 3;

24.

, форма № 2;

25.

, форма № 1;

26.

, форма № 4;

27.

, форма № 2;

28.

, форма № 1;

29.

, форма № 3;

30.

, форма № 4.

Таблица 1.

Форма вывода информации

Форма вывода информации

1

Результат

************************** I X = x1 дает Y = y1 I

************************** I X = x2 дает Y = y2 I

************************** I ……… ……… I

************************** Составил : <Ф. И.О.>

2

Таблица результатов:

для Х = х1 ==> Y = y1

для Х = х2 ==> Y = y2

для Х = х3 ==> Y = y3

для Х = х4 ==> Y = y4

……………………………

Составил : <Ф. И.О.>

3

Результаты расчетов:

при Х = х1 получаем Y = y1

при Х = х2 получаем Y = y2

при Х = х3 получаем Y = y3

…………………………………

Составил : <Ф. И.О.>

4

Получено:

Y( х1 ) = y1

Y( х2 ) = y2

Y( х3 ) = y3

……………..

Составил : <Ф. И.О.>

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 3

Разветвляющиеся программы и

ОПЕРАТОРЫ УПРАВЛЕНИЯ

С п р а в о ч н а я и н ф о р м а ц и я

Рис.1.

В рассмотренных ранее программах были реализованы линейные алгоритмы, которые требовали последовательного выполнения операций. Однако существует класс задач, решение которых предполагает наличие нескольких путей получения конечного результата. Например, при решении квадратного уравнения требуется анализировать величину дискриминанта и, в зависимости от его знака, принимать решение о наличии и кратности действительных корней. Поэтому в алгоритме решения должны существовать по крайней мере два взаимоисключающих пути получения конечного результата. Эти пути принято называть ветвями алгоритма, а реализующие его программы — разветвляющимися.

Разветвляющийся алгоритм можно продемонстрировать на примере решения следующей задачи. В компьютер вводятся значения переменных X и Y, представляющие собой координаты точки M(x, y) на плоскости xOy (смотри рисунок 1). Вся плоскость xOy разбита на три области, каждая из которых имеет признак n – номер от 0 до 2-х. Требуется разработать алгоритм и составить программу идентификации области, в которую попала точка M. Точки границ отнести к области с большим номером.

Решение поставленной задачи может быть описано следующей последовательностью действий:

1. Ввести значения x и y;

2. Если длина радиуса-вектора точки M(x, y) больше радиуса окружности, ограничивающей области с номерами 1 и 2, то перейти к пункту 3. В противном случае перейти к пункту 4;

3. Присвоить переменной n значение 0 и перейти к пункту 7;

4. Если y больше 0, то перейти к пункту 5, иначе перейти к пункту 6;

5. Присвоить переменной n значение 1 и перейти к пункту 7;

6. Присвоить переменной признака области n значение 2;

7. Вывести значения x, y и n.

Данное описание неудобно, поэтому при разработке разветвляющихся программ рекомендуется составлять блок-схему алгоритма, так как это позволяет получить наглядную схему его функционирования и избежать ошибок. Под блок-схемой понимают графическое отображение алгоритма программы, где каждой операции соответствует свой образ, а последовательность решения изображается соединяющими их линиями. Символьное обозначение операций приведено ниже в таблице.

Выполняемая операция

Образ

Начало и окончание работы алгоритма или программы

Оператор или группа операторов, изменяющих значение данных

Операторы ввода-вывода данных

Оператор условного перехода

Внутри каждого элемента блок-схемы в произвольной форме описывается выполняемая операция.

Блок-схема вышеописанного алгоритма приведена на рисунке 2.

Для создания программ, реализующих такие разветвляющиеся алгоритмы, используются операторы безусловного и условного переходов, влияющие на последовательность выполнения операторов.

Оператор безусловного перехода позволяет передать управление любому выполняемому оператору программы. Общая форма оператора

Go to метка

где метка – метка оператора, которому передается управление.

Рис.2.

Выполняемый оператор, непосредственно следующий за оператором безусловного перехода, должен иметь метку, иначе на него невозможно передать управление

Go to 10

А = D + B

10 C = E — A

В данном фрагменте оператор безусловного перехода передает управление оператору C=E-A с меткой 10, минуя оператор A=D+B.

Оператор условного перехода служит для выбора одного из 0нескольких возможных продолжений процесса выполнения программы в зависимости от выполнения некоторого условия.

Оператор условного перехода позволяет использовать в каждой из своих расчетных ветвей не один оператор, а блоки операторов. Общая форма оператора

If ( выражение ) Then

блок_1

[ Else

блок_2 ]

EndIf

где выражение

– логическое выражение, определяющее будет ли выполняться блок_1 или блок_2;

блок_1, блок_2

– группы выполняемых операторов.

Оператор условного перехода работает следующим образом. Если значение логического выражения есть "истина", то выполняются операторы блока_1, а операторы блока_2 игнорируются. Если значение логического выражения есть "ложь", то игнорируются операторы блока_1, а выполняются операторы блока_2. Признаком конца группы операторов блока_1 является оператор Else, а группы операторов блока_2 – оператор EndIf. После выполнения любого из блоков управление передается на оператор, следующий за ключевым словом EndIf. Ключевое слово Else и операторы блока_2 могут отсутствовать. В этом случае работа оператора условного перехода аналогична работе логического оператора.

При использовании оператора условного перехода необходимо придерживаться следующих правил:

–  не допускается передача управления в блоки операторов блок_1 или блок_2 извне, минуя оператор If;

–  при использовании в качестве блока_2 другого оператора условного перехода вместо комбинации двух ключевых слов Else и If можно использовать единое слово ElseIf;

–  допускается использование пустых блоков операторов после ключевого слова Else, но это рекомендуется избегать.

Использование блочного оператора условного перехода упрощает чтение программы, делая ее более наглядной. Это можно видеть на примере программы идентификации областей:

Read(*, *) X, Y

If (X*X + Y*Y. LE.4.) Then

If (Y. LE.0.) Then

N = 2

Else

N = 1

EndIf

Else

N = 0

EndIf

Write(6, 8) X, Y, N

8 Format(‘ Точка M(‘, F4.1, ‘,’, F4.1, ‘) лежит в области N = ‘, I1)

End

Пример выполнения задания. Составить программу для вычисления значения функции F по формуле

Исходные данные задать в файле dat. Результат поместить в файл res

Программа

program lab_3

implicit none

Real x, y, z, a, f

Open(5, File = ‘dat’)

Open(6, File = ‘res’)

15 read(5,1, end=100) x, y, z

1 format(3f4.1)

if (x>y) then

a=x

else

a=y

endif

if (a<z) then

f=a

else

f=z

endif

write(6,20) x, y, z, f

20 format(‘x=’,f4.1,’; y=’,f4.1,’; z=’,f4.1, ‘; f=’,f4.1)

go to 15

100 stop ‘lab_3’

end program

Файл исходных данных dan

-3.0 2.3 7.4

-1.5 5.1 1.6

-2.5 0.5 0.4

-0.5 0.8 0.2

0.5 0.1 5.1

1.0 1.0 1.2

Файл результатов res

x=-3.0; y= 2.3; z= 7.4; f= 2.3

x=-1.5; y= 5.1; z= 1.6; f= 1.6

x=-2.5; y= 0.5; z= 0.4; f= 0.4

x=-0.5; y= 0.8; z= 0.2; f= 0.2

x= 0.5; y= 0.1; z= 5.1; f= 0.5

x= 1.0; y= 1.0; z= 1.2; f= 1.0

З а д а н и е к л а б о р а т о р н о й р а б о т е

Составить блок-схему и программу для решения следующих задач. В вариантах 1–14 вычислить значение F по предлагаемой формуле. При получении нуля в знаменателе необходимо напечатать фразу "нуль в знаменателе". В вариантах 15–24 определить номер области n, в которую попадет точка с заданными координатами x и y. Границы отнести к области с большим номером. В вариантах 25–30 выполнить указанные действия. В качестве исходных данных использовать восемь различных комбинаций значений вводимых переменных. В программе предусмотреть ввод исходных данных из файла dan и печать результатов в файл res. Результаты тестирования программы привести в отчете.

1.

2.

;

3.

4.

5.

;

6.

;

7.

8.

9.

10.

11.

12.

13.

14.

15

16

17

18

19

20

21

22

23.

24

25.  Определить есть ли в целом четырехзначном числе три одинаковые цифры.

26.  Даны три произвольные числа. Вывести их на печать в порядке возрастания.

27.  Проверить является ли произвольное целое четырехзначное число палиндромом ("перевертышем").

28.  Проверить состоит ли произвольное целое четырехзначное число из четных цифр.

29.  Проверить состоит ли целое трехзначное число из разных цифр.

30.  Даны три числа. Вывести на печать те из них, значения которых лежат в диапазоне от a до b.

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 4

ПРОГРАММИРОВАНИЕ ЦИКЛОВ

С п р а в о ч н а я и н ф о р м а ц и я

Рис.1.

Циклом называется часть программы, которая в процессе решения задачи выполняется последовательно несколько раз. Например, требуется получить таблицу значений функции y = cos x2 при изменении аргумента x в диапазоне от -1 до 2 с шагом 0,1. Блок-схема алгоритма решения задачи приведена на рис.1.

В этом алгоритме сначала устанавливается начальное значение аргумента x = -1, вычисляется значение функции y = cos x2 и выводится результат, затем изменяется значение аргумента x на заданную величину шага 0,1 и, если новое значение аргумента не превышает его максимального значения 2, процесс повторяется. Циклические вычисления проводятся до тех пор, пока значение аргумента не превысит максимально допустимого значения, что служит признаком выхода из цикла. Блок-схема позволяет выделить основные элементы и типовые блоки цикла: переменная цикла, подготовка цикла, область (тело) цикла, изменение переменной цикла и проверка условия окончания цикла.

Переменной цикла называется величина, значение которой циклически изменяется от начального значения до конечного с заданным шагом (в примере – аргумент x).

Подготовка цикла – блок, где переменной цикла присваивается начальное значение и производятся другие необходимые подготовительные операции (в примере – x = -1).

Область (тело) цикла – оператор или группа операторов, которые необходимо последовательно выполнить заданное количество раз (в примере это вычисление функции y = cos x2 и вывод значений x и y).

Изменение переменной цикла есть увеличение или уменьшение значения переменной цикла на заданную величину шага (в примере – x = x + 0,1).

Проверка условия окончания цикла заключается в сравнении текущего значения переменной цикла с ее конечным значением и принятии решения о возврате в область цикла или о выходе из него.

Таким образом, цикл может быть организован в программе следующим образом:

X = -1.0

1 Y = Cos(X*X)

Write(*, 2) X, Y

2 Format(‘ X=’, F4.1, ‘ Y=’, F7.4)

X = X + 0.1

If (X. LT.2.05) then

Go to 1

endif

Приведенная программа представляет собой пример "ручной" организации цикла. Чаще для этого используют специальные операторы, называемые операторами цикла: Do и Do_While.

Оператор Do выполняет все отмеченные выше действия по организации повторений тела цикла и позволяет более компактно записывать циклы:

Do [метка][,] переменная = начало, конец [, шаг]

где метка

– метка последнего оператора тела цикла;

переменная

– переменная целого или вещественного типа, являющаяся переменной цикла;

начало и конец

– арифметические выражения целого или вещественного типа, определяющие начальное и конечное значения переменной цикла, соответственно;

шаг

– выражение целого или вещественного типа, задающее шаг изменения значения переменной цикла. Шаг может отсутствовать, тогда он принимается равным 1.

Правила использования оператора Do.

1. Переменную цикла нельзя переопределять внутри тела цикла.

2. Выход из цикла возможен в любом месте его тела, но вход разрешен только через оператор Do.

3. Ecли oпepaтop Do находится в внутри другого блочного оператора, то oблacть его действия дoлжнa быть полностью coдepжaтьcя внутри cooтвeтcтвующeгo блoкa. Обратное тоже справедливо.

4. Meткa, укaзывaющaя нa пocлeдний выполняемый oпepaтop тела цикла, должна cтoять пocлe oпepaтopa Do. При ее отсутствии тело цикла может ограничиваться оператором EndDo. Каждый оператор EndDo может заканчивать только один цикл.

5. Последним оператором тела цикла может быть любой выполняемый оператор, не влияющий на процесс передачи управления. Если избежать этого невозможно, то следует использовать оператор Continue.

6. Оператор Cycle позволяет пропустить все нижеследующие операторы тела цикла и перейти к выполнению следующего его шага.

7. Оператор Exit прерывает выполнение цикла и передает управление на первый выполняемый оператор, следующий за циклом.

8. При использовании вещественной переменной цикла необходимо помнить, что расчеты ведутся с некоторой погрешностью. Поэтому, во избежание потери последнего прохода по телу цикла, рекомендуется устанавливать конечное значение переменной цикла на половину шага большую, чем требуется.

Оператор Do выполняется следующим образом. При входе в цикл вычисляются начальное xнач и конечное xкон значения переменной цикла x, а также шаг Dx. Они приводятся к типу переменной цикла и по формуле

k = max{int[(xкон — xнач + Dx)/Dx], 0} ,

где max

– максимальное значение из двух чисел;

int

– целая часть числа,

вычисляется число повторений цикла k. Фактически в программе отслеживается изменение значения k от полученного по формуле до нуля, а не изменение значения переменной цикла. Блок-схема работы оператора цикла показана на рис.2:

Рис.2.

Такой алгоритм при использовании переменной цикла вещественного типа часто приводит к ошибкам, связанным с потерей последнего ее значения. Чтобы избежать подобной ситуации в циклах с вещественной переменной значение ее верхней границы увеличивают на величину не превышающую значение шага, добиваясь тем самым требуемого числа повторений цикла. С использованием оператора Do рассмотренный выше алгоритм решения задачи о расчете таблицы значений функции y = cos x2 может быть записан в виде программы

Do X = -1., 2.05, 0.1

Y = Cos(X*X)

Write(*, 2) X, Y

2  Format(‘ X=’, F4.1, ‘ Y=’, F7.4)

Enddo

End

Другим способом организации цикла в программе является использование оператора цикла Do_While. Общая форма записи оператора

Do [метка][,] While (логическое выражение)

где метка

– метка последнего оператора из группы, расположенной непосредственно после оператора цикла и составляющей его тело;

Логическое выражение

– любое логическое выражение, управляющее выполнением цикла.

Правила использования оператора Do_While аналогичны правилам использования оператора Do, за исключением пункта 1, так как данный оператор фактически не содержит переменной цикла. Роль элемента управления работой оператора возлагается на логическое выражение.

При входе в цикл вычисляется значение логического выражения. Если полученный результат — "ложь", то ни один из операторов цикла не выполняется и управление передается на оператор, следующий за телом цикла. В противном случае выполняются операторы тела цикла. После выполнения последнего оператора тела цикла управление передается на оператор Do_While и процесс повторяется. Работа оператора иллюстрируется блок-схемой, представленной на рис.3.

Рис.3.

Рассмотренная выше программа расчета таблицы значений функции y = cos x2 может быть записана в виде:

X = -1.

Do While (X. LT.2.05)

Y = Cos(X*X)

Write(*, 2) X, Y

2 Format(‘ X=’, F4.1, ‘ Y=’, F7.4)

X = X + 0.1

Enddo

End

Построение таблиц функций двух переменных требует использования вложенных циклов. Так для вычисления значения функции

y = x(n — x)2

для аргументов x = 0; 0,1; …1,0 и n = 5; 4; 3; 2 блок-схема алгоритма и программа будут иметь вид:

C *** Программа ***

Open(1, File = ‘prog_4.res’)

C *** Внешний цикл по N ***

Do N = 5, 2, -1

Write(1, 2) N

C *** Внутренний цикл по X ***

Do X = 0., 1.05, 0.1

Y = X*(N — X)**2

Write(1, 1) X, Y

EndDo

C *** Конец внутреннего цикла ***

EndDo

C *** Конец внешнего цикла

1 Format(‘X=’,F3.1,’ Y=’, F8.5)

2 Format(‘ N=’, I1)

Close(1)

End

Пример выполнения задания. Составить программу для вычисления значения функции y

В программе предусмотреть печать результатов в файл res.

Программа

program lab_4

implicit none

integer a

Real x, y

Open(6, File = ‘res’)

do a=1,3

write(6,1) a

1 format(‘ a =’,i2)

do x=0,0.55,0.1

y=sqrt(a*a+(a+1)*x)

write(6,2)x, y

2 format(‘ x =’,f4.1,’; y =’,f5.2)

enddo

enddo

end program

Файл результатов res

a = 1

x = 0.0; y = 1.00

x = 0.1; y = 1.10

x = 0.2; y = 1.18

x = 0.3; y = 1.26

x = 0.4; y = 1.34

x = 0.5; y = 1.41

a = 2

x = 0.0; y = 2.00

x = 0.1; y = 2.07

x = 0.2; y = 2.14

x = 0.3; y = 2.21

x = 0.4; y = 2.28

x = 0.5; y = 2.35

a = 3

x = 0.0; y = 3.00

x = 0.1; y = 3.07

x = 0.2; y = 3.13

x = 0.3; y = 3.19

x = 0.4; y = 3.26

x = 0.5; y = 3.32

З а д а н и е к л а б о р а т о р н о й р а б о т е

Составить программу для расчета значений функций в указанном диапазоне изменения аргумента и параметра. Результаты вычислений поместить в файл res. По результатам расчета функций построить их графики.

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 5

ОБРАБОТКА МАССИВОВ

С п р а в о ч н а я и н ф о р м а ц и я

Наряду с понятием переменной в программировании, аналогично математике, где используются понятия вектора и матрицы для описания многомерных объектов, существует понятие массива. Под ним понимается совокупность переменных одного типа, имеющих общее имя. Правила образования имен массивов и их типы полностью совпадают с правилами для переменных. При работе с массивом к каждой отдельной переменной можно обратиться, указав ее позицию в массиве. При этом каждая переменная будет именоваться именем массива, за которым в круглых скобках следуют разделенные запятыми числа, указывающие на ее позицию. Эти числа называются индексами, а сама переменная — переменной с индексами. Например, под именем массива А может подразумеваться последовательность переменных — элементов:

A(1) A(2) A(3) A(4) ….. A(45)

или

A(1, 1) A(1, 2) … A(1, 9)

A(2, 1) A(2, 2) … A(2, 9)

………………………………….

A(7, 1) A(7, 2) … A(7, 9)

и так далее

В зависимости от количества используемых индексов различают одномерные, двумерные, трехмерные и многомерные массивы. Количество индексов в массиве не должно превышать семи. В качестве индексов массивов могут использоваться константы, переменные, другие переменные с индексами и арифметические выражения, как показано в примерах ниже

B(i), A(k, i+1), C(2, N(i)), Sx(i, j, k) .

Индексы, описанные выражениями, операнды которых имеют разные типы, вычисляются в соответствии с общими правилами и, если их результат окажется вещественным, он приводится к целому типу:

запись A(2.7) идентична A(2);

запись A(k+1.3) при k = 3 идентична A(4);

запись A(B+2) при B = 3.62 идентична A(5).

В отличие от простой переменной, которая предназначена для хранения одной величины, массив позволяет хранить множество величин. Поэтому в программе обязательно должно быть оговорено их количество. Эту функцию выполняет оператор Dimension, который, как оператор описания, должен располагаться в начале программы – перед выполняемыми операторами. Он имеет вид

Dimension список ,

где список содержит имена массивов вместе с границами их индексов, за ключенными в скобках и разделенными запятыми. Имена массивов также разделяются запятыми.

Если значение границы индекса указано в форме целой положительной константы, то оно определяет наибольшее значение данного индекса. При этом наименьшее значение по умолчанию принимается равным единице. Допускается устанавливать значение нижней границы индекса отличное от единицы. В этом случае указываются обе границы индекса, разделенные символом ":". Например, оператор

Dimension A(3), B(-1:1)

описывает два вещественных массива с именами A и B, каждый из которых состоит из трех элементов. Разница между ними состоит в том, что элементы первого массива имеют имена A(1), A(2), A(3), а второго — B(-1), B(0) и B(1).

Оператор Dimension подразумевает, что тип массива определяется по первой букве его имени. Если требуется явное определение типа массива, то вместо оператора Dimension должны использоваться операторы описания типов Integer или Real. Например, операторы

Integer A(4)

Real Num(-2:2), L(0:2, 3)

описывают целый одномерный массив A из четырех элементов, одномерный вещественный массив Num из пяти элементов и двумерный вещественный массив L из девяти элементов.

Элементы массивов хранятся в памяти ЭВМ с последовательно возрастающими адресами. Так массив A(4) располагается в памяти следующим образом:

A(1) A(2) A(3) A(4) .

Многомерные массивы располагаются в памяти таким образом, что значения первого индекса возрастают быстрее значений второго, значения второго — быстрее значения третьего и так далее. Например, элементы двумерного вещественного массива L располагаются в следующем порядке

L(0,1) L(1,1) L(2,1) L(0,2) L(1,2) L(2,2) L(0,3) L(1,3) L(2,3)

Если массив L представить в виде матрицы

то такой порядок следования элементов в памяти ЭВМ соответствует размещению их по столбцам.

Ввод-вывод массивов осуществляется с помощью операторов Read и Write по тем же правилам, что и для простых переменных. Например, оператор

Read(*, *) A

считывает информацию в каждый элемент массива A, поэтому количество вводимых данных должно быть равно количеству его элементов, заданных при его описании. Так как константы будут вводиться последовательно, то их ввод надо осуществлять в соответствии с расположением элементов массива в памяти ЭВМ. Например, для двумерного массива — по столбцам.

В случае, когда требуется ввести не все элементы массива или изменить последовательность их ввода, необходимо использовать либо оператор цикла, либо специальную форму оператора Read с неявным циклом. Например, ввод двумерного массива L построчно, в традиционно принятом в математике виде, с помощью операторов цикла может быть организован следующим образом:

Dimension L(0:2, 3)

Do i = 0, 2

Do j = 1, 3

Read(*, *) L(i, j)

EndDo

EndDo

Неявный цикл в операторах ввода-вывода имеет вид:

(имя_массива(переменная)[,…], переменная = начало, конец [, шаг])

где переменная – переменная цикла (обязательно целого типа);

начало и конец – выражения целого типа, определяющие начальное и конечное значения переменной цикла, соответственно;

шаг – выражение целого типа, задающее шаг изменения значения переменной цикла. Шаг может отсутствовать, тогда он принимается равным единице.

Эта форма содержит все элементы оператора цикла, но есть и свои особенности:

–  в неявном цикле отсутствует ключевое слово Do;

–  тело цикла состоит из списка имен массивов, к элементам которых осуществляется последовательное обращение;

–  допускается использование вложенных неявных циклов по общим правилам организации циклов.

Тогда ввод двумерного массива L может быть организован в виде:

Dimension L(0:2, 3)

…….

Read(*, *) ((L(i, j), j = 1, 3), i = 0, 2)

Операции вывода значений элементов массивов организуются с помощью оператора Write аналогичным образом.

Работа с массивами может быть проиллюстрирована следующим примером. Имеются результаты замеров проходного сечения 45-ти жиклеров. Определить среднее арифметическое значение результатов этих замеров. Эти значения r1, r2, …, r45 удобно хранить в виде массива R(1), R(2), , …, R(45). Тогда формула для вычисления среднего арифметического значений проходного сечения

может быть представлена в программе оператором Rcp = Rsum/35 , где Rsum есть результат накопления суммы значений элементов массива R. Предполагается, что результаты замеров записаны в файл с именем prog. dat в форме, представленной ниже

1 строка

2 строка

3 строка

4 строка

5 строка

6 строка

7 строка

Результаты замеров [мм]:

1.48 1.51 1.50 1.49 1.48 1.49

1.49 1.50 1.50 1.49 1.52 1.51

1.51 1.51 1.52 1.50 1.48 1.52

1.48 1.51 1.50 1.49 1.48 1.51

1.49 1.50 1.50 1.49 1.52 1.50

1.51 1.51 1.52 1.50 1.48

Результат работы программы должен быть помещен в файл prog. res в виде

1 строка

2 строка

3 строка

4 строка

5 строка

6 строка

7 строка

8 строка

9 строка

Результаты замеров [мм]:

1.48 1.51 1.50 1.49 1.48

1.49 1.49 1.50 1.50 1.49

1.52 1.51 1.51 1.51 1.52

1.50 1.48 1.52 1.48 1.51

1.50 1.49 1.48 1.51 1.49

1.50 1.50 1.49 1.52 1.50

1.51 1.51 1.52 1.50 1.48

Среднее значение Rср=1.500

Программа имеет вид

Dimension R(45)

Open(1, File = ‘prog. dat’)

Open(2, File = ‘prog. res’)

Read(1, 1) (R(i), i = 1, 45)

1 Format(/(6F5.2))

Write(2, 2) (R(i), i = 1, 45)

2 Format(5X, ‘Результаты замеров [мм]:’/(5F6.2))

Rsum = 0.0

Do i = 1, 45

Rsum = Rsum + R(i)

EndDo

Rcp = Rsum/45.

Write(2, 3) Rcp

3 Format(T3, ‘Среднее значение Rcp = ‘, F5.3)

End

При решении ряда задач невозможно заранее прогнозировать размеры массивов, используемых для хранения информации. Вышеописанный способ использования массивов в программах требует указания в операторе Dimension его максимальных (фиксированных) размеров, а потому неэффективен. Фортран предоставляет возможность организовать динамическое изменение размера массива.

Динамическое изменение размера массива осуществляется с помощью операторов Allocate и DeAllocate. Массив с динамически изменяемыми границами описывается в начале программы перед выполняемыми операторами специальным образом с атрибутом Allocatable и указанием вместо максимальных значений индексов символа ":". Например:

Dimension Data [Allocatable] (:,:)

Real Long [Allocatable] (:)

Для выделения требуемого размера памяти ЭВМ под массивы с динамически изменяющимися размерами и установки верхней и нижней границ его индексов используется оператор Allocate. Общая форма оператора имеет вид:

Allocate (имя_массива([n:] k [, …]) [, …] [, Stat = err])

где n, k

– целые выражения, устанавливающие нижнюю и верхнюю границы индексов массива;

err

– целая переменная, которая возвращает код ошибки при распределении памяти.

В операторе Allocate можно определять несколько массивов, разделяя их через запятую. Параметр "Stat =" указывается один раз в конце оператора. Любая неудача размещения массивов вызовет ошибку выполнения, которая отмечается в параметре "Stat =", и переменная err принимает ненулевое значение.

Освобождение памяти, которое занимал динамически распределенный массив, осуществляется оператором DeAllocate, записываемым в виде:

DeAllocate(список [, Stat = err])

где список – список динамических массивов, организованных с помощью оператора Allocate, в котором имена массивов отделяются запятыми.

Параметр "Stat =" выполняет ту же функцию, что и в операторе Allocate, и должен быть последним. Переменная err принимает значение нуль, если освобождение памяти прошло успешно.

Использование динамически размещаемых массивов может быть проиллюстрировано на предыдущем примере, когда количество результатов замеров проходного сечения жиклеров заранее неизвестно. При создании такой программы необходимо ввести дополнительную целую переменную, значение которой будет определять количество проведенных замеров. В этом случае программа будет иметь приведенный ниже вид

Dimension R [Allocatable] (:)

Open(1, File = ‘prog. dat’)

Open(2, File = ‘prog. res’)

Write(*, 10)

10 Format(‘ Введите количество замеров N = ‘)

Read(*, *) N

Allocate (R(N), Stat = Ierr)

If (Ierr. NE.0) Stop ‘Нет памяти под массив R.’

Read(1, 1) (R(i), i = 1, N)

1 Format(/(6F6.2))

Write(2, 2) (R(i), i = 1, N)

2 Format(5X, ‘Результаты замеров [мм]:’/(5F6.2))

Rsum = 0.0

Do i = 1, N

Rsum = Rsum + R(i)

EndDo

Rcp = Rsum/N

Write(2, 3) Rcp

3 Format(/T3, ‘Среднее значение Rcp = ‘, F5.3)

DeAllocate(R)

End

Пример выполнения задания. Составить программу для вычисления среднего значение элементов массива a[10]. Исходные данные вводить из файла dan и результаты выводить в файл res.

Программа

program lab_5

implicit none

Real a(10), s, Asr

Integer i

Open(5, File = ‘dat’)

Open(6, File = ‘res’)

15 read(5,1) (a(i),i=1,10)

1 format(5f4.1)

write(6,1) (a(i),i=1,10)

s=0.

Do i=1,10

s=s+a(i)

enddo

Asr=s/10.

write(6,20) Asr

20 format(‘********************’/’ Asr=’,f6.3)

end program

Файл исходных данных dan

3.0 2.3 7.4 3.0 2.3

1.5 5.1 1.6 1.5 5.3

Файл результатов res

3.0 2.3 7.4 3.0 2.3

1.5 5.1 1.6 1.5 5.3

********************

Asr= 3.300

З а д а н и е к л а б о р а т о р н о й р а б о т е

Составить программу решения следующих задач. Исходные данные вводить из файла dan и результаты выводить в файл res.

1. Вычислить суммы столбцов двумерного массива А размерностью 4´6.

2. Найти положительные четные значения в целочисленном двумерном массиве С (3´6 элементов) и вычислить сумму их индексов.

3. Вычислить отдельно суммы и произведения положительных и отрицательных элементов массива А (3´5 элементов).

4. Составить программу поиска максимальных элементов столбцов массива A (5´5 элементов).

5. Вычислить количество положительных элементов в целочисленном массиве М (3´4 элементов), значения которых не превышают 17.

6. Найти четные отрицательные значения в целочисленном массиве N (5´3 элементов) и вычислить их сумму.

7. Определить количество отрицательных элементов, расположенных выше главной диагонали в целочисленном массиве Y (5´5 элементов), значение которых больше –10 .

8. Определить два минимальных значения в массиве D (3´3 элементов).

9. Преобразовать одномерный массив S из 15-ти элементов в двумерный – G (5´3 элементов) по столбцам.

10. Найти суммы значений элементов в столбцах верхнего треугольника целочисленного массива С (5´5 элементов).

11. Реорганизовать двумерный массив А (4´5 элементов) в одномерный массив D по строкам.

12. Сформировать одномерный массив X, значениями элементов которого являются минимальные значения элементов строк массива Н (размерностью 5´5).

13. Найти два самых больших значения двумерного массива R (3´8 элементов).

14. Вычислить сумму элементов строк массива А (4´4 элементов), для которых выполняется условие 0.5 < aij < 2.5.

15. Определить количество четных положительных значений, расположенных выше побочной диагонали целочисленного массива С (5´5 элементов).

16. Определить количество отрицательных значений среди чётных элементов строк массива F (3´6 элементов).

17. Заполнить по столбцам двумерный массив В (5´5 элементов) выше главной диагонали значениями из одномерного массива С, содержащего 10 элементов.

18. Построчно заполнить массив А (5´5 элементов) ниже побочной диагонали значениями, элементов массива R из 15-ти элементов.

19. Определить минимальное нечетное значение в целочисленном массиве X (4´5 элементов).

20. Одномерный массив R из 12-ти элементов разместить в двумерном массиве G (4´3 элементов) по строкам. Элементы массива R считывать в обратном порядке.

21. Определить суммы элементов главной и побочной диагоналей массива А (4´4 элементов).

22. Вычислить средние арифметические значения элементов строк массива D (4´4 элементов).

23. Определить средние геометрические значения элементов столбцов массива Z (4´4 элементов).

24. Определить номер строки в нижнем треугольнике матрицы  A (4´4 элементов), содержащей минимальный элемент.

25. Составить подпрограмму поиска максимального элемента двумерного массива  A (4´4 элементов), значение которого меньше 10.

26. Определить количество элементов, лежащих в диапазоне   [a, b], в двухмерном массиве  B (4´4 элементов).

27. Выполнить поиск минимального элемента на главной и побочной диагоналях двумерного массива A (4´4 элементов).

28. Определить в двумерном массиве D (4´4 элементов) количество элементов с отрицательными значениями, лежащих выше побочной диагонали.

29. Определить в двумерном массиве M (4´3 элементов) количество элементов, значения которых делится на 3 без остатка.

30. Найти индексы минимального элемента в двухмерном массиве  A (4´4 элементов).

Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 6

ПОДПРОГРАММЫ

С п р а в о ч н а я и н ф о р м а ц и я

Все рассмотренные до настоящего момента программы были организованы в виде единой программы, структура которой отражала алгоритм решения задачи. Однако, на Фортране программа может состоять из одной или нескольких программных единиц, под которыми понимают совокупность команд, задающих необходимые действия над данными для получения требуемого результата. Это обусловлено тем, что программы часто могут иметь многократно повторяющиеся последовательности команд, используемые для обработки различных данных. Поэтому составление программы существенно упрощается, если такие блоки команд оформляются как независимые программные единицы и к ним обращаются требуемое количество раз с разными данными. При этом программа, реализующая общий алгоритм решения задачи, называется главной, а выделенные независимые программные единицы – подпрограммами.

Для выделения многократно используемых блоков команд в Фортране предусматриваются подпрограмма-функция и подпрограмма общего вида. Для выбора между ними следует придерживаться следующей рекомендации: если результатом повторяющихся вычислений является одно единственное значение, то используется подпрограмма-функция, в остальных случаях — подпрограмма общего вида.

***Замечание. Программные единицы любого типа не должны обращаться сами к себе прямо или косвенно.

Подпрограмма-функция по своему применению похожа на оператор-функцию, так как используется для вычисления единственного значения и вызывается непосредственно в арифметическом выражении прямым указанием своего имени. Отличия подпрограммы-функции от оператора-функции состоят в том, что она является отдельной программной единицей и для вычисления требуемой величины позволяет использовать более одного оператора. Первым оператором подпрограммы-функции должен быть оператор Function, который определяет ее имя и список формальных параметров:

[тип] Function имя [*длина] ([параметр_1 [, параметр_2]…])

где тип

– необязательный параметр, указывающий тип возвращаемого результата (Real, Integer);

имя

– имя подпрограммы-функции;

длина

– объем памяти в байтах, выделяемый для записи результата. Объявляется только совместно с параметром тип;

парметр_i

– формальные параметры (i=1, 2, …).

Тип результата, возвращаемого подпрограммой-функцией, определяется типом (явно или по умолчанию) имени функции. Например:

Function Prog(A, B)

– возвращает вещественный результат длиной в четыре байта;

Integer Function Prog(A, B)

– возвращает целый результат длиной в четыре байта;

Real Function Prog*8(A, B)

– возвращает вещественный результат длиной в восемь байт.

Формальные параметры в подпрограмме могут отсутствовать, но наличие скобок в ее описании обязательно. В качестве формальных параметров могут использоваться имена переменных, массивов и внешних подпрограмм. Если в качестве формального параметра использован массив, то он должен быть описан с использованием в качестве индексов других формальных параметров.

Подпрограмма-функция должна иметь следующую структуру:

–  оператор Function;

–  группа операторов, реализующая вычислительный алгоритм;

–  оператор присваивания, в котором имени подпрограммы-функции передается значение результата вычислений;

–  оператор Return;

–  оператор End.

Например:

Function Prog(A, B, C, N)

……………

Prog = Result

Return

End

Оператор End указывает на конец текста подпрограммы-функции и может быть использован в ней только один раз. Оператор Return означает логическое завершение вычислений в подпрограмме и возврат полученного значения и управления вызвавшей ее программной единице. Оператор Return может употребляться в подпрограмме несколько раз.

Обращение к подпрограмме-функции выполняется путем указания ее имени непосредственно в арифметическом выражении. При этом в скобках после имени оператора-функции указываются ее фактические параметры. В качестве фактических параметров могут использоваться выражения, имена массивов и других подпрограмм. Количество, тип и порядок следования формальных и фактических параметров должны совпадать. Фактический параметр, являющийся именем подпрограммы, должен быть описан в программной единице, вызывающей подпрограмму-функцию. Для его описания используется оператор External в форме:

External имя_подпрограммы [, …].

Например:

External Fir

An = Prog(X, A, Fir)

……….

End

Function Prog(A, B, F)

……….

Return

End

Работу с подпрограммой-функцией иллюстрирует следующий пример: написать программу для вычисления максимальных значений элементов квадратных матриц A и B, имеющих порядки 4, и 3, соответственно. Программа будет иметь вид:

Dimension A(4, 4), B(3, 3)

Real Max_1, Max_2, Max_3

Open(1, File = ‘prog. dat’)

Open(2, File = ‘prog. res’)

Read(1, 1)((A(i, j), j = 1, 4), i = 1, 4)

1 Format(9X, 4F6.2)

Read(1, 2) ((B(i, j), j = 1, 3), i = 1, 3)

2 Format(9X, 3F6.2)

Max_1 = Poisk(4, A)

Max_2 = Poisk(3, B)

Write(2, 4) ((A(i, j), j = 1,4), i = 1,4), Max_1

4 Format(4(4F6.2/), ‘ Max A = ‘, F6.2/)

Write(2, 5) ((B(i, j), j = 1,3), i = 1,3), Max_2

5 Format(3(3F6.2/), ‘ Max B = ‘, F6.2/)

End

Function Poisk(N, A)

Dimension A(N, N)

R = A(1, 1)

Do i = 1, N

Do j = 1, N

If (R. LT. A(i, j)) then

Poisk = A(i, j)

endif

enddo

enddo

Return

End

Подпрограмма общего вида используется в тех случаях, когда в качестве результата расчетов необходимо получить несколько значений. Так же, как и подпрограмма-функция, она является отдельной программной единицей и отличается от подпрограммы-функции тем, что не передает никакого численного значения, связанного с ее именем. Ввод и вывод данных осуществляется через список ее параметров, а вызов подпрограммы организуется с помощью специального оператора Call.

Первым оператором подпрограммы общего вида должен быть оператор Subroutine, который записывается в общем виде:

Subroutine имя ([параметр_1 [, параметр_2]…])

где имя – имя подпрограммы;

параметр_i – формальные параметры (i=1, 2, …).

Имя подпрограммы общего вида не имеет типа, поскольку результаты вычислений возвращаются через список параметров. Оно не должно появляться в каком-либо другом операторе подпрограммы, кроме оператора Subroutine. В качестве формальных параметров, повторение которых в описании подпрограммы не допускается, могут использоваться имена переменных, массивов и внешних подпрограмм. Если в качестве формальных параметров использованы массивы, то их необходимо описывать по тем же правилам, что и для подпрограммы-функции.

Подпрограмма общего вида имеет следующую структуру:

–  оператор Subroutine;

–  группа операторов, реализующая вычислительный алгоритм;

–  оператор Return;

–  оператор End.

Например:

Subroutine Prog(A, B, C, N)

……………

Return

End

Использование операторов Return и End аналогично их применению в подпрограмме-функции.

Обращение к подпрограмме общего вида выполняется с помощью специального оператора Call.

Call имя ([параметр_1 [, параметр_2]…])

где имя – имя подпрограммы;

параметр_i – фактические параметры (i = 1, 2, …).

В качестве фактических параметров могут использоваться выражения, имена массивов и других подпрограмм. Количество, тип и порядок следования формальных и фактических параметров должны совпадать. Фактический параметр, являющийся именем подпрограммы, должен быть описан в программной единице, вызывающей подпрограмму общего вида так же, как и для подпрограммы-функции. Оператор Call передает управление из вызывающей программы в подпрограмму общего вида и устанавливает соответствие между ее формальными параметрами и фактическими параметрами обращения.

Использование подпрограммы общего вида может быть показано на следующем примере: написать подпрограмму вычисления корней приведенного квадратного уравнения и программу ее тестирования следующими уравнениями:

1. x2 — 3x + 2 = 0;

2. x2 + 4x + 4 = 0;

В результате решения тестовых уравнений должны быть получены результаты

1.

x1 = 1,

x2 = 2;

2.

x1 = -2,

x2 = — 2;

Программа имеет вид:

Dimension A(3, 2), X1(3), X2(3)

Open(1, File = ‘dat’)

Open(2, File = ‘res’)

Read(1, 1) ((A(i, j), j = 1, 2), i = 1, 3)

1 Format(2F6.2)

Do i = 1, 2

10 Call Roots(A(i,1), A(i,2), X1(i), X2(i))

Write(2, 2)

2 Format(‘X1’, ‘X2’)

Enddo

End

Subroutine Roots(P, Q, X1, X2)

D = (P/2)**2 — Q

If (D>=0.0) Then

X1 = — P/2 + Sqrt(D)

X2 = — P/2 — Sqrt(D)

EndIf

Return

End

Формальные параметры в подпрограмме могут отсутствовать и скобки в этом случае необязательны. В этом случае способом передачи данных между программными единицами являются так называемые общие блоки. Под ними понимают общие блоки памяти, доступные различным программным единицам для хранения своей информации. Для описания общих блоков используется оператор Common в форме:

Common список

где список — список имен переменных и массивов, разделенных запятыми.

Оператор должен оформляться в соответствии со следующими правилами:

–  имена переменных и массивов могут встречаться в списке оператора только один раз;

–  имена формальных параметров и функций в списке не до пускаются;

–  оператор Common должен располагаться в программной единице до первого выполняемого оператора.

Работа оператора Common может быть пояснена на примере:

Dimension C(3), X(3), N(3)

Common A, B, C

Open(1, File = ‘dat’)

Open(2, File = ‘res’)

………….

End

Subroutine Test(Q, X, N)

Dimension F(3)

Common P, E, F

……

Return

End

В данном случае главная программа имеет оператор Common, описывающий общий блок, который содержит значения переменных A и B и одномерного массива C из трех элементов. Такой же блок описан в подпрограмме Test, что позволяет располагать его переменные P, E и массив F в той же области памяти ЭВМ. В результате такого наложения переменные A и P, B и E, а также элементы массивов C и F будут всегда иметь одни и те же значения.

Пример выполнения задания. Написать функцию для поиска максимального значения элементов массива a[10]. Исходные данные вводить из файла dan и результаты выводить в файл res.

Программа

program lab_6

Real a(10), buf, Amax

Integer i

Open(5, File = ‘dat’)

Open(6, File = ‘res’)

15 read(5,1) (a(i),i=1,10)

1 format(5f4.1)

write(6,1) (a(i),i=1,10)

Amax=P_M(a,10)

write(6,20) Amax

20 format(‘********************’/’ Max=’,f6.3)

end program

Function P_M(a, n)

Dimension a(n)

Real buf

P_M=a(1)

Do i=2,10

if (a(i)>P_M) then

P_M=a(i)

endif

enddo

return

Файл исходных данных dan

3.0 2.3 7.4 3.0 2.3

1.5 5.1 1.6 1.5 5.3

Файл результатов res

3.0 2.3 7.4 3.0 2.3

1.5 5.1 1.6 1.5 5.3

********************

Max= 7.400

З а д а н и е к л а б о р а т о р н о й р а б о т е

Написать функцию, выполняющую указанные действия, и составить программу её тестирования. При тестировании функции использовать одномерные массивы из 10 элементов. Исходные данные вводить из файла dan и результаты выводить в файл res.

1. Вычислить сумму элементов массива с нечетными значениями.

2. Определить количество положительных элементов в массиве.

3. Вычислить сумму отрицательных элементов.

4. Найти максимальный элемент массива.

5. Вычислить среднее значение положительных элементов массива.

6. Определить количество элементов массива, значение которых больше заданного значения а.

7. Определить количество отрицательных четных элементов в массиве.

8. Определить сумму двух минимальных значений в массиве.

9. Вычислить произведение отрицательных элементов массива.

10.Найти сумму двух самых близких значений рядом стоящих элементов массива.

11.Заменить в массиве все отрицательные значения на нули.

12.Определить сумму элементов массива, значение которых меньше а.

13.Округлить значения элементов массива по правилам алгебры.

14.Вычислить количество элементов массива, значение которых лежит в заданном диапазоне [a, b].

15.Расположить элементы массива в обратном порядке.

16.Определить количество отрицательных значений среди чётных элементов массива.

17.Найти максимальный и минимальный элементы массива и обменять их значениями.

18.Определить минимальное нечётное значение в массиве.

19.Вычислить сумму элементов массива, имеющих чётные индексы.

20.Определить среднее геометрическое значение элементов массива.

21.Найти индекс минимального элемента в массиве.

22.Вычислить среднее арифметическое значение нечетных элементов массива.

23.Найти индекс максимального по модулю элемента в массиве.

24.Вычислить сумму дробных частей элементов массива.

25.Найти максимальный элемент массива, значение которого меньше заданного значения а.

26.Определить количество элементов массива, значения которых делится на 3 без остатка.

27.Найти значение, повторяющееся в массиве несколько раз.

28.Определить количество подряд стоящих отрицательных элементов в массиве.

29.Увеличить все положительные элементы массива на величину а и отрицательные на b.

30.Вычислить количество элементов, разделяющих минимальный и максимальный элементы массива.

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020

А ты боишься COVID-19?

 Пройди опрос и получи промокод