Ввод – вывод одномерных массивов (в/в)
Значение отдельных элементов массива можно ввести в память, включив эти элементы в список оператора READ. Например: READ(5,*) N, X, A(2), A(3), I (1)
В этом случае оператор READ считывает пять чисел из записи исходных данных и присваивает их значения целой переменной N, вещественной переменной X, элементам вещественного массива А(2) и А(3) и элементу целого массива I (1) соответственно.
Оператор READ(5,*) А(1), A(2), A(3), А(4) считывает из записи данных четыре числа и заносит их в ячейки соответствующие элементам А(1), A(2), A(3), А(4) массива А. Такая конструкция оператора неудобна, когда требуется вводить большой набор данных. В этом случае лучше применить оператор, в конструкцию которого входит неявный цикл. Например: READ(5,*) (А(I), I = 1,4). Этот оператор также, как и в предыдущем примере, считывает из записи данных четыре числа и заносит их в ячейки памяти, соответствующие элементам массива А(1), A(2), A(3), А(4). Если количество вводимых чисел может меняться при каждом прогоне программы, то оператор ввода изменяется так, чтобы сначала вводилось целое число, обозначающее количество вводимых элементов массива. А за этим вводом должна следовать конструкция оператора с неявным циклом. Например:
DIMENSION A (50)
READ (5, *) N
READ (5, *) (А(I), I = 1, N)
В этом примере оператор DIMENSION размещает в памяти 50 ячеек для хранения массива А. Второй оператор считывает целое число из записи данных и присваивает его целой переменной N. Третий оператор последовательно считывает со следующей записи данных N вещественные числа, которые заносятся в N элементов массива А: А(1), А(2).. А(N). Если ввод завершен, а в записи данных остались неиспользованные числа, то последние теряются. Если же в текущей записи данных не хватает, то оператор READ продолжает ввод с начала следующей записи, размещенной на следующей строке.
Оператор DIMENSION отводит для хранения массива область памяти фиксированного размера. Если N превысит установленный размер массива (в нашем примере 50), то транслятор может выдать сообщение об ошибке. Если такого сообщения не последует, то последние числа из записи могут быть размещены в непредсказуемых областях памяти, что приводит к труднообнаруживаемым ошибкам исполнения. Если N < 50, то в массиве А останутся элементы с неопределенными значениями и их не следует использовать, пока они не получат конкретные значения программы. Оператор ввода с неявным циклом может вводить числа не во все элементы массива подряд, а с некоторым шагом. Например, оператор READ(5,*)(А(I),I=1,5, 2) первое число из записи данных вносит в элемент А(1), второе – в элемент А (3), третье в элемент (5). Оператор ввода может иметь и такую форму:
READ (5, *) (А(I), I = 4, 0, -2)
Этот оператор последовательно считывает три числа и заносит первое число в А (4), второе–в А(2) и третье – в А(0). Таким образом, можно сделать вывод, что общая форма неявного цикла для одномерного массива имеет вид: (А (І), І = К1, К2, К3),
где К1 – начальный номер элемента массива. Если массив имеет имя А, то эта конструкция неявного цикла обращается сначала к элементу А(К1), затем к А(К1+ К3), потом – А(К1 + 2 * К3) и т.д. до тех пор, пока значение индексного выражения не превысит К2. Если константа К3 в конструкции неявного цикла опущена, то ее значение по умолчанию полагается равным 1. В операторе READ можно записать лишь имя массива без индексов. Например:
DIMENSION А (50)
READ (5, *) А
В этом случае оператор READ записывает информацию в каждый элемент массива А. Поэтому в исходных данных должно быть достаточно чисел для заполнения всех элементов массива А, определенного оператором DIMENSION.
Все сказанное выше в полной мере относится и к операторам вывода под управлением списка. Замена оператора READ на оператор PRINT приведет к выводу значений элементов массива на печать. Каждый оператор PRINT начинает печатать с начала новой строки, поэтому все данные, которые нужно напечатать в одной строке, следует указывать в одном операторе PRINT. Для иллюстрации сказанного заменим в ранее рассмотренных примерах оператор READ на PRINT:
PRINT *, N, X, A (2), A (3), I (1)
PRINT *, A (1), A (2), A (3), A (4)
PRINT *, (A (I), I = 1, 4)
PRINT *, (A (I), I = 1, N)
PRINT *, A
Неявный цикл заключен в скобки и представляет собой четко завершенную конструкцию. Поэтому его можно интерпретировать как отдельный элемент списка оператора ввода – вывода. Отсюда следует, что допустим оператор вида:
PRINT *, X, Y, (A(I), I =1, N), Z, (B(J), J =10, 1, -1)
Если на строке не хватит места для печати очередного значения, то вывод автоматически будет продолжен с начала новой строки.
Оператор цикла DO
В процессе работы программы часто требуется, чтобы некоторые ее участки (группы операторов, реализующие некоторую вычислительную процедуру) выполнялись многократно. Такие участки программы называются циклами. На ФОРТРАНе циклы могут быть описаны различными способами, например, с помощью операторов IF и GO ТО. Однако чаще всего для этого используется оператор DO. С его помощью можно несколько раз повторить выполнение группы операторов, следующих непосредственно за ним. Общий вид оператора DO:
DO n I=m1,m2,m3
где n-метка последнего оператора повторяемой группы (обычно СОNTINUE)
I— параметр цикла (простая целая переменная); m1, m2, m3—целые числа без знака (m1 ≤ m2) или целые переменные, которым к моменту выполнения оператора были присвоены целые положительны значения некоторых чисел.
Оператор DО с меткой n и все операторы между ними составляют цикл или область действия данного оператора DО. Операторы данного цикла выполняются сначала при I=m1, затем при I=m1+m3,I=m1+2m3и так далее до тех пор, пока I ≤ m2. Если m3 = 1, то оператор DO можно записать так:
DO n I=m1,m2
Отметим, что в области действия одного оператора DO может содержаться другой оператор DO со своей областью действия. Последние операторы этих циклов могут совпадать. Если во время выполнения цикла управление передается оператору, находящемуся вне этого цикла, то текущее значение параметра Iсохраняется. Если же цикл выполнен полностью, то значение параметра г становится неопределенным. Отметим также, что передача управления извне внутрь цикла DO не разрешается, то есть рассматриваемый цикл всегда выполняется начиная с оператора DO. При использовании оператора DO необходимо соблюдать следующие основные правила:
- конечный оператор цикла должен следовать после оператора DO и находиться с ним в одном и том же программном модуле.
- конечный оператор не может быть оператором перехода GOTO, RETURN, STOP, PAUSE, DO, арифметическим и логическим оператором IF.
Пример (1): Пример (2):
PROGRAM VOD/VV PROGRAM AMAX
* Резервируем место под массив A(100) * Определение максим. элемента массива
DIMENSION A(100) DIMENSION A(100)
PRINT*, ‘ВВЕCТИ ТОЧНОЕ КОЛ-ВО ЕЛЕМ ’ PRINT*, ‘VVED. KOL. ELEM ’
READ(5,*) N READ(5,*) N
PRINT*, ’ ВВЕСТИ ЕЛЕМ. МАССИВА ’ PRINT*, ’ VVED. ELEM. MAS. ’
READ(5,*) (A(I), I=1,N) READ(5,*) (A(I),I=1,N)
PRINT 5, (A(I), I=1,N) AMAX=A(1)
5 FORMAT(5X, 3F8.2) DO 5 I=2,N
END IF(A(I).GT.AMAX)AMAX=A(I)
5 CONTINUE
PRINT*, ‘AMAX= ‘, AMAX
END
3.9 Задания к лабораторной работе № 3
Вариант № 1
Составить программу выборки минимального элемента из массива А ( N ), определить его номер. Использовать форматный вывод. (N ≤ 20.)
Вариант № 2
Составить программу выборки максимального элемента из массива А (N ), определить его номер. Использовать форматный вывод. (N ≤ 20.)
Вариант № 3
Составить программу вычисления суммы отрицательных элементов из массива А ( N ). Использовать форматный вывод. ( N ≤ 20.)
Вариант № 4
Составить программу вычисления суммы положительных элементов из массива А (N) . Использовать форматный вывод. (N ≤ 20.)
Вариант № 5
Составить програм. вычисления количества положительных элементов в массиве А(N). Использовать форматный вывод. ( N ≤ 20.)
Вариант № 6
Составить програм. вычисления количества отрицательных элементов в массиве А(N). Использовать форматный вывод. (N ≤ 20.)