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