Решение задач по ТОЭ, ОТЦ, Высшей математике, Физике, Программированию...

Решение задач по ТОЭ, ОТЦ, ТЭЦ, Высшей математике www.toehelp.ru
[an error occurred while processing the directive]
[an error occurred while processing the directive]
   Теория / Фортран / 2. Термины и концепции

2. ТЕРМИНЫ И КОНЦЕПЦИИ.

ОБ ЭТОЙ ЧАСТИ. Эта часть описывает основные возможности языка МS-Фортран.

Содержание:

1. ЗАПИСЬ ПРОГРАММ
   1.1. Буквенноцифровые символы
   1.2. Пробелы
   1.3. Табуляторы
   1.4. Позиции
2. СТРОКИ И ОПЕРАТОРЫ
   2.1. Начальные строки
   2.2. Строки продолжения
   2.3. Строки коментария
   2.4. Операторы описания данных и порядок следования операторов
3. ТИПЫ ДАННЫХ
   3.1. Целые типы данных
   3.2. Тип действительных данных обычной точности IEEE
   3.3. Действительный тип данных IEEE двойной точности
   3.4. Формат десятичных чисел с плавающей точкой обычной и двойной точности
   3.5. Комплексные типы данных
   3.6. Логические типы данных
   3.7. Символьный тип данных
     3.7.1. Символьные подстроки
4. ИМЕНА
   4.1. Область действия имен Фортрана
   4.2. Имена Фортрана по умолчанию
5. ВЫРАЖЕНИЯ
   5.1. Арифметические выражения
   5.2. Деление целых
   5.3. Преобразования типов арифметических операндов
   5.4. Символьные выражения
   5.5. Выражения отношения
   5.6. Логические выражения
   5.7. Приоритеты операторов
   5.8. Правила вычисления выражений
   5.9. Ссылки на элемент массива

1. ЗАПИСЬ ПРОГРАММ.

Текст программы на Фортране - это последовательность символов ASCII. К символам ASCII относятся:
1. 52 прописных и заглавных английских буквы (от А до Z и от а до z).
2. 10 цифр (0,1,2,3,4,5,6,7,8,9)
3. Специальные символы (все остальные печатаемые символы таблицы кодов ASCII - в том числе и русские буквы).

1.1. Буквенноцифровые символы.

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

   ABCDE      abcde      AbCdE      aBcDe

Последовательность сортировки для набора символов МS-Фортрана - это последовательность ASCII (Полную таблицу символов ASCII смотрите в приложении С "Коды символов ASCII").

1.2. Пробелы.

За исключением ниже приведенного списка символов пробел не является значащим в тексте программы на МS-Фортране и поэтому может использоваться для улучшения внешнего вида программы. Исключения следующие:
1. Пробелы внутри строковых констант являются значащими.
2. Пробелы внутри холлеритовских полей являются значащими.
3. Пробел или нуль в шестов позиции отличает начальную строку от строки продолжения.

1.3. Табуляторы.

Символ ТАВ имеет следующее значение в тексте программы на МS-Фортране:
1. Если ТАВ появляется в позициях с 1-ой по 5-ю, то считается, что следующий символ находится в 7-ой позиции.
2. ТАВ в позициях с 6-ой по 72-ю рассматривается как пробел, даже если он содержит внутри строки или холлеритового поля.

1.4. Позиции.

Символы в каждой строке расположены по позициям, первый - в первой позиции, второй - во второй и т.д.

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

2. СТРОКИ И ОПЕРАТОРЫ.

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

2.1. Начальные строки.

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

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

2.2. Строки продолжения.

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

2.3. Строки коментария.

Строка считается строкой коментария, если выполняется одно из следующих условий:
1. В позиции 1 стоит "С" (или"с").
2. В позиции 1 стоит звездочка (*).
3. Строка состоит из одних пробелов.

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

2.4. Операторы описания данных и порядок следования операторов.

Оператор Фортрана содержит начальную строку и от 0 до 19 строк продолжения. Оператор может содержать до 1320 символов в позициях с 7-ой по 72-ю начальной строки и с 7-ой по 72-ю строк продолжения. Оператор END должен быть записан в позициях с 7-ой по 72-ю начальной строки и в его строке не может быть никаких других операторов (в дальнейшем на отдельные операторы мы будем ссылаться просто по их именам; смотрите часть 3 "Операторы" для определения различных операторов и их свойств).

