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

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

Приклад 1. Задано дійсне число x = 0.6ln(№ + 0.5) (де № – номер варіанта) та додатне ціле число n = int[2ln(№ + 10)]. Значення елементів вектора-рядка/стовпця потрібно обчислити за допомогою таких математичних виразів:

; , де .

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

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

double Fn_di(double x, int i, double dp)

{

double d1 = pow(fabs(dp), x/i);

double d2 = pow(i, 0.3)/pow(x, i/x);

double d3 = (x * x - pow(i, 0.2))/(dp - x);

double d4 = pow(dp * dp, 1./i);

return d1 + d2 * (d3 - d4);

}

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

Приклад 2. Задано дійсне число x = 2.38(№ + 1.26) (де № – номер варіанта) та цілі додатні числа m = n = int[2ln(№ + 10)]. Значення елементів матриці потрібно визначити за таким принципом:

  • перший рядок матриці задається такою формулою

, де ;

  • другий рядок матриці задається такою формулою

, де ;

  • кожний наступний рядок є сумою двох попередніх рядків, тобто

.

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

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

double Fact(int n)

{

double f = 1;

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

return f;

}

// Обчислення значення першого елемента двовимірного масиву

double Fn_a1i(double x, int i)

{

double a1 = cos(pow(pow(x, 0.3) + i, 1.2));

double a2 = x * x/Fact(i) + i - 1.8;

double a3 = pow(i, x)/pow(x, i);

return a1/a2 + a3;

}

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

double Fn_a2i(double x, int i)

{

double a1 = pow(2, i) - pow(x, 0.3) + 1;

double a2 = Fact(i)/(x * x) + pow(sin(pow(x/i, 0.3)), 2);

return a1/a2;

}

Результати розрахунку значень елементів матриці

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

#include <vcl>

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

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

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

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

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

const int sizeM = 10;

const int sizeN = 10;

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

double Fn_di(double x, int i, double dp);

// Заповнення елементами одновимірного масиву

void Array(double ( *Fn)(double, int, double), double Vek[], double dp, double x, int );

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

double Fact(int n);

// Обчислення значення першого елемента двовимірного масиву

double Fn_a1i(double x, int j);

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

double Fn_a2i(double x, int i);

// Заповнення елементами двовимірного масиву

void Array(double ( *Fn1)(double, int), double ( *Fn2)(double, int), double Mas[][sizeN],double x, int , int );

// Виведення елементів вектора-стовпця

void Fn_ShowVR(char *name, double Vek[], int , int z = 8);

// Виведення елементів вектора-рядка

void Fn_ShowVS(char *name, double Vek[], int , int z = 8);

// Виведення елементів двовимірного масиву

void Fn_Show(char *name, double Mas[][sizeN], int , int , int z = 9);

int main()

{

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

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

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

double D[sizeM], D1[sizeM], D2[sizeM], A[sizeM][sizeN];

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

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

double x = 0.6 * log(Nv + 0.5); cout << "Значення x = " << x << "; ";

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

Array(Fn_di, D, 0.27 * Nv, x, n);

Fn_ShowVS("Вектор-стовпець < Ds > ", D, n);

Fn_ShowVR("Вектор-рядок < Dr > ", D, n);

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

x = 2.38 * Nv; cout << "Значення x = " << x << "; ";

int m = n; cout << setw(17) << "Значення n = " << n << "; " << setw(17) << "Значення m = " << m << "." << endl << endl;

Array(Fn_a1i, Fn_a2i, A, x, m, n);

Fn_Show("Матриця < A > ", A, m, n);

getch(); return 0;

}

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

double Fn_di(double x, int i, double dp)

{

double d1 = pow(fabs(dp), x/i);

double d2 = pow(i, 0.3)/pow(x, i/x);

double d3 = (x * x - pow(i, 0.2))/(dp - x);

double d4 = pow(dp * dp, 1./i);

return d1 + d2 * (d3 - d4);

}

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

double Fact(int n)

{

double f = 1;

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

return f;

}

// Обчислення значення першого елемента двовимірного масиву

double Fn_a1i(double x, int i)

{

double a1 = cos(pow(pow(x, 0.3) + i, 1.2));

double a2 = x * x/Fact(i) + i - 1.8;

double a3 = pow(i, x)/pow(x, i);

return a1/a2 + a3;

}

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

double Fn_a2i(double x, int i)

{

double a1 = pow(2, i) - pow(x, 0.3) + 1;

double a2 = Fact(i)/(x * x) + pow(sin(pow(x/i, 0.3)), 2);

return a1/a2;

}

// Заповнення елементами двовимірного масиву

void Array(double ( *Fn)(double, int, double), double Vek[], double dp, double x, int n)

{

Vek[0] = dp;

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

Vek[i] = ( *Fn)(x, i + 1, Vek[i - 1]);

}

// Заповнення елементами одновимірного масиву

void Array(double ( *Fn1)(double, int), double ( *Fn2)(double, int), double Mas[][sizeN], double x, int m, int n)

{

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

{

Mas[0][j] = ( *Fn1)(x, j + 1);

Mas[1][j] = ( *Fn2)(x, j + 1);

}

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

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

Mas[i][j] = Mas[i - 2][j] + Mas[i - 1][j];

}

// Виведення елементів вектора-рядка

void Fn_ShowVR(char *name, double Vek[], int n, int z)

{

cout << name << endl;

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

cout << setw(z) << Vek[i];

cout << endl << " --- " << endl;

}

// Виведення елементів вектора-стовпця

void Fn_ShowVS(char *name, double Vek[], int n, int z)

{

cout << name << endl;

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

cout << setw(3) << i << " -- > " << setw(z) << Vek[i] << endl;

cout << " --- " << endl;

}

// Виведення елементів двовимірного масиву

void Fn_Show(char *name, double Mas[][sizeN], int m, int n, int z)

{

cout << name << endl;

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

{

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

cout << setw(z) << Mas[i][j];

cout << endl;

}

cout << " --- " << endl;

}

Задача 7.1. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для упорядкування елементів вектора-рядка/стовпця , а саме:

  • вектора-рядка за спаданням значень його елементів;

  • вектора-стовпця за зростанням значень його елементів.

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

Код програми 7.4 (фрагмент). Упорядкування елементів вектора-рядка/стовпця за спаданням/зростанням їх значень

// Присвоєння значень елементів одного вектора іншому

void Fn_Prus(double vek1[], double vek2[], int );

// Присвоєння значень елементів однієї матриці іншій

void Fn_Prus(double Mas1[][sizeN], double Mas2[][sizeN], int, int);

// Упорядкування одновимірного масиву методом перестановок

void Fn_SortOvmP(double Vek[], int );

// Упорядкування одновимірного масиву методом пошуку найменшого елемента

void Fn_SortOvmM(double Vek[], int );

int main()

{

cout << "Завдання 7.1." << endl;

cout << "Упорядкування елементів вектора-рядка/стовпця за спаданням/зростанням їх значень" << endl;

Fn_Prus(D1, D, n); Fn_Prus(D2, D, n);

Fn_SortOvmP(D1, n);

Fn_ShowVR("Dr", D1, n);

Fn_SortOvmM(D2, n);

Fn_ShowVS("Ds", D2, n);

cout << "Кінець завдання 7.1." << endl << endl; getch();

}

