fork download
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <ctime>
  6.  
  7.  
  8. using namespace std;
  9.  
  10. //==============================ИСКЛЮЧЕНИЯ======================================
  11.  
  12. class ZeroException {
  13. string exc;
  14.  
  15. friend ostream& operator<<(ostream& os, const ZeroException& vi) {
  16. os << "исключение " << vi.exc;
  17. }
  18. public:
  19.  
  20. ZeroException() {
  21. this->exc = "ZeroException";
  22. }
  23. };
  24.  
  25. class NegativeException {
  26. string exc;
  27.  
  28. friend ostream& operator<<(ostream& os, const NegativeException& vi) {
  29. os << "исключение " << vi.exc;
  30. }
  31. public:
  32.  
  33. NegativeException() {
  34. this->exc = "NegativeException";
  35. }
  36. };
  37.  
  38. class InvalidAdress {
  39. string exc;
  40.  
  41. friend ostream& operator<<(ostream& os, const InvalidAdress& vi) {
  42. os << "исключение " << vi.exc;
  43. }
  44. public:
  45.  
  46. InvalidAdress() {
  47. this->exc = "InvalidAdress";
  48. }
  49. };
  50. //==============================================================================
  51.  
  52. /**
  53.  * <b>Класс - Вектор</b>
  54.  *========================
  55.  *@autor Arkanium77
  56.  */
  57. class Vector {
  58. int *v; // массив координат
  59. int n; //размерность пространствa
  60.  
  61. public:
  62.  
  63. Vector(int n = 2) {
  64. if (n <= 0)throw NegativeException();
  65. v = new int[n];
  66. this->n = n;
  67. for (int i = 0; i < this->n; i++) {
  68. v[i] = 0;
  69. }
  70. }
  71.  
  72. Vector(int *m, int n = 2) {
  73. if (n <= 0)throw NegativeException();
  74. v = new int[n];
  75.  
  76. for (int i = 0; i < n; i++) {
  77. v[i] = m[i];
  78. }
  79. this->n = n;
  80. }
  81.  
  82. Vector(int x, int y) {
  83. v = new int[2];
  84.  
  85. v[0] = x;
  86. v[1] = y;
  87. this->n = 2;
  88. }
  89.  
  90. Vector(const Vector& vect) {
  91. v = new int[vect.n];
  92. n = vect.n;
  93. for (int i = 0; i < n; i++) {
  94. v[i] = vect.v[i];
  95. }
  96. }
  97.  
  98. ~Vector() {
  99. //cout << "Деструктор. Освобождение памяти, занимаемой объектом" << endl;
  100. delete [] v;
  101. }
  102.  
  103. //=========================================================ФУНКЦИИ==========
  104.  
  105. /**
  106.   * <b>Заполнить вектор случайными числами
  107.   * @return Вектор, заполненный случайными числами
  108.   */
  109. Vector random() {
  110. //srand(time(0));
  111. Vector a = Vector(n);
  112. for (int i = 0; i < n; i++) {
  113. a.v[i] = rand() % 200 - 100;
  114.  
  115. }
  116. //cout<<a;
  117. return a;
  118. }
  119.  
  120. /**
  121.   * <b>Равенство векторов</b>
  122.   * @param b - второй вектор для сравнения
  123.   * @return <code>true</code> - если равны. <br> Иначе - <code>false</code>
  124.   */
  125. bool operator==(Vector b) {
  126. if (b.n != this->n)return false;
  127. for (int i = 0; i < n; i++) {
  128. if (this->v[i] != b.v[i])return false;
  129. }
  130. return true;
  131. }
  132.  
  133. /**
  134.   * <b>Неравенство векторов</b>
  135.   * @param b - второй вектор для сравнения
  136.   * @return <code>true</code> - если НЕ равны. <br> Иначе - <code>false</code>
  137.   */
  138. bool operator!=(Vector b) {
  139. //Vector a=this;
  140. //Проблема была в том, что если писать this вместо *this всё ломалось из-за плохого приведения типов. Решение было неочевидно для меня.
  141. return !(*this == b);
  142. /*
  143.   if (b.n != this->n)return true;
  144.   for (int i = 0; i < n; i++) {
  145.   if (this->v[i] != b.v[i])return true;
  146.   }
  147.   return false;
  148.   */
  149. }
  150.  
  151.  
  152. //=======================================================ОПЕРАТОРЫ==========
  153.  
  154. /**
  155.   * <b>Переопределённый оператор =</b><br>
  156.   * @param b Вектор
  157.   * @return Ничего не возвращает. Изменяет объект от которого вызвана на копия
  158.   */
  159. Vector& operator=(Vector b) {
  160. if (*this == b)return *this;
  161. if (b.n != this->n) {
  162. delete []this->v;
  163. this->n = b.n;
  164. this->v = new int [this->n];
  165. }
  166. this->copy(b.v);
  167. return *this;
  168. }
  169. /*
  170.   void operator=(Vector b) {
  171.   //this->v = &(*(Vector(b).v));
  172.   //this->n = b.n;
  173.   this->n=b.n;
  174.   this->copy(b.v);
  175.   }*/
  176.  
  177. /**
  178.   * <b>Переопределённый оператор []</b><br>
  179.   * Аналог функции getV()
  180.   * @param x - позиция
  181.   * @return координату с заданой позиции
  182.   */
  183. int operator[](int x) {
  184. return this->getV(x);
  185. }
  186.  
  187. /**
  188.   * <b>Переопределённый оператор (a,b)</b><br>
  189.   * Аналог функции setV()
  190.   * @param pos - позиция
  191.   * @param obj - новая координата
  192.   * @return ничего. Просто изменяет координату на выбранной позиции.
  193.   */
  194. void operator()(int pos, int obj) {
  195. this->setV(pos, obj);
  196. }
  197.  
  198. /**
  199.   * <b>Переопределённый оператор -=</b>
  200.   * @param b - вычитаемый вектор
  201.   * @return Изменяет объект от которого был вызван
  202.   */
  203. void operator-=(Vector b) {
  204. if (this->n < b.n) {
  205. int *ar = this->v;
  206. *this = Vector(b.n);
  207. this->copy(ar);
  208. }
  209. for (int i = 0; i<this->n; i++) {
  210. this->v[i] -= b.v[i];
  211. }
  212. }
  213.  
  214. friend const Vector operator-(Vector a, Vector b) {
  215.  
  216. Vector u = Vector(a.v, a.n);
  217. u -= b;
  218. return Vector(u.v, u.n);
  219. }
  220.  
  221. /**
  222.   * <b>Переопределённый оператор +=</b>
  223.   * @param b - вектор-второе слогаемое
  224.   * @return Изменяет объект от которого был вызван
  225.   */
  226. void operator+=(Vector b) {
  227. if (this->n < b.n) {
  228. int *ar = this->v;
  229. *this = Vector(b.n);
  230. this->copy(ar);
  231. }
  232. for (int i = 0; i<this->n; i++) {
  233. this->v[i] += b.v[i];
  234. }
  235. /*
  236.   if (b.n >= this->n) {
  237.   for (int i = 0; i<this->n; i++) {
  238.   this->v[i] += b.v[i];
  239.   }
  240.   } else {
  241.   for (int i = 0; i < b.n; i++) {
  242.   this->v[i] += b.v[i];
  243.   }
  244.   }*/
  245. }
  246.  
  247. friend const Vector operator+(Vector a, Vector b) {
  248.  
  249. Vector u = Vector(a.v, a.n);
  250. u += b;
  251. return Vector(u.v, u.n);
  252. }
  253.  
  254. /**
  255.   * <b>Переопределённый оператор *=</b>
  256.   * @param a - Число-множитель
  257.   * @return Изменяет объект от которого был вызван
  258.   */
  259. void operator*=(int a) {
  260. for (int i = 0; i<this->n; i++) {
  261. this->v[i] *= a;
  262. }
  263. }
  264.  
  265. /**
  266.   * <b>Переопределённый оператор *</b>
  267.   * @param a - Число-множитель
  268.   * @return Новый вектор
  269.   */
  270. friend const Vector operator*(const Vector& b, int a) {
  271. //cout<<endl<<"============"<<endl;
  272. //cout<<this->n<<endl;
  273. //int gg=this->n;
  274. //Vector t=Vector(*this->v,gg);//Почему-то он выделяет память только под 2 ячейки массива. Независимо от способа задания.
  275. //cout<<t.n<<endl<<endl;
  276. Vector u = Vector(b.v, b.n);
  277. u *= a;
  278. return Vector(u.v, u.n);
  279. }
  280.  
  281. /**
  282.   * <b>Переопределённый оператор /=</b>
  283.   * @param a - Число-делитель
  284.   * @throws ZeroException - ошибка деления на 0
  285.   * @return Изменяет объект от которого был вызван
  286.   */
  287. void operator/=(int a) {
  288. if (a == 0) {//perror("Деление на ноль");
  289. throw ZeroException();
  290. }
  291. for (int i = 0; i<this->n; i++) {
  292. this->v[i] /= a;
  293. }
  294. }
  295.  
  296. /**
  297.   * <b>Переопределённый оператор /</b>
  298.   * @param a - Число-делитель
  299.   * @throws ZeroException - ошибка деления на 0
  300.   * @return Новый вектор
  301.   */
  302. friend const Vector operator/(Vector b, int a) {
  303. /*Vector u = Vector(b.v,b.n);
  304.   u *= a;
  305.   return Vector(u.v,u.n);*/
  306. Vector u = Vector(b.v, b.n);
  307. u /= a;
  308. return Vector(u.v, u.n);
  309. }
  310.  
  311. /**
  312.   * <b>Переопределённый оператор вывода</b>
  313.   * @param os поток вывода.
  314.   * @param vi Вектор
  315.   * @return изменённый поток вывода
  316.   */
  317. friend ostream& operator<<(ostream& os, const Vector& vi) {
  318. //os << "v << " << endl;
  319. //string c = "";
  320. for (int i = 0; i < vi.n; i++) {
  321. os << vi.v[i] << " ";
  322. }
  323. // os << "v << -2 " << endl;
  324. return os;
  325. }
  326.  
  327. protected:
  328.  
  329. /**
  330.   * <b>Получить координату по позиции</b>
  331.   * @param pos - позиция.
  332.   * @return Координату
  333.   */
  334. int getV(int pos) {
  335. if (pos < 0 || pos >= this->n)throw InvalidAdress();
  336. return v[pos];
  337. }
  338.  
  339. /**
  340.   * <b>Изменить координату</b>
  341.   * @param pos - позиция координаты
  342.   * @param obj - новая координата
  343.   */
  344. void setV(int pos, int obj) {
  345. if (pos < 0 || pos >= n)throw InvalidAdress();
  346. this->v[pos] = obj;
  347. }
  348.  
  349. /**
  350.   * <b>Перенос массива</b>
  351.   * Техническая функция. ВАЖНО: Размер this.v должен совпадать с размером переносимого массива
  352.   * @param v переносимый массив
  353.   */
  354. void copy(int *v) {
  355. int *ar = new int [this->n];
  356. for (int i = 0; i<this->n; i++) {
  357. ar[i] = v[i];
  358. }
  359. this->v = ar;
  360. delete []ar;
  361. }
  362. };
  363.  
  364.  
  365. //======================================================================
  366.  
  367. int main() {
  368. setlocale(0, "");
  369. srand(time(0));
  370. cout << "Russian Русский";
  371. Vector v = Vector(4);
  372. Vector v2 = Vector(4);
  373. v2(0, 16);
  374. v2(1, 2);
  375. v2(2, 2);
  376. v2(3, 1);
  377. v(0, 0);
  378. v(1, 3);
  379. v(2, 2);
  380. v(3, 1);
  381. cout << endl << endl << v;
  382. cout << endl << endl << v2;
  383. v2 *= 2;
  384. cout << endl << endl << v2;
  385. v2 = (v2 * 2);
  386. cout << endl << endl << v2;
  387.  
  388. //========================ИСКЛЮЧЕНИЯ=======================================
  389. try {
  390. v /= 0;
  391. } catch (ZeroException a) {
  392. cout << endl << a << endl;
  393. }
  394. //=========================================================================
  395. cout << endl << "v:" << v << endl;
  396. v += v2;
  397. cout << "v[0]=" << v[0] << endl;
  398. cout << endl << v;
  399. v = v.random();
  400. cout << endl << "!" << endl << v;
  401.  
  402. int m[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  403. v = Vector(m, 9); //Интересный случай. Почему-то с запуском нового конструктора длина вектора не меняется.
  404. Vector v3 = Vector(m, 9); //Vector(v);
  405. cout << endl << "v3:" << v << "-> " << v3 << endl << "v3[5]=" << v3[5];
  406. v = v3.random();
  407. cout << endl << "v3:" << v << "-> " << v3 << endl << "v3[5]=" << v3[5];
  408. v = v3.random();
  409. v3 = v3.random();
  410. cout << endl << "v3:" << v << "-> " << v3 << endl << "v3[5]=" << v3[5];
  411. if (v != v3)cout << endl << "Бинго";
  412. v = v3;
  413. if (v == v3)cout << " X2";
  414. return 0;
  415. }
  416.  
  417.  
  418.  
  419.  
Runtime error #stdin #stdout 0s 17712KB
stdin
Standard input is empty
stdout
Russian  Русский

0 3 2 1 

16 2 2 1 

32 4 4 2 

0 0 8 4