1.информация. Количество информации. Представление информации вЭВМ.
2.Решение задач с использованием ЭВМ. Понятие об устройстве ЭВМ.Организация вычислительного процесса б ЭВМ.
3.Алгоритм. Свойства алгоритма. Способы представления алгоритма.Типы алгоритмов.
4.Порядок подготовки программы, исходный текст, трансляция иинтерпретация, редактирование связей. Язык программирования Фортран
5.Фортран.Злементы языка. Алфавит, лексемы, имена, выражения иоперации, операторы.
8.Фортран.Встроенные типы данных. Объявление данных. Правилоумолчания о типах данных.
7.Фортран. Встроенные операции. Оператор присваивания.
8.Конструкция DO. Разновидности конструкции DO. Операторы
CYCLE, EXIT.
9.ОператорIF, конструкцияIF THEN ENDIF.
10.КонструкцияIF THEN ELSE ENDIF,
11.ИнструкцияIF THEN ELSE IF.
12.КонструкцияSELECT CASE.
13.Программные компоненты и процедуры. Главная программа.
14.Программные компоненты и процедуры. Подпрограммы.
15.Программные компоненты и процедуры. Функции.
16.Программные компоненты и процедуры. Модули.
17.Обращение к сопрограммам. Параметры процедур. Виды связи
параметра. Атрибут INTENT.
13.Явный и неявный интерфейс. Оператор INTERFACE.
19.Области видимости имен и меток.
20.Производные типы данных. Оператор TYPE.
21.Массивы фиксированного размера. Описание, присвоение значений.Выражения с массивами. Сечения массивов, массивов.
22.Символьные данные, символьные вырашия.Текстовые подстроки. 23.Оператор и конструкция WHERE.
24.Динамические массивы. Размещаемые массивы.
25.Динамические массивы. Автоматические массивы.
26.Массивы — формальные параметры процедур. Массивы заданнойформы.
27.Массивы — формальные параметры процедур. Массивы, перенимаю-дше форму.
28.Массивы — формальные параметры процедур. Массивы, перенимающиеразмер.
29.Ассоциирование памяти. Оператор COuuO".
30.Ассоциирование памяти. Оператор EQUIVALENCE.
31.Рекурсия. Рекурсивные алгоритмы и определения.
32.Рекурсивные субпрограмны. ПредложениеRESULT. Рекурсия «изнутри»
З9.Сортировка. Постановка задачи. Сортировка выбором.
40. Пузырьковая сортировка.
41. Пирамидальная сортировка.
42. Быстрая сортировка.
43. Поиск. Постановка задачи. Дихотомический поиск.
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, обеспечивающеговозврат из подпрограммы.
Оператор EXIT[имя}
передает управление из DO-конструкции напервый следующий за kohiрукцией
выполняемыйоператор. Если имя опущено, то EXITобеспечив; выход из текущего цикла,
в противномслучае EXITобеспечивает выход цикла, имя которогоприсутствует в операторе EXIT.
Оператор CYCLE [имя]
передает управление на начало DO-конструкции. Приэтом оператор расположенные
между CYCLEи оператором ENDDOконца цикла, невыполняются. Если имя опущено, то CYCLE
обеспечивает переход на начало текущего цикла, в противном случае CYCLEобеспечивает
переход на начало цикла, имя которого присутствует в операторе CYCLE.
Условныйлогический оператор IF
IF(ЛВ) оператор
Если истинно ЛВ, то выполняется оператор,в противном случае управление передается на
последующий оператор программы.
Конструкция IFTHENENDIF
[имя-.]IF(ЛВ) THEN
БОК
END IF [имя]
БОК выполняется, если истинно ЛВ. Еслиприсутствует имя конструкции, то оно должно
быть ив первом и в последнем операторе конструкции, например:
swap: if(x
hold = х; х= у; у= hold
end if swap
Замечание.Если БОКсодержит один оператор, то лучше использовать
оператор
IF(ЛВ) оператор
Конструкция IFTHENELSEENDIF
[имя:] IF(ЛВ) THEN
БОК1
ELSE [имя]
БОК1
ENDIF[имя]
В случае истинности ЛВ выполняется БОК1 ивыполняется БОК2, если ЛВ ложно.
Имя конструкции, если оно задано, должнообязательно присутствовать и перед IF,
ипослеEND IF.
Конструкция IF THEN ELSE IF
[имя:] IF(ЛВ) THEN
БОК1
ELSE IF(ЛВ2) THEN [имя]
БОК2
…
[ELSE [имя]
БОКn
END IF [имя]
В случае истинности ЛВ1 выполняется БОК1 иуправление передается на
следующий за ENDIFоператор.Если ЛВ1 ложно, то управление
передается на следующий ELSEIF, то естьвычисляется значение
ЛВ2 и, если оно истинно,то выполняется БОК2. Если оно ложно, то
управление передается наследующий ELSEIF, и так далее. Если ложны все
ЛВ, товыполняется следующий за завершающим ELSEБОКп.
Если завершающий ELSEотсутствует, тоуправление передается на расположенный
за ENDIFоператор. Число операторов ELSEIFв конструкции может быть
произвольным. Имя в ELSEи в ELSEIFможно задавать, если это имя имеют
операторы IFи ENDIF. Имя, если оно задано, во всех частях
конструкции должно быть одинаковым.
Конструкция SELECT CASE
[имя:] SELECT CASE (тест-выражение)
CASE(CП1) [имя]
[БОК1]
[CASE(CП2) [имя]
[БОК2]]
…
[CASE DEFAULT [имя]
[БОКп]]
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)
Нельзя задать в СП диапазон значений, когда тест-выражение имееглогическийтип.
Каждое значение, даже если онозадано в диапазоне зна чений, может появляться только в одном СП.
Массив — это объект данных, который содержит конечноечисло скалярных данных одного типа. В отличие от простой переменноймассив обладает атрибутом DIMENSION.Массивызаданной формы
Границыразмерностей массивов — формальных параметров могут определяться передаваемымив процедуру
значениями других параметров. Так, врассмотренной в разд. 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 = 5, m= 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
Идея сортировки методом пузырька состоит в том, чтобыпросмотреть массив последовательно
несколько раз. Одинпросмотр состоит из сравнения каждого элемента массива со следующим
за ним элементом (xi сравнивается с xj+1) и обмена этих двух элементов,
если онирасполагаются не в нужном порядке (если Xi>xi+1)Быстрая сортировка
Рассмотрим массив х
25 37 12 33 48 57 92 86
В нем число 48 характеризуется тем, что, во-первых, всерасположенные левее него числа меньше 48
и, во-вторых, числа, расположенные правее него больше 48.Назовем такое число разделителем массива
. Нетрудно понять, что теперь мы можем отдельно решать задачу сортировки длячисел до разделителя
и для чисел посленего. Кроме того, сам разделитель находится в нужной позиции, то есть в
дальнейшейсортировке он уже не рассматривается.
Размещаемые массивы
рассмотренный массив marksявляется статическим — его размерне может быть изменен в процессе вычислений,
поэтому мы вынуждены задать 6горазмер с некоторым запасом (чтобы иметь возможность использовать массив
для любой студенческой группы).Это приводит к тому, что программа, как правило, занимает больше памяти,
чем это требуется на самом деле.Подобного перерасхода памяти можно избежать, если применить динамический
массив и каждый раз выделять под него столькопамяти, Сколько нужно. Работа с динамическим массивом происходит так:
выполняется объявление размещаемого массива. В отличие отстатических размещаемые массивы объявляются с атрибутом ALLOCATABLE.
Кроме того, каждое измерение размещаемого массива задаетсяв виде
двоеточия,например:
integer, allocatable,dimension(:) :: marks
определяется размер массива;
· оператором ALLOCATEвыделяется память под массив;
· после выполнения вычислений выделенная память освобождается. Это
· выполняется оператором DEALLOCATE;
· после этого массиву вновь может быть выделена свежая областьпамяти.
При размещении массива параметр 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
Автоматические массивы
В процедуре может быть задан локальный массив, размеры которого могутменяться при разных вызовах процедуры.
Такие массивы, так же как и локальные строки переменной длины (разд.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содержит в скобках данные о длинесимвольного объекта. Если длина не задана,
то по умолчанию она принимается равнойединице.