#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;
}
经过以上修改,程序可以正确找出每列的最大最小值。
可是运行结果还是错误的
这个程序有以下错误:
数组 cr 的第二维应该是 2,而不是 1,因为每个列有两个值(最大值和最小值)。
在第 11 行,应该将 a 和 b 的值交换,而不是将 a 和 t 的值交换。
在第 15 行,应该将 cr[i][1] 赋值为 a,cr[i][2] 赋值为 b。
在第 24 行,应该将 cr[i][2] 输出为最小值,而不是 cr[i][1]。
不知道你这个问题是否已经解决, 如果还没有解决的话:这个问题要得到每位数的逆序输出,就需要我们从个位数到最高位数一次输出,获取方式可以通过对10取余的方式实现,每次可以获得整数n的末位数字,并且将此数字输出,最后对该整数n整除10,以使下一位数字成为末位数字得到并输出。如此循环往复直到整数n为0。但是又有两个问题了,如果是负数怎么办,是0怎么办?其实很简单我们将负数取其正值,先预先输出一个符号,再输出其正值的各位位数。对0的处理,可以通过用上面的类似方式,也可以通过C语言中的do…while循环,这样就可以实现对0的输出,以下是C语言的实现代码:
int PrintReverse(int n){
if(n < 0){
n = -n;
printf("-");
}
do{
printf("%d ",n%10);
n /= 10;
}while(n != 0);
printf("\n");
return 0;
}