为什么这个程序有时会无休止地循环而不是总是

时间:2018-05-22 13:20:06

标签: c c89

我成功地从K.N.的一本名为“C Programming:A modern approach”的书中解决了一个编程项目。景。

该程序运行正常,但有时会进入无限循环。我没有理由这背后的原因。

我使用了一个随机函数,它会给出0到3之间的随机值,并且我已经使用了足够的条件来处理所有四个随机值。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    char walk[10][10];
    int direction,currenti=5,currentj=5;

    int i,j;
    for(i=0; i<10; i++)
    {
        for(j=0; j<10; j++)
        {
            walk[i][j]='.';
        }
    }
    srand((unsigned) time(NULL));
    for(i=0; i<26;)
    {
        direction=rand()%4;
        printf("%d ",direction);
        if(direction==0&&walk[currenti][currentj-1]=='.'&&(currentj-1)>0&&(currentj-1)<10)
        {
            currentj=currentj-1;
            walk[currenti][currentj]='A'+i;
            i++;
        }
        else if(direction==1&&walk[currenti][currentj+1]=='.'&&(currentj+1)>0&&(currentj+1)<10)
        {
            currentj=currentj+1;
            walk[currenti][currentj]='A'+i;
            i++;
        }
        else if(direction==2&&walk[currenti-1][currentj]=='.'&&(currenti-1)>0&&(currenti-1)<10)
        {
            currenti=currenti-1;
            walk[currenti][currentj]='A'+i;
            i++;
        }
        else if(direction==3&&walk[currenti+1][currentj]=='.'&&(currenti+1)>0&&(currenti+1)<10)
        {
            currenti=currenti+1;
            walk[currenti][currentj-1]='A'+i;
            i++;
        }
    }
    for(i=0; i<10; i++)
    {
        for(j=0; j<10; j++)
        {
            printf("%c ",walk[i][j]);
        }
        printf("\n");
    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

只有快速查看,我的猜测是因为在您的主for循环中,您只在某些条件下增加i,而且很可能没有一个或满足,这意味着{然后不会调用{1}}。

验证这一点的最佳方法是在正确处理案例的地方放置一个i++子句,打印一条消息,或者如果你永远不能达到这种情况就设置一个断言。

作为预防措施的衡量标准,如果您有else / if条款,则应始终使用else if子句处理“if all else failed”值,要么正确处理错误,要么断言代码是否永远不会到达else子句。

另外,作为旁注,您应该考虑使用空格以使代码更容易阅读,例如:

else

答案 1 :(得分:1)

当你进入一个角落并且它周围的数组只包含点时,你会有一个无限循环。 这种情况有时只会因为课程的随机行为而发生

答案 2 :(得分:0)

因为你的步行是随机的,你可以输入条件,当数字无法进一步移动时i不会增加

无限循环的例子(你的程序从1走到9)

1 2 3 . . . . . . .
8 9 4 . . . . . . .
7 6 5 . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .

在第9步,您的程序会被阻止,无论下一个direction是什么,因为它阻止了所有可能的下一步行动。

当然有很多这种情况的变种,但这也意味着你的程序在执行26步之前会遇到阻塞的情况。

您应该检测到这种情况,以便尽早终止您的循环。