// Присвоєння значень елементів одного вектора іншому

void Fn_Prus(double vek1[], double vek2[], int n)

{

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

vek1[i] = vek2[i];

}

// Присвоєння значень елементів однієї матриці іншій

void Fn_Prus(double Mas1[][sizeN], double Mas2[][sizeN], int m, int n)

{

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

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

Mas1[i][j] = Mas2[i][j];

}

// Упорядкування одновимірного масиву методом перестановок

void Fn_SortOvmP(double Vek[], int n)

{

double temp; int p = 1;

while(p == 1) // Аналіз значення індикатора перестановок

{

p = 0;

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

if(Vek[i] < Vek[i + 1])

{

temp = Vek[i]; Vek[i] = Vek[i + 1];

Vek[i + 1] = temp; p = 1;

}

}

}

// Упорядкування одновимірного масиву методом пошуку найменшого елемента

void Fn_SortOvmM(double Vek[], int n)

{

double min; int p;

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

{

min = Vek[i]; p = i;

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

if(min > Vek[j])

{

min = Vek[j]; p = j;

}

Vek[p] = Vek[i]; Vek[i] = min;

}

}

// Упорядкування одновимірного масиву методом пошуку найменшого елемента

void Fn_SortOvmM(double Vek[], int n)

{

double min; int p;

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

{

min = Vek[i]; p = i;

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

if(min > Vek[j])

{

min = Vek[j]; p = j;

}

Vek[p] = Vek[i]; Vek[i] = min;

}

}

Задача 7.2. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для упорядкування елементів рядків/стовпців матриці , а також для упорядкування елементів матриці по рядках/стовпцях, а саме:

  • рядків матриці за спаданням значень їх елементів;

  • стовпців матриці за зростанням значень їх елементів;

  • матриці по рядках за спаданням значень їх елементів;

  • матриці по стовпцях за зростанням значень їх елементів.

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

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

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

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

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

Код програми 7.5 (фрагмент). Упорядкування елементів рядків/стовпців матриці, а також упорядкування елементів матриці по рядках/стовпцях за зростанням/спаданням значень їх елементів

// Упорядкування стовпців матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmS(double Mas[][sizeN], int o, int , int );

// Упорядкування рядів матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmR(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMR(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMS(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMRd(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMSd(double Mas[][sizeN], int o, int , int );

int main()

{

cout << "Завдання 7.2. Упорядкування елементів матриці" << endl;

double A1[sizeM][sizeN], A2[sizeM][sizeN], A3[sizeM][sizeN], A4[sizeM][sizeN], A5[sizeM][sizeN], A6[sizeM][sizeN];

Fn_Prus(A1, A, m, n); Fn_Prus(A2, A, m, n); Fn_Prus(A3, A, m, n);

Fn_Prus(A4, A, m, n); Fn_Prus(A5, A, m, n); Fn_Prus(A6, A, m, n);

Fn_SortDvmR(A1, 1, m, n);

Fn_Show("A1 - рядків матриці", A1, m, n);

Fn_SortDvmS(A2, 0, m, n);

Fn_Show("A2 - стовпців матриці", A2, m, n);

Fn_SortDvmMR(A3, 1, m, n);

Fn_Show("A3 - матриці по рядках", A3, m, n);

Fn_SortDvmMS(A4, 0, m, n);

Fn_Show("A4 - матриці по стовпцях", A4, m, n);

Fn_SortDvmMRd(A5, 1, m, n);

Fn_Show("A5 - матриці по рядках", A5, m, n);

Fn_SortDvmMSd(A6, 0, m, n);

Fn_Show("A6 - матриці по стовпцях", A6, m, n);

cout << "Кінець завдання 7.2." << endl << endl; getch();

}

// Упорядкування стовпців матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmS(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM];

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

{

// Занесення елементів вектора-стовпця матриці у одновимірний масив

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

temp[i] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, n); // - за зростанням

else Fn_SortOvmP(temp,n); // - за спаданням

// Занесення елементів одновимірного масиву у стовпець матриці

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

Mas[i][j] = temp[i];

}

}

// Упорядкування рядків матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmR(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM];

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

{

// Занесення елементів вектора-рядка матриці у одновимірний масив

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

temp[j] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, n); // - за зростанням

else Fn_SortOvmP(temp, n); // - за спаданням

// Занесення елементів одновимірного масиву у рядок матриці

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

Mas[i][j] = temp[j];

}

}

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMR(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM * sizeN];

// Занесення елементів рядків матриці у одновимірний масив

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

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

temp[i * n + j] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, sizeM * sizeN); // - за зростанням

else Fn_SortOvmP(temp, sizeM * sizeN); // - за спаданням

// Занесення елементів одновимірного масиву у рядки матриці

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

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

Mas[i][j] = temp[i * n + j];

}

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMS(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM * sizeN];

// Занесення елементів стовпців матриці у одновимірний масив

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

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

temp[j * m + i] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, sizeM * sizeN); // - за зростанням

else Fn_SortOvmP(temp, sizeM * sizeN); // - за спаданням

// Занесення елементів одновимірного масиву у стовпці матриці

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

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

Mas[i][j] = temp[j * m + i];

}

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMRd(double Mas[][sizeN], int o, int m, int n)

{

int k, l, r;

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

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

{

double p = Mas[i][j]; k = i, l = j;

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

{

if(g == i) r = j; else r = 0;

for(int q = r; q < n; q++)

if(p > Mas[g][q])

{

p = Mas[g][q];

k = g; l = q;

}

}

Mas[k][l] = Mas[i][j];

Mas[i][j] = p;

}

}

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMSd(double Mas[][sizeN], int o, int m, int n)

{

int k, l, r;

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

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

{

double p = Mas[i][j]; k = i, l = j;

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

{

if(q == j) r = i; else r = 0;

for(int g = r; g < m; g++)

if(p < Mas[g][q])

{

p = Mas[g][q];

k = g; l = q;

}

}

Mas[k][l] = Mas[i][j];

Mas[i][j] = p;

}

}

Задача 7.3. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для інвертування елементів вектора-рядка/стовпця , а також для інвертування елементів матриці по рядках/стовпцях, а саме:

  • інвертування елементів вектора-рядка ;

  • інвертування елементів вектора-стовпця ;

  • інвертування елементів матриці по стовпцях;

  • інвертування елементів матриці по рядках;

  • інвертування елементів матриці по стовпцях і по рядках;

  • інвертування елементів матриці по рядках і по стовпцях.

Матриця інвертування елементів вектора-рядка/стовпця, матриці

Результати інвертування елементів вектора-рядка

Результати інвертування елементів вектора-стовпця

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

Результати інвертування матриці по стовпцях

Результати інвертування матриці по рядках

Результати інвертування матриці по стовпцях і по рядках

Результати інвертування матриці по рядках і стовпцях

Код програми 7.6 (фрагмент). Інвертування елементів вектора-рядка/стовпця, а також інвертування елементів матриці по рядках/стовпцях

// Створення матриці інвертування

void Fn_InvDvm(double Mas[][sizeN], int , int );

// Перевантаження функції множення "*" вектора-рядка на матрицю

void Fn_Mnog(double Vek1[], double Mat[][sizeN], double Vek2[], int , int );

// Перевантаження функції множення "*" матриці на вектора-стовпець

