ФОРТРАН IV

Оглавление

  1. Элементы языка.
  2. 1.1 Символы

    1.2 Числовые константы.

    1.3 Комплексные константы.

    1.4 Логические константы.

    1.5 Шестнадцатеричные константы.

    1.6 Текстовые константы.

    1.7 Метки.

    1.8 Переменные.

    1.9 Функции

  3. Выражения.
  4. 2.1 Арифметическое выражение.

    2.2 Логическое выражение.

  5. Структура программы.
  6. Операторы описания типа.
  7. 4.1 Неявное объявление типа.

    4.2. Явное объявление типа.

  8. 4.3 Оператор задания размеров массивов.
  9. Операторы присваивания.
  10. 5.1. Операторы присваивания первого вида.

    5.2 Оператор присваивания метки.

  11. Правила записи операторов.
  12. Операторы перехода.
  13. 7.1 Оператор безусловного перехода.

    7.2 Вычисляемый оператор перехода.

    7.3 Присваиваемый оператор перехода.

  14. Условные операторы управления.
  15. 8.1 Арифметический условный оператор.

    8.2 Логический условный оператор.

  16. Оператор цикла.

10 Оператор-функция.

11 Подпрограммы-функции

12 Подпрограммы

13 Оператор входа

14 Оператор описания общих блоков

15 Оператор присваивания начальных значений

16 Подпрограмма данных

17 Оператор эквивалентности

18 Операторы ввода и вывода 

18.1 Оператор описания файлов.

18.2. Список ввода-вывода.

18.3. Операторы ввода без формата.

18.4 Операторы вывода без формата.

18.5 Операторы ввода с форматом.

18.6 Операторы вывода с форматом.

19 Оператор формирования списков 

20 Оператор задания формата

20.1 Список спецификаций

20.2 Спецификации преобразования.

20.3 Масштабный коэффициент.

20.4 Управляющие редакционные спецификации.

21 Классификация операторов и наименований

 

 

 

 

 

 

 

Элементы языка вернуться к оглавлению

1.1 Символы. При записи программ используются символы трех категорий: буквы, цифры и специальные знаки.

К первой категории относятся 26 прописных букв латинского алфавита:

А В С D Е F G Н I J К L М

N O P Q R S T U V W X Y Z,

а также знак денежной единицы, обозначаемый обычно $ (иногда иначе). Во входных языках для отечественных трансляторов, как правило, разрешается также использовать в качестве букв прописные буквы русского алфавита,

Вторая категория символов - это десять арабских цифр:

0 1 2 3 4 5 6 7 8 9

Специальными знаками языка являются символы:

(пробел),

= (равно),

+ (плюс),

- (минус),

* (звездочка),

