Advertisement
Sanlover

Untitled

Nov 7th, 2020 (edited)
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.13 KB | None | 0 0
  1. /*1. Конструктор
  2. 2. Конструктор копирования
  3. 3. Деструктор
  4. 4. Перегруженные арифм-ие операции
  5. 5. Перегруженные операции сравнения
  6. 6. Перегруженный оператор присваивания
  7. 7. Перегруженные операции << и >>
  8. Условие задачи: №3. n-мерный вектор. Вектор предcтавляется динамическим массивом размерности n
  9. Субочев Кирилл, 2 курс, 4 группа*/
  10.  
  11. #include <Windows.h>
  12. #include <iostream>
  13. #include <conio.h>
  14. using namespace std;
  15. class Vect //создаю класс вектора
  16. {
  17. private:
  18. int* arr; //имя массива
  19. int n; //размерность массива
  20.  
  21. void updateSize()
  22. {
  23. if (n == 0)
  24. {
  25. arr = new int[n + 1];
  26. }
  27. else
  28. {
  29. int* temp = new int[n + 1];
  30. for (size_t i = 0; i < n; i++)
  31. temp[i] = arr[i];
  32. temp[n] = 0;
  33. delete[] arr;
  34. arr = temp;
  35. }
  36. n++;
  37. }
  38. public:
  39. Vect()
  40. {
  41. n = 0;
  42. arr = nullptr;
  43. }
  44. Vect(const int& size) //конструктор
  45. {
  46. n = size; //говорю, что n равно size
  47. arr = new int[n]; //создаю массив размерности size
  48. for (size_t i = 0; i < n; i++)
  49. arr[i] = 0;
  50. };
  51. ~Vect() //деструктор
  52. {
  53. delete[] arr; //очистка памяти
  54. }
  55. Vect(const Vect& obj) //конструктор копирования
  56. {
  57. //здесь я копирую данные из одного объекта в другой для последующих операций
  58. n = obj.n;
  59. arr = new int[obj.n];
  60. for (int i = 0; i < obj.n; i++)
  61. {
  62. arr[i] = obj.arr[i];
  63. }
  64. }
  65.  
  66. void pushBack(const int& value)
  67. {
  68. updateSize();
  69. arr[n - 1] = value;
  70. }
  71. Vect operator+(const Vect& obj) //перегрузка сложения
  72. {
  73. if (obj.n > n)
  74. {
  75. Vect A(obj.n); //создаю вектор размерности n
  76. for (int i = 0; i < n; i++)
  77. {
  78. A.arr[i] = arr[i] + obj.arr[i]; //записываю в этот вектор сумму
  79. }
  80. for (size_t i = n; i < obj.n; i++)
  81. A.arr[i] = obj.arr[i];
  82. return A;
  83. }
  84. else
  85. {
  86. Vect A(n); //создаю вектор размерности n
  87. for (int i = 0; i < obj.n; i++)
  88. {
  89. A.arr[i] = arr[i] + obj.arr[i]; //записываю в этот вектор сумму
  90. }
  91. for (size_t i = obj.n; i < n; i++)
  92. A.arr[i] = arr[i];
  93. return A;
  94. }
  95. }
  96. Vect operator-(const Vect obj) //перегрузка вычитания
  97. {
  98. if (obj.n > n)
  99. {
  100. Vect A(obj.n); //создаю вектор размерности n
  101. for (int i = 0; i < n; i++)
  102. {
  103. A.arr[i] = arr[i] - obj.arr[i]; //записываю в этот вектор сумму
  104. }
  105. for (size_t i = n; i < obj.n; i++)
  106. A.arr[i] = -obj.arr[i];
  107. return A;
  108. }
  109. else
  110. {
  111. Vect A(n); //создаю вектор размерности n
  112. for (int i = 0; i < obj.n; i++)
  113. {
  114. A.arr[i] = arr[i] - obj.arr[i]; //записываю в этот вектор сумму
  115. }
  116. for (size_t i = obj.n; i < n; i++)
  117. A.arr[i] = -arr[i];
  118. return A;
  119. }
  120. }
  121. Vect operator*(int obj) //перегрузка умножения
  122. {
  123. Vect A(n); //создаю вектор размерности n
  124. for (int i = 0; i < n; i++)
  125. {
  126. A.arr[i] = arr[i] * obj; //записываю в этот вектор произведение
  127. }
  128. return A; //возвращаю результат
  129. }
  130. Vect operator=(const Vect& obj) //перегрузка присваивания
  131. {
  132. for (int i = 0; i < n; i++)
  133. {
  134. arr[i] = obj.arr[i];
  135. }
  136. for (size_t i = n; i < obj.n; i++)
  137. pushBack(obj.arr[i]);
  138. return *this;
  139. }
  140. bool comparemore(const Vect& obj) //перегрузка знака больше
  141. {
  142. int length1 = 0, length2 = 0; //длины векторов
  143. for (int i = 0; i < n; i++)
  144. {
  145. length1 += arr[i] * arr[i]; //возвожу в квадрат все элементы первого вектора
  146. }
  147. length1 = sqrt(length1); //извлекаю корень и получаю результат
  148. for (int i = 0; i < n; i++)
  149. {
  150. length2 += obj.arr[i] * obj.arr[i]; //возвожу в квадрат все элементы второго вектора
  151. }
  152. length2 = sqrt(length2); //извлекаю корень и получаю результат
  153. return length1 > length2; //возвращаю результат и говорю, что первый больше второго
  154. }
  155. bool compareless(const Vect& obj) //перегрузка знака меньше
  156. {
  157. int length1 = 0, length2 = 0; //длины векторов
  158. for (int i = 0; i < n; i++)
  159. {
  160. length1 += arr[i] * arr[i]; //возвожу в квадрат все элементы первого вектора
  161. }
  162. length1 = sqrt(length1); //извлекаю корень и получаю результат
  163. for (int i = 0; i < n; i++)
  164. {
  165. length2 += obj.arr[i] * obj.arr[i]; //возвожу в квадрат все элементы второго вектора
  166. }
  167. length2 = sqrt(length2); //извлекаю корень и получаю результат
  168. return length1 < length2; //возвращаю результат и говорю, что первый меньше второго
  169. }
  170. bool operator==(const Vect& obj) //перегрузка равенства
  171. {
  172. int length1 = 0, length2 = 0; //длины векторов
  173. for (int i = 0; i < n; i++)
  174. {
  175. length1 += arr[i] * arr[i]; //возвожу в квадрат все элементы первого вектора
  176. }
  177. length1 = sqrt(length1); //извлекаю корень и получаю результат
  178. for (int i = 0; i < n; i++)
  179. {
  180. length2 += obj.arr[i] * obj.arr[i]; //возвожу в квадрат все элементы второго вектора
  181. }
  182. length2 = sqrt(length2); //извлекаю корень и получаю результат
  183. return length1 == length2; //возвращаю результат и говорю, что векторы равны
  184. }
  185. ostream& operator<<(ostream& out) //перегрузка вывода
  186. {
  187. cout << "Ваш вектор:\t";
  188. for (int i = 0; i < n; i++)
  189. {
  190. out << arr[i] << "\t"; //вывожу элементы вектора
  191. }
  192. cout << endl;
  193. return out; //возвращаем поток
  194. }
  195. friend ostream& operator<<(ostream& out, const Vect& obj) //дружественная функция для вывода
  196. {
  197. cout << "Ваш вектор:\t";
  198. for (int i = 0; i < obj.n; i++)
  199. {
  200. out << obj.arr[i] << "\t"; //чтобы нормально выводить (cout << c, а не c << cout)
  201. }
  202. cout << endl;
  203. return out; //возвращаем поток
  204. }
  205. istream& operator>>(istream& in) //перегрзука ввода
  206. {
  207. for (int i = 0; i < n; i++)
  208. {
  209. in >> arr[i]; //ввожу элементы вектора
  210. }
  211. return in; //возвращаем поток
  212. }
  213. friend istream& operator>>(istream& in, const Vect& obj) //дружественная функция для ввода
  214. {
  215. for (int i = 0; i < obj.n; i++)
  216. {
  217. in >> obj.arr[i]; //чтобы нормально вводить (cin << c, а не c << cin)
  218. }
  219. return in; //возвращаем поток
  220. }
  221. };
  222. int main()
  223. {
  224. SetConsoleCP(1251);
  225. SetConsoleOutputCP(1251);
  226.  
  227. //Vect a(4);
  228. //bool isRunning = true;
  229. //while (isRunning)
  230. //{
  231. // system("cls");
  232. // cout << "1) Вывести вектор" << endl;
  233. // cout << "2) Добавить элемент в вектор" << endl;
  234. // cout << "3) Выход" << endl;
  235. // char symbol;
  236.  
  237. // if (!_kbhit())
  238. // {
  239. // symbol = _getch();
  240. // switch (symbol)
  241. // {
  242. // case '1':
  243. // {
  244. // system("cls");
  245. // cout << a;
  246. // _getch();
  247. // }break;
  248.  
  249. // case '2':
  250. // {
  251. // system("cls");
  252. // int temp;
  253. // cout << "Введите число, которое хотите добавить = ";
  254. // cin >> temp;
  255. // a.pushBack(temp);
  256. // _getch();
  257. // }break;
  258. // case '3':
  259. // {
  260. // system("cls");
  261. // cout << "Работа программы завершена";
  262. // return 0;
  263. // }
  264. // }
  265. // }
  266. //}
  267.  
  268. int n1, n2, choose, choose1; //n - размер, choose - выбор операции
  269. char end; //переменная для окончания цикла do while
  270. cout << "Размер 1'го: ";
  271. cin >> n1; //ввожу размер
  272. Vect a(n1); //создаю первый вектор
  273. cout << "Введите первый вектор: ";
  274. cin >> a; //ввожу вектор
  275. cout << "Размер 2'го: ";
  276. cin >> n2; //ввожу размер
  277. Vect b(n2); //создаю второй вектор
  278. cout << "Введите второй вектор: ";
  279. cin >> b; //ввожу вектор
  280. cout << a; //вывожу первый вектор
  281. cout << b; //вывожу второй вектор
  282.  
  283. do //цикл do while, чтобы много раз выбирать операции
  284. {
  285. cout << "1. Сложение векторов \n";
  286. cout << "2. Вычитание векторов \n";
  287. cout << "3. Умножение векторов \n";
  288. cout << "4. Сравнение векторов \n";
  289. cout << "Ваш выбор: ";
  290. cin >> choose; //ввожу номер операции
  291. Vect c; //создаю третий вектор
  292. switch (choose)
  293. {
  294. case 1: //сложение
  295. c = a + b; //записываю сумму в вектор с
  296. cout << endl;
  297. cout << c; //вывожу вектор с
  298. break;
  299. case 2: //вычитание
  300. c = a - b; //записываю разность в вектор с
  301. cout << endl;
  302. cout << c; //вывожу вектор с
  303. break;
  304. case 3: //умножение
  305. {
  306. int d;
  307. cout << "Введите число: ";
  308. cin >> d;
  309. cout << "Выберите вектор: ";
  310. cin >> choose1;
  311. switch (choose1)
  312. {
  313. case 1:
  314. {
  315. c = a * d; //записываю произведение в вектор с
  316. cout << endl;
  317. cout << c; //вывожу вектор с
  318. }
  319. break;
  320. case 2:
  321. {
  322. c = b * d; //записываю произведение в вектор с
  323. cout << endl;
  324. cout << c; //вывожу вектор с
  325. }
  326. break;
  327. }
  328. }
  329. break;
  330. case 4: //сравнение
  331. if (a.comparemore(b)) //если первый вектор больше второго
  332. cout << "Первый вектор больше\n";
  333. if (a.compareless(b)) //если второй вектор больше первого
  334. cout << "Второй вектор больше\n";
  335. if (a == b) //если векторы равны
  336. cout << "Векторы равны\n";
  337. break;
  338. default: //если введено неверное значение (<4 и >0)
  339. cout << "Неверно выбрана операция\n";
  340. break;
  341. }
  342. cout << "\nНажмите Q чтобы выйти" << endl;
  343. end = _getch();
  344. } while (end != 'q' && end != 'Q' && end != 'Й' && end != 'й'); //выход из цикла do while
  345. return 0;
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement