
Farionova_Fortran
.pdf
Тема4. Работасмассивами
Часто решения задач сводятся к поиску наименьшего / наибольшего элемента в одномерном массиве.
Решаются такие задачи также с помощью задания вспомогательной переменной. Предполагается, что первый элемент массива является максимальным и/или минимальным и его значение присваивается специально отведенным для этого переменным smax (для максимального элемента) и smin (для минимального элемента). Далее в цикле smin и smаx сравниваются с текущим элементом. Если обнаруживается, что текущий элемент больше smаx, то smаx присваивается значение этого элемента, если текущий элемент меньше smin, то smin присваивается значение этого элемента. Таким образом, после перебора всех элементов массива в переменных smin и smаx окажутся искомые значения.
Program max_min
integer, parameter :: n=10 integer s(n)
integer :: i, smax, smin
s = (/10, 20, -19, 30, 2, 12, 14, 80, 90 100/) write(*, "(100(i4))"), (s(i), i=1,n)
smax = s(1) smin=s(1) do i=1,n
if (s(i)<smin) smin=s(i) if (s(i)<smax) smax=s(i)
enddo
write(*,100), "Maximum…", smax write(*,100), "Minimum…", smin 100 format(a,i4)
end
Результат работы программы:
10 20 –19 30 2 12 14 80 90 100 Maximum… 100
Minimum… –19
Press any key to continue
42

4.5. Многомерные массивы
4.5. Многомерные массивы
Массив, у которого r ≥ 2, где r – ранг массива, называют многомерным. Зал кинотеатра может служит примером многомерного массива (r = 2), где местоположение кресла характеризуется двумя параметрами: номером ряда и номером кресла в этом ряду. С математической точки зрения примером многомерного (а именно двухмерного) массива может служить матрица размерностью m × n.
При изучении многомерных массивов для большей наглядности ограничимся двумерными массивами.
Двухмерный массив – это сложная структура данных, имеющая одноимя, конечноеколичествооднородныхэлементов, каждыйизкоторых имеет свой уникальный адрес, состоящий из двух параметров. Задавая массив, нужно указать количество строк и количество столбцов:
real x(9,9),y(9,9)
или
real, dimension (9,9):: x,y
или
integer, parameter :: n=2, m=3 real, dimension (1..n,1..m):: x,y
Данное описание представляет матрицу следующего вида:
a (1,1) a(1,2) a(1,3) a(2,1) a(2,2) a(2,3)
Памятькомпьютераявляетсяодномерной, поэтомудвухмерныймассивхранитсякакодномерный. ВФортранеприхраненииэлементырасполагаются по столбцам:
a(1,1) a(2,1) a(1,2) a(2,2) a(1,3) a(2,3)
Обратиться к элементам массива можно следующим образом:
K=4
X(k,k)=7 ! четвертому элементу массива в !четвертой строке присвоено значение 7
i=8
j=5
X(I,j)=12 ! пятому элементу массива в восьмой !строке присвоено значение 12
43

Тема4. Работасмассивами
Например: X(1,2)=5, т. е. в 1-ю строку и 2-й столбец помещен элемент со значением 5.
Ввод/вывод элементов многомерного массива
Ввод/выводэлементовмногомерногомассиваможноосуществлять следующимиспособами:
1. read *,a ! ввод всех элементов массива !(согласно его описанию)
Столбцы заполняются сверху вниз. В этом случае значения вводятся в массив по столбцам слева направо.
2. do i=1,n read*,(a(i,j),j=1,n) enddo
С использованием внешнего и скрытого циклов элементы будут записываться в массив построчно сверху вниз, в каждой строке – слева направо.
3. Описанные выше способы на практике использовать неудобно: можно запутаться, какой по счету элемент вводится. Для предотвращенияэтогорекомендуется передвводом каждогоэлементавыводитьподсказку с номером вводимого элемента:
do |
i=1,n |
do |
j=1,n |
print '(a,i2,a,i2,a)','a(',I,',',j,')=' |
|
read*,a(I,j) |
|
end do |
|
enddo |
|
4. print *,a ! вывод всех элементов массива |
!(согласно его описанию) в том виде, !как он хранится в памяти
5. Для лучшего зрительного восприятия двухмерный массив рекомендуется выводить в виде матрицы по строкам:
а)
do i=1,n write(*,*),(a(i,j),j=1,n) enddo
44

4.6.Примеры решения задач с использованием двухмерных массивов
Впримере цикл по i позволяет перемещаться по строкам, а скрытый цикл по j перемещает по столбцам:
б)
do i=1, n do j=1, n
write(*,'(100(f5.2))'), a(I,j) enddo
write(*,*) enddo
Здесь скрытый цикл по j выделен явно и является вложенным в циклпоi.
4.6. Примеры решения задач с использованием двухмерных массивов
Вбольшинствеслучаевдляобработкидвухмерныхмассивовиспользуетсявложенныйцикл.
Рассмотрим фрагмент программы обработки элементов двухмерного массива, схема алгоритма которого приведена на рис. 4.4.
X=a(1,3)
N1=1
N=3
do i=1, N do j=1, N
If (a(i,j) <x) then X=a(I,j)
N1=i
Endif Enddo
Enddo |
|
|
|
|
|
5 |
60 |
47 |
|
Пусть матрица A имеет вид |
A = 14 |
9 |
16 |
. |
|
|
2 |
13 |
|
|
19 |
|
||
|
|
|
|
|
45

