include iostream include vector include omp define uint unsigned int м

  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
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
#include <vector>
#include <omp.h>
#define uint unsigned int // макрос для сокращения записи
using namespace std;
vector<uint> result;
vector<uint> A;
vector<uint> B;
vector<uint> C;
/*
* Функция проверяет, находится ли элемент elem в множестве set.
*/
bool contains(uint elem, vector<uint> set) {
for (auto value: set)
if (value == elem)
return true;
return false;
}
/*
* Функция сравнивает множества
*/
bool compare(vector<uint> setOne, vector<uint> setTwo) {
if (setOne.size() == 0 && setTwo.size() == 0) // если множества пусты, то они равны
return true;
else if (setOne.size() != setTwo.size()) // если размеры множеств не совпадают, то множества не равны
return false;
for (auto elem: setTwo)
if (!contains(elem, setOne)) // если элемент не найден в множестве
return false;
return true;
}
int main(int argc, const char * argv[])
{
int max_threads = omp_get_max_threads(); // определяем максимальное количество потоков
printf("Максимальное количество потоков: %d\n", max_threads);
// проверяем количество возможных потоков
if (max_threads < 4)
omp_set_num_threads(max_threads); // если количество меньше 4, то устанавливаем то число потоков, которое возможно
else
omp_set_num_threads(4);
// входные значения для множеств
uint input;
// размеры множеств
size_t pA;
size_t pB;
size_t pC;
//A, B, C - множества
cout << "Введите мощность множества A: ";
cin >> pA;
cout << "Введите множество A: ";
while (A.size() < pA) {
cin >> input;
if (!contains(input, A))
A.push_back(input);
}
cin.clear();
cout << "Введите мощность множества B: ";
cin >> pB;
cout << "Введите множество B: ";
while (B.size() < pB) {
cin >> input;
if (!contains(input, B))
B.push_back(input);
}
cin.clear();
cout << "Введите мощность множества C: ";
cin >> pC;
cout << "Введите множество C: ";
while (C.size() < pC) {
cin >> input;
if (!contains(input, C))
C.push_back(input);
}
cin.clear();
result = A;
int i;
#pragma omp parallel for schedule(static) private(i) shared(B)
for (i = 0 ; i < pB; i++)
{
uint elem = B[i];
if (!contains(elem, result))
result.push_back(elem);
}
if (compare(C, result))
cout << "Множество C является объединением множеств A и B" << endl;
// Чистим вектор для дальнейшего использования
result.clear();
#pragma omp parallel for schedule(static) private(i) shared(B, A)
for (i = 0; i < pB; i++) {
uint elem = B[i];
if (contains(elem, A))
result.push_back(elem);
}
if (compare(C, result))
cout << "Множество C является пересечением множеств A и B" << endl;
// Чистим вектор для дальнейшего использования
result.clear();
#pragma omp parallel for schedule(static) private(i) shared(B, A)
for (i = 0; i < pB; i++) {
uint elem = B[i];
if (!contains(elem, A))
result.push_back(elem);
}
if (compare(C, result))
cout << "Множество C является разностью множеств B и A" << endl;
// Чистим вектор для дальнейшего использования
result.clear();
#pragma omp parallel for schedule(static) private(i) shared(B, A)
for (size_t i = 0; i < pA; i++) {
uint elem = A[i];
if (!contains(elem, B))
result.push_back(elem);
}
if (compare(C, result))
cout << "Множество C является разностью множеств A и B" << endl;
// Чистим память
result.clear();
return 0;
}