为什么这个程序有时会无限循环而不总是
Why this program loops endlessly sometimes and not always
我成功地解决了 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;
}
只是快速浏览一下,我的猜测是因为在你的主 for
循环中,你只在某些条件下增加 i
,并且很可能 none或满足,这意味着 i++
将不会被调用。
验证这一点的最佳方法是在您正确处理案例的地方放置一个 else
子句,方法是打印一条消息,或者如果您永远不会到达该案例,则放置一个断言。
作为预防措施,当您有 if
/else if
子句时,您应该始终有一个 else
子句来处理 "if all else fails" 值,其中您要么正确处理错误,要么断言代码是否永远不会到达 else 子句。
此外,作为旁注,您应该考虑使用空格以使您的代码更易于阅读,例如:
if (direction == 3 && walk[currenti + 1][currentj] == '.' && (currenti + 1) > 0 && (currenti + 1) < 10)
当你进入一个角落并且它周围的数组只包含点时你将有一个无限循环。
这只是有时发生,因为当然是随机行为
因为你的行走是随机的,所以你可以进入条件,无论数字是多少都无法进一步移动并且i
不会增加
无限循环示例(您的程序从 1 走到 9)
1 2 3 . . . . . . .
8 9 4 . . . . . . .
7 6 5 . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
在第 9 步,无论下一步是什么,您的程序都会被阻止 direction
,因为它已经阻止了所有可能的下一步行动。
这种情况当然有很多变体,但这也意味着您的程序在执行其 26 个步骤之前就阻塞了。
您应该检测到这种情况以尽早终止循环。
我成功地解决了 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;
}
只是快速浏览一下,我的猜测是因为在你的主 for
循环中,你只在某些条件下增加 i
,并且很可能 none或满足,这意味着 i++
将不会被调用。
验证这一点的最佳方法是在您正确处理案例的地方放置一个 else
子句,方法是打印一条消息,或者如果您永远不会到达该案例,则放置一个断言。
作为预防措施,当您有 if
/else if
子句时,您应该始终有一个 else
子句来处理 "if all else fails" 值,其中您要么正确处理错误,要么断言代码是否永远不会到达 else 子句。
此外,作为旁注,您应该考虑使用空格以使您的代码更易于阅读,例如:
if (direction == 3 && walk[currenti + 1][currentj] == '.' && (currenti + 1) > 0 && (currenti + 1) < 10)
当你进入一个角落并且它周围的数组只包含点时你将有一个无限循环。 这只是有时发生,因为当然是随机行为
因为你的行走是随机的,所以你可以进入条件,无论数字是多少都无法进一步移动并且i
不会增加
无限循环示例(您的程序从 1 走到 9)
1 2 3 . . . . . . .
8 9 4 . . . . . . .
7 6 5 . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
在第 9 步,无论下一步是什么,您的程序都会被阻止 direction
,因为它已经阻止了所有可能的下一步行动。
这种情况当然有很多变体,但这也意味着您的程序在执行其 26 个步骤之前就阻塞了。
您应该检测到这种情况以尽早终止循环。