/ (наклонная черта,

( (открывающая скобка),

) (закрывающая скобка),

, (запятая),

. (точка),

(апостроф),

& (коммерческое <и>),

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

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

С помощью перечисленных символов образуются величины, выражения и операторы, которые составляют элементы языка. При построении элементов языка используются конструкции, представляющие собой неделимые символы, хотя и образованные из нескольких первичных символов (букв, цифр и специальных знаков). Такие конструкции называются основными символами. К ним относятся, в частности, ключевые (служебные) слова, используемые при записи операторов.

Ключевыми словами являются следующие основные символы:

АSSIGN(присвоить), ВАСKSPАСЕ (назад), ВLОСК DАТА (блок данных), САLL(вызвать), СОММОN(общий), СОМРLЕХ(комплексный), CОNTINUE(продолжать), DАТА(данные), DEFINE FILE(определение файла), DIMENSION(размерность), DO(выполнить), ЕND(конец), END FILE(конец файла), ЕNTRY(вход), EQUIVALENCE(эквивалентность), EXTERNAL (внешний), FIND(найти), FORMAT(формат), FUNCTION(функция), GO ТО (перейти к), IF(если), IMPLICIT(неявный), INTEGER(целый), LOGICAL (логический), NAMELIST(список), PAUSE(останов), PRINT (печать), PUNCH (перфорация), READ (читать), REAL (действительный), RETURN (вернуться), REWIND (возврат), STOP (стоп), SUBROUTINE (подпрограмма), ТО (к), WRITE (писать).

В различных версиях языка список ключевых слов может быть расширен (или сокращен).

Основными символами являются также следующие конструкции:

К величинам относятся константы, переменные и метки (номера операторов). Константы могут быть арифметическими (числовыми или комплексными), логическими, шестнадцатеричными и текстовыми, переменные - простыми и с индексами. Переменные с индексами объединяются в массивы. Константы и переменные составляют данные.

1.2 Числовые константы. Для изображения числовых констант (чисел) используются цифры, точка, знаки + и -, а также буквы Е и D.

Числа различают двух типов: целые и действительные. Целое число - это любая конечная последовательность цифр, перед которой может стоять знак + или -. Отсутствие знака или знак + означают, что число положительное, знак - указывает, что число отрицательное. Примеры целых чисел:

15 +306 -00 -88 0 1938

Правильной дробью называется целое число без знака, перед которым стоит точка, например: .1 .3578 .0064 .0 .20338

Правильная дробь относится к числам действительного типа.

Числа действительного типа допускают в записи дробную часть и имеют две формы представления: форму F и форму Е.

Числом действительного типа в форме F называется либо целое число, за которым поставлена точка, либо правильная дробь, либо последовательность, состоящая из целого числа и правильной дроби; перед всей конструкцией может стоять знак + или - . Отсутствие знака означает, что число положительное. Например, действительными числами в форме F являются 10. 3.14159 +1.5789 0.317 .51 -37.000 -.00561 +.317

Таким образом, наличие точки при написании действительного числа в форме F обязательно. Нетрудно видеть, что форма F отличается от обычной математической записи лишь тем, что вместо десятичной запятой пишется точка.

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

Числом действительного типа в форме Е называется либо десятичный порядок, либо конструкция, состоящая из мантиссы в виде действительного числа в форме F или целого числа и последующего десятичного порядка. Например, действительными числами в форме Е являются:

Е-01 +0.27Е+04 27Е2

Е2 +.27Е4 27.Е+2

2700Е 27000Е-1 27Е + 02

Первые две записи являются порядками и обозначают действительное число 0. все последующие записи обозначают одно и то же действительное число, равное 2700.

Различают числа двух видов: стандартной длины и нестандартной длины. Стандартное машинное слово имеет длину в 4 байта, такова же стандартная длина числа (как целого, так и действительного типов). Целое число нестандартной длины содержит 2 байта.

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

Например, комплексное число 12 - 4.3i представляется как (12., - 4.3) или (12Е, - 0.43Е+1) или (12., -43Е-1) или (.12D2, -43D-1) и т. д. Последняя из приведенных записей является записью комплексного числа с двойной точностью (нестандартной длины).

1.4 Логические константы. Логические константы обозначаются символами .TRUE. и .FALSE., которые являются соответственно логической единицей (истина) и логическим нулем (ложь).

1.5 Шестнадцатеричные константы. Шестнадцатеричная константа записывается в виде последовательности, образованной из набора шестнадцатеричных цифр, которой предшествует символ Z.

Шестнадцатеричные константы могут быть использованы только как величины, присваиваемые переменным в операторе DАТА и в операторах явного описания типа.

1.6 Текстовые константы. Текстовая константа представляет собой последовательность (строку) символов. Возможно задание текстовой константы в виде строки символов, заключаемой в апострофы (строчные кавычки) или же строкой символов, которой предшествует конструкция wН (w - целая константа, указывающая количество символов в текстовой константе). В последнем случае количество символов в строке не должно превышать 255. Каждый символ (в том числе пробел) занимает 1 байт.

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

1.7 Метки. Меткой (номером оператора) является индивидуальное название, присвоенное оператору программистом. Метка образуется как последовательность цифр, которая, если ее рассматривать как целое число без знака, может принимать значения от 1 до 99999. Впереди стоящие нули у меток игнорируются. В записи меток допускаются пробелы.

Оператор помечается только одной меткой, по которой осуществляется ссылка на него, два оператора не должны иметь одинаковые метки. Порядок снабжения операторов метками произвольный, в частности, метка у оператора может отсутствовать. Таким образом, номер оператора (метка) не является порядковым номером оператора.

1.8 Переменные. Понятие переменная употребляется для обозначения величины, обращение к которой производится через ее наименование и которая может принимать различные значения (а не одно-единственное значение как константа).

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

Различают два вида переменных: простая переменная и переменная с индексами.

Простая переменная представляет собой величину, принимающую числовые, логические или текстовые значения, и обозначается идентификатором.

Одним идентификатором может быть обозначена группа величин, называемая массивом. Каждая отдельная величина представляет собой элемент массива - переменную с индексами. У одного элемента массива индексов может быть несколько. Максимальное число индексов равно семи, в ряде версий языка оно сокращено до трех. Индексы у переменной с индексами составляют список индексов. Количество индексов в списке определяет раз-

мерность массива.

Записывается переменная с индексами при помощи идентификатора, после которого в скобках следует список индексов. Например, компоненты вектора X(x1,х2,х3) составляют одномерный массив: Х(1) Х(2) Х(3), где Х - идентификатор массива, а индексы, являющиеся целыми числами 1, 2, 3, можно рассматривать как номера элементов.

Индексы в списке отделяются друг от друга запятыми. Например, элементом двумерного массива будет запись Y(1, 3). Индексом может служить любое арифметическое выражение, не содержащее переменных с индексами и называемое в этом случае индексным выражением (в частности, целая константа или целая переменная).

Значение индексного выражения должно быть целочисленным и больше либо равно 1. Если в результате вычислений значение индексного выражения не есть целое, то отбрасывается дробная часть.

В памяти ЭВМ элементы массива располагаются линейно. При этом первым меняется первый индекс. Например, двумерный массив из четырех элементов в памяти располагается по столбцам М(1, 1) М(2, 1) М(1, 2) М(2, 2)

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

Для указания типа и длины переменных служат операторы описания типа. В то же время для указания типа целых и действительных переменных стандартной длины существует способ автоматического объявления типа, состоящий в том, что для обозначения переменной целого типа стандартной длины применяются символы: I, J, K, L, M, N, употребляемые в качестве первого символа в идентификаторе переменной, Для обозначения переменной действительного типа стандартной длины используются идентификаторы, первый символ в которых есть любая буква, отличная от перечисленных.

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

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

 

2. Выражения вернуться к оглавлению

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

Операции подразделяются на арифметические, логические и операции отношения. В зависимости от типа значения выражения определяются арифметические и логические выражения.

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

+ (сложение), * (умножение),

- (вычитание). / (деление),

** (возведение в степень).

При построении выражений два знака арифметических операций не должны стоять рядом. Например, вместо А* -В следует писать А*(-В) или -B*А.

Последовательность выполнения арифметических операций следующая:

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

Операции одного ранга выполняются последовательно слева направо. Исключение составляет операция возведения в степень, которая выполняется справа налево. Так, выражение Е**М**N понимается как Е**(М**N).

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

Операция возведения в целую степень выполняется как многократное умножение, а возведение в действительную степень - через логарифмы. Следовательно, комплексную величину можно возводить в целую степень, но нельзя в действительную и двойной точности, Показатель степени но может быть комплексной величиной. Результат операции А**R не определен также в случае, когда А < 0, а R - действительного типа.

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

Логические переменные - это переменные, тип которых определяется с помощью соответствующего описательного оператора как логический. Переменные логического типа принимают только два значения: значения логических констант, .TRUE. и .FALSE.

Операции отношения обозначаются следующими комбинациями букв с окаймляющими с обеих сторон точками:

.GT. .GE. .EQ. .NE. .LE. .LT.

Каждый символ операции отношения объединяет два операнда, представляющих собой арифметические выражения произвольного типа и длины, за исключением выражений комплексного типа. В версии фортран-63 это ограничение снято; при этом из арифметического выражения комплексного типа для сравнения используется только вещественная часть. Результат сравнения, т. е. результат операции отношения, является логическим значением.

Логические операции определены для операндов логического типа, обозначаются символами

.NOT. .AND. .OR.

и имеют соответственно следующий смысл: отрицание, логическое умножение (конъюнкция), логическое сложение (дизъюнкция).

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

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

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

 

3. СТРУКТУРА ПРОГРАММЫ. вернуться к оглавлению

 

Программа составляется из операторов. Оператор - это основной элемент языка, представляющий собой предписание, приводящее к однозначному выполнению определенных действий. Действия ЭВМ могут заключаться в выполнении операций вычисления или передачи управления или же в сообщении информации о свойствах данных и отдельных элементов программы, структуре переменных, размещении массивов или совмещении рабочих полей в памяти. Операторы языка, записанные на бланке программирования (или листе бумаги) по установленным правилам в соответствии с алгоритмом решаемой задачи, в совокупности образуют программу.

В зависимости от характера действий различают операторы исполняемые и неисполняемые. Неисполняемый оператор является указанием транслятору и не переводится транслятором в команды машины. В соответствии с исполняемыми операторами программы транслятор создает в кодах машины рабочую программу, по которой затем производятся заданные действия (например, вычисления).

Операторы могут быть подразделены на пять основных видов: описательные операторы, операторы присваивания, операторы управления, операторы ввода и вывода и подпрограммы.

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

М КС Т

где М - метка, КС - ключевое слово, Т - тело оператора. Исключение составляют арифметический и логический операторы присваивания и оператор определения оператор-функции, запись которых начинается с идентификатора с последующим символом = (знак присваивания), после чего следует выражение. Тело оператора представляет собой список, элементы которого и разделители между ними в каждом конкретном случае зависят от назначения оператора.

Последовательность операторов и комментариев, не содержащая операторов ВLОСК DАТА, FUNCTION, SUBROUTINE, называется основной программой.

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

4. Операторы описания типа вернуться к оглавлению

 

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

4.1 Неявное объявление типа. Определение типа величины (переменной, массива или функции) с помощью первой буквы ее идентификатора является неявным определением типа и называется автоматическим объявлением типа или объявлением типа по предварительному соглашению. Автоматическое объявление типа допустимо только при задании типа целой или действительной величины стандартной длины.

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

IMPLICIT ТИП *S1(А1), ТИП *S2(А2), ...

где ТИП - это любой из основных символов СОМРLЕХ, INTEGER, LOGICAL, REAL *S1, *S2, ... - указатели длины (числа байтов); А1, А2..., - списки, элементами которых являются отдельные буквы или конструкция из двух букв, между которыми стоит символ - (минус); в качестве разделителя между элементами в списке используется символ, (запятая).

Символ СОМРLЕХ используется для описания комплексного типа, INTEGER, - для описания целого типа, LOGICAL - для описания логического типа, REAL - для описания действительного типа.

В качестве указателя длины используются символы *1, *2, *4, *8 или *16.

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

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

4.2. Явное объявление типа. Оператор явного описания типа объявляет тип величин не по первой букве идентификатора, а по всему наименованию. Ключевым словом такого оператора является один из символов:

СОМРLЕХ, INTEGER, LOGICAL, REAL

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

Указатель длины слова, отводимого под определяемые переменные, может быть включен в оператор явного описания типа в виде конструкции *S. В этом случае оператор будет выглядеть так: ТИП *S А1 *S1(К1), А2 *S2(К2), ...

где ТИП - это одно из четырех перечисленных выше ключевых слов; *S - общий указатель длины; А1, А2, ...- идентификаторы величин, *S1, *S2, ... - указатели длины величин А1, А2, ...; К1, К2, ...- списки верхних границ, если описываемая величина является массивом (списки К1, К2, ... могут и отсутствовать, даже если А1, А2, ... - идентификаторы массивов).

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

В операторе явного описания типа одновременно с объявлением типа и длины величины ей может быть присвоено начальное значение. В этом случае оператор явного описания типа имеет вид

ТИП *S А1 *S1(К1)/Х1/, А2 *S2(К2)/Х2/, ...

где сохранен смысл ранее использованных обозначений, а Х1, Х2, ... - списки

значений.

Начальные значения могут быть присвоены только переменным и массивам. Начальное значение переменной задается константой, начальное значение массива - списком констант, разделяемых запятыми. В списке значений разрешено использование коэффициента кратности (повторителя) в виде конструкции J*, где J - целая константа. Повторитель указывает, сколько раз должно быть повторено следующее за символом J* значение.

Количество констант в списке значений должно быть равно длине массива, а сами константы иметь тип, определенный символом ТИП и указателем длины *S (или *S1, *S2, ...).

В одной программе может содержаться несколько операторов описания типа как неявных, так и явных. Оператор явного описания типа имеет приоритет над автоматическим объявлением типа и над оператором неявного определения типа. Это означает, что оператор явного задания типа отменяет тип и длину, установленные по предварительному соглашению или оператором IMPLICIT.

4.3 Оператор задания размеров массивов. Если оператором явного описания типа определяется массив, однако список верхних границ изменения индексов в нем не указывается, т. е. отсутствует указание размеров массива, то соответствующее задание структуры массива должно содержаться либо в операторе СОММОN, либо в операторе задания размеров массивов, записываемого в виде DIMENSION М1(К1), М2(К2), ...

где М1, М2, ... - идентификаторы массивов; К1, К2, ... - списки верхних границ изменения индексов описываемых массивов.

В одной программе оператор DIMENSION может встретиться любое число раз. Использование в программе переменных с индексами без указания размеров массива недопустимо. Размеры массива должны объявляться лишь однажды одним из трех способов: оператором явного описания типа, оператором DIMENSION или оператором СОММОМ.

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

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

 

 

5. ОПЕРАТОРЫ ПРИСВАИВАНИЯ вернуться к оглавлению

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

Операторы присваивания различают двух видов: первого вида - арифметический и логический операторы присваивания, и второго вида - оператор присваивания метки.

5.1. Операторы присваивания первого вида. В общем случае оператор присваивания первого вида записывается следующим образом: V=Е

где V - переменная (простая или элемент массива), Е - выражение, символ = называется знаком присваивания.

При выполнении оператора присваивания вначале вычисляется значение выражения, стоящего справа от знака присваивания, а затем оно присваивается величине, записанной слева от символа =.

Оператор присваивания первого вида называется арифметическим опера

тором присваивания, если Е - арифметическое выражение, и логическим оператором присваивания, если Е - логическое выражение. Левая и правая части логического оператора присваивания относятся к логическому типу, а арифметического - к одному из арифметических типов (целому, действительному или комплексному).

Значения всех переменных в правой части оператора присваивания должны быть определены.

Если тип и длина правой части арифметического оператора присваивания отличаются соответственно от типа и длины его левой части, то значение выражения, стоящего справа, автоматически преобразуется к типу величины в левой части. При этом соответственно может измениться значение переменной, так как преобразования в операторе Ч=Е выполняются по следующим правилам:

- если Ч - целого типа, а Е - действительного типа, то Ч будет присвоена целая часть Е;

- если Ч - целого типа, а Е - комплексного типа, то значением Ч берется целая часть вещественной компоненты Е;

- если Ч - действительного типа, а Е - комплексного типа, то в качестве значения Ч берется вещественная компонента Е;

- если Ч - комплексного типа, а Е - целого или действительного типов, то вещественной компонентой У будет значение Е (преобразованное в действительный тип, если Е было целым), а мнимой компонентой - нуль.

2. Оператор присваивания метки. Оператором присваивания второго вида или оператором присваивания метки называется конструкция

ASSIGN n ТО М

где n - метка оператора, М - простая переменная целого типа. При выполнении этого оператора переменная М принимает значение метки n, Например, после выполнения оператора ASSIGN 27 ТО К

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

Переменная, получившая значение метки, не может быть использована

как переменная, имеющая числовое значение, до тех пор, пока она его не получит, например, в арифметическом операторе присваивания.

 

6. ПРАВИЛА ЗАПИСИ ОПЕРАТОРОВ вернуться к оглавлению

 

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

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

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

Если в какой-либо строке в первой позиции написать символ С, то строка не воспринимается транслятором как оператор. Такая строка является пояснительным текстом и называется комментарием. В тексте комментария, начинающегося непосредственно за буквой С (со второй позиции строки), разрешается использовать все символы, которые имеются на устройствах ввода и вывода конкретной машины.

Позиции 2 - 5 используются под метки операторов, для этой цели разрешается использовать и первую позицию. В начальной строке оператора шестая позиция должна быть либо пустой, либо содержать цифру 0.

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

7. Операторы перехода вернуться к оглавлению

 

Порядок выполнения операторов в программе определяют операторы управления, частным случаем которых являются операторы перехода. Выполнение программы начинается всегда с исполняемого оператора, встретившегося в записи программы первым, а затем последовательно выполняются все остальные операторы, пока некоторый оператор управления, например оператор перехода, не нарушит эту последовательность.

Различают три вида операторов перехода: оператор безусловного перехода, вычисляемый оператор GO ТО, или оператор перехода по вычислению, присваиваемый оператор GO ТО, или оператор перехода по предписанию (по назначению).

  1. Оператор безусловного перехода. Записывается оператор безусловного перехода в следующем виде: GO ТО N , где N — метка исполняемого оператора.

Этот оператор обеспечивает передачу управления на оператор с меткой N. Например, наличие в программе оператора 60 ТО 347 означает, что следующим должен выполняться оператор, имеющий метку 347. После этого оператора выполняется оператор, стоящий за ним (а не за оператором перехода), и так последовательно до тех пор, пока не встретится другой оператор управления.

2. Вычисляемый оператор перехода. Этот оператор записывается в следующей форме:

GO ТО (N), М

где N — список меток, содержащий любое количество меток исполняемых операторов, а М является простой целой переменной. Метки операторов в списке меток разделяются запятыми. Вычисляемый оператор GО ТО производит передачу управления оператору с меткой, имеющей в списке меток порядковый номер, равный текущему значению М.

Значение М определяется оператором присваивания или ввода до выполнения оператора GО ТО (т. е. вычисляется, отсюда и название — вычисляемый оператор). Например, если в программе содержится оператор

GO ТО (7, 9, 1020, 346), Е

то управление будет передано оператору с меткой 7, если Е = 1, оператору с меткой 9, если Е = 2, и т. д.

В списке меток номера операторов могут повторяться. Если к моменту выполнения вычисляемого оператора перехода переменная M принимает значение, превосходящее количество элементов в списке меток, то данный оператор передает управление непосредственно стоящему за ним оператору.

3. Присваиваемый оператор перехода. Присваиваемый оператор GO ТО имеет вид

GO ТО М, (N)

где N — список меток, состоящий из произвольного количества элементов, а М — целая переменная без индексов. Метки операторов в списке меток могут повторяться.

К моменту выполнения оператора GO ТО значение М должно быть определено предшествующим оператором ASSIGN как значение одной из меток операторов, включенных в список меток.

Вычисляемый оператор перехода удобно использовать в том случае, когда из нескольких формул необходимо выбрать одну определенную формулу для расчета. Оператор перехода по предписанию используется главным образом в случае необходимости организации обращения к одному и тому же фрагменту из разных мест программы. В этом случае фрагмент записывают только один раз, а передачи управления на него организуют с помощью безусловных операторов перехода. Места возврата устанавливаются заранее с помощью операторов присваивания метки. Повторяющийся фрагмент должен оканчиваться присваиваемым оператором GO ТО.

Практически вычисляемый и присваиваемый варианты оператора GO ТО взаимозаменяемы. Расположение меток в присваиваемом операторе GO ТО не имеет значения, в то время как в вычисляемом операторе перехода оно является решающим.

8. Условные операторы управления вернуться к оглавлению

 

Условными принято называть операторы управления, ключевым словом которых является символ IF. Различают два вида условных операторов: арифметический условный оператор (арифметический оператор IF) и логический условный оператор (логический оператор IF).

1. Арифметический условный оператор. Арифметический оператор IF используется для изменения последовательности выполнения операторов в программе после проверки заданного условия, содержащегося в записи оператора. Оператор имеет вид

IF (Е) N1, N2, NЗ

где Е — арифметическое выражение целого или действительного типа; N1, N2, NЗ — метки операторов.

Действие этого оператора заключается в вычислении значения арифметического выражения Е и последующей передаче управления на один из операторов, помеченных метками N1, N2, NЗ. Если вычисленное значение выражения Е < 0, то осуществляется переход к оператору, помеченному меткой N1; если Е = 0, то управление будет передано оператору с меткой N2; если же Е > 0, то осуществится переход к оператору, имеющему метку NЗ.

В языке фортран-63 в арифметическом операторе IF допускаются выражения комплексного типа. В этом случае переход осуществляется аналогично в зависимости от значения вещественной части выражения Е.

Метки в арифметическом условном операторе могут совпадать. Если оператор IF имеет метку, то она не должна совпадать с N1, N2 или NЗ.

С помощью оператора IF возможно неоднократное повторение одного оператора или целой группы операторов. Например, фрагмент программы для вычисления факториала числа N, можно оформить, используя арифметический оператор IF:

NF=1

К=1

1 NF=NF*К

К= К+1

IF(N — К) 2, 1, 1

2 (продолжение программы)

Здесь результат обозначен идентификатором NF. Группа из трех операторов, первый из которых имеет метку 1, повторяется N раз.

  1. Логический условный оператор. Логический оператор IF имеет вид

IF (L) S

где L — логическое выражение, S — любой исполняемый оператор, отличный от оператора цикла и логического условного оператора.

Выполнение логического условного оператора заключается в вычислении значения выражения L и в передаче управления либо оператору S, если значение выражения L есть .ТRUE. либо оператору, непосредственно следующему за данным оператором, если значение выражения L есть .FALSE.

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

9. Оператор цикла вернуться к оглавлению

 

При программировании циклических вычислительных алгоритмов могут быть использованы условные операторы. Для этих же целей служит специальный оператор цикла (или оператор DO), являющийся наиболее сложным и мощным из числа операторов управления. Он записывается в виде DO М I=N1, N2, N

где М — метка, I — простая переменная целого типа — параметр или управляющая переменная цикла, N1 — нижняя граница параметра цикла, N2 — верхняя граница, N — величина шага, с которым параметр I пробегает значения от нижней границы до верхней. N1, N2, N — целые константы или целые переменные без индексов (возможно со знаками).

Конструкция I=N1, N2, N называется заголовком цикла. В заголовке цикла величину N можно не указывать, в этом случае автоматически величина шага принимается равной 1.

Операторы, следующие за оператором DO, включая тот, который помечен указанной меткой М, образуют область цикла или область действия оператора DO. Последний оператор области цикла называется концевым оператором цикла или концом цикла. Соответственно начало цикла — это первый оператор после DO.

Оператор цикла вызывает многократное исполнение операторов, составляющих область цикла. При этом первоначально параметр цикла принимает заданное начальное значение N1 и выполняются операторы области цикла. Затем к значению параметра цикла прибавляется шаг N, и если новое значение параметра цикла не превосходит верхнюю границу М2, то снова выполняются операторы области цикла, и т. д. При. значении I, равном N2, оператор цикла выполняется. Если же N2 не кратно N, то последнее исполнение цикла производится при ближайшем, но не превосходящем N2 значении параметра.

Если N > 0, то должно быть N1 < N2, если же N < 0, то, естественно, N1 > N2.

Внутри цикла не допускается также изменение значений N1, N2, N.

После последнего исполнения цикла управление передается оператору, следующему за оператором с меткой М. Выход из цикла в этом случае называется нормальным, а значение параметра I не определено.

Выход из цикла при значении параметра, не достигшем верхней границы, называется специальным. Специальный выход из цикла обеспечивается операторами GO ТО или IF, передающими управление на оператор, не принадлежащий данному циклу. Текущее значение параметра цикла здесь сохраняется и может быть использовано в последующих операторах.

Первый оператор в области цикла должен быть исполняемым. Последним оператором цикла не может быть оператор GO ТО, арифметический оператор IF, другой оператор DO, операторы SТОР и RETURN.

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

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

Разрешается использование циклов в цикле. В этом случае область внутреннего DO не должна выходить за область внешнего DO. Допустим общий конец обоих операторов. Комбинацию двух циклов, удовлетворяющую правилу вхождения циклов, называют вложенными циклами. Понятие вложенных циклов обобщается на случай трех и более циклов; при этом количество вложений в общем случае не ограничивается.

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

Запрещено передавать управление (операторами GO ТО или IF) извне в область действия оператора цикла. Можно передавать управление извне только на оператор DO.

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

10. Оператор-функция вернуться к оглавлению

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

Общий вид оператор-функции: F(А) =Е

где F — наименование оператор-функции, Е — выражение, арифметическое или логическое, не содержащее переменных с индексами, А — список формальных параметров; элементы списка разделяются запятыми.

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

Все оператор-функции должны быть помещены перед первым исполняемым оператором программной единицы.

Тип оператор-функции может быть задан особо описательными операторами или оператором IMPLICIT, а также согласно правилу первой буквы.

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

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

Правая часть оператор-функции (выражение Е) может содержать не только формальные параметры, но и другие переменные, а также обращения к стандартным функциям, ранее определенным оператор-функциям и подпрограммам типа FUNCTION. В выражение Е не должно входить обращение к этой же самой оператор-функции. Так, определение оператор-функции в виде Q(Z) =Z+Q(Х) является недопустимым. Однако обращение S=R(А, В)+ R(R(С, D), F) является правильной конструкцией. Здесь сначала вычисляется значение выражения R(С, D), затем вновь происходит обращение к этой же оператор-функции с новыми фактическими параметрами, второй из которых есть F. Полученное значение является вторым слагаемым при получении значения переменной S. Первое слагаемое вычисляется однократным обращением к оператор-функции R.

Наименования формальных параметров оператор-функции не должны появляться в операторах СОММОN, DАТА, DIMENSION, EQUIVALENCE и ЕХТЕRNAL.

11. Подпрограммы-функции

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

Подпрограмма-функция, или подпрограмма типа FUNCTION, отличается от оператор-функции двумя особенностями:

Таким образом, подпрограмма-функция — это самостоятельная программная единица. Она выполняется после обращения к ней из другой программной единицы.

При определении подпрограммы типа FUNCTION используются формальные параметры; информация, необходимая при выполнении подпрограммы-функции, поставляется фактическими параметрами. Возможность автономной трансляции (т.е. отдельно от других программных единиц) предоставляет значительные удобства при отладке программ.

Описание подпрограммы-функции составляется следующим образом:

ТИП FUNCTION F *S(A)

(любое количество операторов)

RETURN

END

Первый из написанных здесь операторов называется оператором начальной строки подпрограммы-функции, где F — идентификатор, являющийся наименованием подпрограммы-функции, ТИП — указатель типа, А — список формальных параметров, *S — указатель длины подпрограммы-функции.

На месте указателя типа могут использоваться символы СОMPLEX, INTEGER, LOGICAL, REAL или же он может быть опущен. Если в качестве указателя типа использован один из перечисленных символов, то он определяет тип подпрограммы-функции. Определение типа подпрограммы-функции может быть выполнено и без указателя типа в операторе начальной строки, а по первой букве идентификатора или использованием соответствующего оператора описания типа внутри подпрограммы-функции. Указатель длины в операторе начальной строки также может быть опущен.

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

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

Если формальным параметром является идентификатор массива, то он должен быть описан внутри подпрограммы-функции.

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

После оператора начальной строки, операторов описания типа и операторов задания размеров массивов (если таковые имеются) следуют другие неисполняемые и исполняемые операторы. В неисполняемых операторах не должно упоминаться наименование F подпрограммы-функции, которое входит в оператор начальной строки. Это наименование должно встретиться хотя бы один раз как левая часть оператора присваивания или как элемент списка оператора ввода, либо как фактический параметр в операторе вызова подпрограммы, и по крайней мере один из этих операторов должен выполняться.

Внутри подпрограммы-функции не могут находиться операторы, определяющие другие подпрограммы-функции или подпрограммы, а также операторы ВLОСК DАТА и останова. Операторы определения оператор-функций, если они имеются, должны располагаться до первого исполняемого оператора. Ни один из элементов списка формальных параметров не должен входить в операторы СОММОN, DАТА, EQUIVALENCE или ЕХТЕRNAL внутри данной подпрограммы-функции.

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

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

Операторов RETURN в подпрограмме-функции может быть несколько.

В подпрограмме-функции должен содержаться только один оператор END, который указывает конец подпрограммы-функции и всегда является последним оператором в определении подпрограммы типа FUNCTION.

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

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

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

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

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

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

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

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

П р и м е р . Пусть два первых оператора некоторой подпрограммы-функции записаны в виде

FUNCTION Р (А)

DIMENSION А(5)

а обращение к ней выполняется оператором К=Р(В(3)) из программной единицы, в которой описан фактический массив DIMENSION В(7). Тогда в процессе обращения к подпрограмме функции Р устанавливается соответствие между элементом массива А(1) и элементом В(3), А(2) и В(4), ..., А(5) и В(7);

Если формальным параметром подпрограммы-функции является идентификатор подпрограммы-функции или подпрограммы, а в качестве соответствующего фактического параметра выступает идентификатор внешней стандартной функции, подпрограммы-функции или подпрограммы, то замена формального параметра производится по наименованию, а идентификатор такого фактического параметра должен быть указан в списке идентификаторов оператора внешних подпрограмм в вызывающей программной единице. Этот оператор относится к неисполняемым операторам и имеет вид EXTERNAL LI где LI — список идентификаторов (наименований стандартных функций подпрограмм-функций и подпрограмм); элементы списка разделяются запятыми.

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

Отметим, что наименование оператор-функции не должно появляться в списке идентификаторов оператора EXTERNAL. В то же время, если фактическим параметром оператор-функции является наименование другой функции или подпрограммы, то это наименование должно быть упомянуто в операторе внешних подпрограмм в той программной единице, в которой содержится данная оператор-функция.

П р и м е р . Подпрограмма-функция имеет вид

FUNCTION Н(А, Р)

Н=Р(А)

RETURN

ЕND

В программной единице, из которой осуществляется обращение к подпрограмме-функции Н, например такое: В=D+Н(АF, РF) должен содержаться оператор ЕХТЕRNAL РF, где РF — фактический параметр, являющийся наименованием некоторой определенной подпрограммы-функции. Формальный параметр А при указанном обращении заменяется на фактический АF, а значение Н вычисляется как РF(АF).

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

12. Подпрограммы

Подпрограмма (называемая также подпрограммой типа SUBROTINE или подпрограммой-процедурой) является самостоятельной автономной программной единицей и имеет большое сходство с подпрограммой-функцией. Однако подпрограмма обладает рядом особых свойств, расширяющих возможности ее использования при программировании. Наиболее важное различие между подпрограммой и подпрограммой-функцией состоит в том, что с идентификатором подпрограммы не связывается никакое значение, и обращение к подпрограмме осуществляется специальным оператором обращения, называемым оператором вызова подпрограммы.

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

SUBROTINE S(A)

<любое количество операторов)

