You are on page 1of 6

Міністерство освіти і науки України

Національний технічний університет України «Київський політехнічний


інститут імені Ігоря Сікорського»
Інститут прикладного системного аналізу
Кафедра математичних методів системного аналізу

ЗВІТ
про виконання комп’ютерного практикуму № 3
з дисципліни «Алгоритми і структури даних»

Виконав:
Студент І курсу
Групи ДА-82
Муравльов А. Д.
Варіант № 18
Перевірив:
Савченко І. О.

Київ – 2019
1.Завдання:

2. Блок-схеми.

Рис.1

Опис алгоритму: створюємо змінні n, матрицю A[2*n][2*n] яку ми заповнюємо довільними


числами. Переходимо в функцію яка зображена на Рис.2. Ця функція змінює значення матриці
першого та четвертого квадрату. Друга функція(Рис.3) змінює значення в 2му та 3му квадраті.
Після чого ми виводимо матрицю.

У випадку потокової програми просто замість виклику функцій створюємо потоки в яких вони
будуть працювати.
Рис.2

Рис.3

3.Лістинг.

#include <iostream>
#include <ctime>
#include <iomanip>
#include <thread>

using namespace std;

void change_1_and_4_square(int** A, int n);


void change_2_and_3_square(int** A, int n);
int main(){
srand(time(0));
int n;
cout<<"Enter N value to form 2N x 2N matrix:"<<endl;
cin>>n;
unsigned int start_time = clock();
int** A = new int* [2*n];
cout << "\tORIGINAL MATRIX:" << endl;
for (int count = 0; count < 2 * n; count++) {
A[count] = new int[2 * n];
for (int count_column = 0; count_column < 2 * n; count_column++) {
A[count][count_column] = rand() % 20 + 1;
cout << setw(4) << setprecision(2) << A[count][count_column] << "
";
}
cout << endl;
}
change_1_and_4_square(A, n);
change_2_and_3_square(A, n);
cout << "--------------------" << endl;
cout << "\tTRANSFORMED MATRIX:" << endl;
for (int count = 0; count < 2 * n; count++) {
for (int count_column = 0; count_column < 2 * n; count_column++) {
cout << setw(4) << setprecision(2) << A[count][count_column] << "
";
}
cout << endl;
}
unsigned int end_time = clock();
unsigned int search_time = end_time - start_time;
for (int count = 0; count < 2 * n; count++)
delete[]A[count];
//---------------------------------------------------
cout << "------------------------------------------" << endl;
start_time = clock();
int** B = new int* [2 * n];
cout << "\tORIGINAL MATRIX:" << endl;
for (int count = 0; count < 2 * n; count++) {
B[count] = new int[2 * n];
for (int count_column = 0; count_column < 2 * n; count_column++) {
B[count][count_column] = rand() % 20 + 1;
cout << setw(4) << setprecision(2) << B[count][count_column] << "
";
}
cout << endl;
}
thread t(change_1_and_4_square, B, n);
thread t1(change_2_and_3_square, B, n);
cout << "--------------------" << endl;
cout << "\tTRANSFORMED MATRIX:" << endl;
t.join();
t1.join();
for (int count = 0; count < 2 * n; count++) {
for (int count_column = 0; count_column < 2 * n; count_column++) {
cout << setw(4) << setprecision(2) << B[count][count_column] << "
";
}
cout << endl;
}
end_time = clock();
unsigned int search_time1 = end_time - start_time;
cout << "Time of nonmultithread running: "<< search_time << endl;
cout << "Time of multithread running: "<< search_time1;
for (int count = 0; count < 2 * n; count++)
delete[]B[count];
return 0;
}
void change_1_and_4_square(int** A, int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int t = A[i][j];
A[i][j] = A[i + n][j + n];
A[i + n][j + n] = t;
}
}
}
void change_2_and_3_square(int** A, int n) {
for (int i = n; i < 2 * n; i++) {
for (int j = 0; j < n; j++) {
int t = A[i][j];
A[i][j] = A[i-n][j+n];
A[i - n][j + n] = t;
}
}
}

4. Результаті роботи програми

Для матриці 20х20


Для матриці 200х200

5. Висновок

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

В ході виконання комп’ютерного практикуму отримав навички роботи з багато потоковими


алгоритмами

You might also like