编写程序,输入整数n(2<=n<=10)、n阶方阵A,计算A的逆矩阵并输出。要求使用指针进行操作,矩阵存储采用动态内存分配,矩阵元素为double类型,最终结果四舍五入保留两位小数输出,矩阵不可逆则输出0。
时间: 2024-06-09 14:12:37 浏览: 74
好的,您的第一个问题是关于矩阵求逆的程序。以下是程序的实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double** create_matrix(int n) {
double** matrix = (double**) malloc(n * sizeof(double*));
for(int i = 0; i < n; i++) {
matrix[i] = (double*) malloc(n * sizeof(double));
}
return matrix;
}
void destroy_matrix(double** matrix, int n) {
for(int i = 0; i < n; i++) {
free(matrix[i]);
}
free(matrix);
}
int get_matrix(double** matrix, int n) {
printf("请输入一个%d阶方阵的元素:\n", n);
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
scanf("%lf", &matrix[i][j]);
}
}
return 1;
}
void put_matrix(double** matrix, int n) {
printf("矩阵逆矩阵为:\n");
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%.2f ", matrix[i][j]);
}
printf("\n");
}
}
void print_eq(double** matrix, int n) {
printf("输入矩阵:\n");
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
printf("%.2f\t", matrix[i][j]);
}
printf("\n");
}
}
double** inverse_matrix(double** matrix, int n) {
double** inverse = create_matrix(n);
double det = 0;
double tmp;
int flag = 1;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i == j) { inverse[i][j] = 1; }
else { inverse[i][j] = 0; }
}
}
for(int i = 0; i < n; i++) {
det = matrix[i][i];
if(det == 0) {
flag = 0;
break;
}
else {
for(int j = 0; j < n; j++) {
matrix[i][j] /= det;
inverse[i][j] /= det;
}
for(int j = 0; j < n; j++) {
if(j != i) {
tmp = matrix[j][i];
for(int k = 0; k < n; k++) {
matrix[j][k] -= matrix[i][k] * tmp;
inverse[j][k] -= inverse[i][k] * tmp;
}
}
}
}
}
if(flag == 0) {
destroy_matrix(inverse, n);
return NULL;
}
else {
return inverse;
}
}
int main() {
int n;
printf("请输入矩阵的阶数:");
scanf("%d", &n);
double** matrix = create_matrix(n);
if(get_matrix(matrix, n) != 1) {
printf("输入有误。\n");
return -1;
}
double** inverse = inverse_matrix(matrix, n);
if(inverse == NULL) {
printf("该矩阵不可逆。\n");
}
else {
put_matrix(inverse, n);
destroy_matrix(inverse, n);
}
destroy_matrix(matrix, n);
return 0;
}
```
注意,这段程序中包括了动态内存分配的函数,利用指针进行操作;使用高斯-约旦消元法求解矩阵逆的函数;程序还输出了矩阵的逆矩阵,四舍五入保留两位小数。
请问您还有其他问题需要我回答吗?
阅读全文