Язык Фортран требует определенного порядка следования операторов и строк, составляющих программную единицу Фортрана. Кроме того МS-Фортран накладывает дополнительные требования на порядок строк и операторов в транслируемом тексте МS-Фортрана.

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

-----------------------------------------------------T---------¬
|  метакоманды $DO66,$STORAGE,$DECMATH               |         |
+----------------------------------------T-----------+         |
| операторы PROGRAM,FUNCTION,            |           |         |
| BLOCK DATА,SUBROUTINE                  |           |         |
+-------------------T----------T---------+  другие   |         |
|оператор IMPLICIT  |операторы |         |  мета-    | строки  |
+-------------------+          |         |  команды  |         |
|другие операторы   |PARAMETER |операторы|           | комен-  |
|определения данных |          |         |           | тариев  |
+-------------------+----------+ FORMAT  |           |         |
|функции-операторы  |операторы |         |           |         |
+-------------------+          |         |           |         |
|  выполняемые      |   DATA   |         |           |         |
|   операторы       |          |         |           |         |
+-------------------+----------+---------+-----------+         |
|   оператор   END                                   |         |
L----------------------------------------------------+----------

Рис.2-1  Порядок операторов в программых единицах и транслируемых
          текстах.

Для рисунка 2-1 существуют следующие соглашения:

  1. Классы строк или операторов, расположенные выше или ниже других классов, должны следовать в заданном порядке.
  2. Классы строк или операторов могут быть перемешаны с другими классами, находящимися с боку от них.
  3. Метакоманды $LARGE и $NOTLARGE не могут находиться в разделе выполняемых операторов.
  4. Подпрограммы BLOCK DATA не могут содержать функции-операторы, операторы FORMAT или выполняемые операторы.

Подпрограмма начинается с оператора либо SUBROUTINE, либо FUNCTION, либо BLOCK DATA и заканчивается оператором END. Основная программа начинается с оператора PROGRAM или любого другого оператора, отличного от операторов SUBROUTINE, FUNCTION или BLOCK DATA, и заканчивается оператором END. Подпрограмма и основная программа являются программными единицами.

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

  1. Оператор PROGRAM, если он есть или оператор SUBROUTINE, FUNCTION, BLOCK DATA должны быть первым оператором программной единицы.
  2. Оператор FORMAT может встретиться в любом месте после оператора SUBROUTINE, FUNCTION,BLOCK DATA или PROGRAM, если он есть.
  3. Все операторы определения типов должны предшествовать операторам DATA, операторам-функциям и выполняемым операторам.
  4. Все операторы DATA должны стоять после операторов определения типов. Операторы DATA могут быть перемешаны с операторами функциями и выполняемыми операторами.
  5. Обычно оператор PARAMETER предшествует всем другим операторам определения типов. Однако, когда некоторый оператор определяет тип константы, используемой в операторе PARAMETER, оператор PARAMETER должен следовать за этим оператором определения типа.
  6. В операторах определения типа оператор IMPLICIT должен предшествовать всем другим операторам, за исключением оператора PARAMETER.
  7. Все операторы-функции должны предшествовать всем выполняемым операторам.
  8. Метакоманды $DO66, $DECMATH и $STORAGE должны предшествовать любым другим операторам. Другие места команды могут находиться где угодно в программной единице.

3. ТИПЫ ДАННЫХ.

В МS-Фортране существует шесть основных типов данных:
1. Целый (INTEGER*2 INTEGER*4)
2. Действительный (REAL*4 или REAL)
3. Двойной точности (REAL*8 или DOUBLE PRECISION)
4. Комплексный (COMPLEX*8 и COMPLEX*16)
5. Логический (LOGICAL*2 и LOGICAL*4)
6. Символьный.

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

