ing 发表于 2020-1-8 21:21

C行逻辑连接的顺序表,循环体结束后不执行剩余代码

本帖最后由 ing 于 2020-1-17 22:56 编辑

在 break 执行后输出了元素 2


问题来了,为什么 if(value == 0) 不会执行判断,在循环结束后直接程序停止运行?
输出元素 2后,一直在最内层的for和if来回,循环结束程序也就结束






完整代码
```
#include<stdarg.h>
#include<malloc.h>
#include<stdio.h>

#define MAXSIZE 40
#define MAXRC 3
#define ElemType int

typedef struct
{
    int row;
    int column;
    ElemType e;
}Triple;

typedef struct
{
    //tu 非零元素个数
    int row,column,tu;
    int rpos;
    Triple data;
}RLSMatrix;

void display(RLSMatrix m);

int main(int argc, char* argv[])
{
    RLSMatrix M;
    M.tu = 4;
    M.row = 3;
    M.column = 4;


    M.rpos = 1;
    M.rpos = 3;
    M.rpos = 4;


    M.data.e = 3;
    M.data.row = 1;
    M.data.column = 2;

    M.data.e = 5;
    M.data.row = 1;
    M.data.column = 4;

    M.data.e = 1;
    M.data.row = 2;
    M.data.column = 3;

    M.data.e = 2;
    M.data.row = 3;
    M.data.column = 1;

    //输出矩阵
    display(M);
    return 0;
}

void display(RLSMatrix M)
{
    for(int i=1;i<=M.row;i++)
    {
      for(int j=1;j<=M.column;j++)
      {
            int value=0;
                for(int k=M.rpos;k<M.rpos;k++)
                {
                  if(i == M.data.row && j == M.data.column)
                  {
                        printf("%d ",M.data.e);
                        value=1;
                        break;
                  }
                }
                if(value==0)
                {
                  printf("0 ");
                }
      }
      printf("\n");
    }
}
```

f88u8 发表于 2020-1-8 21:47

循环是真不好学啊,太难了

Lopht 发表于 2020-1-8 21:57

这难道不是对的?不应该这样吗?
首先,我的C还给谭浩强了,但看你的代码,你for循环里value置了1,下面的判断value==0的判断要等上面for循环全部结束后再执行判断,可是上面的for循环无论是否是Break跳出当前次的循环也好,你都强行value置了1,所以下面的vlaue==0的判断是死代码(无效判断)啊......

风人 发表于 2020-1-8 22:00

没看懂啊啊啊啊啊

quandu 发表于 2020-1-8 22:30

这个程序目前没读懂意思,不过看你的输出显然输出了三个'\n';M.row的值也是3,说明程序是正常跑完了的。再往上推就是只输出了"2 "就跑完了--->M.data.e = 2 即 k=4 ---> 此时 j = 1。推测j = 2 、3、 4 都不满足 第二个for中if表达式。大概这样吧。

z1390595 发表于 2020-1-12 16:02

本帖最后由 z1390595 于 2020-1-12 16:05 编辑

我想我找到你的原因了,原因出在
for(int k=M.rpos;k<M.rpos;k++)
这一行上,你的M.rpos会出现问题,因为执行到矩阵第3行的时候,i = 3, i+1 = 4,那么你的M.rpos就是M.rpos了,这是一个没有定义的数值。
现在i=3, M.rpos = 4, M.rpos = ?,执行j = 1时,没错,因为k = 4 的时候就找到数据了,执行j =2 的时候,因为 k = 4 不行,就执行 k =5 ,然后一直往下找。。。。。因为M.rpos未定义,可以认为是个随机值,k不知道何时才会停下来(我 第一次运行的时候,第三行输出了 2 2686760,应该是有找到一个数,然后k停止过一次吧 )。

如果要解决的话,建议这一行改成
for(int k=M.rpos;k<M.rpos && k <= M.tu;k++)

z1390595 发表于 2020-1-12 16:10

Lopht 发表于 2020-1-8 21:57
这难道不是对的?不应该这样吗?
首先,我的C还给谭浩强了,但看你的代码,你for循环里value置了1,下面的 ...

break用于跳出k的循环。
他的代码中,rpos数组用于确定每行的开头在data数组中的位置,k的每次循环都在那一层的data中搜索,条件就是i和j分别符合行跟列,就把找到的这个值输出来,并且把k跳循环。

如果一层没搜到符合的i和j对应的数据,那么这个位置应该就是空,所以用value判空来输出一个“0 ”,因为只有找到数据的情况下,value才是1,否则每次j更新后,value都置成0了。

ing 发表于 2020-1-13 19:26

z1390595 发表于 2020-1-12 16:02
我想我找到你的原因了,原因出在
for(int k=M.rpos;k

奇怪的是这句循环结束后整个程序都结束了,不会再往下运行
for(int k=M.rpos;k<M.rpos;k++)
如果往下运行,那么最后输出的不应该是 2 而是 0

z1390595 发表于 2020-1-14 16:19

ing 发表于 2020-1-13 19:26
奇怪的是这句循环结束后整个程序都结束了,不会再往下运行
for(int k=M.rpos;k

我试着用VS跑了下你的程序,我跑的时候,M.rpos== 1725316,因此k会一直增大,最终还没到这个值的时候,就因为内存越界等问题报错退出。因此没有再运行下去了。

ing 发表于 2020-1-25 15:54

z1390595 发表于 2020-1-14 16:19
我试着用VS跑了下你的程序,我跑的时候,M.rpos== 1725316,因此k会一直增大,最终还没到这个值的时候, ...

dalao 能加下我吗,私信你了,我用VS跑C程序编译失败但Clion却可以运行,我不知道怎么玩VS了,我的版本是VS 2013
页: [1] 2
查看完整版本: C行逻辑连接的顺序表,循环体结束后不执行剩余代码