版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/#include "matrix.h"#define EX_TRUE (0)#define EX_FALSE (1)#define EX_MALLOC (2)typedef struct tagMatrixunsigned char ucRow;unsigned char ucCol;unsigned short usRev;float *pfDataAdd;Matrix_s;extern int InputRowColInfo(unsigned char *pucRow, unsigned char *pucCol);extern int CreateMatrixMem
2、(void *pvData);extern int InputMatrixData(void *pvData);extern int PrintMatrixData(void *pvData);extern int PrintInverseMatrixData(void *pvData);extern int Show_matrix(Matrix_s *pstMatrixA, Matrix_s *pstMatrixB);/#include "operate_matrix.h"#define EX_MATRIX_INIT (1)#define EX_MATRIX_UNINIT
3、 (0)typedef enumEX_INPUT_MATRIX = 1,EX_ADD_MATRIX,EX_SUBTRACT_MATRIX,EX_MULTIPLY_MATRIX,EX_INVERSE_MATRIX,EX_QUIT_MATRIX,EX_BOTTOM_MATRIXMatrix_opcode_en;extern int OperateMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrix);extern int ShowMatrixMenu();extern int CheckMatrix(int iOpCode, M
4、atrix_s *pstMatrixA, Matrix_s *pstMatrixB);extern int AddMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC);extern int SubtractMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC);extern int MultiplyMatrix(int iOpCode, Matrix_s *pst
5、MatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC);extern int CreateResultMatrix(unsigned char ucRow, unsigned char ucCol, void *pvData);extern int InverseMatrix(float a, int n);/*Guanlin Luo ID:10529749*/#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <math.h
6、>#include "matrix.h"/*We have already done this header.*/#include "operate_matrix.h"/*We have already done this header.*/char g_cFlag = EX_MATRIX_UNINIT;int main ()int iInputOpCode;int iRet = EX_FALSE;Matrix_s stMatrixA, stMatrixB;memset(&stMatrixA, 0, sizeof(stMatrixA);me
7、mset(&stMatrixB, 0, sizeof(stMatrixB);while(1)/* show menu */(void)ShowMatrixMenu();/* operete matrix */scanf("%d", &iInputOpCode);iRet = OperateMatrix(iInputOpCode, &stMatrixA, &stMatrixB);if (EX_TRUE = iRet)if (EX_QUIT_MATRIX = iInputOpCode)break;if (NULL != stMatrixA.pfD
8、ataAdd)free(stMatrixA.pfDataAdd);if (NULL != stMatrixB.pfDataAdd)free(stMatrixB.pfDataAdd);return EX_TRUE;int ShowMatrixMenu()/*choices for users.*/printf("1 - Enter matrices A & Brn");printf("2 - Add matricesrn");printf("3 - Subtract matricesrn");printf("4 - M
9、ultiply matricesrn");printf("5 - Inverse of Arn");printf("6 - Quit programrn");printf("Option: ");return EX_TRUE;int OperateMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB)int iRet = EX_FALSE;Matrix_s stMatrixC;float *pfTmpBuf = NULL;memset(&stMa
10、trixC, 0, sizeof(Matrix_s);switch (iOpCode)case EX_INPUT_MATRIX:iRet = Show_matrix(pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)printf("err input matrix info!n");return iRet;else/* at first, we need input matrix data */g_cFlag = EX_MATRIX_INIT;break;case EX_ADD_MATRIX:/*Addition part.*/iRet
11、 = AddMatrix(EX_ADD_MATRIX, pstMatrixA, pstMatrixB, &stMatrixC);if (EX_TRUE != iRet)/*For checking.*/printf("err multiply matrix operation!n");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);return iRet;printf("rnA + B =: rn");iRet = PrintMatrixData(&stMatrixC);if (iR
12、et = EX_FALSE)printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(stMatrixC.pfDataAdd);break;case EX_SUBTRACT_MATRIX:/*Subtract two matrices*/iRet = SubtractMatrix(EX_SUBTRACT_MATRIX, pstMatrixA, pstMatrixB, &stMatrixC);if (EX_TRUE != iRet)/*For checking.*/p
13、rintf("err subtract matrix operation!rn");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);return iRet;printf("rnA - B =: rn");iRet = PrintMatrixData(&stMatrixC);if (iRet = EX_FALSE)printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(s
14、tMatrixC.pfDataAdd);break;case EX_MULTIPLY_MATRIX:/*multiplication part.*/iRet = MultiplyMatrix(EX_MULTIPLY_MATRIX, pstMatrixA, pstMatrixB, &stMatrixC);if (EX_TRUE != iRet)/*For checking.*/printf("rnerr multiply matrix operation!rn");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);
15、return iRet;printf("rnA * B =: rn");iRet = PrintMatrixData(&stMatrixC);if (EX_TRUE != iRet)printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(stMatrixC.pfDataAdd);break;case EX_INVERSE_MATRIX:/*inverse.*/if (EX_MATRIX_UNINIT = g_cFlag)/*For checki
16、ng the input.*/printf("please choose 1 operation at first.rn");return EX_FALSE;pfTmpBuf = (float *)malloc(pstMatrixA->ucRow * pstMatrixA->ucCol * sizeof(float);if (pfTmpBuf = NULL)/*For checking.*/printf("err malloc memory.rn");return EX_MALLOC;elsememset(pfTmpBuf, 0, (pstM
17、atrixA->ucRow * pstMatrixA->ucCol * sizeof(float);memcpy(pfTmpBuf, pstMatrixA->pfDataAdd, (pstMatrixA->ucRow * pstMatrixA->ucCol * sizeof(float);stMatrixC.ucCol = pstMatrixA->ucCol;stMatrixC.ucRow = pstMatrixA->ucRow;stMatrixC.pfDataAdd = pfTmpBuf;iRet = InverseMatrix(stMatrixC.
18、pfDataAdd, stMatrixC.ucRow);if (EX_TRUE != iRet)/*For checking.*/printf("rnerr inverse matrix operation!rn");if (EX_MALLOC = iRet);elsefree(stMatrixC.pfDataAdd);return iRet;printf("rnInverse of A =: rn");iRet = PrintInverseMatrixData(&stMatrixC);if (EX_TRUE != iRet)/*For chec
19、king.*/printf("err print Matrix result!rn");free(stMatrixC.pfDataAdd);return iRet;free(stMatrixC.pfDataAdd);break;case EX_QUIT_MATRIX:/*users chose to end this program.*/printf("will quit matrix menu!rn");break;default:/*For checking.*/printf("err operate code!rn");retu
20、rn EX_FALSE;return EX_TRUE;int CheckMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB)if (pstMatrixA = NULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;if (EX_MATRIX_UNINIT = g_cFlag)printf("please choose 1 operation at first.rn");return EX
21、_FALSE;switch (iOpCode)case EX_ADD_MATRIX: case EX_SUBTRACT_MATRIX:if (pstMatrixA->ucCol = pstMatrixB->ucCol)&& (pstMatrixA->ucRow = pstMatrixB->ucRow);else/* ADD / Subtract operation */printf("rnAdd/Subtract operation is invalid!rn");return EX_FALSE;break;case EX_INVER
22、SE_MATRIX:if (2 = pstMatrixA->ucRow)&& (2 = pstMatrixA->ucCol);else/* Inverse operation */printf("rnMultiply/Inverse operation is invalid!rn");return EX_FALSE;break;case EX_MULTIPLY_MATRIX:if (pstMatrixA->ucRow = pstMatrixB->ucCol)&& (pstMatrixA->ucCol = pstM
23、atrixB->ucRow);else/* Multiply operation */printf("rnMultiply operation is invalid!rn");return EX_FALSE;break;default:printf("err operate code!rn");return EX_FALSE;return EX_TRUE;int AddMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC)int iR
24、et = EX_FALSE;unsigned char ucRow;unsigned char ucCol;unsigned char i, j;float fTmpData = 0.0;if (pstMatrixA = NULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;iRet = CheckMatrix(iOpCode, pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)return iRet;elseucRow = pstMatr
25、ixA->ucRow;ucCol = pstMatrixA->ucCol;/* create result matrix C */iRet = CreateResultMatrix(ucRow, ucCol, pstMatrixC);if (iRet != EX_TRUE)return iRet;for (i = 0; i < ucRow; i+)for (j = 0; j < ucCol; j+)fTmpData = (*(pstMatrixA->pfDataAdd + i * ucCol + j) + *(pstMatrixB->pfDataAdd +
26、i * ucCol + j);*(pstMatrixC->pfDataAdd + i * ucCol + j) = fTmpData;return EX_TRUE;int SubtractMatrix(int iOpCode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC)int iRet = EX_FALSE;unsigned char ucRow;unsigned char ucCol;unsigned char i, j;float fTmpData = 0.0;if (pstMatrixA = N
27、ULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;iRet = CheckMatrix(iOpCode, pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)return iRet;elseucRow = pstMatrixA->ucRow;ucCol = pstMatrixA->ucCol;/* create result matrix C */iRet = CreateResultMatrix(ucRow, ucCol, p
28、stMatrixC);if (iRet != EX_TRUE)return iRet;for (i = 0; i < ucRow; i+)for (j = 0; j < ucCol; j+)fTmpData = (*(pstMatrixA->pfDataAdd + i * ucCol + j) - *(pstMatrixB->pfDataAdd + i * ucCol + j);*(pstMatrixC->pfDataAdd + i * ucCol + j) = fTmpData;return EX_TRUE;int MultiplyMatrix(int iOpC
29、ode, Matrix_s *pstMatrixA, Matrix_s *pstMatrixB, Matrix_s *pstMatrixC)int iRet = EX_FALSE;unsigned char ucRow;unsigned char ucCol;unsigned char i, j, k;float fTmpData = 0.0;if (pstMatrixA = NULL) | (pstMatrixB = NULL)printf("matrix para is null.rn");return EX_FALSE;iRet = CheckMatrix(iOpCo
30、de, pstMatrixA, pstMatrixB);if (EX_FALSE = iRet)return iRet;elseucRow = pstMatrixA->ucRow;ucCol = pstMatrixB->ucCol;/* create result matrix C */iRet = CreateResultMatrix(ucRow, ucCol, pstMatrixC);if (iRet != EX_TRUE)return iRet;for (i = 0; i < ucRow; i+)for (j = 0; j < ucCol; j+)for (k =
31、 0; k < pstMatrixA->ucCol; k+)fTmpData += (float)(*(pstMatrixA->pfDataAdd + i * ucCol + k) * *(pstMatrixB->pfDataAdd + j + k * ucCol);*(pstMatrixC->pfDataAdd + i * ucCol + j) = fTmpData;fTmpData = 0;return EX_TRUE;int CreateResultMatrix(unsigned char ucRow, unsigned char ucCol, void *
32、pvData)Matrix_s *pstTmpData = NULL;int iRet = EX_FALSE;if (pvData = NULL)printf("para is null.rn");return EX_FALSE;elsepstTmpData = (Matrix_s *)pvData;/* create result matrix C */memset(pstTmpData, 0, sizeof(Matrix_s);pstTmpData->ucRow = ucRow;pstTmpData->ucCol = ucCol;iRet = CreateMatrixMem(pstTmpData);if (iRet != EX_TRUE)printf("err create result Matrix C!rn");return iRet;return EX_TRUE;int InverseMatrix(float a, int n) int *is,*js;int i,j,k,l,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区电工安全协议书
- 电梯拆装协议书范本
- 电信公司俩年协议书
- 石膏板加工合同范本
- 帮扶基金签约协议书
- 电工员聘请协议合同
- 社区老人就餐协议书
- 签名委托免责协议书
- 电梯焊接协议书范本
- 急诊科护理质量评价标准
- 贵州国企招聘:2025贵州凉都能源有限责任公司招聘10人备考题库含答案详解(综合题)
- 西藏自治区昌都市小学三年级上学期数学期末测试卷
- 污水池内壁防腐作业施工方案
- xx公司混凝土质量控制培训课件-完整版
- 传承三线精神、砥砺奋进前行课件
- 员工考证培训协议书
- 2025年郑州水务集团有限公司招聘80人模拟试卷带答案解析
- 2025吉林省吉林市磐石市总工会招聘工会社会工作者8人备考公基题库附答案解析
- hiv透析应急预案
- 11.交通信号控制技术与智能系统设计
- 八年级物理上学期第三次月考试卷(新教材沪科版)
评论
0/150
提交评论