-----------------------T---------------------T-----------¬
|        Тип           |   Число байтов      |Примечание |
+----------------------+---------------------+-----------+
|  LOGICAL             |     2 или 4         |     1     |
|  LOGICAL*2           |        2            |           |
|  LOGICAL*4           |        4            |           |
|  INTEGER             |     2 или 4         |     1     |
|  INTEGER*2           |        2            |           |
|  INTEGER*4           |        4            |           |
|  SHARACTER           |        1            |     2     |
|  SHARACTER*n         |        n            |     3     |
|  REAL                |        4            |     4     |
|  REAL*4              |        4            |           |
|  REAL*8              |        8            |     5     |
|  DOUBLE PRECISION    |        8            |           |
|  COMPLEX             |        8            |     6     |
|  COMPLEX*8           |        8            |           |
|  COMPLEX*16          |        16           |           |
L----------------------+---------------------+------------

Таб.2-2. Требования по памяти.
Примечание к таблице 2-2:
1. Может использоваться 2 или 4 байта. По умолчанию - 4, но мета - командой $STORAGE может быть установлено 2 или 4.
2. CHARACTER и CHARACTER*1 - синонимы.
3. Максимальное n равно 127.
4. REAL и REAL*4 - синонимы.
5. REAL*8 и DOUBLE PRECISION - синонимы.
6. COMPLEX и COMPLEX*8 - синонимы.

Замечания.

На многих микропроцессорах команды, необходимые для выполнения 16-битовой арифметики, значительно быстрее и короче соответс- твующих команд для выполнения 32-битовой арифметики. Поэтому, пока Вы не используете метакоманду МS-Фортрана $STORAGE, устанавливающую 2, в программе по умолчанию будет 32-битовая арифметика и она будет выполняться существенно медленней, чем ожидается. (Смотрите описание метакоманды $STORAGE в части 6). Установка 2 метакомандой $STORAGE ускорит выполнение программы и сделает ее короче.

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

3.1. Целые типы данных.

Целый тип данных состоит из подмножества целых чисел. Целая величина - это точное представление соответствующего целого. Целая величина занимает 2 или 4 байта, в зависимости от установки метакоманды $STORAGE. 2-байтовое целое, INTEGER*2, может содержать величину в диапазоне от -32767 до 32767. 4-байтовое целое, INTEGER*4, может содержать величину в диапазоне от -2147483647 до 2147463647.

Целые константы содержат последовательность одной или более десятичных цифр или определитель системы счисления, за которым следует строка цифр в диапазоне от 0...(основание системы счисления - 1), где величины от 10 до 35 представлены буквами от А до Z соответственно. Указатель системы счисления содержит символ "#", которому обычно предшествует строка десятичных цифр, представляющая величину основания системы счисления. Если строка отсутствует, подразумевается, что основание равно 16. Если указатель системы счисления отсутствует, подразумевается, что основание равно 10.

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

Замечание: диапазон величин как для 16-битовых так и для 32- битовых целых не включает наиболее отрицательное число, которое может быть представлено в двоичном дополнительном коде этим числом битов. Эти числа, 16#8000 и 16#80000000 обрабатываются как "неопределенные" для сигнализации об ошибке.

Хотя максимальная величина 32-битового целого определена как 2**31-1, при компиляции и счете будут считываться и большие величины, которые выходят за диапазон 2**32. Но эти величины будут только считываться без ошибки, если их основание счисления не равно 10. Они будут интегрироваться как отрицательные числа с соответствующим внутренним представлением. Например, 16#FFFFFFFF приведет к тому что все биты 32-битового числа будут единицы, что соответствует арифметической величине -1.

Примеры целых констант:

                   123           +123               0
              00000123          32767          -32767
                -#AB05       2#010111       -36#ABZ07

В МS-Фортране точность целых определяется следующим образом:

*Константы.

Точность устанавливает метакоманда $STORAGE.

*Результат выражения.

Точность результата определяется точностью максимального операнда и величиной установленной метакомандой $STORAGE.

*Формальные параметры.

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

*Целые переменные и функции.

Точность задана для каждой переменной или функции (по умолчанию установлена метакомандой $STORAGE).

3.2. Тип действительных данных обычной точности IEEE.

Тип действительных данных (REAL или REAL*4) содержит подмножество действительных чисел обычной точности. Действительная величина обычной точности - это приближение требуемого действительного числа, занимающее 4 байта памяти. Диапазон действительных чисел обычной точности приблизительно следующий:

     от  8.43Е-37 до 3.37Е+38  (положительные числа)
     от -3.37Е+38 до -8.43Е-37 (отрицательные числа)
               0               (нуль)

Точность - больше шести десятичных цифр и меньше семи. Основная действительная константа содержит:
1. Необязательный знак.
2. Целую часть.
3. Десятичную точку.
4. Дробную часть.
5. Необязательный показатель экспоненты.

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

    -123.456              +123.456           123.456
         -123.                 +123.              123.
         -.456                 +.456              .456

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

Экспонента показывает, что предшествующую величину нужно умножить на десять в степени целая константа. Некоторые простые экспоненциальные части:

          Е12          Е-12             Е+12      Е0

Действительная константа - это либо основная действительная константа, либо основная действительная константа с экспоненциальной частью, либо целая константа с экспоненциальной частью. Например:

           +1.000Е-2         1.Е-2          1Е-2
           +0.01           100.0Е-4        0.0001Е+2

Все это - одно и то же число, одна сотая.

3.3. Действительный тип данных IEEE двойной точности.

Действительный тип данных двойной точности (REAL*8 или DOUBLE PRECISION) содержит подмножество действительных чисел двойной точности. Это подмножество больше, чем подмножество типа данных REAL(REAL*4).

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

     от  4.19D-307  до  1.67D+308 (положительные числа)
     от -1.67D+308  до -4.19D-307 (отрицательные числа)
                          0       (нуль)

Точность больше чем 15 десятичных цифр. Константа двойной точности содержит:
1. Необязательный знак.
2. Целую часть.
3. Десятичную точку.
4. Дробную часть.
5. Обязательную экспоненциальную часть.

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

Константа двойной точности - это либо основная действительная константа, за которой следует экспоненциальная часть, либо целая константа, за которой следует экспоненциальная часть. Например:

     +1.123456789D-2         1.D-2           1D-2
     +0.000000001D0       100.0000005D-4   .00012345D+2

Экспоненциальная часть содержит букву "D", за которой следует целая константа. Целая константа может иметь необязательный знак. Экспонента показывает, что предшествующее число должно быть умножено на десять в степени целый показатель экспоненты. Некоторые простые экспоненты:

              D12    /D-12      D+12      /D0

3.4. Формат десятичных чисел с плавающей точкой обычной и двойной точности.

Десятичные числа с плавающей точкой содержат байт с битом знака и семибитовой экспонентой в 64-ричной системе счисления, за которым следует мантисса из 6 (для обычной точности) или из 14 (для двойной точности) двоично-десятичных цифр, упакованных по 2 в байт (если байт экспоненты нулей - число равно нулю). Запись десятичных констант с плавающей точкой производится в том же формате, что и для стандартных действительных констант Фортрана обычной и двойной точности. Допустимый диапазон чисел обычной точности следующий:

       от +1.0Е-64 до +9.99Е+62 (положительные числа)
       от -9.99+62 до -1.0Е-64  (отрицательные числа)
             0                  (нуль)

Точность равна точно 6 цифрам.
Допустимый диапазон чисел двойной точности следующий:
       от +1.0D-64  до +9.999D+62 (положительные числа)
       от -9.99D+62 до -1.0D-64   (отрицательные числа)
              0                   (нуль)

Точность равна точно 14 цифрам.

Метакоманда $DECMATH вызывает представление констант текстового файла в виде с плавающей запятой.

3.5. Комплексные типы данных.

Тип данных COMPLEX*8 задает пару действительных чисел обычной точности, второе из которых представляет мнимую часть. Число COMPLEX*8 занимает 8 байтов памяти.

Комплексная константа состоит из необязательного знака, левой скобки, двух целых или действительный чисел, разделенных запятой, и правой скобки. Элемент данных COMPLEX*16 содержит упорядоченную пару действительных чисел двойной точности. Элемент данных COMPLEX*16 занимает 16 байтов памяти. Каждая компонента (действительная и мнимая) COMPLEX*8 - это REAL*4. Каждая компонента COMPLEX*16 - это REAL*8.

3.6. Логические типы данных.

