中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 关于数值运算时的进制问题! 上一主题 | 下一主题
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『楼 主』:  关于数值运算时的进制问题!

在用SET /A进行运算时, (如果字符的第一位数为零,并且数值中含有8或9), 会导致数值不能正确读取.

因为除十六进制有 0x 前缀, 八进制有 0 前缀的, 数字值为十进位数字。因此, 0x12 与 18 和 022

相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的

八进制位数。

例:
C:\>set /a minute=08+5
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=5+018
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=0029+8
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=125+09
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。

解决方法:

1. 在运算常量时, 如果常量中含有8或9, 前面不要加零, 总之最高位数不能为零.

例: 错误 (08, 009, 018, 0029)

     正确 (8, 9, 18, 29)

2. 防止变量运算时变量的最高位数为零;

算法:
首先取变量的第一位数, 判断其是否为零;

如果成立,则取出第一位后的余数, 重新赋予变量;

执行循环直到第一位数不为零止;

最后用去零的变量进行运算.

代码:
@echo off
set mu=0001028
echo 去零前=%mu%
:again
if "%mu:~0,1%"=="0" (
    set mu=%mu:~1%
    goto again
)
echo 去零后=%mu%
set /a num=%mu%+154
echo 运算结果=%num%
pause

今天在写批处理脚本时遇到了这个问题, 终于把其中的原因弄明白了.

也找到了解决方法, 以后大家遇到相应的问题时可以避免走弯路.

[ Last edited by pengfei on 2006-10-2 at 09:41 ]

2006-9-5 02:07
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 2 楼』:  

恩,到没有注意这进制

2006-9-5 03:41
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 3 楼』:  

  呵呵,论坛的老贴里隐约提到过首位为0时的处理,一下子找不到那个帖子了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-5 05:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  

学习中……
还可以用这种算法判断一个字符串中的空格数``
嘿嘿`

2006-9-29 11:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 5 楼』:  

顶~~

2006-9-29 13:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 6 楼』:  

刚才又转到这儿来了,哈哈……

:again
if "%mu:~0,1%"=="0" (
    set mu=%mu:~1%
    goto again
)

你写的这个 :again 和 goto again 够酷!
直到把开头的0去尽了直到IF条件自然的就不成立而跳出了跳转继续执新的内容:)
佩服~~~

2006-9-29 22:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 7 楼』:  

深受 pengfei 楼主的 “ :again ... goto again ” 精彩应用的启发,
学着楼主goto原理试着做了一个模拟递归求N!的实验,goto用好了真是方便~:)
再一次感谢 楼主篇“关于数值运算时的进制问题”大作~:)


计算N的阶乘:)
没有越界和没有非法检查,就是为了学习楼主的goto的运用之作~:)
@echo off
setlocal ENABLEDELAYEDEXPANSION

set /p n=请输入 N! :
set /a redtek=!n!
if !n!==0 (echo 0的阶乘为1 && goto :Eof )

:Start

        set /a n-=1
        if !n!==0 goto :Ok
        set /a redtek*=n
        goto :Start

:Ok
        echo 阶乘为:!redtek!
        echo 最大只能计算到 31的阶乘,再大溢出~:)


2006-9-30 00:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 8 楼』:  


:again
if "%mu:~0,1%"=="0" set mu=%mu:~1%&goto again
if 写成一行也OK

2006-9-30 00:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 9 楼』:  

恩,这个算是最精简的一个方法了`
顶一个先``

2006-10-2 09:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 10 楼』:  

我当时处理这个问题的时候想到的算法是, 先提取第一位, 判断其值是否为零. 这是第一步, 那接下来代码怎么写呢? 取值和判断零都好办, 用set中的字符取位,一个IF判断就可以解决.

第二步, 如果存在多个零就需要用到循环以及重新赋值. 一想批处理中实现这样循环好像只有goto(又想到goto会不会一直循环, 但马上又看到前面一个IF不单是判断零, 还起到条件判断的作用).  到这里, 一个IF一个GOTO就构成了一个完整的算法.代码也很快写出来了...

[ Last edited by pengfei on 2006-12-7 at 11:58 AM ]

2006-10-2 10:25
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 11 楼』:  

来个递归的:
@echo off
set x=00010280
call :sub %x%
echo %y%
goto :EOF
:sub
set y=%1
if "%y:~0,1%"=="0" call :sub %y:~1%
goto :EOF




  ☆开始\运行 (WIN+R)☆
%ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul

2006-10-2 12:16
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 12 楼』:  

数字前面是0系统就认为是八进制,而8八进制里是没有8和9的!因而出错!



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-2 19:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: