编写程序,输入整数n(2<=n<=10)、n阶方阵A,计算A的逆矩阵并输出。要求使用指针进行操作,矩阵存储采用动态内存分配,矩阵元素为double类型,最终结果四舍五入保留两位小数输出,矩阵不可逆则输出0。
时间: 2024-05-12 10:16:44 浏览: 234
好的,根据您的要求,我可以给您提供一个C语言的代码实现,如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 10
// 定义一个矩阵类型
typedef struct {
int n; // 矩阵的阶数
double **data; // 矩阵的元素(二维指针)
} Matrix;
// 函数声明
Matrix *create_matrix(int n); // 创建矩阵并初始化
void destroy_matrix(Matrix *mat); // 释放矩阵占用的内存
void print_matrix(Matrix *mat); // 打印矩阵
int inverse_matrix(Matrix *A, Matrix *B); // 求矩阵的逆
int main() {
int n, i, j;
double num;
Matrix *A, *B;
// 输入整数n
do {
printf("请输入整数n(2<=n<=10):");
scanf("%d", &n);
} while (n < 2 || n > 10);
// 创建n阶方阵A
A = create_matrix(n);
// 输入n阶方阵A的元素
printf("请输入%d阶方阵A的元素:\n", n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%lf", &num);
A->data[i][j] = num;
}
}
// 创建n阶单位矩阵B
B = create_matrix(n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
B->data[i][j] = (i == j) ? 1 : 0;
}
}
// 求矩阵A的逆,并存储在矩阵B中
if (inverse_matrix(A, B) == 0) {
printf("矩阵不可逆,无法求逆矩阵!\n");
} else {
// 打印矩阵B(逆矩阵)
printf("矩阵A的逆矩阵为:\n");
print_matrix(B);
}
// 释放矩阵A、B占用的内存
destroy_matrix(A);
destroy_matrix(B);
return 0;
}
// 创建矩阵并初始化
Matrix *create_matrix(int n) {
int i;
Matrix *mat = (Matrix *) malloc(sizeof(Matrix));
mat->n = n;
mat->data = (double **) malloc(n * sizeof(double *));
for (i = 0; i < n; i++) {
mat->data[i] = (double *) malloc(n * sizeof(double));
}
return mat;
}
// 释放矩阵占用的内存
void destroy_matrix(Matrix *mat) {
int i;
for (i = 0; i < mat->n; i++) {
free(mat->data[i]);
}
free(mat->data);
free(mat);
}
// 打印矩阵
void print_matrix(Matrix *mat) {
int i, j;
for (i = 0; i < mat->n; i++) {
for (j = 0; j < mat->n; j++) {
printf("%6.2lf ", mat->data[i][j]);
}
printf("\n");
}
}
// 求矩阵的逆
int inverse_matrix(Matrix *A, Matrix *B) {
int i, j, k, max_i;
double max, temp;
double **a = A->data, **b = B->data;
int n = A->n;
// 构造增广矩阵
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
b[i][j + n] = (i == j) ? 1 : 0;
b[i][j] = a[i][j];
}
}
// 高斯消元化为上三角矩阵
for (k = 0; k < n; k++) {
max = a[k][k];
max_i = k;
// 选主元
for (i = k + 1; i < n; i++) {
if (fabs(a[i][k]) > fabs(max)) {
max = a[i][k];
max_i = i;
}
}
// 判断矩阵是否可逆
if (max == 0) {
return 0;
}
// 行交换
if (max_i != k) {
for (j = 0; j < n * 2; j++) {
temp = b[k][j];
b[k][j] = b[max_i][j];
b[max_i][j] = temp;
}
}
// 消元操作,将下面的元素都消为0
for (i = k + 1; i < n; i++) {
temp = a[i][k] / a[k][k];
for (j = k + 1; j < n; j++) {
a[i][j] -= temp * a[k][j];
}
for (j = 0; j < n * 2; j++) {
b[i][j] -= temp * b[k][j];
}
}
}
// 求逆矩阵,化为对角矩阵
for (k = n - 1; k >= 0; k--) {
temp = a[k][k];
for (i = 0; i < n * 2; i++) {
b[k][i] /= temp;
}
a[k][k] = 1;
for (i = k - 1; i >= 0; i--) {
temp = a[i][k];
for (j = 0; j < n * 2; j++) {
b[i][j] -= temp * b[k][j];
}
a[i][k] = 0;
}
}
return 1;
}
```
希望这个代码能够帮助您,如果还有其他问题,请继续提问。
阅读全文