void Fn_Mnog(double Mat[][sizeN], double Vek1[], double Vek2[], int , int );

// Перевантаження функції множення "*" матриці на матрицю

void Fn_Mnog(double Mat1[][sizeN], double Mat2[][sizeN], double Mat3[][sizeN], int , int , int);

int main()

{

cout << "Завдання 7.3. Інвертування елементів масиву" << endl;

double InvM[sizeM][sizeN];

Fn_InvDvm(InvM, m, n);

Fn_Show("B - матриця інвертування", InvM, m, n);

double C[size];

Fn_ShowVR("Dr", D, n);

cout << "Інвертування елементів вектора-рядка" << endl;

Fn_Mnog(D, InvM, C, m, n); Fn_ShowVR("Dri", C, n);

cout << "Інвертування елементів вектора-стовпця" << endl;

Fn_ShowVS("Ds", D, n);

Fn_Mnog(InvM, D, C, m, n);

Fn_ShowVS("Dri", C, n);

double F[sizeM][sizeN], Temp[sizeM][sizeN];

Fn_Show("Масив < A > ", A, m, n);

cout << "Інвертування елементів матриці по рядках" << endl;

Fn_Mnog(A, InvM, F, m, n, n);

Fn_Show(" < Ar > ", F, m, n);

cout << "Інвертування елементів матриці по стовпцях" << endl;

Fn_Mnog(InvM, A, F, m, n, n);

Fn_Show(" < As > ", F, m, n);

cout << "Інвертування елементів матриці по стовпцях і по рядках" << endl;

Fn_Mnog(A, InvM, Temp, m, n, n); Fn_Mnog(InvM, Temp, F, m, n, n);

Fn_Show(" < Asr > ", F, m, n);

cout << "Інвертування елементів матриці по рядках і по стовпцях" << endl;

Fn_Mnog(InvM, A, Temp, m, n, n); Fn_Mnog(Temp, InvM, F, m, n, n);

Fn_Show(" < Ars > ", F, m, n);

cout << "Кінець завдання 7.3." << endl << endl; getch();

}

// Створення матриці інвертування

void Fn_InvDvm(double Mas[][sizeN], int m, int n)

{

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

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

Mas[i][j] = 0;

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

Mas[n - i - 1][i] = 1;

}

// Перевантаження функції множення "*" вектора-рядка на матрицю

void Fn_Mnog(double Vek1[], double Mat[][sizeN], double Vek2[], int m, int n)

{

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

{

double s = 0;

for(int k = 0; k < n; k++)

s += Vek1[k] * Mat[k][i];

Vek2[i] = s;

}

}

// Перевантаження функції множення "*" матриці на вектора-стовпець

void Fn_Mnog(double Mat[][sizeN], double Vek1[], double Vek2[], int m, int n)

{

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

{

double s = 0;

for(int k = 0; k < n; k++)

s += Mat[i][k] * Vek1[k];

Vek2[i] = s;

}

}

// Перевантаження функції множення "*" матриці на матрицю

void Fn_Mnog(double Mat1[][sizeN], double Mat2[][sizeN], double Mat3[][sizeN], int m, int n, int l)

{

double temp[sizeM][sizeN], s;

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

for(int j = 0; j < l; j++)

{

s = 0;

for(int k = 0; k < n; k++)

s += Mat1[i][k] * Mat2[k][j];

temp[i][j] = s;

}

Fn_Prus(Mat3, temp, m, n);

}

Задача 7.4. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для перестановки елементів вектора-рядка/стовпця , а також для перестановки рядків/стовпців матриці , а саме:

  • перестановка елементів вектора-рядка – останнього з передостаннім;

  • перестановка елементів вектора-рядка – останнього з передостаннім;

  • перестановка елементів вектора-стовпця – останнього з передостаннім;

  • перестановка елементів вектора-стовпця – другого з останнім;

  • перестановка стовпців матриці – останнього з передостаннім;

  • перестановка стовпців матриці – другого з останнім;

  • перестановка рядків матриці – останнього з передостаннім;

  • перестановка рядків матриці – другого з останнім.

  • перестановка рядків і стовпців матриці – останнього з передостаннім;

  • перестановка стовпців і рядків матриці – останнього з передостаннім.

Матриця перестановки елементів вектора-рядка/стовпця, матриці

Результати перестановки елементів вектора-рядка

Результати перестановки елементів вектора-стовпця

Результати розрахунку значень елементів матриці перестановки

Результати перестановки стовпців матриці

Результати перестановки рядків матриці

Результати перестановки стовпців і рядків матриці

Результати перестановки рядків і стовпців матриці

Код програми 7.7 (фрагмент). Перестановка елементів вектора-рядка/стовпця, а також перестановка рядків/стовпців матриці

// Створення матриці перестановки

void Fn_PerDvm(double Mas[][sizeN], int p, int r, int , int );

int main()

{

cout << "Завдання 7.4. Перестановка елементів масиву" << endl;

double Pere[sizeM][sizeN];

Fn_PerDvm(Pere, 2, 9, m, n);

Fn_Show("P - матриця перестановок 2 і 9", Pere, m, n);

Fn_ShowVR("Dr", D, n);

cout << "Перестановка елеменітів вектора-рядка" << endl;

// C_ovm = D_ovm * PereM;

Fn_Mnog(D, Pere, C, m, n);

Fn_ShowVR("Dr29", C, n);

cout << "Перестановка елементів вектора-стовпця" << endl;

Fn_ShowVS("Ds", D, n);

// C_ovm = PereM * D_ovm;

Fn_Mnog(Pere, D, C, m, n);

Fn_ShowVS("Ds29", C, n);

Fn_Show("Масив < A > ", A, m, n);

cout << "Перестановка стовпців матриці" << endl;

// F_dvm = A_dvm * PereM;

Fn_Mnog(A, Pere, F, m, n, n);

Fn_Show(" < As29 > ", F, m, n);

cout << "Перестановка рядків матриці" << endl;

// F_dvm = PereM * A_dvm;

Fn_Mnog(Pere, A, F, m, n, n);

Fn_Show(" < Ar29 > ", F, m, n);

cout << "Перестановка стовпців і рядків матриці" << endl;

// F_dvm = PereM * (A_dvm * PereM);

Fn_Mnog(A, Pere, Temp, m, n, n); Fn_Mnog(Pere, Temp, F, m, n, n);

Fn_Show(" < Asr > ", F, m, n);

cout << "Перестановка рядків і стовпців матриці" << endl;

// F_dvm = (PereM * A_dvm) * PereM;

Fn_Mnog(Pere, A, Temp, m, n, n); Fn_Mnog(Temp, Pere, F, m, n, n);

Fn_Show(" < Ars > ", F, m, n);

cout << "Кінець завдання 7.4." << endl << endl; getch();

}

// Створення матриці перестановки

void Fn_PerDvm(double Mas[][sizeN], int p, int r, int m, int n)

{

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

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

Mas[i][j] = 0;

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

if(i == p) Mas[r][i] = 1;

else if(i == r) Mas[p][i] = 1;

else Mas[i][i] = 1;

}

