6.3 Программы и компилируемые части программ.pptx
- Количество слайдов: 50
Массивы
МАССИВЫ • Массив – это упорядоченный набор фиксированного количества элементов. Все компоненты массива принадлежат к одному типу, называемому базовым типом для массива. • Массив относится к однородным структурам с прямым доступом. То есть выделение конкретной компоненты массива осуществляется по индексу массива. • Количество индексов в массиве определяет его размерность, и массивы могут быть, соответственно, одномерными, двумерными, трехмерными и т. д.
• Каждый массив должен быть описан в начале программы с помощью оператора размерности DIMENSION с указанием предельных значений каждого индекса, которые задаются целыми константами. • Это необходимо для того, чтобы зарезервировать соответствующий объем памяти для хранения элементов массива.
• DIMENSION A (10, 30), BK (500), IU (3: 40) • Здесь первый массив – двумерный, а второй и третий – одномерные. Первый индекс в массиве А изменяется от 1 до 10, второй от 1 до 30. Во втором и третьем массивах индексы изменяются, соответственно, от 1 до 500 и от 3 до 40. • Если не указана нижняя граница изменения индекса, то она принимается равной 1.
Описание размерности массива может быть совмещено с описанием типа переменных. Поэтому запись эквивалентна записи • REAL KA, KLF • INTEGER, RS(5, 5), R 1(10) • INTEGER R 1, RS • REAL KA(15, 15), KLF(100) • DIMENSION KA(15, 15), • INTEGER(2) KLF(100), R 1(10), RS(5, 5)
• Для удобства описания массивов можно предварительно присвоить константам символические имена. • INTEGER, PARAMETER : : Nmax=40 • INTEGER, PARAMETER : : N_max=4, N_min=-2 • INTEGER STUD (Nmax) • INTEGER BSPL (N_min: N_max)
• При обращении к элементу массива необходимо указывать его имя и в круглых скобках список индексов, которые могут быть либо константами, либо арифметическими выражениями целого типа, например • A(I+2*J-L/2) или S(J, I+3) или T(I, J, 2*L) • В этом случае целые переменные I, J, L должны быть заданы в предыдущей части программы.
• Задать значения элементам массива можно различными способами: • Присвоить значения отдельным элементам с помощью оператора присваивания: • A(3)=5. 6 • Присвоить значения сразу всем элементам массива. • Элементы массива можно ввести с клавиатуры. • При вводе и выводе массивов используются два основных способа – ввод-вывод массива по имени или с помощью цикла в списке вводавывода
Описание массивов либо Массив может описываться по разному: • • • 2 REAL X DIMENSION X(100) DO 2 I=1, 100 X(I)=I**2 CONTINUE • • 2 REAL X (100) DO 2 I=1, 100 X(I)=I**2 CONTINUE Элементы массива располагаются по столбцам в отличие от других языков программирования.
Описание двухмерного массива • • • DIMENSION IA(10, 20) С Чтение в границы массива. Эти границы не превышают С 10 и 20 соответственно. Затем чтение в массив неявным С циклом DO с вводным форматом 8 колонок по 5 цифр. READ (*, 990) IL, JL, ((IA(I, J), J=1, JL), I=1, IL) 990 FORMAT (2 I 5/, (8 I 5)) Элементы массива располагаются по столбцам в отличие от других языков программирования.
Программы и компилируемые части программ
1. Программа • Любая программная единица, не начинающаяся с оператора FUNCTION или SUBROUTINE. • Первым оператором может быть PROGRAM, но такой оператор не обязателен. Выполнение программы всегда начинается с первого выполняемого оператора в главной программе. • Следовательно, в каждой выполняемой программе должна быть единственная главная программа.
2. Подпрограмма • Программная единица, которая может вызваться из других программных единиц оператором CALL, будучи вызванной, подпрограмма осуществляет набор действий, определенных ее выполняемыми операторами, и затем возвращает управление на оператор, стоящий непосредственно за оператором вызова. • Подпрограмма не возвращает прямо величины, хотя они могут быть переданы в вызывающую программную единицу через параметры или общие переменные.
3. Функция • Программная единица, которая может быть употреблена в выражении. • Функция прямо возвращает величину, которая используется при вычислении этого выражения, и кроме того может возвращать величины через параметры. • Существует три вида функций: внешние, внутренние и функция-оператор. (Функция -оператор не может быть скомпилирована отдельно).
4. Подпрограмма блока данных • Программная единица, обеспечивающая начальные значения переменных в COMMON-блоках. • Переменные обычно заводятся оператором DATA, но переменные в COMMON не могут быть заведены нигде кроме подпрограммы блока данных.
Подпрограммы и функции • Подпрограммы и функции позволяют создавать большие структурированные программы, которые можно делить на части. • Это дает преимущества в следующих ситуациях:
Подпрограммы и функции • Если программа большая, разделение ее на части облегчает создание, тестирование и ее сборку. • Если программа большая и повторная компиляция всего исходного текста занимает много времени, разделение ее на части экономит время компиляции. • Если надо использовать некоторые процедуры во многих других программах, можно создать один объектный файл из этих процедур и затем загружать его в каждую из программ, в которой нужны эти процедуры. • Если процедуру надо использовать в разных случаях разным образом, можно записать ее в отдельный файл и скомпилировать отдельно.
Программа имеет линейную структуру (программные единицы - подпрограммы и функции)
Вызов программной единицы • Каждая программная единица должна иметь свое уникальное имя. • Необходимо учитывать и имена программных единиц в присоединяемых библиотеках. • Вызов программной единицы осуществляется оператором вызова CALL для подпрограмм или указателем функции для подпрограмм-функций.
Оператор-функция • Оператор-функция определяет функцию в одном операторе. • В нем задается имя функции, скалярные формальные параметры, не требующие описания их свойств, выражение, с помощью которого вычисляется значение функции. • Оператор-функция размещается в описательной части программной единицы. • FF(X, Y)= X**2+Y**2
Функция-оператор • Определяет функцию в виде одного оператора. • ----------------------------- • имя-функции ([параметр], [параметр]. . . ])=выражение • ----------------------------- • Где имя-функции - это имя функции-оператора параметр - это имя формального параметра выражение - это любое выражение
Особенности Функции оператор • Функция оператор подобна по виду оператору присваивания. • Функция-оператор может стоять только после операторов определения типа и перед любыми исполняемыми операторами в программной единице, в которой она используется. • Функция-оператор - это невыполняемый оператор, хотя она и является первым оператором в программной единице. Однако, тело функции-оператора служит для определения значения функции-оператора. Как и другие любые функции функция-оператор вычисляется по ссылке в выражении.
Особенности функции- оператора • Тип выражения должен быть совместим с типом имени функции- оператора. • Список имени формальных параметров служит для определения числа и типа параметров функции-оператора. • Имя функции-оператора локально по отношению к программной единице; оно не должно быть использовано где либо еще, кроме имени COMMON-блока или имени формального параметра в другой функцииоператоре.
Пример оператора функцияоператор • DIMENSION X(10) • ADD(A, B)=A+B • C • DO 1 I=1, 10 • X(I)=ADD(Y, Z) • 1 CONTINUE
SUBROUTINE Подпрограмма • Определяет программную единицу как программу, присваивает ей имя и определяет формальные параметры для этой подпрограммы.
• • • Подпрограммы При создании программ часто появляется некоторая последовательность команд (инструкций), которую необходимо выполнять в нескольких местах. Можно эту последовательность переписать несколько раз в нужных местах, но это удлинит текст программы и уменьшит ее читабельность (последнее, несомненно, хуже для программиста), и существенно увеличит вероятность внесения ошибок в программу. Можно попытаться обойти эту проблему с помощью GO TO. Но это потребует дополнительной логики, что опять повышает вероятность ошибок.
Подпрограммы • В большинстве языков программирования для решения этой проблемы введено понятие подпрограммы • Подпрограмма – это «кусок» кода, который вынесен из основной программы и которому дано уникальное имя. • Тогда в месте, где необходимо выполнить эту последовательность кода, необходимо просто сослаться на имя подпрограммы. Это называется вызовом подпрограммы (процедуры, функции, …).
Пример • мы хотим несколько раз напечатать ряд одинаковых строчек • print *, ’--------------‘ • print *, ’***********‘ • print *, ’--------------‘
Пример • Вместо того, чтобы несколько раз в тексте программы набирать (или копировать, что несколько лучше: ) эти 3 строки, можно оформить их в виде подпрограммы: • • • subroutine Prt. Something() ! имя подпрограммы print *, ’--------------‘ print *, ’***********‘ print *, ’--------------‘ end
Пример • Теперь в любом месте программы, где должна производиться соответствующая печать, нужно вызвать эту подпрограмму по ее имени: • call Prt. Something()
Правила общения подпрограммы с внешним миром • Подпрограмма НИЧЕГО не знает о том, кто и когда ее вызывает! • Для нее не существует ничего вне ее кода. Она НИЧЕГО не знает о переменных вне ее. • Чтобы сделать доступными какие-то данные подпрограмме, их надо передать в списке параметров, который стоит сразу за именем подпрограммы в скобках: • subroutine Prе. Values(a, b, c).
Параметры подпрограммы • Параметры, записанные в заголовке подпрограммы, называются формальными параметрами (аргументами). Для подпрограммы это просто переменные. • Параметры, подставленные в месте вызова подпрограммы, называются фактическими параметрами. В качестве фактических параметров могут быть константы, переменные или (неявные) результаты выражений.
Пример • subroutine Prе. Values(a, b, c) • • • ! имя ! описание переменных – формальных параметров integer a, b real c ! print *, ’a= ‘, a print *, ’b= ‘, b print *, ’c= ‘, c return end В подпрограмму Prе. Values(a, b, c)передаются значения 3 -х переменных, которые и печатаются. Формальные параметры – переменные, существующие ТОЛЬКО в подпрограмме. Они ВИДНЫ ТОЛЬКО в подпрограмме. Если вне подпрограммы есть переменные с такими же именами, они не имеют ничего общего!
Вызов подпрограммы • Вызов этой подпрограммы может выглядеть так: • integer a 1/4/, a 2/7/ • real pi/3. 14159/ • call Prе. Values(a 1, a 2, pi) !напечатает 4 7 3. 14159 • call Prе. Values(1, 2, 7. ) ! 1 2 7. • call Prе. Values(1, 2. , 7. ) ! ERROR!
Вызов подпрограммы Вызов этой подпрограммы может выглядеть так: • • • integer a 1/4/, a 2/7/ real pi/3. 14159/ call Prе. Values(a 1, a 2, pi) !напечатает 4 7 3. 14159 call Prе. Values(1, 2, 7. ) ! напечатает 1 2 7. • call Prе. Values(1, 2. , 7. ) • ! напечатает ERROR! subroutine Prе. Values(a, b, c) имя • • • ! описание переменных – формальных параметров integer a, b real c ! print *, ’a= ‘, a print *, ’b= ‘, b print *, ’c= ‘, c return end !
Вызов подпрограммы • При первом вызове подпрограммы в переменную (формальный параметр) а будет положено значение из переменной a 1(4), в b – из a 2 (7), в c – из pi (3. 14…). • Соответственно подпрограмма и распечатает их в таком виде: • a=4 • b=7 • c=3. 14159 • Параметры, с которыми вызывается подпрограмма, называются фактическими. • a 1, a 2, pi - фактические параметры при первом вызове, • 1, 2, 7. - фактические параметры при втором.
ERROR • Интерфейс подпрограммы предписывает, что подпрограмма ДОЛЖНА вызываться с 3 -мя фактическими параметрами, имеющими соответствующий тип. • Соответственно она и распределяет память. • Если вызвать с фактическими параметрами, имеющими другой тип, значение положится в вызывающей программе в память по одному, а внутри подпрограммы будет взято из той же памяти по другому. Результат становится полностью не определен!
Правило вызова • Список формальных и фактических параметров должен совпадать по количеству и характеристикам аргументов. • Сколько параметров описано в заголовке подпрограммы, столько же должно стоять в операторе вызова • Тип и длина каждого фактического параметра должны совпадать с типом и длиной соответствующего по порядку формального.
Подпрограмма-функция • Если подпрограмма возвращает только одно значение, лучше использовать другой тип подпрограмм – подпрограмму-функцию. Формально он описывается так: • • FUNCTION < имя функции>( [< форм. арг >]) < объявление форм. арг >. . . < вычисляемые операторы, присваивание результата > • END [ FUNCTION [ < имя функции > ] ]
Пример • • function Sum_(a, b) real a, b, Sum_=a+b return end … s=Sum_(1. , 3. )
Обратить внимание • Имя функции как бы является формальным параметром, имеет тип и ему должно быть присвоено какое-то значение. • Имя функции выбрано Sum_, а не Sum, т. к. последнее часто является зарезервированным в разных языках.
Когда использовать подпрограммы? • Если в какой-то программе больше 10 строк кода, то ее надо разбить на подпрограммы. • Общие правила написания структурированных, хорошо читаемых программ – если некоторый участок кода имеет какое-то обособленное смысловое значение – выделяйте его в виде подпрограммы. • Это дает несколько преимущества: удобство чтения, уменьшение вероятности внесения ошибок, уменьшения количества переменных, удобство отладки.
RETURN • Возвращает управление в вызываемую программную единицу. • RETURN может появляться только в функции или подпрограмме. • • Особенности. • Выполнение оператора RETURN заканчивает выполнение всей под программы или функции. Если оператор RETURN находится в функции, величине функции присваивается текущее значение переменной с тем же именем, что и функция.
Пример оператора RETURN • С Эта подпрограмма выполняет цикл пока вы не наберете "Y « • SUBROUTINE LOOP • CHARACTER IN • C • 10 READ (*, '(A 1)') IN • IF (IN. EG. 'Y') RETURN • GO TO 10 • C Неявный RETURN • END
Операторы DATA, COMMON, EQUIVALENCE
Оператор DATA • Оператор DATA задает (рассылает) исходные значения данных сразу после загрузки программы в память до начала выполнения программы • INTEGER filen, fict, coeff(100) • REAL list(4), eps(2), num (5), y (5, 5) • DATA filen /0/, fict /3/ • DATA list /7. 1, 2*4. 2, 7. 1/, eps(1)/. 00001/ C Инициализируются элементы матрицы у, расположенные ниже С главной диагонали. • DATA ((y(j, i), i=1, j), j=1, 5)/15*0/ • DATA num/5*72. 6475/ • DATA coeff /100*0/
Оператор COMMON • Оператор COMMON задает общие для нескольких программных единиц блоки памяти. • Каждая из подпрограмм размещает в этой памяти вообще говоря свой информационный материал, и тогда это способ экономии памяти. При необходимости можно авторам разных подпрограмм договориться о совместной обработке некоторых данных. Тогда COMMON будет служить средством передачи данных от одной подпрограммы к другой.
Оператор COMMON • • • PROGRAM PROG COMMON m, n, x, j(20) COMMON /COM/ p(4) : END SUBROUTINE SUB COMMON mm, nn, xx, jdim(20) COMMON /COM/ q(4) : END
Оператор EQUIVALENCE • Оператор EQUIVALENCE предписывает компилятору размещение объявленных данных в одной и той же памяти. Он может служить как средством экономии памяти, так и средством согласования обозначений в разных фрагментах программы. • CHARACTER*1 ch(6) • INTEGER*4 a, b, c • EQUIVALENCE (a, ch(1)), (b, c))
Достоинства Фортрана 77 • Фортран хорош для программ с большими массивами и большим числом данных. • Язык предписывает простую линейную структуру программы. Линейная структура проста для рассмотрения, нет сложных вложений и необходимости учета области существования имен данных. • Имеется большое количество библиотек подпрограмм численных методов для вычислительных задач • Компиляторы Фортрана дают хорошее качество объектной программы благодаря простоте языка. • В силу большого распространения Фортрана в системах программирования обычно оговорены связи с подпрограммами на других языках.