Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Технології програмування Лабораторний Практикум...doc
Скачиваний:
7
Добавлен:
09.11.2019
Размер:
9.09 Mб
Скачать

3.3. Зразок виконання роботи

Задача 3.1. Задано дійсне число x = 1.3ln(№ + 1.5) та додатне ціле число n = int[4ln(№ + 10)] (де № = 4 – номер варіанта). Потрібно розробити код програми для обчислення значення скінченої суми за таким математичним виразом:

.

Код програми 3.1 (фрагмент). Обчислення значення скінченої суми

// Накопичення суми

cout << "Завдання 3.1. Обчислення значення скінченої суми" << endl;

x = 1.3 * log(Nv + 1.5); cout << "Значення x = " << x << "; ";

n = 4 * log(Nv + 10); cout << setw(17) << "Значення n = " << n << "." << endl;

double c1, c2, c, s = 0;

cout << "Доданки:" << endl;

for(int i = 1; i <= n; i++)

{

c1 = pow(1.2 * x + i * i, 3./i);

c2 = i * i + Fact(i)/x + 3;

c = c1/c2; cout << setw(2) << i << setw(10) << c << endl;

s += c;

}

s += exp(-(x + n)/(pow(x, 1./n)));

cout << "Загальна сума s = " << s << endl;

cout << "Загальна сума s'= " << Fn_S(Fn_f, x, n) << endl << endl;

// Обчислення значення факторіала

double Fact(int n)

{

double f = 1;

if(n > 1) for(int i = 2; i <= n; i++) f *= i;

return f;

}

// Обчислення значення елемента суми

double Fn_f(double x, int i)

{

double c1 = pow(1.2 * x + i * i, 3./i);

double c2 = i * i + Fact(i)/x + 3;

return c1/c2;

}

// Обчислення значення скінченої суми

double Fn_S(double ( *Fn_f)(double, int), double x, int n)

{

double s = 0;

for(int i = 1; i <= n; i++)

s += Fn_f(x, i);

return s + exp(-(x + n)/(pow(x, 1./n)));

}

Результат розрахунку значення скінченої суми

Задача 3.2. Задано дійсне число x = 1.7ln(№ + 2.5) та додатне ціле число n = int[3ln(№ + 15)] (де № = 4 – номер варіанта). Потрібно розробити код програми для обчислення значення скінченого знакозмінного добутку за таким математичним виразом:

Код програми 3.2 (фрагмент). Обчислення значення скінченого знакозмінного добутку

// Накопичення добутку

cout << "Завдання 3.2. Обчислення значення скінченого знакозмінного добутку" << endl;

x = 1.7 * log(Nv + 2.5); cout << "Значення x = " << x << "; ";

n = 3 * log(Nv + 15); cout << setw(17) << "Значення n = " << n << "." << endl;

double d = 1, d1, d2, d3, f; z = -1;

cout << "Множники:" << endl;

for(int i = 1; i <= n; i++)

{

d1 = Fact(i)/x - pow(x, 1./i);

d2 = pow(i, 3) + 3 * x + 1;

d3 = sin(x * x/pow(i, 1.3));

f = z * (d1/d2 + d3); cout << setw(2) << i << setw(10) << f << endl;

d *= f; z = -z;

}

cout << "Загальний добуток d = " << d << endl;

cout << "Загальний добуток d'= " << Fn_D(Fn_d, x, n) << endl << endl;

// Обчислення значення елемента добутку

double Fn_d(double x, int i)

{

double d1 = Fact(i)/x - pow(x, 1./i);

double d2 = pow(i, 3) + 3 * x + 1;

double d3 = sin(x * x/pow(i, 1.3));

return d1/d2 + d3;

}

// Обчислення значення скінченого знакозмінного добутку

double Fn_D(double ( *Fn_d)(double, int), double x, int n)

{

double d = 1; int z = -1;

for(int i = 1; i <= n; i++)

{

d *= z * Fn_d(x, i); z = -z;

}

return d;

}

Результат розрахунку значення скінченого знакозмінного добутку

Задача 3.3. Задано дійсне число x = 1.67ln(№ + 1.5) (де № = 4 – номер варіанта). Потрібно розробити код програми для обчислення значення безмежної знакозмінної суми з заданою точністю  = 0.001 за таким математичним виразом:

.

При накопиченні безмежної суми вважається, що необхідна її точність досягається тоді, коли обчислено суму декількох доданків, а значення поточного доданку виявилось за модулем меншим, ніж задане значення , тобто цим і всіма наступними доданками можна знехтувати.

Код програми 3.3 (фрагмент). Обчислення значення безмежної суми

cout << "Завдання 3.3. Обчислення значення безмежної суми" << endl;

double E = 0.001; s = 0; c = 0;

