fork(1) download
  1. #include <cstring>
  2. #include <cassert>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <iomanip>
  6.  
  7. template <typename T>
  8. class MaTran;
  9.  
  10.  
  11. template <typename T>
  12. class MaTran
  13. {
  14. int soHang;
  15. int soCot;
  16. int kichThuoc;
  17. T *_data;
  18.  
  19. public:
  20. MaTran(int soHang, int soCot)
  21. : soHang(soHang), soCot(soCot),
  22. kichThuoc(soHang*soCot), _data(new T[kichThuoc])
  23. {}
  24.  
  25. MaTran(MaTran const &mt)
  26. : soHang(mt.soHang), soCot(mt.soCot),
  27. kichThuoc(mt.kichThuoc), _data(new T[kichThuoc])
  28. {
  29. std::memcpy(_data, mt._data, kichThuoc * sizeof(T));
  30. }
  31.  
  32. virtual ~MaTran() {
  33. if(_data) delete _data;
  34. }
  35.  
  36. // chồng toán tử =, dùng để gán ma trận
  37. MaTran& operator=(MaTran const &mt) {
  38. if (this != &mt) {
  39. soHang = mt.soHang;
  40. soCot = mt.soCot;
  41. kichThuoc = mt.kichThuoc;
  42. if (_data) delete _data;
  43. _data = new T[kichThuoc];
  44. std::memcpy(_data, mt._data, kichThuoc * sizeof(T));
  45. }
  46. return *this;
  47. }
  48.  
  49. // Toán tử xuất <<
  50. friend
  51. std::ostream& operator<<(std::ostream& os, MaTran<T> const &mt) {
  52. os << std::fixed << std::setprecision(2);
  53. for (int i=0;i<mt.soHang;i++) {
  54. os <<"\n\t";
  55. T const *hang = mt._data + i*mt.soCot;
  56. for(int j=0;j<mt.soCot;j++)
  57. os <<std::setw(5)<< hang[j] << ' ';
  58. }
  59. os << std::endl;
  60. return os;
  61. }
  62.  
  63. // Toán tử nhập >>
  64. friend
  65. std::istream& operator>>(std::istream& is, MaTran<T> &mt) {
  66. for (int i=0;i<mt.soHang;i++) {
  67. T *hang = mt._data + i*mt.soCot;
  68. for(int j=0;j<mt.soCot;j++) {
  69. if (&is == &std::cin)
  70. std::cout << "\tPhan tu[" << i + 1 << "," << j + 1 << "] = ";
  71. is >> hang[j];
  72. }
  73. }
  74. return is;
  75. }
  76.  
  77. // nạp chồng toán tử +=
  78. MaTran& operator+=(MaTran const &mt) {
  79. assert(soHang == mt.soHang && soCot == mt.soCot);
  80. for (int i = 0; i != kichThuoc; ++i) _data[i] += mt._data[i];
  81. return *this;
  82. }
  83.  
  84. // nap chồng toán tử +
  85. friend MaTran<T> operator+(MaTran<T> const &m1, MaTran<T> const &m2) {
  86. MaTran<T> tong = m1;
  87. tong += m2;
  88. return tong;
  89. }
  90.  
  91. // Làm tương tự với các phép -, *
  92.  
  93. // viết các hàm tính toán khác như chuyển vị, định thức, ...
  94. };
  95.  
  96.  
  97. int main() {
  98. MaTran<int> m1(3, 3), m2(3, 3);
  99. std::cin >> m1;
  100. std::cout << "m1 = " << m1 << '\n';
  101. std::cin >> m2;
  102. std::cout << "m2 = " << m2 << '\n';
  103.  
  104. std::cout << "MaTran<int> m3 = m1\n";
  105. MaTran<int> m3 = m1;
  106. std::cout << "m3 = " << m3 << '\n';
  107.  
  108. std::cout << "m3 += m2\n";
  109. m3 += m2;
  110. std::cout << "m3 = " << m3 << '\n';
  111.  
  112. std::cout << "m3 = m3 + m1 + m2\n";
  113. m3 = m3 + m1 + m2;
  114. std::cout << "m3 = " << m3 << '\n';
  115.  
  116. return 0;
  117. }
Success #stdin #stdout 0s 3280KB
stdin
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
stdout
	Phan tu[1,1] = 	Phan tu[1,2] = 	Phan tu[1,3] = 	Phan tu[2,1] = 	Phan tu[2,2] = 	Phan tu[2,3] = 	Phan tu[3,1] = 	Phan tu[3,2] = 	Phan tu[3,3] = m1 = 
	    1     2     3 
	    4     5     6 
	    7     8     9 

	Phan tu[1,1] = 	Phan tu[1,2] = 	Phan tu[1,3] = 	Phan tu[2,1] = 	Phan tu[2,2] = 	Phan tu[2,3] = 	Phan tu[3,1] = 	Phan tu[3,2] = 	Phan tu[3,3] = m2 = 
	    0     1     2 
	    3     4     5 
	    6     7     8 

MaTran<int> m3 = m1
m3 = 
	    1     2     3 
	    4     5     6 
	    7     8     9 

m3 += m2
m3 = 
	    1     3     5 
	    7     9    11 
	   13    15    17 

m3 = m3 + m1 + m2
m3 = 
	    2     6    10 
	   14    18    22 
	   26    30    34