明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2785|回复: 5

发个“字符串递增”函数

[复制链接]
发表于 2011-12-23 12:00 | 显示全部楼层 |阅读模式
  1. ;;;*********************************************************;;;
  2. ;;;------------------- getFirstChar 函数 -------------------;;;
  3. ;;;(getFirstChar char case appList List0 List1 List2 List3) ;;;
  4. ;;;获取所有能参与运算操作的第一个字符                       ;;;
  5. ;;;因为要考虑到字母不区分大小写的情况                       ;;;
  6. ;;;参数                                                     ;;;
  7. ;;;char-----相关的字符                                      ;;;
  8. ;;;case-----字母是否区分大小写                              ;;;
  9. ;;;appList--所有能参与运算的字符的总表                      ;;;
  10. ;;;List0----符号的表                                        ;;;
  11. ;;;List1----数字的表                                        ;;;
  12. ;;;List2----大写字母的表                                    ;;;
  13. ;;;List3----小写字母的表                                    ;;;
  14. ;;;---------------------------------------------------------;;;
  15. (defun getFirstChar (char case appList List0 List1 List2 List3)
  16.   (if (and (not case)
  17.            (not List0)
  18.            (not List1)
  19.            List2
  20.            List3
  21.            (member char List3)
  22.       )
  23.     "a"
  24.     (car appList)
  25.   )
  26. )
  27. ;;;--------------- getLastChar 函数 ---------------;;;
  28. ;;;(getLastChar char case appList list1 list2)     ;;;
  29. ;;;获取所有能参与运算操作的最后一个字符            ;;;
  30. ;;;参数                                            ;;;
  31. ;;;char------相关的字符                            ;;;
  32. ;;;case------字母是否区分大小写                    ;;;
  33. ;;;appList---总表                                  ;;;
  34. ;;;list1-----表示大写字母的表                      ;;;
  35. ;;;list2-----表示小写字母的表                      ;;;
  36. ;;;------------------------------------------------;;;
  37. (defun getLastChar (char case appList list1 list2)
  38.   (if (and (not case)
  39.            list1
  40.            list2
  41.            (member char list1)
  42.       )
  43.     "Z"
  44.     (last appList)
  45.   )
  46. )
  47. ;;;---------------incStr 函数 ---------------;;;
  48. ;;; 语法: (incStr preStr bit case)           ;;;
  49. ;;; 参数: 1. preStr----字符串                ;;;
  50. ;;;       2. bit-------位码值                ;;;
  51. ;;;位码1:表示符号,不包括几个特殊的符号;   ;;;
  52. ;;;位码2:表示数字;                         ;;;
  53. ;;;位码4:表示大写字母;                     ;;;
  54. ;;;位码8:表示小写字母。                     ;;;
  55. ;;;位码值范围是:0<bit<16之间的整数。        ;;;
  56. ;;;       3. case------是否区分大小写        ;;;
  57. ;;;T--表示区分大小写;nil--表示不区分大小写。;;;
  58. ;;; 返回值: 字符串递增一位后的新字符串       ;;;
  59. ;;;------------------------------------------;;;
  60. ;;;样例                                      ;;;
  61. ;;;(incStr "9" 0 T) rv=nil                   ;;;
  62. ;;;(incStr "9" 1 T) rv="9!"                  ;;;
  63. ;;;(incStr "9" 2 T) rv="10"                  ;;;
  64. ;;;(incStr "9" 3 T) rv="!!"                  ;;;
  65. ;;;(incStr "9" 4 T) rv="9A"                  ;;;
  66. ;;;(incStr "9" 8 T)     rv="9a"              ;;;
  67. ;;;(incStr "Zz" 12 T)   rv="aA"              ;;;
  68. ;;;(incStr "Zz" 12 nil) rv="AAa"             ;;;
  69. ;;;------------------------------------------;;;
  70. (defun incStr (preStr         bit           case             /               optList0
  71.                optList1         optList2  optList3  appList   mStrLen
  72.                sinStr0         sinStrn   oldSS     reVal     posit
  73.                newSS         n           TorNil
  74.               )
  75.   (if (and (> bit 0) (< bit 16))
  76.     (progn
  77.       (setq optList0 '("!"   "#"   "$"         "%"   "&"   "'"   "*"         "+"
  78.                        ","   "-"   "."         "/"   ":"   ";"   "<"         "="
  79.                        ">"   "?"   "@"         "["   "]"   "^"   "_"         "`"
  80.                        "{"   "|"   "}"         "~"
  81.                       )
  82.             optList1 '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9")
  83.             optList2 '("A"   "B"   "C"         "D"   "E"   "F"   "G"         "H"
  84.                        "I"   "J"   "K"         "L"   "M"   "N"   "O"         "P"
  85.                        "Q"   "R"   "S"         "T"   "U"   "V"   "W"         "X"
  86.                        "Y"   "Z"
  87.                       )
  88.             optList3 '("a"   "b"   "c"         "d"   "e"   "f"   "g"         "h"
  89.                        "i"   "j"   "k"         "l"   "m"   "n"   "o"         "p"
  90.                        "q"   "r"   "s"         "t"   "u"   "v"   "w"         "x"
  91.                        "y"   "z"
  92.                       )
  93.       )
  94.       (if (= (logand bit 1) 0)
  95.         (setq optList0 nil)
  96.       )
  97.       (if (= (logand bit 2) 0)
  98.         (setq optList1 nil)
  99.       )
  100.       (if (= (logand bit 4) 0)
  101.         (setq optList2 nil)
  102.       )
  103.       (if (= (logand bit 8) 0)
  104.         (setq optList3 nil)
  105.       )
  106.       (setq appList (append optList0 optList1 optList2 optList3)
  107.                                         ; 购建所有能参与运算的字符的表
  108.             reVal   (strcat " " preStr)        ; 给原字符串添加一个无效的字符,它的作用是:始终使n>0
  109.             mStrLen (strlen reVal)        ; 字符串的长度
  110.             n            mStrLen
  111.             oldSS   (substr reVal n 1)        ; 提取最后一个字符
  112.             TorNil  T                        ; 初始化进位开关
  113.       )
  114.       ;; 循环的作用是从字符串后面开始提取字符,然后比较字符和表中
  115.       ;; 最后一个字符是否相等
  116.       (while (and TorNil (member oldSS appList))
  117.         ;; 获取组合表里的最后一个元素
  118.         (setq sinStrn (getLastChar oldSS case appList optList2 optList3))
  119.         (if (equal oldSS sinStrn)
  120.           ;; 如果字符串中提取的字符和表里的最后一个元素相同
  121.           ;; 那么,递增就是要将表里的第一个元素来代替最后一个元素
  122.           ;; 于是要提取总表里的第一元素,考虑到字母不区分大小写的情况
  123.           ;; 所以不能用简单的 car 函数。
  124.           (setq        sinStr0        (getFirstChar oldSS case appList optList0 optList1 optList2 optList3)
  125.                 n        (1- n)
  126.                 reVal        (vl-string-subst sinStr0 oldSS reVal n)
  127.                 oldSS        (substr reVal n 1)
  128.           )
  129.           ;; 如果字符串中提取的字符和表里的最后一个元素不相同
  130.           ;; 那么,递增运算就是将表里的后一个元素取代前一个元素
  131.           ;; 因为不用进位,所以要把进位开关关掉。
  132.           (progn
  133.             (if        (and (not case) (equal oldSS "Z") optList3)
  134.               (setq oldSS "z")
  135.             )
  136.             (setq posit         (vl-position oldSS appList)
  137.                   newSS         (nth (1+ posit) appList)
  138.                   reVal         (vl-string-subst newSS oldSS reVal (1- n))
  139.                   TorNil nil
  140.             )
  141.           )
  142.         )
  143.       ) ;_ end while
  144.       ;; 退出循环有两种可能:
  145.       ;; 1 进位开关被关闭;
  146.       ;; 2 oldSS 所指的字符不能参与递增运算。
  147.       ;; 接下来所要做的工作就是,如果进位开关没关闭,那么就需要更改返回值
  148.       ;; 但是,存在两种可能,经过循环和没经过循环。经过循环要添加进位字符
  149.       ;; 没经过循环要添加第一个字符。
  150.       ;; 进位字符和第一个字符的区别在于"1"和"0",其他都一样。
  151.       (if TorNil
  152.         (if (= n mStrLen)
  153.           ;; 没经过循环,要在原字符串的后面添加第一个字符
  154.           (setq        reVal (strcat reVal (getFirstChar oldSS        case appList optList0 optList1 optList2 optList3)))
  155.           ;; 经过循环,要在无效运算字符的后面和有效运算字符的前面增加进位字符
  156.           (progn
  157.             (setq oldSS          (substr reVal (1+ n) 1)
  158.                   sinStr0 (getFirstChar oldSS case appList optList0 optList1 optList2 optList3)
  159.             )
  160.             (if        (equal sinStr0 "0")
  161.               (setq sinStr0 "1")
  162.             )
  163.             (setq reVal        (strcat        (substr reVal 1 n) sinStr0 (substr reVal (1+ n))))
  164.           )
  165.         )
  166.       )
  167.       (substr reVal 2);_ 将添加的" "空格字符去掉
  168.     ) ;_ progn
  169.   ) ;_ end if
  170. ) ;_ end defun
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 工具|主题: 71, 订阅: 4
发表于 2011-12-23 12:19 | 显示全部楼层
+程序很复杂,下载后仔细研究研究
发表于 2011-12-23 13:12 | 显示全部楼层
不错,挺详细的!
发表于 2011-12-26 10:09 | 显示全部楼层
发表于 2012-6-29 09:24 | 显示全部楼层
怎么用O(∩_∩)O
发表于 2013-12-28 09:42 | 显示全部楼层
不错,正好用到,谢谢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 21:48 , Processed in 0.193362 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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