Задача 7.5. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для зсуву елементів вектора-рядка/стовпця , а також для зсуву рядків/стовпців матриці , а саме:

  • зсув елементів вектора-рядка – на одну позицію вправо;

  • зсув елементів вектора-рядка – на три позиції вправо;

  • зсув елементів вектора-рядка – на дві позиції вліво;

  • зсув елементів вектора-рядка – на п'ять позицій вліво;

  • зсув елементів вектора-стовпця – на одну позицію вверх;

  • зсув елементів вектора-стовпця – на три позиції вверх;

  • зсув елементів вектора-стовпця – на дві позиції вниз;

  • зсув елементів вектора-стовпця – на чотири позиції вниз;

  • зсув стовпців матриці – на один стовпець вправо;

  • зсув стовпців матриці – на два стовпці вправо;

  • зсув стовпців матриці – на один стовпець вліво;

  • зсув стовпців матриці – на два стовпці вліво;

  • зсув рядків матриці – на один рядок вверх;

  • зсув рядків матриці – на два рядки вверх;

  • зсув рядків матриці – на один рядок вниз;

  • зсув рядків матриці – на два рядки вниз.

Матриця зсуву елементів рядка/стовпця на одну позицію

Матриця зсуву елементів рядка/стовпця на дві позиції

Матриця зсуву елементів рядка/стовпця на п'ять позицій

Результати зсуву елементів вектора-рядка

Результати зсуву елементів вектора-стовпця

Результати зсуву елементів вектора-стовпця

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

Результати зсуву стовпців матриці

Результати зсуву рядків матриці

Код програми 7.8 (фрагмент). Зсув елементів вектора-рядка/стовпця, а також зсуву рядків/стовпців матриці

// Створення матриці зсуву

void Fn_ZsDvm(double Mas[][sizeN], int z, int , int );

int main()

{

cout << "Завдання 7.5. Зсув елементів масиву" << endl;

double Zsuv[sizeM][sizeN];

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Show("Z - матриця зсуву 1 елем. вправо", Zsuv, m, n);

Fn_ZsDvm(Zsuv, 2, m, n);

Fn_Show("Z - матриця зсуву 2 елем. вправо", Zsuv, m, n);

Fn_ZsDvm(Zsuv, 5, m, n);

Fn_Show("Z - матриця зсуву 5 елем. вправо", Zsuv, m, n);

Fn_ShowVR("Dr", D, n);

cout << "Зсув елементів вектора-рядка на 1 позицію вправо" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz1p", C, n);

cout << "Зсув елементів вектора-рядка на 3 позиції вправо" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz3p", C, n);

cout << "Зсув елементів вектора-рядка на 2 позиції вліво" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz2l", C, n);

cout << "Зсув елементів вектора-рядка на 4 позиції вліво" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz4l", C, n);

Fn_ShowVS("Ds", D, n);

cout << "Зсув елементів вектора-стовпця на 1 позицію вверх" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz1vv", C, n);

cout << "Зсув елементів вектора-стовпця на 3 позиції вверх" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz3vv", C, n);

cout << "Зсув елементів вектора-стовпця на 2 позиції вниз" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz2vn", C, n);

cout << "Зсув елементів вектора-стовпця на 4 позиції вниз" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz4vn", C, n);

Fn_Show("A", A, m, n);

cout << "Зсув стовпців матриці на 1 стовпець вправо" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Show("Mz", Zsuv, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az1p", F, m, n);

cout << "Зсув стовпців матриці на 3 стовпці вправо" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az3p", F, m, n);

cout << "Зсув стовпців матриці на 2 стовпці вліво" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az2l", F, m, n);

cout << "Зсув стовпців матриці на 4 стовпці вліво" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az4l", F, m, n);

cout << "Зсув рядків матриці на 1 рядок вверх" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az1vv", F, m, n);

cout << "Зсув рядків матриці на 3 рядки вверх" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az3vv", F, m, n);

cout << "Зсув рядків матриці на 2 рядки вниз" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az2vn", F, m, n);

cout << "Зсув рядків матриці на 4 рядки вниз" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az4vn", F, m, n);

cout << "Кінець завдання 7.5." << endl;

getch(); return 0;

}

// Створення матриці зсуву

void Fn_ZsDvm(double Mas[][sizeN], int z, int m, int n)

{

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

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

Mas[i][j] = 0.0;

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

{

if(i < m - z) Mas[i][i + z] = 1;

if(i < z) Mas[m - z + i][i] = 1;

}

}

Код програми 7. Характерні механізми оброблення елементів матриць

#include <vcl>

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

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

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

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

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

const int sizeM = 10;

const int sizeN = 10;

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

double Fn_di(double x, int i, double dp);

// Заповнення елементами одновимірного масиву

void Array(double ( *Fn)(double, int, double), double Vek[], double dp, double x, int );

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

double Fact(int n);

// Обчислення значення першого елемента двовимірного масиву

double Fn_a1i(double x, int j);

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

double Fn_a2i(double x, int i);

// Заповнення елементами двовимірного масиву

void Array(double ( *Fn1)(double, int), double ( *Fn2)(double, int), double Mas[][sizeN],double x, int , int );

// Виведення елементів вектора-стовпця

void Fn_ShowVR(char *name, double Vek[], int , int z = 8);

// Виведення елементів вектора-рядка

void Fn_ShowVS(char *name, double Vek[], int , int z = 8);

// Виведення елементів двовимірного масиву

void Fn_Show(char *name, double Mas[][sizeN], int , int , int z = 9);

// Присвоєння значень елементів одного вектора іншому

void Fn_Prus(double vek1[], double vek2[], int );

// Присвоєння значень елементів однієї матриці іншій

void Fn_Prus(double Mas1[][sizeN], double Mas2[][sizeN], int, int);

// Упорядкування одновимірного масиву методом перестановок

void Fn_SortOvmP(double Vek[], int );

// Упорядкування одновимірного масиву методом пошуку найменшого елемента

void Fn_SortOvmM(double Vek[], int );

// Упорядкування стовпців матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmS(double Mas[][sizeN], int o, int , int );

// Упорядкування рядів матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmR(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMR(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMS(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMRd(double Mas[][sizeN], int o, int , int );

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMSd(double Mas[][sizeN], int o, int , int );

// Створення матриці інвертування

void Fn_InvDvm(double Mas[][sizeN], int , int );

// Перевантаження функції множення "*" вектора-рядка на матрицю

void Fn_Mnog(double Vek1[], double Mat[][sizeN], double Vek2[], int , int );

// Перевантаження функції множення "*" матриці на вектора-стовпець

void Fn_Mnog(double Mat[][sizeN], double Vek1[], double Vek2[], int , int );

// Перевантаження функції множення "*" матриці на матрицю

void Fn_Mnog(double Mat1[][sizeN], double Mat2[][sizeN], double Mat3[][sizeN], int , int , int);

// Створення матриці перестановки

void Fn_PerDvm(double Mas[][sizeN], int p, int r, int , int );

// Створення матриці зсуву

void Fn_ZsDvm(double Mas[][sizeN], int z, int , int );

int main()

{

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

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

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

double D[sizeM], D1[sizeM], D2[sizeM], A[sizeM][sizeN];

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

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

double x = 0.6 * log(Nv + 0.5); cout << "Значення x = " << x << "; ";

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

Array(Fn_di, D, 0.27 * Nv, x, n);

Fn_ShowVS("Вектор-стовпець < Ds > ", D, n);

Fn_ShowVR("Вектор-рядок < Dr > ", D, n);

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

x = 2.38 * Nv; cout << "Значення x = " << x << "; ";

int m = n; cout << setw(17) << "Значення n = " << n << "; " << setw(17) << "Значення m = " << m << "." << endl << endl;

Array(Fn_a1i, Fn_a2i, A, x, m, n);

Fn_Show("Матриця < A > ", A, m, n);

cout << "Завдання 7.1." << endl;

cout << "Упорядкування елементів вектора-рядка/стовпця за спаданням/зростанням їх значень" << endl;

Fn_Prus(D1, D, n); Fn_Prus(D2, D, n);

Fn_SortOvmP(D1, n);

Fn_ShowVR("Dr", D1, n);

Fn_SortOvmM(D2, n);

Fn_ShowVS("Ds", D2, n);

cout << "Кінець завдання 7.1." << endl << endl; getch();

cout << "Завдання 7.2. Упорядкування елементів матриці" << endl;

double A1[sizeM][sizeN], A2[sizeM][sizeN], A3[sizeM][sizeN], A4[sizeM][sizeN], A5[sizeM][sizeN], A6[sizeM][sizeN];

Fn_Prus(A1, A, m, n); Fn_Prus(A2, A, m, n); Fn_Prus(A3, A, m, n);

Fn_Prus(A4, A, m, n); Fn_Prus(A5, A, m, n); Fn_Prus(A6, A, m, n);

Fn_SortDvmR(A1, 1, m, n);

Fn_Show("A1 - рядків матриці", A1, m, n);

Fn_SortDvmS(A2, 0, m, n);

Fn_Show("A2 - стовпців матриці", A2, m, n);

Fn_SortDvmMR(A3, 1, m, n);

Fn_Show("A3 - матриці по рядках", A3, m, n);

Fn_SortDvmMS(A4, 0, m, n);

Fn_Show("A4 - матриці по стовпцях", A4, m, n);

Fn_SortDvmMRd(A5, 1, m, n);

Fn_Show("A5 - матриці по рядках", A5, m, n);

Fn_SortDvmMSd(A6, 0, m, n);

Fn_Show("A6 - матриці по стовпцях", A6, m, n);

cout << "Кінець завдання 7.2." << endl << endl; getch();

cout << "Завдання 7.3. Інвертування елементів масиву" << endl;

double InvM[sizeM][sizeN];

Fn_InvDvm(InvM, m, n);

Fn_Show("B - матриця інвертування", InvM, m, n);

double C[sizeM];

Fn_ShowVR("Dr", D, n);

cout << "Інвертування елементів вектора-рядка" << endl;

Fn_Mnog(D, InvM, C, m, n);

Fn_ShowVR("Dri", C, n);

cout << "Інвертування елементів вектора-стовпця" << endl;

Fn_ShowVS("Ds", D, n);

Fn_Mnog(InvM, D, C, m, n);

Fn_ShowVS("Dri", C, n);

double F[sizeM][sizeN], Temp[sizeM][sizeN];

Fn_Show("Масив < A > ", A, m, n);

cout << "Інвертування елементів матриці по рядках" << endl;

Fn_Mnog(A, InvM, F, m, n, n);

Fn_Show(" < Ar > ", F, m, n);

cout << "Інвертування елементів матриці по стовпцях" << endl;

Fn_Mnog(InvM, A, F, m, n, n);

Fn_Show(" < As > ", F, m, n);

cout << "Інвертування елементів матриці по стовпцях і по рядках" << endl;

Fn_Mnog(A, InvM, Temp, m, n, n); Fn_Mnog(InvM, Temp, F, m, n, n);

Fn_Show(" < Asr > ", F, m, n);

cout << "Інвертування елементів матриці по рядках і по стовпцях" << endl;

Fn_Mnog(InvM, A, Temp, m, n, n); Fn_Mnog(Temp, InvM, F, m, n, n);

Fn_Show(" < Ars > ", F, m, n);

cout << "Кінець завдання 7.3." << endl << endl; getch();

cout << "Завдання 7.4. Перестановка елементів масиву" << endl;

double Pere[sizeM][sizeN];

Fn_PerDvm(Pere, 2, 9, m, n);

Fn_Show("P - матриця перестановок 2 і 9", Pere, m, n);

Fn_ShowVR("Dr", D, n);

cout << "Перестановка елеменітів вектора-рядка" << endl;

// C_ovm = D_ovm * PereM;

Fn_Mnog(D, Pere, C, m, n);

Fn_ShowVR("Dr29", C, n);

cout << "Перестановка елементів вектора-стовпця" << endl;

Fn_ShowVS("Ds", D, n);

// C_ovm = PereM * D_ovm;

Fn_Mnog(Pere, D, C, m, n);

Fn_ShowVS("Ds29", C, n);

Fn_Show("Масив < A > ", A, m, n);

cout << "Перестановка стовпців матриці" << endl;

// F_dvm = A_dvm * PereM;

Fn_Mnog(A, Pere, F, m, n, n);

Fn_Show(" < As29 > ", F, m, n);

cout << "Перестановка рядків матриці" << endl;

// F_dvm = PereM * A_dvm;

Fn_Mnog(Pere, A, F, m, n, n);

Fn_Show(" < Ar29 > ", F, m, n);

cout << "Перестановка стовпців і рядків матриці" << endl;

// F_dvm = PereM * (A_dvm * PereM);

Fn_Mnog(A, Pere, Temp, m, n, n); Fn_Mnog(Pere, Temp, F, m, n, n);

Fn_Show(" < Asr > ", F, m, n);

cout << "Перестановка рядків і стовпців матриці" << endl;

// F_dvm = (PereM * A_dvm) * PereM;

Fn_Mnog(Pere, A, Temp, m, n, n); Fn_Mnog(Temp, Pere, F, m, n, n);

Fn_Show(" < Ars > ", F, m, n);

cout << "Кінець завдання 7.4." << endl << endl; getch();

cout << "Завдання 7.5. Зсув елементів масиву" << endl;

double Zsuv[sizeM][sizeN];

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Show("Z - матриця зсуву 1 елем. вправо", Zsuv, m, n);

Fn_ZsDvm(Zsuv, 2, m, n);

Fn_Show("Z - матриця зсуву 2 елем. вправо", Zsuv, m, n);

Fn_ZsDvm(Zsuv, 5, m, n);

Fn_Show("Z - матриця зсуву 5 елем. вправо", Zsuv, m, n);

Fn_ShowVR("Dr", D, n);

cout << "Зсув елементів вектора-рядка на 1 позицію вправо" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz1p", C, n);

cout << "Зсув елементів вектора-рядка на 3 позиції вправо" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz3p", C, n);

cout << "Зсув елементів вектора-рядка на 2 позиції вліво" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz2l", C, n);

cout << "Зсув елементів вектора-рядка на 4 позиції вліво" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

Fn_Mnog(D, Zsuv, C, m, n);

Fn_ShowVR("Dz4l", C, n);

Fn_ShowVS("Ds", D, n);

cout << "Зсув елементів вектора-стовпця на 1 позицію вверх" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz1vv", C, n);

cout << "Зсув елементів вектора-стовпця на 3 позиції вверх" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz3vv", C, n);

cout << "Зсув елементів вектора-стовпця на 2 позиції вниз" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz2vn", C, n);

cout << "Зсув елементів вектора-стовпця на 4 позиції вниз" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

Fn_Mnog(Zsuv, D, C, m, n);

Fn_ShowVS("Dz4vn", C, n);

Fn_Show("A", A, m, n);

cout << "Зсув стовпців матриці на 1 стовпець вправо" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

Fn_Show("Mz", Zsuv, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az1p", F, m, n);

cout << "Зсув стовпців матриці на 3 стовпці вправо" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az3p", F, m, n);

cout << "Зсув стовпців матриці на 2 стовпці вліво" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az2l", F, m, n);

cout << "Зсув стовпців матриці на 4 стовпці вліво" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

// F_dvm = A_dvm * ZsuvM;

Fn_Mnog(A, Zsuv, F, m, n, n);

Fn_Show("Az4l", F, m, n);

cout << "Зсув рядків матриці на 1 рядок вверх" << endl;

Fn_ZsDvm(Zsuv, 1, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az1vv", F, m, n);

cout << "Зсув рядків матриці на 3 рядки вверх" << endl;

Fn_ZsDvm(Zsuv, 3, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az3vv", F, m, n);

cout << "Зсув рядків матриці на 2 рядки вниз" << endl;

Fn_ZsDvm(Zsuv, 8, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az2vn", F, m, n);

cout << "Зсув рядків матриці на 4 рядки вниз" << endl;

Fn_ZsDvm(Zsuv, 6, m, n);

// F_dvm = ZsuvM * A_dvm;

Fn_Mnog(Zsuv, A, F, m, n, n);

Fn_Show("Az4vn", F, m, n);

cout << "Кінець завдання 7.5." << endl;

getch(); return 0;

}

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

double Fn_di(double x, int i, double dp)

{

double d1 = pow(fabs(dp), x/i);

double d2 = pow(i, 0.3)/pow(x, i/x);

double d3 = (x * x - pow(i, 0.2))/(dp - x);

double d4 = pow(dp * dp, 1./i);

return d1 + d2 * (d3 - d4);

}

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

double Fact(int n)

{

double f = 1;

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

return f;

}

// Обчислення значення першого елемента двовимірного масиву

double Fn_a1i(double x, int i)

{

double a1 = cos(pow(pow(x, 0.3) + i, 1.2));

double a2 = x * x/Fact(i) + i - 1.8;

double a3 = pow(i, x)/pow(x, i);

return a1/a2 + a3;

}

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

double Fn_a2i(double x, int i)

{

double a1 = pow(2, i) - pow(x, 0.3) + 1;

double a2 = Fact(i)/(x * x) + pow(sin(pow(x/i, 0.3)), 2);

return a1/a2;

}

// Заповнення елементами двовимірного масиву

void Array(double ( *Fn)(double, int, double), double Vek[], double dp, double x, int n)

{

Vek[0] = dp;

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

Vek[i] = ( *Fn)(x, i + 1, Vek[i - 1]);

}

// Заповнення елементами одновимірного масиву

void Array(double ( *Fn1)(double, int), double ( *Fn2)(double, int), double Mas[][sizeN], double x, int m, int n)

{

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

{

Mas[0][j] = ( *Fn1)(x, j + 1);

Mas[1][j] = ( *Fn2)(x, j + 1);

}

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

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

Mas[i][j] = Mas[i - 2][j] + Mas[i - 1][j];

}

// Виведення елементів вектора-рядка

void Fn_ShowVR(char *name, double Vek[], int n, int z)

{

cout << name << endl;

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

cout << setw(z) << Vek[i];

cout << endl << " --- " << endl;

}

// Виведення елементів вектора-стовпця

void Fn_ShowVS(char *name, double Vek[], int n, int z)

{

cout << name << endl;

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

cout << setw(3) << i << " -- > " << setw(z) << Vek[i] << endl;

cout << " --- " << endl;

}

// Виведення елементів двовимірного масиву

void Fn_Show(char *name, double Mas[][sizeN], int m, int n, int z)

{

cout << name << endl;

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

{

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

cout << setw(z) << Mas[i][j];

cout << endl;

}

cout << " --- " << endl;

}

// Присвоєння значень елементів одного вектора іншому

void Fn_Prus(double vek1[], double vek2[], int n)

{

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

vek1[i] = vek2[i];

}

// Присвоєння значень елементів однієї матриці іншій

void Fn_Prus(double Mas1[][sizeN], double Mas2[][sizeN], int m, int n)

{

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

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

Mas1[i][j] = Mas2[i][j];

}

// Упорядкування одновимірного масиву методом перестановок

void Fn_SortOvmP(double Vek[], int n)

{

double temp; int p = 1;

while(p == 1) // Аналіз значення індикатора перестановок

{

p = 0;

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

if(Vek[i] < Vek[i + 1])

{

temp = Vek[i]; Vek[i] = Vek[i + 1];

Vek[i + 1] = temp; p = 1;

}

}

}

// Упорядкування одновимірного масиву методом пошуку найменшого елемента

void Fn_SortOvmM(double Vek[], int n)

{

double min; int p;

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

{

min = Vek[i]; p = i;

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

if(min > Vek[j])

{

min = Vek[j]; p = j;

}

Vek[p] = Vek[i]; Vek[i] = min;

}

}

// Упорядкування стовпців матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmS(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM];

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

{

// Занесення елементів вектора-стовпця матриці у одновимірний масив

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

temp[i] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, n); // - за зростанням

else Fn_SortOvmP(temp,n); // - за спаданням

// Занесення елементів одновимірного масиву у стовпець матриці

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

Mas[i][j] = temp[i];

}

}

// Упорядкування рядків матриці: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmR(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM];

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

{

// Занесення елементів вектора-рядка матриці у одновимірний масив

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

temp[j] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, n); // - за зростанням

else Fn_SortOvmP(temp, n); // - за спаданням

// Занесення елементів одновимірного масиву у рядок матриці

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

Mas[i][j] = temp[j];

}

}

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMR(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM * sizeN];

// Занесення елементів рядків матриці у одновимірний масив

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

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

temp[i * n + j] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, sizeM * sizeN); // - за зростанням

