明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2201|回复: 10

[求助]我的程式陷入死循環啦!

[复制链接]
发表于 2004-12-23 16:23:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2004-12-23 16:50:22 编辑

各位兄弟,下面是我花了几天才完成的作业,可是在调用时好象陷入了死循环,问题出在哪里啊?!
我依次输入:11,11,1,1,0.3,0.8,0,0
这几个参数,结果只有一行(应该有11*11行才对啊!)
我的原程式如下:
(defun c:DubL()
(setq osmode0 (getvar"osmode")
cmdecho0 (getvar"cmdecho")
blipmode0 (getvar "blipmode")
)
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(setq D_x (getreal"\n 请输入V/A x方向尺寸: "))
(setq D_y (getreal"\n 请输入V/A Y方向尺寸 : "))
(setq pitch_x (getreal"\n 请输入V/A x方向Pitch : "))
(setq pitch_y (getreal"\n 请输入V/A y方向Pitch: "))
(setq A1 (getreal"\n 请输入最小比: "))
(setq An (getreal"\n 请输入最大比: "))
(setq Y_cood1 (getreal"\n 请输入 y轴起始座标: "))
(setq X_Cood1 (getreal"\n 请输入X轴起始座标: "))

(setq Y_n ( fix (/ D_y pitch_y)))
(while (< Y_n (/ D_y pitch_y))
setq Y_n (+Y_n 1)
)
(setq X_n ( fix (/ D_x pitch_x)))
(while (< X_n (/ D_y pitch_y))
setq X_n (+ X_n 1)
)

(setq X_i 1)
(setq Y_i 1)
(setq N1 (/ (+ X_n 1) 2))
(setq N2 (+ (/ X_n 2) 1 ))
(setq c (rem X_n 2))
(setq m (* Y_n 2))
(setq X_P (/ pitch_x 2))
(setq y_p (/ pitch_y 2))

(while ( > c 0 )
(while (<= Y_i Y_n)
(setq Y_cood (+ Y_cood1 (* (- Y_i 1) pitch_y)))
(while (<= X_i N1)
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x)))
(setq CP (list X_Cood y_cood 0))
(setq Ai (+ A1 (* (- X_i 1) (/ (- An A1) (- N1 1)))))
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
)
(setq k 1)
(while (and (> X_i N1)(<= X_i X_n))
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x)))
(setq CP (list X_Cood y_cood 0))
(setq Ai (- An (* k (/ (- An A1) (- N1 1)))))
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
(setq k (+ k 1))
)
(setq Y_i (+ Y_i 1))
)
(setq A1_2 (+ A1 (/ (/ (- An A1) (- N1 1)) 2)))
(setq An_2 (- An (/ (/ (- An A1) (- N1 1)) 2)))
(while (and (> Y_i Y_n) (<= Y_i (- m 1)))
(setq Y_cood (+ Y_cood1 (* (- Y_i 1) pitch_y) y_p ))
(while (<= x_i (- X_n 1))
(while (<= x_i N1)
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x) x_p))
(setq CP (list X_Cood y_cood 0))
(setq Ai (+ A1 (* (- X_i 1) (/ (- An_2 A1_2) (- N1 2)))))
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
)
(while (and (> X_i N1)(<= X_i (- X_n 1)))
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x)))
(setq CP (list X_Cood y_cood 0))
(setq Ai (- An_2 (* k (/ (- An_2 A1_2) (- N1 2)))))
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
(setq k (+ k 1))
)
)
(setq Y_i (+ Y_i 1))
)

) (while ( = c 0 )
(while (<= Y_i Y_n)
(setq Y_cood (+ Y_cood1 (* (- Y_i 1) pitch_y)))
(while (<= X_i N2)
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x)))
(setq CP (list X_Cood y_cood 0))
(setq Ai (+ A1 (* (- X_i 1) (/ (- An A1) (- N2 1)))))
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
)
(setq k 1)
(while (and (> X_i N2)(<= X_i X_n))
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x)))
(setq CP (list X_Cood y_cood 0))
(setq Ai (- An (* (- k 1) (/ (- An A1) (- N2 1)))))
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
(setq k (+ k 1))
)
(setq Y_i (+ Y_i 1))
)
(setq A1_2 (+ A1 (/ (/ (- An A1) (- N2 1)) 2)))
(setq An_2 (- An (/ (/ (- An A1) (- N2 1)) 2)))
(while (and (> Y_i Y_n) (<= Y_i (- m 1)))
(setq Y_cood (+ Y_cood1 (* (- Y_i 1) pitch_y) y_p ))
(while (<= x_i (- X_n 1))
(while (<= x_i N2)
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x) x_p))
(setq CP (list X_Cood y_cood 0))
(setq Ai (+ A1 (* (- X_i 1) (/ (- An_2 A1_2) (- N2 2)))));; Ai=A1+(x_i-1)(An-A1_)/(N2-2)
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
)
(while (and (> X_i N2)(<= X_i (- X_n 1)))
(setq X_Cood (+ X_Cood1 (* (- X_i 1) pitch_x)))
(setq CP (list X_Cood y_cood 0))
(setq Ai (- An_2 (* (- k 1) (/ (- An_2 A1_2) (- N2 2)))))
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1))))
(setq ridus (sqrt (/ dot_area pi)) )
(command "donut" (- ridus ridus) ridus CP "")
(setq X_i (+ X_i 1))
(setq k (+ k 1))
)
)
(setq Y_i (+ Y_i 1))
) )
(setvar "osmode" osmode0)
(setvar "cmdecho" cmdecho0)
(setvar "blipmode" blipmode0)
)
 楼主| 发表于 2004-12-23 17:34:00 | 显示全部楼层
