ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:42.32KB ,
资源ID:11042052      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11042052.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C课程设计矩阵的加减乘混合运算.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C课程设计矩阵的加减乘混合运算.docx

1、C课程设计矩阵的加减乘混合运算矩阵混合运算指导教师:浙江理工大学 班级: 学号: 姓名:矩阵混合运算一、程序要求二、输入输出范例三、程序结构分析及关键函数说明四、程序代码与说明五、运行结果与分析六、设计日志及心得体会一、程序要求及范例定义矩阵(维数小于55)的加减法和乘法计算输入的若干矩阵的加减法运算和乘法混合运算矩阵数目不定,混合运算顺序不定,矩阵数值不定,均有键盘输入控制若输入有错,可以随时更改任一矩阵数值当输入矩阵不能满足矩阵运算时,提示矩阵维数错误二、输入输出范例输入:-首先输入每个矩阵的数值,输入矩阵格式如1 1 1;2 2 2-输入几个矩阵的混合运算输出:-输出计算结果输入范例:A

2、=1 1 1;2 2 2B=1 0;0 1;1 1C=1 0;0 1D=C+A*B或者D=A*B+C输出-D= 3 2 4 5三、程序结构分析及关键函数说明1.加运算函数 在进行矩阵相加前要判断两矩阵是否能够相加,如果能就按照矩阵的相加方式进行运算,若不能则提示错误并返回,具体的程序段如下: int addMatrix(Matrix *c, Matrix *a, Matrix *b) int i, j; if (a-rows != b-rows | a-cols != b-cols) / error to add printf(矩阵维数输入错误!); return 0; else c-rows

3、 = a-rows; c-cols = a-cols; for (i = 0; i rows; i+) for (j = 0; j cols; j+) c-dataij = a-dataij + b-dataij; return 1; 2.减运算函数 在进行矩阵相减前要判断两矩阵是否能够相减,如果能就按照矩阵的相减方式进行运算,若不能则提示错误并返回,具体的程序段如下:int subtractMatrix(Matrix *c, Matrix *a, Matrix *b) int i, j; if (a-rows != b-rows | a-cols != b-cols) / error pri

4、ntf(矩阵维数输入错误!); return 0; else c-rows = a-rows; c-cols = a-cols; for (i = 0; i rows; i+) for (j = 0; j cols; j+) c-dataij = a-dataij - b-dataij; return 1; 3.乘运算函数 该程序设计的核心问题是矩阵的乘法运算的逻辑性的编写,在进行矩阵相乘前要判断两矩阵是否能够相乘,即判断内积是否相等,如果能就按照矩阵的相乘方式进行运算,若不能则提示错误并返回,具体的程序段如下:int multiplyMatrix(Matrix *c, Matrix *a,

5、Matrix *b) int i, j, k; if (a-cols != b-rows)printf(矩阵维数输入错误!); return 0; else c-rows = a-rows; c-cols = b-cols; for (i = 0; i rows; i+) for (j = 0; j cols; j+) c-dataij = 0; for (k = 0; k cols; k+) c-dataij += a-dataik*b-datakj; return 1; 四、程序代码与说明#include #include #include #include #define MAX_DIM

6、 6#define MAX_CHAR 128typedef struct /结构体定义矩阵 float dataMAX_DIMMAX_DIM; /二维数组表示矩阵 int rows; /行 int cols; /列 Matrix;typedef struct _ListNode /定义一个头结点 char nameMAX_CHAR; Matrix *mat; struct _ListNode *next; /指向下一个结点 ListNode;typedef struct ListNode *head; /定义一个指向头结点的指针 MList;enum TYPE OP, MAT; /枚举类型ty

7、pedef struct _Token /定义Token标识符 判断表达式 union /联合体 取值为 op 和 mat中结构最大的值 char op; Matrix *mat; ; enum TYPE type; /联合体的类型 Token;typedef struct _Stack /定义栈 Token *arr; /用数组存储标识符 int n; /数组里标识符的个数 int cap; /数组的大小 Stack;Stack* initStack(int cap); /初始化,定义一个空栈void freeStack(Stack *pStack); /释放栈的空间void reszieS

8、tack(Stack *pStack, int newCap); /重定义栈的大小void push(Stack *pStack, Token *pToken);/入栈操作Token* pop(Stack *pStack); /出栈 Token* top(Stack *pStack); /栈顶 int getIndex(char ch); /不同标识符对应不同的操作char priorMap99 = , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

9、, , , , , , , , , , , &, , , , , , , , , op = #; pToken-type = OP; push(pStackOps, pToken); int len = strlen(expr); exprlen+ = #; int b=0, e=0, cnt; char ch; while (b != len) ch = exprb; if (isspace(ch) /判断是否为空格 b+; else if (isalpha(ch) /矩阵 cnt = 0; e = b; while(isalpha(expre) namecnt+ = expre+; nam

