Синтаксис языка программирования fortran
Синтаксис языка Фортран, выражения
К простейшим элементам синтаксиса языка относят: константы, имена, знаки и имена операций, метки, ключевые слова.
Имена и ключевые слова
Имя дают константе, переменной, операции, массиву, производному типу данных, классу, конструкции, процедуре, модулю, интерфейсу. Действует следующее соглашение об именах:
— имена состоят из латинских букв, цифр 0¸9, символов «_», «$»;
— первым символом имени может быть только буква или символ «$»;
— строчные и прописные буквы не различаются;
— пробелы и знаки препинания, кириллица, греческие буквы, знаки операций и другие специальные символы в именах недопустимы;
— длина имени не более 31 символа.
Объекты программ, в отличие от однобуквенных математических обозначений (s=v*t), принято именовать со смыслом: Space=Velocity*Time.
Ключевые слова (основные – смотри раздел 8.5) – это имена, используемые в Фортран для операторов, атрибутов, некоторых операций, конструкций, встроенных функций. Правила те же, кроме:
— .true.и другие ключевые слова в логике обрамляются точками;
— целое в диапазоне 1:99999 используют как метку (для format).
В Фортране соглашение о ключевых словах гибкое: нет резервирования, как в Си. Ключевые слова могут использоваться в качестве обычных имен, лишь бы не возникало двусмысленности. Программисту не обязательно помнить все ключевые слова – ему поможет компилятор.
Пример двусмысленности по ключевому слову max
Константы и переменные встроенных типов
Константу нельзя изменить в процессе исполнения программы, она может быть записана явно как 3.14 или иметь имя, например Pi. Переменная – это именованный объект, значение которого можно изменить.
Имеется пять встроенных типов:
— числовые:целые integer,вещественные real, комплексные complex;
— строковые (символьные) character.
Таблица 16. Примеры оформления констант разных типов
Каждому типу соответствует своя область допустимых значений, особый способ хранения в памяти ПК, объём памяти, набор операций ПК.
Атрибут именованной константы parameter, тип и значение входят в ее описание: real,parameter:: Pi =3.141593.
Выражения
Выражение – осмысленная математическая формула, записанная по правилам языка программирования. В отличие от математики формула записывается в виде строк текста; объекты именуются, значки функций заменены именами функций, которые указаны в описании языка и доступны в помощи. В отличие от других языков программирования, выражение может включать не только переменные, но и массивы. В выражение могут входить:
— константа, переменная, элемент массива;
— массив, секция массива;
— вызов функции с аргументами в скобках, например, cos(х-0.2) ;
— операция с одним операндом, например, –х ;
— операция с несколькими операндами, например, x+y+z ;
— парные круглые скобки ( ), квадратных и фигурных скобок нет.
В зависимости от типов объектов, входящих в выражения, различают:
— арифметические (числовые) выраженияс числовым результатом – выполняются операции над числамицелого, вещественного и комплексного типа, выражения могут быть смешанными;
— логические выражения с логическим результатом: логические операции выполняются над логическими величинами, операции отношения – над числами или строками;
— строковые выражения со строковым результатом – выполняются строковые функции и операция сцепления строк, обозначаемая s//p
Операнды арифметического (числового) выражения могут быть целого, вещественного или комплексного типа.
Таблица 17. В числовом выражении допускаются операции
Операция | Порядок | Пример | Примечания |
Вычисление функции | sin(X) | одноместная (унарная) операция | |
Возведение в степень | X**2 | несколько подряд – справа налево | |
Смена знака | –X | одноместная (унарная) операция | |
Деление, умножение | X/Y, X*Y | несколько подряд – слева направо | |
Сложение, вычитание | X+Y, X-Y | несколько подряд – слева направо |
В компьютере имеются два комплекта арифметических операций – для целых и для вещественных чисел. Действия над комплексными числами выполняются программно по правилам, известным из математики с помощью команд для вещественных чисел. Фортран автоматизирует выбор комплекта операций, руководствуясь типом операндов. Если операнды однотипны, то этого же типа будет операция и результат. Для операций с операндами разных типов результат всегда в наиболее широком классе из числа операндов. Множества чисел расширяются так:
– целые – *1 *2 *4 байта;
Обратите внимание, что выбор из двух разных операций деления производится по общему правилу:
— при делении вещественных чисел в результате – вещественное число, например, 2./3.=0.666667;
— при делении целых чисел в результате – целое число, равное целой части частного, например, 8/3=2 или 2/3=0;
Операция возведения в степень a n и a x вычисляется программно:
— в общем случае для комплексных a,b Здесь a=r+θi представлено в экспоненциальной форме, Ln – комплексный логарифм.
Все переменные, используемые в выражении, должны быть определены к моменту его вычисления.
При вычислении по формулам следует анализировать ОДЗ, чтобы избегать числовых операций с неопределенным результатом:
— деление на нуль x/0;
— деление нуля на нуль 0/0, 0.0/0.0, 0/0.0, 0.0/0;
— возведение нулевого основания в нулевую или отрицательную степень 0**0 0**(-2);
Character*26 :: ab=’abcdefghijklmnopqrstuvwxyz’
Строка после: ab=’nopqrstuvwxyzabcdefghijklm’
Обратите внимание на то, что оператор s1=s1//s2 с повторением s1 слева и справа от “=” имеет смысл только с подстроками. Нужно, чтобы суммарная длина не превышала len(s1). В Фортране строки имеют постоянную длину, а именно ту, что заявлена в её описании.В то же время оператор s1=trim(s1)//s2 вполне осмысленный, если в s1 хвостовых пробелов, не менее чем символов в s2. Функция trim (s1) обрезает хвостовые пробелы.
Логическое выражение имеет значение «истина» или «ложь», состоя из:
— логических констант и переменных;
— пяти логических операций с операндами логического типа;
— шести отношений, которые сравнивают либо два числовых выражения, либо два символьных выражения.
Результат вычисления отношения – либо .true. – «истина», либо .false.– «ложь».
Таблица 18. В Фортране шесть операций отношения
Отношения вычисляются после вычисления их операндов. Например, при A=2, B=0 для отношения A+3 >B порядок действий такой: сначала вычисляется А+3 и получается 5; затем 5 сравнивается с В, которое равно0; результат вычисления выражения 5>0 – «истина».
Логические операции выполняются после вычисления отношений
В Фортране пять логических операций
Операция | Обозначение | Старшинство | Пример |
Отрицание НЕ | .not. | .not.a | |
Конъюнкция И | .and. | a.and.b | |
Дизъюнкция ИЛИ | .or. | a.or.b | |
Эквивалентность | .eqv. | a.eqv.b | |
Неэквивалентность | .neqv. | a.neqv.b |
Операция .not. – одноместная и дает результат «истина», если значение операнда «ложь», и результат «ложь», если значение операнда «истина».
Введем обозначения: T – «истина» и F – «ложь».
Таблицы истинности пяти логических операций выглядят как
.AND. | F | T | .OR. | F | T |
F | F | F | F | F | T |
T | F | T | T | T | T |
.EQV. | F | T | .NEQV. | F | T |
F | T | F | F | F | T |
T | F | T | T | T | F |
.NOT. | F | T | |||
T | F |
Строки и столбцы таблиц истинности помечены значениям операндов, а на пересечении строки и столбца записан результат двухместной операции
Блок-схема | Конструкция Do |
| do переменная = xn, xk, step блок_do enddo |
Цикл не выполнится ни разу, то есть kp=0, если
или
Шаг цикла step регламентируется следующим образом:
— эквивалентны Do i= 1,10,1 и Do i = 1,10 – по умолчанию step=1;
— если step>0, x возрастает, по окончании цикла x > xk;
FORTRAN
Фортран (Fortran) — первый реализованный язык программирования высокого уровня (после Планкалкюля), правда, с одной небольшой оговоркой — для машин, построенных по классической схеме фон Неймана. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса (John Backus) в корпорации IBM. Через пару лет начались его коммерческие поставки. До этого программирование велось либо непосредственно в машинных кодах, либо на символических ассемблерах. Название Fortran является аббревиатурой от FORmula TRANslator, то есть, переводчик формул.
Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана — большое количество написанных на нём программ и библиотек подпрограмм. Среди учёных, например, ходит такая присказка, что любая математическая задача уже имеет решение на Фортране, и, действительно, можно найти среди тысяч фортрановских пакетов и пакет для перемножения матриц, и пакет для решения сложных интегральных уравнений и многие, многие другие. Ряд таких пакетов создавались на протяжении десятилетий и популярны по сей день (главным образом в научной среде).
Большинство таких библиотек является фактически достоянием человечества: они доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны. Поэтому изменять, а тем более переписывать их на других языках программирования накладно, несмотря на то, что регулярно производятся попытки автоматического конвертирования FORTRAN-кода на современные языки программирования.
Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования для новых вычислительных архитектур; позволяет применять современные технологии программирования, в частности, ООП.
История
В конце 1953 Джон Бэкус предложил начать разработку эффективной альтернативы ассемблеру для программирования на ПК IBM 704. Уже к середине 1954 была закончена черновая спецификация языка Fortran. Первое руководство для Fortran появилось в октябре 1956 вместе с первым компилятором, поставленным в апреле 1957. Компилятор был оптимизирующим, потому что клиенты отказывались использовать язык программирования высокого уровня, который был не в состоянии генерировать код с производительностью ниже, чем у ассемблера.
В то время сообщество относилось скептически к новому способу программирования и не верили в то, что Fortran позволит программировать быстрее и эффективнее. По словам самого Джона Бэкуса большая часть его работы была направлена на то чтобы «быть ленивым». Ему жутко не нравилось писать программы под IBM 701 на ассемблере.
Язык был широко принят учеными для написания программ с интенсивными вычислениями. Включение комплексного типа данных сделало его особенно подходящим для технических приложений.
К 1960 году существовали версии Fortran для компьютеров IBM 709, 650, 1620, 7090. Его большая популярность побуждала конкурирующих изготовителей компьютеров создавать компиляторы Fortran для своих компьютеров. Таким образом, уже к 1963 существовало более 40 компиляторов для разных платформ. Именно по этому Fortran считают первым широко используемым языком программирования.
Поскольку FORTRAN оказался столь успешным языком, в Европе возникли опасения, что IBM будет доминировать в компьютерной отрасли. Немецкое общество прикладной математики (German society of applied mathematics — GAMM) создало комитет по разработке универсального языка. В то же время Association for Computing Machinery (ACM) организовала похожий комитет в США. Несмотря на то, что у европейцев было некоторое беспокойство по поводу господства американцев, оба этих комитета слились в один. Под руководством Питера Наура (Peter Naur) этот комитет разработал IAL (International Algorithmic Language). Предлагавшееся название ALGOL (ALGOrithmic Language) было вначале отвергнуто. Но поскольку оно стало общеупотребительным, официальное имя IAL пришлось впоследствии изменить на ALGOL 58. Новая версия появилась в 1960 г., и ALGOL 60 (с небольшими изменениями, сделанными в 1962 г.) с 60-х и до начала 70-х гг. прошлого века был стандартом академического языка программирования.
Фортран в СССР
Фортран в СССР появился позже, чем на Западе, поскольку поначалу у нас более перспективным языком считался Алгол. Во внедрении Фортрана большую роль сыграло общение советских физиков со своими коллегами из CERN, где в 1960-х годах почти все расчёты велись с использованием программ на Фортране.
Первый советский компилятор с Фортрана был создан в 1967 г. для машины «Минск-2», однако он не получил большой известности. Широкое внедрение Фортрана началось после создания в 1968 г. компилятора ФОРТРАН-ДУБНА для машины БЭСМ-6. Машины ЕС ЭВМ, появившиеся в 1972 г., уже изначально имели транслятор Фортрана («позаимствованный» с IBM/360 вместе с другим программным обеспечением).
Стандарты
Фортран — жёстко стандартизированный язык, именно поэтому он легко переносится на различные платформы. Существует несколько международных стандартов языка:
Компиляторы
До 1997 основным производителем компиляторов Fortran для IBM PC совместимых компьютеров была корпорация Microsoft. Впоследствии она отказалась от их разработки в связи с низкой прибыльностью. На данный момент компиляторы поставляет фирма DEC, вошедшая в 1998 г. в состав Compaq и вместе с последней в 2002 г. слившаяся с HP.
Компания DEC поставляет компилятор, интегрированный в среду разработки Digital Visual Fortran, основанную на Microsoft Visual Studio. Наиболее известными продуктами этой линейки являются FPS 4.0 (Microsoft Fortran Power Station), DVF 5.0 и 6.0. Каждый компилятор может поддерживать несколько стандартов Фортрана. Слияния компаний явились причиной того, что последующие продукты появлялась на рынке под торговыми марками Compaq и HP. В настоящее время HP продаёт среду разработки версии 6.6 для Intel/win32. Поддержка Fortran реализована также для всех высокопроизводительных платформ HP.
Другим крупным поставщиком систем разработки на Fortran является фирма Lahey, предлагающая интегрированные решения для Windows и Linux.
Долгое время лучшим компилятором Fortran считался компилятор фирмы Watcom, который был выделен в отдельный проект Open Watcom, развивающий компилятор на открытой основе.
Известен и развивается также компилятор фирмы Intel — Intel Fortran Compiler, который позволяет оптимизировать код под платформу Intel ia32 и ia64.
Среди бесплатных компиляторов Fortran следует выделить компилятор от Sun Microsystems, входящий в состав Sun Studio, который генерирует эффективный код под SPARC, x86 и x86_64 и доступен как для ОС Solaris, так и GNU/Linux.
Фонд свободного программного обеспечения GNU выпускает открытый компилятор FORTRAN 77 g77, доступный практически для любой платформы и полностью совместимый с GCC, но не поддерживающий всех языковых конструкций современных стандартов Fortran. Также существует проект g95 по созданию на основе GCC компилятора Fortran 95.
Возможности и структура программы
Fortran имеет достаточно большой набор встроенных математических функций, поддерживает работу с целыми, вещественными и комплексными числами высокой точности. Выразительные средства языка изначально были весьма бедны, поскольку Fortran был одним из первых языков высокого уровня. В дальнейшем были добавлены многие лексические конструкции, характерные для структурного, функционального и даже объектно-ориентированного программирования.
Структура программ изначально была ориентирована на ввод с перфокарт и имела ряд удобных именно для этого случая свойств. Так, 1-я колонка служила для маркировки текста как комментария (символом C), с 1-й по 5-ю располагалась область меток, а с 7-й по 72-ю располагался собственно текст оператора или комментария. Колонки с 73-й по 80-ю могли служить для нумерации карт (чтобы восстановить случайно рассыпавшуюся колоду) или для краткого комментария, транслятором они игнорировались. Если текст оператора не вписывался в отведённое пространство (с 7-й по 72-ю колонку), в 6-ой колонке следующей карты ставился признак продолжения, и затем оператор продолжался на ней. Расположить два или более оператора в одной строке (карте) было нельзя. Когда перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства.
Именно поэтому в стандарте, начиная с Fortran 90, в добавление к фиксированному формату исходного текста появился свободный формат, который не регламентирует позиции строки, а также позволяет записывать более одного оператора на строку. Введение свободного формата позволило создавать код, читабельность и ясность которого не уступает коду, созданному при помощи других современных языков программирования, таких как C или Java.
Именно этот негативный опыт стал причиной, по которой в ряде современных языков программирования (например, Java) метки и связанные с ними операторы безусловного перехода вообще отсутствуют.
Однако современный Fortran избавлен от избытка меток за счет введения таких операторов, как DO … END DO, DO WHILE, SELECT CASE. Также к положительным чертам современного Fortran стоит отнести большое количество встроенных операций с массивами и гибкую поддержку массивов с необычной индексацией.
Взаимодействие с другими языками
Многие системы программирования позволяют компоновать полученные в результате трансляции программы на Fortran объектные файлы с объектными файлами, полученными от компиляторов с других языков, что позволяет создавать более гибкие и многофункциональные приложения. Для языка Фортран также доступно большое количество библиотек, содержащих как подпрограммы решения классических вычислительных задач (LAPACK, IMSL, BLAS), задач организации распределенных вычислений (MPI, pvm), так и задач построения графических интерфейсов (Quickwin, FORTRAN/TK) или доступа к СУБД (Oracle).
Наследие Fortran
Fortran использовался более пятидесяти лет и существует огромная часть принадлежащая ему и по сей день. Fortran — основной язык для некоторых задач требующих огромных вычислений, таких как моделирование погоды и климата, гидрогазодинамика, вычислительная химия, квантовая хромодинамика, моделирование динамики солнечной системы, вычисление орбит искусственных спутников и многие другие задачи.
Переносимость
Поначалу переносимость для Fortran была весьма насущной проблемой, потому что не существовало ни одного единого стандарта и даже справочной информации от IBM. И компьютерные фирмы соперничали между собой, обеспечивая несовместимость для разных компиляторов. Исправило дело появление стандартов. Стандарт 1966 года устанавливал синтаксис и семантику, но продавцы продолжали внедрять несовместимые расширения. Осмотрительные программисты понимали, что использование несовместимых расширений вызовет проблемы переносимости и зачастую использовали программы наподобие «The PFORT Verifier» для выявления несовместимых расширений.
Несовместимые расширения были не единственной проблемой. Существовал ряд проблем с численными вычислениями. Позже была развита и внедрена практически универсальная идея двоичной арифметики с плавающей запятой.
Доступ к исполняемой среде (например, к командной строке, переменным среды) был весьма затруднителен, пока на это не обратили на это внимание в стандарте 2003 года.
Сейчас относительно просто реализовать полностью переносимую программу на Fortran.
Основы языка Fortran
Fortran — это язык программирования общего назначения, предназначенный для математических вычислений, например, в машиностроении. Фортран-это аббревиатура для перевода формул, и первоначально она была написана с заглавной буквы как FORTRAN. Однако, следуя нынешней тенденции использовать только заглавную букву в аббревиатурах, все называют его Fortran.
Фортран был первым в истории языком программирования высокого уровня. Работа над Fortran началась в 1950 — х годах в IBM, и с тех пор было много версий. По соглашению, версия Fortran обозначается двумя последними цифрами года, когда был предложен стандарт. Таким образом, мы имеем:
Наиболее распространенной версией Фортран сегодня по-прежнему является Fortran 77, хотя Fortran 90 набирает все большую популярность. Fortran 95-это пересмотренная версия Fortran 90. Существует также несколько версий Fortran, предназначенных для параллельных компьютеров. Наиболее важным из них является высокопроизводительный Fortran (HPF), который является стандартом де-факто.
Пользователи должны знать, что большинство компиляторов Fortran 77 допускают надмножество Fortran 77, то есть допускают нестандартные расширения. В этом уроке мы подчеркнем стандарт ANSI Fortran 77.
Зачем изучать Фортран?
Fortran является популярным языком программирования, используемым в инженерных приложениях. Поэтому выпускникам инженерных специальностей важно уметь читать и изменять фортранский код. Время от времени так называемые эксперты предсказывают, что Фортран быстро угаснет в популярности и вскоре исчезнет. Эти предсказания всегда проваливались. Фортран-самый прочный язык программирования в истории. О
дна из главных причин, по которой Fortran выжил и выживет — это программная инерция. После того, как компания потратила много человеко-лет и, возможно, миллионы долларов на программный продукт, она вряд ли попытается перевести программное обеспечение на другой язык. Надежный перевод программного обеспечения — очень сложная задача.
Основным преимуществом Fortran является то, что он стандартизирован ANSI и ISO (см. сноски). Следовательно, если ваша программа написана на ANSI Fortran 77, не используя ничего, выходящего за рамки стандарта, то она будет работать на любом компьютере, имеющем компилятор Fortran 77. Таким образом, программы Fortran переносимы на разные платформы машин. (Если вы хотите ознакомиться с некоторыми документами по стандартам Fortran, нажмите здесь.)
Основы Fortran 77
Программа Fortran — это просто последовательность строк текста. Текст должен следовать определенной структуре, чтобы быть действительной программой Fortran. Начнем с простого примера:
program circle
real r, area
с Эта программа считывает действительное число r
с печатает площадь окружности с радиусом r.
write (*,*) ‘Give radius r:’
read (*,*) r
area = 3.14159*r*r
write (*,*) ‘Area = ‘, area
Строки, начинающиеся с буквы «с», являются комментариями и не имеют иной цели, кроме как сделать программу более читаемой для людей. Первоначально все программы на Фортране должны были быть написаны заглавными буквами. Большинство людей теперь пишут строчными буквами, так как это более разборчиво, и мы тоже. Вы можете смешать регистр, но Fortran не чувствителен к регистру, поэтому «X» и «x»-это одна и та же переменная.
Организация программы
Программа Fortran обычно состоит из основной программы (или драйвера) и, возможно, нескольких подпрограмм (процедур или подпрограмм). Пока мы поместим все утверждения в основную программу; подпрограммы будут рассмотрены позже. Структура основной программы такова:
В этом учебнике слова, выделенные курсивом, следует воспринимать не как буквальный текст, а скорее как описание того, что находится на их месте.
Оператор stop необязателен и может показаться излишним, поскольку программа все равно остановится, когда достигнет конца, но рекомендуется всегда завершать программу с помощью оператора stop, чтобы подчеркнуть, что поток выполнения останавливается на этом. Обратите внимание, что у вас не может быть переменной с тем же именем, что и у программы.
Правила расположения столбцов
Fortran 77 не является языком свободного формата, но имеет очень строгий набор правил форматирования исходного кода. Наиболее важными правилами являются правила расположения столбцов:
Большинство строк в программе Fortran 77 начинается с 6 пробелов и заканчивается перед столбцом 72, то есть используется только поле оператора.
Комментарии
Строка, начинающаяся с буквы «с» или звездочки в первом столбце, является комментарием. Комментарии могут появляться в любом месте программы. Хорошо написанные комментарии имеют решающее значение для удобочитаемости программы. Коммерческие коды Fortran часто содержат около 50% комментариев.
Вы также можете столкнуться с программами Fortran, которые используют восклицательный знак (!) для комментариев. Это не стандартная часть Fortran 77, но поддерживается несколькими компиляторами Fortran 77 и явно разрешена в Fortran 90. При понимании восклицательный знак может появиться в любом месте строки (кроме позиций 2-6).
Продолжение
Иногда оператор не помещается в 66 доступных столбцов одной строки. Затем можно разбить оператор на две или более строк и использовать метку продолжения в позиции 6. Пример:
c23456789 (Это демонстрирует положение столбца!)
c Следующее утверждение идет по двум физическим линиям
площадь = 3,14159265358979
+ * r * r
Любой символ может быть использован вместо знака плюс в качестве символа продолжения. Хорошим стилем программирования считается использование знака плюс, амперсанда или цифр (2 для второй строки, 3 для третьей и т. Д.).
Исходный код, объектный код, компиляция и связывание
Программа Fortran состоит из простого текста, который следует определенным правилам (синтаксису). Это называется исходным кодом. Вам нужно использовать редактор для написания (редактирования) исходного кода. Наиболее распространенными редакторами в Unix являются emacs и vi, но они могут быть немного сложными для начинающих пользователей. Возможно, вы захотите использовать более простой редактор, например xedit, который работает под управлением X-windows.
Выход из компиляции по умолчанию имеет несколько загадочное имя a.out, но при желании вы можете выбрать другое имя. Чтобы запустить программу, просто введите имя исполняемого файла, например a.out. (Это объяснение несколько упрощено.На самом деле компилятор переводит исходный код в объектный код, а компоновщик/загрузчик превращает его в исполняемый файл.)
Примеры:
В каталоге классов есть небольшая программа Fortran под названием circle.f. Вы можете скомпилировать и запустить его, выполнив следующие действия:
(Обратите внимание, что там есть несколько точек (точек), которые легко пропустить!) Если вам нужно иметь несколько исполняемых файлов одновременно, рекомендуется дать им описательные имена. Это можно сделать с помощью опции-o.
В предыдущих примерах мы не проводили различия между компиляцией и связыванием. Это два разных процесса, но компилятор Fortran выполняет их оба, поэтому пользователю обычно не нужно знать об этом. Но в следующем примере мы будем использовать два файла исходного кода.
Компиляция отдельных файлов, подобных этому, может быть полезна, если существует много файлов и только некоторые из них должны быть перекомпилированы. В Unix есть полезная команда make, которая обычно используется для обработки больших пакетов программного обеспечения с большим количеством исходных файлов. Эти пакеты поставляются с файлом makefile, и все, что нужно сделать пользователю, — это ввести make. Написание makefiles немного сложно, поэтому мы не будем обсуждать это в этом уроке.
Переменные, типы и объявления
Имена переменных
Имена переменных в Фортран должны быть из 1-6 символов(допустимые буквы a-z и цифры 0-9).Кроме того, первый символ должен быть буквой. Fortran 77 не различает верхний и нижний регистр, фактически, он предполагает, что все входные данные являются верхним регистром. Однако почти все компиляторы Фортран 77 принимают нижний регистр. Если вы когда-нибудь столкнетесь с компилятором Fortran 77, который настаивает на верхнем регистре, обычно легко преобразовать исходный код во все верхние регистры.
Слова, составляющие язык Фортран, называются зарезервированными словами и не могут использоваться в качестве имен переменных. Некоторые из зарезервированных слов, которые мы видели до сих пор, — это «program», «real», «stop» и «end».
Типы и объявления
Каждая переменная должна быть определена в объявлении. Это устанавливает тип переменной. Наиболее распространенными декларациями являются:
Список переменных должен состоять из имен переменных, разделенных запятыми. Каждая переменная должна быть объявлена ровно один раз. Если переменная не объявлена, Fortran 77 использует набор неявных правил для установления типа. Это означает, что все переменные, начинающиеся с букв i-n, являются целыми числами, а все остальные-вещественными.
Многие старые программы Fortran 77 используют эти неявные правила, но вы не должны! Вероятность ошибок в вашей программе резко возрастает, если вы не будете последовательно объявлять свои переменные.
Целые числа и переменные с плавающей запятой
Фортран 77 имеет только один тип для целочисленных переменных. Целые числа обычно хранятся в виде 32-битных (4 байта) переменных. Поэтому все целочисленные переменные должны принимать значения в диапазоне [-m, m], где m приблизительно равно 2*10^9.
Fortran 77 имеет два различных типа переменных с плавающей запятой, называемых вещественной и двойной точностью. Хотя реальное часто является адекватным, некоторые численные вычисления требуют очень высокой точности, и следует использовать двойную точность.
Обычно real — это 4-байтовая переменная, а двойная точность-8 байт, но это зависит от машины. Некоторые нестандартные версии Fortran используют синтаксис real*8 для обозначения 8-байтовых переменных с плавающей запятой.
Оператор параметра
Некоторые константы появляются в программе много раз. Поэтому часто желательно определить их только один раз, в начале программы. Для этого и существует оператор parameter. Это также делает программы более удобочитаемыми. Например, программа circlearea должна была быть написана примерно так:
program circle
real r, area, pi
parameter (pi = 3.14159)
c Эта программа считывает действительное число r и печатает
c площадь окружности с радиусом r.
write (*,*) ‘Give radius r:’
read (*,*) r
area = pi*r*r
write (*,*) ‘Area = ‘, area
Синтаксис оператора parameter таков
Правила для оператора parameter следующие:
Вот некоторые веские причины для использования оператора parameter:
Выражения и присвоение
Константы
Простейшей формой выражения является константа. Существует 6 типов констант, соответствующих 6 типам данных. Вот некоторые целочисленные константы:
Тогда у нас есть реальные константы:
Обозначение Е означает, что вы должны умножить константу на 10, возведенную в степень, следующую за буквой «Е». Следовательно, 2.0E6-это два миллиона, а 3.333 E-1-примерно одна треть.
Для констант, которые больше наибольшего допустимого реального значения или требуют высокой точности, следует использовать двойную точность. Обозначение такое же, как и для вещественных констант, за исключением того, что «Е» заменено на «D». Примеры:
Здесь 2.0 D-1-это двойная точность одна пятая, в то время как 1D99-это единица, за которой следуют 99 нулей. Следующий тип — комплексные константы. Это обозначается парой констант (целочисленных или вещественных), разделенных запятой и заключенных в круглые скобки. Примеры таковы:
Первое число обозначает действительную часть, а второе-мнимую. Пятый тип — логические константы. Они могут иметь только одно из двух значений:
Обратите внимание, что точки, заключающие буквы, обязательны. Последний тип — символьные константы. Они чаще всего используются в виде массива символов, называемого строкой. Они состоят из произвольной последовательности символов, заключенных в апострофы (одинарные кавычки):
Строки и символьные константы чувствительны к регистру. Проблема возникает, если вы хотите иметь апостроф в самой строке. В этом случае вам следует удвоить апостроф:
Выражения
Простейшие непостоянные выражения имеют вид operandoperatoroperand и пример:
Результат выражения сам по себе является операндом, поэтому мы можем вложить выражения вместе, например:
В связи с этим возникает вопрос о приоритете: означает ли последнее выражение x + (2*y) или (x+2)*y? Приоритет арифметических операторов в Фортран 77 (от самого высокого до самого низкого):
Все эти операторы вычисляются слева направо, за исключением оператора возведения в степень **, который имеет приоритет справа налево. Если вы хотите изменить порядок оценки по умолчанию, вы можете использовать круглые скобки.
Все вышеперечисленные операторы являются бинарными операторами.существует также унарный оператор — для отрицания, который имеет приоритет над другими. Следовательно, выражение типа-x+y означает то, что вы ожидаете.
Необходимо соблюдать крайнюю осторожность при использовании оператора деления, который имеет совершенно другое значение для целых и вещественных чисел. Если оба операнда являются целыми числами, выполняется целочисленное деление, в противном случае выполняется действительное арифметическое деление. Например, 3/2 равно 1, а 3./2. равно 1,5 (обратите внимание на десятичные точки).
Назначение
Интерпретация заключается в следующем: Вычислите правую часть и назначьте полученное значение переменной слева. Выражение справа может содержать другие переменные, но они никогда не изменяют значения! Например, площадь = pi * r**2 не изменяет значения pi или r, только площадь.
Преобразование типов
Когда в одном и том же выражении встречаются разные типы данных, преобразование типов должно происходить явно или неявно. Fortran будет выполнять некоторое преобразование типов неявно. Например,
преобразует целое число один в действительное число один и имеет желаемый эффект увеличения x на единицу. Однако в более сложных выражениях хорошей практикой программирования является явное принудительное преобразование необходимых типов. Для чисел доступны следующие функции:
Первые три имеют очевидный смысл. ichar берет символ и преобразует его в целое число, в то время как char делает прямо противоположное.
Пример: Как умножить две вещественные переменные x и y с помощью двойной точности и сохранить результат в переменной двойной точности w:
Обратите внимание, что это отличается от
Логические выражения
Логические переменные и присвоение
Истинностные значения могут храниться в логических переменных. Задание аналогично арифметическому заданию. Пример:
Логические переменные редко используются в Fortran. Но логические выражения часто используются в условных операторах, таких как оператор if.
Операторы if
Важной частью любого языка программирования являются условные операторы. Наиболее распространенным таким утверждением в Fortran является утверждение if, которое на самом деле имеет несколько форм. Самым простым из них является логическое утверждение if:
if (логическое выражение) исполняемый оператор
Это должно быть написано в одной строке. В этом примере найдено абсолютное значение x:
Если внутри if должно быть выполнено более одного оператора, то следует использовать следующий синтаксис:
if (логическое выражение) then операторы
Наиболее общая форма оператора if имеет следующий вид:
if (логическое выражение) then операторы
elseif (логическое выражение)
, then операторы
:
:
else
заявления
endif
Поток выполнения идет сверху вниз. Условные выражения вычисляются последовательно до тех пор, пока одно из них не окажется истинным. Затем соответствующие операторы выполняются, и управление возобновляется после end if.
Вложенные операторы if
операторы if могут быть вложены в несколько уровней. Чтобы обеспечить читабельность, важно использовать правильный отступ. Вот пример:
Вам следует избегать вложенности многих уровней операторов if,так как за ними становится трудно следить.
Циклы
Для повторного выполнения подобных вещей используются циклы. Если вы знакомы с другими языками программирования, вы, вероятно, слышали о for-loops, while-loops и until-loops. Фортран 77 имеет только одну конструкцию цикла, называемую do-loop. Цикл do соответствует тому, что в других языках называется циклом for. Другие конструкции цикла должны быть построены с использованием операторов if и goto.
Цикл do
Цикл do-loop используется для простого подсчета. Вот простой пример, который выводит кумулятивные суммы целых чисел от 1 до n (предположим, что n было присвоено значение в другом месте):
sum = 0
do 10 i = 1, n
sum = sum + i
write(*,*) ‘i =’, i
write(*,*) ‘sum =’, sum
10 continue
Число 10 — это метка оператора. Как правило, в одной программе будет много циклов и других операторов, требующих метки оператора. Программист отвечает за присвоение уникального номера каждой метке в каждой программе (или подпрограмме).
Напомним, что позиции столбцов 1-5 зарезервированы для меток операторов. Числовое значение меток операторов не имеет значения, поэтому можно использовать любые целые числа в любом порядке. Как правило, большинство программистов используют последовательные кратные 10.
Переменная, определенная в операторе do, по умолчанию увеличивается на 1. Однако вы можете определить шаг как любое число, кроме нуля. Этот сегмент программы печатает четные числа от 1 до 10 в порядке убывания:
Общая форма цикла do выглядит следующим образом:
do label var = expr1, expr2, expr3
var — это переменная цикла (часто называемая индексом цикла), которая должна быть целочисленной. expr1 задает начальное значение var, expr2 — конечную границу, а expr3 — инкремент (шаг).
Примечание: Переменная do-loop никогда не должна изменяться другими операторами внутри цикла! Это вызовет большую путаницу.
Индекс цикла может иметь тип real, но из-за ошибок округления может не принимать точно ожидаемую последовательность значений.
Многие компиляторы Fortran 77 позволяют закрывать циклы do с помощью оператора enddo. Преимущество этого заключается в том, что метка оператора может быть опущена, поскольку предполагается, что enddo закрывает ближайший предыдущий оператор do. Конструкция enddo широко используется, но она не является частью ANSI Фортран 77.
Следует отметить, что в отличие от некоторых языков программирования, Fortran вычисляет выражения start, end и step только один раз, перед первым прохождением тела цикла. Это означает, что следующий цикл do-loop будет умножать неотрицательный j на два (трудный путь), а не работать вечно, как эквивалентный цикл на другом языке.
read (*,*) j
do 20 i = 1, j
j = j + 1
20 continue
write (*,*) j
while-циклы
Самый интуитивный способ написать цикл while — это:
while (logical expr) do
заявления
anddo
или альтернативно,
dowhile (логическое выражение)
заявления
and do
Программа будет чередовать тестирование условия и выполнение операторов в теле до тех пор, пока условие в операторе while истинно. Несмотря на то, что этот синтаксис принят многими компиляторами, это не ANSI Fortran 77. Правильный способ использовать if и goto:
label if (logical expr) затем
заявление
gotolabel
endif
Вот пример, который вычисляет и печатает все степени двух, которые меньше или равны 100:
Цикл until
Если критерий завершения находится в конце, а не в начале, его часто называют циклом до. Псевдокод выглядит так:
Опять же, это должно быть реализовано в Fortran 77 с помощью if и goto:
метка continue
заявление
if (logicalexpr) gotolabel
Обратите внимание, что логическое выражение в последней версии должно быть отрицанием выражения, данного в псевдокоде!
Массивы
Многие научные вычисления используют векторы и матрицы. Тип данных, используемый Fortran для представления таких объектов, — массив. Одномерный массив соответствует вектору, а двумерный-матрице. Чтобы полностью понять, как это работает в Фортран 77, вам нужно знать не только синтаксис использования, но и то, как эти объекты хранятся в памяти в Fortran 77.
Одномерные массивы
Простейшим массивом является одномерный массив, который представляет собой просто последовательность элементов, последовательно хранящихся в памяти. Например, декларация realа(20) объявляет a как реальный массив длины 20. То есть а состоит из 20 вещественных чисел, непрерывно хранящихся в памяти.
По соглашению массивы Fortran индексируются от 1 и выше. Таким образом, первое число в массиве обозначается a(1), а последнее-a(20). Однако вы можете определить произвольный диапазон индексов для ваших массивов, используя следующий синтаксис:
Здесь b точно похож на a из предыдущего примера, за исключением того, что индекс проходит от 0 до 19. weird-это массив длины 237-(-162)+1 = 400. Тип элемента массива может быть любым из основных типов данных. Примеры:
Каждый элемент массива можно рассматривать как отдельную переменную. Вы ссылаетесь на i-й элемент массива a через a(i). Вот сегмент кода, который хранит 10 первых квадратных чисел в массиве sq:
do 100 i = 1, 10
sq(i) = i**2
100 continue
Распространенная ошибка в Fortran заключается в том, что программа пытается получить доступ к элементам массива, которые находятся вне границ или не определены. Это ответственность программиста, и компилятор Fortran не обнаружит таких ошибок!
Двумерные массивы
Матрицы очень важны в линейной алгебре. Матрицы обычно представляются двумерными массивами. Например, декларация Real A(3,5) определяет двумерный массив из 3*5=15 вещественных чисел. Полезно думать о первом индексе как о индексе строки, а о втором-как об индексе столбца. Отсюда мы получаем графическую картину:
Двумерные массивы также могут иметь индексы в произвольном определенном диапазоне. Общий синтаксис объявлений таков:
name (low_index1 : hi_index1, low_index2 : hi_index2)
Тогда общий размер массива будет равен
size = (hi_index1-low_index1+1)*(hi_index2-low_index2+1)
В Fortran довольно часто объявляются массивы, которые больше, чем матрица, которую мы хотим сохранить. (Это связано с тем, что Fortran не имеет динамического распределения памяти.) Это совершенно законно.
Пример:
Real А(3,5)
Integer i,j
c
c Мы будем использовать только верхнюю часть этого массива размером 3 на 3.
c
do 20 j = 1, 3
do 10 i = 1, 3
a(i,j) = real(i)/real(j)
10 continue
20 continue
Элементы подматрицы А(1:3,4:5) не определены. Не предполагайте, что эти элементы инициализируются компилятором до нуля (некоторые компиляторы сделают это, но не все).
Формат хранения для 2-мерных массивов
Fortran хранит многомерные массивы как непрерывную последовательность элементов. Важно знать, что 2-мерные массивы хранятся по столбцам. Таким образом, в приведенном выше примере элемент массива (1,2) будет следовать за элементом (3,1). Затем следует остальная часть второго столбца, затем третий столбец и так далее.
Рассмотрим еще раз пример, где мы используем только верхнюю подматрицу 3 на 3 массива 3 на 5 A(3,5). 9 интересных элементов будут затем сохранены в первых девяти ячейках памяти, в то время как последние шесть не используются. Это работает аккуратно, потому что ведущее измерение одинаково как для массива, так и для матрицы, которую мы храним в массиве.
Однако часто ведущее измерение массива будет больше, чем первое измерение матрицы. Тогда матрица не будет храниться непрерывно в памяти, даже если массив является непрерывным. Например, предположим, что объявление было A(5,3) вместо этого. Тогда между концом одного столбца и началом следующего будут две «неиспользуемые» ячейки памяти (опять же мы предполагаем, что матрица равна 3 на 3).
Это может показаться сложным, но на самом деле это довольно просто, когда вы привыкнете. Если вы сомневаетесь, может быть полезно посмотреть, как вычисляется адрес элемента массива. Каждый массив будет иметь некоторый адрес памяти, назначенный началу массива, то есть элементу (1,1). Адрес элемента (i,j) затем задается addr[A(i,j)] = addr[A(1,1)] + (j-1)*lda + (i-1) где lda — ведущее (т. е. строковое) измерение A. Обратите внимание, что lda в целом отличается от фактического матричного измерения. Многие ошибки Фортрана вызваны этим, поэтому очень важно, чтобы вы поняли различие!
Многомерные массивы
Fortran 77 допускает массивы до семи измерений. Синтаксис и формат хранения аналогичны двумерному случаю, поэтому мы не будем тратить на это время.
Существует альтернативный способ объявления массивов в Fortran 77.
Это заявление об измерении сегодня считается старомодным стилем.
Заключение
В этой статье вы узнали основы языка Фортнан! Всем начинающим программистам удачи в написании к