在写矩阵运算器,伴随矩阵部分按照常规数学思路进行求解,先求余子式(用了新一个数组储存,去掉i行j列后其余数据向内挪填补空缺)代数余子式再转置,但得到的结果有问题,没有找到错误位置。
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
double **chushihua(int m,int n){
double **a=NULL;
int i,j;
a=(double **)malloc((m+1)*sizeof(double*));
for(i=0;i<m;i++){
a[i]=(double*)malloc((n+1)*sizeof(double));
}//申请动态内存
printf("请输入矩阵数据:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%lf",&a[i][j]);
}
}
return a;
}
void transpose(double **a,int m,int n){
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++){
printf("%.2lf\t",a[j][i]);
}
printf("\n");
}
}
void dayin(double **matrix,int m,int n){
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++){
printf("%.2lf\t",matrix[i][j]);
}
printf("\n");
}
}
int main(){
int m,n,caozuo,i,j;
double **matrix1=NULL;
printf("请输入矩阵的行数:");
scanf("%d",&m); //m为第一个矩阵的行数
printf("请输入矩阵的列数:");
scanf("%d",&n); //n为第一个矩阵的列数
matrix1=chushihua(m,n);
printf("请输入对应的数字编号选择您想要进行的操作:\n1.求转置矩阵;\n2.两个矩阵相加;\n3.求两个矩阵的乘积;\n4.求满足条件的方阵A的伴随矩阵A * 、逆矩阵A -1;\n5.退出\n");
scanf("%d",&caozuo);
if(caozuo==1){
printf("转置后矩阵为:\n");
transpose(matrix1,m,n);
}
else if(caozuo==2){
double matrix2[m][n];
printf("请输入与其相加的矩阵数据:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
scanf("%lf",&matrix2[i][j]);
}
}
printf("相加后矩阵为:\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%.2lf\t",matrix1[i][j]+matrix2[i][j]);
}
printf("\n");
}
}
else if(caozuo==3){
int col,k;
double **matrix3=NULL,**matrix4=NULL;
printf("与之相乘的矩阵的行数与第一个矩阵列数相同。\n");
printf("请输入与之相乘的矩阵的列数:");
scanf("%d",&col);
matrix3=(double **)malloc((n+1)*sizeof(double*));
for(i=0;i<n;i++){
matrix3[i]=(double*)malloc((col+1)*sizeof(double));
}
matrix3=chushihua(n,col);
double multi[m][col],sum;
printf("相乘后矩阵为:\n");
for(i=0;i<m;i++){
for(j=0;j<col;j++){
sum=0;
for(k=0;k<n;k++){
sum+=matrix1[i][k]*matrix3[k][j];
}//循环相加求和计算单个元素
multi[i][j]=sum;//存入乘积数组
printf("%.2lf\t",multi[i][j]);
}
printf("\n");
}
}
else if(caozuo==4){
int t,k,row;
double sum1,sum2;
if(m!=n){
printf("原矩阵行列数不等,无法求伴随矩阵及逆矩阵,请输入新矩阵的行列数:\n");
scanf("%d",&row);
double matrix4[row][row],follow[row][row],yuzishi[row-1][row-1];
printf("请输入矩阵数据:\n");
for(i=0;i<row;i++){
for(j=0;j<row;j++){
scanf("%lf",&matrix4[i][j]);
}
}//原行列数不等的建立新数组储存新矩阵
for(i=0;i<row;i++){
for(j=0;j<row;j++){
for(k=0;k<i;k++){
for(t=0;t<j;t++){
yuzishi[k][t]=matrix4[k][t];
}
}//i行j列内正常复制
for(k=i;k<row-1;k++){
for(t=0;t<j;t++){
yuzishi[k][t]=matrix4[k+1][t];
}//超过i行的向上移一行
}
for(k=0;k<i;k++){
for(t=j;t<row-1;t++){
yuzishi[k][t]=matrix4[k][t+1];
}//超过j列的向左移一列
}
for(k=i;k<row-1;k++){
for(t=j;t<row-1;t++){
yuzishi[k][t]=matrix4[k+1][t+1];
}//i行j列外向内移一个
}//求出余子式
for(k=0;k<row-1;k++){
if(k==0){
sum1=yuzishi[0][0];
sum2=yuzishi[0][row-1];
}
else if(k!=0){
sum1*=yuzishi[k][k];//正对角线之积
sum2*=yuzishi[k][row-k-1];//反对角线之积
}
}
if((i+j)%2==0){
follow[i][j]=sum1-sum2;
}
else{
follow[i][j]=sum2-sum1;
}//求出代数余子式的值
}//原矩阵中一个数值的代数余子式求解完毕
}
printf("伴随矩阵为:\n");
for(i=0;i<row;i++){
for(j=0;j<row;j++){
printf("%.2lf\t",follow[j][i]);//进行转置,得到伴随矩阵
}
printf("\n");
}
}
else{
row=m;
double matrix4[row][row],yuzishi[row-1][row-1],follow[row][row];
for(i=0;i<row;i++){
for(j=0;j<row;j++){
matrix4[i][j]=matrix1[i][j];
}
}
for(i=0;i<row;i++){
for(j=0;j<row;j++){
for(k=0;k<i;k++){
for(t=0;t<j;t++){
yuzishi[k][t]=matrix4[k][t];
}
}//i行j列内正常复制
for(k=i;k<row-1;k++){
for(t=0;t<j;t++){
yuzishi[k][t]=matrix4[k+1][t];
}//超过i行的向上移一行
}
for(k=0;k<i;k++){
for(t=j;t<row-1;t++){
yuzishi[k][t]=matrix4[k][t+1];
}//超过j列的向左移一列
}
for(k=i;k<row-1;k++){
for(t=j;t<row-1;t++){
yuzishi[k][t]=matrix4[k+1][t+1];
}//i行j列外向内移一个
}//求出余子式
for(k=0;k<row-1;k++){
if(k==0){
sum1=yuzishi[0][0];
sum2=yuzishi[0][row-1];
}
else if(k!=0){
sum1*=yuzishi[k][k];//正对角线之积
sum2*=yuzishi[k][row-k-1];//反对角线之积
}
}
if((i+j)%2==0){
follow[i][j]=sum1-sum2;
}
else{
follow[i][j]=sum2-sum1;
}//求出代数余子式的值
}//原矩阵中一个数值的代数余子式求解完毕
}
printf("伴随矩阵为:\n");
for(i=0;i<row;i++){
for(j=0;j<row;j++){
printf("%.2lf\t",follow[j][i]);//进行转置,得到伴随矩阵
}
printf("\n");
}
}//相等的继续运算
}
else if(caozuo==5){
exit(0);
}
else{
printf("错误");
}
}
运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
已经检查很多遍了,还是没找到错误的位置
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
希望能帮我找出错误,在原有代码上改正,不要通篇换思路,谢谢