else Fn_SortOvmP(temp, sizeM * sizeN); // - за спаданням

// Занесення елементів одновимірного масиву у рядки матриці

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

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

Mas[i][j] = temp[i * n + j];

}

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMS(double Mas[][sizeN], int o, int m, int n)

{

double temp[sizeM * sizeN];

// Занесення елементів стовпців матриці у одновимірний масив

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

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

temp[j * m + i] = Mas[i][j];

// Впорядкування елементів одновимірного масиву

if(!o) Fn_SortOvmM(temp, sizeM * sizeN); // - за зростанням

else Fn_SortOvmP(temp, sizeM * sizeN); // - за спаданням

// Занесення елементів одновимірного масиву у стовпці матриці

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

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

Mas[i][j] = temp[j * m + i];

}

// Упорядкування матриці по рядках: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMRd(double Mas[][sizeN], int o, int m, int n)

{

int k, l, r;

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

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

{

double p = Mas[i][j]; k = i, l = j;

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

{

if(g == i) r = j; else r = 0;

for(int q = r; q < n; q++)

if(p > Mas[g][q])

{

p = Mas[g][q];

k = g; l = q;

}

}

Mas[k][l] = Mas[i][j];

Mas[i][j] = p;

}

}

// Упорядкування матриці по стовпцях: o = 0 - спаданням; o = 1 - зростанням

