Мегаобучалка Главная | О нас | Обратная связь


Подпрограммы и функции



2016-01-26 753 Обсуждений (0)
Подпрограммы и функции 0.00 из 5.00 0 оценок




Ввод-вывод

Ввод данных – это передача информации от внешних устройств в оперативную память. Вывод – обратный процесс, когда данные передаются из оперативной памяти на внешние носители (экран монитора, бумагу, магнитные и оптические диски, флэш-карты).

Внешние устройства – это монитор, клавиатура, мышь, принтер, сканер, дисководы с магнитными и оптическими носителями, флэш-карты и др. Внешнему уст­ройству можно присвоить номер. Номером устройства является целочисленное выра­жение, значение которого должно находиться в интервале от 0 до 32767. Устройства с номерами *, 0, 5 и 6 всегда связаны с каждой программой на Фортране. Причем по умол­чанию к устройствам *, 0 и 5 подсоединена клавиатура, а к устройствам *, 0 и 6 - экран.

На магнитных и оптических дисках, флэш-картах информация хранится в файлах. Под файлом понимают именованную последовательность данных (именованную область во внешней памяти ЭВМ). Каждому файлу можно назначить свой номер, который также называют номером устройства. Таким образом одному физическому устройству, на котором находится множество файлов, может соответствовать несколько различных номеров устройств. Два или несколько файлов не могут иметь одновременно один номер, так же и файл не может иметь одновременно несколько номеров.

Виды ввода-вывода данных

Фортран поддерживает четыре способа ввода-вывода данных:

1) под управлением списка ввода-вывода;

2) форматный;

3) неформатный;

4) двоичный.

 

При использовании первых двух способов происходит преобразование внешней символьной формы представления данных во внутреннее двоичное представление в соответствии с типом данных. Эти способы используются для ввода данных с клавиатуры, символьного вывода на экран или печать, а также при вводе-выводе в текстовые файлы. Неформатный и двоичный способы ввода-вывода применяются при работе с нетекстовыми файлами. При этом форма представления данных не изменяется. Далее будет говориться только о первых двух способах ввода-вывода данных.

Управляемый списком ввод-вывод

При вводе-выводе (В/В), управляемом списком, все преобразования выполняются с уче­том типа элементов списка В/В и значений передаваемых данных в соот­ветствии с принятыми в Фортране соглашениями.

Различают два вида управляемого списком В/В: управляемый именованным и неименованным списком. Здесь мы будем рассматривать В/В, управляемый неименованным списком.

Ввод с клавиатуры и вывод на монитор под управлением списка. При вводе с клавиатуры данные из символьной формы преобразуются во внутреннее двоичное представление. При выводе на экран данные из внутреннего представления преобразуются во внешнюю символьную форму. Управляемые списком операторы ввода с клавиатуры и вывода на экран выглядят так:

READ(*, *) список ввода ! Ввод с клавиатуры
READ *, список ввода ! Ввод с клавиатуры
WRITE(*, *) список вывода ! Вывод на экран

PRINT *, список вывода ! Вывод на экран

Список ввода – это последовательность имён переменных, разделенных запятыми, значения которых вводятся. Список вывода устанавливает данные, которые надо вывести. Список вывода может содержать выражения любого типа и вида (арифметические, логические, константные).

В операторах, содержащих две заключенные в скобки и разделенные запятой звездочки, первая – указывает на устройство В/В: клавиатуру при вводе или монитор при выводе. Вторая (или единственная) звездочка оператора означает, что В/В управляется списком.

Пример.

integer n

real X(200) ! Объявление одномерного массива A.
print *, 'Введите n ' ! Вывод сообщения: «Введите n».

read *, n ! Ввод с клавиатуры числа n .

read *,(A(i),i=1,n) ! Для В/В используется циклический список
print *, (A(i), i=1,n) ! Контрольный вывод на экран.

 

При выполнении программы пусть вводятся следующие значения:

3 (значение n ),

1 2 3 (значения элементов массива, разделяемые пробелами).

Результат вывода на экран будет иметь следующий вид:

1.000000 2.000000 3.000000 .

Формат выводимых значений выбирается Фортраном по умолчанию. Ввод значений, соответствующих одному списку ввода, заканчивается нажатием клавиши ENTER.

Форматный ввод-вывод

Чаще всего форматный способ преобразования данных используется при выводе данных на экран или в текстовый файл. Форматный вывод на экран программируется операторами следующего вида:

WRITE(*,’спецификация формата’) список вывода

WRITE(*, метка оператора FORMAT) список вывода

PRINT ’спецификация формата’, список вывода

PRINT метка оператора FORMAT, список вывода

Спецификации формата содержат список дескрипторов преобразований (ДП), заключенный в круглые скобки.

Оператор FORMAT имеет вид:

метка FORMAT (список ДП)

Метка – это целое положительное десятичное число, стоящее в начале строки, содержащей оператор.

Пример:

write(*,’(F10.3, I5)’) a, k

Или аналогично с использование оператора format:

write(*,2) a, k

2 format (F10.3, I5)

Между элементами списка вывода и списка ДП устанавливается соответствие в порядке их последовательности в списках. В приведенном примере переменной a соответствует формат F10.3, переменной k соответствует формат I5.

Дескрипторы преобразования (ДП) подразделяются:

· на дескрипторы данных (ДД);

· дескрипторы управления.

В следующей таблице представлены некоторые наиболее часто употребляемые дескрипторы преобразования данных:

Дескриптор Тип преобразуемой величины Внешнее представление
Iw[.m] Целый Целое число
Fw.d Вещественный Вещественное число в F-форме
Ew.d[Ee] Вещественный Вещественное число в Е-форме
Dw.d Вещественный Вещественное число двойной точности
Lw Логический Т и F, .Т и .F, .TRUE. и .FALSE.
А[w] Символьный Строка символов

 

В таблице использованы следующие обозначения:

w – длина поля, отведенного под представление элемента В/В;

т – число ведущих нулей (т <= w);

d – число цифр после десятичной точки (d < w).

Следующая таблица содержит наиболее часто употребляемые дескрипторы управления:

Форма Имя Назначение Использование
Строка Преобразование апострофа Передает строку текста на устройство вывода Вывод
Tn, TLn TRn Преобразование позиции Спецификация позиции в записи В/В
nX Преобразование позиции Спецификация позиции в записи В/В
/ Преобразование слеша Переход к следующей записи и выставление символа конца записи В/В
\ Преобразование обратного слеша Продолжение текущей записи Вывод
       

 

Пример 1.

character(20)::st='Строка вывода'

integer::k=98765

real::а=-123.456

write(*,'(1x, f8.3)') a ! -123.456

write(*,'(1x, i10)') k !^^^^^98765

write(*,'(1x, a25)') st !^^^^^^^^^^^Cтрокавывода

Замечание. Символ ^ использован для обозначения пробела.

В каждой из приведенных спецификаций формата содержится ДП 1X, который обозначает выставление одного пробела в начале выводимой записи. По умолчанию в Фортране при форматном выводе первая позиция строки вывода предна­значена для символа управления кареткой печатающего устройства. Поэтому первая позиция строки вывода на экране и печатающем устройстве не отображается. Возможные символы управления кареткой приведены в следующей таблице:

Символ Действие
Пробел Начать новую строку
+ Остаться на той же строке (перепечатать)
Пропустить одну строку
Перейти на начало следующей страницы

 

Согласование списка ввода-вывода и спецификации формата.Дескрипторы данных для числовых величин определяют:

- количество выводимых символов;

- обычная или экспоненциальная форма представления ;

- число цифр в дробной части (для вещественных чисел).

При форматном В/В каждый элемент списка В/В использует тот или иной ДД. Элементы списка В/В и ДД должны быть согласованы по типам. Нельзя, например, передавать вещественное число, применяя преобразование Iw.

Если в списке В/В присутствует несколько элементов, то каждому элементу ставится в соответствие один ДД из списка ДП. Правило выбора таково: j-й элемент списка В/В выбирает j-й ДД. При этом поля всех элементов списка В/В располагаются в одной записи. Это правило работа­ет, когда количество ДД не меньше числа элементов в списке ввода-вывода.

Пример 2.

integer k, n, m(9)

read(*,'(I8, 3I5)')k,n,m(2),m(4)! 3-коэффициент повторения I5

 

Переменной k соответствует дескриптор I8, остальным – I5.

Последовательность одинаковых ДД можно записать, использовав коэффициент повторения – задаваемую перед ДД целую буквальную константу без знака или задаваемое в угловых скобках целочисленное выражение.

Коэффициент повторения может быть применен и для группы ДП.

Например, вместо оператора

write(*,'(2x,F3.0,2х,F3.0,2х,F3.0)') а,b,с

можно писать, используя коэффициент повторения для группы ДП:

write(*,'(3(2х,F3.0))') а,b,с

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

Переход к новой записи происходит также при выборе из списка ДП управляющего символа ‘/’ - слеш. Он может использоваться в списке ДП в качестве разделителя элементов вместо запятой.

Если определяемый с помощью ДД формат для выводимого числового значения оказывается «тесным» (в указанное количество позиций число не помещается), то в этих позициях выводятся звездочки.

 

Подпрограммы и функции

Понятие вспомогательного алгоритма уже рассматривалось в разделе 2.4. В программах на Фортране вспомогательные алгоритмы реализуются в форме процедур. Существуют две разновидности процедур: процедуры-подпрограммы и процедуры-функции. Далее их будем называть короче: подпрограммы и функции. Подпрограммы и функции могут быть внешними, внутренними и модульными.

Головная программа, модули и внешние процедуры являются самостоятельными программными единицами (и могут компилироваться отдельно друг от друга). Доступ к модулям и внешним процедурам может быть выполнен из разных программ.

Процедура реализуется в виде функции, если ее результат может быть помещен в одну переменную: простую или структурированную (массив, строка, структура). Результатом подпрограммы может быть как одна переменная, так и множество переменных или ни одной переменной.

Внутренние (встроенные) процедуры располагаются внутри головной программы после оператора contains.Внутренние процедуры не могут содержать в себе встроенных процедур.Внешние процедуры могут содержать в себе оператор contains и следующие за ним встроенные процедуры.

Структуры процедур

Структура внеш­ней подпрограммы имеет вид:

[RECURSIVE] SUBROUTINE имя подпрограммы [([список формальных параметров])]

[операторы описания]

[исполняемые операторы]

[CONTAINS

внутренние процедуры]

END [SUBROUTINE [имя подпрограммы]]

RECURSIVE – ключевое слово, которое используется, если процедура рекурсивная (см. далее).

Внутренние подпрограммы размещаются между операторами CONTAINS и END головной программы или процедуры-носителя и имеют вид:

[RECURSIVE] SUBROUTINE имя подпрограммы [([список формальных параметров])]

[операторы описания]

[исполняемые операторы]

END SUBROUTINE [имя подпрограммы]

Вызов подпрограммы осуществляется по ее имени в операторе CALL.

Структура внешней функции:

[type] [RECURSIVE] FUNCTION имя функции ([список формальных параметров]) [RESULT (имя результата)]

[операторы описания]

[исполняемые операторы]

[CONTAINS

внутренние процедуры]

END [FUNCTION [имя функции]]

Список формальных параметров: перечисленные через запятую имена переменных и формальных процедур. Тип формальных параметров описывается после заголовка. Если тип параметра явно не описан, то он определяется согласно правилам умолчания Фортрана по первой букве имени.

Формальные параметры могут отсутствовать, если передача данных выполняется с использованием use-ассоциирования (работа с модулями), или путем связи через common-блоки - глобальные переменные. При отсутствии формальных параметров после имени функции должны следовать пустые круглые скобки. Формальные параметры функции обычно являются ее аргументами. Формальные параметры подпрограммы м.б. как аргументами, так и переменными для размещения результатов.

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

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

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

Выход из процедуры происходит либо при выполнении оператора END данной процедуры, либо при выполнении специального оператора выхода – RETURN.

Вызов процедуры

Вызов процедуры-подпрограммы осуществляется отдельным оператором следующего вида:

CALL имя подпрограммы ([список фактических параметров])

Обращение к функции является операндом в выражении. Оно может присутствовать в правой части оператора присваивания. Например:

a = имя функции ([список фактических параметров])

Фактическими параметрами могут быть выражения, буквальные и именованные константы, простые переменные, массивы и их сечения, элемен­ты массивов, записи, элементы записей, строки, подстроки, процедуры и встроенные функции. Если фактический параметр является внешней процедурой, то он дол­жен в описании иметь атрибут EXTERNAL. Если же фактический параметр являет­ся встроенной процедурой, то он должен быть объявлен с атрибутом INTRINSIC.

Между формальными параметрами процедуры в описании и фактическими параметрами при обращении к ней должны выполняться правила соответствия:

- соответствие по количеству (сколько формальных параметров, столько же фактических);

- соответствие по последовательности: первый фактический параметр соответствует первому формальному, второй – второму и т.д.

- соответствие по типу: типы соответствующих параметров должны совпадать.

Пример 1. Программа вычисления длин сторон треугольника, заданного координатами вершин, с использованием внутренней функции.

Program Treug1

real x1,y1,x2,y2,x3,y3,r

print*,"Введите: x1,y1,x2,y2,x3,y3"

read*,x1,y1,x2,y2,x3,y3 !(1,1)(2,2)(2,1)

r=S(x1,y1,x2,y2); print*,r !1.414214

r=S(x1,y1,x3,y3); print*,r !1.000000

r=S(x2,y2,x3,y3); print*,r !1.000000

Contains

real function S(w1,z1,w2,z2)

real w1,z1,w2,z2

S=sqrt((w1-w2)**2+(z1-z2)**2)

end function S

end program flocal

 

Пример 2.Программа вычисления длин сторон треугольника, заданного координатами вершин, с использованием внешней подпрограммы.

Program Treug2

real x1,y1,x2,y2,x3,y3,r

print*,"Введите: x1,y1,x2,y2,x3,y3"

read*,x1,y1,x2,y2,x3,y3 !(1,1)(2,2)(2,1)

CALL S(x1,y1,x2,y2,r); print*,r !1.414214

CALL S(x1,y1,x3,y3,r); print*,r !1.000000

CALL S(x2,y2,x3,y3,r); print*,r !1.000000

end program Treug2

subroutineS(w1,z1,w2,z2, L)

real w1,z1,w2,z2, L

L=sqrt((w1-w2)**2+(z1-z2)**2)

end subroutine S

 

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

В математике рекурсивным называется определение любого понятия через самого себя. Классическим примером является определение факториала целого числа, большего или равного нулю.

Здесь функция факториал определена через факториал. Нетрудно понять справедливость такого определения. Для n > 0

Вариант 0! = 1 является тривиальным. Но это ²опорное² значение, от которого начинается «раскручивание» всех последующих значений факториала:

1! = 1 * 0! =1*1 =1; 2! = 2 * 1 = 2; 3! = 3 * 2! = 6 и т.д.

Рассмотрим процедуру-функцию, использующую в своем описании приведенную выше рекурсивную формулу.

Recursive function ifact(n) result (fav)

Integer fav, n

If(n=0) then

Fav=1

Else

Fav=n*ifact(n-1)

Endif

End

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

recursive integer function ifact(n) result (fav)

integer recursive function ifact(n) result (fav)

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

Основная программа, которая использует внешнюю функцию ifact для вычисления величины K!, имеет следующий вид:

Program factorial

Integer K, ifact

Print*, ‘Введите К’

Read*, K

Write(*,’(2X,I2,A,I6)’) K,’!=’, ifact(K)

End

 

Пусть в основной программе в целую переменную К вводится число 3. При вычислении функции ifact с аргументом 3 произойдет повторное обращение к функции ifact(2). Это обращение потребует вычисления ifact(1). И наконец, при вычислении ifact(0) будет получен числовой результат 1. Затем цепочка вычислений раскрутится в обратном порядке:

ifact (1) = 1 * ifact (0) = 1 ,

ifact(2) = 2*ifact(1) = 2 ,

ifact(3) = 3*ifact(2) = 6.

Последовательность рекурсивных обращений к функции должна обязательно выходить на определенное значение. А весь маршрут последовательных вхождений машина запоминает в специальной области памяти, называемой стеком. Таким образом, выполнение рекурсивной функции происходит в два этапа: прямой ход –– заполнение стека; обратный ход –– цепочка вычислений по обратному маршруту, сохраненному в стеке.

Использование рекурсивных функций — красивый прием с точки зрения программистской эстетики. Однако этот путь не всегда самый рациональный. Рассмотренную задачу с n! можно решить так:

F= 1

do I= 1,N

F= F*I

Enddo

Очевидно, что такой вариант программы будет работать быстрее, чем рекурсивный. И в том случае, когда важно сокращение времени выполнения программы, следует отдать предпочтение последнему варианту.

Упражнения

1. Составить программу вычисления площади кольца по значениям внутреннего и внешнего радиусов, используя процедуру вычисления площади круга (2 варианта: с подпрограммой и с функцией).

2. По координатам вершин треугольника вычислить его периметр, используя процедуру вычисления длины отрезка между двумя точками.

3. Даны три целых числа. Определить, у которого из них больше сумма цифр. Подсчет суммы цифр организовать через процедуру.

4. Определить площадь выпуклого четырехугольника по заданным координатам вершин. Использовать функцию вычисления длины отрезка и подпрограмму вычисления площади треугольника по формуле Герона.

5. Описать рекурсивную функцию pow(x, n) от вещественного x (x ¹ 0) и целого n, которая вычисляет величину xn согласно формуле

6. Даны натуральные числа n и m; найти НОД(n,m). Использовать программу, включающую рекурсивную функцию вычисления НОД, основанную на соотношении НОД(n, m) = НОД(m, r), где r –– остаток от деления n на m.

3.11. Массивы

Массив – это поименованное конечное множество однотипных элементов. Массив имеет имя. Каждый элемент массива имеет свой номер – индекс либо несколько индексов. Количество индексов определяется размерностью массива:

имя массива (индекс) – одномерный массив, например a(i);

имя массива (индекс1, индекс2) – двумерный массив, например a(i1, i2);

имя массива (индекс1,…, индекс n) – n-мерный массив, например a(i1,…, in).

Из сказанного выше следует, что массив характеризуется размерностью (числом измерений) или рангом. В Фортране ранг массива не может быть более семи. Массив ранга 1 обычно называют вектором, ранга 2 – матрицей. Скалярные величины имеют нулевой ранг.

Другая характеристика массива – размер. Размер определяет объем занимаемой памяти. Размер – это число элементов массива.

Тип массива – это общий тип всех его элементов. В Фортране допускается использование массивов всех встроенных типов.

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

 



2016-01-26 753 Обсуждений (0)
Подпрограммы и функции 0.00 из 5.00 0 оценок









Обсуждение в статье: Подпрограммы и функции

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (753)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.013 сек.)