x = 1.67 * log(Nv + 1.5); cout << "Значення x = " << x << "." << endl;

cout << "Доданки:" << endl;

int i = 0; z = -1;

do

{

s += c; i++; z = -z;

c1 = pow(i * i + pow(x, i), 3./i);

c2 = x * x + Fact(i) + 1.3;

c = z * c1/c2; cout << setw(2) << i << setw(15) << c << endl;

} while(fabs(c) > E);

s = s - cos(1.2 * x * x/(3.4 + x));

cout << "Безмежна сума s = " << s << "." << endl;

cout << "Безмежна сума s'= " << Fn_C(Fn_c, x, E) << "." << endl << endl;

// Обчислення значення елемента суми

double Fn_c(double x, int i)

{

double c1 = pow(i * i + pow(x, i), 3./i);

double c2 = x * x + Fact(i) + 1.3;

return c1/c2;

}

// Обчислення значення безмежної знакозмінної суми

double Fn_C(double ( *Fn_c)(double, int), double x, double E)

{

double s = 0, c = 0;

int i = 0, z = -1;

do

{

s += c; i++; z = -z;

c = z * Fn_c(x, i);

} while(fabs(c) > E);

return s - cos(1.2 * x * x/(3.4 + x));

}

Результат розрахунку значення безмежної суми

Задача 3.4. Задано дійсне число x = 1.26ln(№ + 2.5) та цілі додатні числа m = int[4ln(№ + 10)] i n = int[5ln(№ + 5)] (де № = 4 – номер варіанта). Потрібно розробити код програми для обчислення значення подвійної знакозмінної суми/добутку за таким математичним виразом:

Код програми 3.4 (фрагмент). Обчислення значення подвійної суми/добутку

// Обчислення значення функції, завдання 3.4

cout << "Завдання 3.4. Обчислення значення подвійної суми/добутку" << endl;

m = 4 * log(Nv + 10); cout << "Значення m = " << m << "; ";

n = 5 * log(Nv + 5); cout << setw(17) << "Значення n = " << n << "; ";

x = 1.26 * log(Nv + 2.5); cout << setw(17) << "Значення x = " << x << "." << endl;

s = 0;

for(int i = 1; i <= m; i++)

{

d = 1; z = 1;

for(int j = 1; j <= n; j++)

{

c1 = (cos(x * x + j/Fact(i)) + pow(x, 2.3));

c2 = (x/pow( i, 2) + i/Fact(j) + log(i * j));

c = z * c1/c2; cout << setprecision(3) << setw(7) << c;

d *= c; z = -z;

}

s += d; cout << " P = " << setw(8) << d << endl;

}

cout << "Подвійна сума/добуток Ws = " << s << endl;

cout << "Подвійна сума/добуток Ws'= " << Fn_Ws(Fn_w, x, m, n) << endl;

// Обчислення значення елемента суми

double Fn_w(double x, int i, int j)

{

double w1 = (cos(x * x + j/Fact(i)) + pow(x, 2.3));

double w2 = (x/( i * i) + i/Fact(j) + log(i * j));

return w1/w2;

}

// Обчислення значення безмежної суми

double Fn_Ws(double ( *Fn_w)(double, int, int), double x, int m, int n)

{

double s = 0, d; int z;

for(int i = 1; i <= m; i++)

{

d = 1; z = 1;

for(int j = 1; j <= n; j++)

{

d *= z * Fn_w(x, i, j); z = -z;

}

s += d;

}

return s;

}

Результат розрахунку значення подвійної суми/добутку

Код програми 3.4. Характерні механізми накопичення суми і добутку

#include <vcl>

#include <iostream> // Для потокового введення - виведення

#include <iomanip> // Використання маніпуляторів введення - виведення

#include <math> // Для математичних функцій

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

// Обчислення значення факторіала

double Fact(int n);

// Обчислення значення елемента суми

double Fn_f(double x, int i);

// Обчислення значення скінченої суми

double Fn_S(double ( *Fn_f)(double, int), double x, int n);

// Обчислення значення елемента добутку

double Fn_d(double x, int i);

// Обчислення значення скінченого знакозмінного добутку

double Fn_D(double ( *Fn_d)(double, int), double x, int n);

// Обчислення значення елемента суми

double Fn_c(double x, int i);

// Обчислення значення безмежної знакозмінної суми

double Fn_C(double ( *Fn_c)(double, int), double x, double E);

// Обчислення значення елемента суми

double Fn_w(double x, int i, int j);

// Обчислення значення безмежної суми

double Fn_Ws(double ( *Fn_w)(double, int, int), double x, int m, int n);

int main()

