Отправляет email-рассылки с помощью сервиса Sendsay

Си/Си++ с нуля!

  Все выпуски  

На этот раз мы с вами поговорим о подпрограммах.



Доброго времени суток, Уважаемые Подписчики.

На этот раз мы с вами поговорим о подпрограммах. В этой статье я по-возможности кратко постараюсь объяснить что такое подпрограмма, процедура и функция в различных языках. Также я приведу синтаксис описания и примеры использования функций в Си.

Подпрограмма (англ. 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[]) //-- главная функция с которой начинается выполнение программы
{ //-- начало

    int result=-1;


    //-- вызов 1
    simple_function("первый вызов функции");

    //-- вызов 2, с другими параметрами
    simple_function("второй вызов функции");

    //-- вызов 3, результат присвоим переменной result
    result=simple_function("третий вызов функции");

    //-- печатаем результат, вызывая функцию printf

    printf("%dn", result);

    return 0;
} //-- конец

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

первый вызов функции
второй вызов функции
третий вызов функции
0
Резюме.

Это, конечно, примитивный пример, который не имеет по-видимому практической цели. Однако он наглядно иллюстрирует, как осуществляется вызов функций и как функции могут быть добавлены в программу. Хотелось бы отметить что выражения наподобие printf(что-то там); это точно такие же вызовы функций, только они в отличие от ваших, созданы были кем-то еще и входят в состав библиотек функций и поэтому так и называются - библиотечными. Функция printf() в частности входит в состав библиотеки cstdio.

На этом все. Темой нашего следующего выпуска станут операции языка Си.


С уважением, Владимир Чистов - ведущий рассылки.
До встречи в следующем выпуске!

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


В избранное