Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
14.04.2015
Размер:
543.74 Кб
Скачать

Ввод и вывод массивов

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

a(1,1), a(1,2), a(1,3), a(2,1),a(2,2), a(2,3)

Оператор

read(1,*) A

введет последовательность значений из файла и в том же порядке поместит эти значения в область памяти, предназначенную для массива. Но ведь в памяти эти элементы должны расположиться по столбцам!

В файле 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)

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

Оператор

write(1,*) A

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

Внимание!Последовательность операторов

read(1,*) A; Write(2,*) A

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

Ввод двумерного массива

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

Пример

integer, parameter:: kLine=2, kCol=3 ! число строк и столбцов

integer::nLine, nCol ! номера строки и столбца

real, dimension(1: kLine,1: kCol):: A ! массив

Далее показаны три возможности написания оператора read.

  1. использовать неявный цикл по строкам массива, представив каждую строку в виде секции массива A(nLine,1: kCol):

read(1,*)(A(nLine,1: kCol), nLine =1, kLine)

  1. в том же неявном цикле по строкам в секции-строке диапазон индекса столбца использовать по умолчанию A(nLine,:):

read(1,*)(A(nLine,:), nLine =1, kLine)

  1. в неявном цикле по строкам массива использовать вложенный неявный цикл по столбцам этого массива:

read(1,*)((A(nLine,nCol),nCol=1,kCol),nLine=1,kLine)

Вывод двумерного массива

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

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

write(2,*) ‘Матрица’

do nLine = 1, kLine ! цикл по строкам

write(2,11) A(nLine,:) ! строка – секция массива

enddo

11 format (20(F7.2))

Здесь каждой строке соответствует оператор write. Повторитель спецификаций формата не должен быть меньше, чем длина строки массива.

Более компактно то же самое можно записать с использованием неявного цикла:

write (1,11)(A(nLine,:), nLine =1, kLine)

11 format(‘Матрица’/<kCol>( F7.2))

Здесь для вывода всего массива используется один оператор write, то есть длина списка вывода равна длине массива. Для того, чтобы каждая строка массива была выведена в отдельной строке файла, служит повторитель спецификации в оператореformat. Если в качестве повторителя используется переменная, ее имя заключается в угловые скобки.

Пример 1. Вывести в виде матрицы элементы нижней правой четверти вещественной матрицыAиз 4 строк и 6 столбцов.

real, dimension(1:4, 1:6) :: A ! массив

integer::nLine ! номер строки

write (1,11)(A(nLine, 4:6), nLine =3, 4)

11 format(3(F7.2))

Пример 2. Вывести в виде одномерных массивов элементы главной и побочной диагоналей квадратной вещественной матрицыAразмеромSize Size.

integer, parameter:: Size=8 ! число строк и столбцов

integer::Number ! номера строки и столбца

real, dimension(1: Size,1: Size):: A ! массив

! главная диагональ

write (1,11)(A(Number, Number), Number=1, Size)

! побочная диагональ

write (1,11)(A(Number, Size-Number+1), Number= Size, 1, -1)

11 format(<Size>(F7.2))

Соседние файлы в папке Фортран_Лекции