10、ecnt = 0; b = e; Matrix *mat = findByName(ml, name); pToken = (Token *)malloc(sizeof(Token); pToken-type = MAT; pToken-mat = mat; push(pStackVals, pToken); else / 操作符 while (1) char cmp = priorMapgetIndex(top(pStackOps)-op)getIndex(ch); if (cmp = type = OP; pToken-op = ch; push(pStackOps, pToken); b

11、reak; else if (cmp = =) free(pop(pStackOps); break; else if (cmp = ) pToken = pop(pStackOps); switch(pToken-op) case +: pTokenB = pop(pStackVals); pTokenA = pop(pStackVals); newMat = newMatrix(0, 0); addMatrix(newMat, pTokenA-mat, pTokenB-mat); free(pTokenA); free(pTokenB); pToken = (Token *)malloc(

12、sizeof(Token); pToken-type = MAT; pToken-mat = newMat; push(pStackVals, pToken); break; case -: pTokenB = pop(pStackVals); pTokenA = pop(pStackVals); newMat = newMatrix(0, 0); subtractMatrix(newMat, pTokenA-mat, pTokenB-mat); free(pTokenA); free(pTokenB); pToken = (Token *)malloc(sizeof(Token); pTok

13、en-type = MAT; pToken-mat = newMat; push(pStackVals, pToken); break; case *: pTokenB = pop(pStackVals); pTokenA = pop(pStackVals); newMat = newMatrix(0, 0); multiplyMatrix(newMat, pTokenA-mat, pTokenB-mat); free(pTokenA); free(pTokenB); pToken = (Token *)malloc(sizeof(Token); pToken-type = MAT; pTok

14、en-mat = newMat; push(pStackVals, pToken); break; b+; newMat = top(pStackVals)-mat; freeStack(pStackVals); freeStack(pStackOps); break; ListNode *resNode = newNode(line, newMat); printLNode(resNode); freeMList(ml); return 0;Matrix *newMatrix(int rows, int cols) Matrix *mat = (Matrix *)malloc(sizeof(

15、Matrix); mat-rows = rows; mat-cols = cols; return mat;void freeMatrix(Matrix *mat) free(mat); mat = NULL;int addMatrix(Matrix *c, Matrix *a, Matrix *b) int i, j; if (a-rows != b-rows | a-cols != b-cols) / error to add printf(矩阵维数输入错误!); return 0; else c-rows = a-rows; c-cols = a-cols; for (i = 0; i

16、rows; i+) for (j = 0; j cols; j+) c-dataij = a-dataij + b-dataij; return 1; int subtractMatrix(Matrix *c, Matrix *a, Matrix *b) int i, j; if (a-rows != b-rows | a-cols != b-cols) / error to add printf(矩阵维数输入错误!); return 0; else c-rows = a-rows; c-cols = a-cols; for (i = 0; i rows; i+) for (j = 0; j

17、cols; j+) c-dataij = a-dataij - b-dataij; return 1; int multiplyMatrix(Matrix *c, Matrix *a, Matrix *b) int i, j, k; if (a-cols != b-rows) return 0; else c-rows = a-rows; c-cols = b-cols; for (i = 0; i rows; i+) for (j = 0; j cols; j+) c-dataij = 0; for (k = 0; k cols; k+) c-dataij += a-dataik*b-dat

18、akj; return 1; void printMatrix(Matrix *mat) int i, j; for (i = 0; i rows; i+) for (j = 0; j cols; j+) printf(t%.2f, mat-dataij); printf(n); void printLNode(ListNode *node) printf(%s=n, node-name); printMatrix(node-mat);ListNode *newNode(char name, Matrix *mat) ListNode *node = (ListNode*)malloc(siz

19、eof(ListNode); strcpy(node-name, name); node-mat = mat; node-next = NULL; return node;MList *newMList() MList *ml = (MList *)malloc(sizeof(MList); ml-head = NULL; return ml;void freeNode(ListNode *node) if (node = NULL) return; freeMatrix(node-mat); free(node);void freeMList(MList *ml) if (ml = NULL

20、) return; ListNode *currNode, *temp; currNode = ml-head; while (currNode != NULL) temp = currNode; freeNode(temp); currNode = currNode-next; free(ml);void addNode(MList *ml, ListNode *node) node-next = ml-head; ml-head = node;ListNode *parseMat(char line) char tmpMAX_CHAR; Matrix *mat = newMatrix(0,

21、 0); char *pch, *pch1, *pstop; pch = strchr(line, =); *pch = 0; ListNode *node = newNode(line, mat); char *data = pch+2; pstop = strchr(data, ); *pstop = 0; pch = strtok(data, ;); while (pch != NULL) strcpy(tmp, pch); pch1 = strtok(tmp, ); mat-cols = 0; while (pch1 != NULL) mat-datamat-rowsmat-cols+

22、 = atof(pch1); pch1 = strtok(NULL, ); mat-rows+; if (pch+strlen(pch) = pstop) break; pch = strtok(pch+strlen(pch)+1, ;); return node;Matrix *findByName(MList *ml, char name) ListNode *currNode = ml-head; while (currNode != NULL) if (strcmp(name, currNode-name) = 0) return currNode-mat; currNode = currNode-next; return NULL;Stack* initStack(int cap) int i; Stack *pSta

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

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