Классификация операторов управления ходом
вычислений
Классификация
и правописание операторов
Для текста программы на Фортране
характерно следующее
- текст состоит из операторов или предложений,
как сказали бы в английском, где принят термин "statement"
- традиционно построчное оформление
операторов перенесли и на конструкции, что
отличает Фортран от С либо Паскаля
- где языковые конструкции не привязаны к
строкам, а разделены при помощи "{ }"
";" либо begin end ;
- где комментарии пишут по-другому
- текст в в стиле Ф-90 получил раширение *.f90
- в стиле Ф-90 в одной строке разрешили писать
несколько простых операторов, разделенных
";"
- преемственность допускает оформление текста в
одном из двух стилей
- с первой позиции по 132 позицию
в свободном формате - для всех текстов
*.f90 и текстов *.for после метакоманды $freeform
оператор пишут свободно в следующем порядке [метка]
оператор [перенос] [ !
комментарий]
- с седьмой позиции по 72
позицию в фиксированном формате - для
текстов *.for
оператор пишут строго по позициям [метка(1:5)]
перенос(6:6) оператор(7:72) ]
[ ! комментарий(1:72)] [номерПК(73:80)]
- при описании языков в квадратные
скобки принято заключать необязательные
конструкции [ ]
- формат $freeform, предложенный фирмой MS в
Ф-77 v5.1, опередил свободный формат
стандарта Ф-90, поэтому имеются различия
- фиксированный формат использовался еще
при вводе с перфокарт в Ф-66
Текст программы на Фортране
- содержит в начале строку-заголовок, а в
конце - строку end
например PROGRAM Primer
.. .. END , где .. ..- наличие каких-то
строк текста
- между заголовком и end пишут
операторы, сначала неисполняемые, затем исполняемые
- текст легче воспринимается, если его разбавлять
пустыми строками, пробелами (пробелы
не внутри слов) и строками-комментарияи
(оформление последних зависит от формата
исходного текста)
- в конце строки с оператором после "!"
допустимы построчные комментарии
- неисполняемые операторы отвечают на
вопрос "какой или как?" и влияют на перевод исполняемых
операторов в команды компьютера
- исполняемые операторы отвечают на
вопрос "что делать?" - это команды или
действия
- знак переноса строки и его место
зависят от формата исходного текста
- метакоманды - это команды компилятору в
тексте программы
- метакоманда $freeform инициирует свободный
формат (с оговорками о переносе и строчных
комментариях)
Знак переноса оператора
зависит от формата исходного текста и пишется
как знак "&" в конце
переносимой строки текста *.f90
как знак "-" в конце
переносимой строки текста в формате $freeform
как знак "*" в шестой позиции
строки-продолжения для программы в
фиксированном формате
Комментарии способствуют
пониманию программы, пишутся понятным языком,
лучше на русском. Строка-комментарий
в зависимости от формата исходного текста
начинается
Метка - целое, которое можно
написать перед оператором, отделив ее хотя бы
одним пробелом. В фиксированном формате метка
пишется строго с первой по пятую
позицию строки.
Пример текста программы primer.f90
в свободном формате
Текст primer.f90 |
Обсуждение |
Program primer |
заголовок программы |
!
неисполняемые операторы
implicit none
integer :: i=3, j=2, k
real :: a,b, rez
namelist /out/ i,j, k, &
a,b, rez |
строка-комментарий
заставляет объявлять все переменные
- описание целых
- описание вещественных
- список вывода out с переносом
строка-продолжение |
|
пустая строка: описания /
действия |
! исполняемые
операторы
k = i/j ! 1-целая часть
частного 3/2
a=i ; b=j ! те же числа 3 и 2
Rez = a/b ! вещественное 1.5
write( *, out ) |
ответ зависит от типа операндов
- деление целых чисел
- два присваивания, изменяющие тип
- деление вещественных чисел
- вывод переменных по списку out |
end |
конец программы |
Классификация операторов
В обсуждении используем три
независимых подхода к классификации операторов:
- исполняемые
и неисполняемые - по месту в
программе
- простые
и составные (конструкции) - по
сложностип и по оформлению
- по назначению
Составные исполняемые операторы
подразделяются в свою очередь на
- программные единицы (ПЕ) - с заголовками program
subroutine function module
- конструкции или блочные операторы - с
заголовками do DoWhile if
SelectCase where
Правила записи составных операторов
(СО) действуют, в частности, и для блочных
операторов, однако помимо этого для блочных
операторов допускается вложение. В составных
неисполняемых операторах не допускаются
вложения, но допускаются ссылки на ранее
сделанные определения
С развитием идей структурного
программирования преобладающим стал стиль
"неотрывного восприятия программы". Для его
воплощения в Ф-77 включен блочный If .. else ..endIf.
В опережение стандарта Ф-90 фирма MS
предложила свою реализацию Ф-77, в которой
появились блочные Do .. ..endDo Dowhile .. ..endDo и
SelectCase .. ..endSelect и составные операторы среди
неисполнямых операторов: Structure .. .. endStructure (соответствует
Type .. .. endType Ф-90), Map .. .. endMap Union..
..endUnion. Накопленный опыт программирования
показал, что структурированные программы не
только легче читать, но и легче отлаживать, легче
писать, конструируя программы из готовых блоков
средствами текстовых редакторов, таких как ME или
редактор, встроенный в FPS40. Именно благодаря
этому в MS-F-77 как и в Ф-90 удобно писать
структурированные программы без меток и
операторов go to
По количественному
составу в языке FORTRAN представлены:
Классификация |
по
месту в программе |
По
написанию |
31- неисполняемые |
29-исполняемые |
45 - простые |
27 -
описания базовых типов и определения |
18-присваивание,
пустышка, обмен данными, управление ходом
вычислений |
15 - составные |
4- описания
производных типов и определения |
4-программные
единицы
7 - блоки |
Как видно из приведенной таблицы словарный
запас языка Фортран (около сотни слов)
несравненно беднее естественных языков (сотни
тысяч слов). Отметим, что в языке "С"
словарный запас соизмерим с Фортраном, но
гораздо большее разнообразие допустимых простых
конструкций, например одних операторов
присваивания в "С" 10 штук вместо 1. В Pascal
ключевых слов несколько больше, чем в Фортране,
особенно в его диалекте Delphi. Оба языка и Фортран и
Pascal в отличие от "С" придерживаются строгой
концепции типов и являются высокоуровневыми
яэыками программирования. Яэык
программирования Фортран считается более
приспособленным к реализации методов вычислений
из математики, физики и статистики. Яэык
программирования "С" считается более
приспособленным к системному программированию,
к обслуживаню баз данных и интерфейсов. Яэык
программирования Pascal считался хорошо
приспособленным для обучения. С переходом к Windows
остался лишь один компилятор Delphi для Pascal, прием
он не яляется преемником Pascal для DOS даже для
той же фирмы Borland.
Языки Фортран и "С" в отличие от Pascal
развиваются через стандартизацию. Фортран
развивается по принципу эволюции таким образом,
что когда-либо объявленные конструкции
считаются допустимыми и в последующих версиях;
однако некоторые конструкции выходят из моды,
заменяясь более емкими. Концепция
структурного программирования впервые была
опробована в Pascal и, хорошо зарекомендовав себя,
нашла себе место и в новых стандартах Фортрана.
Языки Фортран и "С", имея компиляторы одной
фирмы MS, легче компонуются в единый исполняемый
модуль. При смешанном программировани с
использованием компиляторов разных фирм
(например MS Фортран и Borland Delphi) приходится
использовать стандартизованные динамически
связываемые библиотеки DLL.
Простые и составные операторы
В первоначальной версии языка
подавляющее большинство составляли простые
операторы, но действующая тенденция - к
обогащению составными операторами
(конструкциями). Каждый оператор в Фортране
традиционно начинается с новой строки, но в Ф-90
допускается в одной строке писать несколько
простых операторов, разделяя их ";". Простой
оператор можно записать в строку, пусть даже
длинную, пусть с переносом. Составной оператор
или конструкция занимает как минимум 3 строки и
не требует никаких знаков препинания в конце
Заголовок
группа операторов или один оператор
EndЗаголовок
Начальная и конечная строки Заголовок
.. .. EndЗаголовок как бы образуют скобки
составного оператора.
Традиции написания СО в разных языках
таковы
в языке "С" конструкция
выделяется фигурными скобками {}, а оператор
заканчивается знаком ";" пробелы, знаки
табуляции и конец строки используются свободно,
но не внутри имен; ключевые слова
зарезервированы в языке
в языке Pascal - блок выделяется
ключевыми словами begin и end , оператор
заканчивается знаком ";" , а программа
заканчивается точкой; пробелы и конец строки
используются свободно, но не внутри имен;
ключевые слова зарезервированы в языке
то, что в прежнем Фортране
разделялось концом строки, в Ф-90 может быть
разделено и знаком ";"
поэтому строка программы
program pr;implicit none;real x,y;integer::k,p;p=10;do k=1,10 ;
p=p-1;x=p*0.1;y=sin(x);write(*,*)p,x,y;enddo;end
не вызовет ошибок, однако она написана
согласно букве закона, но в нарушение духа
Фортрана
традиционная построчная запись
той же программы восприниматся легче
program pr
implicit none
real x,y; integer:: k,p !
простые операторы в строке разделены ";"
p=10
do k=1,10
p=p-1; x=p*0.1; y=sin(x); write(*,*)
p,x,y
enddo
end program pr
Следует иметь в виду отличие в
написании конструкций и операторов в программах
на Фортране и в таких языках как Паскаль и С
- в Паскале и С конструкции и операторы размещают
по строкам, чтобы их было удобно читать человеку
- в Фортране - не только для удобства чтения, но и
для понимания компилятором текста без ";"
- в Фортране "новый оператор - новая строка" и
нет необходимости в знаках препинания в конце
- при построчном оформлении в Фортране ";"
- это лишь разделитель простых операторов,
записанных в одну строку, а в Паскаль и С каждый
оператор должен завершаться знаком ";"
Правила написания
составных операторов
Начало СО определяется по начальной
строке с одним из следующих слов в заголовке:
- для описаний - это Type Map Union Interface
- для программных единиц (ПЕ) - это Program Subroutine
Function Module
- для блоков (исполняемых СО) - это Do
If SelectCase DoWhile Where
Конец СО - слово end, за которым
пишется то же самое ключевое слово, что и в
начале, например, Do .. endDo причем EndDo можно
писать с пробелом end do или без него enddo ,
маленькими или большими буквами. В конце ПЕ в Ф-77
писали просто end , а теперь повторяют
заголовок program progy .. .. end program progy . СО
группирует следующие подряд операторы, простые
или составные, образуя из них так называемый
"черный ящик". Термин "черный ящик"
означает возможность до поры до времени не
заглядывать внутрь него, концентрируя внимание
на размещении ящичков, а не на их содержимом.
Конструируя программу по определенным правилам
из черных ящичков, мы повышаем предсказуемость
поведения программы, облегчаем ее чтение,
облегчаем диагностику ошибок, облегчаем и
ускоряем отладку программы. Это подтверждено как
теорией, так и практикой программирования.
Представим в наглядной графической
форме основные правила.
- Досрочный выход из исполняемых СО
реализуется:
- в ту же точку, что и нормальный выход
- из программных единиц операторами return и stop
- из блока do оператором exit - на оператор следующий
за enddo
-можно, но опасно оператором перехода за область
действия блока (только не вовнутрь другого блока)
Ящички допустимо складывать тремя
способами:
1) для любых составных операторов - возможно
следование друг за другом
2) кроме следования для блоков (исполняемых СО)
допустимо вложение
3) Внутри одного текста ПЕ пишут
последовательно, либо ПЕ помещают в разные
тексты. В ПЕ вкладывают прочие СО и простые
операторы в определенном порядке
Классификация операторов ФОРТРАН
по назначению
Не претендуя на исчерпывающий список
операторов и конструкций FORTRAN, показанные
ниже таблицы группируют операторы по назначению
и дают представление об основных возможностях.
Принятые ниже обозначения:
v-переменная, c-константа,
e-выражение, f-функция, a-атрибут,
s-дескриптор
..v-список переменных через
запятую
.. ..- это один или много
операторов, идущих подряд в одной или нескольких
строках, которые объединяют в блок
{ } многократное повторение
конструкции
..{ } -повторение конструкции через
запятую
Поясним приведенные обозначения на
примере real ..v
здесь имеется в виду ключевое слово real ,
следом за которым идет список переменных ..v , включающий
любые имена переменных, разделенных запятыми. В
конкретном операторе это, к примеру, может
выглядеть как real alfa, mu2,six
НЕИСПОЛНЯЕМЫЕ ОПЕРАТОРЫ
( описания и определения )
Описание типов |
Пояснения |
implicit NONE |
все объекты описывать явно |
integer ..v real ..v complex ..v
logical ..v character ..v |
объявление объектов базовых
типов
числа
не числа |
Type ИМЯ_Т .. .. endType
Type (ИМЯ_Т ) ..v |
объявление производного типа
ИМЯ_Т
отнесение к нему переменных из списка ..v
|
..a ::
..v например
real,parameter :: pi=3.14, e=2.71 |
в Ф-90 слева от "::"
пишут список атрибутов, а справа - список
атрибутов |
Другие определения
|
dimension ..{ v(..c) } |
описание размерности массива |
|
allocatable ..v |
динамический объект |
|
save ..v |
объект, не сохраняемый в стеке |
|
parameter( ..{v= c} ) |
задание констант |
|
data ..{ ..v/ ..c / } |
инициализация переменных |
|
equivalence ..{( ..v )} |
список эквивлентных имен |
|
Map . . . . endMap
Union . . . . endUnion |
список эквивлентных полей |
|
m format (..s) |
формат ввода-вывода |
|
external .. f |
Функции внешние |
|
intrinsic ..f |
Функции внутренние |
|
ИМЯ( ..v)= e |
Функции операторные |
Большинство определений могут быть и
самостоятельными операторами и -атрибутами
в Ф-90.
ИСПОЛНЯЕМЫЕ ОПЕРАТОРЫ (действия)
Простые исполняемые операторы
Оператор чаще всего пишется с новой
строки, возможно с переносом
Оператор присваивания v
= e
пустышка
m continue
Обмен данными с файлами: u-устройство,
(u ..) - после u ряд необязательных
параметров
К началу файла
rewind (u) |
в конец файла
endfile(u) |
назад на запись
backspace(u) |
Открыть
open(u,file='ИМЯ' ..) |
закрыть
close(u) |
опросить
inquire (u ..) |
Разновидности |
Ввода |
вывода
|
под управлением списка |
read(u,*..) ..v |
write(u,*) ..e |
поименный Ввод/вывод по
объявленному списку переменных namelist
/ИМЯ/..v |
после namelist read(u,ИМЯ..) |
после namelist
write(u,ИМЯ) |
форматный ввод/вывод
(..s) - форматная строка |
read(u, '(..s)' ..) ..v |
write(u,'(..s)' ..) ..e |
форматный ввод/вывод со
ссылкой на формат
m format (..s) |
read(u,m ..) ..v |
write(u,m ..)..e |
Ввод/вывод,
отображающий память |
read(u) ..v |
write(u) ..e |
Управление ходом вычислений
Простые операторы -
пишутся в одну строку
if( условие e ) простой |
выполнить простой_оператор
при условии e |
if( условие e ) exit |
выйти из цикла при условии e |
if( условие e ) cycle |
к следующему проходу цикла при условии e
|
call ИМЯ(..e) |
вызов подпрограммы |
Нерекомендуемые возможности -
с метками m:
if( арифм.выражение e) m< ,
m= , m> условный переход по
знаку e - 0 +
go to m Безусловный переход
if(условие e ) go to m
условный переход
go to( ..m ),v Переключатель
по меткам в зависимости от целой v
CОСТАВНЫЕ ОПЕРАТОРЫ по
схеме начало .. .. конец
ПE пишут друг за другом, вкладывая в них
прочие операторы
Вид ПЕ |
Примечания |
program ИМЯ
.. ..
end |
досрочное окончание stop
пауза pause c |
subroutine ИМЯ(..v)
.. ..
end |
вызов - call
досрочный возврат
return |
function ИМЯ(..v)
.. ..
end |
вызов - упомянуть в выражении
досрочный возврат
return |
module ИМЯ
.. ..
end module ИМЯ |
использовать - use
без действий, но с модульными
процедурами и функциями |
Блоки
Условные блочные операторы
if( e ) then
.. ..
end if |
"если-то" - выполнить блок
при условии e |
if(e) then ! если-то
.. ..
else ! иначе
.. ..
end if |
в зависимости от условия e
выполнить один из 2 блоков |
select case(v)
..{case(c)
.. ..}
case default
.. ..
endselect |
по параметру v
выбрать один из
многих блоков "в случае c
"case default - блок в остальных случаях |
Циклы
Разновидности циклов: |
Выход
имя-имя цикла |
следующий проход |
do i = iн,iк, is
.. ..
end do ! цикл по параметру |
Exit
или
Exit имя |
Cycle
или
Cycle имя |
do while( условие e)
.. ..
end do ! итеративный цикл |
do
.. ..
end do ! бесконечный цикл |
Варианты написания и ряд деталей
проясняется по мере обсуждении конкретных
операторов.
Фортран уникален среди языков тем, что в нем нет
зарезервированых ключевых слов, например, write=2.5
воспринимается без ошибок как оператор
присваивания для переменной write .