§ 7. Понятие вспомогательного алгоритма

7.1. Вспомогательные алгоритмы

Вспомогательный алгоритм — алгоритм, который можно использовать в других алгоритмах, указав его имя и, если необходимо, значения параметров. Вспомогательный алгоритм, записанный на языке программирования, называют подпрограммой.

Основные преимущества использования подпрограмм:

1. Разбиение комплексной программной задачи на простые шаги (декомпозиция). Это позволяет распределить решение одной задачи между различными людьми. 
2. Уменьшение повторяющегося кода. 
3. Многократное использование кода в других программах, в том числе и другими программистами. 
4. Сокрытие деталей реализации от пользователей подпрограммы.

Подпрограммы, которые используются часто, объединяют в библиотеки. Большинство языков программирования позволяют не только использовать готовые подпрограммы, но и писать свои. В языке C++ подпрограммы оформляются в виде функций. Вам уже приходилось использовать различные функции, например из библиотеки cmath.

Перед тем как использовать функцию, ее нужно описать. Описание функции включает объявление и определение функции.

Объявление функции (пример 7.1) включает в себя заголовок функции, заканчивающийся точкой с запятой и включающий:

  • имя функции f_N;
  • перечень формальных параметров с их типами
    (type a_1, type a_2,… , type a_N);
  • тип возвращаемого значения
    r_type:
    r _type f_N (type a_1, type a_2, ..., type a_N);

Функции могут быть с параметрами или без параметров. Если функция не имеет параметров, то наличие круглых скобок после имени функции обязательно.

Определение функции состоит из заголовка функции (без точки с запятой) и тела функции, заключенного в фигурные скобки. В нем содержатся команды языка, реализующие вспомогательный алгоритм (пример 7.2).

Главная программа на С++ также реализована в виде функции. Эта функция всегда имеет имя main. Тип результата и наличие параметров этой функции может быть различными для различных сред программирования. В среде Code::Blocks функция main() имеет тип int и не имеет параметров.

Обычно объявление и описание подпрограмм размещают до функции main(). Если для решения задачи необходимо реализовать несколько функций, то нужно помнить о том, что функция должна быть объявлена до того, как она будет вызвана.

При вызове функции (пример 7.3) указывается ее имя и параметры, необходимые для вычислений. Эти параметры называют фактическими параметрами.

В описании функции задается список формальных параметров. Каждый параметр, описанный в этом списке, является локальным по отношению к описываемой функции, т. е. на него можно ссылаться по его имени из данной подпрограммы, но не из основной программы или другой функции.

Переменные, значения которых должны быть известны во всех функциях, являются глобальными и описываются до описания функций. Если переменная описана между описаниями функций, то ее значение будет глобальным для всех функций, описанных ниже, но неизвестным для функций, описанных выше. 

Необходимость оптимизации программ по объему занимаемой памяти привела к появлению подпрограмм. Подпрограммы позволили не повторять в программе идентичные блоки кода, а описывать их однократно и вызывать по мере необходимости.

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

Использование подпрограмм гарантирует относительную автономность модификации программы: если нужно что-либо изменить в программе, переделывать придется не всю программу, а только некоторые подпрограммы.

Пример 7.1. Объявление функций.

int kol_cifr (int n);
double plos_treug(double a, double h);

double pi();

Пример 7.2. Определение функции.

int kol_cifr (int n)

{

    int k = 0;

    while (>0 ) {

        n /= 10;

        k++;

    }

    return k;

}

 

double plos_treug(double a, double h)

{

    double s = a * h / 2;

    return s;

}

 

double pi()

{

    return acos(-1.);

}

В среде Dev-C++ функция main может иметь аргументы:

В среде Microsoft Visual Studio тип возвращаемого значения у функции main может быть void:

Пример 7.3. Вызов функции.

int k = kol_cifr (12345);

double s_kv = 2 * plos_treug(a1, h1);

cout << pi();

В С++ объявление и определение функции может быть в разных местах. Объявление размещают до функции main, а определение после нее.

#include <iostream>

#include <cmath>

 

using namespace std;

 

int kol_cifr (int n);

 

double plos_treug(double a, double h);

 

double pi();

 

int main()

{

  int k = kol_cifr (12345);

  double a1 = 5, h1 = 3.2;

  double s_kv = 2 * plos_treug(a1, h1);

  cout << pi() << endl;

  ///...

  return 0;

}

 

int kol_cifr (int n)

{

  int k = 0;

  while (>0 ) {

    n /= 10;

    k++;

  }

  return k;

}

 

double plos_treug(double a, double h)

{

  double s = a * h / 2;

  return s;

}

 

double pi()

{

  return acos(-1.);

}