注册 登录
编程论坛 C语言论坛

新手自己编写的程序,为什么输入结果有问题,找了好久,都找不出错在哪里,请大神帮帮忙

计算机好难啊 发布于 2020-04-07 09:53, 2113 次点击
在一个二维数组b[5][4]中,找到b[i][j]元素值,即在i行中最小,且在j列中最大,有 输出下标值,没有 输出没有

#include "stdio.h"
int main()
{
    int z,k,m,i,j,flag=1,ba=0;
    int b[5][4];
    for(i=0;i<5;i++)
    for(j=0;j<4;j++)
        scanf("%d",&b[i][j]);
    for(i=0;i<5;i++)
    {
        for(j=0;j<4;j++)
        {
        for(k=0;k<4;k++)
        {if(k==j) continue;
         if(b[i][j]>b[i][k])
          break;
          else
           z=j;
        }         
        }
        for(k=0;k<5;k++)
        {if(k==i) continue;
         if(b[i][z]<b[k][z])
         {
          break;
         }
         else
         {
         m=i;
         ba=1;
         flag=0;
         }
        }
     if(ba) break;
    }
    if(flag)
        printf("No have.\n");
    else
    printf("%d\n",b[m][z]);
}
程序没问题,为什么我输入
   1 2 3 4
   2 3 4 5
   3 4 5 6
   4 5 6 7
   5 6 7 8
输出结果是  2
也不知道哪里错了,请大神帮帮忙看看,指出错误,新手上路,还有很多东西没学习到
7 回复
#2
叶纤2020-04-07 10:42
你这代码太挑战极限了,5个continue加break,反正我看着会短路
#3
wmf20142020-04-07 10:53
逻辑错误且混乱,按照你的逻辑修改如下:
     for (j = 0; j < 4; j++)
        {
            for (k = 0; k < 4; k++)
            {
                if (k == j) continue;
                if (b[i][j] > b[i][k])
                    z = j;    //这里最好不要break,否则z最后可能无初值,导致程序崩溃
                else
                    z = k;    //这里要等于k,把逻辑搞反了
            }
        }
        for (k = 0; k < 5; k++)
        {
            //if(k==i) continue;  //这里不能continue,否则永远从第二行开始判断,第一行的鞍点得不到(准确地说是当前行鞍点得不到)
            if (b[i][z] < b[k][z])
            {
                break;
            }
            else
            {
                m = k;
                ba = 1;
                flag = 0;
            }
        }
        if (ba) break;

[此贴子已经被作者于2020-4-7 11:03编辑过]

#4
计算机好难啊2020-04-07 11:48
回复 3楼 wmf2014
好的,谢谢大神,十分感谢,但是好像还是有点问题,按你的那个程序来,输出也有点问题,题目是找到在i行中最小,且在j列中最大的数,新手上路如有问题 请大神 多多包涵
#5
wmf20142020-04-07 12:03
修改后的输出结果为4,没错啊。
我只是修改你逻辑混乱及错误部分。根据题意应该输出4所在的行列值,所以你正确的输出是:
    if(flag)
        printf("No have.\n");
    else
    printf("%d,%d\n",m,z);
#6
计算机好难啊2020-04-07 12:19
回复 5楼 wmf2014
行中最小,列中最大,比如输入
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
应该输出 5
比如
9 8 7 6
10 12 13 5
8 5 10 3
4 5 8 2
8 4 3 1
应该输出 6
 谢谢大神对我的帮助,十分感谢
  
#7
wmf20142020-04-07 12:57
那就把判断列中最大的改成这样,其他还是一楼代码(红色部分为修改部分):
        for (k = 0; k < 5; k++)
        {
            //if (k == i) continue;
            if (b[i][z] > b[k][z])
            {
                break;
            }
            else
            {
                m = k;
                ba = 1;
                flag = 0;
            }
        }
        if (ba) break;
    }
#8
计算机好难啊2020-04-07 15:22
回复 7楼 wmf2014
谢谢,十分感谢。
1