|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『楼 主』:
[共同参与][挑战思路][批处理处理浮点运算]
) 此贴为抛砖引玉,大家扩展思路,互动式共同参与批处理学习~:)
) [用DOS内部命令计算两个浮点数的和]
例如: Sum.Bat 12.99 438.76
结果: 451.75
规则: 负数不考虑
有可能人为故意或无意输入的非数字等错误暂不考虑
只能使用DOS内部命令(无DOS版本限制),外部命令禁止使用。
只考虑计算%1与%2所出现的两个浮点数相加,更多的浮点相加暂不考虑。
允许数字出现的格式: 0.91 0.10 2.12 1092.90
暂不允许出现的格式: .91 .9
(小数精度:小数点儿后两位)
目的: 拓展思路、增加批处理兴趣、增加大家互动学习亲自动手玩、
通过我们大家不断的交互让批处理的使用让每个人都能参与共同进步:)
方向: 这只是其中一个内容,更多的内容需要网友们共同发现、版主支持:)
大家可以用任何异想天开的任何想法实现上面问题~:)
为什么要出现此贴: 只有互动每个人都参与,自己的水平才能提高更快。
将遇到问题时才问、平时不主动学习批处理的方式变成大家主动一步一步共同提高:)
奖励: 优秀的解题与不同思路的观点解题,由版主象神一样的指导、示范,
然后给大家加分奖励以示激励~:)
其它: 等待大家有更好想法和非常实用的互动学习与应用的题目,大家一起参与:)
===================================
此帖被 +1 点积分 点击查看详情 评分人:【 vsbat 】 | 分数: +1 | 时间:2010-5-30 23:44 |
|
|
|
2006-10-4 04:10 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
|
2006-10-4 04:20 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
3 楼』:
Quote: | Originally posted by electronixtar at 2006-10-4 04:20:
@echo off
echo wscript.echo CDbl(WScript.Arguments(0))+CDbl(WScript.Arguments(1))> tmp.vbe
cscript //noLogo tmp.vbe %1 %2
del tmp.vbe ^_^ |
|
精彩~~ 加了6分~:)
C:\TEMP>a.bat 12.99 438.76
451.75
|
|
2006-10-4 04:31 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
4 楼』:
本楼第一段的代码为最新修改的. 功能更加强大, 欢迎大家测试...
整数浮点数分段运算代码:
一般情况下整数位最多可运算9位数, 小数位最多可运算9位数.
小数位整数位加起来最多可运算18位数.
否则会溢出或为无效数字...
该脚本的功能:
1. 可以运算任何实型数值.
2. 有判断错误输入的功能. 如运算数中存在非法字符或当字符位数超过脚本的运算范围时会提示你重新输入.
3. 解决了进制错误的问题.
4. 运算结果格式输出.
@echo off
if not %1*==* set num1=%1 & set num2=%2 & goto jmp
:input
cls
set num1=
set /p num1=input primary number:
set num2=
set /p num2=input number two number:
:jmp
echo %num1% | find "." >nul || set num1=%num1%.0
echo %num2% | find "." >nul || set num2=%num2%.0
if "%num1:~-1%"=="." set num1=%num1%0
if "%num2:~-1%"=="." set num2=%num2%0
if "%num1:~0,1%"=="." set num1=0%num1%
if "%num2:~0,1%"=="." set num2=0%num2%
set num=0
setlocal enabledelayedexpansion
for %%a in (%num1% %num2%) do (
set /a num+=1
for /f "tokens=1,2 delims=." %%i in ("%%a") do (
if "!num!"=="1" (set one=%%i) else (set one_=%%i)
if "!num!"=="1" (set two=%%j) else (set two_=%%j)
)
)
call :omit %one%
set one=%want%
call :omit %one_%
set one_=%want%
call :raze %two%
set two=%want_%
call :raze %two_%
set two_=%want_%
call :go %one%
set countx=%wish%
call :go %one_%
set countx_=%wish%
if "%two%"=="" set two=0
if "%two_%"=="" set two_=0
call :go %two%
set county=%wish%
call :go %two_%
set county_=%wish%
if %countx% gtr 9 goto error
if %countx_% gtr 9 goto error
set after=0
set front=
if %county% lss %county_% (
set count=%county_%
set /a result=%county_%-%county%
call :fine !result! %two%
set two=!incept!
) else (
set count=%county%
set /a result=%county%-%county_%
call :fine !result! %two_%
set two_=!incept!
)
call :omit %two%
set two=%want%
call :omit %two_%
set two_=%want%
call :go %two%
set county=%wish%
call :go %two_%
set county_=%wish%
if %county% gtr 9 goto error
if %county_% gtr 9 goto error
if "%one%"=="" set one=0
if "%one_%"=="" set one_=0
if "%two%"=="" set two=0
if "%two_%"=="" set two_=0
set /a decimal=%two%+%two_%
set carry=0!decimal:~0,-%count%!
set decimal=!decimal:~-%count%!
set refer=%decimal%
call :go %refer%
set countz=%wish%
set /a spare=%count%-%countz%
set after=
set front=0
call :fine %spare% %decimal%
set decimal=%incept%
set /a integer=%one%+%one_%+%carry%
set dot=.
call :raze %decimal%
set decimal=%want_%
if "%decimal%"=="" set dot=
cls
echo ============
echo 运算结果!
echo ============
echo.
echo %num1%+%num2%=%integer%%dot%%decimal%
pause >nul
goto :eof
:go
set remove=%1@
set wish=0
:go_
if not "!remove:~0,1!"=="@" (
set fault=1
for /l %%c in (0,1,9) do (
if "!remove:~0,1!"=="%%c" (
set /a wish+=1
set remove=!remove:~1!
set fault=2
goto go_
)
)
if "!fault!"=="1" goto error
goto go_
)
goto :eof
:fine
set take=%1
set incept=%2
:fine_
if not "%take%"=="0" (
set /a take-=1
set incept=%front%!incept!%after%
goto fine_
)
goto :eof
:omit
set want=%1
:omit_
if "%want:~0,1%"=="0" (
set want=%want:~1%
goto omit_
)
goto :eof
:raze
set want_=%1
:raze_
if "!want_:~-1!"=="0" (
set want_=!want_:~0,-1!
goto raze_
)
goto :eof
:error
cls
echo ========================================================
echo.
echo 对不起, 你的输入存在下面两种错误:
echo.
echo 1. 输入了除阿拉伯数字外的非法字符.
echo.
echo 2. 整数或小数位数超过了9位.
echo.
echo ========================================================
echo.
echo.
echo 按任意键重新输入...
pause >nul
goto input 下面一段也是通用的, 但小数只能运算8位数, 且没有判断错误输入和判断输入的数值是否符合要求的功能.
整数浮点数分段运算代码:
整数位最多可运算9位数, 小数位最多可运算8位数.
小数位整数位加起来最多可运算17位数.
否则会溢出或为无效数字...
可以运算任何类型的数值, 浮点型数值已不受位数限制.
解决了小数第一位为零且后面跟8或9的数字会出现进制错误的问题.
运算结果格式输出!
此段代码已经通用. 欢迎大家测试...
@echo off
set /p number1=请输入运算数一:
set /p number2=请输入运算数二:
echo %number1% | find "." >nul || set number1=%number1%.0
echo %number2% | find "." >nul || set number2=%number2%.0
if "%number1:~-1%"=="." set number1=%number1%0
if "%number2:~-1%"=="." set number2=%number2%0
if "%number1:~0,1%"=="." set number1=0%number1%
if "%number2:~0,1%"=="." set number2=0%number2%
setlocal enabledelayedexpansion
for %%a in (%number1% %number2%) do (
set /a num+=1
for /f "tokens=1,2 delims=." %%i in ("%%a") do (
if "!num!"=="1" (set one=%%i) else (set one_=%%i)
if "!num!"=="1" (set two=%%j) else (set two_=%%j)
)
)
call :omit %one%
set one=%want%
call :omit %one_%
set one_=%want%
call :go %two%
set count=%wish%
call :go %two_%
set count_=%wish%
if %count% lss %count_% (
set /a result=%count_%-%count%
call :fine !result! %two%
set two=!incept!
) else (
set /a result=%count%-%count_%
call :fine !result! %two_%
set two_=!incept!
)
if "%one%"=="" set one=0
if "%one_%"=="" set one_=0
set /a integer=%one%+%one_%
set /a decimal=1%two%+1%two_%
if "%decimal:~0,1%"=="2" (
set decimal=%decimal:~1%
) else (
set decimal=%decimal:~1%
set /a integer=%integer%+1
)
:raze
if "!decimal:~-1!"=="0" (
set decimal=!decimal:~0,-1!
goto raze
)
if "%decimal%"=="" (
set dot=
) else (
set dot=.
)
echo %integer%%dot%%decimal%
pause
exit
:go
set remove=%1
set wish=0
:go_
if not "!remove:~0,1!"=="~" (
for /l %%c in (0,1,9) do (
if "!remove:~0,1!"=="%%c" (
set /a wish+=1
set remove=!remove:~1!
goto go_
)
)
)
goto :eof
:fine
set take=%1
set incept=%2
:fine_
if not "%take%"=="0" (
set /a take-=1
set incept=!incept!0
goto fine_
)
goto :eof
:omit
set want=%1
:again
if "%want:~0,1%"=="0" (
set want=%want:~1%
goto again
)
goto :eof 相关问题讨论: 关于数值运算时的进制问题!
[ Last edited by pengfei on 2006-10-9 at 05:01 ]
|
|
2006-10-4 04:47 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
5 楼』:
过瘾!!!给pengfei兄加6分~:)
C:\TEMP>b.bat 12.99 438.76
451.75
请按任意键继续. . .
|
|
2006-10-4 05:12 |
|
|
redtek
金牌会员
积分 2902
发帖 1147
注册 2006-9-21
状态 离线
|
『第
6 楼』:
两位大侠之作非常精彩~~
个人感觉要学好批处理和DOS批处理以及脚本的应用,
其实就相当于在一步一步走向编程的道路:)
或是开发人员以一种程序思维、和数据结构的理解方式来让批处理达到一个更高的水平:)
这就是为什么很多网友学了DOS批处理应用以后,
过了好多年再也提不高的原因之一:)
而有的大侠,确是每一天每一步都在不断的向上走,
技巧已经都不再重要了,应用到的数据结构可以解决很多问题:)
无论是在批处理里面还是在代码开发上,它们都是相通的:)
[ Last edited by redtek on 2006-10-4 at 05:21 ]
|
|
2006-10-4 05:18 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
7 楼』:
终于解决了小数位数的局限, 可以运算各种类型的数值, 小数位数不受限制. 暂时没有解决错误输入的问题.
代码更新在4楼!
|
|
2006-10-4 10:15 |
|
|
namejm
荣誉版主
batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
|
2006-10-4 11:18 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
9 楼』:
还是脚本简单些 ^_^
|
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-4 20:17 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
10 楼』:
解决了小数点后第一位为0且后面出现8或9, 导致数值为无效数字的问题.
一个全新的算法, 大概的意思是, 读取小数位数不足的补零. 去.号后小数和整数一起运算, 运算完成后再根据记录的小数点位置准确地插入到相应的地方, 从而完成了浮点数值的运算.
这段代码具有更好的通用性, 时间仓促没来得及优化:
整数浮点数合并运算代码:
整数位最多可运算8位数, 小数位最多可运算8位数.
小数位整数位加起来最多可运算9位数
否则会溢出或为无效数字...
用取位循环去零法解决了最高位为零或多个零的问题, 可以测试(0.0 .23 12. .)的数值运算.
解决了(0.0+0.0289), (0.08+1.029)之类的进制问题.
目前测试可以适应各种情况.
期待大家进行全面测试...
@echo off
set /p number=请输入运算数一:
set /p number_=请输入运算数二:
call :omit %number%
set number=%want%
call :omit %number_%
set number_=%want%
echo %number% | find "." >nul || set number=%number%.0
echo %number_% | find "." >nul || set number_=%number_%.0
if "%number:~-1%"=="." set number=%number%0
if "%number_:~-1%"=="." set number_=%number_%0
if "%number:~0,1%"=="." set number=0%number%
if "%number_:~0,1%"=="." set number_=0%number_%
setlocal enabledelayedexpansion
for %%a in (%number% %number_%) do (
set /a num+=1
for /f "tokens=1,2 delims=." %%i in ("%%a") do (
if "!num!"=="1" (set one=%%i) else (set one_=%%i)
if "!num!"=="1" (set two=%%j) else (set two_=%%j)
)
)
call :go %two%
set num1=%wish%
call :go %two_%
set num2=%wish%
if %num1% lss %num2% (
set note=%num2%
set /a result=%num2%-%num1%
call :fine !result! %two%
set two=!incept!
) else (
set note=%num1%
set /a result=%num1%-%num2%
call :fine !result! %two_%
set two_=!incept!
)
set term=0
if %one:~0,1%==0 set one=!one:~1!
if %one_:~0,1%==0 set one_=%one_:~1%
if "%one%"=="" (
set one=1
set /a term+=1
)
if "%one_%"=="" (
set one_=1
set /a term+=1
)
set /a fruit_=%one%%two%+%one_%%two_%
set fruit_=:%fruit_%
:insert
if not "!fruit_:~-1!"==":" (
if "!num_!"=="%note%" (
set fruit=.!fruit!
set /a ii=!fruit_:~1!-%term%
set fruit_=:!ii!
)
set fruit=!fruit_:~-1!!fruit!
set fruit_=!fruit_:~0,-1!
set /a num_+=1
goto insert
)
echo %fruit%
pause
exit
:go
set remove=%1
set wish=0
:go_
if not "!remove:~0,1!"=="~" (
for /l %%c in (0,1,9) do (
if "!remove:~0,1!"=="%%c" (
set /a wish+=1
set remove=!remove:~1!
goto go_
)
)
)
goto :eof
:fine
set take=%1
set incept=%2
:fine_
if not "%take%"=="0" (
set /a take-=1
set incept=!incept!0
goto fine_
)
goto :eof
:omit
set want=%1
:again
if "%want:~0,1%"=="0" (
set want=%want:~1%
goto again
)
goto :eof [ Last edited by pengfei on 2006-10-6 at 03:51 ]
|
|
2006-10-4 23:50 |
|
|
namejm
荣誉版主
batch fan
积分 5226
发帖 1737
注册 2006-3-10 来自 成都
状态 离线
|
『第
11 楼』:
pengfei 『第 10 楼』的代码先把浮点数用0把位数补齐,然后再把小数点去掉,对新数进行处理,然后再把小数点的位置复原,这个思路相当新颖,比我在『第 8 楼』的思路又更进了一步,优化之后,代码将会比我那段更简洁。看来,多多讨论真的很容易碰撞出智慧的火花^_^
|
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。 |
|
2006-10-5 00:44 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
12 楼』:
^_^ 呵呵~ namejm兄八楼代码的思路和我四楼的一样, 如果小数第一位是零且后面跟了8或9就会出错, 还是进制问题, 而10楼的代码则不会.
|
|
2006-10-5 01:43 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
|
2006-10-5 04:44 |
|
|
pengfei
银牌会员
积分 1218
发帖 485
注册 2006-7-21 来自 湖南.娄底
状态 离线
|
『第
14 楼』:
版主是在整数的最高位加零吧!
你试试在小数点后第一位加零, 再比较两段代码的运算结果.
|
|
2006-10-5 04:49 |
|
|
不得不爱
超级版主
我爱DOS
积分 5310
发帖 2044
注册 2005-9-26 来自 四川南充
状态 离线
|
『第
15 楼』:
下面的是首位是0的数自动去0,小数点前没有数字自动加0,小数点末尾有0自动去0!
@echo off
if not %1*==* (set number=%1&set number_=%2&goto bj)
set /p number=请输入运算数一:
set /p number_=请输入运算数二:
:bj
echo %number% | find "." >nul || set number=%number%.0
echo %number_% | find "." >nul || set number_=%number_%.0
if %number:~0,1%==. set number=0%number%
if %number_:~0,1%==. set number_=0%number_%
if "%number:~-1%"=="." set number=%number%0
if "%number_:~-1%"=="." set number_=%number_%0
setlocal enabledelayedexpansion
for %%a in (%number% %number_%) do (
set /a num+=1
for /f "tokens=1,2 delims=." %%i in ("%%a") do (
if "!num!"=="1" (set one=%%i) else (set one_=%%i)
if "!num!"=="1" (set two=%%j) else (set two_=%%j)
)
)
call :go %two%
set num1=%wish%
call :go %two_%
set num2=%wish%
if %num1% lss %num2% (
set note=%num2%
set /a result=%num2%-%num1%
call :fine !result! %two%
set two=!incept!
) else (
set note=%num1%
set /a result=%num1%-%num2%
call :fine !result! %two_%
set two_=!incept!
)
:1
set n1=0
if "!one:~0,1!"=="0" set one=!one:~1!&&goto 1
if %two:~0,1%==0 set two=1%two%&&set n1=1
:2
if "!one_:~0,1!"=="0" set one_=!one_:~1!&&goto 2
if %two_:~0,1%==0 set two_=1%two_%&&set/a n1+=1
set /a num2=%two%+%two_%
set/a n1=!num2:~0,-%note%!-%n1%
set num2=!num2:~-%note%!
set /a num1=%one%+%one_%+%n1%
:3
if !num2:~-1!==0 set num2=!num2:~0,-1!&&goto 3
if %num2%*==* (echo %num1%) ELSE echo %num1%.%num2%
PAUSE
goto :eof
:go
set remove=%1
set wish=0
:go_
if not "!remove:~0,1!"=="~" (
for /l %%c in (0,1,9) do (
if "!remove:~0,1!"=="%%c" (
set /a wish+=1
set remove=!remove:~1!
goto go_
)
)
)
goto :eof
:fine
set take=%1
set incept=%2
:fine_
if not "%take%"=="0" (
set /a take-=1
set incept=!incept!0
goto fine_
)
goto :eof [ Last edited by qwe1234567 on 2006-10-6 at 07:40 ]
此帖被 +4 点积分 点击查看详情 评分人:【 】 | 分数: +4 | 时间:2006-10-14 10:14 |
|
|
我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件 |
|
2006-10-5 05:09 |
|