南京理工大学C++课程设计.docx

上传人:b****7 文档编号:24044266 上传时间:2023-05-23 格式:DOCX 页数:20 大小:134.86KB
下载 相关 举报
南京理工大学C++课程设计.docx_第1页
第1页 / 共20页
南京理工大学C++课程设计.docx_第2页
第2页 / 共20页
南京理工大学C++课程设计.docx_第3页
第3页 / 共20页
南京理工大学C++课程设计.docx_第4页
第4页 / 共20页
南京理工大学C++课程设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

南京理工大学C++课程设计.docx

《南京理工大学C++课程设计.docx》由会员分享,可在线阅读,更多相关《南京理工大学C++课程设计.docx(20页珍藏版)》请在冰豆网上搜索。

南京理工大学C++课程设计.docx

南京理工大学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;i

a[i]=newT[c];

for(i=0;i

for(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;i

a[i]=newT[col];

for(i=0;i

for(j=0;j

a[i][j]=m.a[i][j];

}

template

CMatrix:

:

~CMatrix()//析构

{

for(inti=0;i

delete[]a[i];

delete[]a;

}

template

CMatrix&CMatrix:

:

operator=(constCMatrix&m)//等于

{

for(inti=0;i

delete[]a[i];

delete[]a;

row=m.row;

col=m.col;

a=newC*[row];

for(inti=0;i

for(intj=0;j

a[i][j]=m.a[i][j];

return*this;

}

template

CMatrixCMatrix:

:

zhuanzhi()//转置

{

CMatrixm(col,row);

for(inti=0;i

for(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;i

for(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;i

for(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;i

for(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,我很是头痛,一直没有找到解决办法,不知该如何是好。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1