VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1044|回复: 8

帮我看看为什么会越界?

[复制链接]

2

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-11 20:00:02 | 显示全部楼层 |阅读模式
程序中,黄色点的轨迹所成的直线应该在x=100-400,y=100-300之间显示,为什么左右下三个方向都越界了呢?哪位大虾帮忙看看。

#include<stdlib.h>
#include <graphics.h>
#include<stdio.h>
main()
{float pf,ps,a,j;
int y,n,x,i;
int GraphDriver=DETECT,GraphMode;
initgraph( &GraphDriver, &GraphMode, "c:\\turboc\\cgi" );
setbkcolor(GREEN);
bar(100,100,400,400);
setfillstyle(SOLID_FILL,RED);
bar(100,300,400,400);
printf("\n\ninput the number of n:\n");
scanf("%d",&n);
printf("input the value of pf(0-1):");
scanf("%f",&pf);
ps=(1-pf)/2;
for(i=0;i<n;i++)
  {j=(float)rand()/32767*300+100;
   x=(int)j;
   y=100;
   while(y<=300)
    {if(x>=400) x=100+x%400;
     if(x<100) x=300+x%100;
     a=(float)rand()/32767;
     if(a<pf) y++;
     else if(a<=pf+ps) x--;
     else if(a<=1) x++;
     putpixel(x,y,YELLOW);
     if(y==300) putpixel(x,y,BLUE);
     if(getpixel(x-1,y)==1) putpixel(x,y,BLUE);
     if(getpixel(x+1,y)==1) putpixel(x,y,BLUE);
     if(getpixel(x,y+1)==1) putpixel(x,y,BLUE);
    }
  }
getch();
closegraph;
}
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-10 15:00:02 | 显示全部楼层
if(x>=400) x=100+x%400;
原100=<x<=400
x=100+x%400后200=<x<=500
经if(x>=400) x=100+x%400语句后x可能值为500
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-29 23:30:01 | 显示全部楼层
{j=(float)rand()/32767*300+100;
-----------------------
这之前先要使用srand()设置一个种子,然后才获取随机数

比如这里
srand(300);//最大就不会超过300了。

x=rand() + 100;//这样就在100到400里,

y=rand();这样就在100-300
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-8-2 19:00:01 | 显示全部楼层
srand(300);//最大就不会超过300了。
================
ms  srand 没有这样的制约作用呢 ·····
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-8-2 19:15:01 | 显示全部楼层
hile(y<=300)
{if(x>=400) x=100+x%400;
if(x<100) x=300+x%100;
a=(float)rand()/32767;
if(a<pf) y++;
else if(a<=pf+ps) x--;
else if(a<=1) x++;
putpixel(x,y,YELLOW);
if(y==300) putpixel(x,y,BLUE);
if(getpixel(x-1,y)==1) putpixel(x,y,BLUE);
if(getpixel(x+1,y)==1) putpixel(x,y,BLUE);
if(getpixel(x,y+1)==1) putpixel(x,y,BLUE);
}

这里的 x 和 y 控制不对 ····
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-8-2 19:45:01 | 显示全部楼层
if(x>=400) x=100+x%400;
if(x<100) x=300+x%100;

这两个语句可以去掉,
因为在 while 之前,
j=(float)rand()/32767*300+100;
x=(int)j;   //这里已经限制了 x 在 100-400 之间了
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-8-2 20:15:01 | 显示全部楼层
其实说什么呢?

if(x>=400) x=100+x%400;

其实这个值也可以超过400的,比如当X=799时

if(799>=400) x=100+799%400 == 100 + 399 == 499

所以这里要改为:if(x>=300) x=100+x%300;

不过不知道zjwzjw 大虾说的“ms  srand 没有这样的制约作用呢 ·····”有点不解!也许我久不编程了。。。。。。。。。。
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-8-2 20:30:01 | 显示全部楼层
呵呵,还是zjwzjw 清楚明白,以前我也用过,但没有深入理解过!笨驴。。。。。。。。。


关于随机数的解释是这样的:
_ 尽管在计算机中并不存在一个真正的随机数发生器,但是可以作到使产生的数字的重复
频率很低,一致于他们看起来很随机。实现这一功能的程序<函数>叫做伪随机数发生器。
_有关如何产生随机数的理论有很多,一致于可以用一本厚厚的书来讨论了。:)(主要是数学上的知识)所以我们关心的是如何去产生随机数。
_ _ 不管你用什么方法实现随机数发生器,你都必须要要给它提供一个被称为”种子“的
的初始值,而且这个值本身最好是随机的。这个值一般是用快速记数寄存器或移位寄存器来产生的。_但实际中我们一般用时间值来替代。
_现在的C编译器都提供一个基于ANSI标准的的伪随机数发生器函数,用来生成随机数,
MS和BORLAND都是通过srand()和rand()来支持这种标准的。
_ 它们的工作流程如下:
(1):首先,给srand()提供一个”种子",它是一个unsigned_int类型的值。
(2):_然后,调用rand(),它会根据提供给srand()的值返回一个随机数(范围在_0~32767之间)
(3):根据需要多次调用rand(),不断得到新的随机数。
(4):无论什么时候可以给srand()提供一个新的“种子”,从而进一步“随机化”rand()的
输出结果。
回复

使用道具 举报

0

主题

78

帖子

29.00

积分

新手上路

Rank: 1

积分
29.00
发表于 2020-8-2 20:45:01 | 显示全部楼层
while 部分修改如下:(其他没有任何修改)

while(y<300)   /* = 300 时候为退出条件, 所以修改为 <300 */
{
a=(float)rand()/32767;
if(a<pf) y++;
else if(a<=pf+ps) x--;
else if(a<=1) x++;

if(x>400) x=400;  /*增加三个约束条件*/
if(x<100) x=100;
if(y>300) y=300;   /*y 是单增的, 所以一个条件就足够了*/

putpixel(x,y,YELLOW);
if(y==300) putpixel(x,y,BLUE);
if(getpixel(x-1,y)==1) putpixel(x,y,BLUE);
if(getpixel(x+1,y)==1) putpixel(x,y,BLUE);
if(getpixel(x,y+1)==1) putpixel(x,y,BLUE);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表