好多问题,
1。括号不匹配。你应该一行一行检查
2。PI、set是受保护字符不应该定义。(setq pi 3.141593) 把这行删除,因为PI,LISP中可以直接用。就是3.1415926……
(setq set (+ (/ 1.5708 z) 0.0149))这里的SET改用SETTT或其他
3。IF循环中应该加入(PROGN )
4。没有TAN这个语法。如果想求TAN正切应该这样:(/ (SIN A)(COS A))
下面是改好的,没有语法错误了。你再调试看看。可能程序设计上有错误。自己找吧
(defun c:qiuzhi() ;求渐开线上各点坐标 (setq m (getreal "\n m:")) ;模数 (setq z (getreal "\n z:")) ;齿数 (setq ha* (getreal "\n ha*:")) ;齿顶高系数 (setq ar (/ pi 180)) ;弧度 (setq afa (* 20 ar)) ;分度圆压力角 (setq deltr 2) ;极径每次的变化量 (setq rb (* 0.5 m z (cos afa))) ;rb为基圆半径 (setq ra (* m (+ (* 0.5 Z) ha*))) ;ra为齿顶圆半径 (setq rk rb) ;渐开线上任一点的极径 (setq x (list nil)) ;建立两个空表 (setq y (list nil)) (while (<= rk ra) (setq afak (atan (/ (sqrt (- (expt rk 2) (expt rb 2))) rb))) ;afak为渐开线上任一点的压力角 (setq setk (- (/ (SIN afak) (COS afak)) afak)) (setq settt (+ (/ 1.5708 z) 0.0149)) (setq xk (* rb (sin (+ settt setk)))) ;求对应于rk点的x,y坐标 (setq x (cons xk x)) ;x坐标存入列表x中 (setq yk (* rb (cos (+ settt setk)))) (setq y (cons yk y)) ;y坐标存入列表y中 (setq rk (+ deltr rk)) ) (if (rk /= ra) ;若rk不是正好等于ra时,再计算一点的坐标,并把它加入到列表中 (progn (setq afak (atan (/ (sqrt (- (expt rk 2) (expt rb 2))) rb))) ;afak为渐开线上任一点的压力角 (setq setk (- (tan afak) afak)) (setq set (+ (/ 1.5708 z) 0.0149)) (setq xk (* rb (sin (+ settt setk)))) ;求对应于rk点的x,y坐标 (setq x (cons xk x)) ;x坐标存入列表x中 (setq yk (* rb (cos (+ settt setk)))) (setq y (cons yk y)) ;y坐标存入列表y中 (setq rk (+ deltr rk)) (prinl x) (prinl y) ) ))
|