RETURN

END

Первый оператор в описании подпрограммы называется оператором начальной строки или оператором-заголовком подпрограммы. В нем S — наименование (идентификатор) подпрограммы, А — список формальных параметров.

Список формальных параметров состоит из элементов, разделяемых запятыми. В качестве формального параметра может стоять простая переменная, идентификатор массива, подпрограммы-функции или подпрограммы, символ * (звездочка). Формальный параметр, являющийся простой переменной, может быть заключен с обеих сторон в символы / (наклонная черта). Список формальных параметров (вместе с окаймляющими его скобками) у подпрограммы

может отсутствовать.

Тип и длина формальных параметров задаются либо неявно, либо устанавливаются операторами описания типа, следующими за оператором-заголовком подпрограммы. Если формальным параметром является массив, то в подпрограмме должен содержаться описательный оператор, в котором задаются размеры массива. Формальные параметры не могут получать начальные значения, а также содержаться в операторах COMMON, EQUIVALENCE или EXTERNAL.

Среди исполняемых и неисполняемых операторов подпрограммы (между оператором начальной строки и единственным, но обязательным оператором окончания END) не должны находиться операторы ВLОСК DАТА, FUNCTION, SUBROUTINE, STOP и PAUSE.

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

Наименование подпрограммы не может появиться внутри подпрограммы в операторе присваивания, в операторах ввода или вывода или же в качестве фактического параметра в операторе вызова подпрограммы. Значения, получаемые в результате работы подпрограммы, присваиваются идентификаторам формальных параметров.