{

cout.precision(6); // Формат #.##

cout.setf(ios_base::fixed); // Формат #.##

SetConsoleOutputCP(1251); // Виведення кирилиці

// Опис змінних

int n, m, z, x;

int Nv; cout << "Введіть значення Nv = "; cin >> Nv;

// Накопичення суми

cout << "Завдання 3.1. Обчислення значення скінченої суми" << endl;

x = 1.3 * log(Nv + 1.5); cout << "Значення x = " << x << "; ";

n = 4 * log(Nv + 10); cout << setw(17) << "Значення n = " << n << "." << endl;

double c1, c2, c, s = 0;

cout << "Доданки:" << endl;

for(int i = 1; i <= n; i++)

{

c1 = pow(1.2 * x + i * i, 3./i);

c2 = i * i + Fact(i)/x + 3;

c = c1/c2; cout << setw(2) << i << setw(10) << c << endl;

s += c;

}

s += exp(-(x + n)/(pow(x, 1./n)));

cout << "Загальна сума s = " << s << endl;

cout << "Загальна сума s'= " << Fn_S(Fn_f, x, n) << endl << endl;

// Накопичення добутку

cout << "Завдання 3.2. Обчислення значення скінченого знакозмінного добутку" << endl;

x = 1.7 * log(Nv + 2.5); cout << "Значення x = " << x << "; ";

n = 3 * log(Nv + 15); cout << setw(17) << "Значення n = " << n << "." << endl;

double d = 1, d1, d2, d3, f; z = -1;

cout << "Множники:" << endl;

for(int i = 1; i <= n; i++)

{

d1 = Fact(i)/x - pow(x, 1./i);

d2 = pow(i, 3) + 3 * x + 1;

d3 = sin(x * x/pow(i, 1.3));

f = z * (d1/d2 + d3); cout << setw(2) << i << setw(10) << f << endl;

d *= f; z = -z;

}

cout << "Загальний добуток d = " << d << endl;

cout << "Загальний добуток d'= " << Fn_D(Fn_d, x, n) << endl << endl;

cout << "Завдання 3.3. Обчислення значення безмежної суми" << endl;

double E = 0.001; s = 0; c = 0;

x = 1.67 * log(Nv + 1.5); cout << "Значення x = " << x << "." << endl;

cout << "Доданки:" << endl;

int i = 0; z = -1;

do

{

s += c; i++; z = -z;

c1 = pow(i * i + pow(x, i), 3./i);

c2 = x * x + Fact(i) + 1.3;

c = z * c1/c2; cout << setw(2) << i << setw(15) << c << endl;

} while(fabs(c) > E);

s = s - cos(1.2 * x * x/(3.4 + x));

cout << "Безмежна сума s = " << s << "." << endl;

cout << "Безмежна сума s'= " << Fn_C(Fn_c, x, E) << "." << endl << endl;

// Обчислення значення функції, завдання 3.4

cout << "Завдання 3.4. Обчислення значення подвійної суми/добутку" << endl;

m = 4 * log(Nv + 10); cout << "Значення m = " << m << "; ";

n = 5 * log(Nv + 5); cout << setw(17) << "Значення n = " << n << "; ";

x = 1.26 * log(Nv + 2.5); cout << setw(17) << "Значення x = " << x << "." << endl;

s = 0;

for(int i = 1; i <= m; i++)

{

d = 1; z = 1;

for(int j = 1; j <= n; j++)

{

c1 = (cos(x * x + j/Fact(i)) + pow(x, 2.3));

c2 = (x/pow( i, 2) + i/Fact(j) + log(i * j));

c = z * c1/c2; cout << setprecision(3) << setw(7) << c;

d *= c; z = -z;

}

s += d; cout << " P = " << setw(8) << d << endl;

}

cout << "Подвійна сума/добуток Ws = " << s << endl;

cout << "Подвійна сума/добуток Ws'= " << Fn_Ws(Fn_w, x, m, n) << endl;

getch(); return 0;

}

// Обчислення значення факторіала

double Fact(int n)

{

double f = 1;

if(n > 1) for(int i = 2; i <= n; i++) f *= i;

return f;

}

// Обчислення значення елемента суми

double Fn_f(double x, int i)

{

double c1 = pow(1.2 * x + i * i, 3./i);

double c2 = i * i + Fact(i)/x + 3;

return c1/c2;

}

// Обчислення значення скінченої суми

double Fn_S(double ( *Fn_f)(double, int), double x, int n)

{

double s = 0;

for(int i = 1; i <= n; i++)

s += Fn_f(x, i);

return s + exp(-(x + n)/(pow(x, 1./n)));

}

// Обчислення значення елемента добутку

double Fn_d(double x, int i)

{

double d1 = Fact(i)/x - pow(x, 1./i);

double d2 = pow(i, 3) + 3 * x + 1;

double d3 = sin(x * x/pow(i, 1.3));

return d1/d2 + d3;

}

