这一个报数游戏的程序,输入如果超过数组规定范围……

来源:百度知道 编辑:UC知道 时间:2024/09/23 10:12:20
规则:n个人,顺序编号(1到n),第一个人开始报数,从1报到3,报到3的人退出,下一个人重新开始。最后留下的是原来编号几号的?。

#include <stdio.h>
#define MAX 50
void main()
{
int i,k=0,m=0,n,num[MAX],*p=num;
printf("请输入总人数:");
scanf("%d",&n);
for (i=0;i<n;i++)
{
*(p+i)=i+1;
}
i=0;
while (m<n-1)
{
if (*(p+i)!=0)
k++;
if (k==3)
{
*(p+i)=0;
m++;
k=0;
}
i++;
if (i==n)
i=0;
}
while (*p==0)
p++;
printf("编号为%d的人为班长。\n",*p);
}

//我的问题就是:MAX是50。输入50以下的数字都正常。但是输入超过50的数,也就是超过了NUM的范围。结果都是1。为什么呢?请解释的清楚一点,因为我是C语言初学者。

给你的程序做两个记号:
#include <stdio.h>
#define MAX 50
void main()
{
int i,k=0,m=0,n,num[MAX],*p=num;
printf("请输入总人数:");
scanf("%d",&n);
for (i=0;i<n;i++)
{
*(p+i)=i+1;
}
i=0;
while (m<n-1) ---------------------(1)
{
if (*(p+i)!=0)
k++;
if (k==3)
{
*(p+i)=0; -----------------(3)
m++;
k=0;
}
i++;
if (i==n) -----------------------(2)
i=0;
}
while (*p==0)
p++;
printf("编号为%d的人为班长。\n",*p);
}

当n>50时,记号(1)的while循环并不会执行n-1次(可以验证,它只执行了50次),也就是说这时并不是通过判断条件 m<n-1 正常退出的 , 所以标记(2)的判断语句永远都不会被执行(因为n>50,而循环只执行50次,故i永远不会等于n)这样退出循环后继续执行下面的语句时 ,数组num[MAX]当然不会像n<50时那样变成 00000...010...0的形式,而是1 2 0 4 5 0 6 7 0...的形式 那样指针p永远指向num[0](即 *p == 1) 所以你输出时结果永远是1

解释一下“为什么n>50时会非正常退出循环”:因为 n>50 时,循环执行50次后,再执行时,标记(3)的语句就会发生溢出(因为程序访问了为定义的内存空间)所以就会退出循环