Главная      Учебники - Разные     Лекции (разные) - часть 32

 

Поиск            

 

Шпаргалки для экзамена по Fortrany

 

             

Шпаргалки для экзамена по Fortrany

Автоматические массивы

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

Такие массивы, так же как и локальные строки переменной длины (разд. 10.4), относятся к автомати­ческим объектам.

Рекурсивные процедуры

Фортран поддерживает рекурсивные вызовы внешних, модульных и внутренних процедур.

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

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

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

процедуры интерфейс к этой процедуре является явным (см. разд. 16.4.3).

Пример. Разработать подпрограмму subst, которая в данной строке заме­няет все вхождения подстроки sub1

на подстроку sub2. Так, если дана стро­ка 'abc1abc2abc3' и sub1 = 'abc', a sub2 = ' d', то результатом должна быть строка ' dl d2 d3'.

program stgo

character(len = 20) :: st = 'abc1abc2abc3'

call subst(st, 'abc', d') ! subst содержит прямую

write(*, *) st ! рекурсию d1 d2 d3

end

recursive subroutine subst(st, subl, sub2)

character(len = *) st, sub1, sub2 ! Длина каждой строки определяется
integer ip ! длиной соответствующего
ip = index(st, sub1) ! фактического параметра
if(ip > 0) then

st = st(:ip - 1) // sub2 // st(ip + len(subl):)

call subst(st, subl, sub2) ! Рекурсивный вызов подпрограммы
endif ! выполняется до тех пор, пока

end ! не выполнены все замены subl на sub2

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

отличное от имени Функции. Это выполняется путем добавления в заголовок функции пред­ложения RESULT.

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

Символьные типы данных

Символьный тип данных позволяет задать объект, состоящий из последовательности символов.

Такую последовательность мы будем строкой. Символьный тип данных могут иметь объекты: переменные,

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

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

объединение отдельных строк или подстрок символов. Объявление символьных.данных выполняется

оператором CHARACTER, например:

character :: ch = 'а' ! Символьная переменная длиной в 1 символ

character(len = 20) st ! Символьная переменная из 20 символов

st = 'Example' ! Присвоим значение символьной переменной

st == st // '_' // ch ! Возвращает: Example_a

Оператор CHARACTER содержит в скобках данные о длине символь­ного объекта. Если длина не задана,

то по умолчанию она принимается равной единице.


DO-Циклы. Операторы EXIT и CYCLE

Простейшая конструкция DO

[имя:] DO

БОК

END DO (имя]

задает бесконечный цикл. Поэтому такой цикл должен содержать по край­ней мере

один оператор, например EXIT [имя], обеспечивающий выход из этого цикла.

Имя конструкции, если оно присутствует, должно появляться в операторах DO и END DO.

Рекомендуемая форма DO-цикла с параметром:

[имя:] DO dovar = start, stop [, inc]

БОК END DO [имя]

dovar - целая переменная, называемая переменной цикла или параметром цикла;

start, stop - целые скалярные выражения, задающие диапазон изменения dovar;

inc - целое скалярное выражение, задающее лаг изменения dovar. Значение inc не может

быть равным нулю. Если параметр inc отсутствует, то он принимается равным единице.

Рекомендуемая форма DO WHILE-цикла:

[имя] DO WHILE(ЛB)?

БОК

END DO [имя]

Если DO WHILE-цикл не содержит операторов прерывания цикла,

БОК выполняется до тех пор, пока истинно скалярное ЛВ.

DO-цикл, DO-цикл с параметром и DO WHILE-цикл могут быть

рваны операторами GOTO, EXIT и CYCLE, а также в результате

выполнения оператора RETURN, обеспечивающего возврат из подпрограммы.

Оператор EXIT [имя}

передает управление из DO-конструкции на первый следующий за kohi рукцией

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

в противном случае EXIT обеспечивает выход цикла, имя которого присутствует в операторе EXIT.

Оператор CYCLE [имя]

передает управление на начало DO-конструкции. При этом оператор расположенные

между CYCLE и оператором END DO конца цикла, не выполняются. Если имя опущено, то CYCLE

обеспечивает переход на начало текущего цикла, в противном случае CYCLE обеспечивает

переход на начало цикла, имя которого присутствует в операторе CYCLE.


Условный логический оператор IF

IF(ЛВ) оператор

Если истинно ЛВ, то выполняется оператор, в противном случае управ­ление передается на

последующий оператор программы.

Конструкция IF THEN ENDIF

[имя-.]IF(ЛВ) THEN

БОК

END IF [имя]

БОК выполняется, если истинно ЛВ. Если присутствует имя конструк­ции, то оно должно

быть и в первом и в последнем операторе конструкции, например:

swap: if(x < у) then

hold = х; х = у; у = hold

end if swap

Замечание. Если БОК содержит один оператор, то лучше использовать

оператор

IF(ЛВ) оператор

Конструкция IF THEN ELSE ENDIF

[имя:] IF(ЛВ) THEN

БОК1

ELSE [имя]

БОК1

END IF [имя]

В случае истинности ЛВ выполняется БОК1 и выполняется БОК2, если ЛВ ложно.

Имя конструкции, если оно задано, должно обязательно присут­ствовать и перед IF,

и после END IF.

Конструкция IF THEN ELSE IF

[имя:] IF(ЛВ) THEN

БОК1

ELSE IF(ЛВ2) THEN [имя]

БОК2

[ELSE [имя]

БОКn

END IF [имя]

В случае истинности ЛВ1 выполняется БОК1 и управление передается на

следующий за END IF оператор. Если ЛВ1 ложно, то управление

пере­дается на следующий ELSE IF, то есть вычисляется значение

ЛВ2 и, если оно истинно, то выполняется БОК2. Если оно ложно, то

управление пере­дается на следующий ELSE IF, и так далее. Если ложны все

ЛВ, то выпол­няется следующий за завершающим ELSE БОКп.

Если завершающий ELSE отсутствует, то управление передается на расположенный

за END IF опера­тор. Число операторов ELSE IF в конструкции может быть

произвольным. Имя в ELSE и в ELSE IF можно задавать, если это имя имеют

операторы IF и END IF. Имя, если оно задано, во всех частях

конструкции должно быть одинаковым.

Конструкция SELECT CASE

[имя:] SELECT CASE (тест-выражение)