Ввод и вывод двумерного массива
Ввод матрицы делают построчным и бесформатным:
Integer,parameter::kolStr=2, kolStlb=3
! количество строк и столбцов
Integer::str,stlb ! номера строки и столбца
Real,dimension(1:kolStr,1:kolStlb):: A! массив
! либо диапазон индекса столбца = «:» – по умолчанию [1:kolStlb]
Read(1,*)(A(str,:),str=1,kolStr)
! либо циклы по секциям-строкам:
Read(1,*)(A(str,1:kolStlb), str=1,kolStr)
! либо вложенные неявные циклы – по столбцам внутри строк
Read(1,*)((A(str,stlb),stlb=1,:),str=1,kolStr)
Вывод массива по строкам аналогичен, но обязательно по формату.
Write(2,1)(A(str,:),str=1,kolStr)
1 format(‘Матрица’/3(f5.1))
В операторе Format целый повторитель kolStlb – длина строки матрицы:
1 format(‘Матрица’/<kolStlb>(f5.1))
Динамические массивы.
Размер статического массива не может быть изменен в процессе вычислений, что не всегда удобно при решении задач. Этого неудобства можно избежать, применяя динамические массивы. Работа с динамическим массивом требует (смотри пример программы):
a) описать динамический массив с атрибутом Allocatable, указывая количество измерений и не указывая размеров;
b) определить размер массива оператором ввода (для двумерного массива – количество строк и столбцов, для одномерного – количество элементов);
c) разместить массив в памяти оператором Allocate;
d) выполнить действия с массивом;
e) освободить память оператором Deallocate.
Пример
В каждой строке целочисленной матрицы найти первый элемент, не равный нулю, и сменить его знак. Вывести исходную матрицу, координаты найденных в каждой строке элементов и результирующую матрицу. О строках со всеми нулями вывести сообщение с номером строки.
Рис.7. Блок-схема алгоритма для матрицы * — «В строке i все элементы равны 0» ** — «Координаты первого ненулевого элемента строки = [i, Num]» |
Программа
Program Matrix; Implicit None
! студент (фамилия, имя) группа № работа № вариант №
Integer,Allocatable,dimension(:,:)::A ! динамическая матрица
Integer,Allocatable,dimension(:):: B ! динамический массив
Integer varStr,varStlb ! переменные размеры матрицы по измерениям
Integeri, j ! индексы строк и столбцов
Open(1,file=’in.txt’) ! файл с исходной матрицей
Open(2,file=’out.txt’) ! результирующий файл
Do! цикл по нескольким матрицам разной формы
Read(1,*,end=10)varStr,varStlb ! ввод размеров (строк, столбцов)
!размещение динамических массивов varStr строк, varStlb столбцов
Allocate(A(1:varStr,1:varStlb),B(1:varStlb))
! ввод массива - неявный цикл по секциям-строкам
Read(1,*) ( A(i,:), i = 1,varStr )
! По блок-схеме, составленной по заданию, написать программу
! Не забудьте добавить необходимые описания переменных и массивов
Deallocate(A) ! освобождение динамической памяти
Enddo
End Program Matrix
Результаты работы программы
Содержимое файла Out.txt c одной матрицей:
В исходной матрице 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
Контрольные вопросы
1. Что такое двумерный массив? Его аналоги в математике на примере двух массивов. Описание двумерных массивов в Fortran90, диапазоны индексов.
2. Форма – основная характеристика массива, напишите примеры конформных (одинаковых по форме) массивов.
3. Назовите атрибуты массива, определяющие характеристики, не связанные с его размерностью.
4. Укажите порядок размещения элементов двумерных массивов в памяти компьютера. Приведите пример.
5. В программе объявлен двумерный массив A(12,12). Как его описать в Fortran90? Как записать в программе ссылку: а) на полный массив, б) на секцию массива, в) на элемент массива?
6. Допустим ли оператор присваивания к массивам, объявленным ниже? Почему?
RealA(2, -3:3), B(0:1, 0:6), C(-2:-1, 1:7)
A = cos(B**2)- 3*C
7. Поясните правила записи выражений в операторах присваивания с массивами на примерах.
8. Как работает оператор where? Приведитепримеры оператора where а) без блока; в) с одним блоком; с) с двумяблоками.
9. Что произойдет при выполнении оператора Read?
Real,dimension(1:12,1:12) A
Read (1,*) A(1, 12)
10. Как ввести первую строку массива, объявленного оператором
Real, dimension(1:20,1:12):: A?
11. Как вывести вторую строку массива, объявленного оператором
Real, dimension(1:20,1:12):: A?
12. Форматный вывод двумерного массива на примерах.
13. Что будет выведено при выполнении оператора Write?
Real, dimension(1:12, 1:12):: A
Write(*,*) A(12,12)
14. Что и как будет выведено при выполнении оператора Write?
Real, dimension(1:12, 1:12):: A
Write (*,11) A(10:12, 10:12)
11 Format(F10.2)
15. Объявите вещественный массив из 100 строк и 5 столбцов и напишите оператор Format и оператор вывода элементов массива:
a) заголовок «Результаты работы»;
b) далее элементы массива в виде матрицы.
Дата добавления: 2016-02-13; просмотров: 2437;