Логический тип данных содержит две логических величины .TRUE. и .FALSE. Логическая переменная занимает два или четыре байта памяти в зависимости от установки метакоманды $STORAGE. По умолчанию это 4 байта. Значение логической переменной независит от метакоманды $STORAGE, которая соответствует требованию ANSI, чтобы логические, целые и действительные переменные обычной точности занимали одинаковое место в памяти. Величины LOGICAL*2 занимают два байта. Младший значащий (первый) байт - либо 0(.FALSE.), либо 1(.TRUE.); старший значащий байт не определен.

Переменные LOGICAL*4 занимают два слова, младшее значащее (первое) из которых содержит величину LOGICAL*2. Старшее значащее слово не определено.

3.7. Символьный тип данных.

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

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

Длина символьной константы равна числу символов между одиночными кавычками. Пара одиночных кавычек означает один символ. Несколько примеров символьных констант:

                   'A'
                   ' '
                   'Help!'
                   'A very long CHARACTER constant'
                   'O''Brien'
                   ''''      

Последний пример - это символьная константа содержащая один апостроф (одиночную кавычку).

Символьной переменной может быть присвоена несимвольная величина, если присвоение не включено в выражение. Допустимо следующее:

                     REAL R
                     CHARACTER*5 C
                     C=R,

но следующее недопустимо
                     REAL R
                     CHARACTER*5 C
                     C=R+1.0

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

                 200  СН='ABC
                    X DEF'

Эквивалентен:

                 200  CH='ABC(58 пробелов)...DEF'

С 58-ю пробелами между С и Д, равными пространству от С в 15-й позиции до 72-й позиции плюс одному пробелу в 7-ой позиции строки продолжения. Таким образом могут быть представлены очень длинные символьные константы.

3.7.1. Символьные подстроки.

МS-Фортран поддерживает подстроки так же, как они определены в полном языке Фортран 77. Подстроки относятся к типу CHARACTER и используются для доступа к слитным частям символьной переменной. Они имеют следующий синтаксис:

-----------------------------------------------
  переменная ([первый №]:[последний №])
-----------------------------------------------
                     или
----------------------------------------------------------
  массив (индекс1 [,индекс2])([первый №]:[последний №])
----------------------------------------------------------
где
переменная                    это символьная переменная
массив (индекс1[,индекс2])    это элемент символьного массива
первый № и                    это целые выражения, определяющие
последний №                   первый (самый левый) и последний
                              (самый правый) символ в подстроке
                              Как первый №, так и последний № не-
                              обязательны. По умолчанию первый №
                              равен единице, так что подстрока
                              начинается с первого символа стро-
                              ки. По умолчанию последний № -это
                              длина строки, так что подстрока
                              кончается на последнем символе стро-
                              ки.

Отметим что переменная(:) эквивалентна переменная. Длина подстроки равна последний №-первый №+1. Взятая длина должна быть длиной символьной переменной и при этом должны удовлетворятся следующие отношения:
1. первый № ≤ последний №
2. 1 ≤ первый № ≤ длина
3. 1 ≤ последний № ≤ длина

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

                   CHARACTER A*12, B*20, C*32
                   A='Now is the t'
                   B='ime for all gooel men'
                   C(1:12)=A
                   C(13:12+20)=B
                   WRITE(*,*)'C=',C
                   END

В результате на выходе будет

                   C=Now is the time for all gooel men

4. ИМЕНА.

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

Имя означают определенную пользователем или системой переменную, массив или программную единицу. Любая значащая последовательность символов может быть использована для любого имени Фортрана. Здесь нет зарезервированных имен, как в других языках. Последовательности буквенных символов, используемые как ключевые слова компилятора МS-Фортрана не смешиваются с именами, определяемыми пользователем. Компилятор отличает ключевые слова по их контексту и на использование имен, определяемых пользователем, нет ограничений.

Поэтому в программе могут быть массивы с именами, например, IF, READ или GO TO и при этом не будет ошибок (пока они будут использоваться по правилам, которым должны подчиняться). Однако, использование ключевых слов для имен пользователя часто мешает читабельности программы и, практически, этого следует избегать.

4.1. Область действия имен Фортрана.

Область действия имени - Это диапазон операторов, где это имя известно, или на него можно ссылаться в программе на Фортране.

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

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

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

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

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

4.2. Имена Фортрана по умолчанию.

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

Если имя используется как переменная, его тип определяется по первой букве имени ; I, J, K, L, M или N по умолчанию принимаются целыми, а остальные буквы - действительными числами. Вы можете использовать оператор IMPLICIT для замены соответствия типа и начальной буквы (подробнее, смотрите часть 3 "Операторы"). Это же правило используется при использовании имени в функции для определения типа возвратной величины.

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

5. ВЫРАЖЕНИЯ.

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

В Фортране существует четыре класса выражений :
1. Арифметические.
2. Символьные.
3. Отношения.
4. Логические.

5.1. Арифметические выражения.

Результатом арифметических выражений являются величины типов INTEGER, REAL, DOUBLE PRECISION или COMPLEX. Простейшие виды арифметических выражений - это :
1. Константы.
2. Использование переменных.
3. Использование элементов массивов.
4. Использование функций.

Используемые величины переменных или элементов массивов должны быть определены до того, как они появятся в арифметическом выражении. Также, величины целых переменных должны быть арифметическими, а не величинами меток операторов, установленными оператором ASSIGN.

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

---------------------T----------------------T------------¬
| Оператор           |     Операция         |  Приоритет |
+--------------------+----------------------+------------+
|     * *            | Возведение в степень |  Высший    |
|      /             | Деление              |  Средний   |
|      *             | Умножение            |  Средний   |
|      -             | Вычитание или отриц. |  Низший    |
|      +             | Сложение или         |  Низший    |
|                    |          идентичность|            |
L--------------------+----------------------+-------------
     Таблица 2-3. Арифметические операторы.

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

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

     A/B * C                (A/B) * C
     A * * B * * C          A * * (B * * C)

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

     A * * - B
но можно
     A * * (- B)

Унарный минус имеет наименьший приоритет. Поэтому выражение -А**В понимается как - (А ** В).

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

5.2. Деление целых.

Результатом деления двух целых чисел является величина, равная математическому частному двух этих величин, округленного до целого в сторону нуля. Поэтому 7/3 превращается в 2, а (-7)/3 превращается в -2. Как 9/10, так и 9/(-10) равны нулю.

5.3. Преобразования типов арифметических операндов.

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

Ранг операнда зависит от его типа данных соответсвенно следующему списку :
1. INTEGER * 2 (низший ранг)
2. INTEGER * 4
3. REAL * 4
4. REAL * 8
5. COMPLEX * 8
6. COMPLEX * 16 (высший ранг)

Например, результатом операции над элементами INTEGER*2 и REAL*4 будет величина, относящаяся к типу данных REAL*4.

Специальный случай : операция над операндами типов REAL*8 и COMPLEX*8 породит COMPLEX*16, а не COMPLEX*8.

Тип данных всего выражения - это тип данных результата последней операции, выполненной при вычислении всего выражения.

Типы данных операций могут быть INTEGER*2, INTEGER*4, REAL*4, REAL*8, COMPLEX*8 или COMPLEX*16.

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

     1/4 + 1/4 + 1/4 + 1/4

Распределение памяти для типа INTEGER без указания длины *2 или *4 в определении типа зависит от использования метакоманды $STORAGE (для подробностей смотрите раньше в этой части и части 6 "Мета- команды МS-Фортрана").

Действительные операции выполняются только над действительными операндами или комбинацией действительного и целого операндов. Целые операнды сначала преобразуются в действительные прибавлением к каждому дробной части равной нулю. Затем для вычисления выражения используется действительная арифметика. Но в следующем операторе сначало осуществляется целое деление I на J, а потом действительное умножение результата на X :

     Y = (I/J) * X

5.4. Символьные выражения.

Результатом символьных выражений является тип CHARACTER. Формы символьных выражений следующие :
1. Символьные константы.
2. Ссылки на символьные переменные.
3. Ссылки на элементы символьных массивов.
4. Любые символьные выражения, заключенные в скобки.
5. Ссылки на символьные функции.
В символьных выражениях нет операторов.

5.5. Выражения отношения.

Выражения отношения сравнивают величины двух арифметических или двух символьных выражений. Арифметическое выражение нельзя сравнивать с символьным, пока не определена метакоманда $NOTSTRICT. В этом случае арифметические выражения сравнимы с символьными. Результатом выражения отношения является тип LOGICAL. Для сравнеия величин в выражениях отношения можно использовать любой оператор, указанный в таблице 2-4.

----------------------------T----------------------------¬
|        Оператор           |             Операция       |
+---------------------------+----------------------------+
|        .LT.               |   Меньше чем               |
|        .LE.               |   Меньше или равно         |
|        .EQ.               |   Равно                    |
|        .NE.               |   Не равно                 |
|        .GT.               |   Больше чем               |
|        .GE.               |   Больше или равно         |
L---------------------------+-----------------------------
     Таблица 2-4. Операторы отношения.

Все операторы отношения бинарные и появляются между двумя операндами. Среди операторов отношения нет относительного старшинства или сочетательности и поэтому выражение следующего вида нарушает правила типов для операндов :

     A .LT. B .NE. C
Выражения отношения могут появляться только в логических выражениях.

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

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

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

Результатом логического выражения является величина типа LOGICAL. Простейшие формы логических выражений следующие :
1. Логические константы.
2. Ссылки на логические переменные.
3. Ссылки на элементы логических массивов.
4. Ссылки на логические функции.
5. Выражения отношения.

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

------------T-----------------------------T--------------¬
|  Оператор |           Операция          |     Приоритет|
+-----------+-----------------------------+--------------+
|  .NOT.    |  Отрицание                  |  Наивысший   |
|  .AND.    |  Конъюнкция                 |  Средний     |
|  .OR.     |  Включающая дизъюнкция      |  Средний     |
|  .EQV.    |  Эквивалентность            |  Низший      |
|  .NEQV.   |  Неэквивалентность          |  Низший      |
L-----------+-----------------------------+---------------
     Таблица 2-5. Логические операторы.

Операторы .AND., .OR., .EQV., .NEQV. не являются бинарными и появляются между двумя операндами логических выражений. Оператор .NOT. - унарный и предшествует своему операнду.

Операции равного приоритета выполняются слева направо, поэтому, например,

     A .AND. B .AND. C
Эквивалентно :
     (A .AND. B) .AND. C
Пример правила приоритета :
     .NOT. A .OR. B .AND. C
выполняется как :
     (.NOT. A) .OR. (B .AND. C)
Два .NOT. не могут соседствовать с друг другом, хотя
     A .AND. .NOT. B
- это пример допустимого выражения с двумя операторами подряд.

Другой пример правила приоритетов и использования .EQV. и .NEQV. :

     .NOT. A . EQV. B .OR. C .NEQV. D .AND. E
может быть выполнено как
     ((.NOT. A) .EQV. (B .OR. C)) .NEQV. (D .AND. E)
Логические операторы имеют тоже самое значение, что и в стандартной математической симантике с неразделительным .OR.. Например:
     .TRVE. .OR. .TRVE.
даст величину
     .TRVE.

5.7. Приоритеты операторов.

Когда в одном выражении встречаются арифметические, логические операторы и операторы отношения, они выполняются со следующими приоритетами :
1. Логические (низший).
2. Отношения (средний).
3. Арифметические (высший).

5.8. Правила вычисления выражений.

Любая переменная, массив, элемент или функция, на которые ссылаются в выражении, должны быть определены до момента ссылки. Целые переменные должны быть определены арифметической величиной, не величиной метки оператора, устанавливаемой оператором ASSIGN.

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

5.9. Ссылки на элемент массива.

Ссылка на элемент массива определяет один элемент массива. Ее синтаксис следующий :

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

С Пример операторов размерности
     DIMENSION A(3,2), B(3,4), C(4,5), D(5,6), V(10)
     EQVIVALENCE (X, V(1)), (Y, V(2))
     D(i,j) = D(i,j)/PIVOT
     C(i,j) = C(I,J) + A(i,k) * B(k,j)
     READ (*,*) (V(N), N = 1, 10)
[an error occurred while processing the directive] [an error occurred while processing the directive] [an error occurred while processing the directive] [an error occurred while processing the directive]