§ 6. Выкарыстанне асноўных алгарытмічных канструкцый для рашэння задач

6.4. Знаходжанне сумы элементаў лікавай паслядоўнасці

Прыклад 6.15. У сакрэтнай лабараторыі выводзяць карысныя бактэрыі. Эксперыментальна было вызначана, што колькасць бактэрый (у млн) залежыць ад нумара дня, у які праводзіцца эксперымент, наступным чынамм: begin mathsize 16px style a subscript n space equals fraction numerator n cubed over denominator square root of n cubed space minus space n space plus space 1 end root end fraction end style. Вызначыце, колькі бактэрый вывелі за m дзён.

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

 IЗыходныя даныяе: m (колькасць дзён).

II. Вынік: s (агульная колькасць бактэрый).

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

1. Увод ліку m
2. Для вылічэння агульнай колькасці бактэрый неабходна паслядоўна прыбаўляць колькасць бактэрый, выведзеных у бягучы дзень, да ўжо атрыманай колькасці бактэрый. Пачатковае значэнне сумы роўна  0. 
3. Паколькі колькасць дзён загадзя вядомая, для вылічэння сумы можна выкарыстаць цыкл  for
4. Колькасць бактэрый у бягучы дзень будзем захоўваць у пераменнай а. Значэнне a залежыць ад значэння n — лічыльніка дзён. Пераменная n змяняецца ад 1 да m
5. Вывад выніку s.

IV. Апісанне пераменных: m – int, s, a – double.

Прыклад 6.16. Напісаць праграму для вылічэння сумы, якая мае сваімі складаемымі элементы паслядоўнасц begin mathsize 16px style a subscript n space equals space fraction numerator n space plus space 2 to the power of n over denominator n factorial end fraction end style. Вылічэнні выконваць да таго часу, пакуль не знойдзецца складаемае, для якога правільная няроўнасць begin mathsize 16px style open vertical bar a subscript n close vertical bar space less than space e p s end style. Значэнне eps уводзіцца (begin mathsize 16px style 0 space less than space e p s space less than space 1 end style).

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

I. Зыходныя даныя: eps (дакладнасць вылічэнняў).

II. Вынік: пераменная s (сума).

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

1. Увод ліку eps. 
2. Для вылічэння сумы неабходна паслядоўна прыбаўляць чарговае складаемае, якое задавальняе ўмову задачы, да ўжо атрыманай сумы.

2.1. Паколькі колькасць складаемых загадзя не вядомая, то для вылічэння сумы выкарыстаем цыкл do…while
2.2. Пачатковае значэнне сумы s = 0.
2.3. Бягучае значэнне складаемага будзем захоўваць у пераменнай а. Значэнне a залежыць ад значэння n — лічыльніка складаемых у суме. Пераменная n будзе змяняцца на 1 да таго часу, пакуль выконваецца ўмова задачы. Пачатковае значэнне n = 0.
2.4. Асобна трэба атрымліваць 2n и n! Для гэтага завядзём пераменныя d (для захоўвання значэння 2n) і f (для захоўвання значэння n!). Пачатковыя значэнні пераменных: d = 1, f = 1. Для кожнага наступнага складаемага папярэдняе значэнне пераменнай d павялічваецца ў два разы, значэнне пераменнай f павялічваецца ў n раз.

3. Вывад вынік s.

IV. Апісанне пераменных: n – int, eps, a, s, d, f – double.

Прыклад 6.15.

V. Праграма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  int m;

  cout << "m = ";

  cin >> m;

  double s = 0;

  for (int n = 1; n <= m; n++){

    double x = 1. * n * n * n;

    double a = x / (sqrt(x)- n + 1);

    s += a;

  }

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

  return 0;

}

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

VII. Аналіз выніку. Для праверкі правільнасці выніку можна палічыць значэнне сумы на калькулятары:

begin mathsize 14px style a subscript italic 1 space equals space 1 semicolon end style

begin mathsize 14px style a subscript 2 space equals space fraction numerator 2 cubed over denominator square root of 8 space minus space 2 space plus space 1 end fraction almost equal to 4.38 semicolon end style

begin mathsize 14px style a subscript 3 space equals space fraction numerator 3 cubed over denominator square root of 27 space minus space 3 space plus space 1 end fraction almost equal to space 8.44 comma end style

begin mathsize 14px style S space almost equal to space 13.82. end style

Прыклад 6.16.

V. Праграма:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  double eps, a;

  cout << "eps = ";

  cin >> eps;

  int n = 0;

  double s = 0;

  double d = 1;

  double f = 1;

  do  {

    n++;

    ///вылічэнне фактарыяла

    f *= n;

    ///узвядзенне 2 у ступень

    d *= 2;

    a =(+ d) / f;

    s += a;

  }

  while (abs(a) >= eps);

  cout << "summa= " << s << endl;

  return 0;

}

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

VII. Аналіз выніку. Паколькі фактарыял з’яўляецца функцыяй, якая надзвычай хутка расце, то элементы паслядоўнасці спадаюць.  Выпішам элементы:

begin mathsize 14px style a subscript 1 space equals space fraction numerator 1 space plus space 2 over denominator 1 end fraction space equals space 3 semicolon space space space space space a subscript 2 space equals space fraction numerator 2 space plus space 2 cubed over denominator 2 factorial end fraction space equals space 3 semicolon
a subscript 3 space equals space fraction numerator 3 space plus space 2 cubed over denominator 3 factorial end fraction space equals 11 over 6 space almost equal to space 1 comma 83 semicolon
a subscript 4 space equals space fraction numerator 4 space plus space 2 to the power of 4 over denominator 4 factorial end fraction space equals 20 over 24 space almost equal to space 0 comma 83 semicolon
a subscript 5 space equals space fraction numerator 5 space plus space 2 to the power of 5 over denominator 5 factorial end fraction space equals 37 over 120 space almost equal to space 0 comma 31 semicolon
a subscript 6 space equals space fraction numerator 6 space plus space 2 to the power of 6 over denominator 6 factorial end fraction space equals 70 over 720 space almost equal to space 0 comma 097. end style

Шосты элемент меншы за 0.1. Гэта апошняе складаемае ў суме. Сума першых шасці элементаў — ≈9.07.

Калі  eps = 0.01, да сумы, атрыманай для eps = 0.1, будуць дабаўляцца складаемыя, меншыя за  0.1, якія нязначна зменяць значэнне сумы.

.

Розніца ў значэннях сумы  ≈0.03. Чым меншая дакладнасць, тым менш будуць адрознівацца сумы.