Фортран 90
Справочное руководство по языку Fortran 95 перевод Балуева А. Fortran предлагает программисту различные способы хранения данных и ссылок на них. Можно ссылаться на данные буквально, как в вещественных числах 4.73 и 6.23E5, в целых -3000 и 65536, или в CHARACTER литерале 'Continue (y/n)?' Или вы можете хранить и ссылаться на разные переменные данные, используя имена, такие как x или y, DISTANCEFROMORIGIN или USERNAME.
- В данной лекции дается краткий обзор языка программирования Фортран 90.
- Скачать программу Fortran 90 - основные связи программы Fortran 90 с расширениями файлов.
Постоянные, такие как pi или скорость света, могут задаваться именами и постоянными значениями. Можно хранить данные в фиксированного размера области в памяти или отводить для них память, когда программа в этом нуждается. Наконец, Fortran предлагает различные средства создания, хранения и ссылки на структурированные данные с помощью массивов, указателей и производных типов.
Встроенные типы данных Пять встроенных типов данных есть INTEGER, REAL, COMPLEX, LOGICAL и CHARACTER. Тип DOUBLE PRECISION доступный в Fortran 77 также поддерживается, но рассматривается как подмножество или разновидность данных типа REAL. Разновидность В Fortran встроенный тип данных имеет одну или более разновидностей. В LF95 для типов CHARACTER, INTEGER, REAL и LOGICAL параметр разновидности ( число, используемое при ссылке на разновидность) соответствует количеству байтов, используемых для представления разновидности. Для данных типа COMPLEX значение параметра есть количество байтов для представления вещественной или мнимой части. Имеются две встроенные справочные функции, SELECTEDINTKIND и SELECTEDREALKIND. Каждая выдает значение параметра разновидности на основании требуемых диапазона и точности объекта данных в форме, переносимой на другие Fortran 90 или 95 системы.
Разновидности, доступные в LF95, перечислены в следующей таблице: Таблица 1: Встроенные типы данных Тип Параметр разновидности Диапазон и точность INTEGER 1 Диап.: -128 127 INTEGER 2 Диап.: -32.768 32.767 INTEGER 4. Диап.: -2.147.483.648 2.147.483.647 INTEGER 8 Диап.: -9.223.372.036.854.775.808 9.223.372.036.854.775.807 REAL 4. Диап.: 1.18. 10-38 3.40.
1038 Точность: 7-8 дес. Цифр REAL 8 Диап.: 2.23. 10-308 1.79.
10308 Точность: 15-16 дес. Цифр REAL 16 Диап.: 10-4931 104932 Точность: прибл.33 дес. Цифры COMPLEX 4. Диап.: 1.18. 10-38 3.40. 1038 Точность: 7-8 дес.
Имеются две встроенные справочные функции, SELECTED_INT_KIND и SELECTED_REAL_KIND. Каждая выдает значение параметра разновидности на основании требуемых диапазона и точности объекта данных в форме, переносимой на другие Fortran 90 или 95 системы. Разновидности, доступные.
Цифр COMPLEX 8 Диап.: 2.23. 10-308 1.79. 10308 Точность: 15-16 дес. Цифр COMPLEX 16 Диап.: 10-4931 104932 Точность прибл.
Цифры LOGICAL 1 Значения:.TRUE. LOGICAL 4.
Значения:.TRUE. CHARACTER 1. ASCII character set '.' отмечает значения по умолчанию Длина Количество символов в объекте типа CHARACTER указывается его параметром длины типа. Например, CHARACTER литерал 'Half Marathon' имеет длину тринадцать. Данные типа Literal Данные этого типа, называемые также literal, literal constant или непосредственная константа, характеризуются как указано далее для всех типов данных Fortran. Синтаксис литеральных констант определяет их встроенный тип.
Литералы INTEGER Целый литерал состоит из одного или более символов с необязательным начальным знаком (+ или -) и необязательными подчеркиванием и параметром разновидности в конце. Если подчеркивание и параметр разновидности отсутствуют, литерал INTEGER имеет разновидность по умолчанию.
Примеры литералов INTEGER: 34 -256 3454 +78mykind 34 and -256 имеют тип INTEGER по умолчанию. 3454 есть INTEGER разновидности 4 (умолчание для INTEGER в LF95). В последнем примере mykind должен быть объявлен предварительно как скалярная именованная константа типа INTEGER со значением параметра разновидности INTEGER (1, 2, или 4 в LF95). Двоичные, восьмеричные или шестнадцатеричные константы могут появиться в операторе DATA.
Такие константы могут образовываться заключением последовательности двоичных, восьмеричных или шестнадцатеричных цифр в апострофы или кавычки с буквами B, O или Z впереди для соответственно двоичного, восьмеричного или шестнадцатеричного представления. B'10101' Z'1AC3' Литералы REAL Литерал типа REAL состоит из одной или более цифр и десятичной точки (точка может появиться перед, после или между цифрами), содержит впереди необязательный знак (+ или -) и в конце может иметь букву экспоненты и порядок, а затем знак подчеркивания и параметр разновидности. Если присутствует буква экспоненты, десятичная точка необязательна. Экспонента обозначается буквой E при простой точности, D при двойной, Q при четверной. Если подчеркивание и параметр разновидности отсутствуют, литерал REAL имеет точность по умолчанию.
Примеры литералов: -3.45.0001 34.E-4 1.48 Первые три примера имеют тип REAL по умолчанию. Последний пример есть REAL разновидности 8. Литералы COMPLEX Литерал COMPLEX формируется заключением в скобки пары разделенных запятой литералов типа REAL или INTEGER. Первый из REAL или INTEGER литералов представляет вещественную часть комплексного числа; второй представляет мнимую часть. Параметр разновидности константы COMPLEX есть 16, если либо вещественная, либо комплексная часть или обе имеют четверную точность REAL, или 8, если вещественная или мнимая часть или обе есть REAL двойной точности. В противном случае параметр разновидности есть 4 (точность по умолчанию для COMPLEX). Примеры правильных литералов COMPLEX: (3.4,-5.45) (-1,-3) (3.4,-5) (-3.d13,6.8) Первые три примера имеют точность по умолчанию - четыре байта для каждой части.
В четвертом используются 8 байтов. Литералы типа LOGICAL Логический литерал есть либо.TRUE. С необязательным параметром разновидности в конце.
Если необязательные подчеркивание и параметр разновидности отсутствуют, литерал имеет разновидность по умолчанию. Примеры правильных литералов типа LOGICAL есть:.false.true.true.mykind В последнем примере константа mykind должна быть предварительно определена как скалярная именованная константа INTEGER со значением параметра разновидности LOGICAL (1 или 4 в LF95). Два первых примера имеют тип LOGICAL по умолчанию. Литералы CHARACTER Такой литерал состоит из цепочки символов, заключенных в соответствующие кавычки или апострофы, перед ним могут располагаться параметр разновидности и знак подчеркивания. Если внутри цепочки CHARACTER, заключенной в кавычки, встречается кавычка, ее нужно удвоить. Такая удвоенная кавычка считается за один знак. Подобно этому, если внутри цепочки CHARACTER в апострофах встречается апостроф, его нужно удвоить.
Удвоенный апостроф также считается за один знак. Вот примеры правильных литералов CHARACTER: 'Hello world' 'don't give up the ship!' ASCII'foobeedoodah' ' ' ASCII должна быть предварительна объявлен как именованная скалярная константа типа INTEGER со значением 1, чтобы использоваться для указания разновидности. Два последних примера удвоенных кавычек и апострофов есть литералы CHARACTER длины 0. Именованные данные Именованные объекты данных, такие как переменные, именованные константы или результаты функций имеют свойства встроенных или определенных пользователем типов данных, или неявно (по первой букве имени), или по типу оператора объявления. Дополнительная информация о именованных объектах данных, называемая атрибутами объектов данных, может также быть указана или в операторах объявления типа или в отдельных операторах специально для атрибутов.
Если объект данных имеет имя, он становится доступным как единое целое, с помощью ссылки на это имя. Для некоторых объектов данных, таких как цепочка символов, массивы и производные типы, возможен прямой доступ к частям объектов. Кроме того, для ссылки на объекты данных или их части могут устанавливаться псевдонимы (aliases), называемые указателями (pointers). Неявное задание типов При отсутствии операторов объявления типов, тип объекта данных с именем определяется по первой букве его имени. Буквы от I до N означают тип INTEGER, а остальные буквы - тип REAL. Эти неявные правила могут изменяться или отменяться пользователем с помощью оператора IMPLICIT. Оператор IMPLICIT NONE можно использовать для отмены всех неявных назначений типа в пределах программной единицы (scoping unit).
Операторы объявления типа Операторы объявления типа указывают типы, параметры типов и атрибуты именованных объектов данных или функций. Оператор объявления типа можно использовать для каждого встроенного типа INTEGER, REAL (и DOUBLE PRECISION), COMPLEX, LOGICAL или CHARACTER, а также для производных типов (см. 'Производные типы' на стр. Атрибуты Кроме типов и параметров типа, объекты данных или функции могут иметь один или более следующих атрибутов, которые могут быть указаны в операторах объявления типов или в отдельных операторах специально для атрибутов:. DIMENSION - объект данных есть массив (см. 'Оператор DIMENSION' на стр.104).
PARAMETER - объект данных есть именованная константа (см. 'Оператор PARAMETER' на стр. POINTER - объект данных, используемый как псевдоним для других объектов данных того же типа, разновидности и ранга (см. 'Оператор POINTER' на стр. TARGET - объект данных, на который надо ссылаться по псевдониму с атрибутом POINTER (см. 'Оператор TARGET' на стр. EXTERNAL - имя служит именем внешней процедуры (см.
'Оператор EXTERNAL' на стр. ALLOCATABLE - объект данных есть массив не фиксированного размера, память для размещения которого должна отводиться по указанию в процессе выполнения программы (см. 'Оператор ALLOCATABLE' на стр. INTENT - фиктивное значение аргумента, не будет изменяться в процедуре (INTENT (IN) ), не будет снабжено начальным значением при вызове подпрограммы (INTENT (OUT) ), или и начальное значение будет обеспечено и новое значение может иметь место (INTENT (IN OUT) ) (см.'
INTENT Statement' на стр. PUBLIC - именованный объект данных или процедура в программной единице MODULE, доступная из программной единицы, использующей этот модуль (см. 'Оператор PUBLIC' на стр. PRIVATE - именованный объект данных или процедура в программной единице MODULE, доступная только в этом модуле (см. 'Оператор PRIVATE' на стр. INTRINSIC - имя, служащее названием встроенной функции (см. 'Оператор INTRINSIC' на стр.
OPTIONAL - фиктивный аргумент, которому в вызове содержащей его процедуры может не соответствовать никакой фактический аргумент (см. 'Оператор OPTIONAL' на стр. SAVE - объект данных, который сохраняет свое значение, ассоциативный статус association status, и статус расположения в памяти после операторов RETURN или END (см. 'Оператор SAVE' на стр. SEQUENCE - порядок определения компонент в определении производного типа, последовательность расположения в памяти объектов этого тип (см.
'Оператор SEQUENCE' на стр. DLLEXPORT (только Windows) - имя внешней процедуры, модуля, или имя общего (common) блока, который должен быть DLL (см. 'Оператор DLLEXPORT' на стр. DLLIMPORT (только Windows) - имя внешней процедуры, имя модуля, служащего внешней процедурой, имя модуля или общего блока для использования DLL (см.
'Оператор DLLIMPORT' на стр. Подцепочки Цепочка символов есть последовательность символов в объекте данных типа CHARACTER. Символы цепочки нумеруются слева направо, начиная с 1.
Сплошная часть цепочки символов, называемая подцепочкой (substring), может выделяться согласно следующему синтаксису: string ( lower-bound: upper-bound ) Здесь: string есть имя цепочки или литерала CHARACTER. lower-bound есть номер в цепочке самого левого символа подцепочки.
upper-bound есть номер в цепочке последнего символа подцепочки. При отсутствии они получают значения соответственно 1 и длины цепочки. Подцепочка имеет длину 0, если lower-bound больше чем upper-bound. Lower-bound не может быть меньше 1. Например, если abcstring есть имя цепочки 'abcdefg', то abcstring(2:4) есть 'bcd' abcstring(2:) есть 'bcdefg' abcstring(:5) есть 'abcde' abcstring(:) есть 'abcdefg' abcstring(3:3) есть 'c' 'abcdef'(2:4) есть 'bcd' 'abcdef'(3:2) есть цепочка нулевой длины Массивы Массив есть множество данных, которые все имеют одинаковый тип и параметры типа и представляет вектор или прямоугольную матрицу двух и более измерений. Объект данных, не являющийся массивом, есть скаляр.
Массивы объявляются операторами DIMENSION или операторами объявления типа. Массив имеет ранг, равный количеству измерений массива; скаляр имеет ранг ноль. Форма массива определяется его протяженностью по каждому измерению. Размер массива определяется количеством его элементов. В следующем примере: integer, dimension (3,2):: i i имеет ранг 2, форму (3,2) и размер 6. Ссылки на массив На массив в целом ссылаются по имени массива. На индивидуальные элементы или секции массива ссылаются с помощью индексов массива.
Синтаксис: array (subscript-list) Здесь: array есть имя массива. Subscript-list есть разделенный запятыми список из element-subscript или subscript-triplet или vector-subscript. Element-subscript есть скалярное выражение типа INTEGER. Subscript-triplet есть element-subscript: element-subscript : stride stride есть скалярное выражение типа INTEGER. Vector-subscript есть INTEGER array expression ранга 1. Индексы в subscript-list относятся каждый к измерению массива. Самый левый индекс относится к первому измерению массива.
Элементы массива Если каждый индекс в списке индексов массива есть элементарный индекс, то такая ссылка на массив означает его отдельный элемент. В противном случае это есть ссылка на секцию массива (см. 'Секции массива ' на стр. Порядок элементов в массиве Элементы массива образуют последовательность, называемую порядком элементов массива. Позиция элемента массива в этой последовательности определяется так: (1 + (s1 - j1)) + ((s2 - j2) x d1) +. + ((sn - jn) x dn-1 x dn-2.
X d1) Здесь: si есть индекс в измерении i. Ji есть нижняя граница i-го измерения. Di есть размер i-го измерения. N есть ранг массива. Другой путь описания порядка элементов массива состоит в том, что индекс самого левого измерения меняется наиболее часто при движении от первого элемента к последнему в порядке элементов массива. Например, в следующем коде: integer, dimension(2,3):: a порядок элементов есть a(1,1), a(2,1), a(1,2), a(2,2), a(1,3), a(2,3).
Порядок элементов используется при производстве ввода/вывода массивов. Секции массивов Можно ссылаться на некоторую часть массива как на массив. Такие порции называются секциями массивов. Секция массива имеет список индексов, который содержит по крайней мере один индекс, который есть или индекс-триплет или вектор-индекс (см.
Ниже примеры в 'Индексы-триплеты' и 'Вектор-индексы'). Заметим, что секция массива только из одного элемента не есть скаляр. Индексы-триплеты Три компоненты индекса-триплета есть соответственно нижняя граница секции массива, верхняя граница и шаг (приращение между последовательными индексами в секции). Любые из них или все три могут отсутствовать. Если опущена нижняя граница, на ее месте предполагается объявленная нижняя граница измерения.
Если опущена верхняя граница, предполагается верхняя граница измерения. Если опущен шаг. Предполагается шаг 1.
Шаблон для word реферат. Шаблоны рамок по госту Здесь можно скачать бесплатно шаблоны рамок А4 для чертежей, рефератов, курсовых, дипломов.
Правильные примеры секций массивов с триплетами: a(2:8:2)! A(2), a(4), a(6), a(8) b(1,3:1:-1)! B(1,3), b(1,2), b(1,1) c(:,:,:)!
C Вектор-индексы Вектор-индексы (вектор есть одномерный массив) могут использоваться для ссылки на секцию всего массива. Рассмотрим следующий пример: integer:: vector(3) = (/3,8,12/) real:: whole(3,15). Print., whole(3,vector) Здесь массив vector использован как индекс массива whole в операторе PRINT, который печатает значения элементов (3,3), (3,8) и (3,12). Массивы и подцепочки Секция массива CHARACTER или элемент массива может иметь спецификацию подцепочки вслед за списком индексов. Если весь массив или его секция имеет спецификатор подцепочки, то это ссылка на секцию массива.
Например: character (len=10), dimension (10,10):: mystring mystring(3:8,:) (2:4) = 'abc' присваивает 'abc' секции массива, состоящей из символов по порядку 2,3,4 в рядах от 3 до 8 в массиве mystring типа CHARACTER. Динамические массивы Массив может иметь фиксированный размер во время компиляции или может предполагать определение размеров и формы во время исполнения несколькими способами:. размещаемые (allocatable) массивы и массивы указателей могут получать память когда нужно с помощью операторов ALLOCATE и освобождать ее с помощью операторов DEALLOCATE. Массив указателей предполагает форму его назначения, когда используется оператор присваивания указателям (см. 'Размещаемые массивы' на стр.
13 и 'Массивы указателей' на стр. Размещаемые массивы и массивы указателей вместе называются массивы с отложенной формой. Фиктивный массив может получать размер и форму на основании размера и формы соответствующего фактического аргумента (см. 'Массивы предполагаемой формы' на стр. Фиктивный массив может иметь необъявленный размер (см. 'Массивы предполагаемого размера' на стр. Массив может иметь переменные измерения на основе значений фиктивных аргументов (см.
'Настраиваемые и автоматические массивы' на стр. Размещаемые массивы Атрибут ALLOCATABLE может быть придан массиву в операторе объявления типа или в операторе ALLOCATABLE. Размещаемый массив должен быть объявлен со спецификатором отложенной формы, `:', для каждого измерения. Например: integer, allocatable:: a(:), b(:,:,:) объявляет два размещаемых массива, один с рангом один и другой ранга три. Границы, а тем самым и форма размещаемого массива определяются, когда ему отводится память по оператору ALLOCATE. Продолжая предыдущий пример, allocate (a(3), b(1,3,-3:3)) отводит память для массива ранга 1 размера 3 и массива ранга 3 и размера 21 с нижней границей -3 по третьему измерению.
Память, занятая размещаемым массивом, возвращается в систему по оператору DEALLOCATE. Массивы указателей Атрибут POINTER может придаваться массиву оператором объявления типа или в операторе POINTER. Массив указателей, подобно размещаемому массиву, объявляется с спецификатором отложенной формы, `:', для каждого измерения. Например: integer, pointer, dimension(:,:):: c объявляет массив указателей ранга два. Массив указателей помещается в память тем же путем, как и размещаемый массив.
Дополнительно, форма массива указателей может быть установлена, когда указатель ассоциируется с назначением в операторе присваивания указателю. Тогда форма устанавливается по форме назначения. Integer, target, dimension(2,4):: d integer, pointer, dimension(:,:):: c c = d В этом примере массив c становится ассоциированным с массивом d и принимает форму массива d. Массивы предполагаемой формы Массив предполагаемой формы есть фиктивный массив, принимающий форму соответствующего фиктивного аргумента. Нижняя граница массива с предполагаемой формой может быть объявлена и может отличаться от соответствующей границы фактического аргумента-массива.
Спецификация предполагаемой формы есть lower-bound: для каждого измерения массива предполагаемой формы. Integer:: a(3,4). Subroutine zee(x) implicit none integer, dimension(-1:,:):: x.
Здесь фиктивный массив x предполагает форму фактического аргумента a с новой нижней границей для измерения один. Инструкция по охране труда при пользовании газовой плитой. Интерфейс для массива предполагаемой формы может быть явным (см.
'Явные интерфейсы' на стр. Массивы предполагаемого размера Массив предполагаемого размера есть фиктивный массив, размер которого не известен. Все границы, кроме верхней границы последнего измерения, указаны в объявлении фиктивного массива.
В объявлении верхняя граница последнего измерения обозначается звездочкой. Оба массива имеют тот же самый начальный элемент массива и ассоциированы по памяти. Нельзя ссылаться на массив с предполагаемым размером в контексте, где форма массива должна быть известна, таком как ссылка на весь массив или во многих встроенных функциях преобразования массива. Результат функции не может быть массивом предполагаемого размера. Integer a dimension a(4).
Subroutine zee(x) integer, dimension(-1:.):: x. В этом примере размер фиктивного массива x не известен. Настраиваемые и автоматические массивы Можно устанавливать форму массива на основании значений фиктивных аргументов. Если такой массив есть фиктивный массив, он называется настраиваемым (adjustable) массивом. Если массив не есть фиктивный массив, он называется автоматическим массивом. Рассмотрим следующий пример: integer function bar(i, k) integer:: i,j,k dimension i(k,3), j(k).
Здесь формы массивов i и j зависят от значения фиктивного аргумента k. I есть настраиваемый массив, а j есть автоматический массив. Конструкторы массивов Конструктор массива есть массив без имени.
Синтаксис: ( / constructor-values / ) Здесь constructor-values есть разделенный запятыми список expr или ac-implied-do, где expr есть выражение. Ac-implied-do есть ( constructor-values, ac-implied-do-control ), ac-implied-do-control есть do-variable = do-expr, do-expr , do-expr, do-variable есть скалярная переменная типа INTEGER. Do-expr есть скалярное выражение типа INTEGER. Конструктор массива есть массив ранга один.
Если элемент конструктора есть сам массив, то значения его элементов, расположенных в порядке элементов массива, представляют соответствующую последовательность элементов конструктора массива. Если какое-то значение конструктора есть implied-do, оно расширяется в последовательность значений под управлением индекса цикла как в конструкте DO (см. 'Конструкт DO' на стр. Integer, dimension(3):: a, b=(/1,2,3/), c=(/(i, i=4,6)/) a = b + c + (/7,8,9/)! A присваивается (/12,15,18/) Конструктор массива может быть изменен с помощью встроенной функции RESHAPE и может быть затем использован для инициализации или представления массивов с рангом больше чем один.
Например: real,dimension(2,2):: a = reshape((/1,2,3,4/),(/2,2/)) присваивает (/1,2,3,4/) массиву a в порядке элементов массива после изменения для соответствия с формой массива a. Производные типы Производные типы есть определяемые пользователем типы данных на основе встроенных типов INTEGER, REAL, COMPLEX, LOGICAL и CHARACTER. В то время как массив есть множество данных одного типа, производный тип может представлять комбинацию встроенных типов и других производных типов. Объект данных производного типа называется структурой. Определение производного типа Производный тип должен быть определен до объявления объектов этого типа.
В определении производного типа указывается имя нового типа и имена типов его компонент. Синтаксис: derived-type-statement private-sequence-statement type-definition-statement type-definition-statement. END TYPE type-name Здесь derived-type-statement есть оператор производного типа.
Private-sequence-statement есть оператор PRIVATE или оператор SEQUENCE. Type-definition-statement есть оператор INTEGER, REAL, COMPLEX, DOUBLE PRECISION, LOGICAL, CHARACTER или TYPE. Оператор определения типа в составе определения производного типа может иметь только атрибуты POINTER и DIMENSION. Он не может быть функцией. Ему может быть придано инициализирующее значение по умолчанию, и в этом случае компоненты получают атрибут SAVE.
Компонента-массив может быть массивом отложенной формы, если присутствует атрибут POINTER, в остальных случаях он должен иметь явную форму. Type coordinates real:: latitude, longitude end type coordinates type place character(len=20):: name type(coordinates):: location end type place type link integer:: j type (link), pointer:: next end type link В предыдущем примере тип coordinates есть производный тип с двумя компонентами типа REAL: latitude and longitude.
Тип place имеет две компоненты: name типа CHARACTER длины двадцать и структуру типа coordinates с именем location. Тип link имеет две компоненты: INTEGER с именем j и структуру типа link, с именем next, которая есть указатель на тот же самый производный тип.
Компонента структуры может иметь тот же самый тип, что и сам производный тип только если он имеет атрибут POINTER. Таким способом могут формироваться связные списки, деревья и графы. Есть два пути использования производных типов в более чем одной программной единице.
Предпочтительный путь состоит в определении производного типа в модуле (см.' Программные единицы модули' на стр.55) и использовать этот модуль там, где нужен производный тип. Другой метод, без модулей, состоит в употреблении оператора SEQUENCE в определении производного типа и в определении производного типа точно тем же способом в каждой программной единице, где этот тип используется. Это можно сделать с помощью файла include. Компоненты производного типа могут быть сделаны недоступными другим программным единицам использованием оператора PRIVATE перед всеми компонентами операторов определений.
Объявление переменных производного типа Переменные производного типа объявляются оператором TYPE. Вот примеры объявления переменных для каждого из определенных выше производных типов: type(coordinates):: mycoordinates type(place):: mytown type(place), dimension(10):: cities type(link):: head Ссылки на компоненты На компоненты структуры ссылаются с помощью оператора `%'. Например, на latitude в структуре mycoordinates нужно ссылаться как mycoordinates%latitude. На latitude в типе coordinates в структуре mytown ссылаются так: mytown%coordinates%latitude. Если переменная есть массив структур, как в случае объявленного выше cities, на секции массива ссылаются как cities(:,:)%name, что означает ссылку на компоненту name для всех элементов массива cities, или как cities(1,1:2)%coordinates%latitude что означает ссылку на элемент latitude типа coordinates для элементов (1,1) и (1,2) массива cities. Заметим, что в первом примере синтаксис cities%name эквивалентен и представляет секцию массива. Конструкторы структур Конструктором структуры называется структура без имени.
Синтаксис: type-name ( expr-list ) где type-name есть имя производного типа, expr-list есть список выражений. Каждое выражение в expr-list должно быть согласовано по количеству и порядку с соответствующими компонентами производного типа. Там где необходимо, производятся конверсии встроенных типов. Например, для компонент не-указателей форма выражений должна соответствовать форме компонент. Определение производного типа integer:: i,j character(len=40):: string end type mytype type (mytype):: a! Объявление производного типа a = mytype (4, 5.0.2.3, 'abcdefg') В этом примере второе выражение в конструкторе структуры приводится к типу по умолчанию INTEGER при присваивании.
Указатели В Fortran указатель есть псевдоним. Переменная, псевдонимом которой он служит, есть его назначение. Указательные переменные должны иметь атрибут POINTER; переменные назначения должны иметь атрибут или TARGET или POINTER. Ассоциирование Pointer с Target Указатель может ассоциироваться только с переменной, которая имеет атрибут TARGET или POINTER. Такая ассоциация может быть осуществлена одним из двух путей:. явно оператором присваивания указателю.
неявно с помощью оператора ALLOCATE. Если ассоциация между указателем и назначением установлена, всякая ссылка на указатель применяется к назначению. Объявление указателей и назначений Переменная может быть объявлена имеющей атрибут POINTER или TARGET в операторе объявлении типа, или в операторе POINTER или TARGET. Когда массив объявляется как указатель, нужно объявлять массив с отложенной формой.
Пример: integer, pointer:: a, b(:,:) integer, target:: c a = c! Оператор присваивания указателю! A есть псевдоним для c allocate (b(3,2))! Оператор allocate!
Безымянное назначение для b! Создается в форме (3,2) В этом примере явная ассоциация создается между a и c через оператор присваивания указателю. Заметим, что a была ранее объявлена указателем, c была ранее объявлена назначением, и а и c согласованы в типе, разновидности и ранге. В операторе ALLOCATE целевой массив размещается и b становится указателем на него. Массив b был объявлен с отложенной формой, так что массив назначения мог быть размещен с любой формой ранга два. Выражение состоит из операндов, операторов и скобок.
Вычисление выражения производит значение с типом, параметрами типа (разновидность и в случае CHARACTER длина) и формой. Вот несколько примеров правильных выражений Fortran: 5 n (n+1).y 'to be' // ' or not to be' // text(1:23) (-b + (b.2-4.a.c).5) / (2.a) b%a - a(1:1000:10) sin(a).le.5 l.mybinaryoperator. R +.myunaryoperator. M В последнем примере используются определяемые пользователем операции (см.
'Определяемые операции' на стр. Все операнды-массивы в выражении должны иметь одинаковую форму. Скаляр может преобразовываться в любую форму.
Фортран 90
Выражения с значениями-массивами вычисляются поэлементно для соответствующих элементов каждого массива и скаляр в таком выражении рассматривается как массив, все элементы которого имеют значение скаляра. Например, выражение a(2:4) + b(1:3) + 5 будет превращено в a(2) + b(1) + 5 a(3) + b(2) + 5 a(4) + b(3) + 5 Выражения вычисляются в соответствии с правилами приоритета операторов, описанными ниже. Если имеются кратные соседние операции одного приоритета, то вычитания и деления выполняются слева направо, возведения в степень производятся справа налево, а остальные операции могут производиться любым путем в зависимости от оптимизирующих действий компилятора.
Скобки могут использоваться для установления нужного порядка действий. Спецификационным выражением называется скалярное выражение типа INTEGER, значение которого можно вычислить при входе в программную единицу во время ее выполнения. Инициализируемым выражением называется выражение, значение которого можно вычислить во время компиляции. Встроенные операции Перечислим встроенные операции в порядке уменьшения их приоритета: Table 2: Встроенные операции Оператор Действие Операнды. возведение в степень два числа.
и / умножение и деление два числа + и - одноместные плюс и минус одно число + и - бинарные сложение и вычитание два числа // конкатенация два CHARACTER.EQ. И равно два числа или два CHARACTER.NE. И /= не равно.LT. И больше чем.GE. And = больше чем или равно.NOT. Логическое отрицание один LOGICAL.AND.
Логическая конъюнкция два LOGICAL.OR. Логическая дизъюнкция два LOGICAL.EQV. Логическая эквивалентность two LOGICAL.NEQV.
И не-эквивалентность Замечание: все операции в этой части таблицы имеют одинаковый приоритет Если некая операция произведена над операндами одного типа, результат будет иметь тот же тип и больший из двух параметр разновидности. Если операция произведена над численными операндами разных типов, результат будет иметь высший из типов операндов, причем COMPLEX выше чем REAL, а REAL выше чем INTEGER. Если операция произведена над численными или LOGICAL операндами одинакового типа, но разных разновидностей, результат будет иметь разновидность операнда, имеющего большую точность. Результат конкатенации имеет длину, равную сумме длин операндов. Деление типа INTEGER Результат операции деления INTEGER операндов есть целое, ближайшее к точному отношению операндов в промежутке между нулем и этим отношением.
Например, 7/5 вычисляется как 1, а -7/5 - как -1. В Fortran ввод и вывод производятся на логических устройствах. Устройством может быть:. неотрицательное INTEGER, связанное с физическим устройством, таким как консоль или принтер. Устройство может быть связано с файлом или устройством в операторе OPEN, исключая случай предварительно связанных файлов.
звездочка, `.' , указывающая устройство стандартного ввода и стандартного вывода, обычно это предварительно подключенные клавиатура или monitor. переменная типа CHARACTER соответствующая имени внутреннего файла.
Операторы Fortran'а могут подключать (OPEN) или отключать (CLOSE) файлы и устройства из ассортимента ввода/вывода; передавать данные (PRINT, READ, WRITE); устанавливать позицию в файле (REWIND, BACKSPACE, ENDFILE); запрашивать файл или устройство об их связях (INQUIRE). Предварительно подключенные устройства ввода/вывода Устройства ввода/вывода 5, 6 и. автоматически подключаются при использовании. Устройство 5 связано со стандартным устройством ввода, обычно клавиатурой, а устройство 6 связано со стандартным выводом, обычно монитором. Устройство. постоянно связано со стандартным вводом и стандартным выводом. Устройства вывода Файлы Fortran рассматривает все физические устройства, такие как файлы на дисках, консоль, принтеры и внутренние файлы как файлы.
Файл есть последовательность из нуля или более записей. Формат данных (форматированные или нет), тип доступа (прямой или последовательный) и длина записи определяют структуру файла. Позиция в файле Некоторые операторы ввода/вывода влияют на позицию в пределах внешнего файла.
До выполнения оператора передачи данных указанный файл устанавливается на позицию начала записи, указанной спецификатором записи REC= в операторе передачи данных. По умолчанию последовательный файл устанавливается на позицию после последней записанной или прочтенной записи. Но если указан не продвигающий (non-advancing) ввод/вывод с помощью спецификации ADVANCE=, то можно читать или писать определенные записи и читать записи переменной длины с уведомлением об их длине.
Оператор ENDFILE записывает признак конца фала после последней прочтенной или записанной записи и устанавливает файл на позицию после конечной записи. Оператор REWIND устанавливает файл в начальную позицию. Оператор BACKSPACE сдвигает позицию файла на одну запись назад. Если обнаружена ошибка, позиция файла не определена.
Если ошибок нет и прочтена или записана конечная запись файла, файл устанавливается на позицию после последней записи. В этом случае он должен быть переустановлен перед продолжением чтения или записи операторами REWIND или BACKSPACE. При не продвигающем вводе выводе некоторой записи, если не было ошибок и не достигнут конец файла, но появился сигнал конца записи, файл устанавливается на позицию после только что прочтенной записи.
Если сигнала конца не было, позиция файла не меняется. Типы файлов Тип файла, намеченного для доступа, указывается в операторе OPEN с помощью спецификаторов FORM= и ACCESS= (см.' Оператор OPEN' на стр.
Попробовать написать здесь свой первый пост меня подтолкнула, где предлагает использовать для обучения C. Да, на данную тему было сломано множество копий. Я, как и наверное большинство школьников на просторах нашей необъятной Родины, начинал постигать азы через синий экран, но не смерти, а Turbo Pascal 7.0. Был конечно и Basic, с котором я впервые столкнулся в дошкольном возрасте на советском компьютере «Электроника». Тогда он казался странным текстовым редактором, ведь компьютер глазами ребенка создан для игр. Однако уже в институте я познакомился с языком Fortran, познав который, я до сих пор недоумеваю, почему он не используется для обучения. Да, многие скажут, что язык мертвый, не соответствует современным реалиям, а учебники с названием, как на картинке, вызывают лишь улыбку.
Я попробую объяснить, чем же так замечателен этот язык и почему я его рекомендую в качестве первого языка. Если заинтересовало, добро пожаловать под кат. Я считаю, что базис по основам программирования должен закладываться еще в школьные годы, хотя бы в старших классах. Даже если в жизни компьютер будет использоваться только для набора текста в Word'е или для общения в социальных сетях, минимальные знания о том, что такое алгоритм и как структурировать последовательность действий, чтобы получить нужный результат, по крайней мере не повредят молодому отроку во взрослой жизни, а скорей всего помогут сформировать особый склад ума.
Для того, чтобы уроки информатики были в радость, а не снились в кошмарных снах, обучаемый должен понимать, что он делает, как он это делает и почему получается так, а не иначе. Ведь по сути нужно правильно донести информацию о цикле и условном операторе, чтобы человек мог писать программы самостоятельно. При этом, чем проще синтаксис языка, тем легче понять логику написания кода. Если же человек научится составлять правильный алгоритм, то для программирования на других языках, ему понадобится только узнать синтаксис этого языка, а базис уже будет заложен. Чем же так замечателен Фортран? Обратимся к истории создания этого языка.
Появился он в далекие 50-е годы прошлого века, когда компьютеры еще были большие, программистов было мало, а информатика не преподавалась в школе, да и вообще считалась лженаукой. Нужен был простой язык, который помогал бы инженерам и ученым «скармливать» ЭВМ формулы, написанные на бумаге, пусть даже через перфокарты. Отсюда и название самого языка: Formula Translator или же «переводчик формул». Изначально язык был ориентирован на людей без специальной подготовки, а значит должен был быть максимально простым.
Цифровая копия официального ключа активации (CD KEY) King's Bounty: Перекрестки миров. Мгновенная доставка! Код Ключа Активации на игру King's Bounty: Перекрестки миров отображается в браузере сразу после оплаты! King's Bounty: Перекрестки миров – масштабное дополнение к знаменитой. При запуске игры вылезает окошко с надписью: 'Этот продукт требует активации. Введите серийный номер и нажмите 'Далее'. Требуется подключение к Интернет.' , а ключа нет. Откуда взять ключ или как запустить игру без активации? Благодарю за ответ! 10 yorumdan 1 ile 10 arası gösteriliyor. Пользователь Влад Макрушин задал вопрос в категории Добро пожаловать и получил на него 1 ответ. Скачать бесплатно ключ для King's Bounty Перекрестки Миров NoDVD, nocd, crack. Перекрёстки миров » — это дополненная версия игры King's Bounty: Принцесса в доспехах, в которую Легенда о рыцаре, ни King's Bounty: Принцесса в доспехах). Для активации игры необходимо интернет- соединение. Львиное Сердце (1С) King ` s Bounty: Перекрестки миров (1С) King. Ключ для активации king s bounty.
Что ж, простота создателям удалась. Классическая первая программа выглядит следующим образом: program hw write(.,.) 'Hello, World!' End Синтаксис даже чуть проще Паскаля, нет необходимости ставить в конце строки ';' или ':' перед знаком равенства. Более того, людям, обладающих минимальным знанием английского языка, понять смысл простейшей программы не составит труда.
Тут я хочу отметить, что Фортран имеет несколько ревизий стандартов, основными из которых являются 77 и 90 (при этом сохраняется преемственность). 77 Фортран действительно архаичен, есть ограничение на длину строки, и необходимо делать отступ в начале строки, что может вызвать у молодого кандидата в программисты культурный шок. Недаром программы, написанные на 77 Фортране, получили из уст моего знакомого емкое название «Брежневский код». Поэтому весь мой текст относится к стандарту языка 90 и новее.
Для примера, приведу код для вычисления суммы неотрицательных целых чисел от 1 до n, вводимого с клавиатуры, написанный моей дипломницей при обучении её программированию с нуля. Именно на ней я испытал преподавание Фортрана в качестве первого языка. Надеюсь, что для неё это пошло на пользу, а мой экперимент удался. По крайней мере основы она усвоила за пару занятий, первое из которых ушло на лекцию про язык. Program chisla implicit none!
Variables integer n,i,s! Body of chisla s=0 write (.,.) 'Введите n' read (.,.) n if (n.le.0) then write (.,.) 'Отрицательное или ноль' else do i=1,n s=s+i end do write (.,.) 'Сумма=', s end if end Нетрудно заметить, что как мы думаем, так и записываем код.
Никаких сложностей у обучаемого не может возникнуть в принципе. Внимательный читатель конечно же спросит, что за implicit none и две звездочки в скобках через запятую. Implicit none говорит нам, что мы явно указываем тип переменных, тогда как без данной записи компилятор будет сам угадывать тип. Первая звездочка означает, что ввод и вывод происходят на экран, а вторая говорит о том, что формат ввода-вывода определяется автоматически.
Собственно, программы на Фортране выглядит не сложнее, чем написанный выше кусок кода. А что насчет программной среды? В школах, да и в любых госучреждениях, часто встает вопрос о программном обеспечении, в частности об его лицензионности. Потому как деньги на эти нужды особо не выделяются. По крайней мере в мое время, с этим была проблема, может сейчас ситуация изменилась в лучшую сторону.
Для написания программ на Фортране подойдет любой текстовый редактор. Если хочется подсветки синтаксиса, то можно использовать Notepad (поддерживает синтаксис только 77 стандарта) или SublimeText.
Фортран 90 Учебник
Программу написали, чем будем компилировать? Тут все просто, можно использовать свободный GNU Fotran. Если использование планируется некоммерческое, то разрешается замахнуться и на компилятор от Intel, который хорошо оптимизирован под одноименные процессоры и поставляется с минимально необходимым IDE. Порог вхождения весьма льготный. Лучшей средой разработки под Фортран по мнению многих пользователей остается Compaq Visual Fortran 6.6, последняя версия которого увидела свет в начале 2000-х.
Почему же так сложилось, что среда, основанная на Visual Studio 6.0, которая без танцев с бубном заводится максимум на Windows XP 32 bit, и имеет ограничение на используемую память, снискала такую популярность среди фортранщиков. Ответ приведен на рисунке ниже. Это Compaq Array Visualizer, который представляет собой очень удобный инструмент по визуализации 1, 2 и 3-х мерных массивов в процессе отладки программы непосредственно из дебаггера. Как говорится, попробовав раз, ем и сейчас. Дело в том, что Фортран сейчас используется в основном в науке (о чем будет сказано позже), в частности в той области, с которой я имею дело, а именно в физике атмосферы. При отладке программ массивы представляют собой различные метеорологические поля, такие как температура, давление, скорость ветра.
Искать ошибку в графических полях гораздо проще, чем в наборе цифр, тем более, обычно известно, как примерно должно выглядеть поле, поэтому очевидные ошибки отсекаются моментально. К сожалению, все наработки по компилятору перешли от Compaq к Intel. Intel первоначально поддерживала Array Visualizer, правда, уже те версии были бледным отражением продукта от Compaq, работать с ними было не так удобно, как прежде, но хотя бы минимальная работоспособность поддерживалась. Увы, Intel перестала разрабатывать новые версии Array Visualizer'а, поставив крест на этом удобнейшем инструменте. Именно поэтому фортрановское сообщество в основной своей массе пишет программы и занимается их отладкой под Compaq Visual Fortran на Windows, а боевые расчеты запускает на серверах под Linux, используя Intel-овские компиляторы. Интел, пожалуйста, услышь мольбы пользователей, верни нормальный инструмент для визуализации массивов в свой дебаггер! Место Фортрана в современном мире А сейчас мы подошли к той самой теме, которая обычно вызывает бурную дискуссию с моими коллегами, использующими Matlab, которые утверждают, что описанный в данном посте раритетный язык ни на что не годится.
Тут я с ними не соглашусь. Дело в том, что Фортран исторически использовался в инженерных или научных расчетах, а потому со временем обрастал множеством готовых библиотек и кодами программ решения той или иной задачи. Код в буквальном смысле передается из поколения в поколение, да еще и хорошо документируется.
Можно найти множество готовых решений уравнений математической физики, линейной алгебры (здесь следует отметить удачную реализацию работы с матрицами), интегральных и дифференциальных уравнений и многого-многого другого. Наверное тяжело найти задачу из области физмат наук, для которой не был бы реализован алгоритм на языке Фортран. А если учесть отличную оптимизацию интеловских компиляторов под интеловские же процессоры, поддержку параллельных вычислений на высокопроизводительных кластерах, то становится понятно почему в научной среде этот язык занимает заслуженное первое место. Думаю, на любом суперкомпьютере можно найти установленный фортрановский компилятор.
Большинство серьезных моделей, по крайней мере из области физики атмосферы, написаны именно на Фортране. Да-да, прогноз погоды, которым каждый интересуется время от времени, получается в ходе расчетов моделей, написанных на этом языке. Более того, язык не находится в стагнации, а постоянно совершенствуется.
Так, после описанных раннее стандартов 77 и 90, появились новые редакции 95, 2003, 2008, поддержка которых внедрена в актуальные компиляторы. Последние версии Фортрана несколько освежили старый проверенный временем язык, превнеся поддержку современного стиля, добавив объектно-ориентированное программирование, отсутствие которого было чуть ли не самым главным козырем противников этого языка. Более того, The Portland Group выпустила PGI CUDA Fortran Compiler, позволяющий проводить высокопараллельные расчеты на видеокартах. Таким образом, пациент более чем жив, а значит программисты на Фортран остаются востребованными до сих пор. Вместо послесловия А теперь я хотел бы вернуться к изначально затронутой теме об обучении программированию, и попытаться тезисно сформулировать основные плюсы Фортрана при выборе его в качестве первого языка. Фортран очень прост в обучении, синтаксис понятен неподготовленному человеку.
Познав основы, легко переучиться на любой другой язык. Бесплатный набор средств позволяет не получать лишних вопросов от правообладателей. Язык знаком преподавателям, так как существует давно, а учителя у нас в основном представители старшего поколения. Широко распространен по всему миру и является кладезем всевозможных библиотек. Стандартизирован, кроссплатформеннен и совместим с более ранее ревизиями. Полезен для студентов технических, а особенно физмат специальностей, ввиду ориетации на научные и инженерные вычисления.
Актуален и востребован и по сей день. Так почему же не Фортран? Метки:. Добавить метки Пометьте публикацию своими метками Метки лучше разделять запятой. Например: программирование, алгоритмы. Если бы у меня был ребенок, я бы хотел, чтобы обучение для него было в радость, и всё было понятно. Чтобы он мог представить алгоритм и вбить код на компьютере, прилагая минимальное количество усилий.
Ведь в программирование главное затянуть. Если с самого начала обучаемый сталкивается с чем-то непонятным, то возможно желание разбираться дальше и не возникнет, да все закончится на первом занятии.
Я не говорю, что Фортран — панацея, давайте все перейдем на него. Я говорю, что это один из вариантов затянуть в удивительный мир программирования:). Да я не спорю, что он легкий. Но я так и не увидел его плюсов относительно Паскаля и Дельфей. Причем как верно ниже заметили, порой Паскаль даже легче или уж точно не сложнее. По крайней мере мне, если я был бы незнаком с программированием, вполне себе было бы понятно, что такое println('Hello world'); Но не очень понятно, что такое write (.,.) 'Hello world' Зачем эти звездочки и скобки? Понятно, что это ерунда и разобраться — дело минуты.
Но вот уже пример того, что Фортран в данном случае не легче Паскаля. А если дальше копать, то может и еще что вскроется. Когда пытался использовать gfortran для своих программ (небольших и учебных), меня просто убивала неинформативность выдаваемых компилятором ошибок. Или, как вариант, программа могла откомпилироваться и выдать «segmentation fault» сразу после старта без объяснения причин. Из отладчиков я пробовал только gdb, но весь процесс отладки оставил впечатление чего-то очень долгого и болезненного. Есть ли более удобные инструменты для поиска ошибок и отладки? Будьте внимательны, программа на f77 не откомпилируется, если не сделать семь отступов в начале каждой строчки.
Статья интересна с общеобразовательной точки зрения. Но: Беда нашей системы образования в том, что она плодит теоретиков — людей, который впоследствии только и могут, что преподавать в тех же ВУЗах, где они учились. Зачем учить студентов Фортрану? Пусть рисуют блок-схемы. Еще нагляднее, еще понятнее. Почему не учить программировать на python, к примеру? Вполне живой язык, имеющий огромное практическое применение, поддерживающий любые парадигмы программирования, с простым порогом вхождения.
Вообщем (с) «Какое низкое коварство. Полуживого забавлять». Нетрудно заметить, что как мы думаем, так и записываем код Обратное верно. Программированию стоит учиться, чтобы научиться думать больше и лучше. Например, лисп, пролог, смолтолк и D несут в себе заряды идей, которые меняют во многом сам образ мышления. Пролог ломает голову декларативностью, лисп — макросами, смолтолк — объектами и интерфейсами, D — статическим метапрограммированием.
Поломанная голова срастается и становится крепче, чем была когда-либо до этого. Суть такого обучения понятна и очевидна. Фортран же, равно как и питон и даже С — языки практические и потому неинтересные. Они во многом впитывают чужие идеи, подстраивая их под свой синтаксис и свою инфраструктуру. Плюсы, например, имеют и объекты, и метапрограммирование, и функции как объекты первого рода, но все это намного больше похоже на эмуляцию, чем реализацию. Как говорил Алан Кей: «Я придумал термин „объектно-ориентированный“, и я уверяю вас, что не имел в виду C». Поэтому может Фортран и годится в качестве первого языка, но разве что первого.
С дидактической точки зрения он не так уж ценен. Относительно простоты синтаксиса — даже из приведенных примеров очевидно, что не такой уж синтаксис и простой у Фортрана. Интуитивность здвесь видят только те, кто уже знает Фортран.
Для сравнения, аналогичная (неэффективная) программа для тех же вычислений на Матлабе: n = input('Enter n:'); if n. Я же специально написал, что речь идет о Фортране 90, а никак не 77, о котором ходят только страшилки. Своим постом я никак не хотел задеть чувства верующих приверженцев того или иного языка программирования, а обратить внимание на незаслуженно списанный на пенсию Fotran. Я не призываю обязательно изучать его, а рассматривать, как альтернативу традиционному Паскалю/Бейсику/ Честно говоря, перед публикацией я опасался, что вернусь в рид-онли, затронув такую холиварную тему, а тем более, влезая с «дедовским» языком.
Я рад, что мне удалось хоть чуть-чуть поучаствовать в популяризации Фортрана. Если хотя бы пару человек захотят посмотреть, как это работает, или расскажет друзьям — уже хорошо. Ведь до прямого контакта с Фортраном я тоже опирался на мифы и легенды древней Греции слухи. Теперь познакомившись чуть ближе, готов рекомендовать его.
Не так он страшен, как о нем говорят. В защиту старичка родом из 50-х можно сказать, что одно из крупнейших открытий человечества за последние годы (а именно открытие в 2012-м году новой фундаментальной частицы — бозона Хиггса), было сделано при непосредственном участии многих тысяч строк фортрановского кода: Фортран используется для Монте-Карло генерации событий, для моделирования различных их свойств. Которые затем уже проверяются экспериментально. C-ные варианты генераторов событий, конечно, наращивают присутствие в физике элементарных частиц, но пока даже не догнали фортрановские по частоте использования. Фортран — это обыкновенный структурный язык, поэтому как и всякий подобный язык (С например) он хорош только до определенной сложности программ. В последнее время его используют всё реже, даже привыкшие к нему матерые физматовцы, из-за того, что сложность программ резко выросла, а также из-за того, что поддержка новых аппаратных устройств, таких как GPU, Intel Phi на С сделана лучше: CUDA Fortran по сравнению с CUDA C — продукт вторичный и глючный, а OpenCL и Cilk Plus для фортрана не существуют. Попытки в сложных программах использовать квази ООП-шные фичи фортрана рождают преимущественно страшных неподдерживаемых уродцев.
Конечно, Фортран хорош тем, что он простой, как валенок. В общем-то студенты его осваивают за пару недель, и даже пишут на нем программы, которые затем включаются в эти мифические «библиотеки долгой поддержки». Проблем в том, что качество программ в таких библиотеках ровно такое, какое могут предоставить студенты, изучившие программирование за пару недель. И эти библиотеки все равно приходится переписывать при переходе на новые аппаратные платформы. Сам я на фортране программирую уже лет 15 и повидал на нём всё, что только можно.
Фортран для изучения в качестве первого языка не лучше и не хуже того же Паскаля. А вот его «востребованность» я бы поставил по сильное сомнение.