- •Lesson 4 Массивы
- •Одномерные массивы Описание одномерных массивов
- •Ввод и вывод одномерных массивов Ввод одномерного массива
- •Вывод одномерного массива
- •Integer:: I
- •Примеры задач.
- •Многомерные массивы
- •Секции массива
- •Размещение массивов в памяти
- •Ввод и вывод массивов
- •Ввод двумерного массива
- •Вывод двумерного массива
- •Примеры задач.
- •Характеристики массивов
- •Форма массива. Конформные массивы
- •Функции shape и size
- •Выражения с массивами и присваивание массивов
- •Оператор и конструкция where
- •Динамические массивы
Ввод и вывод одномерных массивов Ввод одномерного массива
Можно ввести значения отдельных элементов массива, перечислив их в списке ввода оператора 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
