- 积分
- 320
- 明经币
- 个
- 注册时间
- 2010-8-22
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2010-12-21 18:36:18
|
显示全部楼层
本帖最后由 caoyin 于 2011-1-22 23:16 编辑
勉强算是做完了吧,乱来的,哈哈~~
-----------------------------以下为答题内容--------------------------------------
;;;(1)本题5分:
;;; 判断表 Lst 是否是点对表
;;; [格式](consP Lst)
;;; [测试范例](consP '(0 . "AA"))->T
(defun consp (lst)
(setq a (vl-list-length lst))
(if (= nil a)
(princ "\n T")
(princ "\n nil")
)
(princ)
)
----------------------------------------------
(consP '(0 . "AA"))
(consP '(0 "AA"))
;;;用vl-list-length算不算偷懒啊,呵呵(用vl-list-length是很好的方法,怎么能算偷懒呢)
本题得分5分
但如果作为引用的函数,用princ打印信息个人觉得没有必要,只要满足返回值就好了
;;;(2)本题5分:
;;; 判断指定数据是否是点
;;; [格式](PointP Data)
;;; [测试范例](PointP '(0 1 2))->T
(defun pointp (data)
(command "line" '(0 0) '(1 1) "")
(command "circle" data 1)
(setq a (cdr (assoc 0 (entget (entlast)))))
(if (= a "LINE")
(princ "\n nil")
(princ "\n T")
)
(princ)
)
----------------------------------------------
(pointP '(0 1 2))
(pointP '(0 1))
(pointP '(0))
本题不得分
扣分原因:虽然返回的结果有可能是对的,但我觉得还是不能得分,因为我们要体现编程的意义
在这里用command就有点得不偿失了。
1.command不是必用不可的
2.command严重影响速度啊
3.command产生的对象还要删掉
;;;(3)本题5分:
;;; 写一句代码将变量
;;; MJTD1,MJTD2,MJTD3,...,MJTD1000
;;; 赋值为
;;; 1,2,3,...,1000
(setq a 1)
(repeat 1000
(setq zf1 (strcat "MJTD" (rtos a 2 0)))
(set (read zf1) a)
(setq a (1+ a))
)
----------------------------------------------
MJTD37
MJTD802
;;;“写一句代码将变量赋值”,“一句”真能做到吗?
本题得分4分
扣分原因:rtos应当改为itoa,因为rtos有时候会受到系统变量的影响
;;;(4)本题5分:
;;; 判断指定数据是否为偶数
;;; [格式](EvenP DATA)
;;; [测试范例](EvenP 5)->nil
(defun EvenP (data)
(setq a (type 0));;这句个人感觉有点啰嗦了
(setq b (type data))
(if (= a b)
(if (= (rem data 2) 0)
(princ "\n T")
(princ "\n nil")
)
(princ "\n nil")
)
(princ)
)
------------------------------------------------
(EvenP 5)
(EvenP 4)
(EvenP -4)
(EvenP 4.0)
;;;4.0应该不算是偶数吧,希望我没有理解错...;;偶数首先是实数,你理解的没错
本题得分4.5分
楼主要把局部变量归零哦(所有的答题都好像有这个问题)----〉(defun EvenP (data / a b)
;;;(5)本题10分:
;;; 截取表的局部
;;; [格式](ListSub Lst Sta Len)
;;; [说明]Lst——表
;;; Sta——开始元素位置(第一个元素位置为 0)
;;; Len——以 sta 开始的长度,如果为 nil 则获取到最后
;;; [测试范例](lstsub '(1 2 3 4 5 6 7) 1 5)->(2 3 4 5 6)
(defun ListSub (Lst Sta Len)
(if (= nil Len)
(setq Len (length Lst))
)
(setq a 0)
(setq Lsts '())
(repeat (length Lst)
(setq Lst1 (car Lst))
(setq Lst (cdr Lst))
(if (and (>= a Sta) (< a (+ Len Sta)))
(setq Lsts (cons Lst1 Lsts))
)
(setq a (1+ a))
)
(setq Lst '())
(repeat (length Lsts)
(setq Lst1 (car Lsts))
(setq Lsts (cdr Lsts))
(setq Lst (cons Lst1 Lst))
)
(princ Lst);;再次提醒,这两行改为 lst 就行了
(princ)
)
------------------------------------------------
(ListSub '(1 2 3 4 5 6 7) 1 5)
(ListSub '(1 2 3 4 5 6 7) 1 nil)
返回结果完全正确,本题得分8分(鼓励加分: +1分)
代码感觉太冗长,算法还有待改进
注意:(princ)的作用是关闭最后的返回值,这一般用于正式的程序(给人用的程序,如C:开头的函数)的结尾,或者一个lsp文件的结尾
;;;(6)本题15分:
;;; 求表中的数字与指定数字之差最大或最小的数字
;;; [格式](NumExty Num NumLst Mode)
;;; [说明]Num——数字
;;; NumLst——数字列表
;;; Mode——为 T 求之差最大,nil 求之差最小
;;; [测试范例]
;;; (NumExty 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) T)->9.181
(defun NumExty (Num NumLst Mode)
(defun lambda1 (x)
(abs (- Num x))
)
(if (= Mode T)
(setq NumLst
(vl-sort
NumLst
(function (lambda (e1 e2) (> (lambda1 e1) (lambda1 e2))))
)
)
(setq NumLst
(vl-sort
NumLst
(function (lambda (e1 e2) (< (lambda1 e1) (lambda1 e2))))
)
)
)
(princ "\n ")
(princ (car NumLst))
(setq a (abs (- Num (car NumLst))))
(setq NumLst (cdr NumLst))
(while (< (abs (- (abs (- Num (car NumLst))) a)) 0.0001)
(princ "\n ")
(princ (car NumLst))
(setq NumLst (cdr NumLst))
)
(princ)
)
------------------------------------------------
(NumExty 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) T)
;;;程序求的是表中的数字与指定数字之差的 绝对值 最大或最小的数字,
;;;本人拙见:单纯求差的话Num的值就无意义了,只剩下原表中数字的求最大或最小值。
本题得分13分
代码还有改进空间
vl-sort的两次使用能否改为一次,即把第一次的结果reverse
;;;(7)本题15分:
;;; 判断文件名是否合法(不包含无效字符)
;;; [格式](FileName-Valid FileName)
;;; [说明]FileName——不包含路径和扩展名的文件(或路径)名。
;;; [测试范例](FileName-Valid "Auto*Lisp")->nil
(defun FileName-Valid (FileName)
(vl-load-com)
(setq a (strcat "C:\\测试文件" FileName ".txt"))
(setq b nil)
(setq b (open a "a"))
(if (= b nil)
(princ "\n nil")
(progn
(close b)
(vl-file-delete a)
(princ "\n T")
)
)
(princ)
)
------------------------------------------------
(FileName-Valid "Auto*Lisp")
(FileName-Valid "AutoLisp")
本题得4分
扣分原因:其实只要判断字符串就好了,创建文件再删除感觉有点麻烦
;;;(8)本题40分(加难讨论题):
;;; 判断两个文件名是否是同一个文件(或路径)。
;;; [格式](FileName-Equal FileName1 FileName2)
;;; [说明]两个参数都是包含绝对路径的文件名(可以理解为文件实际存在),可能各自的大小
;;; 写不同、\\或/符号不同、长短路径名不同,如何判断两个文件名指向的是不是同一个文件。
(defun FileName-Equal (FileName1 FileName2)
(vl-load-com)
(setq aa (open FileName1 "r"))
(setq bb (open FileName2 "r"))
(if (/= aa nil) (close aa))
(if (/= bb nil) (close bb))
(setq a (open FileName1 "a"))
(if (= a nil)
(progn
(princ "\n 测试文件:")
(princ FileName1)
(princ "正在使用,请先关闭文件!")
(exit)
)
)
(close a)
(setq b (open FileName2 "a"))
(if (= b nil)
(progn
(princ "\n 文件")
(princ FileName1)
(princ "与文件")
(princ FileName2)
(princ "非同一个文件!")
(if (= aa nil) (vl-file-delete FileName1))
(exit)
)
(close b)
)
(setq c (vl-file-rename FileName1 "c:\\FileName-Equal函数测试文件1.dwg"))
(setq d (vl-file-rename FileName2 "c:\\FileName-Equal函数测试文件2.dwg"))
(if (= d nil)
(progn
(princ "\n 文件")
(princ FileName1)
(princ "与文件")
(princ FileName2)
(princ "是同一个文件!")
)
(progn
(vl-file-rename "c:\\FileName-Equal函数测试文件2.dwg" FileName2)
(princ "\n 文件")
(princ FileName1)
(princ "与文件")
(princ FileName2)
(princ "非同一个文件!")
)
)
(vl-file-rename "c:\\FileName-Equal函数测试文件1.dwg" FileName1)
(if (= aa nil) (vl-file-delete FileName1))
(if (= bb nil) (vl-file-delete FileName2))
(princ)
)
------------------------------------------------
(FileName-Equal "c:\\1.dwg" "c:/1.DWG")
(FileName-Equal "c:\\1.dwg" "d:/1.dwg")
本题得10分
----------------------------------------------------------------------------------------
总得分47.5(49.5-2, 局部变量未清理及princ原因再扣2分)
基出题部分(满分为60分)39.5分
点评: lixdu对LISP基础有较深的理解,只是编程的一些习惯建议要更加严谨些,程序的算法上还有改进的空间。
十分的感谢参与!期待多参与论坛的活动和讨论。祝你在新的一年里有更大的进步!!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|