Подпрограммы (функции)
Подпрограммы
Вспомогательный алгоритм тоже может вызывать другие вспомогательные, длина такой цепочки вызовов теоретически не ограничена. Здесь и далее следующие пары слов используются как синонимы: алгоритм и программа, вспомогательный алгоритм и подпрограмма, команда и оператор, программа и модуль. Вспомогательными и основными алгоритмы являются не сами по себе, а по отношению друг к другу.
При использовании вспомогательных алгоритмов необходимо учитывать способ передачи значений исходных данных для них и получения результата от них. Аргументы вспомогательного алгоритма — это переменные, в которых должны быть помещены исходные данные для решения соответствующей подзадачи. Результаты вспомогательного алгоритма — это также переменные, где содержаться результаты решения этих подзадач, а также результатом может быть конкретное действие, которое совершает компьютер под действием подпрограммы.
Подпрограммы могут быть двух видов: подпрограмма без параметров и подпрограмма с параметрами. Обращение к подпрограмме может быть организовано из любого места основной программы или другой подпрограммы сколько угодно раз.
Подпрограмма с параметрами используется для записи многократно повторяющихся действий при разных исходных данных.
При составлении подпрограмм с параметрами надо соблюдать следующие правила:
1) каждая подпрограмма имеет свое имя и список формальных параметров;
2) процедура из основной программы вызывается командой вызова, которая по форме ничем не отличается от вызова команды исполнителя. Результат присваивается одной или нескольким переменным, которые находятся в списке формальных параметров. Но результатом могут быть, конечно, не только значения переменных, но какое либо действие, выполненное ЭВМ.
Как видно из примера, объявление подпрограммы-функции находится в разделе описаний прототипов функций, а реализация после основной функции main. В заголовке подпрограммы содержится список формальных параметров с указанием их типа, которые условно можно разделить на входные и выходные (перед ними стоит &). Вообще при обращении к функции со списком параметров без &, внутри функции используются копии параметров, которые после выполнения удаляются. Знак & указывает компилятору что необходимо использовать саму переменную, а не ее копию. При обращении к функции указывается ее имя и список фактических параметров. Формальные и фактические параметры должны соответствовать по количеству и по типу.
Описание функции в С++ осуществляется следующим образом:
Функция всегда возвращает единственное значение. Как видно из примера 1, мы использовали тип void в качестве возращаемого типа. Т.е. указали компилятору, что наша функция не возвращает никакого значения.
Покажем, как изменится подпрограмма из примера, если ее записать в виде функции, возвращающей само значение НОД (без использования возвращаемой переменной).
Итак, в теле функции хотя бы один раз встречается команда return, которая указывает, какое значение вернуть в качестве значения функции.
Вызов функции в основной будет следующим:
Вообще, вызов функции может присутствовать в выражении, стоящем: в правой части операции присваивания, в операторе вывода, в качестве фактического параметра в вызове другой подпрограммы и т.д.
При решении задач целесообразно проанализировать условие, записать решение в крупных блоках (не являющихся операторами C++), детализировать каждый из блоков (записав в виде блоков, возможно, по-прежнему не операторов C++), и т.д., продолжать до тех пор, пока каждый из блоков не будет реализован с помощью операторов языка.
Можно заметить, что необходимо детализировать логическую функцию Impossible, которая диагностирует, возможна ли перестановка, и функцию Change, которая эту перестановку (в случае, если она возможна) выполняет.
Здесь необходимо детализировать функцию Number, возвращающую количество цифр в записи натурального числа (т.к. функция Impossible содержит ее вызов, то в разделе описаний прототипов функция Number должна ей предшествовать).
Наконец, последняя функция.
Пример 3. Найти максимальную цифру в записи данного натурального числа.
Изучаем C++. Часть 5. Функции и процедуры
Разбираемся, как функции помогают сократить код и сделать программу полезнее.
Это пятая часть из серии статей «Глубокое погружение в C++». В прошлый раз мы узнали, как правильно использовать ввод данных и обрабатывать исключения. Сегодня займёмся функциями и процедурами.
Если код нужно использовать несколько раз, то лучше всего его вывести в подпрограмму — функцию или процедуру. Это позволит значительно сократить объём кода. Давайте рассмотрим вот такую программу:
Программа по очереди приветствует шесть человек. Это относительно небольшой код, но что, если понадобится заменить фразу «Hello, %name%!» на «Hello, %name%! How are you?»? Тогда придётся поменять код в шести местах. А такие сообщения могут выводиться сто или даже тысячу раз.
Подпрограммы как раз и нужны, чтобы избежать таких проблем.
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Как создать функцию в C++
Для удобства любые подпрограммы, в том числе и процедуры, называют функциями.
Одну функцию мы с вами уже создавали — main (). Она работает как точка входа в каждую программу. Другие функции создаются аналогичным образом:
Вот так это выглядит в коде:
Функции могут принимать или не принимать аргументы. Но если вы указали, что аргументы всё же нужны, то попытка вызвать функцию без них приведёт к ошибке.
Если вы указываете какой-либо тип возвращаемых данных, то обязательно должен присутствовать оператор return. Если возвращать значение не нужно, создайте процедуру — укажите тип void.
Вот что выведет такая программа:
Функция main () автоматически возвращает значение, поэтому отдельно прописывать return не обязательно. Программа вернёт 0, если она выполнилась успешно, или другое число в зависимости от ошибки.
Области видимости в C++
Всё, что происходит в функции, в ней же и остаётся. То есть функции могут работать только с теми значениями, которые в них передали:
Если переменная создаётся внутри какого-либо блока <>, то она будет доступна только в этом и во всех вложенных блоках; такие переменные называются локальными.
Если вы хотите, чтобы какая-нибудь переменная была доступна везде, то её нужно объявить за пределами каких-либо блоков; такие переменные называются глобальными:
Однако использовать глобальные переменные не рекомендуется, потому что вам будет сложно отслеживать изменения и влиять на результат работы программы. Единственное исключение — это константы, которые нужно делать глобальными, потому что они не меняются.
Как работают аргументы
Рассмотрим, что происходит, когда вы передаёте аргумент в функцию. Допустим, есть вот такой код:
Можно подумать, что в результате программы мы увидим число 505, но это неверно. Дело в том, что функции в качестве аргументов принимают не сами переменные, а их значения. То есть в sum () попала не ячейка памяти, а число 5, которое находилось в этой ячейке. Учитывайте это, когда пишете программы.
Это касается только примитивных типов данных. Ссылочные типы ведут себя иначе.
Рекурсия C++
Рекурсия — это ситуация, когда объект является частью самого себя (не путать с фракталом). В программировании это проявляется в одной интересной особенности функций — они могут вызывать сами себя.
Чтобы понять, что такое рекурсия, нужно понять, что такое рекурсия
Чаще всего рекурсия объясняется на примере факториалов (не путать с фракталами):
Вот факториалы чисел от 1 до 10:
Важно! Прописывайте условия выхода из рекурсии, иначе программа попадёт в бесконечный цикл и сильно нагрузит компьютер.
На практике применение этой особенности можно увидеть при рекурсивном удалении папок. Функция удаления должна работать так:
Рекомендации по созданию функций
Разрабатывая программы, вы постоянно будете работать с функциями, поэтому важно научиться делать их максимально полезными. Вот несколько рекомендаций:
И старайтесь как можно больше практиковаться, чтобы закрепить новые знания. В этой серии статей описываются базовые возможности программирования, которые пригодятся вам на протяжении всей карьеры. В следующем материале мы разберёмся, как упростить повторяющийся код с помощью циклов.
Ну а если вы хотите углубить свои знания, набраться опыта на реальных проектах и получать обратную связь по своему коду от опытных разработчиков, то записывайтесь на наш курс по программированию на C++.
Как написать подпрограмму в c
Урок № 13. Методы в C#
Создание и использование методов
Доброго времени суток! В этом уроке я расскажу, что же такое методы в C#. Я уже не раз употреблял этот термин, и пришла пора разобраться с ним. Как всегда, я не буду перегружать Вас информацией, дам только самое необходимое (разумеется, на мой взгляд).
И так, что же такое метод? В контексте объектно-ориентированного программирования, метод – это подпрограмма. А подпрограмма, в свою очередь – это фрагмент программы, который написать нужно один раз, а использовать его можно многократно (для выполнения однотипных действий). Это довольно удобно по нескольким причинам, например, можно реализовать определенный алгоритм один раз, хорошо его отладить, и быть уверенным в правильности его работы применяя его в дальнейшем многократно. Да и использование подпрограмм, значительно сокращает объем исходного кода проекта. Или еще представьте такую ситуацию, мы один раз написали подпрограмму, которая выполняет определенные действия, и многократно её используем, а потом, технические требования заставляют нас модифицировать алгоритм этих самых действий, так вот, нам достаточно всего один раз изменить код подпрограммы (изменения применяется во всех местах её использования). Думаю я убедил Вас в том, что познакомиться с методами в C# обязательно стоит!
И так, к делу! Мы уже знакомы с методом «Main» в главном файле программы. Это, так называемая точка входа в программу, главный метод наших программ. Этот метод, Visual Studio сгенерила сама, давайте рассмотрим, как он выглядит в исходном состоянии (сразу после создания нового проекта). Для этого создадим новый проект консольного приложения и рассмотрим код метода «Main», что называется под детально! А выглядит он вот так:
Я преднамеренно привел код метода «Main» вместе с объемлющим его кодом. Метод «Main» относится к классу «Program» (т.е. находится внутри класса «Program«).
Что такое классы в C# я сейчас подробно рассказывать не буду, скажу лишь, что класс – это описание некого типа данных, который характеризуется набором представляемых данных и набором возможных операций над ними.
Метод состоит из так называемого заголовка и тела:
Разберем подробно заголовок метода. Ключевое слово static обозначает, что метод относится ко всему классу. Пока не задавайте себе вопрос, что же это значит, просто примите как должное. Придет время, и я расскажу об этом подробнее. На данном этапе, мы перед каждым создаваемым методом будем писать ключевое слово static.
Далее идет ключевое слово void, в этом месте, указывается тип возвращаемого методом значения. Что это значит? Это значит, что выполнив какую-то работу, метод может вернуть её результат, а мы можем сохранить его в какой-либо переменной (и использовать для дальнейших нужд). А тип переменной, должен совпадать с типом возвращаемого значения! Но не каждый метод должен возвращать какое-то значение, и именно в тех случаях, когда метод «ничего не возвращает» указывается ключевое слово void.
Если бы метод «Main» должен был возвращать целое число, то вместо слова void было бы использовано слово int.
После ключевого слова void следует название метода, в данном случае – это Main. После названия идут круглые скобки, в которых определяются аргументы метода. В нашем случае – это «string[] args». Т.е. массив строк. Аргументы метода – это входные данные, которые получает метод. Аргументы метода в заголовке еще называют его формальными параметрами.
Как и в случае возвращаемого значения, не каждый метод нуждается во входных данных, и тогда круглые скобки после названия метода будут пустыми.
Для примера, рассмотри заголовок статического метода, который будет принимать два целочисленных аргумента, и возвращать их сумму:
Думаю что с заголовками методов более или менее понятно, давайте рассмотрим, что такое тело метода. А это просто набор операторов, заключенный в фигурные скобки сразу после заголовка метода.
Метод, чей заголовок мы рассматривали ранее, целиком, может выглядеть примерно так:
Т.е. по факту, мы уже имеем написанный метод (подпрограмму), но теперь нужно им как-то воспользоваться, иначе, зачем он нам нужен? А чтобы воспользоваться методом, нужно его, так сказать, вызвать! Делается это следующим образом:
В примере выше мы вызвали метод «Sum» с фактическими параметрами, где первый из них равен 24 а второй – 6. Результат метода будет сохранен в переменной «result» и позже мы выводим его в консоль. В принципе, все просто!
А теперь, давайте применим полученные знания на практике! Улучшим пример из предыдущего урока. В нем мы дважды просили пользователя ввести целое число с клавиатуры, т.е. выполняли однотипные действия. Давайте оптимизируем наш код, создадим метод, который будет принимать в качестве аргумента текст приглашения пользователю, а возвращать введенное им число, после чего дважды вызовем этот метод с разными формальными параметрами.
Функциональность программы осталась той же, но исходный код принял более оптимальный вид. На этот раз хватит информации, в дальнейшем мы еще не раз будет работать с различными методами, и Вы получите новые знания! А в следующем уроке, подробнее вернемся к обработке ошибок, в нем тоже будет интересная информация!
Методы (Руководство по программированию на C#)
Метод — это блок кода, содержащий ряд инструкций. Программа инициирует выполнение инструкций, вызывая метод и указывая все аргументы, необходимые для этого метода. В C# все инструкции выполняются в контексте метода.
Метод Main является точкой входа для каждого приложения C# и вызывается общеязыковой средой выполнения (CLR) при запуске программы. В приложении, использующем инструкции верхнего уровня, метод Main создается компилятором и содержит все инструкции верхнего уровня.
В этой статье рассматриваются названные методы. Дополнительные сведения об анонимных функциях см. в статье Лямбда-выражения.
Сигнатуры методов
Тип возврата метода не является частью сигнатуры метода в целях перегрузки метода. Однако он является частью сигнатуры метода при определении совместимости между делегатом и методом, который он указывает.
Параметры метода заключаются в скобки и разделяются запятыми. Пустые скобки указывают, что параметры методу не требуются. Этот класс содержит четыре метода:
Доступ к методу
Вызов метода в объекте аналогичен доступу к полю. После имени объекта добавьте точку, имя метода и круглые скобки. Аргументы перечисляются в этих скобках и разделяются запятыми. Таким образом, методы класса Motorcycle могут вызываться, как показано в следующем примере:
Параметры и аргументы метода
Определение метода задает имена и типы всех необходимых параметров. Когда вызывающий код вызывает метод, он предоставляет конкретные значения, называемые аргументами, для каждого параметра. Аргументы должны быть совместимы с типом параметра, но имя аргумента (если есть), используемое в вызывающем коде, не обязательно должно совпадать с именем параметра, указанным в методе. Пример:
Передача по ссылке и передача по значению
При передаче в метод объекта ссылочного типа передается ссылка на этот объект. То есть метод получает не сам объект, а аргумент, который указывает расположение объекта. При изменении члена объекта с помощью этой ссылки это изменение отражается в аргументе в вызывающем методе, даже если объект передается по значению.
Теперь, если передать объект, основанный на этом типе, в метод, то будет передана ссылка на объект. В следующем примере объект типа SampleRefType передается в метод ModifyObject :
Дополнительные сведения о передаче ссылочных типов по ссылке и по значению см. в разделах Передача параметров ссылочного типа и Ссылочные типы.
Возвращаемые значения
Чтобы использовать значение, возвращаемое из метода, вызывающий метод может применять сам вызов метода везде, где будет достаточно значения того же типа. Можно также назначить возвращаемое значение переменной. Например, следующие два примера кода достигают одной и той же цели.
Чтобы использовать значение, возвращаемое по ссылке из метода, необходимо объявить локальную ссылочную переменную, если планируется изменение значения. Например, если метод Planet.GetEstimatedDistance возвращает значение Double по ссылке, можно определить его как локальную ссылочную переменную с использованием кода следующего вида:
Асинхронные методы
С помощью функции async можно вызывать асинхронные методы, не прибегая к использованию явных обратных вызовов или ручному разделению кода между несколькими методами или лямбда-выражениями.
Асинхронный метод возвращается в вызывающий объект, когда он встречает первый ожидаемый объект, выполнение которого еще не завершено, или когда выполнение асинхронного метода доходит до конца — в зависимости от того, что происходит раньше.
Определения текста выражений
Часто используются определения методов, которые просто немедленно возвращаются с результатом выражения или которые имеют единственную инструкцию в тексте метода. Для определения таких методов существует сокращенный синтаксис с использованием => :
Если метод возвращает void или является асинхронным методом, то текст метода должен быть выражением инструкции (так же, как при использовании лямбда-выражений). Свойства и индексаторы должны быть только для чтения, и вы не должны использовать ключевое слово get метода доступа.
Iterators
Дополнительные сведения см. в разделе Итераторы.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Функции в языке Си
Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.
Сигнатура функции определяет правила использования функции. Обычно сигнатура представляет собой описание функции, включающее имя функции, перечень формальных параметров с их типами и тип возвращаемого значения.
Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.
Определение функции
Каждая функция в языке Си должна быть определена, то есть должны быть указаны:
Определение функции имеет следующий синтаксис:
Пример : Функция сложения двух вещественных чисел
Различают системные (в составе систем программирования) и собственные функции.
Собственные функции — это функции, написанные пользователем для решения конкретной подзадачи.
Разбиение программ на функции дает следующие преимущества:
С точки зрения вызывающей программы функцию можно представить как некий «черный ящик», у которого есть несколько входов и один выход. С точки зрения вызывающей программы неважно, каким образом производится обработка информации внутри функции. Для корректного использования функции достаточно знать лишь ее сигнатуру.
Вызов функции
Общий вид вызова функции
Фактический аргумент — это величина, которая присваивается формальному аргументу при вызове функции. Таким образом, формальный аргумент — это переменная в вызываемой функции, а фактический аргумент — это конкретное значение, присвоенное этой переменной вызывающей функцией. Фактический аргумент может быть константой, переменной или выражением. Если фактический аргумент представлен в виде выражения, то его значение сначала вычисляется, а затем передается в вызываемую функцию. Если в функцию требуется передать несколько значений, то они записываются через запятую. При этом формальные параметры заменяются значениями фактических параметров в порядке их следования в сигнатуре функции.
Возврат в вызывающую функцию
По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение. Для передачи возвращаемого значения в вызывающую функцию используется оператор return в одной из форм:
Действие оператора следующее: значение выражения, заключенного в скобки, вычисляется и передается в вызывающую функцию. Возвращаемое значение может использоваться в вызывающей программе как часть некоторого выражения.
Оператор return также завершает выполнение функции и передает управление следующему оператору в вызывающей функции. Оператор return не обязательно должен находиться в конце тела функции.
Пример : Посчитать сумму двух чисел.
В языке Си нельзя определять одну функцию внутри другой.
В языке Си нет требования, чтобы семантика функции обязательно предшествовало её вызову. Функции могут определяться как до вызывающей функции, так и после нее. Однако если семантика вызываемой функции описывается ниже ее вызова, необходимо до вызова функции определить прототип этой функции, содержащий:
Прототип необходим для того, чтобы компилятор мог осуществить проверку соответствия типов передаваемых фактических аргументов типам формальных аргументов. Имена формальных аргументов в прототипе функции могут отсутствовать.
Если в примере выше тело функции сложения чисел разместить после тела функции main, то код будет выглядеть следующим образом:
Рекурсивные функции
Рекурсия — вызов функции из самой функции.
Пример рекурсивной функции — функция вычисления факториала.
Результат выполнения
Более подробно рекурсивные функции рассмотрены в этой статье.
Математические функции
Основные математические функции стандартной библиотеки.
Функция | Описание |
int abs( int x) | Модуль целого числа x |
double acos( double x) | Арккосинус x |
double asin( double x) | Арксинус x |
double atan( double x) | Арктангенс x |
double cos( double x) | Косинус x |
double cosh( double x) | Косинус гиперболический x |
double exp( double x) | Экспонента x |
double fabs( double x) | Модуль вещественного числа |
double fmod( double x, double y) | Остаток от деления x/y |
double log( double x) | Натуральный логарифм x |
double log10( double x) | Десятичный логарифм x |
double pow( double x, double y) | x в степени y |
double sin( double x) | Синус x |
double sinh( double x) | Синус гиперболический x |
double sqrt( double x) | Квадратный корень x |
double tan( double x) | Тангенс x |
double tanh( double x) | Тангенс гиперболический x |
Особенности использования функций в языке C++ рассмотрены в этой статье.