1 : /* íïäåìéòï÷áîéå íáôòéã òáúíåòá äï 255X255: 2 : óïúäáîéå íáôòéþîïê áìçåâòù. á÷ôïò - ìéäï÷óëéê ÷.÷., 1999. */ 3 : #include <cstdlib> 4 : #include <iostream> 5 : 6 : using namespace std; 7 : 8 : void halt(int ErrNo) { 9 : cout << "ïÛÉÂËÁ: ÐÏÐÙÔËÁ ×ÙÐÏÌÎÉÔØ ÎÅÄÏÐÕÓÔÉÍÕÀ ÏÐÅÒÁÃÉÀ.\n"; 10 : exit(ErrNo); 11 : } 12 : 13 : class Array { 14 : int **p; 15 : public: 16 : unsigned char HSize, VSize; 17 : Array(unsigned char, unsigned char); 18 : Array(const Array&); 19 : int* operator[](unsigned char) const; 20 : Array& operator=(const Array&); 21 : Array& operator=(int*); 22 : Array& operator+=(const Array&); 23 : Array operator+(Array) const; 24 : Array operator-() const; 25 : Array operator-(Array) const; 26 : Array operator*(const Array&) const; 27 : Array operator*(int) const; 28 : friend Array operator*(int, Array); 29 : ~Array(); 30 : }; 31 : 32 : Array::Array(unsigned char n, unsigned char m) { 33 : VSize = n; 34 : HSize = m; 35 : p = new int*[VSize]; 36 : for (int i = 0; i < VSize; i++) 37 : p[i] = new int[HSize]; 38 : } 39 : 40 : Array::Array(const Array& Data) { 41 : HSize = Data.HSize; 42 : VSize = Data.VSize; 43 : p = new int*[VSize]; 44 : for (int i = 0; i < Data.VSize; i++) { 45 : p[i] = new int[Data.HSize]; 46 : for (int j = 0; j < Data.HSize; j++) 47 : p[i][j] = Data.p[i][j]; 48 : } 49 : } 50 : 51 : Array::~Array() { 52 : for (int i = 0; i < VSize; i++) 53 : delete [](p[i]); 54 : delete []p; 55 : } 56 : 57 : int* Array::operator[](unsigned char i) const { 58 : if (i >= VSize) 59 : halt(2); 60 : return p[i]; 61 : } 62 : 63 : Array& Array::operator=(int* InitData) { 64 : for (int i = 0; i < VSize; i++) 65 : for (int j = 0; j < HSize; j++) 66 : p[i][j] = InitData[i*HSize + j]; 67 : return *this; 68 : } 69 : 70 : Array& Array::operator=(const Array& Data) { 71 : if (VSize == Data.VSize && HSize == Data.HSize) 72 : for (int i = 0; i < VSize; i++) 73 : for (int j = 0; j < HSize; j++) 74 : p[i][j] = Data.p[i][j]; 75 : else 76 : halt(1); 77 : return *this; 78 : } 79 : 80 : Array Array::operator-() const { 81 : Array T(*this); 82 : for (int i = 0; i < VSize; i++) 83 : for (int j=0; j < HSize; j++) 84 : T.p[i][j] = -p[i][j]; 85 : return T; 86 : } 87 : 88 : Array& Array::operator+=(const Array& Data) { 89 : if (VSize == Data.VSize && HSize == Data.HSize) 90 : for (int i = 0; i < VSize; i++) 91 : for (int j = 0; j < HSize; j++) 92 : p[i][j] += Data.p[i][j]; 93 : else 94 : halt(1); 95 : return *this; 96 : } 97 : 98 : Array Array::operator+(Array Data) const { 99 : if (VSize == Data.VSize && HSize == Data.HSize) 100 : for (int i = 0; i < VSize; i++) 101 : for (int j = 0; j < HSize; j++) 102 : Data.p[i][j] += p[i][j]; 103 : else 104 : halt(1); 105 : return Data; 106 : } 107 : 108 : Array Array::operator-(Array Data) const { 109 : if (VSize == Data.VSize && HSize == Data.HSize) 110 : for (int i = 0; i < VSize; i++) 111 : for (int j = 0; j < HSize; j++) 112 : Data.p[i][j] = p[i][j] - Data.p[i][j]; 113 : return Data; 114 : } 115 : 116 : Array Array::operator*(const Array& Data) const { 117 : Array T(VSize, Data.HSize); 118 : if (HSize == Data.VSize) 119 : for (int i = 0; i < T.VSize; i++) 120 : for (int j = 0; j < T.HSize; j++) { 121 : T.p[i][j] = 0; 122 : for (int k = 0; k < HSize; k++) 123 : T.p[i][j] += p[i][k]*Data.p[k][j]; 124 : } 125 : else 126 : halt(1); 127 : return T; 128 : } 129 : 130 : Array Array::operator*(int k) const { 131 : Array T(VSize,HSize); 132 : for (int i = 0; i < VSize; i++) 133 : for (int j = 0; j < HSize; j++) 134 : T.p[i][j] = k*p[i][j]; 135 : return T; 136 : } 137 : 138 : Array operator*(int k, Array Data) { 139 : for (int i = 0; i < Data.VSize; i++) 140 : for (int j = 0; j < Data.HSize; j++) 141 : Data.p[i][j] *= k; 142 : return Data; 143 : } 144 : 145 : ostream& operator<<(ostream& s, const Array& Data) { 146 : s << endl; 147 : for (int i = 0; i < Data.VSize; i++) { 148 : for (int j = 0; j < Data.HSize; j++) 149 : s << '\t' << Data[i][j]; 150 : s << endl; 151 : } 152 : s << endl; 153 : return s; 154 : } 155 : 156 : void main() { 157 : Array A(3,3), B(3,3), C(3,2), D(3,3), E(3,3), G(2,3); 158 : { 159 : int data[] = {0,1,2,3,4,3,2,1,0}; 160 : B = A = data; 161 : C = data + 2; 162 : G = data + 3; 163 : } 164 : Array F(A); 165 : for (int i = 0; i < 3; i++) 166 : for (int j = 0; j < 3; j++) 167 : E[i][j] = i == j; 168 : B += E; 169 : D = F - E; 170 : C[2][1] = -5; 171 : D = -(A*A - 4*B*C*G + E*12)*D; 172 : cout << "A = F =" << A << "B = " << B << "C = " << C << "G =" << G 173 : << "D = -(A*A - 4*B*C*G + E*12)*D = " << D; 174 : return 0; 175 : } // D = -(A*A - 4*B*C*G + E*12)*D = 176 : // 579 600 435 177 : // 1836 2346 2052 178 : // 563 760 707