哪位可以告訴我,問題出在哪裡啊?
发表于 2004-12-23 21:12:00 | 显示全部楼层
我不知道这段程序是做什么的,也不知道有什么用。


对于没有注释的程序,除了你自己之外,大概也没有几个人去看。何况是那么长的一段,更何况,是作业。


我只知道一点:


在两个while循环里面,你都没有改变到c的值,嘻嘻,你想怎么样退出啊!!!!!!!!
发表于 2004-12-23 21:20:00 | 显示全部楼层
不妨自己一段一段用;|  。。。。|;屏蔽,这样可以快速地发现错误
 楼主| 发表于 2004-12-24 10:24:00 | 显示全部楼层
谢谢各位的指点。我所说的作业是:工作中自己兴趣爱好,要做的东西。 我程序的目的是在一个区域内按一定间距来画一些点,点的大小不一定,但成一定的关系,即:在点的间距'pitch_x * pitch_y '范围内,点的面积与剩余面积的比是等差变化的。 注释简化后的程式如下: (defun c:tc()
(setq D_x (getreal"\n 请输入 x方向尺寸: ")) ;;要画点区域的'X'方向的尺寸。
(setq D_y (getreal"\n 请输入 Y方向尺寸 : ")) ;;要画点区域的'Y'方向的尺寸。
(setq pitch_x (getreal"\n 请输入 x方向Pitch : ")) ;;'X'方向点与点之间的间距。
(setq pitch_y (getreal"\n 请输入 y方向Pitch: ")) ;;'y'方向点与点之间的间距。
(setq A1 (getreal"\n 请输入最小比: ")) ;;在'pitch_x * pitch_y '的范围内,点的面积与剩余面积最小比。
(setq An (getreal"\n 请输入最大比: ")) ;;在'pitch_x * pitch_y '的范围内,点的面积与剩余面积最大比。
(setq Y_cood1 (getreal"\n 请输入 y轴起始座标: ")) ;;点的y起始座标。
(setq X_Cood1 (getreal"\n 请输入X轴起始座标: ")) ;;点的X起始座标 (setq Y_n ( fix (/ D_y pitch_y))) ;;计算Y方向点的数目。
(setq X_n ( fix (/ D_x pitch_x))) ;;计算X方向点的数目。
(setq X 1) ;;变量'x'初始化赋值为‘1’
(setq Y 1) ;;变量'y'初始化赋值为‘1’
(while(<= Y Y_n ) ;;变量'y'<= Y方向点的数目时进行循环。
(setq Y_cood (+ Y_Cood1 (* (- Y 1) pitch_Y))) ;;点的y坐标。
(while (<= X X_n) ;;变量'X'<= X方向点的数目时进行循环。
(setq X_Cood (+ X_Cood1 (* (- X 1) pitch_x))) ;;点的X坐标
(setq CP (list X_Cood Y_cood 0)) ;;传回点的X,y坐标给‘cp'.
(setq Ai (+ A_1 (* (- X 1) (/ (- An A1) (- X_n 1))))) ;;在'pitch_x * pitch_y '的范围内,点的面积与剩余面积比的等差递增变化公式。
(setq dot_area (* pitch_x pitch_y (/ Ai (+ Ai 1)))) ;;计算点的面积
(setq ridus (sqrt (/ dot_area pi)) ) ;;计算点的半径。
(command "donut" (- ridus ridus) ridus CP "") ;;画点。
(setq X (+ X 1)) ;; 将'x'值增加1后传回给'x'.
)
(setq Y (+ Y 1)) ;; 将'Y'值增加1后传回给'y'.
)
)
经调试我发现的程式大循环不能循环起来,估计这可能是一直陷入死循环的问题点。 但我又看不出哪里不对来。 再请各位赐教! 谢谢。
发表于 2004-12-24 10:44:00 | 显示全部楼层
把具体要求说清楚。


改你的程序还不如重新编一个,又死机了!呵呵……
 楼主| 发表于 2004-12-24 11:22:00 | 显示全部楼层
楼上的兄弟真难为你啦。


重新编一个程式,可能比改我的程式容易,问题我就永远不知道我的程式故障出在何处啦!是不是?


送给我鱼网,不如让我知道如何结网更有意义啊!
发表于 2004-12-24 11:34:00 | 显示全部楼层
简略看了一下,下面语句有问题: 1: (while (< Y_n (/ D_y pitch_y))
setq Y_n (+Y_n 1)
)
(setq X_n ( fix (/ D_x pitch_x)))
(while (< X_n (/ D_y pitch_y))
setq X_n (+ X_n 1)
)
2:是否将(while ( > c 0 )......)及(while (= c 0)......)
改为(if (> c 0) (progn ......))及(if (= c 0) (progn ......))
 楼主| 发表于 2004-12-24 11:43:00 | 显示全部楼层
ZZXXQQ: 1.我将第一点的两个语句直接改成:(setq Y_n (/ D_y pitch_y))
及(setq X_n (/ D_X pitch_X)). 2.把这两个语句拿掉,后面的也删掉,只运行(while ( > c 0 )......)这里面的一段也不行,还是老现象。
发表于 2004-12-24 11:59:00 | 显示全部楼层
怎么3楼的话没看明白呢???(我给你回了邮件也有同样的说明)


(while ( &gt; c 0 )......),这里的(&gt; c 0)永远为真,当然是死循环了,这种问题只要别人稍微点一下就应该明白的,这说明你对WHILE的运行过程还不熟悉,,,既然是兴趣爱好,建议你放弃这个程序,找些简单的东西写写,先把各种函数、过程熟练掌握
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-30 00:26 , Processed in 0.476218 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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