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");
}
}
``` 循环是真不好学啊,太难了 这难道不是对的?不应该这样吗?
首先,我的C还给谭浩强了,但看你的代码,你for循环里value置了1,下面的判断value==0的判断要等上面for循环全部结束后再执行判断,可是上面的for循环无论是否是Break跳出当前次的循环也好,你都强行value置了1,所以下面的vlaue==0的判断是死代码(无效判断)啊......
没看懂啊啊啊啊啊 这个程序目前没读懂意思,不过看你的输出显然输出了三个'\n';M.row的值也是3,说明程序是正常跑完了的。再往上推就是只输出了"2 "就跑完了--->M.data.e = 2 即 k=4 ---> 此时 j = 1。推测j = 2 、3、 4 都不满足 第二个for中if表达式。大概这样吧。 本帖最后由 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++) 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了。 z1390595 发表于 2020-1-12 16:02
我想我找到你的原因了,原因出在
for(int k=M.rpos;k
奇怪的是这句循环结束后整个程序都结束了,不会再往下运行
for(int k=M.rpos;k<M.rpos;k++)
如果往下运行,那么最后输出的不应该是 2 而是 0
ing 发表于 2020-1-13 19:26
奇怪的是这句循环结束后整个程序都结束了,不会再往下运行
for(int k=M.rpos;k
我试着用VS跑了下你的程序,我跑的时候,M.rpos== 1725316,因此k会一直增大,最终还没到这个值的时候,就因为内存越界等问题报错退出。因此没有再运行下去了。 z1390595 发表于 2020-1-14 16:19
我试着用VS跑了下你的程序,我跑的时候,M.rpos== 1725316,因此k会一直增大,最终还没到这个值的时候, ...
dalao 能加下我吗,私信你了,我用VS跑C程序编译失败但Clion却可以运行,我不知道怎么玩VS了,我的版本是VS 2013
页:
[1]
2