void Fn_SortDvmMSd(double Mas[][sizeN], int o, int m, int n)

{

int k, l, r;

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

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

{

double p = Mas[i][j]; k = i, l = j;

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

{

if(q == j) r = i; else r = 0;

for(int g = r; g < m; g++)

if(p < Mas[g][q])

{

p = Mas[g][q];

k = g; l = q;

}

}

Mas[k][l] = Mas[i][j];

Mas[i][j] = p;

}

}

// Створення матриці інвертування

void Fn_InvDvm(double Mas[][sizeN], int m, int n)

{

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

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

Mas[i][j] = 0;

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

Mas[n - i - 1][i] = 1;

}

// Перевантаження функції множення "*" вектора-рядка на матрицю

void Fn_Mnog(double Vek1[], double Mat[][sizeN], double Vek2[], int m, int n)

{

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

{

double s = 0;

for(int k = 0; k < n; k++)

s += Vek1[k] * Mat[k][i];

Vek2[i] = s;

}

}

// Перевантаження функції множення "*" матриці на вектора-стовпець

void Fn_Mnog(double Mat[][sizeN], double Vek1[], double Vek2[], int m, int n)

{

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

{

double s = 0;

for(int k = 0; k < n; k++)

s += Mat[i][k] * Vek1[k];

Vek2[i] = s;

}

}

// Перевантаження функції множення "*" матриці на матрицю

void Fn_Mnog(double Mat1[][sizeN], double Mat2[][sizeN], double Mat3[][sizeN], int m, int n, int l)

{

double temp[sizeM][sizeN], s;

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

for(int j = 0; j < l; j++)

{

s = 0;

for(int k = 0; k < n; k++)

s += Mat1[i][k] * Mat2[k][j];

temp[i][j] = s;

}

Fn_Prus(Mat3, temp, m, n);

}

// Створення матриці перестановки

void Fn_PerDvm(double Mas[][sizeN], int p, int r, int m, int n)

{

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

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

Mas[i][j] = 0;

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

if(i == p) Mas[r][i] = 1;

else if(i == r) Mas[p][i] = 1;

else Mas[i][i] = 1;

}

// Створення матриці зсуву

void Fn_ZsDvm(double Mas[][sizeN], int z, int m, int n)

{

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

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

Mas[i][j] = 0.0;

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

{

if(i < m - z) Mas[i][i + z] = 1;

if(i < z) Mas[m - z + i][i] = 1;

}

}

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

Приклад 7.1. Задано дійсне число x = 1.63(№ + 1.26) (де № – номер варіанта) і ціле число n = int[2ln(№ + 10)]. Значення елементів вектора-рядка/стовпця потрібно обчислити за допомогою таких математичних виразів:

; , де

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. .

Приклад 7.2. Задано дійсне число x = 2.48(№ + 1.26) (де № – номер варіанта) та цілі додатні числа m = int[2ln(№ + 10)] і n = int[2ln(№ + 5)]. Значення елементів матриці потрібно визначити за таким принципом:

  • перший рядок матриці задається такою формулою:

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. .

  • другий рядок матриці задається такою формулою:

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. .

  • кожний наступний рядок є сумою двох попередніх рядків, тобто

.

Задача 7.1. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для упорядкування елементів вектора-рядка/стовпця , а саме:

  • вектора-рядка за спаданням значень його елементів;

  • вектора-стовпця за зростанням значень його елементів.

Задача 7.2. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для упорядкування елементів рядків/стовпців матриці , а також для упорядкування елементів матриці по рядках/стовпцях, а саме:

  • рядків матриці за спаданням значень їх елементів;

  • стовпців матриці за зростанням значень їх елементів;

  • матриці по рядках за спаданням значень їх елементів;

  • матриці по стовпцях за зростанням значень їх елементів.

Задача 7.3. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для інвертування елементів вектора-рядка/стовпця , а також для інвертування елементів матриці по рядках/стовпцях, а саме:

  • інвертування елементів вектора-рядка ;

  • інвертування елементів вектора-стовпця ;

  • інвертування елементів матриці по стовпцях;

  • інвертування елементів матриці по рядках;

  • інвертування елементів матриці по стовпцях і по рядках;

  • інвертування елементів матриці по рядках і по стовпцях.

Задача 7.4. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для перестановки елементів вектора-рядка/стовпця , а також для перестановки рядків/стовпців матриці , а саме:

  • перестановка елементів вектора-рядка – останнього з передостаннім;

  • перестановка елементів вектора-рядка – останнього з передостаннім;

  • перестановка елементів вектора-стовпця – останнього з передостаннім;

  • перестановка елементів вектора-стовпця – другого з останнім;

  • перестановка стовпців матриці – останнього з передостаннім;

  • перестановка стовпців матриці – другого з останнім;

  • перестановка рядків матриці – останнього з передостаннім;

  • перестановка рядків матриці – другого з останнім.

  • перестановка рядків і стовпців матриці – останнього з передостаннім;

  • перестановка стовпців і рядків матриці – останнього з передостаннім.

Задача 7.5. Відповідно до попередньо отриманих результатів (див. прикл. 7.1 і 7.2) потрібно розробити код програми для зсуву елементів вектора-рядка/стовпця , а також для зсуву рядків/стовпців матриці , а саме:

  • зсув елементів вектора-рядка – на одну позицію вправо;

  • зсув елементів вектора-рядка – на три позиції вправо;

  • зсув елементів вектора-рядка – на дві позиції вліво;

  • зсув елементів вектора-рядка – на п'ять позицій вліво;

  • зсув елементів вектора-стовпця – на одну позицію вверх;

  • зсув елементів вектора-стовпця – на три позиції вверх;

  • зсув елементів вектора-стовпця – на дві позиції вниз;

  • зсув елементів вектора-стовпця – на чотири позиції вниз;

  • зсув стовпців матриці – на один стовпець вправо;

  • зсув стовпців матриці – на два стовпці вправо;

  • зсув стовпців матриці – на один стовпець вліво;

  • зсув стовпців матриці – на два стовпці вліво;

  • зсув рядків матриці – на один рядок вверх;

  • зсув рядків матриці – на два рядки вверх;

  • зсув рядків матриці – на один рядок вниз;

  • зсув рядків матриці – на два рядки вниз.

Література

1. Александреску А. Современное проектирование на С++ / А. Александреску. – Сер.: С++ In-Depth. 3. – М. : Изд. дом "Вильямс", 2002. – 336 c.

2. Аммераалъ Л. STL для программистов на С++ / Л. Аммераалъ. – М. : Изд-во ДМК, 1999. – 240 с.

3. Архангельский А.Я. Программирование в С++ Builder 6 / А.Я. Архангельский. – М. : Изд-во "Бином", 2004. – 1152 с.

4. Бронштейн И.Н. Справочник по математике для инженеров и учащихся втузов / И.Н. Бронштейн, К.А. Семендяев. – 13-е изд., испр. – М. : Изд-во "Наука", Гл. ред. физ.-мат. лит., 1986. – 544 с.

5. Буч Г. Объектно-ориентированный анализ и проектирование с примерами на С++ / Г. Буч. – М. : Изд-во "Бином", 1998. – 560 с.

