明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

[源码] [活动结束]LISP知识问答第1期--基础篇1(难度指数:★★)

  [复制链接]
发表于 2010-12-23 22:20 | 显示全部楼层
本帖最后由 caoyin 于 2011-1-22 17:15 编辑

参加一下,练习,学习



--------------以下为答题内容--------------------
;判断表 Lst 是否是点对表
;[格式](consP Lst)
;[测试范例](consP '(0 . "AA"))->T
(defun consP(lst)
(if (and (listp lst)(vl-list-length lst)) nil t)
)
答案完全正确,此题得5分
根据不同的编程习惯,前面加不加(listp lsp)或(vl-consp lsp)都算正确

;判断指定数据是否是点
;[格式](PointP Data)
;[测试范例](PointP '(0  1 2))->T
(defun PointP(data)
(if(and (<= 2 (length data)3)(not (member nil (mapcar 'numberp data)))) t nil)
)
答案完全正确,此题得5分
可以去掉if语句

;写一句代码将变量
;MJTD1,MJTD2,MJTD3,...,MJTD1000
;赋值为
;1,2,3,...,1000
(defun c:test3()
(setq i 0)
(repeat 1000
(setq i (1+ i))
(set(read (strcat "MJTD" (itoa i))) i)
  ))
答案完全正确,此题得5分

;判断指定数据是否为偶数
;[格式](EvenP DATA)
;[测试范例](EvenP 5)->nil
(defun EvenP(data)
(if (and (numberp data) (= (rem  data 2.0) 0)) t)
  )
此题得2分
扣分原因,把2.0改为2就正确了,因为偶数必须是整数而不是实数
测试:(EvenP 4.0)->T
另外可以去掉if语句

;截取表的局部
; [格式](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 lstsub(lst sta len)
(repeat sta (setq lst (cdr lst)))
(setq lst (reverse lst))
(repeat (- (length lst) len)(setq lst (cdr lst)))(reverse lst)
  )
答案完全正确,此题得10分

;求表中的数字与指定数字之差最大或最小的数字
;[格式](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 NumExty6(Num NumLst Mode)
(car (car(vl-sort (mapcar '(lambda(x) (list x (if Mode (+ Num x) (abs(- Num x))))) NumLst)  '(lambda(x y) ((if Mode > <) (cadr x)(cadr y))))))
  )
(defun c:test()
(NumExty6 5.181 '(4.9 5.175 6 9.181 5.182 1.181 5.181 5.1) nil)
  )

答案完全正确,此题得13分
扣分原因:代码还有改进空间

-------------------------------------------------------------
总得分:40分(参与答题部分总分45分)


点评:
露水2的水平高,人也不错,期待和大家多多交流,为论坛的发展献力!
感谢露水2的参与,并感谢他为本次活动做出的贡献!祝新年愉快!!(caoyin)




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 明经币 +2 收起 理由
caoyin + 1 + 2

查看全部评分

发表于 2010-12-24 02:38 | 显示全部楼层
本帖最后由 lidejun_55 于 2010-12-24 02:38 编辑

建议给楼上加试几道
发表于 2010-12-24 09:54 | 显示全部楼层
回复 lidejun_55 的帖子

哈哈 等第二期吧
发表于 2010-12-25 19:01 | 显示全部楼层
本帖最后由 qcw911 于 2010-12-25 19:02 编辑

我是新人道行尚浅,
什么时候公布答案啊,
最好有比较
学习学习思路
发表于 2010-12-26 00:13 | 显示全部楼层
补充说明中 关于点对表 的 B 类型 有用过的吗?
(length '(0 1 . 2)) 返回 "错误: 函数调用语法错误..."

那位举个实例看看这种B类型用在何处?
发表于 2010-12-28 13:40 | 显示全部楼层
还不清楚在ACAD中什么地方使用这种类型的数据。个人认为仅仅是个可构建的数据结构。你可以用在自己定义的数据中。这种数据结构的结尾处占用的存储器比一般的表要少点。
发表于 2010-12-28 22:57 | 显示全部楼层
回复 ZZXXQQ 的帖子

个人以为这个所谓点对表的说法似乎有误啊...
连个 length 都不能获得结果.

一般的, 只有 ( (A . 1) (B . 2) ...) 这样的才是 dotpair-list 吧?
 楼主| 发表于 2010-12-28 23:56 | 显示全部楼层
补充说明中的概念定义是猫节选自ACAD的帮助
发表于 2010-12-29 22:27 | 显示全部楼层
本帖最后由 caoyin 于 2011-1-24 05:17 编辑

只会做一半的题 郁闷


-----------------------------以下为答题内容-----------------------------


;;;;4=================================
        ; 判断指定数据是否为偶数
        ; [格式](EvenP DATA)
        ;[测试范例](EvenP 5)->nil
(defun EvenP (DATA)
(= (rem DATA 2) 0)
)
答案完全正确,此题得5分

;;;5=========================
        ;截取表的局部
        ;[格式](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 LstSub(Lst Sta Len)  ;;注意变量要清除-----〉(Lst Sta Len / ? ? ?)
(setq n Sta
      li '()
)
(if (null Len) (setq Len (- (length Lst) Sta)))
(while (and (<= n (+ Len Sta -1)) (< n (length Lst)))  ;;while跟repeat有一个最重要的不同之处就是其第一个参数
                                                                                  ;;每次执行都要进行运算,因此(+ Len Sta -1)、 (length Lst)
                                                                                  ;;最好在while之前先运算……
  (setq li (cons (nth n Lst) li)
        n (+ n 1))
  )
(reverse li)
)
返回结果正确,此题得9.5分

;;;6==============================
         ;求表中的数字与指定数字之差最大或最小的数字
         ;[格式](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);;注意变量要清除
(setq NumMaxOffset (- (nth 0 NumLst) Num)
      NumMinOffset (- (nth 0 NumLst) Num)
)
(foreach n Numlst
(if ( > (abs (- n Num)) (abs NumMaxOffset) )
(setq NumMaxOffset (- n Num))
);if
(if ( < (abs (- n Num)) (abs NumMinOffset) )
(setq NumMinOffset (- n Num))
);if
)
(if (= Mode T)
(setq NumMaxOffset (+ NumMaxOffset Num))
(setq NumMinOffset (+ NumMinOffset Num))
);if
)

返回结果正确,此题得13分
思路算法还有改进空间。。。。

;;;7==========================================
;7)本题15分:
        ;判断文件名是否合法(不包含无效字符)
        ;        [格式](FileName-Valid FileName)
        ;[说明]FileName——不包含路径和扩展名的文件(或路径)名。
        ;[测试范例](FileName-Valid "Auto*Lisp")->nil
(defun FileName-Valid(FileName) ;;注意变量要清除
(setq str "[url=]\\\/:*?\[/url]"<>|"
       n 1
       isValid T)
(while(and (/= "" (substr FileName n 1)) isValid)
    (setq strFileName (substr FileName n 1)
         nn 1)
    (while(and (/= "" (substr str nn 1)) isValid)
     (if (= (substr str nn 1) strFileName) (setq isValid nil))
    (setq nn (+ nn 1))
    )
    (setq n (+ n 1))
)
(setq isValid isValid)
)
返回结果不完整,此题得5分
考虑还算细致,但不全面。while部分改用vl-string-trim则更加简便
(FileName-Valid "")-〉T
(FileName-Valid "   ")-〉T
下面为函数写法:
(defun FileName-Valid (FileName)
   (and (wcmatch FileName "~*[\\/:`*`?\"<>|]*");;注意`符号
        (> (strlen (vl-string-trim " " FileName)) 0)
   )
)





----------------------------------------------------
总得分32.5(参与答题部分总分45分)
jicqj的LISP基础知识掌握较好,可能缺乏深一点的研究和锻炼。但编程思路也较为严谨,
只一点较为难得,望再接再厉、共同进步!
感谢你的参与!祝新年愉快!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 明经币 +1 金钱 +6 收起 理由
caoyin + 1 + 1 + 6

查看全部评分

发表于 2010-12-30 09:22 | 显示全部楼层
(vl-list-length  list-or-cons-object)

参数

list-or-cons-object

表或点对表。

返回值

如果参数是真正的表,则返回包含表长度的整数。如果 list-or-cons-object 为点对表,则返回 nil。
兼容性提示:vl-list-length 函数对点对表参数返回 nil,而相应的普通 LISP 函数的参数如果是点对表,将返回错误信息。

样例

_$ (vl-list-length nil)

0

_$ (vl-list-length '(1 2))

2

_$ (vl-list-length '(1 2 . 3))

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

本版积分规则

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

GMT+8, 2024-5-17 17:50 , Processed in 0.181693 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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