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