§ 7. Паняцце дапаможнага алгарытму

7.2. Функцыі, якія вяртаюць лікавы вынік

Большасць функцый з бібліятэкі cmath, якія выкарыстоўваліся раней, вяртаюць у якасці выніку лік.

Для таго каб функцыя магла вяртаць значэнне, выкарыстоўваецца аператар return. Пасля яго паказваецца значэнне, што вяртаецца. Гэтым  значэннем можа быць канстанта (значэнне 0 у функцыі main), пераменная (у прыкладзе 7.2 гэта функцыі plos_treug і kol_cifr) або выраз (функцыя pi() у прыкладзе 7.2).

Тып значэння, якое вяртаецца, павінен супадаць з тыпам выніку ў апісанні функцыі [1].

Прыклад 7.4. Для функцыі begin mathsize 16px style f left parenthesis x right parenthesis space equals space fraction numerator square root of open vertical bar x space minus space 2 close vertical bar end root over denominator x squared space plus space 3 end fraction end style вылічыць і вывесці: f open parentheses – 2.4 close parentheses comma space space f left parenthesis y right parenthesis comma space space f left parenthesis f left parenthesis 3.7 space asterisk times space z right parenthesis right parenthesis. Значэнні пераменных y і z уводзяцца.

Этапы выканання задання

I.   даныя: лікі y, z.

II. Вынік: f1, f2, f3 — значэнні функцыі для названых значэнняў аргументаў.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2. Апішам функцыю, якая вылічвае значэнне f па паказанай формуле.
3. Вылічым значэнне функцыі для паказаных аргументаў. 
4. Вывад значэнняў функцыі.

VI. Апісанне пераменных: y, z, f1, f2, f3 – double.

Разгледзім, як выконваецца праграма. Пры выкліку функцыі значэнне фактычнага параметра перадаецца фармальнаму і адбываецца вылічэнне з гэтым значэннем.

У першым выпадку фактычным параметрам з’яўляецца канстанта –2.4. Таму пераменная x атрымае значэнне  –2.4, пераменная  t 1 space equals space square root of open vertical bar – 2.4 space – space 2 close vertical bar end root space almost equal to space 2.097 comma пераменная t 2 space equals space x squared space plus space 3 space equals space 8.76. Функцыя верне значэнне fraction numerator 2.097 over denominator 8.76 end fraction space almost equal to space 0.239 comma якое і будзе нададзена пераменнай  f.

У другім выпадку пераменнай x будзе перададзена значэнне пераменнай y, якое ўвялі з клавіятуры, і затым будуць выкананы вылічэнні.

У трэцім выпадку выклік функцыі ажыццяўляецца двойчы: спачатку для значэння 3.7 * z, а затым аргументам функцыі стане значэнне f(3.7 * z).

Прыклад 7.5. Дазены тры лікі. Знайсці парныя здабыткі гэтых лікаў. Напісаць праграму, якая вылічыць мінімальнае і максімальнае з гэтых значэнняў.

Этапы выканання задання

I. Зходныя даныя: лікі x, y, z.

II.  Вынік: minpr, maxpr (мінімальны і максімальны здабыткі).

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2.Апішам функцыі, якія вылічваюць мінімальнае і максімальнае значэнне для двух лікаў

3. Знаходзім парныя здабыткі лікаў x, y, z. Такіх здабыткаў будзе тры: xy, yz, xz.  
4. Для знаходжання мінімальнага значэння з трох лікаў выкарыстаем наступную уласцівасць:
Min(a1, a2, a3) = Min(Min(a1, a2), a3). Максімальнае значэнне знаходзіцца аналагічна.
5. Вывад вынікаў
.

IV.Апісанне пераменных: усе пераменныя ў праграме маюць тып int.

Прыклад 7.6. Выпуклы чатырохвугольнік зададзены каардынатамі сваіх вяршынь. Напісаць праграму, якая знойдзе перыметр і плошчу чатырохвугольніка. Вылічэнне даўжыні адрэзка і плошчы трохвугольніка аформіць у выглядзе падпраграм.

Этапы выканання задання

I. Зыходныя даныя: x1, y1, x2, y2, x3, y3, x4, y4 (каардынаты вяршынь).

II. Вынік: P і S — перыметр і плошча чатырохвугольніка.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2. Перыметр чатырохвугольніка — сума даўжынь яго старон. Даўжыня стараны — даўжыня адрэзка, які злучае вяршыні. Вылічэнне даўжыні адрэзка афармляем у выглядзе функцыі 
 dlin.
