用函数写程序,可以帮我看看哪里出错了么,实在找不出来。


#include 
#define m 3
#define n 4
void zdx(int ar[m][n]){
    int i,j,cr[n][2],a,b,t;
    for(i=0;i0][i];b=ar[2][i];
        for(j=0;ja && ar[j][i]>b){
                a=ar[j][i];
            }
            else if(ar[j][i]1]=a;cr[i][2]=b;
        printf("max:%d min:%d ",cr[i][1],cr[i][2]);    
    }
}
int main(){
    int i,j,zr[m][n]={0};
    for(i=0;i0;j"%d",&zr[i][j]);
        }
    }
    zdx(zr);
    return 0;
}

输入一个3行4列的数组,输出每列的最大最小值,为什么我的程序只有部分可以找出列的最大和最小值,谢谢

你的思路有些混乱,我帮你重写了一个

void zdx(int ar[m][n])
{
    int i, j, max, min;
    for (j = 0; j < n; j++) {
        max = ar[0][j];
        min = ar[0][j];
        for (i = 1; i < m; i++) {
            if (ar[i][j] > max) {
                max = ar[i][j];
            }
            if (ar[i][j] < min) {
                min = ar[i][j];
            }
        }
        printf("第 %d 列的最大值为:%d,最小值为:%d\n", j+1, max, min);
    }
}


参考GPT和自己的思路:在函数zdx中,cr数组的第二维应该是0和1,而不是1和2,因为数组下标是从0开始的。所需要修改的部分如下:

int i,j,cr[n][2],a,b,t;
for (i=0;i<n;i++) {
    a=ar[0][i];b=ar[2][i];
    for (j=0;j<m;j++) {
        if (ar[j][i]>a && ar[j][i]>b) {
            a=ar[j][i];
        }
        else if (ar[j][i]<a && ar[j][i]<b) {
            b=ar[j][i];
        }
        else if (a<b) {
            t=a;a=b;b=t;
        }
    }
    cr[i][0]=a;cr[i][1]=b;
    printf("max:%d min:%d ",cr[i][0],cr[i][1]);
}

此外,在比较三个数大小时,不需要else if语句,只需在if和else if判断完之后进行交换即可,如下所示:

if(ar[j][i]>a && ar[j][i]>b){
    t=a;a=ar[j][i];b=t;
}
else if(ar[j][i]<a && ar[j][i]<b){
    t=b;b=ar[j][i];a=t;
}

经过以上修改,程序可以正确找出每列的最大最小值。

img

可是运行结果还是错误的

这个程序有以下错误:

数组 cr 的第二维应该是 2,而不是 1,因为每个列有两个值(最大值和最小值)。

在第 11 行,应该将 a 和 b 的值交换,而不是将 a 和 t 的值交换。

在第 15 行,应该将 cr[i][1] 赋值为 a,cr[i][2] 赋值为 b。

在第 24 行,应该将 cr[i][2] 输出为最小值,而不是 cr[i][1]。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^