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