В си все подпрограммы являются функциями: Функции в языке Си : вызов функции, возвращаемое значение

Содержание

Функции в программировании. Урок 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). Разумеется, если же брать самые популярные виды спорта, то это:

  1. Футбол
  2. Хоккей
  3. Баскетбол
  4. Бейсбол

Возможности увеличиваются с каждым днем. А основная особенность заключается в том, что все лиги и матчи можно найти почти на всех сайтах, которые специализируются на криптовалютных ставках. И можно использовать Cordana(ADA) для депозита, но это далеко не все варианты и возможности для беттера.

Конечно, чаще всего рассматриваются именно наиболее востребованные виды спорта, популярные во всем мире. Но если человек имеет определенные знания, скажем, в шахматах или крикете, в настольном теннисе, то можно заключить пари и на эти виды спорта. Сейчас в этом не будет никаких проблем. Для привлечения клиентов многие компании стараются по максимуму расширить не только спектр возможностей и качество услуг, но и вариативность в плане разнообразия. К примеру, все чаще можно ставить с использованием Cordana(ADA) на Олимпийские игры.

Ставки на киберспорт

Всегда нужно учитывать и тот момент, что многие сферы деятельности сейчас очень быстро развиваются, и если ранее только спорт привлекал внимание беттера, то сегодня часто рассматривается и киберспорт. И там тоже можно заключать пари, используя для этого криптовалюту. На текущий момент уже есть масса игр, которые собирают миллионную аудиторию и огромные призовые. Наверняка сейчас есть те игры, которые могут привлечь большую аудиторию, чем определенный вид спорта.

И если есть желание делать ставки с помощью Cordana(ADA) на игры, то стоит рассмотреть самые востребованные:

  1. LoL
  2. CS GO
  3. Dota 2
  4. 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

Серебряный. Возвращает значения из подпрограммы
  1. Используя приведенный ниже брелок и приведенный выше псевдокод, создайте работающую программу 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. Что такое подпрограмма? (1 балл)
  2. В чем разница между процедурой и функцией? (2 балла)
  3. Где следует размещать подпрограммы при написании псевдокода или кода Python, выше или ниже основной программы? (2 балла)

Загрузка в Fundamentals of 3.2 Programming — 3.2.7 Подпрограммы (процедуры и функции): Gold на BourneToLearn

Badge It: Exam Question and Coding Challenge

Platinum — Exam question/Code Challenge
  1. Функция 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 — целочисленная переменная в основной программе, которая подсчитывает строк на странице.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *