找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1230|回复: 16

[求助] 怎么添加while ?

[复制链接]

已领礼包: 3198个

财富等级: 富可敌国

发表于 2015-7-1 00:51:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
需要输入的外径值必须大于内径值, 用while ,怎么修改?
  1.   (if (null #ra1) (setq #ra1 5.0))
  2.   (if (null #ra2) (setq #ra2 8.0))
  3.   (if (null #len) (setq #len 20.0))
  4.   (setq rad (getdist(strcat "\n输入内径值: <" (rtos #ra1) "> ")))
  5.   (if (= rad nil)(setq rad #ra1))
  6.   (setq #ra1 rad)
  7.   (initget "T")
  8.   (setq otr (getdist (strcat "\n输入外径值或 [壁厚(T)]: <" (rtos #ra2) "> ")))
  9.   (if (member otr (list "t" "T"))
  10.   (if (setq tck (getreal (strcat "\n输入壁厚值: <" (rtos (- #ra2 #ra1)) "> ")))
  11.   (setq otr (+ rad tck))(setq otr (+ rad (- #ra2 #ra1))))
  12.   (if(= otr nil)(setq otr #ra2 )))
  13.   (setq #ra2 otr)


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-7-1 01:05:53 | 显示全部楼层
(if (null #ra1)
  (setq #ra1 5.0)
)
(if (null #ra2)
  (setq #ra2 8.0)
)
(if (null #len)
  (setq #len 20.0)
)
(setq rad (getdist (strcat "\n输入内径值: <" (rtos #ra1) "> ")))
(if (= rad nil)
  (setq rad #ra1)
)
(setq #ra1 rad)
(setq tf t)
(while tf
  (initget "T")
  (setq otr (getdist (strcat "\n输入外径值或 [壁厚(T)]: <" (rtos #ra2) "> ")))
  (if (member otr (list "t" "T"))
    (progn (if (setq tck (getreal (strcat "\n输入壁厚值: <" (rtos (- #ra2 #ra1)) "> ")))
             (setq otr (+ rad tck))
             (setq otr (+ rad (- #ra2 #ra1)))
           )
           (setq tf nil)
    )
    (progn
      (if (= otr nil)
        (setq otr #ra2)
      )
      (if (<= #ra2 #ra1)
        (princ "\n外径小于等于内经,重新输入!")
        (setq tf nil)
      )
    )
  )
)
(setq #ra2 otr)

点评

嗯,谢谢csharp老师,此处比较(if (  详情 回复 发表于 2015-7-1 10:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-1 10:07:29 | 显示全部楼层
本帖最后由 lucas3 于 2015-7-1 11:56 编辑
csharp 发表于 2015-7-1 01:05
(if (null #ra1)
  (setq #ra1 5.0)
)

嗯,谢谢csharp老师,此处比较(if (<= #ra2 #ra1) 应是(if (<= otr rad)
如果输入壁厚不能小于0呢 ? 这种镶套把人都转晕了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2015-7-1 11:09:25 来自手机 | 显示全部楼层
本帖最后由 iLisp 于 2015-7-1 11:10 编辑

(setq tf1 t)
(while  (and (setq  tck  …
                      tf1
              )
       (if (> tck 0)(setq tf1 nil))
)

点评

大致原理,也知道是这么回事,但是具体怎么放置还是不确定, 你意思是(setq tck ...前面的if不要呢?? 还有中间一个tf1 是做什么的? 不完整看不明白 ...  详情 回复 发表于 2015-7-1 14:45
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-1 14:45:53 | 显示全部楼层
iLisp 发表于 2015-7-1 11:09
(setq tf1 t)
(while  (and (setq  tck  …
                      tf1

大致原理,也知道是这么回事,但是具体怎么放置还是不确定,
你意思是(setq  tck ...前面的if不要呢??
还有中间一个tf1 是做什么的? 不完整看不明白 ...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2015-7-1 18:05:28 | 显示全部楼层
  1. (if (null #ra1)
  2.   (setq #ra1 5.0)
  3. )
  4. (if (null #ra2)
  5.   (setq #ra2 8.0)
  6. )
  7. (if (null #len)
  8.   (setq #len 20.0)
  9. )
  10. (setq rad (getdist (strcat "\n输入内径值: <" (rtos #ra1) "> ")))
  11. (if (= rad nil)
  12.   (setq rad #ra1)
  13. )
  14. (setq #ra1 rad)
  15. (setq tf t)
  16. (while tf
  17.   (initget "T")
  18.   (setq otr (getdist (strcat "\n输入外径值或 [壁厚(T)]: <" (rtos #ra2) "> ")))
  19.   (if (member otr (list "t" "T"))
  20.     (progn
  21.       (setq tf1 t)
  22.       (while (and tf1 (setq tck (getreal (strcat "\n输入壁厚值: <" (rtos (- #ra2 #ra1)) "> "))))
  23.         (if (or (> tck 0) (null tck))
  24.           (progn
  25.             (if        tck
  26.               (setq otr (+ rad tck))
  27.               (setq otr (+ rad (- #ra2 #ra1)))
  28.             )
  29.             (setq tf nil tf1 nil)
  30.           )
  31.           (princ "\n请输入大于 0 的数!")
  32.         )
  33.       )
  34.     )
  35.     (progn
  36.       (if (= otr nil)
  37.         (setq otr #ra2)
  38.       )
  39.       (if (<= #ra2 #ra1)
  40.         (princ "\n外径小于等于内经,重新输入!")
  41.         (setq tf nil)
  42.       )
  43.     )
  44.   )
  45. )
  46. (setq #ra2 otr)

点评

大师, 这里 多了一个and ,应改是笔误吧  详情 回复 发表于 2015-7-1 20:42
谢谢ilisp老师指点, 非常有帮助!!  详情 回复 发表于 2015-7-1 19:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-1 19:59:29 | 显示全部楼层

谢谢ilisp老师指点, 非常有帮助!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-1 20:42:29 | 显示全部楼层

大师, 这里
  1. (while (and tf1 (setq tck (getreal (strcat "\n输入壁厚值: <" (rtos (- #ra2 #ra1)) "> "))))


多了一个and ,应改是笔误吧

点评

不是笔误,就是要先判断变量为T  详情 回复 发表于 2015-7-1 22:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9840个

财富等级: 富甲天下

发表于 2015-7-1 22:46:58 | 显示全部楼层

不是笔误,就是要先判断变量为T

点评

那这样效果就不对了, 应达到的效果是: 输入壁厚时,我想用默认值,不输入直接回车,就应该跳到输入长度值 而实际的效果是: 输入壁厚时,我想用默认值,不输入直接回车,结果又跳回 (setq otr (getdist (strc  详情 回复 发表于 2015-7-1 23:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-1 23:16:49 | 显示全部楼层
zxq0220 发表于 2015-7-1 22:46
不是笔误,就是要先判断变量为T

那这样效果就不对了,
应达到的效果是:
输入壁厚时,我想用默认值,不输入直接回车,就应该跳到输入长度值
而实际的效果是:
输入壁厚时,我想用默认值,不输入直接回车,结果又跳回
(setq otr (getdist (strcat "\n输入外径值或 [壁厚(T)]: <" (rtos #ra2) "> ")))

去掉这个and后,就能达到效果

点评

输入小于零的数试试还对不对 下面程序改了一下  详情 回复 发表于 2015-7-2 07:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9840个

财富等级: 富甲天下

发表于 2015-7-2 07:50:19 | 显示全部楼层
lucas3 发表于 2015-7-1 23:16
那这样效果就不对了,
应达到的效果是:
输入壁厚时,我想用默认值,不输入直接回车,就应该跳到输入长 ...

输入小于零的数试试还对不对

下面程序改了一下

  1. (if (null #ra1) (setq #ra1 5.0))
  2. (if (null #ra2) (setq #ra2 8.0))
  3. (if (null #len) (setq #len 20.0))
  4. (setq rad (getdist (strcat "\n输入内径值: <" (rtos #ra1) "> ")))
  5. (if (= rad nil) (setq rad #ra1))
  6. (setq #ra1 rad)
  7. (setq tf t)
  8. (while tf
  9.   (initget "T")
  10.   (setq otr (getdist (strcat "\n输入外径值或 [壁厚(T)]: <" (rtos #ra2) "> ")))
  11.   (if (member otr (list "t" "T")) (progn
  12.     (setq tf1 t)
  13.     (while (and tf1 (setq tck (getdist (strcat "\n输入壁厚值: <" (rtos (- #ra2 #ra1)) "> "))))
  14.       (if (or (> tck 0) (null tck))
  15.         (setq otr (+ rad (if tck tck (- #ra2 #ra1))))
  16.         (setq tf1 nil)
  17.       )
  18.         (princ "\n请输入大于 0 的数!")
  19.       )
  20.     )
  21.   ) (progn
  22.     (if (= otr nil) (setq otr #ra2))
  23.     (setq #ra2 otr)
  24.     (if (<= #ra2 #ra1)
  25.       (princ "\n外径小于等于内经,重新输入!")
  26.       (setq tf nil)
  27.     )
  28.   ))
  29. )
  30. (setq #ra2 otr)

点评

Z版的这个语法看不懂, 而且 25行与32行重复, 30行多了一个回括号 测试发现输入壁厚为0 ,显示:请输入大于 0 的数!用于比较的参数类型不正确 并中断退出  详情 回复 发表于 2015-7-2 11:14
之前的我都试过,输入负数与0都会提示,请输入大于 0 的数 , 正常, 看看Z版这个有什么区别[/backcolor]  详情 回复 发表于 2015-7-2 08:29
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-2 08:29:26 | 显示全部楼层
zxq0220 发表于 2015-7-2 07:50
输入小于零的数试试还对不对

下面程序改了一下

之前的我都试过,输入负数与0都会提示,请输入大于 0 的数 , 正常, 看看Z版这个有什么区别

点评

在getdist语句前使用(initget 6)函数来**输入0或负数。  详情 回复 发表于 2015-7-2 10:00
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2015-7-2 10:00:17 | 显示全部楼层
本帖最后由 牢固 于 2015-7-2 12:23 编辑
lucas3 发表于 2015-7-2 08:29
之前的我都试过,输入负数与0都会提示,请输入大于 0 的数 , 正常, 看看Z版这个有什么区别

在getdist语句前使用(initget 6)函数来限制输入0或负数。

点评

固版 除了这些 ,还有哪些关键字? (initget 1) ; bp 必須為非空值 (initget 7) ; nt 必須為非零正數或非空值 (initget 6); lp 必須為非零正數 (initget 3); 必須為非零或非空值  详情 回复 发表于 2015-7-2 11:52
固版 厉害! 这样,避免了写while了,重复地写if while直的很怕 (if (member otr (list "t" "T")) (progn (initget 6) (if (setq tck (getreal (strcat "\n输入壁厚值: "))) (setq otr (+ rad (* tck  详情 回复 发表于 2015-7-2 11:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-2 11:14:14 | 显示全部楼层
zxq0220 发表于 2015-7-2 07:50
输入小于零的数试试还对不对

下面程序改了一下

Z版的这个语法看不懂,
而且 25行与32行重复, 30行多了一个回括号
测试发现输入壁厚为0 ,显示:请输入大于 0 的数!用于比较的参数类型不正确 并中断退出

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3198个

财富等级: 富可敌国

 楼主| 发表于 2015-7-2 11:27:57 | 显示全部楼层
本帖最后由 lucas3 于 2015-7-2 11:29 编辑
牢固 发表于 2015-7-2 10:00
在getdist语句前使用(initget 6)函数来限 制输入0或负数。
固版 厉害!
这样,避免了写while了,重复地写if while直的很怕

(if (member otr (list "t" "T"))
(progn  
        (initget 6)
        (if (setq tck (getreal (strcat "\n输入壁厚值: <" (rtos (*(- #ra2 #ra1)0.5)) "> ")))
        (setq otr (+ rad (* tck 2)))(setq otr (+ rad (- #ra2 #ra1))))
        (setq tf nil)
  )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-6 23:59 , Processed in 0.472323 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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