中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 数值计算之分数变换小数(批处理)
作者:
标题: 数值计算之分数变换小数(批处理) 上一主题 | 下一主题
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『楼 主』:  数值计算之分数变换小数(批处理)


:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::                                                                                         ::
::               nd.bat                                                                    ::
::                                                                                         ::
::               by Shilyx         mailto oversleep@163.com        (C)2006.9.4             ::
::                                                                                         ::
::               将分数转化为小数的批处理程序,支持无限小数,循环体用中括号包围            ::
::                                                                                         ::
::               用法:命令行下输入按以下格式输入   nd a b                                 ::
::                     其中参数 a 表示分子,参数 b 表示分母                                ::
::                     也可以直接不加参数运行,程序将提示输入                              ::
::                                                                                         ::
::               注意:程序在脚本环境中运行,对于大分母速度较慢,一般不要超过3000          ::
::                                                                                         ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off
setlocal EnableDelayedExpansion

if %2.==. goto input
set /A N=%1
set /A D=%2
goto compute

:input
echo Input N:
set /p NN=
set /A N=%NN%
echo Input D:
set /p DD=
set /A D=%DD%
goto compute

:compute
if %N%==0 echo Wrong Intry && goto input
if %D%==0 echo Wrong Intry && goto input
set str=

for /L %%a in (1,1,%D%) do @set /A Left%%a=0
for /L %%a in (1,1,%D%) do @set /A Result%%a=0
set /A int_part="%N%/%D%"
set /A N="%N%%%%D%"
set /A tool=%N%
if %tool%==0 echo The result of expression "%N%/%D%" is %int_part% && goto :EOF
set /A turn=1

:start
set /A "tool*=10"
set /A Result%turn%="%tool%/%D%"
set /A Left="%tool%%%%D%"
if %Left%==0 set /A begin=-1 && set /A end="%turn%" && goto endCompute
if %Left%==%N% set /A begin=0 && set /A end="%turn%" && goto endCompute
if not !Left%Left%!==0 set /A begin="!Left%Left%!" && set /A end="%turn%" && goto endCompute

set /A Left%Left%=%turn%
set /A tool=%Left%
set /A "turn+=1"
goto start

:endCompute
if %3.==. echo The result of expression "%N%/%D%" is
set result=#
for /L %%i in (1,1,%end%) do @set result=!result!!Result%%i!
set result=%result:~1%
if %begin%==-1 echo %int_part%.%result% && goto end
if %begin%==0 echo %int_part%.[%result%] && goto end
echo %int_part%.!result:~0,%begin%![!result:~%begin%!]

:end
if %2.==. echo. && echo Press any key to quit application && pause>nul

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::            begin的返回值有一定的意义:                                                  ::
::                 -1:表示已经成功整除,是可以直接输出                                     ::
::                  0:表示新的余数是一,直接回到了开始                                     ::
::               其他:表示是最一般的数,循环体前有脖子                                     ::
::          int_part表示了结果的整数部分                                                   ::
::          tool是一个迭代变量,正是它在一直工作                                           ::
::          turn是索引值,表示数组当前位置                                                 ::
::          程序中使用了两个数组,起到统计作用                                             ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::




X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
2007-4-23 00:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 2 楼』:  

中括号包围的部分是循环体


[ Last edited by my3439955 on 2007-4-23 at 02:19 AM ]



X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
2007-4-23 00:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 3 楼』:  

先鼓励下;

这是个bug;用25/5试下;
The result of expression "0/5" is 5;

被除数 不能大于10^9


下面这个链接是我以前写过的一个:
被除数和结果理论上可以无限位;

可以自己决定欲精确的位数;最后一位四舍五入;

不过没解决 除数大于10^9的;lz可以尝试下突破这个.

http://www.cn-dos.net/forum/view ... ght=BJSH&page=2
这个第26楼

2007-4-23 01:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 4 楼』:  

