这次只用了最几本的三个测试数据:
测试一:
4 4 2
1 1 1
3 3 3
4 4 1
2 2 1
测试二:
3 3 3
1 1 10
3 1 -1
3 2 1
3 3 4
1 1 1
2 3 -1
3 1 1
3 3 -3
测试三:
5 5 6
1 2 5
1 5 6
2 5 6
4 2 7
4 5 8
5 3 6
5 5 11
1 2 5
1 4 7
1 5 9
2 4 7
2 5 9
3 1 6
3 4 8
3 5 8
4 1 7
4 2 12
5 4 67
标程如下:
#include <iostream>
#include <cstdio>
#include <iomanip> //setw函数头文件
using namespace std;
class term
{
public:
int row,col;
int value;
};
class SeqTriple
{
public:
SeqTriple(int msize = 1000);
~SeqTriple(){delete []trip;}
void transpose(SeqTriple &b)const;
void append(const term &t1);
void add(const SeqTriple &b,SeqTriple &c)const;
void sub(const SeqTriple &b,SeqTriple &c)const;
void mul(SeqTriple a,SeqTriple b,SeqTriple &c)const;
friend ostream & operator <<(ostream & out,const SeqTriple &x);
friend istream & operator >>(istream & in,SeqTriple &x);
int m,n;
int t;
term *trip;
int maxsize;
};
SeqTriple mat1, mat2, matsum, matsub, mattra, matmul;
SeqTriple::SeqTriple(int msize)
{
if(msize<1)
{
cout<<"you must make mistakes !"<<endl;
}
maxsize=msize;
trip=new term[maxsize];
t=m=n;
t++;
}
void SeqTriple::transpose(SeqTriple& B)const
{
int *num=new int[n]; int *k=new int[n];
B.m=n; B.n=m; B.t=t;
if (t>1){
for (int i=1; i<=n; i++) num[i]=0;
for (int i=1; i<=t; i++) num[trip[i].col]++;
k[1]=0;
for(int i=2; i<=n; i++) k[i]=k[i-1]+num[i-1];
for(int i=1; i<=t; i++) {
int j=k[trip[i].col]++;
j++;
B.trip[j].row=trip[i].col;
B.trip[j].col=trip[i].row;
B.trip[j].value=trip[i].value;
}
}
delete [] num; delete [] k;
}
void SeqTriple::append(const term &t1)
{
trip[t]=t1;
t++;
}
void SeqTriple::add(const SeqTriple &b,SeqTriple &c)const
{
if(m!=b.m||n!=b.n)
{
cout<<"you must make mistakes !"<<endl;
exit(1);
}
c.m=m;
c.n=n;
c.t=1;
int ct=1,cb=1;
while(ct<t&&cb<b.t)
{
int indt=trip[ct].row*n+trip[ct].col;
int indb=b.trip[cb].row*n+b.trip[cb].col;
if(indt<indb)
{
c.append(trip[ct]);
ct++;
}
else
{
if(indt==indb)
{
if(trip[ct].value+b.trip[cb].value)
{
term t3;
t3.row=trip[ct].row;
t3.col=trip[ct].col;
t3.value=trip[ct].value+b.trip[cb].value;
c.append(t3);
}
ct++;
cb++;
}
else
{
c.append(b.trip[cb]);
cb++;
}
}
}
for(;ct<=t;ct++)
c.append(trip[ct]);
for(;cb<=b.t;cb++)
c.append(b.trip[cb]);
c.t--;
}
void SeqTriple::sub(const SeqTriple &b,SeqTriple &c)const
{
if(m!=b.m||n!=b.n)
{
cout<<"you must make mistakes !"<<endl;
exit(1);
}
c.m=m;
c.n=n;
c.t=1;
int ct=1,cb=1;
while(ct<t&&cb<b.t)
{
int indt=trip[ct].row*n+trip[ct].col;
int indb=b.trip[cb].row*n+b.trip[cb].col;
if(indt<indb)
{
c.append(trip[ct]);
ct++;
}
else
{
if(indt==indb)
{
if(trip[ct].value-b.trip[cb].value)
{
term t3;
t3.row=trip[ct].row;
t3.col=trip[ct].col;
t3.value=trip[ct].value-b.trip[cb].value;
c.append(t3);
}
ct++;
cb++;
}
else
{
term t4;
t4.row=b.trip[cb].row;
t4.col=b.trip[cb].col;
t4.value=-(b.trip[cb].value);
c.append(t4);
cb++;
}
}
}
for(;ct<=t;ct++)
c.append(trip[ct]);
for(;cb<=b.t;cb++)
{ term t5;
t5.row=b.trip[cb].row;
t5.col=b.trip[cb].col;
t5.value=-(b.trip[cb].value);
c.append(t5);
}
c.t--;
}
//得到T[i][j]的值
int GetValue(SeqTriple T,int i,int j)
{
for(int k=1;k<=T.t;k++)
if(T.trip[k].row==i && T.trip[k].col==j)
return T.trip[k].value;
return 0;
}
void SeqTriple::mul(SeqTriple a,SeqTriple b,SeqTriple &c)const
{
int sum=0, p=1;
for(int i=1;i<=a.m;i++)
for(int j=1;j<=b.n;j++)
{
sum=0;
for(int k=1;k<=a.n;k++)
sum+= GetValue(a,i,k)*GetValue(b,k,j);
if(sum!=0)
{
c.trip[p].row=i;
c.trip[p].col=j;
c.trip[p].value=sum;
p++;
}
}
c.m=a.m;
c.n=b.n;
c.t=p-1;
}
//矩阵输出,不允许修改
ostream & operator <<(ostream &out,const SeqTriple &x)
{
out<<"rows = "<<x.m <<endl;
cout<<"cols = "<<x.n<<endl;
out<<"numterms = "<<x.t<<endl;
int i,j,k,flag=1;
for(i=1; i<=x.m; i++)
{
cout<<"|"<<setw(6);
for(j=1; j<=x.n; j++)
{
for(k=1; k<=x.t; k++)
if(i==x.trip[k].row&&j==x.trip[k].col)
{
cout<<x.trip[k].value<<setw(6);
flag=0;
}
if(flag) cout<<"0"<<setw(6);
flag=1;
}
cout<<"|"<<endl;
}
return out;
}
//矩阵输入,不允许修改
istream & operator >>(istream &in, SeqTriple &x)
{
cout<<"enter number of rows,columns,and terms ! "<<endl;
in>>x.m>>x.n>>x.t;
if(x.t>x.maxsize)
{
cout<<"you must make mistakes !"<<endl;
}
for(int i=1;i<=x.t;i++)
{
cout<<"enter row,columns and value of term : "<<i<<endl;
in>>x.trip[i].row>>x.trip[i].col>>x.trip[i].value;
}
return in;
}
//主函数,不允许修改
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
cin>>mat1>>mat2;
mat1.add(mat2,matsum);
cout<<"the sum of mat1,mat2:"<<endl;
cout<<matsum<<endl;
mat1.sub(mat2,matsub);
cout<<"the sub of mat1,mat2:"<<endl;
cout<<matsub<<endl;
cout<<"the transpose of mat1:"<<endl;
mat1.transpose(mattra);
cout<<mattra<<endl;
//上机作业不要求实现,所以注释掉,课后作业时把乘法实现后把相应注释去掉
cout<<"the mul of mat1,mat3:"<<endl;
mat1.mul(mat1, mat2, matmul);
cout<<matmul<<endl;
return 0;
}
下面是做的比较好的同学的代码:
苏航同学:
#include <iostream>
#include <fstream>
#include <cstdio>
#include <iomanip>
using namespace std;
class term
{
public:
int row,col;
int value;
};
class SeqTriple
{
public:
SeqTriple(int msize = 1000);
~SeqTriple(){delete []trip;}
void transpose(SeqTriple &b)const;
void append(const term &t1);
void add(const SeqTriple &b,SeqTriple &c)const;
void sub(const SeqTriple &b,SeqTriple &c)const;
void mul(SeqTriple a,SeqTriple b,SeqTriple &c)const;
friend ostream & operator <<(ostream & out,const SeqTriple &x);
friend istream & operator >>(istream & in,SeqTriple &x);
int m,n;
int t;
term *trip;
int maxsize;
};
SeqTriple mat1, mat2, matsum, matsub, mattra, matmul;
SeqTriple::SeqTriple(int msize)
{
if(msize<1)
{
cout<<"you must make mistakes !"<<endl;
}
maxsize=msize;
trip=new term[maxsize];
t=m=n;
t++;
}
//矩阵转置 --上机作业
void SeqTriple::transpose(SeqTriple& B)const
{
long **array3d = new long*[this->m];
for(int i=0;i<this->m;i++)
{
*(array3d+i) = new long[n];
}
for(int i=0;i<this->m;i++)
for(int j=0;j<this->n;j++)
array3d[i][j] = 0;
for(int i=1;i<=this->t;i++)
array3d[this->trip[i].row-1][this->trip[i].col-1] = this->trip[i].value;
B.m = this->n; B.n = this->m; B.t = this->t;
int total = 1;
for(int j=0;j<B.m;j++)
for(int i=0;i<B.n;i++)
if(array3d[i][j]!=0)
{
B.trip[total].row = j+1;
B.trip[total].col = i+1;
B.trip[total++].value = array3d[i][j];
}
}
//矩阵加法 --上机作业
void SeqTriple::add(const SeqTriple &b,SeqTriple &c)const
{
long **array3d = new long*[b.m];
for(int i=0;i<b.m;i++)
{
*(array3d+i) = new long[b.n];
}
for(int i=0;i<b.m;i++)
for(int j=0;j<b.n;j++)
array3d[i][j] = 0;
for(int i=1;i<=this->t;i++)
array3d[this->trip[i].row-1][this->trip[i].col-1] = this->trip[i].value;
for(int i=1;i<=b.t;i++)
array3d[b.trip[i].row-1][b.trip[i].col-1] += b.trip[i].value;
int total = 1;
int t_t = 0;
for(int i=0;i<b.m;i++)
for(int j=0;j<b.n;j++)
if(array3d[i][j]!=0)
t_t++;
c.m = b.m; c.n = b.n; c.t = t_t;
for(int i=0;i<b.m;i++)
for(int j=0;j<b.n;j++)
if(array3d[i][j]!=0)
{
matsum.trip[total].row = i+1;
matsum.trip[total].col = j+1;
matsum.trip[total++].value = array3d[i][j];
}
}
//矩阵减法 --上机作业
void SeqTriple::sub(const SeqTriple &b,SeqTriple &c)const
{
long **array3d = new long*[b.m];
for(int i=0;i<b.m;i++)
*(array3d+i) = new long[b.n];
for(int i=0;i<b.m;i++)
for(int j=0;j<b.n;j++)
array3d[i][j] = 0;
for(int i=1;i<=this->t;i++)
array3d[this->trip[i].row-1][this->trip[i].col-1] = this->trip[i].value;
for(int i=1;i<=b.t;i++)
array3d[b.trip[i].row-1][b.trip[i].col-1] -= b.trip[i].value;
int total = 1;
int t_t = 0;
for(int i=0;i<b.m;i++)
for(int j=0;j<b.n;j++)
if(array3d[i][j]!=0)
t_t++;
c.m = b.m; c.n = b.n; c.t = t_t;
for(int i=0;i<b.m;i++)
for(int j=0;j<b.n;j++)
if(array3d[i][j]!=0)
{
c.trip[total].row = i+1;
c.trip[total].col = j+1;
c.trip[total++].value = array3d[i][j];
}
}
void SeqTriple::mul(SeqTriple a,SeqTriple b,SeqTriple &c)const
{
long **array3d = new long*[a.m];
for(int i=0;i<a.m;i++)
*(array3d+i) = new long[a.n];
for(int i=0;i<a.m;i++)
for(int j=0;j<a.n;j++)
array3d[i][j] = 0;
for(int i=1;i<=a.t;i++)
array3d[a.trip[i].row-1][a.trip[i].col-1] = a.trip[i].value;
long **array3d2 = new long*[b.m];
for(int i=0;i<b.m;i++)
*(array3d2+i) = new long[b.n];
for(int i=0;i<b.m;i++)
for(int j=0;j<b.n;j++)
array3d2[i][j] = 0;
for(int i=1;i<=b.t;i++)
array3d2[b.trip[i].row-1][b.trip[i].col-1] = b.trip[i].value;
long **array3d3 = new long*[a.m];
for(int i=0;i<a.m;i++)
*(array3d3+i) = new long[b.n];
for(int i=0;i<a.m;i++)
for(int j=0;j<b.n;j++)
array3d3[i][j] = 0;
for(int i=0;i<a.m;i++)
{
for(int j=0;j<b.n;j++)
{
int multi = 0;
for(int w=0;w<a.n;w++)
{
multi += (array3d[i][w] * array3d2[w][j]);
}
array3d3[i][j] = multi;
}
}
int oth_t = 0;
for(int i=0;i<a.m;i++)
{
for(int j=0;j<b.n;j++)
{
if(array3d3[i][j]!=0)
oth_t++;
}
}
c.m = a.m; c.n = b.n; c.t = oth_t;
oth_t = 1;
for(int i=0;i<a.m;i++)
{
for(int j=0;j<b.n;j++)
{
if(array3d3[i][j]!=0)
{
c.trip[oth_t].row = i+1;
c.trip[oth_t].col = j+1;
c.trip[oth_t++].value = array3d3[i][j];
}
}
}
}
//矩阵输出,不允许修改
ostream & operator <<(ostream &out,const SeqTriple &x)
{
out<<"rows = "<<x.m <<endl;
out<<"cols = "<<x.n<<endl;
out<<"numterms = "<<x.t<<endl;
int i,j,k,flag=1;
for(i=1; i<=x.m; i++)
{
cout<<"|"<<setw(6);
for(j=1; j<=x.n; j++)
{
for(k=1; k<=x.t; k++)
if(i==x.trip[k].row&&j==x.trip[k].col)
{
cout<<x.trip[k].value<<setw(6);
flag=0;
}
if(flag) cout<<"0"<<setw(6);
flag=1;
}
cout<<"|"<<endl;
}
return out;
}
//矩阵输入,不允许修改
istream & operator >>(istream &in, SeqTriple &x)
{
cout<<"enter number of rows,columns,and terms ! "<<endl;
in>>x.m>>x.n>>x.t;
if(x.t>x.maxsize)
{
cout<<"you must make mistakes !"<<endl;
}
for(int i=1;i<=x.t;i++)
{
cout<<"enter row,columns and value of term : "<<i<<endl;
in>>x.trip[i].row>>x.trip[i].col>>x.trip[i].value;
}
return in;
}
//主函数,不允许修改
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
cin>>mat1>>mat2;
mat1.add(mat2,matsum);
cout<<"the sum of mat1,mat2:"<<endl;
cout<<matsum<<endl;
mat1.sub(mat2,matsub);
cout<<"the sub of mat1,mat2:"<<endl;
cout<<matsub<<endl;
cout<<"the transpose of mat1:"<<endl;
mat1.transpose(mattra);
cout<<mattra<<endl;
cout<<"the mul of mat1,mat3:"<<endl;
mat1.mul(mat1, mat2, matmul);
cout<<matmul<<endl;
return 0;
}
王欣培同学
#include <iostream>
#include <cstdio>
#include <iomanip> //setw函数头文件
using namespace std;
class term
{
public:
int row,col;
int value;
};
class SeqTriple
{
public:
SeqTriple(int msize = 1000);
~SeqTriple(){delete []trip;}
void transpose(SeqTriple &b)const;
void append(const term &t1);
void add(const SeqTriple &b,SeqTriple &c)const;
void sub(const SeqTriple &b,SeqTriple &c)const;
void mul(SeqTriple a,SeqTriple b,SeqTriple &c)const;
friend ostream & operator <<(ostream & out,const SeqTriple &x);
friend istream & operator >>(istream & in,SeqTriple &x);
int m,n;
int t;
term *trip;
int maxsize;
};
SeqTriple mat1, mat2, matsum, matsub, mattra, matmul;
SeqTriple::SeqTriple(int msize)
{
if(msize<1)
{
cout<<"you must make mistakes !"<<endl;
}
maxsize=msize;
trip=new term[maxsize];
t=m=n;
t++;
}
//矩阵转置 --上机作业
void SeqTriple::transpose(SeqTriple& B)const
{
B.m=this->m;
B.n=this->n;
B.t=this->t;
for(int i=1;i<=this->t;i++)
{
B.trip[i].row=this->trip[i].col;
B.trip[i].col=this->trip[i].row;
B.trip[i].value=this->trip[i].value;
}
}
//矩阵加法 --上机作业
void SeqTriple::add(const SeqTriple &b,SeqTriple &c)const
{
c.m=this->m;
c.n=this->n;
c.t=0;
for(int i=1;i<=this->m;i++)
for(int j=1;j<=this->n;j++)
{
bool bo=true;
for(int k=1;k<=this->t;k++)
{
if(i==this->trip[k].row && j==this->trip[k].col)
{
c.t++;
c.trip[c.t].row=this->trip[k].row;
c.trip[c.t].col=this->trip[k].col;
c.trip[c.t].value=this->trip[k].value;
bo=false;
}
}
for(int l=1;l<=b.t;l++)
{
if(i==b.trip[l].row && j==b.trip[l].col)
{
if(bo)
{
c.t++;
c.trip[c.t].row=b.trip[l].row;
c.trip[c.t].col=b.trip[l].col;
c.trip[c.t].value=b.trip[l].value;
}
else
{
c.trip[c.t].value+=b.trip[l].value;
}
}
}
}
for(int i=1;i<=c.t;i++)
{
if(c.trip[i].value==0)
{
for(int j=i;j<c.t;j++)
{
c.trip[j].row=c.trip[j+1].row;
c.trip[j].col=c.trip[j+1].col;
c.trip[j].value=c.trip[j+1].value;
}
c.t--;
i--;
}
}
}
//矩阵减法 --上机作业
void SeqTriple::sub(const SeqTriple &b,SeqTriple &c)const
{
c.m=this->m;
c.n=this->n;
c.t=0;
for(int i=1;i<=this->m;i++)
for(int j=1;j<=this->n;j++)
{
bool bo=true;
for(int k=1;k<=this->t;k++)
{
if(i==this->trip[k].row && j==this->trip[k].col)
{
c.t++;
c.trip[c.t].row=this->trip[k].row;
c.trip[c.t].col=this->trip[k].col;
c.trip[c.t].value=this->trip[k].value;
bo=false;
}
}
for(int l=1;l<=b.t;l++)
{
if(i==b.trip[l].row && j==b.trip[l].col)
{
if(bo)
{
c.t++;
c.trip[c.t].row=b.trip[l].row;
c.trip[c.t].col=b.trip[l].col;
c.trip[c.t].value=-b.trip[l].value;
}
else
{
c.trip[c.t].value-=b.trip[l].value;
}
}
}
}
for(int i=1;i<=c.t;i++)
{
if(c.trip[i].value==0)
{
for(int j=i;j<c.t;j++)
{
c.trip[j].row=c.trip[j+1].row;
c.trip[j].col=c.trip[j+1].col;
c.trip[j].value=c.trip[j+1].value;
}
c.t--;
i--;
}
}
}
//矩阵乘法 ---课后作业
//上机作业不要求实现,所以注释掉,课后作业时把乘法实现后把相应注释去掉
void SeqTriple::mul(SeqTriple a,SeqTriple b,SeqTriple &c)const
{
c.m=this->m;
c.n=b.n;
c.t=0;
int sum=0;
int A[m*n+1],B[m*n+1];
for(int i=1;i<=m*n;i++)
{
A[i]=B[i]=0;
}
for(int i=1;i<=this->t;i++)
{
A[(this->trip[i].row-1)*n+this->trip[i].col]=this->trip[i].value;
}
for(int i=1;i<=b.t;i++)
{
B[(b.trip[i].col-1)*m+b.trip[i].row]=b.trip[i].value;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=this->n;k++)
{
sum=sum+A[(i-1)*n+k]*B[(j-1)*m+k];
}
c.t++;
c.trip[c.t].row=i;
c.trip[c.t].col=j;
c.trip[c.t].value=sum;
sum=0;
}
}
for(int i=1;i<=c.t;i++)
{
if(c.trip[i].value==0)
{
for(int j=i;j<c.t;j++)
{
c.trip[j].row=c.trip[j+1].row;
c.trip[j].col=c.trip[j+1].col;
c.trip[j].value=c.trip[j+1].value;
}
c.t--;
i--;
}
}
a.trip=new term;
b.trip=new term;
}
//矩阵输出,不允许修改
ostream & operator <<(ostream &out,const SeqTriple &x)
{
out<<"rows = "<<x.m <<endl;
cout<<"cols = "<<x.n<<endl;
out<<"numterms = "<<x.t<<endl;
int i,j,k,flag=1;
for(i=1; i<=x.m; i++)
{
cout<<"|"<<setw(6);
for(j=1; j<=x.n; j++)
{
for(k=1; k<=x.t; k++)
if(i==x.trip[k].row&&j==x.trip[k].col)
{
cout<<x.trip[k].value<<setw(6);
flag=0;
}
if(flag) cout<<"0"<<setw(6);
flag=1;
}
cout<<"|"<<endl;
}
return out;
}
//矩阵输入,不允许修改
istream & operator >>(istream &in, SeqTriple &x)
{
cout<<"enter number of rows,columns,and terms ! "<<endl;
in>>x.m>>x.n>>x.t;
if(x.t>x.maxsize)
{
cout<<"you must make mistakes !"<<endl;
}
for(int i=1;i<=x.t;i++)
{
cout<<"enter row,columns and value of term : "<<i<<endl;
in>>x.trip[i].row>>x.trip[i].col>>x.trip[i].value;
}
return in;
}
//主函数,不允许修改
int main()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
cin>>mat1>>mat2;
mat1.add(mat2,matsum);
cout<<"the sum of mat1,mat2:"<<endl;
cout<<matsum<<endl;
mat1.sub(mat2,matsub);
cout<<"the sub of mat1,mat2:"<<endl;
cout<<matsub<<endl;
cout<<"the transpose of mat1:"<<endl;
mat1.transpose(mattra);
cout<<mattra<<endl;
//上机作业不要求实现,所以注释掉,课后作业时把乘法实现后把相应注释去掉
cout<<"the mul of mat1,mat3:"<<endl;
mat1.mul(mat1, mat2, matmul);
cout<<matmul<<endl;
return 0;
}
此次上机做的不算很理想,只有四十几个同学有分数,其余的都是0分,希望同学们对照测试数据好好看看。。
----阿伦