Оператор RETURN обеспечивает возврат из подпрограммы в программную единицу, из которой было произведено обращение к данной подпрограмме. Допускается использование оператора возврата с параметром в виде RETURN I где I — простая переменная целого типа стандартной длины или целая константа без знака. Укажем, что использование оператора RETURN в основной программе равносильно оператору SТОР.

Обращение к подпрограмме выполняется из другой программной единицы оператором вызова подпрограммы. Этот оператор имеет вид САLL S (AF) где S — идентификатор подпрограммы, АF — список фактических параметров.

В случае подпрограммы без параметров оператор вызова подпрограммы также не содержит параметров.

Оператор САLL передает управление подпрограмме, и подпрограмма будет выполняться до тех пор, пока в ней не встретится оператор RETURN. Если оператор САLL является последним оператором в цикле DO, то после возврата продолжится выполнение цикла.

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

Оператор вызова подпрограммы для подпрограмм с параметрами обеспечивает замену формальных параметров подпрограммы фактическими параметрами. Обязательно должно выполняться количественное соответствие между формальными и фактическими параметрами, а также соответствие по порядку следования их в списках А и АF. Формальные и фактические параметры, имеющие тип, т. е. параметры, отличные от наименований подпрограмм и символа * должны быть согласованы по типу и длине.

В качестве фактического параметра в операторе вызова подпрограммы могут быть использованы: переменная, элемент массива, массив, выражение (в частности, константа, переменная или указатель функции), стандартная функция или подпрограмма-функция, подпрограмма, конструкция вида &N (N — метка оператора).

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

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

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

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

13. Оператор входа

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

Оператор входа записывается в виде

ENTRY FS(А)

где FS — наименование входа (идентификатор), А — список формальных параметров.

Все операторы входа, а их в одной подпрограмме-функции или подпрограмме может быть несколько, располагаются среди операторов данной программной единицы в любом месте, кроме области действия оператора цикла. Перед оператором ENTRY не должна стоять метка. Оператор входа может находиться и в основной программе.

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

Если обращение к подпрограмме осуществляется по идентификатору, записанному в операторе ENTRY, то управление передается первому исполняемому оператору, следующему за этим оператором. При последовательном выполнении операторов, среди которых имеется оператор входа, последний, как неисполняемый оператор, пропускается.

П р и м е р . Пусть подпрограмма-функция имеет вид

INTEGER FUNCTION F(K,L)

2 F=K-L

RETURN

ENTRY F1(K,L)

5 IF ( L .LT. K ) GO TO 2

3 F=K+L

RETURN

END

I=J+F(5*M, N — 2*M)

то после выполнения оператора с меткой 2 происходит возврат в вызывающую программу.

I=J+F1(5*М, N — 2*М)

то вычисление значения функции выполнится по оператору либо с меткой 3, либо с меткой 2 в зависимости от условия в операторе с меткой 5. Второй вариант входа из основной программы в подпрограмму-функцию обеспечивается включением в ее описание оператора ENTRY.

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

П р и м е р : Если имеется подпрограмма

SUBROUTINE РR(Х, Y, Р)

IF (Y) 5,3,3

3 Х= - Х

5 Y=Х+Y

ENTRY РТ(Y, Р)

Р =2.*Y**2

RETURN

END

а в основной программе содержатся операторы

Х=8.0

7=3.

CALL PR(Х, Y, Z)

САLL РТ(4., Р)

то результатом выполнения первого оператора САLL будет значение Z=50.0, а результатом второго - значение Р = 32.0.

14. Оператор описания общих блоков

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

Общим блоком называется группа величин, обозначенная идентификаторами простых переменных или идентификаторами массивов (с указанием верхних границ изменения индексов или без этого) и размещаемая на участке оперативной памяти, к которой возможно обращение из нескольких программных единиц. Входящие в общий блок величины, называемые обычно элементами общего блока, разделяются запятыми. Общий блок может быть помечен идентификатором, который окаймляется символом / с обеих сторон. Например, общий блок, содержащий в качестве элементов переменные Х, Y, Z и помеченный идентификатором В, обозначается как /В/Х, Y, Z.

Для определения общих блоков служит оператор описания общих блоков, записываемый в виде СОММОN Р где в списке Р общих блоков должен стоять хотя бы один общий блок.

При описании общего блока идентификатор может отсутствовать. В этом случае соответствующий общий блок является непомеченным. Непомеченный общий блок определяется либо опусканием идентификатора блока и связанных с ним символов / (если он встречается в начале оператора СОММОN), либо наличием двух последовательных символов / перед группой идентификаторов непомеченного блока.

Примеры использования оператора описания общих блоков;

СОММОN A, В, С, D

СОММОN //А, В, С, D

СОММОN /Х/ Р, Q /Y/ R, S //Т, W, V

В первых двух примерах указан один и тот же непомеченный общий блок, в третьем примере первый блок помечен идентификатором Х, второй — идентификатором У, а третий не помечен. Отметим, что в списке общих блоков не используется в качестве разделителя символ, (запятая).

Если в общем блоке содержится идентификатор массива без индексов, то значения индексов должны определяться оператором DIMENSION или оператором описания типа в той же программной единице. Если в операторе СОММОN указан идентификатор массива cо списком верхних границ, то отпадает необходимость дополнительного описания этого массива. Так, в последнем примере идентификаторы Р, Q, R, S, Т, W, V могут относится как к простым переменным, так и к массивам, а в общих блоках, определяемым оператором

СОММОN /В1/ А(100), В(100) /В2/ С(10), D(8, 10)

A, В, С и D являются идентификаторами массивов.

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

СОММОN Х, Y /А/ U, V, W //Z, С(5) /А/ А(6)

СОММОN Х, Y, Z С(5) /А/ U, V, W, А(6)

определяет совпадающие общие блоки: непомеченный длиной 8 элементов и помеченный идентификатором А — 9 элементов.

Оператор СОММОN неисполняемый, и он должен находиться среди неисполняемых операторов, предшествующих первому исполняемому оператору в программной единице. В программной единице может содержаться любое количество операторов описания общих областей, однако элемент из одного общего блока не должен появляться в другом общем блоке.

Оператор общих блоков обеспечивает доступ к одной и той же области памяти, соответствующей данному общему блоку, из всех программных единиц, содержащих оператор СОММОN. Каждая общая область памяти выделяется именем общего блока независимо от того, какими идентификаторами обозначены элементы этого общего блока в различных программных единицах.

П р и м е р 1

Если некоторая переменная Х обозначает один и тот же объект в подпрограмме и в основной программе, то в обеих программных единицах следует написать оператор СОММОN Х

П р и м е р 2.

Пусть в основной программе содержатся переменные А, В,. С, а в подпрограмме соответствующие объекты обозначены Х, Y, Z. В этом случае в основной программе следует написать оператор СОММОN /S/ А, В, С а в подпрограмме — оператор СОММОМ /S/ Х, Y, Z

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

П р и м е р 3.

Основная программа содержит оператор СОММОN А (3), В, С а в подпрограмме используются величины А(3) и В. В этом случае в подпрограмме можно написать оператор СОММОN А (3), В и длины непомеченных общих блоков в основной программе и подпрограмме будут различны. Если же общий блок в основной программе является помеченным, например имеет вид СОММОN /Т/ А(3), В, С или, хотя и является непомеченным, но в подпрограмме используется величина Z, соответствующая величине С в основной программе, а величина не используется, то длины общих блоков должны совпадать, В этих случаях в подпрограмме должен содержаться один из следующих операторов: СОММОN /Т/ А(3), В, Z или СОММОN А(3), В, Z В первом из них элемент Z в подпрограмме не используется, он вводится, чтобы не нарушить длину общего блока /Т/. Во втором операторе элемент В введен для того, чтобы не было нарушено соответствие величин С и Z в непомеченном общем блоке.

Оператор СОММОN не допускает описания формальных параметров, для которых соответствие фактическим параметрам устанавливается обращением к подпрограммам-функциям или с помощью оператора САLL. Следовательно, все используемые в подпрограмме переменные должны быть упомянуты либо в списке ее формальных параметров, либо в списке общих блоков, т.е. в операторе СОММОN (за исключением переменных, появляющихся в левой части оператора присваивания в подпрограмме). В ряде случаев, в частности когда подпрограмма вызывается лишь из одной программной единицы, например основной программы, можно переменную перевести из списка формальных параметров в список общих блоков для основной программы и подпрограммы с помощью оператора СОММОN.

Общие блоки используются не только для передачи информации из одной программной единицы в другую, но и для целей экономии памяти машины, когда вводится общий блок для того, чтобы одну и ту же область памяти сделать доступной нескольким программным единицам, хотя и нет необходимости в обмене информацией между этими программными единицами. Поэтому сопоставляемые переменные в операторах СОММОN, принадлежащих различным программным единицам, могут иметь любой тип (целый, действительный, комплексный, логический) и любую длину (стандартную, нестандартную), лишь бы только совпадали длины в байтах для всех одноименных (помеченных) общих блоков.

 

15. Оператор присваивания начальных значений

Перед выполнением программы простым переменным и элементам массива могут быть присвоены начальные значения неисполняемым оператором DАТА А /R/, В /S/, ... который называется оператором присваивания начальных значений.

Здесь А, В, ...— списки, содержащие простые переменные, переменные с индексами (индексы должны быть целыми константами) или наименования массивов; R, S, ...— списки констант (числовых, логических, текстовых или шестнадцатеричных).

Любой константе может предшествовать конструкция вида J*, называемая коэффициентом кратности (повторителем), где J — целая константа, отличная от нуля. Повторитель j* указывает число переменных из предыдущего списка, которым должно быть присвоено данное значение, т. е. сколько раз должна быть повторена данная константа.

Элементы списка разделяются запятыми. Количество элементов в одном списке переменных должно совпадать с числом элементов в соответствующем списке констант. Тип значения должен совпадать с типом элемента, которому присваивается значение. Значения, задаваемые текстовыми и шестнадцатеричными константами, можно присвоить элементам любого типа.

П р и м е р 1.

Оператор

DАТА К1 /1/, К2, Т(1, 2) /2, 3..0/, Х, Y /2*1.5/, F /.ТRUE./, С, D /'ТЕХТ', 4НТЕSТ/,

*LВ /2, 3, 2* 1, 2* 4, 6, 5/

присваивает переменным К1 и К2 значения 1 и 2 соответственно, элементу массива Т(1, 2) — значение 3.0, обеим переменным Х и У — значение 1,.5, логической переменной F — значение .ТRUЕ. а переменным С и D — значения текстовых констант ТЕХТ и ТЕSТ соответственно. Элементы массива LВ получают соответственно значения 2, 3, 1, 1, 4, 4, 6, 5. Так как здесь оператор DАТА занимает две строки, вторая строка начинается с символа продолжения, в качестве которого выбран символ *.

Все описательные операторы, определяющие переменные, используемые в операторе DАТА, должны предшествовать оператору присваивания начальных значений. Так, в предыдущем примере должен быть описан массив LВ(8).

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

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

16. Подпрограмма данных

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

ВLОСК DАТА

· · · · · · · · · · · · · · · ·

END

где между операторами ВLОСК DАТА и END могут стоять операторы описания типа, операторы DIMENSION, СОММОN, EQUIVALENCE, IMPLICIT и оператор присваивания начальных значений. Никакие операторы, кроме перечисленных, не должны содержаться в подпрограмме ВLОСК DАТА. Подпрограмма данных должна содержать хотя бы один оператор СОММОN. С помощью одной подпрограммы данных можно присвоить начальные значения нескольким помеченным блокам.

Начальные значения можно присваивать не всем элементам общего блока, а только некоторым. Однако в подпрограмме данных в соответствующем операторе СОММОN должны быть перечислены все элементы общего блока — как те, которым присваиваются начальные значения внутри подпрограммы данных (операторами описания типа или оператором DАТА), так и те элементы, которые не получают начальных значений.

П р и м е р.

ВLОСК DАТА

СОММОN /Р/ А, М, В, D, С

DIMENSION М(2, 2)

REAL М, D, В

INTEGER А, С /1/

DАТА М(1, 2), D /2.3, 4.12/, А /0/

END

С помощью этой подпрограммы начальные значения получают только переменные А, С, D, М(1,2), являющиеся элементами общего блока /Р/.

Подпрограмма ВLОСК DАТА автономно не транслируется, а подключается к той программной единице, в которой указаны содержащиеся в подпрограмме данных общие блоки. Если такой программной единицей является подпрограмма, то переменные из общего блока определены с момента обращения к подпрограмме до выхода из нее по оператору RETURN.

Таким образом, задание начальных значений переменным может быть осуществлено тремя способами: операторами явного описания типа, оператором DАТА и подпрограммой ВLОСК DАТА. Второй способ от первого отличается лишь тем, что в операторе DАТА не определяется тип, а третий способ пригоден только для помеченных блоков СОММОN. Задание начальных значений элементам непомеченного общего блока не предусмотрено.

17. Оператор эквивалентности

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

EQUIVALENCE Q

где Q — список групп эквивалентности. Каждая группа эквивалентности представляет заключенный в скобки список, элементы которого являются простыми переменными или переменными с индексами, размещаемыми в одной и той же области памяти. Элементы в обоих списках разделяются запятыми, количество их в группе эквивалентности должно быть не меньше двух.

П р и м е р 1.

Оператор EQIVALENCE (К, L, М), (А, В) указывает, что значения К, L, М помещаются в одной и той же области памяти, а переменных А и В — в другой, т. е. тождественными объявляются переменные К, L и М, и А и В.

Если в группе эквивалентности стоит переменная с индексами, то ее список индексов может содержать только константы. Одновременно с объявлением эквивалентными элементов массивов, указанных в группе эквивалентности, эквивалентность распространяется на все предшествующие и последующие элементы массивов.

Например, оператор EQUIVALENCE (Х(10), Y(2), Z(3)) устанавливает эквивалентность между следующими тройками переменных с индексами

Х(9) Y(1) Z(2)

Х(10) Y(2) Z(3)

Х(11) Y(3) Z(4)

образующими в памяти некоторую область эквивалентности,

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

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

Если переменная, занимающая два слова (по 4 байта каждое), эквивалентна переменной, занимающей одно слово, то последняя будет совмещена с первым словом первой переменной.

Оператор EQUIVALENCE является неисполняемым и должен находиться среди неисполняемых операторов, предшествующих первому исполняемому оператору в программе или подпрограмме.

Не допускается установление эквивалентности между элементами общих блоков (прямо или косвенно) . Если две переменные или два элемента массива совмещены по памяти вследствие действия оператора EQUIVALENCE, идентификаторы этих переменных или массивов не могут оба одновременно появляться в операторах СОММОN в той же самой программной единице.

Одна и та же переменная может встретиться и в операторе СОММОN и в операторе EQUIVALENCE. В этом случае сначала будет этой переменной отведено место в общем блоке, а уже потом установлено соответствие по оператору эквивалентности. Например, операторы DIMENSION D(3)

СОММОN А, В, С

EQUIVALENCE (В, D (1) )

расположат переменные в памяти следующим образом А В С

D(1) D(2) D(3)

тем самым расширяя общий блок размещением новых элементов после последнего элемента блока.

Не разрешается задавать оператор эквивалентности; который потребовал бы выход за начало общего блока, т. е. запрещено расширять общий блок путем размещения новых элементов до первого элемента блока. Так, в приведенном примере на месте D(1) нельзя писать D(3), поскольку это приведет к следующему расположению переменных:

А В С

D(1) D(2) D(3)

18. Операторы ввода и вывода

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

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

18.1 Оператор описания файлов. Оператор описания файлов используется для описания файлов прямого доступа и имеет вид DEFINE FILE N(М, Н, F, К) где наборов символов N(М, Н, F, К) в списке оператора может быть произвольное число (в этом случае один набор от другого отделяется запятой), Каждый набор N(М, Н, F, К) определяет свой файл. Здесь N — номер файла, М — целое число без знака, определяющее максимальное число записей этого файла (записей может быть на самом деле меньше М, но не больше), Н — целое число без знака, определяющее максимальный размер каждой записи. Числовое значение Н указывается либо в байтах, либо в машинных словах; при этом выдерживается соотношение. одно слово равно четырем байтам. Что принимается за единицу измерения, указывается параметром F, на месте которого может стоять один из трех символов: Е, L или U.

Если F есть Е, то размеры записей файлов указываются в байтах, и обращение к файлу такого типа осуществляется операторами ввода или вывода только с форматами; в этом случае говорят, что все записи являются форматными. Если F есть U, то размеры Н записей файлов измеряются количеством слов, и обращение к файлам выполняется операторами ввода и вывода только без форматов; записи являются бесформатными. И, наконец, если F есть L, значение Н указывается в байтах, а обращение к файлу такого типа осуществляется операторами ввода и вывода как с форматами, так и без форматов (имеет место смесь форматных и бесформатных записей). Символ К — простая переменная целого типа. Эта переменная автоматически принимает значение, равное номеру записи, которая непосредственно следует за последней из обработанных (т. е. введенных или выведенных) записей. После выполнения оператора поиска элемента файла переменная принимает значение, равное номеру найденной записи. Переменная К — номер записи — не может использоваться в программе в каком-либо другом смысле.

В одной программе может содержаться несколько операторов описания файлов, и все они должны находиться среди неисполняемых операторов до первого исполняемого оператора программы. Например, оператор DEFINE FILE 9(128, 8, U, J), 14(66, 50, Е, I), 5(30, 48, L, N) определяет три файла с номерами 9, 14 и 5: первый — это 128 бесформатных записей, каждая запись содержит 8 слов, переменная J будет принимать значения 2, 3, ..., 129 после обработки записей соответственно с номерами 1, 2, ..., 128; второй содержит 66 форматных записей, каждая из которых состоит не более чем из 50 байт, переменная I будет принимать после обработки первой записи значение 2, после обработки второй записи — значение 3 и т. д. до значения 67; файл, имеющий номер 5, состоит из 30 записей, каждая длиной не более 48 байт, переменная N будет принимать значения 2, 3, ..., 31 после обработки соответствующих записей с номерами 1, 2, ..., 30. Символ U в описании первого файла указывает, что для передачи информации должны использоваться операторы ввода или вывода только без форматов. Символ Е в описании файла с номером 14 указывает, что для обработки записей этого файла должны использоваться только операторы ввода или вывода с форматами. Записи файла с номером 5 могут передаваться операторами ввода или вывода с форматами и без форматов, на что указывает символ L в описании.

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

значений этих величин. Список ввода-вывода имеет вид А1, А2, ..., АN где элементами списка могут быть простые переменные и переменные с индексами, наименования массивов и неявные циклы.

Под неявным циклом понимается конструкция вида (В1, В2, ..., ВК, I=N1, N2, NЗ) где элементы В1, В2, ..., ВК — либо переменные (простые или с индексами), либо в свою очередь неявные циклы, I=N1, N2, NЗ — заголовок цикла, в котором: I — целая переменная, используемая в индексных выражениях переменных В1, В2, ...; N1, N2, NЗ — целые константы или простые переменные целого типа; если NЗ имеет значение, равное +1, то элемент NЗ в записи зауоловка цикла может быть опущен. Например, неявный цикл может иметь вид

(((R(I, J, К), I=L1, L2, L3), J=М1, М2, МЗ), К=N1, N2, NЗ)

Эта конструкция осуществляет перечисление элементов массива R в соответствии с порядком выполнения вложенных циклов:

DO N К=N1, N2, NЗ

DO N J=М1, М2, МЗ

DO N I=L1, L2, LЗ где N — метка конца цикла.

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

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

Оператор ввода последовательного доступа без формата имеет вид READ(N1) L где N1 — номер файла, L — список ввода. Этот оператор осуществляет ввод текущей записи файла с номером N1 в оперативную память, определенную списком L.

Если в рассматриваемом операторе отсутствует список ввода, т.е. оператор записан в форме READ (N1) то действие оператора заключается в переходе от текущей записи файла к следующей его записи. Эта разновидность оператора ввода последовательного доступа без формата употребляется в том случае, когда считываемая информация не используется, но есть необходимость перехода к новой записи (например, можно перемотать участок магнитной ленты, не снимая с него информацию).

Оператор ввода прямого доступа без формата имеет вид READ(N1’R) L где N1 — номер файла, R — номер записи этого файла, L — список ввода. Под R понимается выражение, задающее относительный номер или местоположение требуемой записи (разумеется, в пределах максимального числа записей М, определенного оператором DEFINE FILE).

18.4 Операторы вывода без формата. Промежуточный вывод данных на ленты и диски в тех случаях, когда выведенные данные через некоторое время вновь будут при выполнении программы использованы в оперативной памяти, целесообразно организовать без преобразования формы представления. Для этих целей используются два оператора: оператор вывода последовательного доступа без формата и оператор вывода прямого доступа без формата.

Первый из них имеет вид WRITE (N1) L где N1 — номер файла, L — список вывода. Этот оператор осуществляет выборку данных из оперативной памяти, определенных списком L, и, не изменяя формы представления, образует текущую запись файла, который имеет номер N1.

Оператор вывода прямого доступа без формата имеет вид WRITE(N1’R) L где N1 — номер файла, R — номер записи этого файла, L — список вывода. Этот оператор выводит данные, определенные списком L, из оперативной памяти и образует запись номер R файла с номером N1.

18.5. Операторы ввода с форматом. Выполнение операторов ввода и вывода с форматом управляется оператором задания формата, указывающего вид и структуру передаваемых величин.

Оператор ввода последовательного доступа с форматом обычно имеет вид READ (N1, N2) L где N1 — номер файла, N2 — метка оператора FОRМАТ, L — список ввода.

С помощью этого оператора последовательно вводятся записи файла с номером N1 в те места оперативной памяти, которые определяются элементами списка L. При этом информация преобразуется в соответствии со списком спецификаций оператора FОRМАТ с меткой N2. Оператор задания формата с меткой N2 указывает также количество вводимых записей и их структуру.

В элементе списка, заданном неявным циклом, на месте параметров циклов (нижней границы, верхней границы и шага) могут стоять целые переменные, значения которых задаются самим оператором READ.

Оператор READ (N1, N2) (Х(I), I=К, 200, 4) сначала вводит значение К, затем элемент массива Х(К), далее элемент Х(К+4) и т. д.

Оператор READ (N1, N2) (Х(I), Y(I), I=1, 6) вводит элементы двух массивов Х и У в такой последовательности. Х(1), Y(1), Х(2), У(2), Х(3), ...

Если же структура файла с номером N1 такова, что в нем расположены сначала элементы одного массива, затем другого, то соответствующий оператор имеет вид

READ (N1, N2) (Х(I), I=1, 6), У(I), I=1, 6)

Оператор ввода с форматом может быть записан в виде READ (N1, N2, ЕND=N3, ЕRR=N4) L где NЗ, N4 — метки операторов; параметры ЕND=NЗ и ЕRR= N4 могут задаваться в любом порядке и любой из них (либо оба) может быть опущен; NЗ — метка оператора, на который передается управление после окончания ввода, если нет совпадения по количеству переменных в списке L и констант на вводе; N4 — метка оператора, получающего управление, если при вводе будет обнаружена ошибка.

Оператор ввода может употребляться и без списка ввода в виде READ (N1, N2) где N1 — номер файла, N2 — метка оператора FОRМАТ. Эта разновидность оператора ввода используется тогда, когда вся считываемая информация идет для пополнения текста, заданного в самом операторе FОRМAТ с меткой N2.

Оператор ввода прямого доступа с форматом имеет вид READ (N1’R, N2) L где N1 — номер файла, R — номер записи этого файла, N2 — метка оператора задания формата, L — список ввода.

Этот оператор осуществляет чтение данных из одной или нескольких записей файла с номером N1, начиная с записи, имеющей номер R, преобразование их в двоичную форму представления и размещение в областях оперативной памяти, заданных списком ввода L. Информация о количестве считываемых записей и о структуре записей содержится в операторе FОRМАТ с меткой N2.

18.6. Операторы вывода с форматом. Различают операторы вывода послсдовательного доступа с форматом и операторы вывода прямого доступа с форматом.

Оператор вывода последовательного доступа с форматом в общем случае записывается в виде WRITE (N1, N2) L где N1 — номер файла, N2 — метка оператора задания формата, L — список вывода. Этот оператор осуществляет последовательный вывод данных из участков оперативной памяти, определенных списком L. Преобразование данных и их расположение в файле с номером N1 выполняется в соответствии со спецификациями оператора FОRМАТ, имеющего метку N2.

Вывод через печатающее устройство может быть осуществлен также оператором PRINT N2, L

Например, оператор печати элементов массива А со своими номерами будет выглядеть так:

PRINT N2, (I, А(I), I=1, 100)

Если вся выводимая информация содержится в операторе FОRМАТ, то вывод осуществляется оператором WRITE без списка вывода WRITE (N1, N2)

Оператор вывода прямого доступа с форматом имеет вид WRITE (N1’R, N2) L где, как и выше, N1 — номер файла, R — номер записи, N2 — метка оператора задания формата, L — список вывода.

19. Оператор формирования списков

Операторами ввода и вывода последовательного доступа могут быть обработаны значения без перечисления их имен в списке ввода-вывода, что создает определенные удобства для оперативной смены значений переменных, используемых в программе. В этом случае переменные и массивы должны быть описаны неисполняемым оператором формирования списков, имеющим вид NAMELIST Р где Р — список блоков наименований. Каждый блок наименований в списке имеет вид /Х/ А1, А2, ..., АМ Здесь Х — идентификатор блока; А1, А2...,, АМ — переменные или наименования массивов. Разделителем двух блоков является первый из символов /, которыми окаймляется наименование следующего блока.

Наименование блока может содержаться только в одном операторе NAMELIST и не должно появляться где-либо в программе, кроме как в операторах ввода и вывода, в которых отсутствует список. Идентификатор переменной или массива может принадлежать одному или нескольким блокам.

В операторах READ и WRITE не задается ни список ввода-вывода, ни метка оператора FОRМАТ. Вместо этого указывается идентификатор блока наименований оператора NAMELIST, т.е. операторы ввода и вывода в этом случае соответственно имеют вид READ (N1, Х) и WRITE(N1, Х) где N1 — номер файла, Х — идентификатор блока.

Во вводном файле записываются наименования переменных и их значения в форме А1=К где А1 — простая переменная или элемент массива, К — значение (константа). Форма записи массивов следующая: А2=J1* К1, J2* K2, ... где А2 — идентификатор массива, К1, К2, ... — значения (константы), J1, J2 — целые константы (коэффициенты кратности), указывающие, сколько раз должно быть повторено следующее за коэффициентом кратности значение. Коэффициенты кратности могут и отсутствовать.

Файл начинается с записи &X где Х — идентификатор блока, и заканчивается записью &END; при этом первая позиция игнорируется, т. е. символ & должен содержаться во второй позиции.

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

20. Оператор задания формата

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

Оператор задания формата имеет вид N2 ГОКМАТ (S) где N2 — метка оператора (эта метка указывается в соответствующем операторе ввода или вывода), S — список спецификаций.

Оператор FОRМАТ является неисполняемым, он может располагаться в любом месте программы.

20.1.Список спецификаций. Список спецификаций S состоит из кодов (спецификаций) разделяемых запятыми или символами / (наклонная черта). Так, список S может иметь вид

S1, S2, .../..., N(SМ, ...), JSQ, .../...

где S1, S2, ...— коды оператора FОRМАТ; N, J — коэффициенты кратности (целые константы без знака), указывающие число повторений следующих за ними повторяемых групп спецификаций. Например, 3SQ означает SQ, SQ, SQ, а конструкция 2(SМ, SN) указывает, что группа спецификаций SM, SN повторяется дважды, т. е. имеем SМ, SN, SМ, SN.

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

Элементы в списке ввода-вывода оператора, содержащего метку оператора задания формата, преобразуются из внешнего (относительно оперативной памяти) представления во внутреннее или из внутреннего представления во внешнее согласно кодам (спецификациям) в списке S.

Символ / в списке означает начало новой записи при обработке списка ввода-вывода. В общем случае спецификация может быть представлена в виде Сw.d где С — индекс спецификации, w и d — целые константы без знака. Константа w указывает длину поля, отведенного для данного значения в записи, т. е. количество символов в значении; константа d — это количество знаков в дробной части числовых значений, т. е. количество десятичных цифр справа от точки внутри поля (за исключением спецификации G).

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

Индексами спецификаций первой группы являются символы F, E, D, I, L, G, Z, A, которые называются индексами спецификаций преобразования. Индексы спецификаций второй группы — это символы ‘, H, X, T, которые называются индексами управляющих редакционных спецификаций.

Индекс спецификации обязан содержаться в коде, константы w и d, а также точка в некоторых спецификациях отсутствуют.

Установление соответствия между переменными в списке ввода-вывода и спецификациями в операторе FОRМАТ осуществляется с учетом управляющих редакционных спецификаций согласно их следованию в списке слева направо.

Каждой спецификации преобразования, содержащейся в списке спецификаций, соответствует один элемент в списке ввода-вывода. Исключение составляет элемент комплексного типа, которому в списке спецификаций соответствуют два кода оператора FОRМАТ с индексами спецификаций F, Е или D.

Для редакционных управляющих спецификаций не существует соответствующего элемента в списке ввода-вывода. Эти спецификации предназначены для управления вводом и выводом или для редактирования записей соответствующего файла.

Таким образом, выполнение операторов ввода или вывода вместе с соответствующим оператором FОRМАТ начинается с перебора спецификаций слева направо с учетом коэффициентов кратности и скобок. Если выбранная очередная спецификация относится к первой группе, то из списка ввода-вывода выбирается соответствующий элемент. Значение этого элемента (переменной) преобразуется согласно спецификации и передается либо в поле записи (при выводе), либо в оперативную память машины (при вводе). Если выбранная очередная спецификация относится ко второй группе, то выполняются необходимые (редакционные) действия без обращения к списку ввода-вывода.

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

Если список спецификаций будет исчерпан раньше, чем список ввода-вывода, то перебор элементов списка спецификаций будет повторен, начиная с первого элемента последней группы спецификаций первого уровня, иными словами — с самой правой открывающей скобки первого уровня.

Повторный перебор элементов списка спецификаций, не содержащего повторяемых групп спецификаций, начинается с первого элемента. Переход на повторный перебор списка спецификаций сопровождается переходом к новой (следующей по порядку) записи файла. Переход к новой записи происходит и тогда, когда в процессе перебора элементов списка спецификаций встречается символ / (наклонная черта).

20.2.Спецификации преобразования.

F-спецификация служит для описания формы представления значений переменных действительного типа и имеет вид NFw.d где коэффициент кратности N может отсутствовать.

ВВОД

Пример Оператор N2 FОRМАТ (5F8.3) указывает, что вводится 5 чисел, каждое из которых занимает поле, состоящее из 8 колонок. Если точка не набита или набита перед третьей цифрой, считая справа, то, согласно спецификации F, она будет проставлена после ввода именно перед третьим символом, считая справа. Если точка набита на поле из w символов в любой другой позиции, то задание точки F-спецификацией независимо от значения d отменяется, и вводимое число содержит точку в указанной позиции.

Если в спецификации значение d отсутствует, то оно принимается равным нулю.

ВЫВОД

Поле, на которое выводится число, занимает w позиций в записи (например, в строке). Значение величины заносится в запись в виде десятичного числа со знаком с фиксированной точкой и d дробными и максимум. w - d - 2 целыми разрядами. Если число положительное, то знак + не печатается. Если длина поля недостаточна для помещения туда выводимого числа, то оно заполняется символами * (звездочка). Если поле содержит больше позиций, чем требуется для записи числа, то избыточные позиции слева заполняются пробелами.

Е-спецификация, как и F-спецификация, служит для ввода и вывода действительных значений. Код ее имеет вид NЕw.d

ВВОД

Сохраняются все правила, перечисленные при рассмотрении F-спецификации. Число, записанное на поле, не обязано содержать все части, важно лишь, чтобы занимаемое числом поле не превосходило значения w в коде Е.

Примеры ввода при Е-спецификации:

ВЫВОД

Поле в записи состоит из w позиций. Выводимое число представляется в виде

± 0.aa..........aE± aa

и d позицийш

где знак плюс обычно заменяется пробелом, разряды мантиссы после точки содержат d позиций; буквой а обозначены позиции, занимаемые цифрами. Длина поля должна быть достаточной, чтобы в нем уместились значащие цифры, знаки, точка и десятичный порядок, поэтому w должно быть больше или равно d+7. При недостаточной длине поле заполняется звездочками. Если размер поля больше количества символов в выводимом числе, то левые избыточные позиции поля заполняются пробелами. За неимением значащих цифр в младших разрядах после точки печатаются нули.

D-спецификация определяет преобразование, которое применяется в случае значений с двойной точностью. Код ее имеет вид NDw.d Правила использования D-спецификации полностью совпадают с правилами, рассмотренными для Е-спецификации, за исключением того, что при выводе на поле вывода символ Е заменяется символом D. Элементы списка ввода-вывода соответствующего оператора ввода или вывода должны иметь двойную точность.

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

В в о д. В поле могут присутствовать цифры и пробелы, а также знаки + и -, которые должны предшествовать первой цифре.

В ы в о д. Целое число занимает поле из w позиций, причем одна позиция всегда отводится для знака. Если в поле вывода позиций больше, чем требуется для записи числа, избыточные позиции заполняются пробелами слева; если длина поля недостаточна для записи, все поле заполняется символами *.

L-спецификация используется при вводе и выводе логических значений. Она записывается в виде NLw

В в о д. С перфокарты вводится содержимое полк из w символов. Если на этом поле первый, отличный от пробела символ есть буква Т, то в область оперативной памяти, определяемой соответствующим элементом логического типа списка ввода, заносится значение .ТRUЕ. если же первый символ есть буква F или все ж позиций заняты пробелами, в память заносится логическое значение .FALSE. Таким образом, в поле логического значения при вводе должна присутствовать последовательность символов, в которой в качестве первого символа, отличного от пробела, записана буква Т или F (или все символы на поле - пробелы).

