数据结构课程设计1.docx
- 文档编号:10159200
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:24
- 大小:79.43KB
数据结构课程设计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;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计