#include <iostream>
#include <iomanip>
using namespace std;
class IntArray{
private:
int *p;
int size;
public:
IntArray(int n)
{
p=new int[n];
size=n;
}
~IntArray()
{
size=0;
delete[] p;
}
IntArray(IntArray& array1)
{
p=new int[array1.size];
size=array1.size;
for (int i=0;i<size;i++)
p[i]=array1.p[i];
}
IntArray& operator = (IntArray& array1)
{
int i,top;
if(size>array1.size)
top=array1.size;
else top=size;
for(i=0;i<top;i++)
p[i]=array1.p[i];
return *this;
}
int& operator[](int i)
{
int j;
j=i;
if(j<1) j=1;
if(j>size) j=size;
return p[j-1];
}
};
class IntTwoArray{
public:
int *p;
int lines,cols;
public:
IntTwoArray(int l,int c)
{
lines=l;
cols=c;
p=new int[lines*cols];
}
IntTwoArray()
{
lines=0;
cols=0;
}
~IntTwoArray()
{
lines=0;
cols=0;
delete[] p;
}
IntTwoArray(IntTwoArray& array1)
{
int i,j;
p=new int[array1.lines*array1.cols];
lines=array1.lines;
cols=array1.cols;
for (i=0;i<lines;i++)
for(j=0;j<cols;j++)
p[i*cols+j]=array1.p[i*array1.cols+j];
}
IntTwoArray& operator = (IntTwoArray& array1)
{
int i,j,topi,topj;
if(lines>array1.lines)
topi=array1.lines;
else topi=lines;
if(cols>array1.cols)
topj=array1.cols;
else topj=cols;
for(i=0;i<topi;i++)
for (j=0;j<topj;j++)
p[i*cols+j]=array1.p[i*array1.cols+j];
return *this;
}
int& operator()(int l,int c)
{
int l1,c1;
l1=l;
c1=c;
if(l1<1) l1=1;
if(l1>lines) l1=lines;
if(c1<1) c1=1;
if(c1>cols) c1=cols;
return p[(l1-1)*cols+c1-1];
}
IntTwoArray& Add(IntTwoArray &a,IntTwoArray &b)
{
int i,j;
lines=0;
cols=0;
if(a.lines==b.lines &&a.cols==b.cols) {
lines = a.lines;
cols=a.cols;
p=new int[lines*cols];
for(i=1;i<=lines;i++)
for(j=1;j<=cols;j++)
{
p[(i-1)*cols+j-1]=a.p[(i-1)*cols+j-1]+b.p[(i-1)*cols+j-1];
}
}
else cout << "这两个矩阵不可以相加" << endl;
return *this;
}
IntTwoArray& Mul(IntTwoArray &a,IntTwoArray &b)
{
int i=1,j=1,k=0;
lines=0;
cols=0;
if(a.cols==b.lines) {
lines = a.lines;
cols=b.cols;
p=new int[lines*cols];
for (i=0;i<lines*cols;i++)
p[i]=0;
for(i=1;i<=lines;i++)
for(j=1;j<=cols;j++)
{
for(k=0;k<a.cols;k++)
p[(i-1)*cols+j-1]= p[(i-1)*cols+j-1]+(a.p[(i-1)*a.cols+k])*(b.p[k*b.cols+j-1]);
}
}
else cout << "这两个矩阵不可以相乘" << endl;
return *this;
}
void assignment(int *a,int n)
{
int i;
for (i=0;i<n;i++)
p[i]=a[i];
}
void show() {
int i=0, j=0;
if (lines > 0 && cols > 0) {
for (i = 0; i < lines; i++) {
for (j = 0; j < cols; j++) {
cout << setw(7) << p[i * cols + j];
}
cout << endl;
}
//cout << endl;
}
else cout<<"该矩阵为空"<<endl;
}
};
int main() {
/* IntArray a(10),b(a),c(10);
c=a;
a[0]=100;
for (int i=-10;i<20;i++)
a[i] = i;
for(int i=-10;i<20;i++)
cout<<a[i]<<endl;
*/
/* IntTwoArray a(10,20),b(a),c(10,10);
a(1,5)=100;
int i,j;
for(i=0;i<22;i++) {
for (j = 0; j < 22; j++) {
a(i, j) = j;
cout << a(i, j) << " ";
}
cout << endl;
}
*/
IntTwoArray a1(2,3),a2(2,3),b(3,4),c1,c2,c3,c4;
int x1[6]={1,2,3,4,5,6};
int x2[12]={1,2,3,4,5,6,7,8,9,0,1,2};
a1.assignment(x1,6);
a2.assignment(x1,6);
b.assignment(x2,12);
cout<<"a1矩阵为:"<<endl;
a1.show();
cout<<"a2矩阵为:"<<endl;
a2.show();
cout<<"b矩阵为:"<<endl;
b.show();
cout<<"a1+a2="<<endl;
c1.Add(a1,a2);
c1.show();
cout<<"a1+b="<<endl;
c2.Add(a1,b);
c2.show();
cout<<"a1*b:"<<endl;
c3.Mul(a1,b);
c3.show();
cout<<"a1*a2:"<<endl;
c4.Mul(a1,a2);
c4.show();
return 0;
}