Тема4. Работасмассивами
На каждом шаге переменная x будет принимать следующие значе-
ния:
x=a(1,3)=47, |
N1=1, |
n=3 |
||
i=1 |
j=1 |
a(1,1)=5<x |
true x=5 |
|
i=1 |
j=2 |
a(1,2)=60<x |
false |
|
i=1 |
j=3 |
a(1,3)=47<x |
false |
|
i=2 j= 1 |
a(1,1)=14<x |
false |
||
i=2 j= 2 |
a(2,2)=9<x |
false |
||
i=2 j= 3 |
a(2,3)=16<x |
false |
||
i=3 j= 1 |
a(3,1)=19<x |
false |
||
|
j= 2 |
a(3,2)=2<x |
true -> x= a(3,2)=2 |
|
|
j= 3 |
a(3,3)=13<x |
false |
После выполнения фрагмента программы x=2. |
Х = а1,3, N1 = 1 n = 3 |
I = 1,N |
J = 1,N |
ai,j < x |
X = ai,j |
N1 = i |
Рис. 4.4. Блок-схемафрагментапрограммыобработки |
элементовдвухмерногомассива |
Данныйфрагментпрограммыреализуеталгоритмпоискаминималь- |
ного элемента в двухмерном массиве. Если надо выполнить анализ не |
всего массива, а элементов, расположенных на побочной диагонали |
и под ней, параметр вложенного цикла j (счетчик по столбцам) меняет- |
46 |

4.6. Примеры решения задач с использованием двухмерных массивов
ся от N-i+1 до N для каждого i, где i – это номер строки. Если рассматривается часть матрицы на главной диагонали и над ней, то j меняется от i до n.
Пример. В квадратной матрице посчитать сумму элементов главнойдиагоналиипроизведениеэлементовпобочнойдиагонали(рис. 4.5).
а(1, 1) |
а(1, 2) |
а(1, 3) |
а(1, 4) |
|
а(1, 1) |
|
|
а(1, 4) |
|
|||
|
|
|
|
|
|
|
|
|
|
|
||
а(2, 1) |
а(2, 2) |
а(2, 3) |
а(2, 4) |
|
а(2, 2) |
а(i, i) |
а(2, 3) |
а(i, n-i+1, 2) |
||||
|
|
|
|
|
|
|
|
|
||||
а(3, 1) |
а(3, 2) |
а(3, 3) |
а(3, 4) |
|
а(3, 3) |
|
|
|
||||
|
|
|
|
а(3, 2) |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
||
а(4, 1) |
а(4, 2) |
а(4, 3) |
а(4, 4) |
|
а(4, 4) |
|
|
а(4, 1) |
|
|||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
Главная |
|
|
Побочная |
|
|||
|
|
|
|
|
диагональ |
диагональ |
Рис. 4.5. Квадратнаяматрица, выборэлементовглавной ипобочнойдиагоналейквадратнойматрицы
Элементы главной диагонали имеют одинаковые индексы. Поэтому для суммирования элементов можно использовать цикл
Summa=0 Do i=1, n
Summa=summa+a(i,i) enddo
Вэлементахпобочнойдиагоналииндексi увеличивается, аj уменьшается, т. е. j=N-i+1, где i – номер строки; j – номер столбца; n – размерность матрицы.
Pr=1
Do i=1,n Pr=pr*a(I, n-i+1) enddo
47

