明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 669423907

[提问] 求改进复制递增 A-009 变 A-0010 改为 A-009 变 A-010

[复制链接]
发表于 2020-1-15 09:53:19 | 显示全部楼层
669423907 发表于 2020-1-15 09:08
谢谢你的回复,我不会弄,方便帮忙改一下吗,谢谢你啦

算法都说的很详细了啊
回复

使用道具 举报

发表于 2020-1-15 10:25:28 | 显示全部楼层
本帖最后由 x_s_s_1 于 2020-1-15 10:50 编辑
mahuan1279 发表于 2020-1-14 22:34
仅对字符串处理,如“019”+“1”=“020”,算法如下:
1、确定字符串最长位数,比如三位数;
2、将字 ...

按您的思路写了一个,请指正

  1. ;;;带0前缀整数字符串相加
  2. (defun addIstr (str1 str2 / l1 l2 l)
  3.   (setq  str1 (mapcar 'read (mapcar 'chr (vl-string->list str1)))
  4.   str2 (mapcar 'read (mapcar 'chr (vl-string->list str2)))
  5.   l1   (length str1)
  6.   l2   (length str2)
  7.   l    (max l1 l2)
  8.   )
  9.   (if (< l1 l)
  10.     (repeat (- l l1) (setq str1 (cons 0 str1)))
  11.     (repeat (- l l2) (setq str2 (cons 0 str2)))
  12.   )
  13.   (setq  str1 (reverse (mapcar '+ str1 str2))
  14.   str2 nil
  15.   l    0
  16.   )
  17.   (foreach n str1
  18.     (setq str2 (cons (rem (setq l (+ l n)) 10) str2)
  19.     l    (fix (/ l 10.))
  20.     )
  21.   )
  22.   (if (= 1 l)
  23.     (apply 'strcat (mapcar 'itoa (cons l str2)))
  24.     (apply 'strcat (mapcar 'itoa str2))
  25.   )
  26. )


回复

使用道具 举报

发表于 2020-1-15 10:51:26 | 显示全部楼层
本帖最后由 xj6019 于 2020-1-15 10:54 编辑
669423907 发表于 2020-1-15 09:18
这个最合适我,可以作为公用函数,可以各种调用,实现不同效果

好吧,你赢了!!!!!!!!!!!!!!!!!!!!!!
http://bbs.mjtd.com/thread-180643-1-1.html

3楼的代码你试试效果如何
只不过我想要的属性块的效果还没有人帮忙添加
回复

使用道具 举报

发表于 2020-1-15 11:28:16 | 显示全部楼层
改成你想要的效果了,但是注意,有一个问题,A-999会变成A1000,这样的话还是感觉原来的程序更合理。

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
669423907 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2020-1-15 11:54:11 | 显示全部楼层
x_s_s_1 发表于 2020-1-15 10:25
按您的思路写了一个,请指正

为什么要设置两个字符变量?一个不就行了吗?
回复

使用道具 举报

发表于 2020-1-15 12:02:01 | 显示全部楼层
mahuan1279 发表于 2020-1-15 11:54
为什么要设置两个字符变量?一个不就行了吗?

有时候步长不为1,还可以用来计算大数字
回复

使用道具 举报

发表于 2020-1-15 12:44:08 | 显示全部楼层
x_s_s_1 发表于 2020-1-15 12:02
有时候步长不为1,还可以用来计算大数字

不是加1递增吗?
_$ (defun addone (str)
  (setq n (strlen str))
  (setq nlst (reverse (vl-remove nil (mapcar '(lambda (x) (if (<= 48 x 57) (- x 48) nil)) (vl-string->list str)))))
  (setq str1 (substr str 1 (- n (length nlst))))
  (setq nlst (cons (+ 1 (car nlst)) (cdr nlst)) vlst nil flag t)
  (while  flag
    (if (< (car nlst) 10)
            (progn
          (setq vlst (append (reverse vlst) nlst))
                  (setq flag nil)
                 )
                (progn
           (setq vlst (cons (rem (car nlst) 10) vlst))
               (setq nlst (cons (+ (cadr nlst) (/ (car nlst) 10)) (cdr (cdr nlst))))          
                 )
     )
   )
(setq str (strcat  str1 (vl-list->string (mapcar '(lambda (x) (+ 48 x)) (reverse vlst)))))
)
ADDONE
_$  (addone "A-001")
"A-002"
_$ (addone "A-009")
"A-010"
_$ (addone "A-019")
"A-020"
_$  (addone "A-099")
"A-100"
_$  (addone "A-101")
"A-102"
_$
回复

使用道具 举报

发表于 2020-1-15 13:11:57 | 显示全部楼层
_$ (defun add_num (str num)
  (setq n (strlen str))
  (setq nlst (vl-remove nil (mapcar '(lambda (x) (if (<= 48 x 57) (- x 48) nil)) (vl-string->list str))))
  (setq str1 (substr str 1 (- n (length nlst))))
  (setq numstr (itoa num) k (- (length nlst) (strlen numstr)))
  (repeat k (setq numstr (strcat "0" numstr)))
  (setq addnumlst (mapcar '(lambda (x) (- x 48)) (vl-string->list numstr)))
  (setq nlst (reverse (mapcar '+ nlst addnumlst)) vlst nil flag t)
  (while  flag
    (if (< (car nlst) 10)
            (progn
          (setq vlst (append (reverse vlst) nlst))
                  (setq flag nil)
                 )
                (progn
           (setq vlst (cons (rem (car nlst) 10) vlst))
               (setq nlst (cons (+ (cadr nlst) (/ (car nlst) 10)) (cdr (cdr nlst))))          
                 )
     )
   )
(setq str (strcat  str1 (vl-list->string (mapcar '(lambda (x) (+ 48 x)) (reverse vlst)))))
)
ADD_NUM
_$ (ADD_NUM "A-019" 1)
"A-020"
_$ (ADD_NUM "A-019" 5)
"A-024"
_$ (ADD_NUM "A-019" 25)
"A-044"
_$ (ADD_NUM "A-139" 45)
"A-184"
_$
回复

使用道具 举报

 楼主| 发表于 2020-1-15 13:53:38 | 显示全部楼层
satan421 发表于 2020-1-15 11:28
改成你想要的效果了,但是注意,有一个问题,A-999会变成A1000,这样的话还是感觉原来的程序更合理。

首先再次感谢大师的回复。我想能否这样:把对象中非数字的部分储存到aa,数字部分储存到bb,处理完bb后,再把对象的内容改为aa+bb,这样是不是就可以解决这个问题呢?
回复

使用道具 举报

 楼主| 发表于 2020-1-15 13:54:28 | 显示全部楼层
mahuan1279 发表于 2020-1-15 13:11
_$ (defun add_num (str num)
  (setq n (strlen str))
  (setq nlst (vl-remove nil (mapcar '(lambda ( ...

大师,请问这个要怎么用呢?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 03:38 , Processed in 0.152172 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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