你的代码很不错
加上判断循环的话似乎就不必在乎显示位数了,因为到了一定的位数必然循环.当除数为N时,这个位数最大是N-1



X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
2007-4-23 02:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
my3439955
中级用户




积分 272
发帖 99
注册 2006-6-2
状态 离线
『第 5 楼』:  

无论除数还是被除数是零,结果都是显而易见的,因此被归结为错误输入,0/5被要求重新输入

25/5是有一点小问题,问题在于这一句
if %tool%==0 echo The result of expression "%N%/%D%" is %int_part% && goto :EOF
这里判断整除之后没有用pause暂停而直接退出了
应该把goto :EOF改成goto :end
%N%应该改为%NN%
处理参数的代码也要改变一下
修改后的代码如下
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::                                                                                         ::
::               nd.bat                                                                    ::
::                                                                                         ::
::               by Shilyx         mailto oversleep@163.com        (C)2006.9.4             ::
::                                                                                         ::
::               将分数转化为小数的批处理程序,支持无限小数,循环体用中括号包围            ::
::                                                                                         ::
::               用法:命令行下输入按以下格式输入   nd a b                                 ::
::                     其中参数 a 表示分子,参数 b 表示分母                                ::
::                     也可以直接不加参数运行,程序将提示输入                              ::
::                                                                                         ::
::               注意:程序在脚本环境中运行,对于大分母速度较慢,一般不要超过3000          ::
::                                                                                         ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@echo off
setlocal EnableDelayedExpansion

if %2.==. goto input
set /A N=%1
set /A D=%2
set /A NN=%1
set /A DD=%2
goto compute

:input
echo Input N:
set /p NN=
set /A N=%NN%
echo Input D:
set /p DD=
set /A D=%DD%
goto compute

:compute
if %N%==0 echo Wrong Intry && goto input
if %D%==0 echo Wrong Intry && goto input
set str=

for /L %%a in (1,1,%D%) do @set /A Left%%a=0
for /L %%a in (1,1,%D%) do @set /A Result%%a=0
set /A int_part="%N%/%D%"
set /A N="%N%%%%D%"
set /A tool=%N%
if %tool%==0 echo The result of expression "%NN%/%D%" is %int_part% && goto :end
set /A turn=1

:start
set /A "tool*=10"
set /A Result%turn%="%tool%/%D%"
set /A Left="%tool%%%%D%"
if %Left%==0 set /A begin=-1 && set /A end="%turn%" && goto endCompute
if %Left%==%N% set /A begin=0 && set /A end="%turn%" && goto endCompute
if not !Left%Left%!==0 set /A begin="!Left%Left%!" && set /A end="%turn%" && goto endCompute

set /A Left%Left%=%turn%
set /A tool=%Left%
set /A "turn+=1"
goto start

:endCompute
if %3.==. echo The result of expression "%N%/%D%" is
set result=#
for /L %%i in (1,1,%end%) do @set result=!result!!Result%%i!
set result=%result:~1%
if %begin%==-1 echo %int_part%.%result% && goto end
if %begin%==0 echo %int_part%.[%result%] && goto end
echo %int_part%.!result:~0,%begin%![!result:~%begin%!]

:end
if %2.==. echo. && echo Press any key to quit application && pause>nul

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::            begin的返回值有一定的意义:                                                  ::
::                 -1:表示已经成功整除,是可以直接输出                                     ::
::                  0:表示新的余数是一,直接回到了开始                                     ::
::               其他:表示是最一般的数,循环体前有脖子                                     ::
::          int_part表示了结果的整数部分                                                   ::
::          tool是一个迭代变量,正是它在一直工作                                           ::
::          turn是索引值,表示数组当前位置                                                 ::
::          程序中使用了两个数组,起到统计作用                                             ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
运行结果


[ Last edited by my3439955 on 2007-4-23 at 02:33 AM ]



X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
2007-4-23 02:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





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

我想用位运算可以

2007-4-24 00:14
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: