版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课 程 设 计 报 告 书题 目:数组的存储格式转换专 业: 计算机科学与技术班 级:计121学 号:完成时间:一、 问题描述1.1 问题描述根据数组的相关知识,以行列式的方式输入矩阵,进行简单的运算,转置及求逆等过程,然后打印出该矩阵。1.2 基本要求需要按要求输入矩阵,系统会自行运算,然后输出矩阵。二、 概要设计进行运算开始进入程序提示输入的矩阵类型输入选择提示输入矩阵的方式输入选择输出结果操作结束三、 详细设计1.1 函数申明float MatDet(float *p, int n); /求矩阵的行列式float Creat_M(float *p, int m, int n, i
2、nt k); /求矩阵元素A(m, n)的代数余之式void print(float *p, int m,int n); /输出矩阵n*nbool Gauss(float *pSrc, float *pDst, int iRow); /采用部分主元的高斯消去法求方阵A的逆矩阵Bbool Transepose(float *pSrc,float *pSdst, int iRow, int iCol); /求矩阵转置bool MatMultiply(float *pSrc1, float *pSrc2,float *pDst,int iRow, int iCol);/矩阵相乘1.2 主函数floa
3、t *buffer, *p; /定义数组首地址指针变量int row, num; /定义矩阵的行数和矩阵元素个数int i, j;float determ; /定义矩阵的行列式float aNN, bNN;int n;cout << "采用逆矩阵的定义法求矩阵的逆矩阵!n"cout << "请输入矩阵的行数: "cin >> row;num = 2 * row * row;buffer = (float *)calloc(num, sizeof(float); /分配内存单元p = buffer;if (NULL !=
4、 p)for (i = 0; i < row; i+)cout << "Please input the number of " << i+1 << " row: "for (j = 0; j < row; j+)cin >> *p+;elsecout << "Can't distribute memoryn"cout << "The original matrix : n"print(buffer, row); /打印该矩
5、阵determ = MatDet(buffer, row); /求整个矩阵的行列式p = buffer + row * row;if (determ != 0)cout << "The determinant of the matrix is " << determ << endl;for (i = 0; i < row; i+) /求逆矩阵for (j = 0; j < row; j+)*(p+j*row+i) = Creat_M(buffer, i, j, row)/determ;cout << "T
6、he inverse matrix is: " << endl;print(p, row); /打印该矩阵elsecout << "The determinant is 0, and there is no inverse matrix!n"free(buffer); /释放内存空间cout << "采用部分主元的高斯消去法求方阵的逆矩阵!n"cout << "请输入方阵的阶数: "cin >> n;cout << "请输入" <
7、;< n << "阶方阵: n"/输入一个n阶方阵for (i = 0; i < n; i+)for (j = 0; j < n; j+)cin >> aij;/运用高斯消去法求该矩阵的逆矩阵并输出if (Gauss(a, b, n)cout << "该方阵的逆矩阵为: n"for (i = 0; i < n; i+)cout << setw(4);for (j = 0; j < n; j+)cout << bij << setw(10);cout &l
8、t;< endl; return 0;1.3 功能函数int i,m,n;cout << "请输入方阵的行数: "cin >> m;cout << "请输入方阵的列数: "cin >> n;float *a = new floatm*n;cout << "请输入" << m << "*"<< n << "阶方阵: n"/输入一个n阶方阵for (i = 0; i < m*n;
9、i+)cin >> ai;print(a,m,n);cout<<"转置矩阵:"<<endl;float *b = new floatn*m;Transepose(a,b,m,n);print(b,n,m);cout<<"矩阵乘积:"<<endl;float *c = new floatm*m;MatMultiply(a,b,c,m,n);print(c,m,m);cout<<"矩阵的逆:"<<endl;float *d = new floatm*m;G
10、auss(c,d,m);print(d,m,m);cin>>m;delete a;delete b;delete c;delete d;return 0;/-/功能: 求矩阵(n*n)的行列式/入口参数: 矩阵的首地址,矩阵的行数/返回值: 矩阵的行列式值/-float MatDet(float *p, int n)int r, c, m;int lop = 0;float result = 0;float mid = 1;if (n != 1)lop = (n = 2) ? 1 : n; /控制求和循环次数,若为2阶,则循环1次,否则为n次for (m = 0; m < l
11、op; m+)mid = 1; /顺序求和, 主对角线元素相乘之和for (r = 0, c = m; r < n; r+, c+)mid = mid * (*(p+r*n+c%n);result += mid;for (m = 0; m < lop; m+)mid = 1; /逆序相减, 减去次对角线元素乘积for (r = 0, c = n-1-m+n; r < n; r+, c-)mid = mid * (*(p+r*n+c%n);result -= mid;elseresult = *p;return result;/-/功能: 求k*k矩阵中元素A(m, n)的代数
12、余之式/入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k/返回值: k*k矩阵中元素A(m, n)的代数余之式/-float Creat_M(float *p, int m, int n, int k)int len;int i, j;float mid_result = 0;int sign = 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;
13、 i < k; i+)for (j = 0; j < k; 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);return mid_result;/-/功能: 打印n*n矩阵/入口参数: n*n矩阵的首地址,矩阵的行数n/返回值: 无返回值void prin
14、t(float *p, int m, int n)int i, j;for (i = 0; i < m; i+)cout << setw(4);for (j = 0; j < n; j+)cout << setiosflags(ios:right) << *p+ << setw(10);cout << endl;/-/功能: 采用部分主元的高斯消去法求方阵A的逆矩阵B/入口参数: 输入方阵,输出方阵,方阵阶数/返回值: true or false/-四、 运行与测试1.1 进入提示画面1.2 按提示输入后1.3 输出界面五
15、、 总结与体会通过这一次的课程设计,我掌握了另外的一种算法,对矩阵等复杂数据的输入有了更深刻的理解,起初不知道应该以怎样的方式输入矩阵,数据结构这门课程在处理数据信息方面给了我很大的启发,应该以怎样的方式输入数据,处理数据,数据结构都很系统的解释了出来,对我的帮助很大,一开始也没想到自己真的能做出来,后来通过网上的一些成功案例,一步一步的写了出来,在经过调试,验证等一系列操作,终于解决了问题。也增加了自己的信心。六、 附源程序#include <math.h>#include <malloc.h>#include <iomanip>#include <
16、iostream>#define N 10 /定义方阵的最大阶数为10using namespace std;/函数的声明部分float MatDet(float *p, int n); /求矩阵的行列式float Creat_M(float *p, int m, int n, int k); /求矩阵元素A(m, n)的代数余之式void print(float *p, int m,int n); /输出矩阵n*nbool Gauss(float *pSrc, float *pDst, int iRow); /采用部分主元的高斯消去法求方阵A的逆矩阵Bbool Transepose(f
17、loat *pSrc,float *pSdst, int iRow, int iCol); /求矩阵转置bool MatMultiply(float *pSrc1, float *pSrc2,float *pDst,int iRow, int iCol);/矩阵相乘int main()/*float *buffer, *p; /定义数组首地址指针变量int row, num; /定义矩阵的行数和矩阵元素个数int i, j;float determ; /定义矩阵的行列式float aNN, bNN;int n;cout << "采用逆矩阵的定义法求矩阵的逆矩阵!n&quo
18、t;cout << "请输入矩阵的行数: "cin >> row;num = 2 * row * row;buffer = (float *)calloc(num, sizeof(float); /分配内存单元p = buffer;if (NULL != p)for (i = 0; i < row; i+)cout << "Please input the number of " << i+1 << " row: "for (j = 0; j < row; j+)
19、cin >> *p+;elsecout << "Can't distribute memoryn"cout << "The original matrix : n"print(buffer, row); /打印该矩阵determ = MatDet(buffer, row); /求整个矩阵的行列式p = buffer + row * row;if (determ != 0)cout << "The determinant of the matrix is " << de
20、term << endl;for (i = 0; i < row; i+) /求逆矩阵for (j = 0; j < row; j+)*(p+j*row+i) = Creat_M(buffer, i, j, row)/determ;cout << "The inverse matrix is: " << endl;print(p, row); /打印该矩阵elsecout << "The determinant is 0, and there is no inverse matrix!n"fre
21、e(buffer); /释放内存空间cout << "采用部分主元的高斯消去法求方阵的逆矩阵!n"cout << "请输入方阵的阶数: "cin >> n;cout << "请输入" << n << "阶方阵: n"/输入一个n阶方阵for (i = 0; i < n; i+)for (j = 0; j < n; j+)cin >> aij;/运用高斯消去法求该矩阵的逆矩阵并输出if (Gauss(a, b, n)cou
22、t << "该方阵的逆矩阵为: n"for (i = 0; i < n; i+)cout << setw(4);for (j = 0; j < n; j+)cout << bij << setw(10);cout << endl; return 0;*/int i,m,n;cout << "请输入方阵的行数: "cin >> m;cout << "请输入方阵的列数: "cin >> n;float *a = new
23、floatm*n;cout << "请输入" << m << "*"<< n << "阶方阵: n"/输入一个n阶方阵for (i = 0; i < m*n; i+)cin >> ai;print(a,m,n);cout<<"转置矩阵:"<<endl;float *b = new floatn*m;Transepose(a,b,m,n);print(b,n,m);cout<<"矩阵乘积:&qu
24、ot;<<endl;float *c = new floatm*m;MatMultiply(a,b,c,m,n);print(c,m,m);cout<<"矩阵的逆:"<<endl;float *d = new floatm*m;Gauss(c,d,m);print(d,m,m);cin>>m;delete a;delete b;delete c;delete d;return 0;/-/功能: 求矩阵(n*n)的行列式/入口参数: 矩阵的首地址,矩阵的行数/返回值: 矩阵的行列式值/-float MatDet(float *p
25、, int n)int r, c, m;int lop = 0;float result = 0;float mid = 1;if (n != 1)lop = (n = 2) ? 1 : n; /控制求和循环次数,若为2阶,则循环1次,否则为n次for (m = 0; m < lop; m+)mid = 1; /顺序求和, 主对角线元素相乘之和for (r = 0, c = m; r < n; r+, c+)mid = mid * (*(p+r*n+c%n);result += mid;for (m = 0; m < lop; m+)mid = 1; /逆序相减, 减去次对角
26、线元素乘积for (r = 0, c = n-1-m+n; r < n; r+, c-)mid = mid * (*(p+r*n+c%n);result -= mid;elseresult = *p;return result;/-/功能: 求k*k矩阵中元素A(m, n)的代数余之式/入口参数: k*k矩阵的首地址,矩阵元素A的下标m,n,矩阵行数k/返回值: k*k矩阵中元素A(m, n)的代数余之式/-float Creat_M(float *p, int m, int n, int k)int len;int i, j;float mid_result = 0;int sign
27、= 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 < k; i+)for (j = 0; j < k; j+)if (i != m && j != n) /将除第i行和第j列外的所有元素存储到以p_mid为首地址的内存单元*p_mid+ = *(p+i*k+j);sign = (m+n)%2 = 0 ? 1 : -1; /代数余
28、之式前面的正、负号mid_result = (float)sign*MatDet(p_creat, k-1);free(p_creat);return mid_result;/-/功能: 打印n*n矩阵/入口参数: n*n矩阵的首地址,矩阵的行数n/返回值: 无返回值void print(float *p, int m, int n)int i, j;for (i = 0; i < m; i+)cout << setw(4);for (j = 0; j < n; j+)cout << setiosflags(ios:right) << *p+ &
29、lt;< setw(10);cout << endl;/-/功能: 采用部分主元的高斯消去法求方阵A的逆矩阵B/入口参数: 输入方阵,输出方阵,方阵阶数/返回值: true or false/-bool Gauss(float *pSrc, float *pDst, int iRow)int i, j, k;int n = iRow;float max, temp;float tNN; /临时矩阵/将A矩阵存放在临时矩阵tnn中for (i = 0; i < n; i+) for (j = 0; j < n; j+)tij = pSrci*iRow+j;/初始化B
30、矩阵为单位阵for (i = 0; i < n; i+) for (j = 0; j < n; j+)pDsti*iRow+j = (i = j) ? (float)1 : 0;for (i = 0; i < n; i+)/寻找主元max = tii;k = i;for (j = i+1; j < n; j+)if (fabs(tji) > fabs(max)max = tji;k = j;/如果主元所在行不是第i行,进行行交换if (k != i)for (j = 0; j < n; j+)temp = tij;tij = tkj;tkj = temp;/B伴随交换temp = pDsti*iRow+j;pDsti*iRow+j = pDstk
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤焦油买卖合同格式
- 地毯产品销售购销合同
- 农产品购销合同的运输规定
- 2024家装装修合同范本
- 2024年度区块链应用合作合同2篇
- 水果营销战略购销合同
- 供货商与餐饮店合同
- 鸡苗订购协议格式模板
- 场地演艺服务合同
- 婚礼策划服务合同
- 华为数字能源初级练习卷含答案
- 关于做好冬季安全生产工作的通知
- 二年级上册道德与法治10《我们不乱扔》说课稿
- 2023-2024学年高一上学期选科指导主题班会 课件
- 营养风险筛查(NRS2002)解读
- 食材配送服务方案投标方案(技术标)
- 初一二元一次方程组计算50题
- 中国公路学会高德地图-2023年高速公路服务区出行热度分析报告:1月-6月
- 项目式学习在初中化学单元教学中的应用以第九单元“溶液”教学为例
- 学习行为表现国家开放大学
- 《关于加强和改进新时代师德师风建设的意见》培训课件
评论
0/150
提交评论