CharlesCHR 2019-01-06 00:09 采纳率: 0%
浏览 772

C中指向double型的指针作形参,在运算编译的时候报错,不知道原因?

本题的实现要求用函数实现,主函数只负责进行函数调用。函数的参数要求全部用到的情况是:
 用数组名作函数参数;
 用指向数组元素的指针变量作函数参数;
 用指向一维数组的指针变量作函数参数;
题目:输入两个行、列数相同的矩阵(实际上是二维数组)A、B,以矩阵的方式分别输出A、B;求矩阵的和并输出;求出每个矩阵中的最大值及其位置;求出每个矩阵中绝对值最大的元素及其位置。下面的各要求通过编写函数实现:
① 输入矩阵(实际上是二维数组);
② 输出矩阵;
③ 求出两个矩阵的和。设A=(aij)m×n,B=(bij)m×n,则C=A+B=(cij)m×n,cij= aij+ bij;
④ 求矩阵中的最大值及其位置;
⑤ 求矩阵中绝对值最大的元素及其位置。

程序一直没有编译成功

附上报错图
图片说明

#include<stdio.h>
#define M 4
#define N 4

int input_A(double a[][N]) 
{
    int j,k;
    printf("Please input A:\n");
    for(j=0;j<M;j++)
        for(k=0;k<N;k++)
        {
            scanf("%5d",&a[j][k]);
        }
}
int input_B(double b[][N]) 
{
    int j,k;
    printf("Please input B:\n");
    for(j=0;j<M;j++)
        for(k=0;k<N;k++)
        {
            scanf("%5d",&b[j][k]);
        }
}
int output(double a[][N],double b[][N])
{
    int j,k;
    printf("output A:\n");
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            printf("%5d",a[j][k]);
        }
        printf("\n");
    }
    printf("output B:\n");
    for(j=0;j<N;j++)
    {
            for(k=0;k<N;k++)
            {
                printf("%5d",b[j][k]);
            }
        printf("\n");
    }
}
double sum(double *p,double *q,double *c[N])
{
    int j,k;
    double sum;
    for(j=0;j<N;j++)
        for(k=0;k<N;k++)
        {
            c[j][k]=*(*(p+j)+k)+*(*(q+j)+k);
        }
    for(j=0;j<N;j++)
        for(k=0;k<N;k++)
        {
            sum=sum+*(*(c+j)+k);
        }
    printf("总和为%lf",sum);
}
int max(double *p,double *q) 
{
    double *ma,*mb;
    int j,k,jm,km;
    ma=p;mb=q;
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(*(*(p+j)+k)>*ma)
            {
                jm=j;
                km=k;
                *ma=*(*(p+j)+k);
            }
        }
    }
    printf("A矩阵中最大值为%lf,位置:%d行%d列\n",*ma,j+1,k+1);
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(*(*(q+j)+k)>*mb)
            {
                jm=j;
                km=k;
                *mb=*(*(q+j)+k);
            }
        }
    }
    printf("B矩阵中最大值为%lf,位置:%d行%d列\n",*mb,j+1,k+1);
}


int abs_max(double a[][N],double b[][N]) 
{
    double *ma,*mb;
    int j,k,jm,km;
    ma=a[0][0];mb=b[0][0];
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(((a[j][k]>=0)?a[j][k]:-a[j][k])>*ma)
            {
                jm=j;
                km=k;
                *ma=a[j][k];
            }
        }
    }
    printf("A矩阵中绝对最大值为%lf,位置:%d行%d列\n",*ma,j+1,k+1);
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(((b[j][k]>=0)?b[j][k]:-b[j][k])>*mb)
            {
                jm=j;
                km=k;
                *mb=b[j][k];
            }
        }
    }
    printf("B矩阵中绝对最大值为%lf,位置:%d行%d列\n",*mb,j+1,k+1);
}

main()
{
    double A[M][N],B[M][N],C[M][N];
    input_A(A);
    input_B(B);
    output(A,B);
    sum(A,B,C);
    max(A,B);
    abs_max(A,B);

} 

