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