明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1691|回复: 12

[求助]如何改变一个序列里某个元素的值?

  [复制链接]
发表于 2006-3-28 13:56 | 显示全部楼层 |阅读模式

各位前辈:
    请帮忙,我想对用户输入的五个数进行排序,用冒泡排序法来做,
但在第二层循环里如果下一元素大过当前元素时,想给它对调一下,不
知道用LISP如何对调,请高手帮帮忙,先谢谢了!
(defun c:bubble(/ a a1 a2 a3 a4 a5 temp n i j)
  (princ "\n请输入五个整数,系统帮您排序!")
  (setq a1 (getint "\n请输入第一个数:"))
  (setq a2 (getint "\n请输入第二个数:"))
  (setq a3 (getint "\n请输入第三个数:"))
  (setq a4 (getint "\n请输入第四个数:"))
  (setq a5 (getint "\n请输入第五个数:"))
  (setq a (list a1 a2 a3 a4 a5))
  (setq n (length a))
  (setq i 0)
  (setq j 0)
  (repeat (1- n)
    (repeat (- n i 1)
      (if (> (nth j a) (nth (1+ j) a))
        ;;此处对调前后两个元素值有什么函数可以做得到?
        (setq temp (nth (1+ j) a))
        (setq (nth (1+ j) a) (nth j a))
        (setq (nth j a ) temp)
        ;;********************************************
      )
      (setq j (1+ j))
    )
    (setq i (1+ i))
  )
  (setq i 0)
  (repeat (1- n)
    (princ "\n") (princ (nth i a))
  )
  (princ)
)

发表于 2006-3-28 14:00 | 显示全部楼层
(setq tmp a a b b tmp)
 楼主| 发表于 2006-3-28 14:20 | 显示全部楼层

Andyhon大侠,我是想把序列里的元素值对调,比如说序列a(52 38 26 13)四个元素,经过第一次比较后,52比38大,就把(nth 0 a)改为值改为38,而把(nth 1 a)的值改成52。然后继续比较,以此类推。请再帮忙看看好吗?谢谢!

发表于 2006-3-28 14:29 | 显示全部楼层

Command: (setq a '(52 38 26 13))
(52 38 26 13)

Command: (vl-sort a '<)
(13 26 38 52)

这样可以吗?

发表于 2006-3-28 15:54 | 显示全部楼层
4楼的方法最为简单,下面我贴一个用最原始的冒泡法排序
  1. (defun c:bubble (/ a a1 a2 a3 a4 a5 temp n i j)
  2.   (princ "\n请输入五个整数,系统帮您排序!")
  3.   (setq a1 (getint "\n请输入第一个数:"))
  4.   (setq a2 (getint "\n请输入第二个数:"))
  5.   (setq a3 (getint "\n请输入第三个数:"))
  6.   (setq a4 (getint "\n请输入第四个数:"))
  7.   (setq a5 (getint "\n请输入第五个数:"))
  8.   (setq a (list a1 a2 a3 a4 a5))
  9.   (setq n (length a))
  10.   (setq i -1 )
  11.   (while (< (setq i (1+ i)) n)
  12.     (setq j i)
  13.     (while (< (setq j (1+ j)) n)
  14.       (if (> (nth i a) (nth j a))
  15. (progn
  16.    (setq temp0 (nth i a)
  17.   temp1 (nth j a)
  18.    )
  19.    (setq a (subst "a" (nth i a) a))
  20.    (setq a (subst temp0 (nth j a) a))
  21.    (setq a (subst temp1 (nth i a) a))
  22. )
  23.       )
  24.     )
  25.   )
  26.   (princ a)
  27.   (princ)
  28. )
 楼主| 发表于 2006-3-29 09:26 | 显示全部楼层
谢谢楼上Andyhon及ljpnb大侠.
 楼主| 发表于 2006-3-29 12:50 | 显示全部楼层

TO:ljpnb大侠,

(setq a (subst "a" (nth i a) a))  这个语句的作用我不明白,能不能请您给讲一讲?谢谢!

发表于 2006-3-29 12:56 | 显示全部楼层
这句其实没什么特别的,只不过用一个字符"a"暂时替换一下(nth i a)值,因为不替换一下,下一句会出错。不象其它语句可以直接指定数组的下标。
 楼主| 发表于 2006-3-29 13:12 | 显示全部楼层

我真的搞得有点晕了,这跟其它语言太不同了,但这里缺少这一句还真的不行.下面是我自己的程序:

(defun c:bubble (/ a a1 a2 a3 a4 a5 temp0 temp1 n i j)
  (princ "\n请输入五个整数,系统帮您排序!")
  (setq a1 (getint "\n请输入第一个数:"))
  (setq a2 (getint "\n请输入第二个数:"))
  (setq a3 (getint "\n请输入第三个数:"))
  (setq a4 (getint "\n请输入第四个数:"))
  (setq a5 (getint "\n请输入第五个数:"))
  (setq a (list a1 a2 a3 a4 a5))
  (setq n (length a))
  (setq i 0)
  (repeat (1- n)
    (setq j 0)
    (repeat (- n i 1)
      (if (> (nth j a) (nth (1+ j) a))
         (progn
           (setq temp0 (nth j a))
           (setq temp1 (nth (1+ j) a))
           (setq a (subst "a" (nth j a) a))
           (setq a (subst temp0 (nth (1+ j) a) a))
           (setq a (subst temp1 (nth j a) a))
         )
      )
      (setq j (1+ j))
    )
    (setq i (1+ i))
  )
  (princ a)
  (princ)
)

发表于 2006-3-29 13:29 | 显示全部楼层
9楼的程序中(setq j 0)这句不完全正确,改成(setq j i)比较合适,可以省去好几步不必要的比较,你要真正理解冒泡法的思路。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-25 15:01 , Processed in 0.175773 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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