南京理工大学C++课程设计.docx
《南京理工大学C++课程设计.docx》由会员分享,可在线阅读,更多相关《南京理工大学C++课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
南京理工大学C++课程设计
C++课程设计实验报告
姓名陈国杭学号915104330113班级9151043301任课教师赵琦时间3月
选择题目矩阵转置及乘法运算难易级别A级
实验报告成绩
一、程序功能简介
该程序定义了一个向量类,里面的元素是模板形式,定义了有关向量类的各种属性、方法及运算符重载函数。
二、课程设计要求和目的
1.利用已知的向量类对象定义一个矩阵类,矩阵类的数据是向量子对象,同样定义矩阵类的各种属性、方法及运算符重载函数。
2.完善成员函数,使矩阵可以由文件输入,具体的输入格式自己规定。
3.完善矩阵的赋值、转置、乘法等运算,要求用整形矩阵和浮点型矩阵分别演算。
4.更改main函数结构,可由用户选择输入矩阵数据的方法,程序可以连续运行,知道选择退出为止。
三、课程设计中要解决的问题分析和调试
1.源程序只给出了菜单的样式,及函数类的格式。
2.运算符重载函数要重新熟练。
3.引用的头文件(输入输出流)(filestream)(数学常用库函数)(提供一些函数与符号常量)(string类)。
4.添加人性化界面,初始运行程序时加了一个友好的界面,并附带输出了自己的姓名和学号,选择退出时,亦有特别字样。
5.在主函数中调用read()函数,通过read()中读取外部文件,但会内存错误(已解决,行和列的未定义。
)。
5.在进行四种不同的运算时均会询问输入方式,main函数利用switch函数进行主菜单的编辑。
6.在矩阵输入中增加错误判断的功能,防止输入错误导致程序无法进行。
7.程序中若输入的矩阵无法求逆,或者无法进行乘法,会直接退出程序,亟待解决
四、源程序结构流程框图与说明
6、源程序代码以及草稿原件
#include
#include
#include
#include
#include
usingnamespacestd;
template//模板函数
classCMatrix
{
introw;
intcol;
T**a;
public:
CMatrix();//构造函数√
CMatrix(intr,intc);
CMatrix(constCMatrix&src);//拷贝构造函数√
~CMatrix();//析构函数√
CMatrix&operator=(constCMatrix&);
CMatrixzhuanzhi();//转置函数√
CMatrixqiuni();//求逆矩阵√
CMatrixoperator*(constCMatrix&m)const;//矩阵的乘法√
CMatrixshucheng(doublenum);//矩阵数乘√
CMatrixread(char*fileName);//从文件输入√
voidinput();//从键盘输入√
voidshow();//显示矩阵√
};
template
CMatrix:
:
CMatrix()
{
row=0;
col=0;
a=NULL;
}//构造函数
template
CMatrix:
:
CMatrix(intr,intc)
{
row=r;
col=c;
inti,j;
a=newT*[r];
for(i=0;ia[i]=newT[c];
for(i=0;ifor(j=0;j
a[i][j]=0.0;
}//将数组归零
template
CMatrix:
:
CMatrix(constCMatrix&m)//拷贝
{
row=m.row;
col=m.col;
inti,j;
a=newT*[row];//动态建立二维数组
for(i=0;ia[i]=newT[col];
for(i=0;ifor(j=0;j
a[i][j]=m.a[i][j];
}
template
CMatrix:
:
~CMatrix()//析构
{
for(inti=0;idelete[]a[i];
delete[]a;
}
template
CMatrix&CMatrix:
:
operator=(constCMatrix&m)//等于
{
for(inti=0;idelete[]a[i];
delete[]a;
row=m.row;
col=m.col;
a=newC*[row];
for(inti=0;ifor(intj=0;j
a[i][j]=m.a[i][j];
return*this;
}
template
CMatrixCMatrix:
:
zhuanzhi()//转置
{
CMatrixm(col,row);
for(inti=0;ifor(intj=0;j
m.a[j][i]=a[i][j];
returnm;
}
template
CMatrixCMatrix:
:
qiuni()
{
CMatrixs(1,1);
s.a[0][0]=0;
if(row!
=col)
{
cout<<"输入的矩阵没有逆矩阵。
\n"<returns;
}
;
CMatrixt(row,col);
CMatrixn(row,col);
inti,j,k;
floatmax,temp;
for(i=0;i{
for(j=0;j
{
t.a[i][j]=a[i][j];
}
}
for(i=0;i{
for(j=0;j
{
n.a[i][j]=(i==j)?
1:
0;
}
}
for(i=0;i{
max=t.a[i][i];
k=i;
for(j=i+1;j
{
if(fabs(t.a[j][i])>fabs(max))
{
max=t.a[j][i];
k=j;
}
}
if(k!
=i)
{
for(j=0;j
{
temp=t.a[i][j];
t.a[i][j]=t.a[k][j];
t.a[k][j]=temp;
temp=n.a[i][j];
n.a[i][j]=n.a[k][j];
n.a[k][j]=temp;
}
}
if(t.a[i][i]==0)
{
cout<<"输入的矩阵没有逆矩阵。
\n";
returns;
}
temp=t.a[i][i];
for(j=0;j
{
t.a[i][j]=t.a[i][j]/temp;
n.a[i][j]=n.a[i][j]/temp;
}
for(j=0;j
{
if(j!
=i)
{
temp=t.a[j][i];
for(k=0;k
{
t.a[j][k]=t.a[j][k]-t.a[i][k]*temp;
n.a[j][k]=n.a[j][k]-n.a[i][k]*temp;
}
}
}
}
returnn;
}
template
CMatrixCMatrix:
:
operator*(constCMatrix&m)const//重载乘法
{
CMatrixs(1,1);
s.a[0][0]=0;
CMatrixn(row,m.col);
if(col!
=m.row)
{
returns;
}
for(inti=0;ifor(intj=0;j{
for(intk=0;k
{
n.a[i][j]+=a[i][k]*m.a[k][j];
}
}//题目所给的矩阵乘法算法
returnn;
}
template
CMatrixCMatrix:
:
shucheng(doublenum)//数乘
{
CMatrixb(row,col);
for(inti=0;ifor(intj=0;j
b.a[i][j]=a[i][j]*num;
returnb;
}
template
CMatrixCMatrix:
:
read(char*fileName)//从文件输入
{
ifstreaminfile;
infile.open(fileName);
Loop:
if(!
infile)
{
infile.close();
cout<<"不能打开该文件"<cout<<"再次输入文件名:
";
cin>>fileName;
infile.clear();
infile.open(fileName);gotoLoop;//防止多次输错
}
introw;intcol;
infile>>row>>col;
CMatrixm(row,col);//通过文件前两个数字作为行、列
doublez;
inti=0,j=0;
while(infile>>z)
{
m.a[i][j]=z;
if((j+1)%col==0)
{
j=0;
i+=1;
}//定义何时换行
elsej+=1;
}
infile.close();
returnm;
}
template
voidCMatrix:
:
input()//键盘输入矩阵
{
for(inti=0;ifor(intj=0;j
cin>>a[i][j];
}
template
voidCMatrix:
:
show()//显示矩阵
{
for(inti=0;i{
for(intj=0;j
{
cout<}
cout<}
}
intmain()
{
intx,y;
cout<<"*********************欢迎使用矩阵计算器*********************"<cout<<"制作者:
陈国杭学号:
915104330113"<cout<<"主菜单"<cout<<"1.计算矩阵的转置"<cout<<"2.计算矩阵的逆"<cout<<"3.计算矩阵的乘法"<cout<<"4.计算矩阵的数乘"<cout<<"5.退出菜单"<cout<qing:
cout<<"请选择一种正确的运算:
";
while(cin>>x)
{
if(x==5){cout<<"欢迎再次使用"<elseif(x>5||x<1){cout<<"输入错误,请重新输入!
"<cout<cout<<"1.文件输入"<cout<<"2.键盘输入"<cout<yxiu:
cout<<"请选择正确的输入方式:
";
cin>>y;
if(y!
=1&&y!
=2){cout<<"输入错误,请重新输入!
"<cout<switch(x)
{
case1:
{
if(y==1)
{
charfilename[256];
cout<<"请输入文件名:
";
cin>>filename;
cout<CMatrixm1;
CMatrixm2=m1.read(filename);
CMatrixm3=m2.zhuanzhi();
cout<<"原矩阵的转置矩阵为:
\n";
m3.show();
}
if(y==2)
{
inth,l;
cout<<"请输入矩阵的行:
";
cin>>h;
cout<<"请输入矩阵的列:
";
cin>>l;
cout<<"请依次输入矩阵的值:
";
CMatrixm1(h,l);
m1.input();
CMatrixm2=m1.zhuanzhi();
cout<cout<<"原矩阵的转置矩阵为:
\n";
m2.show();
}
};
break;
case2:
{
if(y==1)
{
charfilename[256];
cout<<"请输入文件名:
";
cin>>filename;
cout<CMatrixm1;
CMatrixm2=m1.read(filename);
CMatrixm3=m2.qiuni();
cout<<"原矩阵的逆矩阵为:
\n";
m3.show();
}
if(y==2)
{
inth,l;
cout<<"请输入矩阵的行:
";
cin>>h;
cout<<"请输入矩阵的列:
";
cin>>l;
cout<<"请依次输入矩阵的值:
";
CMatrixm1(h,l);
m1.input();
CMatrixm2=m1.qiuni();
cout<cout<<"原矩阵的逆矩阵为:
\n";
m2.show();
}
};
break;
case3:
{
if(y==1)
{
charfilename1[256];
cout<<"请输入文件名:
";
cout<<"第一个矩阵\t";
cin>>filename1;
cout<CMatrixm1;
CMatrixm2=m1.read(filename1);
cout<charfilename2[256];
cout<<"请输入文件名:
";
cout<<"第二个矩阵\t";
cin>>filename2;
cout<CMatrixm3;
CMatrixm4=m3.read(filename2);
cout<CMatrixm5=m2*m4;
cout<<"两个矩阵相乘结果为:
\n";
m5.show();
}
if(y==2)
{
inth1,l1,h2,l2;
cout<cout<<"请输入第一个矩阵的行:
";
cin>>h1;
cout<<"请输入第一个矩阵的列:
";
cin>>l1;
cout<<"请依次输入第一个矩阵的值:
";
CMatrixm1(h1,l1);
m1.input();
cout<cout<<"请输入第二个矩阵的行:
";
cin>>h2;
cout<<"请输入第二个矩阵的列:
";
cin>>l2;
if(l1!
=h2){cout<<"两矩阵不能相乘。
\n"<cout<<"请依次输入第二个矩阵的值:
";
CMatrixm2(h2,l2);
m2.input();
CMatrixm3=m1*m2;
cout<cout<<"两个矩阵相乘结果为:
\n";
m3.show();
}
};
break;
case4:
{
if(y==1)
{
ints;
charfilename[256];
cout<<"请输入文件名:
";
cin>>filename;
cout<CMatrixm1;
CMatrixm2=m1.read(filename);
cout<<"请输入要乘的实数:
";
cin>>s;
CMatrixm3=m2.shucheng(s);
cout<<"输入矩阵与实数相乘结果为:
\n";
m3.show();
}
if(y==2)
{
inth,l,s;
cout<<"请输入矩阵的行:
";
cin>>h;
cout<<"请输入矩阵的列:
";
cin>>l;
cout<<"请依次输入矩阵的值:
";
CMatrixm1(h,l);
m1.input();
cout<cout<<"请输入要乘的实数:
";
cin>>s;
CMatrixm2=m1.shucheng(s);
cout<cout<<"输入矩阵与实数相乘结果为:
\n";
m2.show();
}
};
break;
}
cout<cout<<"---------------------------------------------------------"<cout<cout<<"主菜单"<cout<<"1.计算矩阵的转置"<cout<<"2.计算矩阵的逆"<cout<<"3.计算矩阵的乘法"<cout<<"4.计算矩阵的数乘"<cout<<"5.退出菜单"<cout<cout<<"请选择一种运算:
";
}
return0;
}
七、课程设计的心得体会
此课程设计颇有意思,虽难度系数为A,比较有挑战性,但是认真尽力去做会有很大的成就感,也是从这次的课程设计中,我对C++有了一个更好的认识,也更加喜欢上编程。
然后,对于程序中发现的两个bug,我很是头痛,一直没有找到解决办法,不知该如何是好。
|
|
|
|
|
|
|
|
|
|
|
|
|
|