На этот раз мы с вами поговорим о подпрограммах.
В этой статье я по-возможности кратко постараюсь объяснить что такое подпрограмма,
процедура и функция в различных языках. Также я приведу синтаксис описания и
примеры использования функций в Си.
Подпрограмма (англ. subprogram) — поименованная или иным образом идентифицированная часть компьютерной программы, содержащая описание определённого набора действий. Подпрограмма может быть многократно вызвана из разных частей программы. В языках программирования для оформления и использования подпрограмм существуют специальные синтаксические средства.Назначение подпрограмм.
Подпрограммы изначально появились как средство оптимизации программ по объёму занимаемой памяти — они позволили не повторять в программе идентичные блоки кода, а описывать их однократно и вызывать по мере необходимости. К настоящему времени данная функция подпрограмм стала вспомогательной, главное их назначение — структуризация программы с целью удобства её понимания и сопровождения.
Выделение участков кода в подпрограмму преследует две цели, первая - это экономия памяти за счет многократного использования одних и тех же участков кода и вторая - это сокращение количества потенциальных ошибок за счет того, что отлаживается только один участок кода, который затем может вызываться в разных местах.
Даже в тех случаях, когда в подпрограмму выделяется однократно производимый набор действий, это оправдано, так как позволяет сократить размеры целостных блоков кода, составляющих программу, то есть сделать программу более понятной и обозримой...
Часто используемые подпрограммы, связанные каким-то общим смыслом выделяются в Библиотеки подпрограмм.
Все виды подпрограмм в высокоуровневых языках таких как Си и Паскаль делятся на процедуры и функции.
Функция — в программировании — один из видов подпрограммы. Особенность, отличающая её от другого вида подпрограмм — процедуры, состоит в том, что функция возвращает значение, а её вызов может использоваться в программе как выражение.С точки зрения теории систем, функция в программировании — отдельная система (подсистема, подпрограмма), на вход которой поступают управляющие воздействия в виде значений аргументов
(переменных). На выходе системы получаем результат выполнения подпрограммы, который может быть как скалярной величиной, так и векторным значением. По ходу выполнения функции могут выполняться также некоторые изменения в управляемой системе, причём как обратимые, так и необратимые.
В некоторых языках программирования (например, в Паскале) функции существуют наряду с процедурами (подпрограммами, не возвращающими значения), в других, например, в Си/Си++, являются единственным реализованным видом подпрограммы (то есть все подпрограммы являются функциями и могут возвращать значение). Си++ при этом допускает использование функций возвращающей значение типа void - пустота, такие функции могут неформально трактоваться как процедуры.
Побочным эффектом функции называется любое изменение функцией состояния программной среды, кроме возврата результата (изменение значений глобальных переменных, выделение и освобождение памяти, ввод-вывод и так далее). Теоретически наиболее правильным является использование функций, не имеющих побочного эффекта (то есть таких, в результате вызова которых возвращается вычисленное значение, и только), хотя на практике приходится использовать
функции с побочным эффектом, хотя бы для обеспечения ввода-вывода и отображения результатов работы программы. Существует специфическая парадигма программирования — функциональное программирование, в которой любая программа представляет собой набор вложенных вызовов функций, не вызывающих побочных эффектов. Наиболее известный язык программирования, реализующий эту парадигму — Лисп. В нём любая операция, любая конструкция языка, любое выражение, кроме константы, являются вызовами функций.
В общем виде в Си/Си++ используется следующая схема добавления функций в программу. Сначала пишется объявление функции, где определяется тип возвращаемого значения, количество и тип параметров, ее имя, например:
int my_function(void); //-- здесь точка с запятой обязательна!
Здесь объявляется, что в программе будет использоваться функция с именем my_function, которая возвращает значение типа int (целое), и не имеет входных параметров. Объявление должно быть обязательно до первого использования (вызова) функции.
Затем идет реализация этой функции. В Си/Си++ это выглядит так:
int my_function(void)//-- точка с запятой уже не ставится
{ // -- фигурные скобки символизируют начало и конец блока функции //-- тело функции, какой-то код
}
Функция может быть вызвана только из другой функции, для этого нужно в месте из которого она вызывается написать имя функции и в круглых скобках передать ей параметры. Объявление может совпадать с реализацией, если последняя делается до первого вызова функции в программе. Следующий пример иллюстрирует использование функций.
#include<cstdio> //-- указание использовать библиотеку стандартного ввода-вывода
#include<cstdlib>//-- указание использовать стандартную библиотеку сервисных функций
using namespace std; int simple_function(char *s) //-- наша функция
{ //-- начало
printf("%sn", s); return 0; //-- указываем какое значение должна вернуть наша функция
} //-- конец
int main(int argc, char* argv[])//-- главная функция с которой начинается выполнение программы
{ //-- начало
//-- вызов 2, с другими параметрами
simple_function("второй вызов функции");
//-- вызов 3, результат присвоим переменной result
result=simple_function("третий вызов функции");
//-- печатаем результат, вызывая функцию printf
printf("%dn", result);
return 0;
} //-- конец
Результатом работы данной программы будет следующий вывод:
первый вызов функции
второй вызов функции
третий вызов функции
0
Резюме.
Это, конечно, примитивный пример, который не имеет по-видимому практической цели.
Однако он наглядно иллюстрирует, как осуществляется вызов функций и как
функции могут быть добавлены в программу. Хотелось бы отметить что
выражения наподобие printf(что-то там); это точно такие же вызовы функций, только
они в отличие от ваших, созданы были кем-то еще и входят в состав
библиотек функций и поэтому так и называются - библиотечными.
Функция printf() в частности входит в состав библиотеки cstdio.
На этом все. Темой нашего следующего выпуска станут операции языка Си.
С уважением, Владимир Чистов - ведущий рассылки.
До встречи в следующем выпуске!
Если у вас возникли какие-нибудь вопросы, обязательно пишите мне или заходите на сайт рассылки.