§ 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.);

}