Тема4. Работасмассивами
Объединяя оба цикла в один, получаем программу
Program diag
Integer, parameter :: m=5
Integer a(m,m), summa, proizv, I,j
!summa – сумма элементов главной диагонали
!proizv – произведение элементов побочной диагонали
!I,j – счетчики циклов
Do i=1,m
Write (*,'(a, i2,a,$)), 'Vvedite elementi', I, '-go riada' Read(*,*), (a(I,j), j=1,m)
Enddo Summa=0 Do i=1, n
Summa=summa+a(i,i) Enddo
Pr=1
Do i=1,n
Pr=pr*a(I, n-i+1) enddo
print '(a,i2,a,i2)','summa=',summa,' proizv=',proizv end program diag
Результат работы программы:
Vvedite elementi 1-go riada 1 2 0 0 5 Vvedite elementi 2-go riada 1 3 4 4 1 Vvedite elementi 3-go riada 2 0 2 2 3 Vvedite elementi 4-go riada 1 1 2 1 1 Vvedite elementi 5-go riada 1 1 1 1 0 summa= 7 proizv=40
48
Тема 5. Работа с файлами в Фортране
Ранее предполагалось, что весь вывод происходит на экран, а весь ввод – с клавиатуры. Так, для ввода элементов матрицы размером 3×3 склавиатурынеобходимоввестидевятьзначений. Вслучаеошибкипри вводе хотя бы одной цифры исходные данные нужно вводить заново. А в инженерных расчетах часто используются объемы данных больших размеров.
Для того чтобы избежать ненужного труда, достаточно сохранить, например, на внешнем носителе вводимые данные, а при запуске программы указывать, откуда их считать. Таким местом хранения может бытьфайл. Файл– этонекоторыйнаборинформации, хранящейсялогически в одном месте и связанной с задачей. Реальное расположение данных в файле зависит от операционной системы (ОС).
ВФортранe имеется возможность сохранять данные в файл и читать их из файла. Для этого файл надо открыть и "связать" с некоторым номером устройства. Это сложилось исторически – раньше ввод осуществляли с внешних устройств с разными номерами, вставляя в них колоды перфокарт. Теперь файлы хранятся на магнитных носителях – дисках, лентах или в памяти компьютера.
5.1.Внешние и внутренние файлы
ВФортране различают два вида файлов: внешние и внутренние. Внешний файл – файл, существующий в среде, внешней по отно-
шениюквыполняемой программе.
Внутренний файл – символьная строка (подстрока) или массив. Внутренние файлы являются открытыми по умолчанию. Внешние файлы должны быть открыты (подсоединены к устройству ввода/выво-
да) оператором open.
К файлам Фортрана можно организовать либо последовательный, либо прямой доступ, к некоторым видам файлов – и тот и другой. С внутреннимифайламииспользуетсятолькопоследовательныйдоступ.
49

Тема5. РаботасфайламивФортране
Внешние файлы могут быть:
•форматными (текстовыми, ASCII);
•двоичными(бинарными);
•неформатными.
Двоичный и неформатный файлы содержат неформатные записи, т. е. записи, создаваемые без преобразования данных. Файл не может содержать одновременно форматные и неформатные записи.
Внешние файлы могут быть открыты как для монопольного, так
идля разделенного (сетевого) доступа.
Внашем пособии будет рассмотрена работа только с внешними файлами.
Врезультате выполнения операции над внешним файлом курсор может находиться:
•в начальной точке файла – непосредственно перед первой записью;
•между соседними записями файла;
•впределаходнойзаписи;
•вконечнойточкефайла– послепоследнейзаписидоспециальной записи"конецфайла";
•назаписи"конецфайла";
•послеспециальнойзаписи"конецфайла".
Фактперемещенияна"конецфайла" устанавливаетсяфункциейeof, которая возвращает .true., если файл позиционирован в конце файла или вслед за ним, и .false. – в противном случае.
В данной теме будет рассмотрена работа только с внешними текстовымифайлами. Текстовыйфайлпредставляетсобойсовокупность символов, объединенных в строки. Обработка текстового файла может происходитьтолькопоследовательно. Операциисфайламиосуществляются с помощью специальных операторов. Перед началом работы с элементами, которые хранятся в файле, его необходимо открыть. Отметим, что текстовый файл может быть открыт только для чтения или для записи.
5.2. Организация работы с файлами
Для передачи данных файл Фортрана подсоединяется к устройству ввода/вывода (В/В).
50

5.2. Организация работы с файлами
Устройство внешнего файла задается целочисленным скалярным выражением или звездочкой (*). Возвращаемый им результат называется номером устройства В/В, значение которого должно находиться в интервале от 0 до 32767. Устройство внутреннего файла задается переменнойстандартногосимвольноготипа.
Устройство используется для ссылки на файл.
Кроме файлов, к устройствам В/В могут быть подсоединены физическиеустройства, напримерклавиатура, экран, принтер, параллельный порт.
Всегда в каждой Фортран-программе существуют устройства *, 0, 5 и 6. Причем по умолчанию к устройствам *, 0 и 5 подсоединена клавиатура, акустройствам*, 0 и6 – экран. Так, вофрагментепрограммы
real :: b = 1.2 write(*, '(F6.2)'), b write(0, '(F6.2)'), b write(6, '(F6.2)'), b end
все операторы write обеспечат вывод значения переменной b на экран.
Подсоединениефайловосуществляетсяоператоромopen, который открывает указанный пользователем физический файл на диске и присваивает его устройству. Например, open(12, FILE='result') открывает файл с именем 'result', находящийся в текущем каталоге, и присваивает его устройству 12. В случае расположения файла в любом другом месте необходимо указать в кавычках полный путь к файлу и его имя. Номер выбирается произвольно, можно даже переопределить устройства 0, 1, 5, 6.
Кроме обязательных атрибутов номера устройства и имени файла есть еще необязательные STATUS, ERR и ACTION.
STATUS определяет состояние файла и время его существования: STATUS = 'OLD' – открывается существующий файл;
STATUS = 'NEW' – создается и открывается новый файл; STATUS = 'REPLACE' – создается и открывается новый файл, если
файл с таким именем уже существует, он перезаписывается; STATUS = 'SCRATCH' – создается и открывается временный файл,
который существует только во время работы программы и удаляется по ее завершении.
51