Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.93 KB | None | 0 0
  1. #include <string> // для работы со строками
  2. #include <iostream> // для ввода-вывода
  3. #include <stdexcept> // для исключений
  4. #include <vector> // выделение памяти для массива
  5. #include <time.h> // типы и функции для работы с датой и временем
  6. #include <ctime> // для манипуляций с временем
  7. #include <cmath> // для матиматических функций (sqrt)
  8.  
  9. using std::cout;
  10. using std::endl;
  11. using std::string; // для использования стринг
  12. using std::invalid_argument; // для исключения
  13. using std::to_string; // для перевода в стринг
  14. using std::rand; // для генератора ранд числа
  15. using std::time; // для манипуляций с временем
  16.  
  17. class MyVector {
  18. private:
  19. int* begin; // Выделение памяти/разыменованием указателя.
  20.  
  21. unsigned int len;
  22.  
  23. public:
  24. MyVector() = default; //Вместо определения конструктора без параметров, в C++11 появилась возможность просто указать компилятору сгенерировать его по-умолчанию
  25.  
  26. MyVector(const MyVector& b) { // конструктор копирования одного вектора в другой
  27. len = b.len;
  28. begin = new int[len];
  29.  
  30. for (int i = 0; i < len; ++i)
  31. begin[i] = b.begin[i];
  32. }
  33.  
  34. explicit // для создания явного конструктора, то есть руктор MyClass с ключевым словом explicit, то это автоматическое конвертирование не будет выполняться
  35. // прим MyClass ob2 = 10 =/> MyClass ob2(10);
  36. // unsigned - положительное значение
  37. MyVector(unsigned int _len) { // конструктор создания вектора
  38. this->len = _len;
  39. begin = new int[_len];
  40. }
  41.  
  42. //Обычно деструктор используется для "очистки", когда объект больше не нужен.
  43. ~MyVector() = default;
  44.  
  45. string ToString() { // вывод вектора строкой
  46. string str("[");
  47. for (int i = 0; i < len - 1; i++) {
  48. str = str + to_string(this->begin[i]) + ",";
  49. }
  50. str += to_string(this->begin[len - 1]) + ("]");
  51. return str;
  52.  
  53. }
  54.  
  55. // int& - указатель на переменную int
  56. int& operator[] (unsigned int loc) // перегрузка оператора индексирования
  57. {
  58. if (loc/*то, что передаётся в скобках*/ > len - 1)
  59. // Определяет исключение, которое должно быть брошено в случае неправильного аргумента.
  60. throw std::invalid_argument("Vector out of range");
  61. return *(begin + loc);
  62. }
  63.  
  64. MyVector& operator++(int) // перегрузка оператора инкремента – это операция в языках программирования, которая увеличивает переменную на единицу
  65. {
  66. int* tmp = new int[++len]; //
  67. int* tmp_begin = tmp;
  68.  
  69. for (int i = 0; i < len - 1; ++i)
  70. tmp[i] = begin[i];
  71.  
  72. delete begin;
  73. begin = tmp_begin;
  74.  
  75. return *this;
  76. }
  77.  
  78. MyVector& operator-- (int) // перегрузка оператора декремента
  79. {
  80. int* tmp = new int[--len];
  81. int* tmp_begin = tmp;
  82.  
  83. for (int i = 0; i < len; ++i)
  84. tmp[i] = begin[i];
  85.  
  86. delete begin;
  87. begin = tmp_begin;
  88.  
  89. return *this;
  90. }
  91.  
  92. MyVector& operator= (MyVector b) {
  93. len = b.len;
  94. int* tmp = new int[b.len]; // временное место для масива
  95. int* tmp_begin = tmp;
  96.  
  97. for (int i = 0; i < b.len; i++)
  98. tmp[i] = b[i];
  99.  
  100. delete begin;
  101. begin = tmp_begin;
  102.  
  103. return *this;
  104. }
  105.  
  106. MyVector operator+ (MyVector b) // перегрузка оператора сложения
  107. {
  108. if (b.len != len) throw std::invalid_argument("Vectors length do not match");
  109.  
  110. MyVector ans(len);
  111.  
  112. for (int i = 0; i < len; i++)
  113. ans[i] = begin[i] + b[i];
  114.  
  115. return ans;
  116. }
  117.  
  118. MyVector operator- (MyVector b) { // перегрузка оператора вычитания
  119. if (b.len != len) throw std::invalid_argument("Vectors length do not match");
  120.  
  121. MyVector ans(len);
  122.  
  123. for (int i = 0; i < len; i++)
  124. ans[i] = begin[i] - b[i];
  125.  
  126. return ans;
  127. }
  128.  
  129. int operator* (MyVector b) { // перегрузка умножения
  130. if (b.len != len) throw std::invalid_argument("Vectors length do not match");
  131.  
  132. return scl(b);
  133. }
  134.  
  135. double mod() { // модуль или длина векторов
  136. double x = 0;
  137.  
  138. for (int i = 0; i < len; i++)
  139. //Функция pow() возвращает значение base, возведенное в степень ехр, т. е. baseexp.
  140. x += pow(2, this->begin[i]);
  141.  
  142. return sqrt(x);
  143. }
  144.  
  145. int scl(MyVector b) { // скалярное произведение векторов
  146. if (b.len != len) throw std::invalid_argument("Vectors length do not match");
  147.  
  148. int x = 0;
  149.  
  150. for (int i = 0; i < len; i++)
  151. x += begin[i] * b[i];
  152.  
  153. return x;
  154. }
  155. MyVector operator* (int a) { // перегрузка оператора умножения на константу
  156. MyVector ans(len);
  157.  
  158. for (int i = 0; i < len; i++)
  159. ans[i] = begin[i] * a;
  160.  
  161. return ans;
  162. }
  163.  
  164. bool col(MyVector b) { //проверка на коллинеарность
  165. if (b.len != len) throw std::invalid_argument("Vectors length do not match");
  166. // ???
  167. bool check = true;
  168. double lm1;
  169. double lm = (double)this->begin[0] / b[0];
  170. for (int i = 0; i < len; i++) {
  171. if ((double)this->begin[i] / b[i] != lm)
  172. return false;
  173. }
  174. return true;
  175.  
  176. }
  177.  
  178. bool ort(MyVector b) {
  179. if (this->scl(b) == 0)
  180. return true;
  181. else return false;
  182. }
  183. };
  184.  
  185. class MyMatrix {
  186. private:
  187. int** begin;
  188.  
  189. unsigned int rows;
  190. unsigned int cols;
  191.  
  192.  
  193. public:
  194. MyMatrix() = default;
  195. ~MyMatrix() = default;
  196.  
  197. MyMatrix(unsigned int _rows, unsigned int _cols) // конструктор
  198. {
  199. rows = _rows;
  200. cols = _cols;
  201.  
  202. begin = new int*[rows];
  203. for (int i = 0; i < rows; i++) {
  204. begin[i] = new int[cols];
  205. }
  206. }
  207.  
  208. MyMatrix(const MyMatrix& other) { // конструктор копирования
  209. rows = other.rows;
  210. cols = other.cols;
  211.  
  212. begin = new int*[rows];
  213. for (int i = 0; i < rows; i++) {
  214. begin[i] = new int[cols];
  215. for (int j = 0; j < cols; j++) {
  216. begin[i][j] = other.begin[i][j];
  217. }
  218. }
  219. }
  220.  
  221. MyMatrix operator* (int lambda) // ???
  222. {
  223. MyMatrix ans(rows, cols);
  224.  
  225. for (int i = 0; i < rows; i++)
  226. for (int j = 0; j < cols; j++)
  227. ans.begin[i][j] = begin[i][j] * lambda;
  228.  
  229. return ans;
  230. }
  231.  
  232. MyMatrix operator+ (MyMatrix other) // перегрузка сложения
  233. {
  234. if (cols != other.cols || rows != other.rows)
  235. throw invalid_argument("Matrix dimensions sizes don't fit each other!");
  236.  
  237. MyMatrix ans(rows, cols);
  238.  
  239. for (int i = 0; i < rows; i++)
  240. for (int j = 0; j < cols; j++)
  241. ans.begin[i][j] = begin[i][j] + other.begin[i][j];
  242.  
  243. return ans;
  244. }
  245.  
  246. MyMatrix operator- (MyMatrix other) // перегрузка вычитания
  247. {
  248. if (cols != other.cols || rows != other.rows)
  249. throw invalid_argument("Matrix dimensions sizes don't fit each other!");
  250.  
  251. MyMatrix ans(rows, cols);
  252.  
  253. for (int i = 0; i < rows; i++)
  254. for (int j = 0; j < cols; j++)
  255. ans.begin[i][j] = begin[i][j] - other.begin[i][j];
  256.  
  257. return ans;
  258. }
  259.  
  260. MyMatrix operator* (MyMatrix other) // ??? перегрузка перемножение
  261. {
  262. if (cols != other.rows || rows != other.cols) //TODO rework
  263. throw invalid_argument("Matrix dimensions sizes don't fit each other!");
  264.  
  265. MyMatrix ans(rows, other.cols);
  266.  
  267. for (int i = 0; i < rows; i++) {
  268. for (int j = 0; j < other.cols; j++) {
  269. ans.begin[i][j] = 0;
  270. for (int k = 0; k < cols; k++)
  271. ans.begin[i][j] += begin[i][k] * other.begin[k][j];
  272. }
  273. }
  274. return ans;
  275. }
  276.  
  277. MyMatrix& operator= (const MyMatrix other) // перезагрузка присваивания
  278. {
  279. delete begin;
  280.  
  281. rows = other.rows;
  282. cols = other.cols;
  283.  
  284. begin = new int*[rows];
  285. for (int i = 0; i < rows; i++) {
  286. begin[i] = new int[cols];
  287. for (int j = 0; j < cols; j++) {
  288. begin[i][j] = other.begin[i][j];
  289. }
  290. }
  291.  
  292. return *this;
  293. }
  294.  
  295. int Norm() // вычисление нормы мартицы???
  296. {
  297. int ans;
  298.  
  299. for (int i = 0; i < rows; i++)
  300. {
  301. int sum = 0;
  302. for (int j = 0; j < cols; j++)
  303. sum += begin[i][j];
  304.  
  305. if (sum > ans)
  306. ans = sum;
  307. }
  308. return ans;
  309. }
  310.  
  311. string ToString() { // вывод?
  312. string ans;
  313.  
  314. for (int i = 0; i < rows; i++) {
  315. ans += "[";
  316. for (int j = 0; j < cols - 1; j++)
  317. ans += to_string(begin[i][j]) + ", ";
  318. ans += to_string(begin[i][cols - 1]) + "]\n";
  319. }
  320. return ans;
  321. }
  322.  
  323. void Randomize() {
  324.  
  325. for (int i = 0; i < rows; i++)
  326. for (int j = 0; j < cols; j++)
  327. begin[i][j] = rand() % 10;
  328. }
  329. };
  330.  
  331. void SquareIElement(MyMatrix mat[], int i) { // возведение в квадрат
  332. mat[i] = mat[i] * mat[i];
  333. }
  334.  
  335. class MyStack {
  336. private:
  337. int* begin;
  338.  
  339. int len;
  340. public:
  341. MyStack() // конструктор
  342. {
  343. len = 0;
  344. begin = new int[0];
  345. }
  346.  
  347. ~MyStack() = default;
  348.  
  349. void push_back(int val) { //?
  350.  
  351. int* tmp = new int[len + 1];
  352. for (int i = 0; i < len; i++)
  353. {
  354. tmp[i] = begin[i];
  355. }
  356. tmp[len] = val;
  357. len++;
  358. delete begin;
  359. begin = tmp;
  360. }
  361.  
  362. bool pop() { //?
  363. return --len != 0;
  364. }
  365.  
  366. int top() { //?
  367. return begin[len - 1];
  368. }
  369.  
  370. string ToString()
  371. {
  372. string ans = "[";
  373. for (int i = 0; i < len - 1; i++)
  374. ans += to_string(begin[i]) + ", ";
  375. ans += to_string(begin[len - 1]);
  376. return ans;
  377. }
  378.  
  379. };
  380.  
  381. void deleteOdd(MyStack& stack) {
  382. MyStack tmp_stack;
  383.  
  384. int i = 0;
  385. do {
  386. if (i % 2 == 1)
  387. tmp_stack.push_back(stack.top());
  388. i++;
  389. } while (stack.pop());
  390.  
  391. do {
  392. stack.push_back(tmp_stack.top());
  393. } while (tmp_stack.pop());
  394.  
  395. }
  396.  
  397. class MyBoolVector {
  398. private:
  399. bool *begin;
  400. unsigned int length;
  401. public:
  402.  
  403. MyBoolVector() = default;
  404. ~MyBoolVector() = default;
  405.  
  406.  
  407. MyBoolVector(unsigned int _length) {
  408. length = _length;
  409. begin = new bool[length];
  410. }
  411.  
  412. MyBoolVector(unsigned int _length, bool* _begin) { // кконструктор
  413. length = _length;
  414. begin = new bool[length]; // выделение памяти
  415.  
  416. for (int i = 0; i < length; ++i) {
  417. begin[i] = _begin[i];
  418. }
  419. }
  420.  
  421.  
  422.  
  423. MyBoolVector(const MyBoolVector& other) // конструктор копирования
  424. {
  425. begin = new bool[other.length];
  426. length = other.length;
  427. for (int i = 0; i < length; i++)
  428. begin[i] = other.begin[i];
  429. }
  430.  
  431. MyBoolVector operator&& (MyBoolVector other) { // ???
  432. if (length != other.length)
  433. throw invalid_argument("Vectors length don't match!");
  434.  
  435. MyBoolVector ans = MyBoolVector(length);
  436.  
  437. for (int i = 0; i < length; i++)
  438. ans.begin[i] = begin[i] && other.begin[i];
  439.  
  440. return ans;
  441. }
  442.  
  443. MyBoolVector operator|| (MyBoolVector other) { // ???
  444. if (length != other.length)
  445. throw invalid_argument("Vectors length don't match!");
  446.  
  447. MyBoolVector ans = MyBoolVector(length);
  448.  
  449. for (int i = 0; i < length; i++)
  450. ans.begin[i] = begin[i] || other.begin[i];
  451.  
  452. return ans;
  453. }
  454.  
  455. unsigned int CountZeros() {
  456. unsigned int ans = 0;
  457.  
  458. for (int i = 0; i < length; ++i) {
  459. if (begin[i]) // ??
  460. ans++;
  461. }
  462. return ans;
  463. }
  464.  
  465. unsigned int CountOnes() {
  466. unsigned int ans = 0;
  467.  
  468. for (int i = 0; i < length; ++i) {
  469. if (!begin[i])
  470. ans++;
  471. }
  472. return ans;
  473. }
  474.  
  475. MyBoolVector operator! () { // ???
  476. MyBoolVector ans = MyBoolVector(*this);
  477.  
  478. for (int i = 0; i < length; ++i) {
  479. ans.begin[i] = !ans.begin[i];
  480. }
  481.  
  482. return ans;
  483. }
  484.  
  485. string ToString() {
  486. string ans = "[";
  487. for (int i = 0; i < length - 1; ++i) {
  488. ans += to_string(begin[i]) + ", ";
  489. }
  490. ans += to_string(begin[length - 1]) + " ]";
  491. return ans;
  492. }
  493.  
  494.  
  495.  
  496.  
  497. };
  498.  
  499. void TestMyVector() {
  500. MyVector vec1(3);
  501. for (int i = 0; i < 3; i++) {
  502. vec1[i] = i;
  503. }
  504. cout << vec1.ToString() << '\n';
  505. vec1++;
  506. vec1[3] = 3;
  507. cout << vec1.ToString() << '\n';
  508. MyVector vec2(4);
  509. for (int i = 0; i < 4; i++) {
  510. vec2[i] = i * i;
  511. }
  512. cout << vec2.ToString() << '\n';
  513. //vec2--;
  514. cout << vec2.ToString() << '\n';
  515. MyVector vec3(5);
  516. for (int i = 0; i < 5; i++) {
  517. vec3[i] = i * i*i;
  518. }
  519. cout << vec3.ToString() << '\n';
  520. vec3 = vec3 * 10;
  521. cout << "модуль " << vec3.mod() << '\n';
  522. cout << "скалярное произведение " << vec1.scl(vec2) << '\n';
  523. cout << "произведение на константу " << vec3.ToString() << '\n';
  524.  
  525. /* MyVector vec (2) ; // Array of vectors
  526. MyVector vec1 (3);
  527. MyVector vec2 (3);
  528. MyVector vec4 (5);
  529. for (int i = 0; i < 5; i++){
  530. vec4[i] = i;
  531. }
  532. MyVector vec6 (7);
  533. for (int i = 0; i < 7; i++){
  534. vec6[i] = i;
  535. }
  536. vec4 = vec6;
  537. cout << vec4.ToString() << '\n';
  538. cout << vec6.ToString() << '\n';
  539. vec[0] = 1;
  540. vec[1] = 2;
  541. vec1[0] = 2;
  542. vec1[1] = 4;
  543. vec1[2] = 6;
  544. vec++;
  545. vec[2] = 3;
  546. vec2 = vec * 10;
  547. int a = vec * vec1;
  548. cout << vec.mod() << "\n";
  549. cout << vec.ToString() << "\n";
  550. cout << vec1.ToString() << "\n";
  551. cout << vec.scl(vec1) << "\n";
  552. cout << a << "\n";
  553. cout << vec2.ToString() << "\n";
  554. cout << vec.ort(vec1) << "\n";
  555. cout << vec.col(vec1) << "\n";*/
  556. }
  557.  
  558. void TestMyMatrix() {
  559. std::srand(unsigned(time(0)));
  560.  
  561. MyMatrix mat1(2, 3);
  562. MyMatrix mat2(2, 3);
  563. MyMatrix mat3(3, 2);
  564.  
  565. mat1.Randomize();
  566. cout << "mat1:\n" << mat1.ToString() << "\n";
  567.  
  568. mat2.Randomize();
  569. cout << "mat2:\n" << mat2.ToString() << "\n";
  570.  
  571. mat3.Randomize();
  572. cout << "mat3:\n" << mat3.ToString() << "\n";
  573.  
  574. mat1 = mat1 + mat2;
  575. cout << "mat1 = mat1 + mat2:\n" << mat1.ToString() << "\n";
  576.  
  577. MyMatrix mat4 = mat1 * mat3;
  578. cout << "mat4 = mat1 * mat3:\n" << mat4.ToString() << "\n";
  579.  
  580. MyMatrix matArray[] = { mat1, mat2, mat3, mat4 };
  581.  
  582. SquareIElement(matArray, 3);
  583. cout << "SquareIElement:\n" << matArray[3].ToString() << "\n";
  584. }
  585.  
  586. void TestMyStack() {
  587. srand(unsigned(time(0)));
  588.  
  589. MyStack stack1;
  590. MyStack stack2;
  591. MyStack stack3;
  592.  
  593. for (int i = 0; i < 10; i++)
  594. {
  595. stack1.push_back(rand() % 100);
  596. stack2.push_back(rand() % 100);
  597. stack3.push_back(rand() % 100);
  598. }
  599.  
  600. cout << stack1.ToString() << "\n";
  601. cout << stack2.ToString() << "\n";
  602. cout << stack3.ToString() << "\n";
  603.  
  604. MyStack stackArray[] = { stack1, stack2, stack3 };
  605.  
  606. for (int i = 0; i < 3; i++)
  607. {
  608. deleteOdd(stackArray[i]);
  609. }
  610.  
  611. for (int i = 0; i < 3; i++)
  612. {
  613. cout << stackArray[i].ToString() << "\n";
  614. }
  615. }
  616.  
  617. void TestMyBoolVector() {
  618. MyBoolVector A = MyBoolVector(4, new bool[4]{ 1, 0, 1, 0 });
  619. MyBoolVector B = MyBoolVector(4, new bool[4]{ 1, 1, 0, 0 });
  620.  
  621. A = A && !B;
  622.  
  623. cout << A.ToString();
  624. }
  625.  
  626. int main() {
  627.  
  628. TestMyVector();
  629.  
  630. TestMyMatrix();
  631.  
  632. TestMyStack();
  633.  
  634. TestMyBoolVector();
  635.  
  636. return 0;
  637. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement