数据结构课程设计1.docx

上传人:b****8 文档编号:10159200 上传时间:2023-02-08 格式:DOCX 页数:24 大小:79.43KB
下载 相关 举报
数据结构课程设计1.docx_第1页
第1页 / 共24页
数据结构课程设计1.docx_第2页
第2页 / 共24页
数据结构课程设计1.docx_第3页
第3页 / 共24页
数据结构课程设计1.docx_第4页
第4页 / 共24页
数据结构课程设计1.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构课程设计1.docx

《数据结构课程设计1.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计1.docx(24页珍藏版)》请在冰豆网上搜索。

数据结构课程设计1.docx

数据结构课程设计1

 

《数据结构》

 

课程设计报告书

 

题目:

数组的存储格式转换

专业:

计算机科学与技术

班级:

计121

学号:

1213022023

完成时间:

2014.1.10

一、问题描述

1.1问题描述

根据数组的相关知识,以行列式的方式输入矩阵,进行简单的运算,转置及求逆等过程,然后打印出该矩阵。

1.2基本要求

需要按要求输入矩阵,系统会自行运算,然后输出矩阵。

二、概要设计

三、详细设计

1.1函数申明

floatMatDet(float*p,intn);//求矩阵的行列式

floatCreat_M(float*p,intm,intn,intk);//求矩阵元素A(m,n)的代数余之式

voidprint(float*p,intm,intn);//输出矩阵n*n

boolGauss(float*pSrc,float*pDst,intiRow);//采用部分主元的高斯消去法求方阵A的逆矩阵B

boolTransepose(float*pSrc,float*pSdst,intiRow,intiCol);//求矩阵转置

boolMatMultiply(float*pSrc1,float*pSrc2,float*pDst,intiRow,intiCol);//矩阵相乘

1.2主函数

float*buffer,*p;//定义数组首地址指针变量

introw,num;//定义矩阵的行数和矩阵元素个数

inti,j;

floatdeterm;//定义矩阵的行列式

floata[N][N],b[N][N];

intn;

cout<<"采用逆矩阵的定义法求矩阵的逆矩阵!

\n";

cout<<"请输入矩阵的行数:

";

cin>>row;

num=2*row*row;

buffer=(float*)calloc(num,sizeof(float));//分配内存单元

p=buffer;

if(NULL!

=p)

{

for(i=0;i

{

cout<<"Pleaseinputthenumberof"<

";

for(j=0;j

{

cin>>*p++;

}

}

}

else

{

cout<<"Can'tdistributememory\n";

}

cout<<"Theoriginalmatrix:

\n";

print(buffer,row);//打印该矩阵

determ=MatDet(buffer,row);//求整个矩阵的行列式

p=buffer+row*row;

if(determ!

=0)

{

cout<<"Thedeterminantofthematrixis"<

for(i=0;i

{

for(j=0;j

{

*(p+j*row+i)=Creat_M(buffer,i,j,row)/determ;

}

}

cout<<"Theinversematrixis:

"<

print(p,row);//打印该矩阵

}

else

{

cout<<"Thedeterminantis0,andthereisnoinversematrix!

\n";

}

free(buffer);//释放内存空间

cout<<"采用部分主元的高斯消去法求方阵的逆矩阵!

\n";

cout<<"请输入方阵的阶数:

";

cin>>n;

cout<<"请输入"<

\n";

//输入一个n阶方阵

for(i=0;i

{

for(j=0;j

{

cin>>a[i][j];

}

}

//运用高斯消去法求该矩阵的逆矩阵并输出

if(Gauss(a,b,n))

{

cout<<"该方阵的逆矩阵为:

\n";

for(i=0;i

{

cout<

for(j=0;j

{

cout<

}

cout<

}

}

return0;

1.3功能函数

inti,m,n;

cout<<"请输入方阵的行数:

";

cin>>m;

cout<<"请输入方阵的列数:

";

cin>>n;

float*a=newfloat[m*n];

cout<<"请输入"<

\n";

//输入一个n阶方阵

for(i=0;i

{

cin>>a[i];

}

print(a,m,n);

cout<<"转置矩阵:

"<

float*b=newfloat[n*m];

Transepose(a,b,m,n);

print(b,n,m);

cout<<"矩阵乘积:

"<

float*c=newfloat[m*m];

MatMultiply(a,b,c,m,n);

print(c,m,m);

cout<<"矩阵的逆:

"<

float*d=newfloat[m*m];

Gauss(c,d,m);

print(d,m,m);

cin>>m;

delete[]a;

delete[]b;

delete[]c;

delete[]d;

return0;

}

//----------------------------------

//功能:

求矩阵(n*n)的行列式

//入口参数:

矩阵的首地址,矩阵的行数

//返回值:

矩阵的行列式值

//----------------------------------

floatMatDet(float*p,intn)

{

intr,c,m;

intlop=0;

floatresult=0;

floatmid=1;

if(n!

=1)

{

lop=(n==2)?

1:

n;//控制求和循环次数,若为2阶,则循环1次,否则为n次

for(m=0;m

{

mid=1;//顺序求和,主对角线元素相乘之和

for(r=0,c=m;r

{

mid=mid*(*(p+r*n+c%n));

}

result+=mid;

}

for(m=0;m

{

mid=1;//逆序相减,减去次对角线元素乘积

for(r=0,c=n-1-m+n;r

{

mid=mid*(*(p+r*n+c%n));

}

result-=mid;

}

}

else

result=*p;

returnresult;

}

//------------------------------------------------------

//功能:

求k*k矩阵中元素A(m,n)的代数余之式

//入口参数:

k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k

//返回值:

k*k矩阵中元素A(m,n)的代数余之式

//-------------------------------------------------------

floatCreat_M(float*p,intm,intn,intk)

{

intlen;

inti,j;

floatmid_result=0;

intsign=1;

float*p_creat,*p_mid;

len=(k-1)*(k-1);//k阶矩阵的代数余之式为k-1阶矩阵

p_creat=(float*)calloc(len,sizeof(float));//分配内存单元

p_mid=p_creat;

for(i=0;i

{

for(j=0;j

{

if(i!

=m&&j!

=n)//将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元

{

*p_mid++=*(p+i*k+j);

}

}

}

sign=(m+n)%2==0?

1:

-1;//代数余之式前面的正、负号

mid_result=(float)sign*MatDet(p_creat,k-1);

free(p_creat);

returnmid_result;

}

//----------------------

//功能:

打印n*n矩阵

//入口参数:

n*n矩阵的首地址,矩阵的行数n

//返回值:

无返回值

voidprint(float*p,intm,intn)

{

inti,j;

for(i=0;i

{

cout<

for(j=0;j

{

cout<

:

right)<<*p++<

}

cout<

}

}

//----------------------------------------------

//功能:

采用部分主元的高斯消去法求方阵A的逆矩阵B

//入口参数:

输入方阵,输出方阵,方阵阶数

//返回值:

trueorfalse

//--------------------------

四、运行与测试

1.1进入提示画面

1.2按提示输入后

1.3输出界面

五、总结与体会

通过这一次的课程设计,我掌握了另外的一种算法,对矩阵等复杂数据的输入有了更深刻的理解,起初不知道应该以怎样的方式输入矩阵,数据结构这门课程在处理数据信息方面给了我很大的启发,应该以怎样的方式输入数据,处理数据,数据结构都很系统的解释了出来,对我的帮助很大,一开始也没想到自己真的能做出来,后来通过网上的一些成功案例,一步一步的写了出来,在经过调试,验证等一系列操作,终于解决了问题。

也增加了自己的信心。

六、附源程序

#include

#include

#include

#include

#defineN10//定义方阵的最大阶数为10

usingnamespacestd;

//函数的声明部分

floatMatDet(float*p,intn);//求矩阵的行列式

floatCreat_M(float*p,intm,intn,intk);//求矩阵元素A(m,n)的代数余之式

voidprint(float*p,intm,intn);//输出矩阵n*n

boolGauss(float*pSrc,float*pDst,intiRow);//采用部分主元的高斯消去法求方阵A的逆矩阵B

boolTransepose(float*pSrc,float*pSdst,intiRow,intiCol);//求矩阵转置

boolMatMultiply(float*pSrc1,float*pSrc2,float*pDst,intiRow,intiCol);//矩阵相乘

intmain()

{

/*float*buffer,*p;//定义数组首地址指针变量

introw,num;//定义矩阵的行数和矩阵元素个数

inti,j;

floatdeterm;//定义矩阵的行列式

floata[N][N],b[N][N];

intn;

cout<<"采用逆矩阵的定义法求矩阵的逆矩阵!

\n";

cout<<"请输入矩阵的行数:

";

cin>>row;

num=2*row*row;

buffer=(float*)calloc(num,sizeof(float));//分配内存单元

p=buffer;

if(NULL!

=p)

{

for(i=0;i

{

cout<<"Pleaseinputthenumberof"<

";

for(j=0;j

{

cin>>*p++;

}

}

}

else

{

cout<<"Can'tdistributememory\n";

}

cout<<"Theoriginalmatrix:

\n";

print(buffer,row);//打印该矩阵

determ=MatDet(buffer,row);//求整个矩阵的行列式

p=buffer+row*row;

if(determ!

=0)

{

cout<<"Thedeterminantofthematrixis"<

for(i=0;i

{

for(j=0;j

{

*(p+j*row+i)=Creat_M(buffer,i,j,row)/determ;

}

}

cout<<"Theinversematrixis:

"<

print(p,row);//打印该矩阵

}

else

{

cout<<"Thedeterminantis0,andthereisnoinversematrix!

\n";

}

free(buffer);//释放内存空间

cout<<"采用部分主元的高斯消去法求方阵的逆矩阵!

\n";

cout<<"请输入方阵的阶数:

";

cin>>n;

cout<<"请输入"<

\n";

//输入一个n阶方阵

for(i=0;i

{

for(j=0;j

{

cin>>a[i][j];

}

}

//运用高斯消去法求该矩阵的逆矩阵并输出

if(Gauss(a,b,n))

{

cout<<"该方阵的逆矩阵为:

\n";

for(i=0;i

{

cout<

for(j=0;j

{

cout<

}

cout<

}

}

return0;*/

inti,m,n;

cout<<"请输入方阵的行数:

";

cin>>m;

cout<<"请输入方阵的列数:

";

cin>>n;

float*a=newfloat[m*n];

cout<<"请输入"<

\n";

//输入一个n阶方阵

for(i=0;i

{

cin>>a[i];

}

print(a,m,n);

cout<<"转置矩阵:

"<

float*b=newfloat[n*m];

Transepose(a,b,m,n);

print(b,n,m);

cout<<"矩阵乘积:

"<

float*c=newfloat[m*m];

MatMultiply(a,b,c,m,n);

print(c,m,m);

cout<<"矩阵的逆:

"<

float*d=newfloat[m*m];

Gauss(c,d,m);

print(d,m,m);

cin>>m;

delete[]a;

delete[]b;

delete[]c;

delete[]d;

return0;

}

//----------------------------------

//功能:

求矩阵(n*n)的行列式

//入口参数:

矩阵的首地址,矩阵的行数

//返回值:

矩阵的行列式值

//----------------------------------

floatMatDet(float*p,intn)

{

intr,c,m;

intlop=0;

floatresult=0;

floatmid=1;

if(n!

=1)

{

lop=(n==2)?

1:

n;//控制求和循环次数,若为2阶,则循环1次,否则为n次

for(m=0;m

{

mid=1;//顺序求和,主对角线元素相乘之和

for(r=0,c=m;r

{

mid=mid*(*(p+r*n+c%n));

}

result+=mid;

}

for(m=0;m

{

mid=1;//逆序相减,减去次对角线元素乘积

for(r=0,c=n-1-m+n;r

{

mid=mid*(*(p+r*n+c%n));

}

result-=mid;

}

}

else

result=*p;

returnresult;

}

//------------------------------------------------------

//功能:

求k*k矩阵中元素A(m,n)的代数余之式

//入口参数:

k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k

//返回值:

k*k矩阵中元素A(m,n)的代数余之式

//-------------------------------------------------------

floatCreat_M(float*p,intm,intn,intk)

{

intlen;

inti,j;

floatmid_result=0;

intsign=1;

float*p_creat,*p_mid;

len=(k-1)*(k-1);//k阶矩阵的代数余之式为k-1阶矩阵

p_creat=(float*)calloc(len,sizeof(float));//分配内存单元

p_mid=p_creat;

for(i=0;i

{

for(j=0;j

{

if(i!

=m&&j!

=n)//将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元

{

*p_mid++=*(p+i*k+j);

}

}

}

sign=(m+n)%2==0?

1:

-1;//代数余之式前面的正、负号

mid_result=(float)sign*MatDet(p_creat,k-1);

free(p_creat);

returnmid_result;

}

//----------------------

//功能:

打印n*n矩阵

//入口参数:

n*n矩阵的首地址,矩阵的行数n

//返回值:

无返回值

voidprint(float*p,intm,intn)

{

inti,j;

for(i=0;i

{

cout<

for(j=0;j

{

cout<

:

right)<<*p++<

}

cout<

}

}

//----------------------------------------------

//功能:

采用部分主元的高斯消去法求方阵A的逆矩阵B

//入口参数:

输入方阵,输出方阵,方阵阶数

//返回值:

trueorfalse

//----------------------------------------------

boolGauss(float*pSrc,float*pDst,intiRow)

{

inti,j,k;

intn=iRow;

floatmax,temp;

floatt[N][N];//临时矩阵

//将A矩阵存放在临时矩阵t[n][n]中

for(i=0;i

{

for(j=0;j

{

t[i][j]=pSrc[i*iRow+j];

}

}

//初始化B矩阵为单位阵

for(i=0;i

{

for(j=0;

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

当前位置:首页 > 高等教育 > 文学

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

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