Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
W-10_Fort_68_стр_10г..doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.18 Mб
Скачать

3.5 Оператор dimension

Для записи массива должно быть выделено место в памяти ЭВМ. Выделение памяти для хранения массива осуществляется с помощью неисполняемого оператора DIMENSION. Этот оператор должен быть расположен в программе перед исполняемыми операторами. Общая форма оператора DIMENSION имеет вид: DIMENSION « список ». Список содержит имена массивов с границами индексных выражений, заключенными в скобки. Например:

DIMENSION A(20), R(5), M(3, 3)

Этот оператор резервирует в памяти 20 ячеек для хранения вещественных чисел А(1), А(2) …А(20). Выделяет также пять ячеек для хранения вещественных чисел, составляющих массив R, и девять ячеек для хранения целых чисел, составляющих массив М. Если указывается только одна граница индексного выражения, то она определяет его наибольшее значение. Одним оператором можно определить несколько массивов. Другой пример: DIMENSION M(-1:1)

Данный оператор выделяет в памяти ЭВМ три ячейки М(-1), М(0) и М(1) для хранения целых чисел. Следующий пример:

DIMENSION A(3)

DIMENSION M(-1: 1)

Эти операторы выделяют память для трех вещественных элементов массива А и трех целых элементов массива М. Если требуется дать массиву имя, не соответствующее соглашению о типах, то следует воспользоваться оператором описания типа. В этом операторе можно указывать границы индексных выражений. В таком случае массив не нужно определять с помощью оператора DIMENSION. Например, INTEGER GRM (0: 2) выделяет память для трех элементов целого массива GRM.

3.6 Индексные выражения

Индексные выражения могут принимать любое целое значение – положительное, отрицательное или ноль – в пределах, определенных оператором DIMENSION или его эквивалентами. Индексные выражения могут быть целыми константами, целыми переменными и целыми выражениями. Значение индексного выражения вычисляется во время выполнения оператора, содержащего обращения к элементу массива. Это значение определяет расположение элемента в массиве Если і представляет собой текущее значение целой переменной І, то А (І)– і-тый элемент массива А, например при І=3, А(3)– третий элемент массива. Выражение А(І * (М – 1)) может указывать на различные элементы массива А в зависимости от значений І и М. Если І = 2, М = 4, то выражение указывает на элемент А(6). Если значения индексных выражений выходят за границы индексов, заданных в описании массивов, то значение данной переменной с индексами считается неопеределенным. Оно не может использоваться в вычислениях, и компьютер в таких случаях выдает сообщение об ошибке. Например,

А (І * (М – 1)) при І = 2, и М = 6 указывает на элемент А (10), но если оператором

DIMENSION описан массив А (8), то следует сообщение об ошибке.

3.7 Ввод – вывод одномерных массивов (в/в)

Значение отдельных элементов массива можно ввести в память, включив эти элементы в список оператора 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)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]