|
vkill
金牌会员
积分 4103
发帖 1744
注册 2006-1-20 来自 甘肃.临泽
状态 离线
|
『第
16 楼』:
我觉得用到什么了找别人的来修改来使用,直接用?怕不怎么好使
|
|
2008-4-25 13:29 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
17 楼』:
Quote: | Originally posted by vkill at 2008-4-25 01:29 PM:
我觉得用到什么了找别人的来修改来使用,直接用?怕不怎么好使 |
|
这个zh159兄说过,就是通用性,我开始不以为然,做了许多尝试过后,确有感触。
确实要想完全通用不加修改,有一定困难,这样的代码不是很多,并且当做为通用函数时,代码的效率还会降低,
但是,这只是开始,你如果去老外的论坛,你会对次肯定的。
它即使起不到”函数库的作用“ 它起码提供了个方法库,这对我们引用别人的很方便,新手学习也较集中。
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-4-25 13:36 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
18 楼』:
大家能否讨论下下 set做浮点运算的函数
参考论坛里的有关浮点运算的经典帖子(这些请搜索关键字“浮点”),(除数位数多于8位的现在有困难)个人认为完全可以建立一个批处理浮点运算的函数+ - * /,因为set支持位运算,从这点来所,est原先说的计算什么方程的根,倒数了,是可行的,可以好不夸张地说,计算圆周率pi,自然对数e都是可行的,效率当然无法与高级语言相比,但理论上可行。
至于实用性-----没有,这个只当是弥补批处理没有提供浮点运算的现成命令了。
不过很好玩啊。
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-4-25 14:16 |
|
|
moniuming
银牌会员
永远的菜鸟
积分 1335
发帖 574
注册 2007-11-27 来自 广西
状态 离线
|
『第
19 楼』:
批处理乘法函数
@echo off
::Code By cn-dos moniuming 2008-12-31
if "%1"=="" goto :hlp
setlocal enabledelayedexpansion
:bgn
for %%a in (dot ceng fuhao wei answer strax strbx) do (set %%a=)
set "stra=%1"&set "strb=%2"
if "%stra:~,1%"=="+" (set stra=%stra:~1%)
if "%strb:~,1%"=="+" (set strb=%strb:~1%)
if "%stra:~,1%"=="-" (set /a fuhao+=1&set stra=%stra:~1%)
if "%strb:~,1%"=="-" (set /a fuhao+=1&set strb=%strb:~1%)
for /f "tokens=1,2 delims=." %%a in ("%stra%") do (
set "stral=%%a"&set "strar=%%b"
)
for /f "tokens=1,2 delims=." %%a in ("%strb%") do (
set "strbl=%%a"&set "strbr=%%b"
)
:agn1
if defined strar (
set "strax=%strax%%strar:~-1% "
set /a "dot+=1","wei+=1"
if not "%strar:~0,-1%"=="" (
set "strar=%strar:~0,-1%"&goto :agn1
)
)
:agn2
if defined strbr (
set "strbx=%strbx%%strbr:~-1% "
set /a "dot+=1","wei+=1"
if not "%strbr:~0,-1%"=="" (
set "strbr=%strbr:~0,-1%"&goto :agn2
)
)
:agn3
set "strax=%strax%%stral:~-1% "
set /a "wei+=1"
if not "%stral:~0,-1%"=="" (set "stral=%stral:~0,-1%"&goto :agn3)
:agn4
set "strbx=%strbx%%strbl:~-1% "
set /a "wei+=1"
if not "%strbl:~0,-1%"=="" (set "strbl=%strbl:~0,-1%"&goto :agn4)
for %%a in (%strax%) do (
set /a "ceng+=1"&set "lie=!ceng!"&set "jinwei=0"
for %%b in (%strbx%) do (
set /a "sth=%%a*%%b"
set "sthl=!sth:~0,-1!"
set "sthr=!sth:~-1!"
set /a "var=ans!lie!+!jinwei!+!sthr!"
set "jinwei=0"
set "varl=!var:~0,-1!"
set "varr=!var:~-1!"
if not "!sthl!"=="" (set /a "jinwei+=!sthl!")
if not "!varl!"=="" (set /a "jinwei+=!varl!")
set "ans!lie!=!varr!"
set /a "lie+=1"
)
set "ans!lie!=!jinwei!"
)
for /l %%a in (1 1 %wei%) do (
set "answer=!ans%%a!!answer!"
set "ans%%a="
)
if defined dot (
if not "%4"=="" (
if "%4"=="0" (
set "answer=!answer:~0,-%dot%!"
) else (
set "answer=!answer:~0,-%dot%!.!answer:~-%dot%,%4!"
)
) else (
set "answer=!answer:~0,-%dot%!.!answer:~-%dot%!"
)
)
:cut
if "%answer:~0,1%"=="0" (
if not "%answer:~1,1%"=="." (
set answer=%answer:~1%
goto :cut
)
)
if "%fuhao%"=="1" (set answer=-%answer%)
endlocal&set "%3=%answer%"&goto :eof
:hlp
color 3f
echo.&echo 使用方法:
echo.&echo 1.把本批处理脚本命名为 chengfa.bat 复制到系统目录里
echo.&echo 2.不带参数运行本批处理脚本显示此帮助信息
echo.&echo 3.格式: call chengfa.bat 参数1 参数2 参数3 [参数4]
echo.&echo 参数1 为乘数1
echo.&echo 参数2 为乘数2
echo.&echo 参数3 为变量名
echo.&echo 参数4 为保留小数位数,可选参数,如不选则保留所有小数.
echo.&echo 4.例: call chengfa.bat 100 123.456789 ans 2
echo.&echo 意思为给变量 ans 赋值,其值等于 100 和 123.456789 的乘积,
echo.&echo 并保留两位小数,结果为: 12345.67
echo.&set/p= 按任意键退出...<nul&pause>nul&color&goto :eof [ Last edited by moniuming on 2009-1-19 at 21:17 ]
|
|
2009-1-19 18:43 |
|
|
moniuming
银牌会员
永远的菜鸟
积分 1335
发帖 574
注册 2007-11-27 来自 广西
状态 离线
|
『第
20 楼』:
批处理加法函数
@echo off
::Code By cn-dos moniuming
if "%1"=="" goto :hlp
setlocal enableextensions
set "jinwei=0"
for %%a in (lastans bu dot) do (set %%a=)
set "stra=%1"
set "strb=%2"
if not "%4"=="" (
if "%4"=="0" (
set bu0=1
set dot=dot
) else (
set bu0=%4
)
) else (
set bu0=2
)
for /l %%a in (1 1 %bu0%) do (call set bu=%%bu%%0)
for /f "tokens=1,2 delims=." %%a in ("%stra%") do (
set stral=%%a
set "strar=%%b%bu%"
)
for /f "tokens=1,2 delims=." %%a in ("%strb%") do (
set strbl=%%a
set "strbr=%%b%bu%"
)
call set "jiashu1=%stral%%%strar:~0,%bu0%%%"
call set "jiashu2=%strbl%%%strbr:~0,%bu0%%%"
:agn
set /a "var=%jiashu1:~-1%+%jiashu2:~-1%+%jinwei%"
if %var% gtr 9 (set jinwei=1) else (set jinwei=0)
set "lastans=%var:~-1%%lastans%"
if not "%jiashu1:~0,-1%"=="" (
set "jiashu1=%jiashu1:~0,-1%"
) else (
set "jiashu1="
)
if not "%jiashu2:~0,-1%"=="" (
set "jiashu2=%jiashu2:~0,-1%"
) else (
set "jiashu2="
)
if defined jiashu1 (
if defined jiashu2 (
goto :agn
) else (
call :count1
)
) else (
if defined jiashu2 (call :count2)
)
if "%jinwei%"=="0" (set "jinwei=")
call set "cn_ans=%jinwei%%%lastans:~0,-%bu0%%%.%%lastans:~-%bu0%%%"
if defined dot (set cn_ans=%cn_ans:~,-2%)
:cut0
if "%cn_ans:~,1%"=="0" (
if not "%cn_ans:~1%"=="" (
if not "%cn_ans:~1,1%"=="." (
set "cn_ans=%cn_ans:~1%"
goto :cut0
)
)
)
endlocal&set "%3=%cn_ans%"&goto :eof
:count1
set /a "var=%jiashu1:~-1%+%jinwei%"
if "%var:~0,-1%"=="1" (set jinwei=1) else (set jinwei=0)
set "lastans=%var:~-1%%lastans%"
if not "%jiashu1:~0,-1%"=="" (
set "jiashu1=%jiashu1:~0,-1%"
goto :count1
) else (goto :eof)
:count2
set /a "var=%jiashu2:~-1%+%jinwei%"
if "%var:~0,-1%"=="1" (set jinwei=1) else (set jinwei=0)
set "lastans=%var:~-1%%lastans%"
if not "%jiashu2:~0,-1%"=="" (
set "jiashu2=%jiashu2:~0,-1%"
goto :count2
) else (goto :eof)
:hlp
color 1f
echo.
echo 声明: 此脚本不支持负数的加法
echo 使用方法:
echo 把本批处理脚本复制到系统目录里
echo 不带参数运行本脚本 显示此帮助信息
echo.
echo 格式: call jiafa.bat 参数1 参数2 参数3 [参数4]
echo 参数1 为加数1
echo 参数2 为加数2
echo 参数3 为变量名
echo [参数4] 可选参数,为保留小数的位数,如果空则默认保留2位小数
echo.
echo 例: call jiafa.bat 100.78965 123.45 ans 4
echo 意思为给变量 ans 赋值,其值等于100.78965与123.45的和,并保留四位小数
echo 结果为:224.2396
echo.&set/p= 按任意键退出...<nul
pause>nul&color&goto :eof
|
|
2009-1-20 19:17 |
|
|
523066680
银牌会员
SuperCleaner
积分 2362
发帖 1133
注册 2008-2-2
状态 离线
|
『第
21 楼』:
嘿嘿,大家有必要讨论一下把函数放在什么地方合适哦
比如说system32 以后可以直接调用,又比如说%userprofile%
可以编一些很有个性的函数,大大地减少鼠标的使用
可能会另外开贴,再议
|
综合型编程论坛
我的作品索引 |
|
2009-1-21 10:38 |
|
|
WANKOILZ
初级用户
积分 198
发帖 89
注册 2007-9-6 来自 重庆
状态 离线
|
『第
22 楼』:
个人觉得“函数库”的通用性不强,“过程库”应该更容易移植,多发点不需要参数的“过程”还不错...
|
|
2009-1-21 15:45 |
|
|
moniuming
银牌会员
永远的菜鸟
积分 1335
发帖 574
注册 2007-11-27 来自 广西
状态 离线
|
『第
23 楼』:
20楼加法函数的修改版
修改的内容为:如果参数4(保留小数位数)为空,则保留原有的小数位数...
@echo off
::Code By cn-dos moniuming 2009-02-08
if "%1"=="" goto :hlp
setlocal enableextensions
set /a jinwei=0,mm=0,mn=0
for %%a in (lastans bu baoliu dot tmp_) do (set %%a=)
set "stra=%1"
set "strb=%2"
if not "%4"=="" (
if "%4"=="0" (
set dot=dot
) else (
set baoliu=%4
)
)
for /f "tokens=1,2 delims=." %%a in ("%stra%") do (
set stral=%%a
set strar=%%b
)
for /f "tokens=1,2 delims=." %%a in ("%strb%") do (
set strbl=%%a
set strbr=%%b
)
::如果不保留小数则跳过对小数部分的计算
if defined dot (
set jiashu1=%stral%
set jiashu2=%strbl%
goto :agn
)
::如果没有小数则跳过对小数部分的计算
if "%strar%"=="" (
if "%strbr%"=="" (
set dot=dot
set jiashu1=%stral%
set jiashu2=%strbl%
goto :agn
)
)
::计算加数1的小数位数
set "tmp_=%strar%"
:cnt1
if defined tmp_ (
set /a mm+=1
set tmp_=%tmp_:~1%
goto :cnt1
)
set "bu0=%mm%"
set "tmp_="
::计算加数2的小数位数
set "tmp_=%strbr%"
:cnt2
if defined tmp_ (
set /a mn+=1
set tmp_=%tmp_:~1%
goto :cnt2
)
if %mn% gtr %mm% (set bu0=%mn%)
::将两个加数的小数对齐
for /l %%a in (1 1 %bu0%) do (call set bu=%%bu%%0)
set strar=%strar%%bu%
set strbr=%strbr%%bu%
call set strar=%%strar:~,%bu0%%%
call set strbr=%%strbr:~,%bu0%%%
set "bu="
::如果定义小数位数,则取定义的位数
if defined baoliu (
for /l %%a in (1 1 %baoliu%) do (call set bu=%%bu%%0)
call set strar=%strar%%%bu%%
call set strbr=%strbr%%%bu%%
call set "jiashu1=%stral%%%strar:~,%baoliu%%%"
call set "jiashu2=%strbl%%%strbr:~,%baoliu%%%"
) else (
set jiashu1=%stral%%strar%
set jiashu2=%strbl%%strbr%
)
::计算
:agn
set /a "var=%jiashu1:~-1%+%jiashu2:~-1%+%jinwei%"
if %var% gtr 9 (set jinwei=1) else (set jinwei=0)
set "lastans=%var:~-1%%lastans%"
if not "%jiashu1:~0,-1%"=="" (
set "jiashu1=%jiashu1:~0,-1%"
) else (
set "jiashu1="
)
if not "%jiashu2:~0,-1%"=="" (
set "jiashu2=%jiashu2:~0,-1%"
) else (
set "jiashu2="
)
if defined jiashu1 (
if defined jiashu2 (
goto :agn
) else (
call :count
)
) else (
if defined jiashu2 (
set jiashu1=%jiashu2%
call :count
)
)
::对小数点进行定位
if not defined dot (
if defined baoliu (
call set "cn_ans=%jinwei%%%lastans:~0,-%baoliu%%%.%%lastans:~-%baoliu%%%"
) else (
call set "cn_ans=%jinwei%%%lastans:~,-%bu0%%%.%%lastans:~-%bu0%%%"
)
) else (
set cn_ans=%jinwei%%lastans%
)
::对得数进行首位除0的处理
:cut0
if "%cn_ans:~,1%"=="0" (
if not "%cn_ans:~1%"=="" (
if not "%cn_ans:~1,1%"=="." (
set "cn_ans=%cn_ans:~1%"
goto :cut0
)
)
)
endlocal&set "%3=%cn_ans%"&goto :eof
::如果两个加数长度不一样,单独对长出来的部分进行计算
:count
set /a "var=%jiashu1:~-1%+%jinwei%"
if "%var:~0,-1%"=="1" (set jinwei=1) else (set jinwei=0)
set "lastans=%var:~-1%%lastans%"
if not "%jiashu1:~0,-1%"=="" (
set "jiashu1=%jiashu1:~0,-1%"
goto :count
)
goto :eof
:hlp
color 1f
echo.
echo 声明: 此脚本不支持负数的加法
echo.
echo 使用方法:
echo 把本批处理脚本复制到系统目录里
echo 不带参数运行本脚本 显示此帮助信息
echo.
echo 格式: call jiafa.bat 参数1 参数2 参数3 [参数4]
echo 参数1 为加数1
echo 参数2 为加数2
echo 参数3 为变量名
echo [参数4] 可选参数,为保留小数的位数,如果空则保留原有小数
echo.
echo 例: call jiafa.bat 100.78965 123.45 ans 4
echo 意思为给变量 ans 赋值,其值等于100.78965与123.45的和,并保留四位小数
echo 结果为:224.2396
echo.&set/p= 按任意键退出...<nul
pause>nul&color&goto :eof
|
|
2009-2-9 10:15 |
|
|
moniuming
银牌会员
永远的菜鸟
积分 1335
发帖 574
注册 2007-11-27 来自 广西
状态 离线
|
『第
24 楼』:
减法函数
@echo off
rem Code By cn-dos moniuming 2009-02-09
if "%1"=="" goto :hlp
setlocal enableextensions
for %%a in (jie mm mn tm) do (set %%a=0)
for %%a in (baoliu fu last_ans m n no tmp_) do (set %%a=)
set beij=%1
set jian=%2
rem 把被减数首位除0
:cut1
if "%beij:~,1%"=="0" (
if not "%beij:~1%"=="" (
if not "%beij:~1,1%"=="." (
set beij=%beij:~1%
goto :cut1
)))
rem 把减数首位除0
:cut2
if "%jian:~,1%"=="0" (
if not "%jian:~1%"=="" (
if not "%jian:~1,1%"=="." (
set jian=%jian:~1%
goto :cut2
)))
rem 判断保留小数的位数
if not "%4"=="" (
if "%4"=="0" (
set no=no
) else (
set baoliu=%4
)
)
rem 把被减数和减数分为整数和小数两个部分
for /f "tokens=1,2 delims=." %%a in ("%beij%") do (
set "stral=%%a"&set "strar=%%b"
)
for /f "tokens=1,2 delims=." %%a in ("%jian%") do (
set "strbl=%%a"&set "strbr=%%b"
)
rem 如果不保留小数,则跳过对小数部分的计算
if defined no (
set stra=%stral%
set strb=%strbl%
goto :agn1
)
rem 如果没有小数,则跳过对小数部分的计算
if "%strar%"=="" (
if "%strbr%"=="" (
set no=no
set stra=%stral%
set strb=%strbl%
goto :agn1
)
)
rem 计算被减数小数部分的位数
set "tmp_=%strar%"
:cnt1
if defined tmp_ (
set /a mm+=1
set tmp_=%tmp_:~1%
goto :cnt1
)
set "bu0=%mm%"
rem 计算减数小数部分的位数
set "tmp_=%strbr%"
:cnt2
if defined tmp_ (
set /a mn+=1
set tmp_=%tmp_:~1%
goto :cnt2
)
if %mn% gtr %mm% set bu0=%mn%
rem 将两个减数的小数部分对齐
for /l %%a in (1 1 %bu0%) do (call set bu=%%bu%%0)
set strar=%strar%%bu%
set strbr=%strbr%%bu%
call set strar=%%strar:~,%bu0%%%
call set strbr=%%strbr:~,%bu0%%%
set "bu="
rem 如果定义小数位数,则取定义的位数
if defined baoliu (
for /l %%a in (1 1 %baoliu%) do (call set bu=%%bu%%0)
call set strar=%strar%%%bu%%
call set strbr=%strbr%%%bu%%
call set stra=%stral%%%strar:~,%baoliu%%%
call set strb=%strbl%%%strbr:~,%baoliu%%%
) else (
set stra=%stral%%strar%
set strb=%strbl%%strbr%
)
rem 计算被减数整数部分的位数
:agn1
set /a m+=1
if not "%stral:~1%"=="" (set stral=%stral:~1%&goto :agn1)
rem 计算减数整数部分的位数
:agn2
set /a n+=1
if not "%strbl:~1%"=="" (set strbl=%strbl:~1%&goto :agn2)
rem 判断正负
if %n% gtr %m% (
set fu=fu
set "beijshu=%strb%"
set "jianshu=%stra%"
) else (
if "%n%"=="%m%" (
set tmp1=%stra%
set tmp2=%strb%
goto :pk
) else (
set "beijshu=%stra%"
set "jianshu=%strb%"
)
)
rem 计算
:agn
set /a sth=%beijshu:~-1%-%jianshu:~-1%-%jie%
if %sth% lss 0 (
set jie=1
set /a sth+=10
) else (
set jie=0
)
set last_ans=%sth%%last_ans%
if not "%beijshu:~,-1%"=="" (
if not "%jianshu:~,-1%"=="" (
set "beijshu=%beijshu:~,-1%"&set "jianshu=%jianshu:~,-1%"&goto :agn
) else (
set "beijshu=%beijshu:~,-1%"&set "jianshu=0"&goto :agn
)
)
rem 不保留小数的除0以及正负数处理
:cut0
if defined no (
if not "%last_ans:~,1%"=="0" (
if not defined fu (
endlocal&set %3=%last_ans%&goto :eof
) else (
endlocal&set %3=-%last_ans%&goto :eof
)
) else (
set last_ans=%last_ans:~1%
goto :cut0
)
)
rem 对小数点进行定位
if defined baoliu (
call set last_ans=%%last_ans:~,-%baoliu%%%.%%last_ans:~-%baoliu%%%
) else (
if bu0 gtr 0 (
call set last_ans=%%last_ans:~,-%bu0%%%.%%last_ans:~-%bu0%%%
)
)
rem 首位除0处理
:cut_
if "%last_ans:~,1%"=="0" (
if not "%last_ans:~1,1%"=="." (
set last_ans=%last_ans:~1%
goto :cut_
)
)
rem 正负处理
if defined fu (
set last_ans=-%last_ans%
) else (
set last_ans=%last_ans%
)
rem 退出脚本
endlocal&set %3=%last_ans%&goto :eof
rem 判断相同位数的大小
:pk
if %tmp1:~,1% gtr %tmp2:~,1% (
set beijshu=%stra%
set jianshu=%strb%
goto :agn
) else (
if %tmp2:~,1% gtr %tmp1:~,1% (
set fu=fu
set beijshu=%strb%
set jianshu=%stra%
goto :agn
) else (
if not "%tmp1:~1%"=="" (
set tmp1=%tmp1:~1%
set tmp2=%tmp2:~1%
goto :pk
) else (
endlocal&set %3=0&goto :eof
)
)
)
:hlp
color 1f
echo.&echo 使用方法:
echo.&echo 1.把本批处理脚本命名为 jianfa.bat 复制到系统目录里
echo.&echo 2.不带参数运行本批处理脚本显示此帮助信息
echo.&echo 3.格式: call jianfa.bat 参数1 参数2 参数3 [参数4]
echo.&echo 参数1 为被减数
echo.&echo 参数2 为减数
echo.&echo 参数3 为变量名
echo.&echo [参数4] 可选参数,为保留小数位数,如不选则保留原有小数.
echo.&echo 4.例: call jianfa.bat 100 123.456789 ans 2
echo.&echo 意思为给变量 ans 赋值,其值等于 100 减去 123.456789 的差,
echo.&echo 并保留两位小数,结果为: -23.45
echo.&set/p= 按任意键退出...<nul&pause>nul&color&goto :eof
|
|
2009-2-9 16:42 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
|
2009-2-9 19:17 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
26 楼』:
纵使我们的“过程代码”效率很低,幼稚也罢;但这是大家学习提高的一个平台,只要坚持,总会越来越精简,越来越高效,重复的工作必然会越来越少
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2009-4-13 00:09 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『第
27 楼』:
那好,我也来个加法的。
@echo off
set aa=%1
set bb=%2
::调用浮点加法函数
echo %time%
call :add cc aa bb
echo %time%
echo %cc%
goto :eof
:::::::::::::::::::::::::::::::
::浮点加法函数
:add <接收变量> <被加数变量> <加数变量>
::
::
::支持49位整数,49小数
::自动丢弃首尾无效0
::别看代码那么长,速度可不慢哦
:::::::::::::::::::::::::::::::
@echo off&setlocal enabledelayedexpansion
set za=!%2:*.=!
set xa=!%2:.%za%=!
set zb=!%3:*.=!
set xb=!%3:.%zb%=!
if "!zb!."=="!%3!." set zb=0
if "!za!."=="!%2!." set za=0
set za=%za%0
set zb=%zb%0
set zm=0
for /l %%a in (0,9,81) do (
if "!za:~%%a,9!!zb:~%%a,9!"=="" goto :xok
set "za%%a=!za:~%%a,9!000000000"
set "zb%%a=!zb:~%%a,9!000000000"
set za%%a=1!za%%a:~0,9!
set zb%%a=1!zb%%a:~0,9!
set zm=%%a
)
:xok
set zy=0
for /l %%a in (%zm%,-9,0) do (
set/a "zz=!zy:~0,-9!+za%%a-1000000000+zb%%a-1000000000"
set zy=000000000!zz!
set zx=!zy:~-9!!zx!
)
set/a zm+=9,n=zm
for /l %%a in (1,1,%zm%) do if "!zx:~-%%a,1!"=="0" (set n=-%%a) else (goto :cok)
:cok
if "!zx:~-%zm%,%n%!" gtr "0" (set cc=.!zx:~-%zm%,%n%!) else (set cc=)
set zy=
for /l %%a in (9,9,81) do (
if "!xa!!xb!"=="" goto :end
set cc=!zy!!cc!
if defined xa (set "aa=000000000!xa:~-9!"&set xa=!xa:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
set/a zz=!zz:~0,-9!+1!bb:~-9!-1000000000+1!aa:~-9!-1000000000
set zy=000000000!zz!
set zy=!zy:~-9!
)
:end
set cc=%zz%%cc%
if "%cc%"=="0" goto :endok
if "%cc:~0,2%"=="0." goto :endok
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :endok)
:endok
endlocal&set cc=%cc%&goto :eof [ Last edited by netbenton on 2009-4-12 at 23:07 ]
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-4-13 01:00 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『第
28 楼』:
减法
@echo off&setlocal enabledelayedexpansion
set a=%1
set b=%2
echo %time%
call :sub c a b
echo %time%
echo %c%
goto :eof
:::::::::::::::::::::::::::::::
::浮点减法函数
:sub <接收变量> <被减数变量> <减数变量>
::
::
::支持49位整数,49小数
::自动丢弃首尾无效0
::别看代码那么长,速度可不慢哦
:::::::::::::::::::::::::::::::
@echo off&setlocal enabledelayedexpansion
set cc=0
set za=!%2:*.=!
set xa=!%2:.%za%=!
set zb=!%3:*.=!
set xb=!%3:.%zb%=!
if "!zb!."=="!%3!." set zb=0
if "!za!."=="!%2!." set za=0
set za=%za%0
set zb=%zb%0
::补0对齐
for /l %%a in (0,9,81) do (
if "!xa!!xb!"=="" set n=%%a&goto :bu0
if defined xa (set ya=!xa:~-9!!ya!&set xa=!xa:~0,-9!) else (set ya=000000000!ya!)
if defined xb (set yb=!xb:~-9!!yb!&set xb=!xb:~0,-9!) else (set yb=000000000!yb!)
)
:bu0
set ya=0000000000%ya%
set yb=0000000000%yb%
set xa=!ya:~-%n%!
set xb=!yb:~-%n%!
if "%xa%%za%" gtr "%xb%%zb%" (
set zz=!za!&set xx=!xa!&set fh=
) else (
set zz=!zb!&set xx=!xb!&set zb=!za!&set xb=!xa!&set fh=-
)
::预处理完成
for /l %%a in (0,9,81) do (
if "!zz:~%%a,9!!zb:~%%a,9!"=="" goto :xok
set "zz%%a=!zz:~%%a,9!000000000"
set "zb%%a=!zb:~%%a,9!000000000"
set zz%%a=1!zz%%a:~0,9!
set zb%%a=1!zb%%a:~0,9!
set zm=%%a
)
:xok
set jw=0
for /l %%a in (%zm%,-9,0) do (
set/a "zz=jw+zz%%a-zb%%a"
if !zz! lss 0 (set/a zz=1000000000+zz&set jw=-1) else (set jw=0)
set zy=000000000!zz!
set zx=!zy:~-9!!zx!
)
set/a zm+=9,n=zm
for /l %%a in (1,1,%zm%) do if "!zx:~-%%a,1!"=="0" (set n=-%%a) else (goto :cok)
:cok
if "!zx:~-%zm%,%n%!" gtr "0" (set cc=.!zx:~-%zm%,%n%!) else (set cc=)
set zy=
for /l %%a in (9,9,81) do (
if "!xx!!xb!"=="" goto :end
set cc=!zy!!cc!
if defined xx (set "aa=000000000!xx:~-9!"&set xx=!xx:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
set/a zz=jw+1!aa:~-9!-1!bb:~-9!
if !zz! lss 0 (set/a zz=1000000000+zz&set jw=-1) else (set jw=0)
set zy=000000000!zz!
set zy=!zy:~-9!
)
:end
set cc=%zz%%cc%
if "%cc%"=="0" goto :endok
if "%cc:~0,2%"=="0." goto :endok
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :endok)
:endok
endlocal&set %1=%fh%%cc%&goto :eof [ Last edited by netbenton on 2009-4-12 at 23:07 ]
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-4-13 01:01 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
『第
29 楼』:
乘法
@echo off
set aa=%1
set bb=%2
::调用浮点乘法函数
echo %time%
call :mul cc aa bb %3
echo %time%
echo %cc%
goto :eof
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:mul <接收变量名> <被乘数> <乘数> [指定保留小数位]
::
::浮点乘法函数,头尾都可带0,支持乘积为:49位整数,49位小数。
::第一个参数为接收变量名,第二、三个为相乘数变量名,第四个批定要保留小数位数
::最大位数计算仅需12毫秒
::别看代码那么长,速度可不慢
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off&setlocal enabledelayedexpansion
set cc=0
set ka=!%2:*.=!
set kb=!%3:*.=!
set maa=!%2:.=!
set mb=!%3:.=!
for /l %%a in (0,1,49) do if not "!maa:~%%a,1!"=="0" (set maa=!maa:~%%a!&goto :maaok)
:maaok
for /l %%a in (0,1,49) do if not "!mb:~%%a,1!"=="0" (set mb=!mb:~%%a!&goto :mbok)
:mbok
if "!kb!."=="!%3!." set kb=
if "!ka!."=="!%2!." set ka=
set kab=!kb!!ka!#
for /l %%a in (0,1,49) do if "!kab:~%%a,1!"=="#" (set kab=%%a&goto :lp1)
set mz=
:lp1
if defined mb (set al=!mb:~-4!
if "!al:~0,1!"=="0" set/a al=1!al!-10000
set mb=!mb:~0,-4!
) else (goto :endmul)
set ma=!maa!
set "cl= "
for /l %%a in (1,4,91) do (
if not defined ma (goto :end1)
set bl=!ma:~-4!
if "!bl:~0,1!"=="0" set/a bl=1!bl!-10000
set/a bl=!cl:~0,-%%a!+bl*al
set ma=!ma:~0,-4!
set cl=0000!cl:~-%%a!
set cl=!bl!!cl:~-%%a!
)
:end1
set cl=%cl:~0,-1%%mz%
set mz=!mz!0000
set xa=%cc%
set xb=%cl%
set cc=
set zz=0
set zy=
for /l %%a in (9,9,81) do (
if "!xa!!xb!"=="" goto :end2
set cc=!zy!!cc!
if defined xa (set "aa=000000000!xa:~-9!"&set xa=!xa:~0,-9!) else (set aa=000000000)
if defined xb (set "bb=000000000!xb:~-9!"&set xb=!xb:~0,-9!) else (set bb=000000000)
set/a zz=!zz:~0,-9!+1!bb:~-9!-1000000000+1!aa:~-9!-1000000000
set zy=000000000!zz!
set zy=!zy:~-9!
)
:end2
set cc=%zz%%cc%
if not %cc% gtr 0 goto :lp1
for /l %%a in (0,1,36) do if not "!cc:~%%a,1!"=="0" (set cc=!cc:~%%a!&goto :lp1)
goto :lp1
:endmul
if not %kab%==0 (
set ka=00000000000000000000000000000000000000000000000000%cc%
if "!cc:~0,-%kab%!"=="" (set cc=0.!ka:~-%kab%,%4!) else (set cc=!cc:~0,-%kab%!.!cc:~-%kab%,%4!)
)
endlocal&set %1=%cc%&goto :eof
|
精简
[你的+我的+他的]=>[大家的] 个人网志 |
|
2009-4-13 01:07 |
|
|
plp626
银牌会员
钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第
30 楼』:
看来大家都对论坛还是热爱,这长的代码得花些时间,
现在讨论制定个规范,方便他人阅读
:标签 // 注释 [参数1] [参数2] ...
干什么用的,参数的要求,等等,有个大致的格式
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2009-4-13 07:03 |
|
|