fork download
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. //Объявление класса "Множество":
  8. template <class T>
  9. class set
  10. {
  11. public:
  12. T *a;
  13. int max_size;
  14. int size;
  15. public:
  16. //Конструкторы:
  17. set(int maxim);
  18. set(set <T> &x);
  19.  
  20. //Деструктор:
  21. ~set();
  22.  
  23. void add(T x);//добавление эл-та в множество
  24. bool check_in(T x);//проверка вхождения эл-та в множество
  25.  
  26. void output();//Вывод множества на экран
  27. set<T> operator= (const set <T> &s);//операция: присвоение одного множества другому
  28. set<T> operator* (set <T> &s2);//операция: пересечение двух множеств
  29.  
  30.  
  31. };
  32.  
  33.  
  34. void menu();
  35.  
  36. int main()
  37. {
  38. setlocale(LC_ALL, "Russian");
  39. cout << "Добро пожаловать в программу!" << endl;
  40. menu();
  41.  
  42. return 0;
  43. }
  44.  
  45.  
  46. void menu()
  47. {
  48. bool p1, p2; p1 = p2 = true;
  49. char n;
  50. char choose;
  51. int max_1, max_2;
  52. cout << "Введите максимальный размер первого множества: ";
  53. cin >> max_1;
  54. cout << "Введите максимальный размер второго множества: ";
  55. cin >> max_2;
  56. set <int> set1(max_1);
  57. set <int> set2(max_2);
  58. set <int> set3(std::min(max_1,max_2));
  59.  
  60.  
  61. int x;
  62. do {
  63. cout << '\n'
  64. << "Меню:"
  65. << '\n' << "1. Добавление эл-та в множество"
  66.  
  67. << '\n' << "5. Пересечение двух множеств"
  68.  
  69. << '\n' << "0. Выход"
  70. << '\n' << "<";
  71. cin >> n;
  72. //system("cls");
  73. switch (n)
  74. {
  75.  
  76. case '1':cout << "Выберите множество для добавления (1 или 2): ";
  77. cin >> choose;
  78.  
  79. if (choose == '1')
  80. {
  81. if (p1 == true)
  82. {
  83. for (int i = 0; i < max_1; i++)
  84. {
  85. cout << "Введите э-т: ";
  86. cin >> x;
  87. set1.add(x);
  88. }
  89. cout << "Получившееся множество 1" << endl;
  90. set1.output();
  91. cout << " " << endl;
  92. p1 = false;
  93. }
  94. else { cout << "Вы уже ввели множество 1" << endl; set1.output(); }
  95. }
  96. if (choose == '2')
  97. {
  98. if (p2 == true){
  99. for (int i = 0; i < max_2; i++)
  100. {
  101. cout << "Введите э-т: ";
  102. cin >> x;
  103. set2.add(x);
  104. }
  105. cout << "Получившееся множество 2" << endl;
  106. set2.output();
  107. cout << " " << endl;
  108. p2 = false;
  109. }
  110. else { cout << "Вы уже ввели множество 2" << endl; set2.output(); }
  111. }
  112.  
  113. break;
  114.  
  115.  
  116. case '5':set3 = (set1*set2);
  117. cout << "Исходное множество 1" << endl;
  118. set1.output();
  119. cout << "Исходное множество 2" << endl;
  120. set2.output();
  121. cout << "Получившееся множество 3" << endl;
  122. set3.output();
  123. cout << " " << endl;
  124. break;
  125.  
  126.  
  127.  
  128. case '0':return;
  129. default:cout << "Действие не выбрано";
  130. }
  131. } while (true);
  132.  
  133.  
  134. }
  135. template <class T>
  136. bool set <T>::check_in(T x)
  137. {
  138. for (int i = 0; i<size; i++)
  139. if (a[i] == x)
  140. return true;
  141. return false;
  142. }
  143. template <class T>
  144. void set<T> ::add(T x)
  145. {
  146. if (size<max_size)
  147. {
  148. if (!check_in(x))
  149. {
  150. a[size] = x;
  151. size += 1;
  152. cout << "Добавление прошло успешно" << endl;
  153. }
  154. else
  155. {
  156. cout << "Добавление невозможно!!!" << endl;
  157. cout << "Одинаковые элементы содержаться в множестве только один раз!!!" << endl;
  158. }
  159. }
  160. else
  161. {
  162. cout << "Добавление невозможно" << endl;
  163. cout << "Размер множества не соответствует количеству элементов!!!" << endl;
  164. }
  165. }
  166. template <class T>
  167. void set<T>::output()
  168. {
  169. if (size == 0)
  170. {
  171. cout << "{}";
  172. return;
  173. }
  174. cout << "{" << a[0];
  175. for (int i = 1; i<size; i++)
  176. cout << ", " << a[i];
  177. cout << "}" << endl;
  178.  
  179. }
  180.  
  181.  
  182.  
  183.  
  184.  
  185. template <class T>
  186. set<T> set<T>:: operator* ( set <T> &s2)
  187. {
  188. int k;
  189. k = 0;
  190. set <T> s(max_size);
  191. s.size = 0;
  192. for (int i = 0; i < size; i++)
  193. cout << a[i] << " ";
  194. cout << endl;
  195. for (int j = 0; j < s2.size; j++)
  196. cout << s2.a[j] << " ";
  197. cout << endl;
  198. for (int i = 0; i < size; i++)
  199. {
  200. for (int j = 0; j < s2.size; j++)
  201. if (s2.a[j] == a[i])
  202. {
  203.  
  204. s.a[k] = s2.a[j];
  205. k++;
  206. s.size += 1;
  207. }
  208. }
  209.  
  210. return s;
  211. }
  212.  
  213.  
  214.  
  215.  
  216.  
  217. template <class T>
  218. set<T> set<T>:: operator= (const set <T> &s)
  219. {
  220. if (this == &s)
  221. return *this;
  222. if (max_size != s.max_size)
  223. {
  224. delete[]a;
  225. a = new T[s.max_size];
  226. size = 0;
  227. max_size = s.max_size;
  228. }
  229. for (int i = 0; i<max_size; i++)
  230. {
  231. a[i] = s.a[i];
  232. }
  233. size = s.size;
  234. return *this;
  235. }
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243. template <class T>
  244. set<T>::set(int maxim)
  245. {
  246. a = new T[maxim];
  247. for (int i = 0; i<maxim; i++)
  248. a[i] = 0;
  249. max_size = maxim;
  250. size = 0;
  251. }
  252.  
  253.  
  254. template <class T>
  255. set<T>::set(set<T> &x)
  256. {
  257. max_size = x.max_size;
  258. a = new T[max_size];
  259. for (int i = 0; i<max_size; i++)
  260. a[i] = x.a[i];
  261. }
  262.  
  263.  
  264. template <class T>
  265. set<T>::~set()
  266. {
  267. delete[]a;
  268. }
Runtime error #stdin #stdout #stderr 0s 3424KB
stdin
Standard input is empty
stdout
Добро пожаловать в программу!
Введите максимальный размер первого множества: Введите максимальный размер второго множества: 
stderr
terminate called after throwing an instance of 'std::bad_array_new_length'
  what():  std::bad_array_new_length