新手一枚
谢谢大佬们指教

下面是根据评论区大神建议修改后的代码:

#include<stdio.h>
#define M 4
#define N 4

int input_A(double a[][N]) 
{
    int j,k;
    printf("Please input A:\n");
    for(j=0;j<M;j++)
        for(k=0;k<N;k++)
        {
            scanf("%lf",&a[j][k]);
        }
}
int input_B(double b[][N]) 
{
    int j,k;
    printf("Please input B:\n");
    for(j=0;j<M;j++)
        for(k=0;k<N;k++)
        {
            scanf("%lf",&b[j][k]);
        }
}
int output(double a[][N],double b[][N])
{
    int j,k;
    printf("output A:\n");
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            printf(" %5.2lf ",a[j][k]);
        }
        printf("\n");
    }
    printf("output B:\n");
    for(j=0;j<N;j++)
    {
            for(k=0;k<N;k++)
            {
                printf(" %5.2lf ",b[j][k]);
            }
        printf("\n");
    }
}
double sum(double (*p)[N],double (*q)[N],double (*c)[N])
{
    int j,k;
    double sum;
    for(j=0;j<N;j++)
        for(k=0;k<N;k++)
        {
            c[j][k]=*(*(p+j)+k)+*(*(q+j)+k);
        }
    for(j=0;j<N;j++)
        for(k=0;k<N;k++)
        {
            sum=sum+*(*(c+j)+k);
        }
    printf("总和为%.2lf\n",sum);
}
int max(double (*p)[N],double (*q)[N]) 
{
    double *ma,*mb;
    int j,k,jm,km;
    ma=*p;mb=*q;
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(*(*(p+j)+k)>*ma)
            {
                jm=j;
                km=k;
                ma=*(p+j)+k;
            }
        }
    }
    printf("A矩阵中最大值为%lf,位置:%d行%d列\n",*ma,jm+1,km+1);
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(*(*(q+j)+k)>*mb)
            {
                jm=j;
                km=k;
                mb=*(q+j)+k;
            }
        }
    }
    printf("B矩阵中最大值为%lf,位置:%d行%d列\n",*mb,jm+1,km+1);
}


int abs_max(double a[][N],double b[][N]) 
{
    double *ma,*mb;
    int j,k,jm,km;
    ma=&a[0][0];mb=&b[0][0];
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(((a[j][k]>=0)?a[j][k]:-a[j][k])>*ma)
            {
                jm=j;
                km=k;
                ma=&a[j][k];
            }
        }
    }
    printf("A矩阵中绝对最大值为%lf,位置:%d行%d列\n",*ma,jm+1,km+1);
    for(j=0;j<N;j++)
    {
        for(k=0;k<N;k++)
        {
            if(((b[j][k]>=0)?b[j][k]:-b[j][k])>*mb)
            {
                jm=j;
                km=k;
                mb=&b[j][k];
            }
        }
    }
    printf("B矩阵中绝对最大值为%lf,位置:%d行%d列\n",*mb,jm+1,km+1);
}

main()
{
    double A[M][N],B[M][N],C[M][N];
    input_A(A);
    input_B(B);
    output(A,B);
    sum(A,B,C);
    max(A,B);
    abs_max(A,B);

} 

可以_正常运行_

  • 写回答

1条回答 默认 最新

  • 追天荧火 2019-01-06 11:06
    关注

    同样都是矩阵,为什么传参数这么多变啊?
    你定义的 double A[M][N] 这里的A是 **double 而sum的参数是 *double,为什么不直接用后面C的double *C[N]
    ,而且你之前都是用double A[][N]的,还有你的输入函数是%lf,不是%d,而且这里你逐个输入感觉也没必要前面加个5,
    还有你这里大多数函数都没有返回值,不用返回值的话就用void。
    暂且就说这么一点,要素太多··

    评论

报告相同问题?

悬赏问题

  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换