В ы в о д. Поле вывода имеет длину w символов, где в последней позиции печатается символ Т или F в зависимости от того, имеет ли соответствующий элемент (логического типа) списка вывода значение соответственно .TRUE. или .FALSE.

G-спецификация используется при передаче целых, действительных, комплексных и логических значений. Эта спецификация записывается в виде NGw.d Поле, занимаемое значением, состоит из w позиций.

В в о д. Для целых и логических значений G-спецификация эквивалентна соответственно I- и L-спецификациям, т.е. вместо Iw и Lw может стоять в списке спецификаций конструкция Gw. При вводе действительных значений спецификация Gw.d эквивалентна коду Fw.d. Смысл константы d тот же, что и выше. В случае целых и логических значений наличие d в G-спецификации игнорируется.

В ы в о д. Если десятичный порядок p преобразуемого действительного числа, представленного в форме Е с нормализованной мантиссой, меньше нуля или больше d, то значение выводится в форме Е. Если же 0 Ј p Ј d, то число выводится в форме F с p цифрами в целой части и d - p цифрами в дробной части числа; при этом четыре правые позиции заполняются пробелами. Таким образом, при выводе константа d указывает количество значащих цифр в поле.

Z-спецификация служит для задания шестнадцатеричных чисел, код ее имеет вид NZw В списке оператора ввода или вывода должны быть переменные целого или действительного типов или с двойной точностью. Считается, что значениями этих величин могут быть последовательности шестнадцатеричных цифр. Количество l шестнадцатеричных цифр в значении переменной определяется типом переменной из расчета по две цифры на один байт.

В в о д. Если w > l, то вводимое значение усекается слева, т. е. теряются левые (старшие) разряды. При w < l справа добавляется соответствующее количество (w - l) шестнадцатеричных нулей.

В ы в о д. При w > l в поле вывода слева добавляются пробелы. В случае w < l усекаются левые цифры.

А-спецификация используется для задания текстовых значений элементам списка ввода-вывода. Ее код имеет вид NAw

В в од. Все w символов с поля ввода, в том числе пробелы, если они есть, вводятся в оперативную память. Эти символы образуют текстовую константу, значение которой получает соответствующая переменная в списке ввода.

Количество символов l, используемых при образовании текстовой константы, зависит от того, какова разрядность процессора. Один символ занимает 1 байт памяти. Следовательно, для ЭВМ БЭСМ-б максимальное значение l равно 6, для ЕС 1050 - 8. Обозначим это число буквой r. Если w і r то при вводе по спецификации А в память заносится r символов, расположенных в правой части поля. Если w < r, то в памяти образуется значение переменной, состоящее из r введенных символов, за которыми (справа) расположены r - w пробелов.

В ы в од. Если w > r, то в записи будут содержаться w - r пробелов и т символов. В противном случае(при w < r) выводится w символов, расположенных в левой части слова в памяти.

Присвоение переменным и элементам массивов текстовых значений может быть выполнено, таким образом, операторами ввода с использованием в соответствующем операторе FОRМАТ А-спецификаций.

В языке фортран IV не предусмотрены специальные операторы для обработки текстовой информации, но переменные или элементы массива, которым присвоены текстовые значения, могут быть объединены в логическое выражение знаками операций отношения .EQ. и .NE. а также выступать в качестве правых частей операторов присваивания.

В одном операторе FОRМАТ список спецификаций может содержать коды различных видов. Единственное требование, которое при этом должно выполняться, заключается в том, что каждый код оператора FОRМАТ обязан соответствовать типу “своей” переменной в списке оператора ввода или вывода.

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

20.3. Масштабный коэффициент. Спецификациям F, Е и D может предшествовать масштабный коэффициент в форме nР, где n - целая константа со знаком. Масштабный коэффициент употребляется со спецификацией F при вводе и выводе и со спецификациями Е и D - только при выводе.

Использование масштабного коэффициента nР с F-спецификацией означает:

С Е- или D-спецификациями использование масштабного коэффициента при выводе означает перестановку точки в мантиссе и соответствующее изменение десятичного порядка числа на - n единиц. Результат заполняет поле справа налево, и избыточные левые позиции поля заполняются пробелами.

Таким образом, использование масштабного коэффициента с F-спецификацией вызывает изменение вводимого или выводимого значения (после вывода в памяти сохранится неизмененное значение), в то время как при Е- и D-спецификациях выводимое значение не изменяется. Например, число 0.23456789 при спецификации - 1РЕ20.2 представляется на выходе как 0.02Е+01 а при спецификации 5РЕ20.2 как 23466.78Е+00 в то время как в случае обычной (без масштабного коэффициента) спецификации Е20.2 это число представляется в виде 0.23 Е + 00.

Если масштабный коэффициент не указан, то он предполагается равным нулю. Однако, будучи указан один раз, он сохраняет силу для всех следующих за ним спецификаций F, Е и D в данном операторе FОRМАТ. Чтобы ликвидировать его влияние на последующие спецификации, одной из следующих спецификаций F, Е и D должен предшествовать масштабный коэффициент с n=0, т. е. 0Р. Масштабные коэффициенты при спецификациях Е и D при вводе игнорируются.

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

20.4.Управляющие редакционные спецификации. ‘ - спецификация (апостроф-спецификация или спецификация типа литерал) используется при передаче информации в виде текста, помещаемого в операторе задания формата между апострофами. В тексте могут встретиться любые символы (в том числе пробелы и апострофы). Первый апостроф обозначает начало поля для текста, последний - конец этого поля. Для того чтобы включить в текст символ апостроф, его надо написать дважды. Например, оператор FОRМАТ, содержащий ‘-спецификацию, может выглядеть так:

35 FОRМАТ (‘ Х =‘, Р10.3, ‘АВ ‘’C’')

Оператор ввода или вывода, содержащий метку оператора FОRМАТ со списком спецификаций, в который входит текст, заключенный в апострофы, имеет список ввода-вывода без элементов, соответствующих ‘-спецификациям. Так, с приведенным оператором FОRМАТ может использоваться, например, такой оператор вывода) WRITE (3, 35) Х

В в од. Из вводимой записи считываются символы до тех пор, пока в тексте не встретится апостроф или не будет заполнено все поле в операторе FОRМАТ новым текстом. Первоначально, т.е. при включении в программу оператора FОRМАТ с ‘-спецификацией, достаточно поле между апострофами заполнить пробелами. Например, ввод заголовка FORTRAN_PROGRAM в оператор FORMAT может быть осуществлен следующим образом:

READ 1

1 FОRМАТ (' -- -- ------- ')

В дальнейшем оператор с меткой 1 в программе имеет вид

1 FОRМАТ ('FORTRAN_PROGRAM')

В ы в од. В запись переносится содержимое списка спецификаций между апострофами. Результатом действия приведенных в начале п. 22.4 операторов будет печать строки Х= ___-12.345АВ’С если переменная Х имела значение -12.345.

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

Н-спецификация имеет вид (целая константа ж пишется перед индексом Н) и, так же как ‘-спецификация, используется при вводе или выводе текстовой информации, содержащейся в операторе FОRМАТ, однако в коде wН указывается количество символов текста, тогда как в апостроф-спецификации это не требовалось.

В в о д. В поле оператора FОRМАТ из w позиций, следующих за индексом Н, заносится весь текст, содержащийся в одной записи.

В ы в о д. Информация в количестве w символов, которая содержится в операторе FОRМАТ после индекса спецификации Н, выводится на печатающее устройство.

При использовании Н-спецификации список ввода-вывода отсутствует. Константа перед индексом Н ставится и в случае w = 1

Х-спецификация записывается в виде wX (константа w пишется перед индексом спецификации) и используется при вводе для пропуска w символов, а при выводе для включения в запись w пробелов.

Т-спецификация используется для задания позиции в записи, начиная с которой производится ввод или вывод, если есть необходимость считывания информации (при вводе) или занесения результата (при выводе) не с начала записи. Эта спецификация имеет вид Tw В одном операторе FОRМАТ Т-спецификация может употребляться несколько раз в сочетании с любыми другими спецификациями. При этом нет необходимости в последовательном указании кодов в операторе FORMAT с возрастающими значениями констант w.

Не следует допускать перекрытия полей в записи несколькими спецификациями. Так, ошибочным будет оператор N2 FORMAT (Т12, I15, Т22, I6) который при выводе должен отвести под число в форме I15 позиции с 11 по

25, а под число в форме I6 - позиции с 21 по 26.

Управляющие редакционные спецификации могут быть использованы в списке кодов оператора FORMAT совместно со спецификациями преобразования в произвольной последовательности.

21. КЛАССИФИКАЦИЯ ОПЕРАТОРОВ И НАИМЕНОВАНИЙ

Рассмотренные выше операторы делятся на пять типов: описательные операторы, операторы присваивания, операторы управления, операторы ввода и вывода, подпрограммы.

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

Наименования подпрограмм-функций и подпрограмм, наименования всех входов, а также наименования общих блоков являются общими (нелокализованными) для всех сегментов данной программы, и к ним можно обращаться из любой программной единицы в соответствии с установленными правилами (по идентификатору подпрограммы-функции, имени входа или идентификатору стандартной функции, с помощью операторов САLL или СОММОN),

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

    • оператор определения подпрограммы ВLОСК DАТА, FUNCTION или SUBROUTINE (используется только в подпрограмме);
    • оператор IMPLICIT;
    • описательные операторы, отличные от оператора IMPLICIT;
    • определения оператор-функций;
    • исполняемые операторы;
    • оператор END.

Операторы DАТА, FОRМАТ; ENTRY, RETURN могут находиться в любом месте программной единицы. Оператор DАТА должен следовать после оператора IMLICIT за описательными операторами, объявляющими величины, используемые в операторе DАТА. Оператор ENTRY не должен находиться в цикле.

Оператор DEFINE FILE должен логически предшествовать операторам ввода и вывода прямого доступа, а оператор NAMELIST - операторам ввода и вывода, которые используют величины, объявленные в операторе NAMELIST.