?小白第一次发帖,大一刚刚学了线代,于是乎想用刚学的C语言写一个计算行列式、矩阵乘法、矩阵求逆、转置的小程序,还有许多待优化的地方,希望大佬可以指点一二。
//行列式计算、矩阵转置、矩阵求积、矩阵求逆
#include <stdio.h>
#include <math.h>
#define Max 20 //行列式与矩阵最大阶数为20
void menu();//菜单
void put_matrix(int matrix[][Max], int *r, int *c);//输入矩阵
void put_det(int det[][Max], int *n);//输入行列式
void Matrix_Transpose(int matrix[][Max]);//矩阵转置
void Matrix_Multiply(int matrix1[][Max], int matrix2[][Max]);//矩阵求积
void Matrix_Inverse(int matrix[][Max]);//求矩阵的逆
int det_calculation(int det[][Max], int n);//计算行列式
int det_M(int det[][Max], int n, int j);//计算行列式余子式
int main(void) {
//定义行列式阶数
int n;
//定义矩阵与行列式
int matrix1[Max][Max], matrix2[Max][Max], det[Max][Max];
//功能选择键
int function;
printf("请选择功能按键:\n");
menu();
//循环实现数值计算系统
while (1) {
scanf("%d", &function);
if (function == 0)
break;
if (function == 1) {
put_det(det, &n);
printf("行列式det的值为:%d\n", det_calculation(det, n));
menu();
}
if (function == 2)
Matrix_Transpose(matrix1);
if (function == 3)
Matrix_Multiply(matrix1, matrix2);
if (function == 4) {
Matrix_Inverse(matrix1);
}
}
return 0;
}
//菜单界面:功能选择
void menu() {
printf("===================\n");
printf("0.退 出 系 统\n");
printf("1.计 算 行 列 式\n");
printf("2.矩 阵 的 转 置\n");
printf("3.求 矩 阵 的 积\n");
printf("4.求 矩 阵 的 逆\n");
printf("===================\n");
}
//输入矩阵
void put_matrix(int matrix[][Max], int *r, int *c) {
//输入一个矩阵
printf("请输入矩阵行数列数:");
scanf("%d%d", r, c);
printf("请输入矩阵:\n");
for (int i = 0; i < *r; i++) {
for (int j = 0; j < *c; j++) {
scanf("%d", &matrix[i][j]);
}
}
}
//输入行列式
void put_det(int det[][Max], int *n) {
printf("请输入行列式的阶数:");
scanf("%d", n);
printf("请输入行列式det:\n");
for (int i = 0; i < *n; i++) {
for (int j = 0; j < *n; j++) {
scanf("%d", &det[i][j]);
}
}
}
//矩阵转置
void Matrix_Transpose(int matrix[][Max]) {
//定义矩阵行列数
int r, c;
put_matrix(matrix, &r, &c);
//求矩阵的转置并输出
printf("矩阵matrix的转置结果是:\n");
for (int i = 0; i < c; i++) {
for (int j = 0; j < r; j++) {
printf("%-2d", matrix[j][i]);
}
printf("\n");
}
menu();
}
//矩阵求积
void Matrix_Multiply(int matrix1[][Max], int matrix2[][Max]) {
//定义两个矩阵的行列数
int r1, c1, r2, c2;
put_matrix(matrix1, &r1, &c1);
//输入第二个矩阵
put_matrix(matrix2, &r2, &c2);
//定义一个新的矩阵来表示两个矩阵的积
int matrix3[Max][Max] = {0};
//求矩阵的积
if (c1 != r2) {
printf("无法计算,请重新输入...\n");
Matrix_Multiply(matrix1, matrix2);
} else {
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
int j1 = 0; //定义左矩阵列数(也是右矩阵行数)
while (j1 < c1) {
matrix3[i][j] += matrix1[i][j1] * matrix2[j1][j];
j1++;
}
}
}
//输出两个矩阵的积
printf("两个矩阵的积为:\n");
for (int i = 0; i < r1; i++) {
for (int j = 0; j < c2; j++) {
printf("%d ", matrix3[i][j]);
}
printf("\n");
}
menu();
}
}
//求行列式的值、n为阶数
int det_calculation(int det[][Max], int n) {
int value = 0; //value是行列式的值
if (n == 1) {
return det[0][0];
} else {
for (int i = 0; i < n; i++) { //按第一行展开、i为首行列数
value += det[0][i] * pow(-1, i) * det_M(det, n, i);
}
}
return value;
}
//求行列式det余子式的值、n是阶数、i是首行列数
int det_M(int det[][Max], int n, int i) {
//定义一个新的行列式,用来存放行列式det的余子式
int det1[Max][Max];
//构造出余子式
for (int j = 0; j < n - 1; j++) {
for (int k = 0; k < n - 1; k++) {
if (k < i)
det1[j][k] = det[j + 1][k];
else if (k >= i)
det1[j][k] = det[j + 1][k + 1];
}
}
//返回det_calculation函数计算余子式的值
return det_calculation(det1, n - 1);
}
//求矩阵的逆
void Matrix_Inverse(int matrix[][Max]) {
//定义矩阵行列数
int r, c;
//定义一个新矩阵,存放矩阵中每个元素的余子式
int matrix3[Max][Max];
//定义一个新矩阵,表示逆矩阵
double matrix4[Max][Max];
//输入矩阵
put_matrix(matrix, &r, &c);
if (r != c) {
printf("逆矩阵不存在!\n");
menu();
} else {
int A = det_calculation(matrix, r); //矩阵的行列式的值,判断逆矩阵是否存在
if (A == 0) {
printf("逆矩阵不存在!\n");
menu();
} else {
if (r == 1) {
printf("所求逆矩阵为:\n");
printf("%.2f\n", matrix[0][0] / A );
menu();
} else {
//外面两个for循环遍历矩阵
for (int t = 0; t < r; t++) {
for (int j = 0; j < r; j++) {
//里面两个for循环构造矩阵里每个元素的余子式
for (int i = 0; i < r - 1; i++) {
for (int k = 0; k < r - 1; k++) {
matrix3[i][k] = matrix[i >= t ? i + 1 : i][k >= j ? k + 1 : k];
}
}
//求逆矩阵
matrix4[j][t] = pow(-1, t + j) * det_calculation(matrix3, r - 1) / A;
}
}
//输出逆矩阵
printf("逆矩阵为:\n");
for (int i = 0; i < r; i++) {
for (int j = 0; j < r; j++) {
printf("%-16.6lf", matrix4[i][j]);
}
printf("\n\n");
}
menu();
}
}
}
}
|