6. Влиссидес Дж. Применение шаблонов проектирования. Дополнительные штрихи / Дж. Влиссидес. – М. : Изд. дом "Вильямс", 2003. – 144 с.

7. Гамма Э. Приемы объектно-ориентированного программирования. Патерны проектирования / Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. – СПб. : Изд-во "Питер", 2004. – 366 с.

8. Глинський Я.М. С++ і С++ Builder / Я.М. Глинський, В.Є. Анохін, В.А. Ряжська. – Львів : Деол, СПД Глинський, 2003. – 192 с.

9. Кениг Э. Эффективное программирование на С++. Серия С++ In-Depth. tType. 2 / Э. Кениг, Б. Му. – М. : Изд. дом "Вильямс", 2002. – 384 с.

10. Ласло М. Вычислительная геометрия и компьютерная графика на С++ / М. Ласло. – М. : Изд-во "Бином", 1997. – 304 с.

11. Лафоре, Роберт. Объектно-ориентированное программирование в С++. Классика Computer Science / Роберт Лафоре. – 4-е изд. : пер. с англ. – СПб. : Изд-во "Питер", 2005. – 924 с.

12. Либерти Д. Освой самостоятельно С++ за 21 день / Д. Либерти. – М. : Изд. дом "Вильямс", 2000. – 816 с.

13. Липпман С. Язык программирования С++. Вводный курс / С. Липпман, Ж. Лажойе. – 3-е изд. : пер. с англ. – СПб.-М. : Изд-во "Невский диалект – ДМК Пресс", 2004. – 1104 с.

14. Павловская Т.А. Программирование на языке высокого уровня : учебник / Т.А. Павловская. – СПб. : Изд-во "Питер", 2005. – 461 с.

15. Павловская Т.А. С++. Объектно-ориентированное программирование : практикум / Т.А. Павловская, Ю.А. Щупак. – СПб. : Изд-во "Питер", 2005. – 265 с.

16. Павловская Т. С/С++. Программирование на языке высокого уровня / Т.А. Павловская. – СПб. : Изд-во "Питер", 2001. – 460 с.

17. Павловская Т. С/С++. Структурное программирование : практикум / Т.А. Павловская, Ю.А. Щупак. – СПб. : Изд-во "Питер", 2005. – 240 с.

18. Павловская Т.А. С++. Объектно-ориентированное программирование : практикум / Т.А. Павловская, Ю.А. Щупак. – СПб. : Изд-во "Питер", 2005. – 265 с.

19. Прата, Стивен. Язык программирования С++. Лекции и упражнения : учебник : пер. с англ. / Стивен Прата. – СПб. : ООО "ДиаСофтБП", 2005. – 1104 с.

20. Саттер Г. Решение сложных задач на С++. – Сер.: С++ In-Depth / Г. Саттер. – T. 4. – М. : Изд. дом "Вильямс", 2002. – 400 с.

21. Синтес, Антони. Освой самостоятельно объектно-ориентированное программирование за 21 день : пер. с англ. / Антони Синтес. – М. : Изд. дом "Вильямс", 2002. – 672 с.

22. Справочник по элементарной математике: геометрия, тригонометрия, векторная алгебра / под ред. члена-корр. АН УССР П.Ф. Фильчакова. – К. : Вид-во "Наук. думка", 1966. – 444 с.

23. Страуструп Б. Язык программирования С++ / Б. Страуструп. – СПб. : Изд-во "Бином", 1999. – 991 с.

24. Халперн, Пабло. Стандартная библиотека С++ на примерах : пер. с англ. / Пабло Халперн. – М. : Изд. дом "Вильямс", 2001. – 336 с.

25. Шаллоуэй А. Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию / А. Шаллоуэй, Д. Тротт. – М. : Изд. дом "Вильямс", 2002. – 288 с.

26. Шилдт, Герберт. Искусство программирования на С++ : пер. с англ. / Герберт Шилдт. – СПб. : Изд-во БХВ-Петербург, 2005. – 496 с.

27. Шилдт, Герберт. Полный справочник по С++ / Герберт Шилдт. – 4-е изд. : пер. с англ. – М. : Изд. дом "Вильямс", 2010. – 800 с.

28. Шилдт, Герберт. С++: Базовый курс / Герберт Шилдт. – 3-е изд. : пер. с англ. – М. : Изд. дом "Вильямс", 2005. – 624 с.

29. Шилдт, Герберт. Самоучитель С++ / Герберт Шилдт. – 3-е изд. : пер. с англ. – СПб. : Изд-во БХВ-Петербург, 2005. – 688 с.

30. Штерн В. Основы С++. Методы программной инженерии / В. Штерн. – М. : Изд-во "Лори", 2003. – 860 с.

31. Элджер Д. С++ библиотека программиста / Д. Элджер. – СПб. : Изд-во "Питер", 2000. – 320 с.

Навчальне видання

ГРИЦЮК Юрій Іванович,

ЛОЗИНСЬКИЙ Орест Ігорович

ТЕХНОЛОГІЇ ПРОГРАМУВАННЯ

Частина 1. Структурне програмування

Лабораторний практикум

Літературний редактор В.В. Дудок

Редактор Г.М. Падик

Технічний редактор О.В. Хлевной

Авторські комп'ютерний набір та верстка

Підписано до друку 25.05.2012. Формат 6084/16.

Папір офсетний. Гарнітура Times. Друк на різографі.

Ум. др. арк. 9,3. Ум. фарбо-відб. 9,53.

Наклад 350 прим. Зам. № 28/2011

Видавництво ЛДУ БЖД, вул. Клепарівська, 35, м. Львів, Україна, 79007

Тел./факс: (032) 233-14-77; E-mail: mail@ubgd.lviv.ua; Wed-адреса: http://www.ubgd.lviv.ua

Свідоцтво про внесення суб'єкта видавничої справи до державного реєстру видавців,

виготовників і розповсюджувачів видавничої продукції, серія ДК, № 368 від 20.03.2001 р.

Грицюк Ю.І., Лозинський О.І.

Г 85 Технології програмування : лабораторний практикум. – У 3-ох ч. – Ч. 1. Структурне програмування. – Львів : Вид-во Львівського ДУ БЖД, 2011. – 179 с. – Статистика: іл. 10, табл. 18, бібліогр. 31.

ISВN 978-966-3466-85-9

Лабораторний практикум містить лабораторні роботи з дисципліни "Технології програмування", а саме – технології структурного програмування. Виконання лабораторних робіт дає змогу курсантам/студентам розширити і закріпити лекційний матеріал, отримати практичні навики розроблення та відлагодження програм мовою С++. Розглянуто особливості програмування математичних, логічних і складених функцій та їх табулювання, характерні механізми накопичення суми і добутку, обчислення елементів масивів і дії над матрицями, а також характерні механізми оброблення елементів матриць. Запропоновано індивідуальні завдання та надано рекомендації щодо організації курсового проектування, проведення лабораторних занять та здійснення контролю знань в умовах кредитно-модульної системи навчання.

Видання призначено для курсантів і студентів, які вивчають програмування за напрямом підготовки "Управління інформаційною безпекою", а також для всіх, хто бажає самостійно опанувати різні технології програмування мовою С++. Може бути корисним фахівцям-початківцям, що працюють в області структурного програмування, аспірантам і науковцям, а також розробникам програмного забезпечення.