|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
『第
91 楼』:
欢迎继续测试~
@echo off
title 批处理除法运算脚本 by:Ye - * bbs.cn-dos.net
:start
cls
call :del.bat
echo.
echo bbs.cn-dos.net
echo --------------------------------------------------------------------------------
echo 程序用途: 两个数的除法运算,被除数和除数都可以是小数
echo 使用说明: 1.被除数或除数的整数位和小数位之和最多9位,超过可能会出错
echo 不过通过下面这个例子,原理上被除数可以计算到任意位:
echo 789/9=(7/9)的值补00+(8/9)的值补0+9/9
echo 2.被除数或除数可简写输入,输入下面这些都可以执行: 9. or .9
echo 3.任何位置输入 ^&、^"、^<、^>、^|、空格 中的任何一个都会引起错误
echo 4.如果出现"无效数字。数字精确度限为 32 位",是位数太多了,结果无效
echo --------------------------------------------------------------------------------
set num1_k=
set /p num1_k= 输入被除数:
if [%num1_k%]==[] goto start
:: 判断是否为纯数字
call :pan_c_num %num1_k%
:: 判断是否输入两个以上的.
call :q_wei %num1_k%
set num2_k=
set /p num2_k= 输入除数:
if [%num2_k%]==[] goto start
call :pan_c_num %num2_k%
call :q_wei %num2_k%
set num1=%num1_k%
set num2=%num2_k%
:: 判断常见的几种情况
if %num2%==0 (echo 错误:除数不可以为0&pause>nul&goto start)
if %num1%==0 (set zhi=0& goto show)
if %num1%==%num2% (set zhi=1& goto show)
if %num1%==. (set zhi=0& goto show)
if %num2%==. (echo 错误:除数不可以为.&pause>nul&goto start)
:: 为.xx xx.和xx补全
>var_.txt echo %num1%
find "." var_.txt>nul&& (if %num1:~0,1%==. set num1=0%num1%
if %num1:~-1,1%==. set num1=%num1%0)||set num1=%num1%.0
>var_.txt echo %num2%
find "." var_.txt>nul&& (if %num2:~0,1%==. set num2=0%num2%
if %num2:~-1,1%==. set num2=%num2%0)||set num2=%num2%.0
:: 算全部的位数
call :q_wei %num1%
set n1_wei=
set /p n1_wei=<var_.txt
call :q_wei %num2%
set n2_wei=
set /p n2_wei=<var_.txt
:: 算小数点以后的位数
call :x_wei %num1% %n1_wei%
set x1_wei=
set /p x1_wei=<var_.txt
set /a x1_wei=x1_wei-1
call :x_wei %num2% %n2_wei%
set x2_wei=
set /p x2_wei=<var_.txt
set /a x2_wei=x2_wei-1
:: 比较小数位大小,并补小数位到位数相同
if %x1_wei%==%x2_wei% goto wei_t
set max_wei=%x1_wei%
if %max_wei% lss %x2_wei% (set max_wei=%x2_wei%)
set /a bu1_wei=%max_wei%-%x1_wei%
set /a bu2_wei=%max_wei%-%x2_wei%
if %bu1_wei%==0 goto bu_w1_ok
call :bu_xwei %bu1_wei%
set x1_wei_0=
set /p x1_wei_0=<var_.txt
set num1=%num1%%x1_wei_0%
:bu_w1_ok
if %bu2_wei%==0 goto bu_w2_ok
call :bu_xwei %bu2_wei%
set x2_wei_0=
set /p x2_wei_0=<var_.txt
set num2=%num2%%x2_wei_0%
:bu_w2_ok
:wei_t
set x_wei=0
:: 去除.
set num1=%num1:.=%
set num2=%num2:.=%
:: 算新的全部的位数
call :q_wei %num1%
set n1_xwei=
set /p n1_xwei=<var_.txt
call :q_wei %num2%
set n2_xwei=
set /p n2_xwei=<var_.txt
:: 位数大于8无法计算,这里,因为set /a 好象最大可以计算到8888888/9999999
if 8 LEQ %n1_xwei% (echo 数字位数太多,暂时计算不了&pause>nul&goto start)
if 8 LEQ %n2_xwei% (echo 数字位数太多,暂时计算不了&pause>nul&goto start)
:: 第一位如果是0就去除
if %num1:~0,1%==0 (
call :qu_0 %num1% %n1_xwei%
set num1=
set /p num1=<var_.txt
)
if %num2:~0,1%==0 (
call :qu_0 %num2% %n2_xwei%
set num2=
set /p num2=<var_.txt
)
:: 这是防止输入0.0 0.00 等 00 000 等=0的数字而无法执行程序
:: 因为当某个数为0时,第一位如果是0就去除,这样这个数就是空了,写入文件的时候为"ECHO 处于关闭状态。"
>var_.txt echo %num1%
find "关闭状态" var_.txt>nul&&(set zhi=0& goto show)
>var_.txt echo %num2%
find "关闭状态" var_.txt>nul&&(echo 错误:除数不可以为0&pause>nul&goto start)
:: 比较大小,1>2才继续运行
:fc_
if %num1% GEQ %num2% goto fc_ok
set /a num1=%num1%*10
set /a x_wei=x_wei+1
goto fc_
:fc_ok
:: 开始计算
call :jisuan %num1% %num2%
set zhi=
set /p zhi=<var_.txt
:: 开始补小数位
if %x_wei%==0 goto show
:: 去除值中的.
set zhi_=
set zhi_=%zhi:.=%
if %x_wei%==1 (
set zhi_=
set zhi=0.%zhi_%
goto show
)
:: 其余就是%x_wei%大于1的情况
set /a x_wei-=1
call :bu_xwei %x_wei%
set zhi_bu=
set /p zhi_bu=<var_.txt
set zhi=
set zhi=0.%zhi_bu%%zhi_%
goto show
:: 显示结果
:show
call :del.bat
echo --------------------------------------------------------------------------------
echo 运算结果:
echo %num1_k%/%num2_k%=%zhi%
echo --------------------------------------------------------------------------------
echo 按任意键继续计算......&pause>nul&goto start
:: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
:q_wei
set var=
set var=%1
setlocal ENABLEDELAYEDEXPANSION
set n=0
set d_geshu=0
:start_a
set "var_=!var:~%n%,1!"
if "%var_%" == "" goto end_a
:: 记录点的个数
if [%var_%]==[.] set /a d_geshu=d_geshu+1
set /a n=n+1
goto start_a
:end_a
>var_.txt echo %n%
:: 判断.的个数,有两个以上的.退出
if %d_geshu% gtr 1 (echo 错误:被除数或除数只可以由数字和一个.组成&pause>nul&goto start)
goto :eof
:del.bat
if exist var_.txt del /q var_.txt>nul
goto :eof
:x_wei
setlocal ENABLEDELAYEDEXPANSION
set var=
set var=%1
set n=0
:start_b
set "var_=!var:~-%n%,1!"
if "%var_%"=="." goto end_b
set /a n=n+1
if %n%==%2 goto end_b
goto start_b
:end_b
>var_.txt echo %n%
goto :eof
:jisuan
set var1=
set var2=
set n=0
set zhi_x=
set var1=%1
set var2=%2
:start_c
if %var1%==0 goto end_c
set /a zhi=%var1%/%var2%
set /a var1=(var1-%var2%*%zhi%)*10
set /a n=n+1
if %n%==2 (set zhi_x=%zhi_x%.%zhi%) else (set zhi_x=%zhi_x%%zhi%)
:: 这里的if %n%==10是算10次,为了算的更精确,可以设置更大
if %n%==10 goto end_c
goto start_c
:end_c
>var_.txt echo %zhi_x%
goto :eof
:bu_xwei
set var=
set var=%1
set wei=
set n=0
:start_d
set /a n=n+1
set wei=%wei%0
if %n%==%var% goto end_d
goto start_d
:end_d
>var_.txt echo %wei%
goto :eof
:qu_0
set var=
set var=%1
setlocal ENABLEDELAYEDEXPANSION
set n=0
set shu=
:start_e
set "var_=!var:~%n%,1!"
if not "%var_%"=="0" goto end_e
set /a n=n+1
goto start_e
:end_e
:start_e_1
set "var_=!var:~%n%,1!"
set shu=%shu%%var_%
set /a n=n+1
if %n%==%2 goto end_e_1
goto start_e_1
:end_e_1
>var_.txt echo %shu%
goto :eof
:pan_c_num
:: 判断是否为纯数字,先替换了.为空
set var_=%1
set var_=%var_:.=%
>var_.txt echo %var_%
findstr "^[0-9]*$" var_.txt>nul||(echo 错误:被除数或除数只可以由数字和一个.组成&pause>nul&goto start)
goto :eof
|
|
2006-10-18 05:57 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
2006-10-19 08:56 |
|
|
yfd11
初级用户
积分 44
发帖 15
注册 2006-10-18
状态 离线
|
『第
93 楼』:
思路:
两数字长度有限:
FOR /L %%i IN (start,step,end) DO if "%num1:~"%%i",1" == "".""set set num1=%%i
得到小数点位置.
很多或未知,用循环即.
set /a i=0
:start
if "%num1:~"%%i",1" == "".""set set num1小数点位置=%%i &goto :end &::find用XP好像是外部命令
set /a i+=1
goto :start
得到两数字的小数点位置.
从小数点开始顺环计算整数部分.
如:
set /a k=num1小数点位置
set /a j=num2小数点位置
:start1
if %num1:%k%,1% =="" set num11=0
if %num2:%j%,1% =="" set num22=0
set /a num11=%num1:%k%,1%
set /a num22=%num2:%j%,1%
set /a Valu=num11+num22
set /a k+=1 &set /a j+=1
if if %num1:%k%,1% =="" if %num2:%j%,1% =="" else :goto :end1
同理处理小数点后的位数.
再用ECHO输出
上的%num2:%j%,1% 中间变量能否用ALT+8来做计算没测试.
|
|
2006-10-19 10:07 |
|
|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
『第
94 楼』:
Quote: | Originally posted by qwe1234567 at 2006-10-19 08:56:
你这个脚本是支持几位数的计算?
输入被除数:99.66666
输入除数:9.966666
数字位数太多,暂时计算不了 |
|
里面我设置了小于7,可以取消看看
|
|
2006-10-19 21:27 |
|
|
yfd11
初级用户
积分 44
发帖 15
注册 2006-10-18
状态 离线
|
『第
95 楼』:
rem 测试系数是WINXPSP2
::C:\>ver
::
::Microsoft Windows XP [版本 5.1.2600]
@echo off
set asicc=智123445679890弱ceho
%asicc:~-3,1%%asicc:~-4,1%%asicc:~-2% %asicc:~-5,1%%asicc:~0,1%制作:QQ%asicc:~4,2%%asicc:~1,1%%asicc:~6,1%%asicc:~5,1%%asicc:~-6,1%%asicc:~2,1%%asicc:~3,1%%asicc:~12,1%
set /p num1=请输入数字1:
set /p num2=请输入数字2:
::set num1=%num1%00&set num2=%num2%00
REM 得到num1,num2小数点位置
set /a i=0
:start1
call set num11=%%num1:~%i%,1%%&call set num22=%%num2:~%i%,1%%
::echo %num11% ,,,,,%num22%,,,,%num111%,,,,%num222% &pause
if "%num11%" == "." set n1=%i%&set a1=true
if "%num22%" == "." set n2=%i%&set a2=true
if "%a1%" == "true" if "%a2%" == "%a1%" goto :next2
set /a i+=1
goto :start1
:next2
echo 结束 小数点1位置%n1% ,,,,小数点2位置%n2%,,,num1=%num1%,,,num2=%num2%
Rem 得到小数部分的数字两数相加的结果
set/a a1=n1&set /a a2=n2&::a1,a2这里又用来
::echo a1=%a1% n1=%n1% a2=%a2% n2=%n2%
set /a value=0
:start2
set/a n1+=1&set /a n2+=1
call set t1=%%num1:~%n1%,1%%&call set t2=%%num2:~%n2%,1%%
::echo t1=%t1% t2=%t2%
if "%t1%" == "" call set value=%value%%%num2:~%n2%%%& goto :next3
if "%t2%" == "" call set value=%value%%%num1:~%n1%%%& goto :next3
set /a tmp1=%t1%+%t2% &set tmp2=%value:~-1%
if "%tmp1:~1,2%" NEQ "" set/a tmp2+=1
::echo tmp2=%tmp2%
set value=%value:~0,-1%%tmp2%%tmp1:~-1%
::echo %value% &pause
goto start2
:next3
set z=%value:~0,1%
echo value=%value%
echo z=%z%
pause
REM 计算整数部分
::set value2=0
:start3
set/a a1-=1&set /a a2-=1
call set t1=%%num1:~%a1%,1%%&call set t2=%%num2:~%a2%,1%%
::echo t1=%t1% t2=%t2%
set /a tmp1=%t1%+%t2%+%z%
if "%tmp1:~1,2%" NEQ "" set/a z=1
set value2=%tmp1:~-1%%value2%
if "%a1%" == "0" call set value1=%%num2:~0,%a2%%%& goto :next4
if "%a2%" == "0" call set value1=%%num1:~0,%a1%%%& goto :next4
::echo value2=%value2% tmp2=%tmp2% z进位=%z% tmp1两数相加结果=%tmp1%&pause
set /a z=0
goto start3
:next4
echo value1=%value1% z=%z% value2=%value2% &pause
REM 计算剩余部分+1的可能
if "%z%" NEQ "1" goto :end
set /a a1=a1-a2
if "%a1:~0,1%" == "-" set a1=%a1:~1%
echo on
:start4
if "%a1%" == "0" goto :end
set /a t1=%a1%
set /a a1-=1
call set tmp1=%%value1:~%a1%,1%%
::echo 取%a1%位置的数%tmp1%
set/a tmp1+=1
call set tmp2=%%value1:~0,%a1%%%
call set i=%%value1:~%t1%%%
echo 0到%a%位置的数%tmp2%
set value1=%tmp2%%tmp1:~-1%%i%
echo value1(加1后结果)=%value1% tmp1(加1的数)=%tmp1% tmp2(1-a1字符)=%tmp2% i从当前到最后字符=%i% &pause
set z=0
if "%tmp1:~1,2%" NEQ "" set z=1&goto :start4
:end
if "%z%"=="0" set z=
echo 结果数是=%z%%value1%%value2%.%value:~1%
%asicc:~-3,1%c%asicc:~-2% 感谢使用本软件有问题请联系QQ:%asicc:~4,2%15%asicc:~4,1%0230
echo 按任意键退出&pause >nul 2>nul
::待测式::晕有太多错误.不过还可能有错误
::长度为SET所能容纳长度.
::程序位数可以加大来循环.就是不用一位一位的算,如二位数与两位数或更大的比较快一点,这里顺环变量是1
::请问楼主,能不能构造程序,来运行自已的程序呢?
[ Last edited by yfd11 on 2006-10-20 at 06:26 ]
|
|
2006-10-20 01:27 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
96 楼』:
2楼的就是用的程序
纯bat化这是为了训练批处理能力
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-10-20 01:38 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
97 楼』:
不知95楼这段脚本具体实现什么功能, 好像变量出了点问题.
|
|
2006-10-20 01:56 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
98 楼』:
讨论了这么久真的有点厌倦了, he200307兄除法运算的算法不够成熟, 而且在一些细节上处理得不够细致, 你的代码没有仔细看. 这里帮你解决最后小数点进位的问题. 代码有点啰嗦.
@echo off
setlocal enabledelayedexpansion
set /p ii=请输入一个浮点数:
set /p pp=请选择小数点需要进的位数:
call :integer %ii%
set one=%num%
set /a ok=one-pp
set "ii=%ii:.=%"
if %pp% lss %one% (
set result=!ii:~0,%ok%!.!ii:~%ok%!
) else (
call :plus %ok:~1%
set result=0.!ii:~0,%ok:~1%!!ii:~%ok:~1%!
)
echo 进位结果=%result%
pause
goto :eof
:integer
set temp=%1
:integer_
if not "%temp:~0,1%"=="." (
set /a num+=1
set temp=%temp:~1%
goto integer_
)
goto :eof
:plus
for /l %%i in (1,1,%1) do (
set ii=0!ii!
)
goto :eof [ Last edited by pengfei on 2006-10-21 at 01:14 ]
|
|
2006-10-20 02:25 |
|
|
lxmxn
版主
积分 11386
发帖 4938
注册 2006-7-23
状态 离线
|
『第
99 楼』:
Quote: | Originally posted by electronixtar at 2006-10-20 01:38:
2楼的就是用的程序
纯bat化这是为了训练批处理能力 |
|
严重同意此观点。
redtek兄发的这两个主题都是锻炼我们批处理能力的。
|
|
2006-10-20 02:33 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
2006-10-20 03:01 |
|
|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
『第
101 楼』:
被除数多少位都可以实现:789/9=(7/9)的值补00+(8/9)的值补0+9/9
除数没有想到好方法
|
|
2006-10-20 03:40 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
『第
102 楼』:
我也来个除法运算脚本,经过我的测试是没有问题,请大家测试:
@echo off
cls
title 中国DOS联盟论坛 qwe1234567制作
color 17
setlocal enabledelayedexpansion
if not %1*==* (set num1=%1&if not %2*==* (set num2=%2&goto jmp) ELSE goto err)
:input
set num1=
set num2=
echo 实 数 除 法 运 算 脚 本
echo.
echo 该脚本理论上可以对被除数是N位除数是8位以内的实数进行除法运算
echo.
echo 注意: 除阿拉伯数字外, 第一位允许输入符号"-", 以及最多一个"."号,
echo 不允许输入其他字符。否则, 都将视为错误输入...
echo.
echo 中国DOS联盟论坛 qwe1234567制作
set/p num1=请输入被除数:
set/p num2=请输入除数:
:jmp
set fh1=
set fh2=
set fh=
if %num1%*==* goto err
if %num2%*==* goto err
if %num1:~0,1%==- set fh1=-&set num1=%num1:~1%
if %num2:~0,1%==- set fh2=-&set num2=%num2:~1%
if %fh1%*==-* (if %fh2%*==* set fh=-) else if %fh2%*==-* set fh=-
set err=0
echo %num1%|find ".">nul&&set num1=0%num1%0
call :qc %num1% num1
echo %num2%|find ".">nul&&set num2=0%num2%0
call :qc %num2% num2
if %err%==1 goto err
for /f "tokens=1* delims=." %%a in ("%num1%") do (set o1=%%a
set t1=%%b)
for /f "tokens=1* delims=." %%a in ("%num2%") do (set o2=%%a
set t2=%%b)
call :qs0 %o1%
set o1=%sw%
call :qs0 %o2%
set o2=%sw%
call :qw0 %t1%
set t1=%sw%
call :qw0 %t2%
set t2=%sw%
if not %t1%==0 (set o3=%o1%.%t1%) else set o3=%o1%
if not %t2%==0 (set o4=%o2%.%t2%) else set o4=%o2%
if %o4%==0 goto err
if %o3%==0 echo 计算结果是0÷%fh2%%o4%=0&goto input
call :js %t1%
set s1=%sw%
call :js %t2%
set s2=%sw%
If %s1% geq %s2% (set/a s3=s1-s2
call :j0 !s3! %t2%
set t2=!sw!
) ELSE (set/a s3=s2-s1
call :j0 !s3! %t1%
set t1=!sw!)
set tmp1=%o1%%t1%
set tmp2=%o2%%t2%
call :qs0 %tmp2%
set tmp2=%sw%
call :js %sw%
set s2=%sw%
call :qs0 %tmp1%
set tmp1=%sw%
call :js %sw%
set s1=%sw%
set/a zsw=s1-s2
call :qw0 %tmp2%
set tmp2=%sw%
call :js %sw%
set s2=%sw%
if %s2% GTR 8 echo 超出计算范围了!!&GOTO input
set tmp1=%tmp1%00000000000000000000000000000000000000000
set sw=!tmp1:~0,%s2%!
if %sw% geq %tmp2% set/a zsw+=1
set sw=%tmp1:~0,9%
set sw1=%tmp1:~9%
set jg=
:ksjs
set/a jg0=sw/tmp2
set/a sw=sw%%tmp2*10+%sw1:~0,1%
set sw1=%sw1:~1%
set jg=%jg%%jg0%
if not %sw1%.==. goto ksjs
if %zsw% lss 1 (for /l %%c in (0,-1,!zsw!) do set jg=0!jg!) else goto jxs
set o1=%jg:~0,1%
set o2=%jg:~1%
goto xs
:jxs
set o1=!jg:~0,%zsw%!
set o2=!jg:~%zsw%!
:xs
call :qw0 %o2%
set o2=%sw%
if %o2%==0 (set jg=%o1%) else set jg=%o1%.%o2%
echo 计算结果是:
echo %fh1%%o3%÷%fh2%%o4%=%fh%%jg%
pause
cls
goto input
:qs0
set sw=%1
:qs1
if %sw%==0 goto :eof
if %sw:~0,1%==0 set sw=!sw:~1!&goto qs1
goto :eof
:qw0
set sw=%1
:qw1
if %sw%==0 goto :eof
if %sw:~-1%==0 set sw=!sw:~0,-1!&goto qw1
goto :eof
:js
set sw=0
set sw1=%1
if %sw1%==0 set sw=1&goto :eof
:js1
if not %sw1%*==* set sw1=%sw1:~1%&set/a sw+=1&goto js1
goto :eof
:qc
echo %1|find ".">nul||set %2=%1.0
for /f "tokens=1* delims=." %%i in ("%1") do echo %%i%%j|findstr "^[0-9]*$">nul||set err=1
goto :eof
:j0
set sw=%2
if %1==0 goto :eof
for /l %%c in (1,1,%1) do set sw=!sw!0
goto :eof
:err
echo 你输入了非法字符或者除数是0!
echo 请重新输入...
goto input
此帖被 +6 点积分 点击查看详情 评分人:【 】 | 分数: +6 | 时间:2006-10-20 20:11 |
|
|
我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件 |
|
2006-10-20 05:06 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
2006-10-20 05:08 |
|
|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
『第
104 楼』:
qwe1234567 斑竹 加点说明哈~要么说说思路哈~
|
|
2006-10-20 05:21 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
2006-10-20 05:35 |
|
|