我成功地从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;
}
答案 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步之前会遇到阻塞的情况。
您应该检测到这种情况,以便尽早终止您的循环。