Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Информатике.doc
Скачиваний:
4
Добавлен:
26.09.2019
Размер:
3.12 Mб
Скачать

Лабораторная работа № 4 программирование процедур фортрана

Перед выполнением лабораторной работы следует изучить по конспекту лекций и другим пособиям основные категории процедур ФОРТРАНа (внутренние функции, внешние функции, подпрограммы), обратив особое внимание на правила записи в программах определений процедур, ссылок на них (обращений к процедурам), а также на взаимосвязь формальных и фактических параметров.

1. Внутренние функции

Особенности использования внутренних функций (или оператор-функций) рассмотрим на следующем учебном примере.

Пример 1. Пусть для трех точек A, B, C, лежащих в плоскости XOY (рис.1), заданы их абcциссы XA,XB,XC и ординаты YA, YB, YC.

0 X

XA XB XC

Рис. 4.1. К примеру 1.

Если точка B удалена от начала координат на большее расстояние, чем точка A, но меньшее, чем точка C, найти и отпечатать расстояние между точками A, B и периметр P треугольника ABC.

Решение указанной задачи можно реализовать посредством нижеследующего программного модуля :

PRINT*, ‘Введите с клавиатуры значения XA, YA, XB, YB, XC, YC

1 READ (*,*)XA, YA, XB, YB, XC, YC

2 IF(SQRT(XB 2+YB 2)- SQRT(XA 2+YA 2))7,7,3

  1. IF(SQRT(XB 2+YB 2)-SQRT(XC 2+YC 2))4,7,7

  2. D=SQRT((XA-XB) 2+(YA-YB) 2)

  3. P=D+SQRT((XA-XC) 2+(YA-YC) 2)+SQRT((XB-XC) 2+

* (YB-YC) 2)

6 PRINT*,’ D=’,D, P=’, P

STOP

7 Print*,’ Требуемое условие не выполняется’

8 END

Для удобства изложения все операторы модуля помечены. Рассматривая 4 и 5 операторы, следует обратить внимание на сходство вычислений: в трех случаях вычисляется квадратный корень из выражений, подобный по своей структуре. Обобщенно эти случаи отражает схема

В зависимости от случая записи <<абсцисса 1>> и <<ордината 1>> представляют координаты какой-либо из заданных точек; то же относится к записям <<абсцисса 2>>,<<ордината 2>>.

В программировании для обобщенного изображения данных используется их представление с помощью имен. Заменив записи <<абцисса 1>>, <<ордината 1>>, <<абцисса 2>>, <<ордината 2>> соответственно именами X1, Y1, X2, Y2 и переходя к обозначениям ФОРТРАНа, получаем запись SQRT((X1-X2) 2+(Y1-Y2) 2), являющуюся правой частью объявления внутренней функции. Используемые в ней обощенные представления операндов X1, Y1, X2, Y2, именуемые формальными параметрами, должны быть показаны также в левой части объявления - списком формальных параметров. Он записывается в скобках вслед за именем внутренней функции. Далее следует знак << = >> и правая часть объявления. В список формальных параметров функции, независимо от ее категории, должен входить хотя бы один параметр.

Выбрав для внутренней функции имя R, получим полную запись объявления внутренней функии для вычисления расстояния между двумя заданными точками:

R(X1,Y1,X2,Y2) = SQRT((X1-X2) 2 + (Y1-Y2) 2)

Тип формальных параметров и тип внутренней функции задается либо явно, с помощью объявлений типа, либо неявно, по первой букве их имен. Эти имена не должны совпадать с именами других величин, используемых в модуле, или между собой.

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

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

Наличие в модуле объявления внутренней функции, вычисляющей расстояние между заданными точками, позволяет записать четвёртый оператор в следующем виде:

4 D=R(XA,YA, SB,YB)

Указатель функции R в его правой части является требованием выполнить вычисления, показанные в объявлении внутренней функции, причем предварительно формальным параметрам X1,Y1, X2,Y2, указанным в правой части этого объявления, должны быть переданы значения конкретных операндов XA,YA, XB, YB, именуемых фактическими параметрами. Результат вычислений становится значением указателя внутренней функции и используется в четвёртом операторе. При передаче значений 1-й параметр списка формальных параметров, т.е. X1, получает значение первого параметра списка фактических параметров, т.е. XA и т.д. В общем случае фактический параметр внутренней функции является выражением, а в частности - константой, переменной, элементом массива.

Если при записи объявления внутренней функции порядок формальных параметров в списке можно было задать произвольно, то при записи ссылок на внутреннюю функцию необходимо строго соблюдать вышеуказанное соответствие. Например, перестановка местами параметров XB, YA в четвёртом операторе недопустима.

С учетом данных положений запишем заново и пятый оператор:

5 P = D + R(XA, YA, XC, YC) + R(XB, YB, XC, YC)

Таким образом, запись четвёртого и пятого оператора сократилась и стала нагляднее.

Функцию R можно использовать и в записи 2-го и 3-го операторов, ибо расстояние от начала координат есть частный случай расстояния между точками, но следует иметь в виду, что число фактических параметров должно совпадать с числом формальных. Второй оператор можно записать в виде

2 IF(R(XB, YB, 0., 0.) - R(XA, YA, 0., 0.))7,7,3

Запись в нем ссылок R(XB,YB), R(XA,YA) явилась бы ошибкой: формальные параметры X2, Y2 не получали бы каких-либо конкретных значений, так как не оказалось бы соответствующих им (в ссылке) фактических параметров. Нулевые координаты записаны как вещественные константы: тип фактического параметра должен совпадать с типом формального; тип формальных параметров X2,Y2 - вещественный.

Целесообразно сравнить новую запись 3-го оператора

3 IF(R(XB, YB, 0., 0.) - R(XC, YC, 0., 0.))4,7,7

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

R(XB, YB, 0., 0.) - R(X, Y, 0., 0.) ,

где X и Y - обобщенные представления координат одной из точек A и C. Эта схема может быть использована для построения объявления

T(X, Y) = R(XB, YB, 0., 0.) - R(X, Y, 0., 0.)

еще одной внутренней функции, включение которого в программу позволит еще более сократить 2 и 3 операторы:

2 IF(T(XA, YA))7,7,3

3 IF(T(XC, YC))4,7,7

Анализируя объявление функции T, необходимо принять к сведению следующие положения, касающиеся объектов правой части объявления внутренней функции:

а) общие для всех случаев использования внутренней функции объекты (например, XB, YB в объявлении функции T) не следует включать в список формальных параметров;

б) в объявлении внутренней функции допускается использование указателей других функций, в том числе, и ранее объяленных внутренних функций (объявление функции T должно стоять ниже объявления функции R).

Ниже дана полная запись модуля, использующего внутренние функции с именами R и T. Целесообразно проследить использование внутренней функции, выписывая фактически выполняемые вычисления для каждого случая ссылки на внутреннюю функцию.

R(X1, Y1, X2, Y2,)=SQRT ((X1-X2) 2+(Y1-Y2) 2)

T(X, Y)=R(XB, YB, 0., 0.)-R(X, Y, 0., 0.)

PRINT*, ‘Введите с клавиатуры значения XA, YA, XB, YB, XC, YC

1 READ (*,*)XA, YA, XB, YB, XC, YC

2 IF(T(XA, YA))7,7,3

3 IF(T(XC, YC))4,7,7

4 D=R(XA, YA, XB, YB)

5 P=D+R(XA, YA, XC, YC)+R(XB, YB, XC, YC)

6 PRINT*,’ D=’,D, P=’, P

STOP