3. Для вылічэння плошчы правядзём дыяганаль, якая злучае вяршыні з каардынатамі 
 (x1, y1) і (x3, y3) або (x2, y2) и (x4, y4). Чатырохвугольнік разаб’ецца на два трохвугольнікі, сума плошчы якіх і дасць шуканую плошчу. Плошчу трохвугольніка вылічым па формуле Герона,паколькі для трохвугольнікаў вядомыя даўжыні старон. Абазначэнні дапаможных пераменных — на малюнку.


Вылічэнне плошчы трохвугольніка афармляем у выглядзе функцыі  plos.
4. Вывад выніку.

IV. Апісанне пераменных: усе пераменныя ў праграме маюць тып double.


[1] Пры несупадзенні тыпаў адбываецца спроба пераўтварэння тыпаў. Калі г эта немагчыма, то кампілятар выдасць памылку.

Значэнне 0, якое вяртае функцыя main, гаворыць пра адсутнасць памылак пры выкананні праграмы. Гэта азначае, што ўсе каманды, якія знаходзяцца ў праграме да гэтага радка, выканаліся паспяхова. Каманда return 0; можа быць выкарыстана для перарывання работы функцыі. Ніякія каманды не могуць быць выкананы пасля яе.

Пра паспяховае выкананне праграмы сведчыць паведамленне «Process terminated with status 0» у акне Build log.

Калі работа праграмы была перапынена (напрыклад, карыстальнік закрыў кансольнае акно да таго, як праграма скончыла работу), то ў гэтым акне будзе паведамленне пра памылку: «Process terminated with status —1073741510»

Прыклад 7.4.

 V. Праграма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

double f(double x)

{

  double t1 = sqrt(abs(- 2));

  double t2 = x * x + 3;

  return t1 / t2;

}

 

int main()

{

  double y, z;

  cout << "vvedi 2 chisla" << endl;

  cin >> y >> z;

  double f1 = f(-2.4);

  cout << "f1 = " << f1 << endl;

  double f2 = f(y);

  cout << "f2 = " << f2 << endl;

  double f3 = f( f(3.7 * z) );

  cout << "f3 = " << f3 << endl;

  return 0;

}

 VI.  Тэсціраванне.

VII. Аналіз выніку. Праверыць правільнасць вылічэнняў можна з дапамогай калькулятара.

Прыклад 7.5.

V. Праграма:

#include <iostream>

 

using namespace std;

 

int Max(int c,int d)

{

  if (> d)

    return c;

  else

    return d;

}

 

int Min(int c, int d)

{

  if (< d)

    return c;

  else

    return d;

}

 

int main()

{

  int x, y, z;

  cout << "vvedi 3 chisla" << endl;

  cin >> x >> y >> z;

  int a1 = x * y;

  int a2 = y * z;

  int a3 = x * z;

  int s = Min(a1, a2);

  int minpr = Min(s, a3);

  cout << "min proiz = " << minpr << endl;

  s = Max(a1, a2);

  int maxpr = Max(s, a3);

  cout << "max proiz = " << maxpr << endl;

  return 0;

}

 VI. Тэсціраванне.

Прыклад 7.6.

V. Праграма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

double dlin(double x, double y, double x0, double y0)

{  

  double d = (- x0) * (- x0) + (- y0) * (- y0);

  return sqrt(d);

}

double plos(double a, double b, double c)

{  

  double pr = (+ b + c) / 2;

  double pl = sqrt(pr * (pr - a) * (pr - b) * (pr - c));

  return pl;

}

 

int main()

{

  double x1,y1,x2,y2,x3,y3,x4,y4;

  cout << "koordinaty vershiny 1 - ";

  cin >> x1 >> y1;

  cout << "koordinaty vershiny 2 - ";

  cin >> x2 >> y2;

  cout << "koordinaty vershiny 3 - ";

  cin >> x3 >> y3;

  cout << "koordinaty vershiny 4 - ";

  cin >> x4 >> y4;

  ///стораны і дыяганаль

  double a1 = dlin(x1, y1, x2, y2);

  double a2 = dlin(x2, y2, x3, y3);

  double a3 = dlin(x3, y3, x4, y4);

  double a4 = dlin(x4, y4, x1, y1);

  double d = dlin(x1, y1, x3, y3);

  ///перыметр

  double p = a1 + a2 + a3 + a4;

  ///плошча

  double s1 = plos(a1, a2, d);

  double s2 = plos(a3, a4, d);

  double s = s1 + s2;

  cout << "perimetr=" << p << endl;

  cout << "ploschad=" << s << endl;

  return 0;

}

 VI. Тэсціраванне.

VII. Аналіз выніку. Звярніце ўвагу на імёны пераменных у праграме. Фактычныя і фармальныя параметры прынята называць рознымі імёнамі.