#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <math.h> // 用于浮点数取整判断(可选)#define MAX_DIMENSION 100 // 支持的最大矩阵维度(可根据需求调整)// 定义矩阵结构体(包含行数、列数、数据指针)typedef struct { int rows; int cols; double* data; // 动态存储元素(支持整数/浮点数,统一用double存储)} Matrix;// 校验维度合法性(行数、列数>0)bool validateDimension(int rows, int cols) { return (rows > 0 && cols > 0 && rows <= MAX_DIMENSION && cols <= MAX_DIMENSION);}// 分配矩阵内存并初始化(数据默认初始化为0)Matrix* createMatrix(int rows, int cols) { if (!validateDimension(rows, cols)) { fprintf(stderr, "错误:矩阵维度不合法(rows/cols需>0且≤%d)\n", MAX_DIMENSION); return NULL; } Matrix* mat = (Matrix*)malloc(sizeof(Matrix)); mat->rows = rows; mat->cols = cols; mat->data = (double*)calloc(rows * cols, sizeof(double)); // 自动初始化为0 return mat;}// 释放矩阵内存void freeMatrix(Matrix* mat) { if (mat) { free(mat->data); free(mat); }}// 输入矩阵元素(支持整数/浮点数,提示用户逐行输入)void inputMatrix(Matrix* mat) { printf("请输入%d×%d矩阵的元素(每行%d个,用空格分隔):\n", mat->rows, mat->cols, mat->cols); for (int i = 0; i < mat->rows; i++) { for (int j = 0; j < mat->cols; j++) { scanf("%lf", &mat->data[i * mat->cols + j]); // 按行优先存储 } }}// 生成示例矩阵(0:零矩阵;1:单位矩阵;其他:随机矩阵,仅整数示例)void generateSampleMatrix(Matrix* mat, int type) { if (type == 0) { // 零矩阵 for (int i = 0; i < mat->rows * mat->cols; i++) { mat->data[i] = 0.0; } } else if (type == 1) { // 单位矩阵(需方阵) if (mat->rows != mat->cols) { fprintf(stderr, "警告:生成单位矩阵需为方阵,当前维度不合法,生成零矩阵\n"); generateSampleMatrix(mat, 0); return; } for (int i = 0; i < mat->rows; i++) { for (int j = 0; j < mat->cols; j++) { mat->data[i * mat->cols + j] = (i == j) ? 1.0 : 0.0; } } } else { // 随机整数矩阵(1-10),仅示例用 for (int i = 0; i < mat->rows * mat->cols; i++) { mat->data[i] = (double)(rand() % 10 + 1); } } printf("示例矩阵生成成功!\n");}// 矩阵加法(A + B,返回新矩阵,维度不匹配返回NULL)Matrix* matrixAdd(Matrix* A, Matrix* B) { if (A->rows != B->rows || A->cols != B->cols) { fprintf(stderr, "错误:加法要求矩阵维度相同(%d×%d vs %d×%d)\n", A->rows, A->cols, B->rows, B->cols); return NULL; } Matrix* C = createMatrix(A->rows, A->cols); if (!C) return NULL; for (int i = 0; i < A->rows * A->cols; i++) { C->data[i] = A->data[i] + B->data[i]; } return C;}// 矩阵乘法(A × B,返回新矩阵,维度不匹配返回NULL)Matrix* matrixMultiply(Matrix* A, Matrix* B) { if (A->cols != B->rows) { fprintf(stderr, "错误:乘法要求A的列数等于B的行数(%d vs %d)\n", A->cols, B->rows); return NULL; } Matrix* C = createMatrix(A->rows, B->cols); if (!C) return NULL; for (int i = 0; i < C->rows; i++) { for (int j = 0; j < C->cols; j++) { double sum = 0.0; for (int k = 0; k < A->cols; k++) { sum += A->data[i * A->cols + k] * B->data[k * B->cols + j]; } C->data[i * C->cols + j] = sum; } } return C;}// 矩阵转置(返回新矩阵)Matrix* matrixTranspose(Matrix* A) { Matrix* AT = createMatrix(A->cols, A->rows); if (!AT) return NULL; for (int i = 0; i < A->rows; i++) { for (int j = 0; j < A->cols; j++) { AT->data[j * AT->rows + i] = A->data[i * A->cols + j]; // 行列互换 } } return AT;}// 格式化打印矩阵(自动对齐列,保留2位小数,整数显示为整数)void printMatrix(Matrix* mat, const char* title) { if (!mat) { printf("NULL矩阵\n"); return; } printf("\n%s(%d×%d):\n", title, mat->rows, mat->cols); for (int i = 0; i < mat->rows; i++) { for (int j = 0; j < mat->cols; j++) { double val = mat->data[i * mat->cols + j]; // 判断是否为整数(允许微小浮点误差,如1.0视为整数) if (fabs(val - round(val)) < 1e-6) { printf("%6d", (int)val); // 整数占6位宽度 } else { printf("%6.2f", val); // 浮点数保留2位小数,占6位宽度 } } printf("\n"); }}// 主菜单void menu() { printf("\n==== 矩阵运算系统 ====\n"); printf("1. 输入矩阵A\n"); printf("2. 输入矩阵B\n"); printf("3. 生成示例矩阵A(0:零矩阵,1:单位矩阵,其他:随机整数矩阵)\n"); printf("4. 生成示例矩阵B(0:零矩阵,1:单位矩阵,其他:随机整数矩阵)\n"); printf("5. 矩阵加法 A + B\n"); printf("6. 矩阵乘法 A × B\n"); printf("7. 矩阵A转置\n"); printf("8. 矩阵B转置\n"); printf("0. 退出系统\n"); printf("请选择操作(0-8):");}int main() { srand(time(NULL)); // 初始化随机数种子 Matrix *A = NULL, *B = NULL, *result = NULL; int choice, sampleType; while (1) { menu(); scanf("%d", &choice); switch (choice) { case 0: // 退出 freeMatrix(A); freeMatrix(B); freeMatrix(result); printf("退出系统,再见!\n"); return 0; case 1: // 输入矩阵A int rowsA, colsA; printf("请输入矩阵A的行数:"); scanf("%d", &rowsA); printf("请输入矩阵A的列数:"); scanf("%d", &colsA); if (!validateDimension(rowsA, colsA)) { printf("维度不合法,输入无效!\n"); continue; } freeMatrix(A); // 释放旧内存 A = createMatrix(rowsA, colsA); if (A) inputMatrix(A); break; case 2: // 输入矩阵B int rowsB, colsB; printf("请输入矩阵B的行数:"); scanf("%d", &rowsB); printf("请输入矩阵B的列数:"); scanf("%d", &colsB); if (!validateDimension(rowsB, colsB)) { printf("维度不合法,输入无效!\n"); continue; } freeMatrix(B); // 释放旧内存 B = createMatrix(rowsB, colsB); if (B) inputMatrix(B); break; case 3: // 生成示例矩阵A if (!A) { printf("请先为矩阵A分配维度(输入行数/列数)!\n"); continue; } printf("请输入示例类型(0:零矩阵,1:单位矩阵,其他:随机整数矩阵):"); scanf("%d", &sampleType); generateSampleMatrix(A, sampleType); break; case 4: // 生成示例矩阵B if (!B) { printf("请先为矩阵B分配维度(输入行数/列数)!\n"); continue; } printf("请输入示例类型(0:零矩阵,1:单位矩阵,其他:随机整数矩阵):"); scanf("%d", &sampleType); generateSampleMatrix(B, sampleType); break; case 5: // 矩阵加法 if (!A || !B) { printf("错误:请先输入矩阵A和B!\n"); continue; } result = matrixAdd(A, B); if (result) printMatrix(result, "加法结果 C = A + B"); freeMatrix(result); // 释放临时结果 result = NULL; break; case 6: // 矩阵乘法 if (!A || !B) { printf("错误:请先输入矩阵A和B!\n"); continue; } result = matrixMultiply(A, B); if (result) printMatrix(result, "乘法结果 C = A × B"); freeMatrix(result); result = NULL; break; case 7: // 矩阵A转置 if (!A) { printf("错误:请先输入矩阵A!\n"); continue; } result = matrixTranspose(A); printMatrix(result, "矩阵A的转置 A^T"); freeMatrix(result); result = NULL; break; case 8: // 矩阵B转置 if (!B) { printf("错误:请先输入矩阵B!\n"); continue; } result = matrixTranspose(B); printMatrix(result, "矩阵B的转置 B^T"); freeMatrix(result); result = NULL; break; default: printf("无效选择,请输入0-8!\n"); } } return 0;}
跟这个程序对比一下,说明两个程序的优缺点