[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-034】批处理浮点计算

出题目的:
 掌握批处理浮点计算的方法
加分标准:
 视情形加分,满分20分
解题限制:
 版主级的暂请观看,但可以做解题提示
题目如下:
 输入任意两个小数(小数点后最多为两位数),通过批处理输出两数的和、差、积、商
(积、商均保留两位小数)。

[ 本帖最后由 batman 于 2009-2-13 17:22 编辑 ]
***共同提高***

提示:
    此题情况相当复杂,大家可要充分考虑,举个例子:当两数为-0.12 -0.08时。
***共同提高***

TOP

先发几张程序运行的截图给大家看看,代码就先不发:


[ 本帖最后由 Batcher 于 2009-5-1 21:01 编辑 ]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
***共同提高***

TOP

看来此题确是有难度,我只要公布自己的代码了(自己看着都晕得很。。。):
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p str=输入的两数为:
  3. set /a num_1=0,num_2=0,num=1,v=0
  4. for %%a in (%str%) do (
  5.     set /a n+=1
  6.     for /f "tokens=1,2 delims=." %%b in ("%%a") do (
  7.         set "_!n!=%%b"
  8.         if "%%c" equ "" (
  9.            set ".!n!=00"&set /a m+=1
  10.            if !m! equ 2 set "flag=a"
  11.            ) else (
  12.            set "a=%%c00"&set "a=!a:~,2!"
  13.            set ".!n!=!a!"
  14.         )
  15.      )
  16. )
  17. for %%a in (+#h -#c) do (
  18.     for /f "tokens=1,2 delims=#" %%b in ("%%a") do (
  19.         if "%_1:~,1%" equ "-" set "k1=-"
  20.         if "%_2:~,1%" equ "-" set "k2=-"
  21.         set /a %%c1=_1%%b_2,%%c2=!k1!1%.1%%%100%%b!k2!1%.2%%%100
  22.         if !%%c1! lss 0 (
  23.            if !%%c2! leq -100 set /a %%c2+=100,%%c1-=1
  24.            ) else (
  25.            if !%%c1! equ 0 (
  26.               if !%%c2! lss 0 set "%%c1=-0"&set "a=!%%c2!"&set "%%c2=!a:-=!"
  27.               ) else (
  28.               if !%%c2! lss 0 set /a %%c2+=100,%%c1-=1
  29.            )
  30.          )
  31.          if !%%c2! geq 100 set /a %%c2-=100,%%c1+=1
  32.     )
  33. )
  34. for %%a in (h2 c2) do (
  35.     set "a=!%%a!"&set "a=!a:-=!"&set %%a=!a!
  36.     if !a! lss 10 set "%%a=0!a!"
  37. )
  38. echo 其和为:%h1%.%h2%&echo 其差为:%c1%.%c2%&set /a n=0
  39. if defined flag set ".1="&set ".2="
  40. for %%a in (1 2) do (
  41.     if "!_%%a!" equ "0" (
  42.        set "_%%a="&set /a .%%a=1!.%%a!%%100
  43.        ) else (
  44.        if "!_%%a!" equ "-0" (
  45.           set "_%%a=-"
  46.           ) else (
  47.           set "a=!_%%a!"&set "a=!a:-=!"
  48.           set /a n+=1&call :lp
  49.        )
  50.     )
  51.     if "!.%%a!" neq "" set "a=!.%%a!"&call :loop&set ".%%a=!a!"
  52. )
  53. set /a num1=3-num_1+num_2,m=4-v
  54. if defined flag set /a m=0
  55. if %num1% leq 0 set /a num1=2
  56. for /l %%a in (1,1,%num1%) do set /a num*=10
  57. set /a s=%_1%%.1%*num/%_2%%.2%,j=%_1%%.1%*%_2%%.2%
  58. if %j% lss 0 set "j=%j:-=%"&set "jk=-"
  59. if %s% lss 0 set "s=%s:-=%"&set "sk=-"
  60. if %m% neq 0 if "!j:~%m%!" equ "" set "j=0000%j%"&set "j=!j:~-%m%!"
  61. if %s% lss %num% set "s=%num:~1%%s%"&set "s=!s:~-%num1%!"
  62. if %m% neq 0 set "j=!j:~,-%m%!.!j:~-%m%,2!"
  63. set "s=!s:~,-%num1%!.!s:~-%num1%,2!
  64. for %%a in (s j) do (
  65.     set "a=!%%a!"
  66.     if "!a:.=!" equ "!a!" (
  67.        set "%%a=!%%a!.00"
  68.        ) else (
  69.        if "!a:~-2,1!" equ "." set "%%a=!%%a!0"
  70.     )  
  71.     if "!a:~,1!" equ "." set "%%a=0!%%a!"
  72. )
  73. echo 其积为:%jk%%j%&echo 其商为:%sk%%s%
  74. pause>nul&goto :eof
  75. :lp
  76. set /a num_%n%+=1&set "a=%a:~1%"
  77. if defined a goto lp
  78. goto :eof
  79. :loop
  80. if "%a:~-1%" equ "0" set "a=%a:~,-1%"&set /a v+=1&goto loop
复制代码

[ 本帖最后由 batman 于 2009-2-15 19:16 编辑 ]
***共同提高***

TOP

&&本人19楼的代码相当复杂,估计大家肯定会看得云里雾里,所以思来想去还
是补充代码编写思路如下,以便理解,同时期待高人出手,给出完美代码:

   一、总体计算思路
   大家知道本题最关键是在对小数点前后两部分数值的处理上,在楼上大家也有
过相关讨论。本人认为在加减法的处理上,应该是要将前后数值分开分别进行计
算然后再做处理(如后面小数位和满百位的处理),最后再在中间补上小数点。
而对乘法,则应是去掉小数点后前后位一起运算,最后从后向前移位补上小数点
。至于除法则是最复杂的,如结果要保留两位小数,你必须要保证除数的数位比
被除数多三位(两数均先去掉小数点),当这一条件没有得到满足时,就要给除
数后面补上足够的0,最后在结果中从后向前移位补上小数点。

   二、对数值的处理
   大家可以看到本人在代码中使用了海量的if语句来做判断,主要是为了处理各
种情况下的数值,大致将情况归纳如下面的12点:
   1 处理原始数值无小数位的情况--从后面补上.00
   2 处理原始数值小数位不满两位的情况--给小数位补上00并提取前面的两位
   3 处理加减计算时小数位大于100的情况--小数位减去100,整数位加1
   4 处理加减计算整数位为负小数位小于-100的情况--小数位加上100,整数位
减1
   5 处理加减计算整数位为0小数位小于0的情况--整数位变为-0,小数位去掉负

   6 处理加减计算整数位为正小数位小于0的情况--小数位加上100,整数位减1
   7 处理加减计算小数位小于10的情况--在小数位前面加上0
   8 处理乘除计算时两数小数位均为00的情况--将小数位置空
   9 处理乘除计算时整数位为0的情况--对小数位进行取余运算
  10 处理乘除计算时结果数位不够小数位的情况--在结果值前面补上足够的0并
从后向前提取小数位(如结果为负数还要先取掉负号最后再补上)
  11 处理乘除计算时结果无小数位的情况--在结果后补上.00
  12 处理乘除计算时结果小数位不足两位的情况--在结果后补上0

   三、感言
   在这次编写代码的过程中,本人深深感受到批处理在处理数值上的不足和缺陷
,这也是本人在出题时始料不及的。没想到其中要考虑的问题是方方面面错综复
杂,本人也曾几次在困难面前想要退缩,但为了给大家一个较满意的答案,还是
硬着头皮写了下来。看来批处理只适合做它适合做的事,想人为强加给它其他的
功能的确是费力不计好。

[ 本帖最后由 batman 于 2009-2-15 19:38 编辑 ]
***共同提高***

TOP

返回列表