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

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

Можно ввести значения отдельных элементов массива, перечислив их в списке ввода оператора read, например:

integer, parameter :: N=5

real, dimension(1:N) :: array

open(1, file=’in.txt’)

read(1,*) array(1), array(2), array(3), array(4), array(5)

Из файла «in.txt» вводятся значения пяти элементов вещественного массиваarray. Но не всегда массивы состоят из пяти элементов, и их перечисление в списке ввода довольно утомительно. Попробуем сократить запись, используя оператор цикла:

do i=1, N

read(1,*) array(i)

enddo

Код оператора цикла не зависит от размера массива. Однако, обратите внимание на то, что каждый оператор readначинает ввод с новой строки, и поэтому количество строк в файле должно быть равно количеству вводимых элементов массива (каждый элемент – в отдельной строке).

Если же элементы массива подготовить к вводу, перечислив их в одной строке, при выполнении программы будет зафиксирована ошибка ввода (недостаточно данных в файле). Дело в том, что из строки ввода будет прочитано только значение первого элемента массива (один элемент в списке ввода), а после перехода к следующей строке файл «закончится».

Записать оператор ввода можно более компактно, если использовать неявный цикл (конструкция записывается в скобках, если шаг опущен, он по умолчанию равен 1):

(Список ввода, переменная=начальное значение, конечное значение, шаг)

read(1,*) (array(i), i=1,N)

В этом варианте длина списка ввода равна N. Каждая строка файла может содержать произвольное количество значений. Оператор вводитNзначений и размещает их в первыхNэлементах массива.

В следующем операторе неявного цикла

read(1,*) (array(i), i=1,5,2)

список ввода состоит из трех элементов array(1), array(3), array(5).

Из файла, связанного с устройством 1 будут прочитаны 3 первых значения(!),которые будут присвоены элементам массиваarray(1), array(3), array(5).

Если нужно ввести весьмассив, в оператореreadможно записать имя массива без индексов, например:

real, dimension(1:5) :: array

open(1, file=’in.txt’)

read(1,*) array ! длина списка ввода равна 5

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

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

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

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

Пример 1. Выводвсехэлементов одномерного массива:

integer, parameter :: Len = 256 ! количество элементов

real, dimension(1:Len) :: array

open(1, file=’out.txt’)

write(1,40) array ! длина списка вывода равна 256

40 format(F6.2) ! длина списка спецификаций равна 1

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

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

40 format(10F6.2)

В этом случае количество строк в файле out.txtуменьшится в 10 раз, а последняя строка содержит только 6 значений.

Пример 2. Выводвторой половиныодномерного массива:

При решении этой задачи не обойтись без циклов.

integer, parameter :: Len = 256

integer:: i ! индексная переменная

real, dimension(1:Len) :: array

open(1, file=’out.txt’)

do i = Len/2+1, Len

write(1,40) array(i) ! длина списка вывода равна 1

end do

40 format(10F6.2)

Количество выводимых элементов равно 128, и все они принадлежат второй половине массива. Но использование повторителя формата не спасло от вывода «в столбик» – ведь длина списка вывода равна единице, а каждый оператор writeначинает вывод с новой строки. Из 10 спецификаций формата 9 не используются.

Решить проблему поможет неявный цикл:

integer, parameter :: Len = 256

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