Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. using namespace std;
  5. class MATRIX; // Прототип класса. Нужен для объявления функций
  6.  
  7. class VECTOR
  8. {
  9. double vect[30];
  10. int n;
  11. public:
  12. VECTOR(int a){
  13. n = a;
  14. }
  15. friend void pro_matr_vect(MATRIX* m, VECTOR* v, VECTOR* r);
  16. friend void vvod(VECTOR *y1);
  17. friend void vivod(MATRIX *y1, VECTOR *y2, ostream &sout);
  18. friend void vivod_pro(VECTOR *y5, ostream &sout);
  19.  
  20. };
  21.  
  22.  
  23.  
  24. class MATRIX_SQ
  25. {
  26. int ch, n;
  27. double mas[30][30];
  28. public:
  29. MATRIX_SQ(int a)
  30. {
  31. n = a;
  32. cout << "Создается объект." << endl;
  33. }
  34. MATRIX_SQ(const MATRIX_SQ &ob)
  35. {
  36. n = ob.n;
  37. ch = ob.ch + 1;
  38. cout << "Создается копия." << endl;
  39. }
  40. ~MATRIX_SQ()
  41. {
  42. if (ch == 0)
  43. cout << "Объект разрушен, здесь сработал деструктор." << endl;
  44. else
  45. cout << "Копия объекта разрушена." << endl;
  46. }
  47. int get_n() {return n;};
  48. friend void vvod(MATRIX_SQ *y1);
  49. friend void vivod(MATRIX *y1, MATRIX_SQ *y2, ostream &sout);
  50.  
  51. void pro(MATRIX* y1, MATRIX* y5);
  52. };
  53.  
  54. class MATRIX
  55. {
  56. int ch, m, n;
  57. double mas[30][30];
  58. public:
  59. MATRIX(int a, int b)
  60. {
  61. ch = 0;
  62. m = a;
  63. n = b;
  64. cout << "Создается объект." << endl;
  65. }
  66. MATRIX(const MATRIX &ob)
  67. {
  68. m = ob.m;
  69. n = ob.n;
  70. ch = ob.ch + 1;
  71. cout << "Создается копия." << endl;
  72. }
  73. ~MATRIX()
  74. {
  75. if (ch == 0)
  76. cout << "Объект разрушен, здесь сработал деструктор." << endl;
  77. else
  78. cout << "Копия объекта разрушена." << endl;
  79. }
  80. int get_m() {return m;};
  81. int get_n() {return n;};
  82.  
  83. friend bool can_add(MATRIX* y1, MATRIX* y2);
  84. friend bool can_mlt(MATRIX* y1, MATRIX* y2);
  85. friend void vvod(MATRIX *y1);
  86. friend void MATRIX_SQ::pro(MATRIX* y1, MATRIX* y5);
  87. friend double umn(MATRIX*, MATRIX*);
  88. friend void vvod(MATRIX *y1);
  89. friend void vvod(MATRIX_SQ *y1);
  90. friend void sum(MATRIX *y1, MATRIX *y2, MATRIX *y3);
  91. friend void raz(MATRIX *y1, MATRIX *y2, MATRIX *y3);
  92. friend double umn(MATRIX *y1, MATRIX *y3);
  93. friend void vivod_sum_raz(MATRIX *y1, MATRIX *y2, MATRIX *y3, int ch, ostream &sout);
  94. friend void vivod_pro(MATRIX *y1, MATRIX_SQ *y4, MATRIX *y5, ostream &sout);
  95. friend void vivod_umn(MATRIX *y1, MATRIX *y3, double y, ostream &sout);
  96. friend void vivod(MATRIX *y1, MATRIX *y2, ostream &sout);
  97. friend void vivod(MATRIX *y1, MATRIX_SQ *y2, ostream &sout);
  98. friend void pro_matr_vect(MATRIX* m, VECTOR* v, VECTOR* r);
  99. friend void vivod(MATRIX *y1, VECTOR *y2, ostream &sout);
  100.  
  101. };
  102.  
  103.  
  104. void pro_matr_vect(MATRIX* m, VECTOR* v, VECTOR* r){
  105. int i, k;
  106. for(i = 0; i < m->get_m(); i++)
  107. {
  108. r->vect[i] = 0;
  109. for(k = 0; k < m->get_n(); k++)
  110. r->vect[i] += m->mas[i][k] * v->vect[k];
  111. }
  112. }
  113.  
  114.  
  115.  
  116.  
  117.  
  118. void MATRIX_SQ::pro(MATRIX* y1, MATRIX* y5){
  119. int i, j, k;
  120. for(i = 0; i < y1->get_m(); i++)
  121. {
  122. for(j = 0; j < this->get_n(); j++)
  123. {
  124. y5->mas[i][j] = 0;
  125. for(k = 0; k < y1->get_n(); k++)
  126. y5->mas[i][j] += y1->mas[i][k] * this->mas[k][j];
  127. }
  128. }
  129.  
  130. }
  131.  
  132.  
  133. bool can_add(MATRIX* y1, MATRIX* y2){
  134. return (y1->m == y2->m) && (y1->n == y2->n);
  135. }
  136.  
  137. bool can_mlt(MATRIX* y1, MATRIX* y2){
  138. return y1->m == y2->n;
  139. }
  140.  
  141.  
  142.  
  143.  
  144.  
  145. void vvod(MATRIX *y1);
  146. void vvod(MATRIX_SQ *y1);
  147. void sum(MATRIX *y1, MATRIX *y2, MATRIX *y3);
  148. void raz(MATRIX *y1, MATRIX *y2, MATRIX *y3);
  149. double umn(MATRIX *y1, MATRIX *y3);
  150. void pro(MATRIX *y1, MATRIX *y4, MATRIX *y5);
  151. void vivod(MATRIX *y1, MATRIX *y2, ostream &sout);
  152. void vivod_sum_raz(MATRIX *y1, MATRIX *y2, MATRIX *y3, int ch, ostream &sout);
  153. void vivod_umn(MATRIX *y1, MATRIX *y3, double y, ostream &sout);
  154. void vivod_pro(MATRIX *y1, MATRIX *y4, MATRIX *y5, ostream &sout);
  155. int main()
  156. {
  157. setlocale(LC_ALL, "rus_rus.1251");
  158. MATRIX_SQ mat4(5);
  159. MATRIX mat1(5,6), mat2(5,6), mat3(5,6);//, mat4(6,5);
  160. MATRIX
  161. *y1_5x6 = &mat1,
  162. *y2_5x6 = &mat2,
  163. *y3_5x6 = &mat3;
  164. //, *y5;
  165. MATRIX_SQ
  166. *y4_5x5 = &mat4;
  167. VECTOR v6(6);
  168. VECTOR v5(5);
  169.  
  170.  
  171. int ch;//, q;
  172. //double y;
  173. //y1 = &mat1;
  174. //y2 = &mat2;
  175. //y3 = &mat3;
  176. //y4 = &mat4;
  177. //y5 = &mat5;
  178.  
  179. cout << "Ввод 1-ой матрицы 5x6:" << endl;
  180. vvod(y1_5x6);
  181. cout << "1 - Сумма матриц, 2 - Разность матриц, 3 - Произведение матриц, 4 - умножение матрицы на вектор, 5 - умножение вектора на матрицу" << endl;
  182. cin >> ch;
  183.  
  184.  
  185. ofstream pout("d:\\out.txt");
  186. switch (ch)
  187. {
  188. case 1: // Сложение матриц 5х6
  189. case 2: // Вычитание матриц 5х6
  190. cout << "Ввод 2-ой матрицы 5x6:" << endl;
  191. vvod(y2_5x6);
  192. if (can_add(y1_5x6,y2_5x6))
  193. {
  194. if(ch == 1)
  195. sum(y1_5x6, y2_5x6, y3_5x6);
  196. else
  197. raz(y1_5x6, y2_5x6, y3_5x6);
  198.  
  199. vivod(y1_5x6, y2_5x6, cout);
  200. vivod(y1_5x6, y2_5x6, pout);
  201. vivod_sum_raz(y1_5x6, y2_5x6, y3_5x6, ch, cout);
  202. vivod_sum_raz(y1_5x6, y2_5x6, y3_5x6, ch, pout);
  203. }
  204. else
  205. {
  206. cout << "Операция не выполнена, так как ввод размерностей неверный!" << endl;
  207. return 2;
  208. }
  209. break;
  210. case 3: // Произведение матриц 5х6 на 5х5
  211. cout << "Ввод 2-ой матрицы 5x5:" << endl;
  212. vvod(y4_5x5);
  213. y4_5x5 -> pro(y1_5x6, y3_5x6);
  214. vivod(y1_5x6, y4_5x5, cout);
  215. vivod(y1_5x6, y4_5x5, pout);
  216. vivod_pro(y1_5x6, y4_5x5, y3_5x6, cout);
  217. vivod_pro(y1_5x6, y4_5x5, y3_5x6, pout);
  218. break;
  219. case 4: // Умножение матрицы 5х6 на вектор 6х1
  220. cout << "Ввод вектора длины 6:" << endl;
  221. vvod(&v6);
  222. pro_matr_vect(y1_5x6, &v6, &v5);
  223. vivod(y1_5x6, &v6, cout);
  224. vivod_pro(&v5, cout);
  225. break;
  226. default:
  227. cout << "Error" << endl;
  228. return -1;
  229. }
  230.  
  231. pout.close();
  232. return 0;
  233. }
  234.  
  235. void vvod(MATRIX *y1)
  236. {
  237. for(int i = 0; i < y1->get_m(); i++)
  238. {
  239. for(int j = 0; j < y1->get_n(); j++)
  240. {
  241. cout << "Введите mat[" << i << "][" << j << "] ";
  242. cin >> y1->mas[i][j];
  243. }
  244. }
  245. }
  246.  
  247. void vvod(VECTOR *y1)
  248. {
  249. for(int i = 0; i < y1->n; i++)
  250. {
  251. cout << "Введите mat[" << i << "] ";
  252. cin >> y1->vect[i];
  253. }
  254. }
  255. void vvod(MATRIX_SQ *y1)
  256. {
  257. for(int i = 0; i < y1->n; i++)
  258. {
  259. for(int j = 0; j < y1->n; j++)
  260. {
  261. cout << "Введите mat[" << i << "][" << j << "] ";
  262. cin >> y1->mas[i][j];
  263. }
  264. }
  265. }
  266.  
  267. void sum(MATRIX *y1, MATRIX *y2, MATRIX *y3)
  268. {
  269. for(int i = 0; i < y1->get_m(); i++)
  270. for(int j = 0; j < y1->get_n(); j++)
  271. y3->mas[i][j] = y1->mas[i][j] + y2->mas[i][j];
  272. }
  273. void raz(MATRIX *y1, MATRIX *y2, MATRIX *y3)
  274. {
  275. for(int i = 0; i < y1->get_m(); i++)
  276. for(int j = 0; j < y1->get_n(); j++)
  277. y3->mas[i][j] = y1->mas[i][j] - y2->mas[i][j];
  278. }
  279. double umn(MATRIX *y1, MATRIX *y3)
  280. {
  281. double k;
  282. cout << "Введите число: ";
  283. cin >> k;
  284. for(int i = 0; i < y1->get_m(); i++)
  285. for(int j = 0; j < y1->get_n(); j++)
  286. y3->mas[i][j] = k * y1->mas[i][j];
  287. return k;
  288. }
  289.  
  290. void vivod(MATRIX *y1, MATRIX *y2, ostream &sout)
  291. {
  292. for(int i = 0; i < y1->get_m(); i++)
  293. {
  294. if(i == y1->get_m() / 2)
  295. {
  296. sout << "A = ";
  297. }
  298. else
  299. {
  300. sout << " ";
  301. }
  302. for(int j = 0; j < y1->get_n(); j++)
  303. {
  304. sout << y1->mas[i][j] << ' ';
  305. }
  306. sout << " ";
  307.  
  308. if(i == y2->get_m() / 2)
  309. {
  310. sout << "B = ";
  311. }
  312. else
  313. {
  314. sout << " ";
  315. }
  316. for(int j = 0; j < y2->get_n(); j++)
  317. {
  318. sout << y2->mas[i][j] << ' ';
  319. }
  320. sout << endl;
  321. }
  322. sout << endl;
  323. }
  324.  
  325.  
  326.  
  327. void vivod(MATRIX *y1, VECTOR *y2, ostream &sout)
  328. {
  329. int rows = max(y1->m, y2->n);
  330.  
  331. for(int i = 0; i < rows; i++)
  332. {
  333. if(i == y1->get_m() / 2)
  334. {
  335. sout << "A = ";
  336. }
  337. else
  338. {
  339. sout << " ";
  340. }
  341. for(int j = 0; j < y1->get_n(); j++)
  342. {
  343. if(i < y1->m)
  344. sout << y1->mas[i][j] << ' ';
  345. else
  346. sout << " ";
  347. }
  348. sout << " ";
  349.  
  350. if(i == y2->n / 2)
  351. {
  352. sout << "B = ";
  353. }
  354. else
  355. {
  356. sout << " ";
  357. }
  358. sout << y2->vect[i] << ' ';
  359. sout << endl;
  360. }
  361. sout << endl;
  362. }
  363.  
  364.  
  365. void vivod(MATRIX *y1, MATRIX_SQ *y2, ostream &sout)
  366. {
  367. for(int i = 0; i < y1->get_m(); i++)
  368. {
  369. if(i == y1->get_m() / 2)
  370. {
  371. sout << "A = ";
  372. }
  373. else
  374. {
  375. sout << " ";
  376. }
  377. for(int j = 0; j < y1->get_n(); j++)
  378. {
  379. sout << y1->mas[i][j] << ' ';
  380. }
  381. sout << " ";
  382.  
  383. if(i == y2->get_n() / 2)
  384. {
  385. sout << "B = ";
  386. }
  387. else
  388. {
  389. sout << " ";
  390. }
  391. for(int j = 0; j < y2->get_n(); j++)
  392. {
  393. sout << y2->mas[i][j] << ' ';
  394. }
  395. sout << endl;
  396. }
  397. sout << endl;
  398. }
  399.  
  400.  
  401. void vivod_sum_raz(MATRIX *y1, MATRIX *y2, MATRIX *y3, int ch,ostream &sout)
  402. {
  403.  
  404. for(int i = 0; i < y1->get_m(); i++)
  405. {
  406. if(i == y1->get_m() / 2)
  407. {
  408. if(ch == 1)
  409. {
  410. sout << "A + B = ";
  411.  
  412. } else
  413. if(ch == 2)
  414. {
  415. sout << "A - B = ";
  416. }
  417. }
  418. else
  419. {
  420. sout << " ";
  421. }
  422. for(int j = 0; j < y2->get_n(); j++)
  423. {
  424. sout << y3->mas[i][j] << ' ';
  425. }
  426. sout << endl;
  427.  
  428. }
  429.  
  430. }
  431. void vivod_umn(MATRIX *y1, MATRIX *y3, double y,ostream &sout)
  432. {
  433. for(int i = 0; i < y1->get_m(); i++)
  434. {
  435. if(i == y1->get_m() / 2)
  436. {
  437. sout << y << " * A = ";
  438. }
  439. else
  440. {
  441. sout << " ";
  442. }
  443. for(int j = 0; j < y1->get_n(); j++)
  444. {
  445. sout << y3->mas[i][j] << ' ';
  446. }
  447. sout << endl;
  448. }
  449.  
  450. }
  451.  
  452. void vivod_pro(MATRIX *y1, MATRIX_SQ *y4, MATRIX *y5, ostream &sout)
  453. {
  454. for(int i = 0; i < y1->get_m(); i++)
  455. {
  456. if(i == y1->get_m() / 2)
  457. {
  458. sout << "B * A = ";
  459. }
  460. else
  461. {
  462. sout << " ";
  463. }
  464. for(int j = 0; j < y4->get_n(); j++)
  465. {
  466. sout << y5->mas[i][j] << ' ';
  467. }
  468. sout << endl;
  469. }
  470. }
  471.  
  472. void vivod_pro(VECTOR *y5, ostream &sout)
  473. {
  474. for(int i = 0; i < y5->n; i++)
  475. {
  476. if(i == y5->n / 2)
  477. {
  478. sout << "A * B = ";
  479. }
  480. else
  481. {
  482. sout << " ";
  483. }
  484. sout << y5->vect[i] << ' ';
  485. sout << endl;
  486. }
  487. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement