Функции в программировании. Урок 11 курса «Python. Введение в программирование»
Функция в программировании представляет собой обособленный участок кода, который можно вызывать, обратившись к нему по имени, которым он был назван. При вызове происходит выполнение команд тела функции.
Функции можно сравнить с небольшими программками, которые сами по себе, то есть автономно, не исполняются, а встраиваются в обычную программу. Нередко их так и называют – подпрограммы. Других ключевых отличий функций от программ нет. Функции также при необходимости могут получать и возвращать данные. Только обычно они их получают не с ввода (клавиатуры, файла и др.), а из вызывающей программы. Сюда же они возвращают результат своей работы.
Существует множество встроенных в язык программирования функций. С некоторыми такими в Python мы уже сталкивались. Это print()
, input()
, int()
, float()
, str()
, type()
. Код их тела нам не виден, он где-то «спрятан внутри языка». Нам же предоставляется только интерфейс – имя функции.
С другой стороны, программист всегда может определять свои функции. Их называют пользовательскими. В данном случае под «пользователем» понимают программиста, а не того, кто пользует программу. Разберемся, зачем нам эти функции, и как их создавать.
Предположим, надо три раза подряд запрашивать на ввод пару чисел и складывать их. С этой целью можно использовать цикл:
i = 0 while i < 3: a = int(input()) b = int(input()) print(a + b) i += 1
Однако, что если перед каждым запросом чисел, надо выводить надпись, зачем они нужны, и каждый раз эта надпись разная. Мы не можем прервать цикл, а затем вернуться к тому же циклу обратно. Придется отказаться от него, и тогда получится длинный код, содержащий в разных местах одинаковые участки:
print("Сколько бананов и ананасов для обезьян?") a = int(input()) b = int(input()) print("Всего", a + b, "шт. ") print("Сколько жуков и червей для ежей?") a = int(input()) b = int(input()) print("Всего", a + b, "шт.") print("Сколько рыб и моллюсков для выдр?") a = int(input()) b = int(input()) print("Всего", a + b, "шт.")
Пример исполнения программы:
Сколько бананов и ананасов для обезьян? 15 5 Всего 20 шт. Сколько жуков и червей для ежей? 50 12 Всего 62 шт. Сколько рыб и моллюсков для выдр? 16 8 Всего 24 шт.
Внедрение функций позволяет решить проблему дублирования кода в разных местах программы. Благодаря им можно исполнять один и тот же участок кода не сразу, а только тогда, когда он понадобится.
Определение функции. Оператор def
В языке программирования Python функции определяются с помощью оператора def
. Рассмотрим код:
def count_food(): a = int(input()) b = int(input()) print("Всего", a + b, "шт.")
Это пример определения функции. Как и другие сложные инструкции вроде условного оператора и циклов функция состоит из заголовка и тела. Заголовок оканчивается двоеточием и переходом на новую строку. Тело имеет отступ.
Ключевое слово def
сообщает интерпретатору, что перед ним определение функции. За def
следует имя функции. Оно может быть любым, также как и всякий идентификатор, например, переменная. В программировании весьма желательно давать всему осмысленные имена. Так в данном случае функция названа «посчитать_еду» в переводе на русский.
После имени функции ставятся скобки. В приведенном примере они пустые. Это значит, что функция не принимает никакие данные из вызывающей ее программы. Однако она могла бы их принимать, и тогда в скобках были бы указаны так называемые параметры.
После двоеточия следует тело, содержащее инструкции, которые выполняются при вызове функции. Следует различать определение функции и ее вызов. В программном коде они не рядом и не вместе. Можно определить функцию, но ни разу ее не вызвать. Нельзя вызвать функцию, которая не была определена. Определив функцию, но ни разу не вызвав ее, вы никогда не выполните ее тела.Вызов функции
Рассмотрим полную версию программы с функцией:
def count_food(): a = int(input()) b = int(input()) print("Всего", a+b, "шт.") print("Сколько бананов и ананасов для обезьян?") count_food() print("Сколько жуков и червей для ежей?") count_food() print("Сколько рыб и моллюсков для выдр?") count_food()
После вывода на экран каждого информационного сообщения осуществляется вызов функции, который выглядит просто как упоминание ее имени со скобками. Поскольку в функцию мы ничего не передаем скобки опять же пустые. В приведенном коде функция вызывается три раза.
Когда функция вызывается, поток выполнения программы переходит к ее определению и начинает исполнять ее тело. После того, как тело функции исполнено, поток выполнения возвращается в основной код в то место, где функция вызывалась. Далее исполняется следующее за вызовом выражение.
В языке Python определение функции должно предшествовать ее вызовам. Это связано с тем, что интерпретатор читает код строка за строкой и о том, что находится ниже по течению, ему еще неизвестно. Поэтому если вызов функции предшествует ее определению, то возникает ошибка (выбрасывается исключение NameError
):
print("Сколько бананов и ананасов для обезьян?") count_food() print("Сколько жуков и червей для ежей?") count_food() print("Сколько рыб и моллюсков для выдр?") count_food() def count_food(): a = int(input()) b = int(input()) print("Всего", a + b, "шт.")
Результат:
Сколько бананов и ананасов для обезьян? Traceback (most recent call last): File "test.py", line 2, in <module> count_food() NameError: name 'count_food' is not defined
Для многих компилируемых языков это не обязательное условие. Там можно определять и вызывать функцию в произвольных местах программы. Однако для удобочитаемости кода программисты даже в этом случае предпочитают соблюдать определенные правила.
Функции придают программе структуру
Польза функций не только в возможности многократного вызова одного и того же кода из разных мест программы. Не менее важно, что благодаря им программа обретает истинную структуру. Функции как бы разделяют ее на обособленные части, каждая из которых выполняет свою конкретную задачу.
Пусть надо написать программу, вычисляющую площади разных фигур. Пользователь указывает, площадь какой фигуры он хочет вычислить. После этого вводит исходные данные. Например, длину и ширину в случае прямоугольника. Чтобы разделить поток выполнения на несколько ветвей, следует использовать оператор if-elif-else:
figure = input("1-прямоугольник, 2-треугольник, 3-круг: ") if figure == '1': a = float(input("Ширина: ")) b = float(input("Высота: ")) print("Площадь: %.2f" % (a * b)) elif figure == '2': a = float(input("Основание: ")) h = float(input("Высота: ")) print("Площадь: %.2f" % (0.5 * a * h)) elif figure == '3': r = float(input("Радиус: ")) print("Площадь: %. 2f" % (3.14 * r ** 2)) else: print("Ошибка ввода")
Здесь нет никаких функций, и все прекрасно. Но напишем вариант с функциями:
def rectangle(): a = float(input("Ширина: ")) b = float(input("Высота: ")) print("Площадь: %.2f" % (a * b)) def triangle(): a = float(input("Основание: ")) h = float(input("Высота: ")) print("Площадь: %.2f" % (0.5 * a * h)) def circle(): r = float(input("Радиус: ")) print("Площадь: %.2f" % (3.14 * r ** 2)) figure = input("1-прямоугольник, 2-треугольник, 3-круг: ") if figure == '1': rectangle() elif figure == '2': triangle() elif figure == '3': circle() else: print("Ошибка ввода")
Он кажется сложнее, а каждая из трех функций вызывается всего один раз. Однако из общей логики программы как бы убраны и обособлены инструкции для нахождения площадей. Программа теперь состоит из отдельных «кирпичиков Лего». В основной ветке мы можем комбинировать их как угодно. Она играет роль управляющего механизма.
Если нам когда-нибудь захочется вычислять площадь треугольника по формуле Герона, а не через высоту, то не придется искать код во всей программе (представьте, что она состоит из тысяч строк кода как реальные программы). Мы пойдем к месту определения функций и изменим тело одной из них.
Если понадобиться использовать эти функции в какой-нибудь другой программе, то мы сможем импортировать их туда, сославшись на данный файл с кодом (как это делается в Python, будет рассмотрено позже).
Практическая работа
В программировании можно из одной функции вызывать другую. Для иллюстрации этой возможности напишите программу по следующему описанию.
Основная ветка программы, не считая заголовков функций, состоит из одной строки кода. Это вызов функции test()
. В ней запрашивается на ввод целое число. Если оно положительное, то вызывается функция positive()
, тело которой содержит команду вывода на экран слова «Положительное».
negative()
, ее тело содержит выражение вывода на экран слова «Отрицательное».Понятно, что вызов test()
должен следовать после определения функций. Однако имеет ли значение порядок определения самих функций? То есть должны ли определения positive()
и negative()
предшествовать test()
или могут следовать после него? Проверьте вашу гипотезу, поменяв объявления функций местами. Попробуйте объяснить результат.
Примеры решения и дополнительные уроки в pdf-версии курса
Ставки с криптовалютой Cordana(ADA). Что нужно об этом знать?
На данный момент практически каждый человек слышал о том, что такие криптовалюта, и это направление сегодня активно развивается. Конечно, если посмотреть немного назад, то никто не мог подумать о том, что криптовалюта станет настолько востребованной и будет активно применяться в различных направлениях. К примеру, сейчас это встречается в ресторанах и подобных заведениях, можно приобрести NFT, разумеется, делать ставки на спорт и так далее. И если же ранее криптовалюта чаще всего присутствовала в игорной индустрии, то сейчас есть возможность ставить на Cordana(ADA). И нужно рассмотреть все возможности.
Варианты ставок
Если человек ранее заключал пари, то сейчас понимает, что криптовалюта является неотъемлемой частью этого направления. И сейчас есть много вариантов для ставок не только на спорт, но и киберспорт и иные направления. Хотя на сегодняшний день рассматриваемый вариант не полностью адаптирован к миру криптовалюты. С другой стороны, это все равно хорошая возможность испытать себя в чем-то новом. Те, кто уже сталкивался с Cordana(ADA), исключительно в положительном ключе об этом отзываются.
Лучшие букмекеры
БК Зенит
Сайт букмекерской компании Zenit располагается по адресу zenit.win. Доступ к Зенит личный кабинет открывается после прохождения регистрации. Управлять аккаунтом в БК Zenit можно с помощью смартфонов и планшетов: предусмотрена мобильная версия сайта по адресу zenit.win/m и приложение для Android.
БК BetBoom
Betboom.ru представляет собой официальный сайт российской компании ООО «Стом» для интерактивных ставок. Деятельность компании началась в 2011 году с запуском Всероссийской негосударственной тиражной лотереи «Бинго-Бум». В 2012 году компания открыла букмекерское направление.
Ставки на спорт
Как и в ситуации использования биткоина, тут можно найти самые разные сайты, где есть возможность заключать пари на разные, и не только самые востребованные виды спорта. И для этого можно использовать Cordana(ADA). Разумеется, если же брать самые популярные виды спорта, то это:
- Футбол
- Хоккей
- Баскетбол
- Бейсбол
Возможности увеличиваются с каждым днем. А основная особенность заключается в том, что все лиги и матчи можно найти почти на всех сайтах, которые специализируются на криптовалютных ставках. И можно использовать Cordana(ADA) для депозита, но это далеко не все варианты и возможности для беттера.
Конечно, чаще всего рассматриваются именно наиболее востребованные виды спорта, популярные во всем мире. Но если человек имеет определенные знания, скажем, в шахматах или крикете, в настольном теннисе, то можно заключить пари и на эти виды спорта. Сейчас в этом не будет никаких проблем. Для привлечения клиентов многие компании стараются по максимуму расширить не только спектр возможностей и качество услуг, но и вариативность в плане разнообразия. К примеру, все чаще можно ставить с использованием Cordana(ADA) на Олимпийские игры.
Ставки на киберспорт
Всегда нужно учитывать и тот момент, что многие сферы деятельности сейчас очень быстро развиваются, и если ранее только спорт привлекал внимание беттера, то сегодня часто рассматривается и киберспорт. И там тоже можно заключать пари, используя для этого криптовалюту. На текущий момент уже есть масса игр, которые собирают миллионную аудиторию и огромные призовые. Наверняка сейчас есть те игры, которые могут привлечь большую аудиторию, чем определенный вид спорта.
И если есть желание делать ставки с помощью Cordana(ADA) на игры, то стоит рассмотреть самые востребованные:
- LoL
- CS GO
- Dota 2
- COD
И это далеко не полный перечень, а только те игры, которые сейчас практически у всех на слуху.
Казино
Как уже говорилось, многие сферы действительно активно развиваются, и сейчас каждый желающий может играть в казино на криптовалюту. Многие проверенные игорные дома дают такую возможность. И ассортимент игр практически не меняется, это очень много лицензированных слотов со своей сюжетной линий и функционалом. В любой момент можно сорвать солидный куш.
И тут тоже есть возможность испытать себя в карточных или настольных играх. Можно выбрать именно тот вариант игры, в которой уже есть опыт и ничем себя не ограничивать. На виртуальных платформах однозначно найдется то, что сможет привлечь внимание.
3.2.7 Подпрограммы (процедуры и функции)
Узнайте: что такое подпрограммы?
Подпрограммы. В компьютерном программировании подпрограмма представляет собой последовательность программных инструкций. который выполняет определенную задачу, упакованную как единое целое. В разных языках программирования подпрограмму можно назвать процедурой, функцией, подпрограммой, методом или подпрограммой. Иногда используется общий термин «вызываемая единица». (Источник Wikipedia.org)
Параметры. Параметры или аргументы — это фрагменты данных, которые передаются в подпрограмму. чтобы эта подпрограмма работала правильно. В этом примере: def displayTotal(total): 'total' — это параметр, который будет передан в подпрограмма displayTotal. Множественными параметрами можно управлять с помощью запятых, например: def displayTotals(total1, total2, total3 и т.д.)
- Подпрограммы представляют собой
последовательности инструкций
, которые выполняют определенную задачу . Он может вернутьодин
или ещезначений
, но не обязательно . - Легче представить их как
мини-программ
внутрибольшой программы
. - Подпрограммы состоят из
модулей кода
, которые выполняют различные задачи . - Если эти задачи повторяются по всей программе, они могут быть
записаны как подпрограммы
. - Каждой подпрограмме присваивается
уникальное имя
, чтобы ее можно быловызывать
ибыстро выполнять
по всей программе , без необходимости повторного написания кода . - Этот
уменьшает
размеркода
, делая программулогические
ипроще
дочитать
иподдерживать
. - Давайте рассмотрим пример использования подпрограмм:
Шаг 1
- Здесь основная программа (, показанная на блок-схеме слева, начинающаяся со слова «Старт» ) запрашивает у пользователя
от
додва числа
. - Затем он просит их выбрать опцию из меню
- Если они введут слово «добавить» , запустится подпрограмма с именем
addNum
( Меньшая блок-схема вверху справа ), если они введут что-нибудь еще, запустится подпрограммаsubtractNum
( внизу справа ). - Давайте сначала посмотрим на блок подпрограммы
Шаг 2
- Мы видим, что имя подпрограммы было определено вместе с
переменные ;
число1
ичисло2
. - Это означает, что подпрограмма addNum будет использовать значения .
из
num1
иnum2
и так былопрошло
эти значения . - Передача переменных в подпрограмму известна как = передача переменных .
Шаг 3
- Теперь мы можем посмотреть на блок-схему подпрограммы
addNum
.
- Эта подпрограмма
суммирует
num1
иnum2
переменных исохраняет
их в новой переменной с именемответ
. - Затем он
вернет
ответ переменной назад в главное меню - Затем вернется к
главное меню
, после завершения подпрограммы addNum , где она сможетотображать переменную ответа
. - Если бы
не вернул
переменную ответане смог бы отобразить
ответ
Узнайте: преимущества использования подпрограмм в программах
Преимущества использования подпрограмм
- Разрушение или Разложение A
Задача программирования
на меньшие подпрограммы и каждая из нихSubRoutines
, создает Проблемас легким до Solve
. - Подпрограммы могут использоваться
несколько раз
в программе. - Он
спасает
программистtime
as it уменьшает объем кода , который необходимо написать или изменить, позволяя вамповторно использовать код
без необходимостиписать его снова
. - Если вы работаете в команде, вы можете разделить большую программу на более мелкие части и разрешить отдельным пользователям одновременно работать над этими частями.
- Код становится легче читать, если вы используете разумные метки подпрограмм, поскольку заголовки сообщают читателю, что делает этот раздел кода.
- Путем уменьшения количества повторяющихся задач вы также снижаете риск из
внесения ошибок
в программу. - Простота обслуживания , так как
каждую подпрограмму
можно протестировать отдельно .
Изучите: передача данных в программах
Параметр — это переменная, которая «передается» подпрограмме.
Использование параметров для передачи данных в программах
- Параметр
- Если подпрограмме
требуется значение
, которое былоиспользовано
в другой части программы , то этапеременная
имеет «передаваемое» подпрограмме - Вы можете иметь
более одного
параметрапередача
в подпрограмму за раз .
- В этом примере показано, как использовать более одного параметра для передачи
- В этом случае
num1
иnum2
являются переменными , введенными пользователем в основной программе. - После ввода переменных подпрограмма
addNum
— это , называемый , адва параметра
( num1 и num2 ) — это, переданные
в эту подпрограмму, чтобы их можно было использовать.
Изучите: Возврат значений из подпрограммы
Параметр — это переменная, которая «передается» в подпрограмму.
Возврат отдельных значений
- Мы можем изменить предыдущий пример кода и вместо из
, выведя
всегоиспользовать переменную
в основной программе или даже в другой подпрограмме, чтобыпередать
это значениеобратно
в основную (вызывающую) программу , как показано ниже:
Возврат нескольких значений
- Мы можем вернуть
более одного значения
обратно в основную (вызывающую) программусоздать
нечто, называемоекортеж
. - Кортеж представляет собой короткий список
временно содержит
значений . - В следующем примере псевдокода числа и сумма возвращаются в основную программу.
- Здесь
Num1
,NUM2
иВсего
были, объединенные
в подпрограмме в, используя
, с использованием программы, в течение
, используемой.0014 число1
,число2
, всего← дополнение()
. - Это будет работать только до тех пор, пока данные
представлены
в том же порядкепоявляются
в кортеже - Значения , которые
возвращают
, представляют собой, сгруппированные в кортеже
, а затемиспользовали
в основной программе
Badge It: Coding Challenge
Серебряный. Возвращает значения из подпрограммы
- Используя приведенный ниже брелок и приведенный выше псевдокод, создайте работающую программу Python. (4 балла)
Загрузка в Fundamentals of 3.2 Programming — 3.2.7 Подпрограммы (процедуры и функции): серебристый на BourneToLearn
Изучите: локальные и глобальные переменные
Глобальные переменные — переменная, объявленная в основной программе.
Локальная переменная — переменная, объявленная и используемая только в одной подпрограмме.
Использование локальных и глобальных переменных в программах
- Подпрограммы могут объявлять свои собственные переменные, называемые
локальными переменными
, и эти локальные переменныесуществуют только
в то время как в подпрограммевыполняется
и доступнытолько внутри подпрограммы 5
- Глобальные переменные
объявлены вне
любой функции и к ним можно получить доступ для любой функции в программе. - Локальные переменные
объявлены внутри
функции и могут использоваться только внутри этой функции . - Следовательно,
возможно
иметьлокальных переменных
содинаковыми именами
вразличных функциях
.
Зачем использовать локальные переменные?
- Пример, показанный выше,
num1
иnum2
являютсяглобальными переменными
, поскольку онимогут использоваться где угодно
в программеподпрограммах
, если они были переданы подпрограммам в качестве параметров. - Однако
userNum
— это, используемая только в
подпрограммахchangeNumbers
, так же как и локальная переменнаябольше нигде не используется
. - Как только подпрограмма
changeNumbers
имеетзаконченный запуск
данные сохраненные вuserNum
будут удалены .
Преимущества использования локальных переменных
- Использование локальных переменных в подпрограмме является хорошей практикой, поскольку при этом подпрограмма остается автономной.
- Затем эту подпрограмму можно использовать в любой программе, и маловероятно, что имена переменных в основной программе могут конфликтовать с аналогичными именами, используемыми в подпрограмме.
- Еще одним преимуществом является то, что программу будет легче отлаживать и поддерживать.
- Локальные переменные экономят память, так как пространство, используемое локальными переменными, освобождается после завершения подпрограмм.
Изучите: функции и процедуры
Функции и процедуры
- Существует двух разных типов из
подпрограмм
, которые мы в основном используем:-
Функции
. -
Процедуры
-
- Функции
возвращают значения обратно
в основную программу и процедурыне возвращают значение
обратно в основную программу . - Из предыдущего примера программы
addNum
иsubtractNum
являютсяобеими функциями
ине процедурами
как они обавозвращают значения
обратно в главное меню .
Попробуйте: Функции
- Посмотрите на следующие окна безделушек, которые
демонстрируют
использованиефункций
повозвращают значения
, которые затемиспользуются
в основной программе. - В коде Python подпрограммы определены
ДО
основной программы. - Выполнение основной программы и выполнение подпрограммы называется
«вызовом»
подпрограммы.
- Следующий код демонстрирует еще один пример того, как
функция
— этосозданный
ивызванный
в основной программе:
Попробуйте: Процедуры
- Посмотрите на следующие окна безделушки, которые
демонстрируют
использованиепроцедур
будучипереданными
параметрами (значениями) , которые затем используются в основной программе. - В Python подпрограммы определены
ДО
основной программы.
Learn It: Structured Programming
Structured Programming — структурированное программирование (иногда известное как модульное программирование) это подмножество процедурного программирования, которое обеспечивает логическую структуру программы быть написано, чтобы сделать его более эффективным и легким для понимания и модификации. Структурированное программирование часто использует нисходящую модель проектирования, в которой разработчики отображают разделить общую структуру программы на отдельные подразделы. Определенная функция или набор подобные функции кодируются в отдельном модуле или подмодуле, что означает, что код может быть загружаются в память более эффективно и что модули могут быть повторно использованы в других программах.
- Подход структурированного программирования — это тот, который имеет следующие
характеристики:
- Он использует модульный подход . Это означает, что он использует подпрограмм с по разбивают программу на управляемых фрагментов из код.
- Каждая подпрограмма должна иметь понятный, хорошо документированный интерфейс ( параметров и возвращаемое значение ).
- Всего использует конструкции из; Последовательность , выборка и итерация .
- Обратите внимание, , что термин интерфейс подпрограммы относится к номеру , введите и порядок параметров , которые появляются в подпрограмме заголовок и тип возвращаемого значения .
Преимущества структурного программирования:
- Структурированный подход имеет преимущества использования подпрограмм вышеперечисленное.
- Следуя четырехэтапному подходу , вы спланируете свое решение, и не должно быть сюрпризов, когда вы начнете разрабатывать решение.
- Вы знаете переменные, которые используете, и знаете о процессы, которые должна выполнять каждая подпрограмма, и как они связаны вместе.
- Он также использует только три или четыре структур программирования, что делает
программа довольно проста:
- Понятно.
- Отладка.
- Техническое обслуживание.
Badge It: экзаменационные вопросы
Золото — ответьте на следующие вопросы:
- Что такое подпрограмма? (1 балл)
- В чем разница между процедурой и функцией? (2 балла)
- Где следует размещать подпрограммы при написании псевдокода или кода Python, выше или ниже основной программы? (2 балла)
Загрузка в Fundamentals of 3.2 Programming — 3.2.7 Подпрограммы (процедуры и функции): Gold на BourneToLearn
Badge It: Exam Question and Coding Challenge
Platinum — Exam question/Code Challenge
- Функция roll(n) имитирует результат одного случайного броска
n-гранная игральная кость. Например. roll(6) случайным образом вернет либо
1,2,3,4,5 или 6.
- а) Ноэль объявил локальную переменную внутри функции. Объясните две разницы между локальными и глобальными переменными? (4 балла)
- б) Ноэль хочет использовать свою функцию в игре в кости, где одновременно бросают две одинаковые кости.
- i) Игрок может выбрать количество граней у кубика.
- ii) Счет игрока – это количество бросков, которое требуется, чтобы на обоих кубиках выпало одно и то же число.
- iii) Напишите подпрограмму, которая принимает количество граней игральной кости в качестве параметра и возвращает счет игрока. (5 баллов)
Загрузка в Fundamentals of 3.2 Programming — 3.2.7 Подпрограммы (процедуры и функции): Platinum на BourneToLearn
Функции и подпрограммы
Функции и подпрограммыИногда в программе FORTRAN у нас может быть участок кода, который мы можем превратить в отдельную программу, известную как подпрограмма . Затем наша основная программа может использовать подпрограмму, передавая ей части информации для использования и получения обратно фрагментов информации.
Существует несколько видов подпрограмм.
Подпрограммы
Синтаксис подпрограммы выглядит следующим образом:
Имя подпрограммы (список формальных аргументов) Неявный ! объявить каждый формальный аргумент как переменную ! возможно также объявить некоторые локальные переменные ! исполняемый код Имя конечной подпрограммы
Когда мы используем подпрограмму, мы используем инструкцию Вызов в основной программе вот так:
Имя вызова (список фактических аргументов)
Здесь есть терминология:
- Имя — это имя подпрограммы, обычный идентификатор FORTRAN.
- Формальные аргументы — это переменные в подпрограмме, представляющие фрагменты информации, передаваемые тем или иным образом.
- Локальные переменные — это переменные, существующие только в подпрограмме. Основная программа о них не знает.
- Фактические аргументы — это значения в основной программе, которые передается подпрограмме для ее использования. Это могут быть переменные, выражения или константы.
При выполнении оператора Call список фактических аргументов и список формальных аргументов сопоставляется по порядку слева направо. Два списка должны совпадать по количеству аргументов, их типам, и порядок их перечисления.
Вот пример:
Замена подпрограммы (A, B) Неявный Целое :: А, В Целое :: Темп Температура = А А = В В = температура Завершить замену подпрограммы
Эта подпрограмма просто переключает значения двух целочисленных аргументов. Нам может понадобиться сделать это несколько раз, так что это хороший кандидат на создание отдельной подпрограммы.
Здесь A и B — фактические аргументы, а Temp — локальная переменная.
Когда мы используем подпрограмму Swap, мы можем сказать:
Обмен вызовами (X, Y)
Чтобы это имело смысл, X и Y должны быть объявлены в основной программе как целочисленные переменные.
Некоторые аргументы могут использоваться только как входные, а другие только как выходные и другие как оба. Если аргумент предназначен для вывода, мы должны убедиться, что фактический аргумент является фактической переменной, а не константой или выражение.
Вот еще один (довольно глупый) пример:
Подпрограмма FindSum(A, B, Sum) Неявный Действительный :: A, B, Сумма Сумма = А + В Завершить подпрограмму FindSum
Здесь A и B используются для ввода, а Sum для вывода. Мы могли бы позвонить эту подпрограмму несколькими разными способами, не все из которых будут работать:
FindSum(23,5, 78,9, Итого) FindSum(X, Y, Z+2. 0)
Здесь первый вызов будет успешным (мы можем изменить значение Total), но второй вызов завершится ошибкой (мы не можем изменить значение Z+2.0). Даже хуже того, второй вызов завершится ошибкой во время выполнения; компилятор не будет лови проблему.
Это можно обойти: см. раздел ниже о Intent пункт.
Функции
Функция – это разновидность подпрограммы, характеризующаяся тем, что она вычисляет значение для нас. (Он может делать и другие вещи.) синтаксис для него выглядит так:
Тип Имя функции (список формальных аргументов) Неявный ! объявить каждый формальный аргумент как переменную ! возможно также объявить некоторые локальные переменные ! исполняемый код, включая «Имя = что-то» Имя конечной функции
Здесь Имя используется в качестве аргумента (только для вывода). Он имеет тип, определяется типом в первой строке как Real, Integer и т. д.
Значение, вычисленное функцией, предоставляется путем присвоения значения назвать. У нас могут быть операторы If и циклы, но что бы ни случилось, Имени должно быть присвоено значение.
Другой способ записи:
Имя функции (список формальных аргументов) Неявный ! объявить каждый формальный аргумент и имя как переменную ! возможно также объявить некоторые локальные переменные ! исполняемый код, включая «Имя = что-то» Имя конечной функции
Вот пример, похожий на одну из неявных функций:
Реальная функция Abs(X) Реальный :: X Если (ХМы могли бы использовать это несколькими способами:
Z = Abx(X + 3,9) Печать *, Абс (C - D)Операторные функции
Функция-оператор — это простая идея. Это в основном просто формула для расчета, все в одном заявлении. Синтаксис выглядит так:
Имя(список формальных аргументов) = выражениеЗдесь выражение использует формальные аргументы. Имя и все формальные аргументы должны быть объявлены как обычно. Выражение может использовать другие функции, но не может содержать операторы If или петли; при необходимости его можно было бы продолжить на несколько строк.
Определение операторной функции должно быть включено в верхняя часть программы перед любым исполняемым оператором.
Чтобы использовать операторную функцию, мы используем ее так же, как обычная функция.
Вот пример:
CylVol(R, H) = 3,1415926 * R**2 * HМы могли бы использовать это в операторах присваивания и т.д.
Операторные функции — это старая функция FORTRAN, и, возможно, исчезнуть в какой-то будущей версии языка.
Пункт о намерениях
Как упоминалось выше, в подпрограмме могут использоваться некоторые формальные аргументы. только для ввода или только для вывода. Мы можем указать это компилятору если мы захотим, и если мы это сделаем, он попытается отловить программные ошибки для нас. (Нет никаких гарантий.)
Вот пример:
Real Function BoxArea(H, W, L) Неявный Реальный, Намерение(В) :: H Настоящее, намерение(In) :: W Реальный, Намерение(В) :: L BoxArea = 2 * (В * Ш + Ш * Д + Д * В) Конечная функция BoxAreaЗдесь предложение Intent(In) сообщает компилятору, что H, W и L использоваться только для ввода. Если мы застряли в очереди где-то, например,
Н = 2,5компилятор будет жаловаться на это.
Точно так же мы могли бы иметь Intent(Out) для параметров, которые должны использоваться только для вывода, или мы могли бы использовать Intent(InOut) для указания параметра должен использоваться в обоих направлениях. В подпрограмме Swap A и B могут быть объявлено с намерением (InOut). В примере FindSum сумма может быть объявлено с намерением (Out).
Предложение Intent имеет смысл только для формальных аргументов; Не может быть используется для обычных переменных.
Оператор сохранения
При нормальных обстоятельствах локальные переменные реально не существуют. чем при выполнении подпрограммы. Если я использую подпрограмму и локальная переменная PDQ инициализируется значением 13 и в конечном итоге учитывая значение 42, новое значение не будет запомнено в следующий раз, когда я используйте подпрограмму, и PDQ снова запустится со значением 13.
Иногда это неудобно. Бывают случаи, когда было бы имеет смысл иметь локальную переменную, и мы хотим, чтобы ее значение было вспоминается от одного раза к другому.
Здесь нам нужен оператор Save.
Вот пример печати заголовка страницы.
Подпрограмма PageHead(LineCount) Неявный Целое :: LineCount Целое :: PageCount = 1 Сохранить количество страниц Формат 100 (////, A, T62, A4, 1X, I2) Print 100, 'Это заголовок моей страницы', 'Страница, количество страниц Количество строк = 1 Количество страниц = Количество страниц + 1 Завершить подпрограмму PageHeadМы могли бы использовать это следующим образом:
Если (LCount > 50) Вызов PageHead(LCount)Здесь LCount — целочисленная переменная в основной программе, которая подсчитывает строк на странице.