Реферат: Шпаргалки по Fortran
1.информация. Количество информации. Представление информации вЭВМ.<span Times New Roman"">
2.Решение задач с использованием ЭВМ. Понятие об устройстве ЭВМ.Организация вычислительного процесса б ЭВМ.<span Times New Roman"">
3.Алгоритм. Свойства алгоритма. Способы представления алгоритма.Типы алгоритмов.<span Times New Roman"">
4.Порядок подготовки программы, исходный текст, трансляция иинтерпретация, редактирование связей. Язык программирования Фортран<span Times New Roman"">
5.Фортран.Злементы языка. Алфавит, лексемы, имена, выражения иоперации, операторы.<span Times New Roman"">
8.Фортран.Встроенные типы данных. Объявление данных. Правилоумолчания о типах данных.<span Times New Roman"">
7.Фортран. Встроенные операции. Оператор присваивания.<span Times New Roman"">
8.Конструкция DO. Разновидности конструкции DO. Операторы<span Times New Roman"">
CYCLE, EXIT.<span Times New Roman"">
9.ОператорIF, конструкцияIF THEN ENDIF.<span Times New Roman"; mso-ansi-language:EN-US">
10.КонструкцияIF THEN ELSE ENDIF,<span Times New Roman"; mso-ansi-language:EN-US">
11.ИнструкцияIF THEN ELSE IF.<span Times New Roman"; mso-ansi-language:EN-US">
12.КонструкцияSELECT CASE.<span Times New Roman"; mso-ansi-language:EN-US">
13.Программные компоненты и процедуры. Главная программа.<span Times New Roman"">
14.Программные компоненты и процедуры. Подпрограммы.<span Times New Roman"">
15.Программные компоненты и процедуры. Функции.<span Times New Roman"">
16.Программные компоненты и процедуры. Модули.<span Times New Roman"">
17.Обращение к сопрограммам. Параметры процедур. Виды связи<span Times New Roman"">
<span Times New Roman";color:black">параметра. Атрибут
<span Times New Roman"; color:black;mso-ansi-language:EN-US">INTENT<span Times New Roman";color:black">.<span Times New Roman"">13.Явный и неявный интерфейс. Оператор INTERFACE.<span Times New Roman"">
19.Области видимости имен и меток.<span Times New Roman"">
20.Производные типы данных. Оператор TYPE.<span Times New Roman"">
21.Массивы фиксированного размера. Описание, присвоение значений.Выражения с массивами. Сечения массивов, массивов.<span Times New Roman"">
22.Символьные данные, символьные вырашия.Текстовые подстроки. 23.Оператор и конструкция WHERE.<span Times New Roman"">
24.Динамические массивы. Размещаемые массивы.<span Times New Roman"">
25.Динамические массивы. Автоматические массивы.<span Times New Roman"">
26.Массивы — формальные параметры процедур. Массивы заданнойформы.<span Times New Roman"">
27.Массивы — формальные параметры процедур. Массивы, перенимаю-дше форму.<span Times New Roman"">
28.Массивы — формальные параметры процедур. Массивы, перенимающиеразмер.<span Times New Roman"">
29.Ассоциирование памяти. Оператор COuuO".<span Times New Roman"">
30.Ассоциирование памяти. Оператор EQUIVALENCE.<span Times New Roman"">
31.Рекурсия. Рекурсивные алгоритмы и определения.<span Times New Roman"">
32.Рекурсивные субпрограмны. ПредложениеRESULT. Рекурсия «изнутри»<span Times New Roman"">
З9.Сортировка. Постановка задачи. Сортировка выбором.
40. Пузырьковая сортировка.
41. Пирамидальная сортировка.<span Times New Roman"">
42. Быстрая сортировка.<span Times New Roman"">
43. Поиск. Постановка задачи. Дихотомический поиск.
<span Courier New";mso-fareast-font-family: «Times New Roman»;color:black;mso-ansi-language:RU;mso-fareast-language:RU; mso-bidi-language:AR-SA">DO-Циклы.Операторы EXITи CYCLE
Простейшая конструкция DO
[имя:] DO
БОК
ENDDO(имя]
задает бесконечный цикл. Поэтому такой цикл должен содержать по крайнеймере
один оператор, например EXIT[имя], обеспечивающий выход из этого цикла.
Имя конструкции, если оноприсутствует, должно появляться в операторах DOи ENDDO.
Рекомендуемая форма DO-цикла с параметром:
[имя:] DO dovar = start, stop [, inc]
БОК ENDDO[имя]
dovar — целаяпеременная, называемая переменной цикла или параметром цикла;
start, stop — целые скалярные выражения, задающие диапазонизменения dovar;
inc — целое скалярное выражение, задающее лагизменения dovar. Значение incне может
быть равным нулю. Если параметр incотсутствует, то он принимается равным единице.
Рекомендуемая форма DOWHILE-цикла:
[имя] DO WHILE(ЛB)?
БОК
END DO [имя]
Если DOWHILE-цикл не содержитоператоров прерывания цикла,
БОК выполняется до тех пор, пока истинно скалярное ЛВ.
DO-цикл, DO-цикл с параметром и DOWHILE-цикл могут быть
рваны операторами GOTO, EXITи CYCLE, а также в результате
выполнения оператора RETURN, обеспечивающеговозврат из подпрограммы.
<span Arial",«sans-serif»; mso-bidi-font-family:«Courier New»;color:black;letter-spacing:-.05pt; mso-font-width:97%">Оператор
EXIT[имя}передает управление из DO-конструкции напервый следующий за kohiрукцией
выполняемыйоператор. Если имя опущено, то EXITобеспечив; выход из текущего цикла,
в противномслучае EXITобеспечивает выход цикла, имя которогоприсутствует в операторе EXIT.
<span Arial",«sans-serif»; mso-bidi-font-family:«Courier New»;color:black;mso-font-width:96%">Оператор
<span Arial",«sans-serif»; mso-bidi-font-family:«Courier New»;color:black;mso-font-width:92%;mso-ansi-language: EN-US">CYCLE<span Arial",«sans-serif»;mso-bidi-font-family:«Courier New»; color:black;mso-font-width:92%"> <span Arial",«sans-serif»;mso-bidi-font-family: «Courier New»;color:black;mso-font-width:92%">[имя]передает управление на начало DO-конструкции. Приэтом оператор расположенные
между CYCLEи оператором ENDDOконца цикла, невыполняются. Если имя опущено, то CYCLE
обеспечивает переход на начало текущего цикла, в противном случае CYCLEобеспечивает
переход на начало цикла, имя которого присутствует в операторе CYCLE.
Условныйлогический оператор IF
IF(ЛВ) оператор
Если истинно ЛВ, то выполняется оператор,в противном случае управление передается на
последующий оператор программы.
Конструкция IFTHENENDIF
[имя-.]IF(ЛВ) THEN
БОК
END IF [имя]
БОК выполняется, если истинно ЛВ. Еслиприсутствует имя конструкции, то оно должно
быть ив первом и в последнем операторе конструкции, например:
swap: if(x < у) then
hold = х; х= у; у= hold
end if swap
Замечание.Если БОКсодержит один оператор, то лучше использовать
оператор
IF(ЛВ) оператор
Конструкция IFTHENELSEENDIF
[имя:] IF(ЛВ) THEN
БОК1
ELSE [имя]
БОК1
ENDIF[имя]
В случае истинности ЛВ выполняется БОК1 ивыполняется БОК2, если ЛВ ложно.
Имя конструкции, если оно задано, должнообязательно присутствовать и перед IF,
ипослеEND IF.
<span Arial",«sans-serif»; color:black;mso-font-width:103%">Конструкция
<span Arial",«sans-serif»; color:black;mso-font-width:103%;mso-ansi-language:EN-US"> IF THEN ELSE IF<span Arial",«sans-serif»; color:black;mso-font-width:90%;mso-ansi-language:EN-US">[
<span Arial",«sans-serif»; color:black;mso-font-width:90%">имя<span Arial",«sans-serif»; color:black;mso-font-width:90%;mso-ansi-language:EN-US">:] <span Arial",«sans-serif»; color:black;mso-font-width:90%;mso-ansi-language:EN-US">IF(<span Arial",«sans-serif»; color:black;mso-font-width:90%">ЛВ<span Arial",«sans-serif»;color:black; mso-font-width:90%;mso-ansi-language:EN-US">) THENБОК1
<span Arial",«sans-serif»;color:black;mso-font-width:89%;mso-ansi-language: EN-US">ELSE IF(
<span Arial",«sans-serif»;color:black;mso-font-width:89%">ЛВ<span Arial",«sans-serif»; color:black;mso-font-width:89%;mso-ansi-language:EN-US">2) THEN [<span Arial",«sans-serif»; color:black;mso-font-width:89%">имя<span Arial",«sans-serif»; color:black;mso-font-width:89%;mso-ansi-language:EN-US">]<span Arial",«sans-serif»;color:black;mso-font-width:89%;mso-ansi-language: EN-US">
<span Arial",«sans-serif»; color:black;mso-font-width:92%">БОК<span Arial",«sans-serif»;color:black; mso-font-width:92%;mso-ansi-language:EN-US">2<span Arial",«sans-serif»;color:black;mso-font-width:92%;mso-ansi-language: EN-US">…
<span Arial",«sans-serif»;color:black;mso-font-width:93%;mso-ansi-language: EN-US">[ELSE [
<span Arial",«sans-serif»;color:black;mso-font-width:93%">имя<span Arial",«sans-serif»; color:black;mso-font-width:93%;mso-ansi-language:EN-US">]<span Arial",«sans-serif»; mso-bidi-font-family:«Courier New»;color:black;letter-spacing:-.05pt; mso-font-width:91%">БОК
<span Arial",«sans-serif»;mso-bidi-font-family: «Courier New»;color:black;letter-spacing:-.05pt;mso-font-width:91%;mso-ansi-language: EN-US">n<span Arial",«sans-serif»; mso-bidi-font-family:«Courier New»;color:black;mso-font-width:90%;mso-ansi-language: EN-US">END IF [
<span Arial",«sans-serif»;mso-bidi-font-family:«Courier New»; color:black;mso-font-width:90%">имя<span Arial",«sans-serif»; mso-bidi-font-family:«Courier New»;color:black;mso-font-width:90%;mso-ansi-language: EN-US">]В случае истинности ЛВ1 выполняется БОК1 иуправление передается на
следующий за ENDIFоператор.Если ЛВ1 ложно, то управление
передается на следующий ELSEIF, то естьвычисляется значение
ЛВ2 и, если оно истинно,то выполняется БОК2. Если оно ложно, то
управление передается наследующий ELSEIF, и так далее. Если ложны все
ЛВ, товыполняется следующий за завершающим ELSEБОКп.
Если завершающий ELSEотсутствует, тоуправление передается на расположенный
за ENDIFоператор. Число операторов ELSEIFв конструкции может быть
произвольным. Имя в ELSEи в ELSEIFможно задавать, если это имя имеют
операторы IFи ENDIF. Имя, если оно задано, во всех частях
конструкции должно быть одинаковым.
<span Arial",«sans-serif»; color:black;mso-font-width:96%">Конструкция
<span Arial",«sans-serif»; color:black;mso-font-width:96%;mso-ansi-language:EN-US">SELECT<span Arial",«sans-serif»; color:black;mso-font-width:96%"> <span Arial",«sans-serif»;color:black; mso-font-width:96%;mso-ansi-language:EN-US">CASE<span Arial",«sans-serif»; color:black;mso-font-width:91%">[имя:]
<span Arial",«sans-serif»; color:black;mso-font-width:91%;mso-ansi-language:EN-US">SELECT<span Arial",«sans-serif»; color:black;mso-font-width:91%"> <span Arial",«sans-serif»;color:black; mso-font-width:91%;mso-ansi-language:EN-US">CASE<span Arial",«sans-serif»;color:black; mso-font-width:91%"> (тест-выражение)<span Arial",«sans-serif»;color:black;mso-font-width:97%;mso-ansi-language: EN-US">CASE(C
<span Arial",«sans-serif»;color:black;mso-font-width:97%">П<span Arial",«sans-serif»; color:black;mso-font-width:97%;mso-ansi-language:EN-US">1) [<span Arial",«sans-serif»; color:black;mso-font-width:97%">имя<span Arial",«sans-serif»;color:black; mso-font-width:97%;mso-ansi-language:EN-US">]<span Arial",«sans-serif»; color:black;mso-font-width:95%;mso-ansi-language:EN-US">[
<span Arial",«sans-serif»; color:black;mso-font-width:95%">БОК<span Arial",«sans-serif»;color:black; mso-font-width:95%;mso-ansi-language:EN-US">1]<span Arial",«sans-serif»; color:black;mso-font-width:95%;mso-ansi-language:EN-US">
<span Arial",«sans-serif»;color:black; mso-font-width:90%;mso-ansi-language:EN-US">[CASE(C<span Arial",«sans-serif»; color:black;mso-font-width:90%">П<span Arial",«sans-serif»;color:black; mso-font-width:90%;mso-ansi-language:EN-US">2) [<span Arial",«sans-serif»;color:black; mso-font-width:90%">имя<span Arial",«sans-serif»;color:black; mso-font-width:90%;mso-ansi-language:EN-US">]<span Arial",«sans-serif»; color:black;mso-font-width:99%;mso-ansi-language:EN-US">[
<span Arial",«sans-serif»; color:black;mso-font-width:99%">БОК<span Arial",«sans-serif»;color:black; mso-font-width:99%;mso-ansi-language:EN-US">2]]<span Arial",«sans-serif»; color:black;mso-font-width:99%;mso-ansi-language:EN-US">…
<span Arial",«sans-serif»; color:black;mso-font-width:92%;mso-ansi-language:EN-US">[CASE DEFAULT [
<span Arial",«sans-serif»; color:black;mso-font-width:92%">имя<span Arial",«sans-serif»;color:black; mso-font-width:92%;mso-ansi-language:EN-US">]<span Arial",«sans-serif»; color:black;mso-font-width:97%;mso-ansi-language:EN-US">[
<span Arial",«sans-serif»;color:black;mso-font-width:97%">БОКп<span Arial",«sans-serif»; color:black;mso-font-width:97%;mso-ansi-language:EN-US">]]ENDSELECT[имя]
Тест-выражение — целочисленное,символьное типа CHARACTER(l)
Или логическоескалярное выражение.
СП — список констант, тип которых должен соответствоватьтипу тест-выражения.
Конструкция SELECTCASE-работает так: вычисляется значение тест-выражения. Если
полученное значение находится в списке СП1, то выполняется БОК1; далееуправление
передается на следующий за ENDSELECTоператор. Если значение в СП1 не находится,
то проверяется, есть ли оно в СП2, и так далее.Если значение тест-выражения не найдено
ни в одном списке и присутствует оператор CASEDEFAULT, то выполняется БОКп, а далее
выполняется расположенный за ENDSELECTоператор. Если же значение тест-выражения
не найдено ни в одном списке и CASEDEFAULTотсутствует, то ни один из БОКл не выполняется
и управление передается на следующий за ENDSELECTоператор.
Список констант СП может содержать одно значение, илисостоять из разделенных
запятымиконстант, или быть задан как диапазон разделенных двоеточием значений,
например 5:10 или T:'N'. Левая граница должна был меньше правой. Если задается
диапазон символов, то код первого символе должен бытьменьше кода второго. Если
опущена леваяграница, например :10, то в СП содержатся все значения, меньшие
или равные правойгранице. И наоборот, если опущена верхняя граница, например5:,
то в СП попадают все значения, большие или равные нижней границе. СП можеч
включать также и смесь отдельных значений и диапазонов. Разделителям! между отдельны
ми элементами СП являются запятые, например:
case(1, 5, 10:15, 33)
Нельзя задать в СП диапазон значений, когда тест-выражение имееглогическийтип.
Каждое значение, даже если онозадано в диапазоне зна чений, может появляться только в одном СП.
<span Times New Roman";mso-ansi-language:EN-US">
<span Times New Roman";mso-ansi-language:EN-US">
<span Times New Roman",«serif»;letter-spacing: 0pt;font-weight:normal">Массив — это объект данных, который содержит конечноечисло скалярных <span Times New Roman",«serif»;letter-spacing: 0pt;font-weight:normal">данных одного типа. В отличие от простой переменноймассив обладает атрибутом <span Times New Roman",«serif»;letter-spacing: 0pt;mso-ansi-language:EN-US;font-weight:normal">DIMENSION<span Times New Roman",«serif»; letter-spacing:0pt;font-weight:normal">.<span Times New Roman",«serif»;letter-spacing:0pt;font-weight:normal"><span Times New Roman",«serif»;letter-spacing:0pt;font-weight:normal">Массивызаданной формыГраницыразмерностей массивов — формальных параметров могут определяться передаваемымив процедуру
значениями других параметров. Так, врассмотренной в разд. 6.3.1 задаче пользовательская функция md
имеетсинтаксис
result= md(d,n)
где d — массив — формальный параметрзаданной формы; an — целочисленный скаляр, используемый
для задания размера массива d.
функциявызывается 3 раза:
а= md(a, na); mb= md(b, nb); me= md(c, nc)
При каждом вызове фактическим параметром является массивтой же формы, что
и массив — формальный параметр. Передаваемые размерности пассивов имеют разные значения.
Однако формаассоциируемых при вызове процедуры массивов фактических и формальных
параметров может различаться, что позволяет вряде случаев упростить написание программы.
Так этопроисходит при создании подпрограммы обмена содержимого двух многомерныхмассивов:
integer,parameter :: n = <st1:metricconverter ProductID=«5, m» w:st=«on»>5, m</st1:metricconverter>= 10, k = m*n
real a(m, n) /k*1.0/, b(m, n) /k*2.0/
call swap(a, b, m, n)
write(*, *) b
end
subroutine swap(a, b, m, n)
integerm, n
reala(m*n), b(m*n) ! а и b– массивы заданной формы)
realc(size(a)) ! с — автоматический массив
с= а
a= b
end subroutine swap
В общем случаедля формального параметра — массива могут вычисляться как нижняя,
так и верхняя границы размерности. Общий видразмерности таких массивов:
[нижняяграница]: [верхняя граница]
Нижняя и верхняя границы — целочисленныеописательные выражения. Вычисленные
границы массивафиксируются на время выполнения процедуры и не меняются при
изменении значения соответствующего описательного выражения.
При работе с такими массивами необходимо следить, чтобыразмер массива — формального
параметра не превосходил размера ассоциированного сним массива — фактического параметра.
Если фактическим параметром является многомерный массив исоответствующим ему формальным
параметром являетсямассив заданной формы с тем же числом измерений, то для правильного
ассоциирования необходимоуказать размерности массива — формального параметра такими же,
Как и у массива — фактического параметра.Исключение может составлять верхняя граница последней
размерности массива, котораяможет меньше соответствующей границы массива — фактического параметра.
Если в качестве фактического параметра задан элемент массива, т формальныйпараметр
ассоциируется с элементами массива-родителяначиная с данного элемента и далее по порядку.
Массивы, перенимающие формуТакие массивы- формальные параметры перенимают форму у соответствующего фактического
параметра. В результате ранг и формафактического и формального параметров совпадают. При описании
формы формального параметра каждаяразмерность имеет вид: [нижняя граница] :
гденижняя граница — это целое описательное выражение, которое може!зависеть от данных в процедуре
или других параметров. Если нижняя границаопущена, то ее значение по умолчанию равно единице.
Например» ПРИ вызове
realх(0:3, 0:6, 0:8)
interface
subroutine asub(a)
real a(:, :, :)
end
end interface
call asub(x)
Соответствующийперенимающий форму массив объявляется так:
subroutine asub(a)
real a(:, :, :)
prnt*, lbound(a, 3), ubound(a,3) ! 1 9
Так как нижняя граница в описаниимассива а отсутствует, то после вызова подпрограммы в ней будет
определен массив а(4, 7, 9). Если нужно сохранить соответствие границ, томассив а следует объявить так:
reala(0:, 0:, 0:)
В интерфейсном блоке по-прежнему массив а можнообъявить:
realа(:, :, :)
Процедуры, содержащие в качестве формальных параметровперенимающие форму массивы,
должны обладать явнозаданным интерфейсом.
Сортировка
Основноеназначение сортировки — обеспечить быстрый поиск данных. Помимо этого, вотсортированном
файлеили массиве гораздо быстрее выполнять многие вычисления.
Сортировка методом пузырька
Сортировка методом пузырька наиболее проста для реализации,но имеет по сравнению
с другими методаминаименьшую вычислительную эффективность.
Не теряя общности, будем для простоты изложения вдальнейшем рассматривать задачу
сортировки массива х целых чисел, в котором первые я чиселдолжны быть
отсортированы так,чтобы хi <= Xjдля 1 <=i<= j<= п.
Идея сортировки методом пузырька состоит в том, чтобыпросмотреть массив последовательно
несколько раз. Одинпросмотр состоит из сравнения каждого элемента массива со следующим
за ним элементом (xi сравнивается с xj+1) и обмена этих двух элементов,
если онирасполагаются не в нужном порядке (если Xi>xi+1)
<span Times New Roman",«serif»; font-weight:normal">Быстрая сортировка<span Times New Roman",«serif»;font-weight:normal">Рассмотрим массив х
25 37 12 33 48 57 92 86
В нем число 48 характеризуется тем, что, во-первых, всерасположенные левее него числа меньше 48
и, во-вторых, числа, расположенные правее него больше 48.Назовем такое число разделителем массива
. Нетрудно понять, что теперь мы можем отдельно решать задачу сортировки длячисел до разделителя
и для чисел посленего. Кроме того, сам разделитель находится в нужной позиции, то есть в
дальнейшейсортировке он уже не рассматривается.
Размещаемые массивы
рассмотренный массив marksявляется статическим — его размерне может быть изменен в процессе вычислений,
поэтому мы вынуждены задать 6горазмер с некоторым запасом (чтобы иметь возможность использовать массив
для любой студенческой группы).Это приводит к тому, что программа, как правило, занимает больше памяти,
чем это требуется на самом деле.Подобного перерасхода памяти можно избежать, если применить динамический
массив и каждый раз выделять под него столькопамяти, Сколько нужно. Работа с динамическим массивом происходит так:
выполняется объявление размещаемого массива. В отличие отстатических размещаемые массивы объявляются с атрибутом ALLOCATABLE.
Кроме того, каждое измерение размещаемого массива задаетсяв виде
двоеточия,например:
integer, allocatable,dimension(:) :: marks
определяется размер массива;
·<span Times New Roman"">
оператором ALLOCATEвыделяется память под массив;·<span Times New Roman"">
после выполнения вычислений выделенная память освобождается. Это·<span Times New Roman"">
выполняется оператором DEALLOCATE;·<span Times New Roman"">
после этого массиву вновь может быть выделена свежая областьпамяти.При размещении массива параметр STAT= позволяет узнать, удалось лиразместить массив.
Этот параметр можетбыть опущен, но тогда любая неудача при выделении памяти приведет к ошибкеэтапа исполнения и остановке
программы. Параметруказывается в операторе ALLOCATEпоследним. При удачном выделении памяти целочисленнаястатусная переменная
ierrвозвращает нуль, в противномслучае возвращается код ошибки размещения. Причиной ошибки может быть,например,
недостаток памяти или «попытка разместить ранееразмещенный и не освобожденный оператором DEALLOCATEобъект.
Аналогичную роль играет необязательный параметр STAT= и в операторе DEALLOCATE.
Сечение массива
ВФортране можно получить доступ не только к отдельному элементу массива, но и кнекоторому подмножеству его элементов.
Такоеподмножество элементов массива называется сечением массива. Сечениемассива может быть получено в результате применения
индексноготриплета или векторногоиндекса, которые при задании сечения подставляются вместо одного изиндексов массива.
Индексный триплетимеет вид: [нижняя граница]: [верхняя граница] [.шаг]
Каждый изпараметров триплета является целочисленным выражением. Шаг измененияиндексов может быть и положительным и
отрицательным,но не может равняться нулю. Все параметры триплета являются необязательными.
Индексныйтриплет задает последовательность индексов, в которой первый элемент равен егонижней границе,
а каждыйпоследующий больше (меньше) предыдущего на величину шага. В последовательностинаходятся все
задаваемые таким правилом значения индекса,лежащие между границами триплета. Если же нижняя граница больше
верхней ишаг положителен или нижняя граница меньше верхней и шаг отрицателен, топоследовательность является пустой.
Пример.
reala(1:10);,
а(3:7:2) = 3.0 ! Триплет задает сечение массива с элементами
! а(3), а(5),а(7), которые получат значение 3.0
а(7:3:-2)= 3.0 ! Элементы а(7), а(5),а(3) получат значение 3.0
<span Times New Roman»;mso-ansi-language:EN-US">
<span Times New Roman";mso-ansi-language:EN-US">
<span Times New Roman";mso-ansi-language:EN-US">
<span Times New Roman";mso-ansi-language:EN-US">
Автоматические массивы
В процедуре может быть задан локальный массив, размеры которого могутменяться при разных вызовах процедуры.
Такие массивы, так же как и локальные строки переменной длины (разд.10.4), относятся к автоматическим объектам.
Рекурсивные процедурыФортранподдерживает рекурсивные вызовы внешних, модульных и внутренних процедур.
Процедураназывается рекурсивной, если она обращается сама к себе или вызываетдругую процедуру, которая, в свою очередь,
вызывает первуюпроцедуру. В первом случае рекурсия называется прямой, во втором — косвенной.
Оператор объявления рекурсивной процедуры должен предваряться префиксом RECURSIVE. Внутри рекурсивной
процедуры интерфейс к этойпроцедуре является явным (см. разд. 16.4.3).
Пример. Разработать подпрограмму subst, которая в данной строке заменяет все вхожденияподстроки sub1
на подстроку sub2. Так, если дана строка 'abc1abc2abc3' и sub1 = 'abc', asub2 = ' d', то результатом должна быть строка ' dld2 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 ! Длина каждой строки определяется
integerip ! длиной соответствующего
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содержит в скобках данные о длинесимвольного объекта. Если длина не задана,
то по умолчанию она принимается равнойединице.
<span Times New Roman"">