// Обчислення значення скінченого знакозмінного добутку

double Fn_D(double ( *Fn_d)(double, int), double x, int n)

{

double d = 1; int z = -1;

for(int i = 1; i <= n; i++)

{

d *= z * Fn_d(x, i); z = -z;

}

return d;

}

// Обчислення значення елемента суми

double Fn_c(double x, int i)

{

double c1 = pow(i * i + pow(x, i), 3./i);

double c2 = x * x + Fact(i) + 1.3;

return c1/c2;

}

// Обчислення значення безмежної знакозмінної суми

double Fn_C(double ( *Fn_c)(double, int), double x, double E)

{

double s = 0, c = 0;

int i = 0, z = -1;

do

{

s += c; i++; z = -z;

c = z * Fn_c(x, i);

} while(fabs(c) > E);

return s - cos(1.2 * x * x/(3.4 + x));

}

// Обчислення значення елемента суми

double Fn_w(double x, int i, int j)

{

double w1 = (cos(x * x + j/Fact(i)) + pow(x, 2.3));

double w2 = (x/( i * i) + i/Fact(j) + log(i * j));

return w1/w2;

}

// Обчислення значення безмежної суми

double Fn_Ws(double ( *Fn_w)(double, int, int), double x, int m, int n)

{

double s = 0, d; int z;

for(int i = 1; i <= m; i++)

{

d = 1; z = 1;

for(int j = 1; j <= n; j++)

{

d *= z * Fn_w(x, i, j); z = -z;

}

s += d;

}

return s;

}

3.4. Індивідуальні завдання

Задача 3.1. Задано дійсне число x = 1.6ln(№ + 1.5) (де № – номер варіанта) та додатне ціле число n = int[4ln(№ + 12)]. Потрібно розробити код програми для обчислення значення скінченої суми/добутку c = f[x, n] за наведеними нижче математичними виразами:

1. ; 2. ;

3. ; 4. ;

5. ; 6. ;

7. ; 8. ;

9. ; 10. ;

11. ; 12. ;

13. ; 14. ;

15. ; 16. ;

17. ; 18. ;

19. ; 20. ;

21. ; 22. ;

23. ; 24. ;

25. ; 26. ;

27. ; 28. ;

29. ; 30. .

Задача 3.2. Задано дійсне число x = 0.6ln(№ + 1.5) (де № – номер варіанта) та додатне ціле число n = int[4ln(№ + 10)]. Потрібно розробити код програми для обчислення скінченого знакозмінного добутку d = f[x, n] за наведеними нижче математичними виразами:

1. ; 2. ;

3. ; 4. ;

5. ; 6. ;

7. ; 8. ;

9. ; 10. ;

11. ; 12. ;

13. ; 14. ;

15. ; 16. ;

17. ; 18. ;

19. ; 20. ;

21. ; 22. ;

23. ; 24. ;

25. ; 26. ;

27. ; 28. ;

29. ; 30. .

Задача 3.3. Задано дійсне число x = 0.6ln(№ + 2.5) (де № – номер варіанта). Потрібно розробити код програми для обчислення значення безмежної знакозмінної суми c = f[x,] з заданою точністю = 0.001 за наведеними нижче математичними виразами. Вважати, що необхідна точність досягнута, якщо обчислено суму декількох доданків, а значення поточного доданку виявилось за модулем меншим, ніж , тобто цим і всіма наступними доданками можна знехтувати.

1. ; 2. ;

3. ; 4. ;

5. ; 6. ;

7. ; 8. ;

9. ; 10. ;

11. ; 12. ;

13. ; 14. ;

15. ; 16. ;

17. ; 18. ;

19. ; 20. ;

21. ; 22. ;

23. ; 24. ;

25. ; 26. ;

27. ; 28. ;

29. ; 30. .

Задача 3.4. Задано дійсне число x = 1.38ln(№ + 2.5) (де № – номер варіанта) та цілі додатні числа m = int[5ln(№ + 10)] i n = int[4ln(№ + 8)]. Потрібно розробити код програми для обчислення значення подвійної знакозмінної суми/добутку c = f[x, m, n] за наведеними нижче математичними виразами:

1. ; 2. ;

3. ; 4. ;

5. ; 6. ;

7. ; 8. ;

9. ; 10. ;

11. ; 12. ;

13. ; 14. ;

15. ; 16. ;

17. ; 18. ;

19. ; 20. ;

21. ; 22. ;

23. ; 24. ;

25. ; 26. ;

27. ; 28. ;

29. ; 30. .

Лабораторна робота № 4. ВИКОРИСТАННЯ складених ФУНКЦІЙ (функціоналів)