Board logo

标题: [数值计算] 我写了个算24程序,有缺陷 [打印本页]

作者: 嘟嘟猪    时间: 2008-9-13 22:05     标题: 我写了个算24程序,有缺陷

程序有2个批处理文件:main.cmd与1.cmd
main.cmd代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title 算24
  4. set suan=24
  5. set cg=0
  6. set /p suan=输入要算的数字:
  7. set /p y=输入第一个数:
  8. set /p e=输入第二个数:
  9. set /p s=输入第三个数:
  10. set /p f=输入第四个数:
  11. cls
  12. echo 正在计算,请稍候...
  13. set a=%y%
  14. set b=%e%
  15. set c=%s%
  16. set d=%f%
  17. call 1.cmd
  18. set a=%y%
  19. set b=%e%
  20. set d=%s%
  21. set c=%f%
  22. call 1.cmd
  23. set a=%y%
  24. set c=%e%
  25. set b=%s%
  26. set d=%f%
  27. call 1.cmd
  28. set a=%y%
  29. set c=%e%
  30. set d=%s%
  31. set b=%f%
  32. call 1.cmd
  33. set a=%y%
  34. set d=%e%
  35. set b=%s%
  36. set c=%f%
  37. call 1.cmd
  38. set a=%y%
  39. set d=%e%
  40. set c=%s%
  41. set b=%f%
  42. call 1.cmd
  43. set b=%y%
  44. set a=%e%
  45. set c=%s%
  46. set d=%f%
  47. call 1.cmd
  48. set b=%y%
  49. set a=%e%
  50. set d=%s%
  51. set c=%f%
  52. call 1.cmd
  53. set b=%y%
  54. set c=%e%
  55. set a=%s%
  56. set d=%f%
  57. call 1.cmd
  58. set b=%y%
  59. set c=%e%
  60. set d=%s%
  61. set a=%f%
  62. call 1.cmd
  63. set b=%y%
  64. set c=%e%
  65. set d=%s%
  66. set a=%f%
  67. call 1.cmd
  68. set b=%y%
  69. set d=%e%
  70. set a=%s%
  71. set c=%f%
  72. call 1.cmd
  73. set b=%y%
  74. set d=%e%
  75. set c=%s%
  76. set a=%f%
  77. call 1.cmd
  78. set c=%y%
  79. set a=%e%
  80. set b=%s%
  81. set d=%f%
  82. call 1.cmd
  83. set c=%y%
  84. set a=%e%
  85. set d=%s%
  86. set b=%f%
  87. call 1.cmd
  88. set c=%y%
  89. set b=%e%
  90. set a=%s%
  91. set d=%f%
  92. call 1.cmd
  93. set c=%y%
  94. set b=%e%
  95. set d=%s%
  96. set a=%f%
  97. call 1.cmd
  98. set c=%y%
  99. set d=%e%
  100. set a=%s%
  101. set b=%f%
  102. call 1.cmd
  103. set c=%y%
  104. set d=%e%
  105. set b=%s%
  106. set a=%f%
  107. call 1.cmd
  108. set d=%y%
  109. set a=%e%
  110. set b=%s%
  111. set c=%f%
  112. call 1.cmd
  113. set d=%y%
  114. set a=%e%
  115. set c=%s%
  116. set b=%f%
  117. call 1.cmd
  118. set d=%y%
  119. set b=%e%
  120. set a=%s%
  121. set c=%f%
  122. call 1.cmd
  123. set d=%y%
  124. set b=%e%
  125. set c=%s%
  126. set a=%f%
  127. call 1.cmd
  128. set d=%y%
  129. set c=%e%
  130. set a=%s%
  131. set b=%f%
  132. call 1.cmd
  133. set d=%y%
  134. set c=%e%
  135. set b=%s%
  136. set a=%f%
  137. call 1.cmd
  138. if %cg%==0 echo 对不起,没算出来,按任意键退出...
  139. if %cg%==1 echo 计算完毕,所有结果都已显示,按任意键退出...
  140. pause>>%tmp%\pause.tmp
复制代码


1.cmd代码:
  1. set /a js=((%a%+%b%)+%c%)+%d%
  2. if %js%==%suan% echo ((%a%+%b%)+%c%)+%d%=%suan%&set cg=1
  3. set /a js=((%a%+%b%)+%c%)-%d%
  4. if %js%==%suan% echo ((%a%+%b%)+%c%)-%d%=%suan%&set cg=1
  5. set /a js=((%a%+%b%)+%c%)*%d%
  6. if %js%==%suan% echo ((%a%+%b%)+%c%)×%d%=%suan%&set cg=1
  7. set /a js=((%a%+%b%)+%c%)/%d%
  8. if %js%==%suan% echo ((%a%+%b%)+%c%)÷%d%=%suan%&set cg=1
  9. set /a js=((%a%+%b%)-%c%)+%d%
  10. if %js%==%suan% echo ((%a%+%b%)-%c%)+%d%=%suan%&set cg=1
  11. set /a js=((%a%+%b%)-%c%)-%d%
  12. if %js%==%suan% echo ((%a%+%b%)-%c%)-%d%=%suan%&set cg=1
  13. set /a js=((%a%+%b%)-%c%)*%d%
  14. if %js%==%suan% echo ((%a%+%b%)-%c%)×%d%=%suan%&set cg=1
  15. set /a js=((%a%+%b%)-%c%)/%d%
  16. if %js%==%suan% echo ((%a%+%b%)-%c%)÷%d%=%suan%&set cg=1
  17. set /a js=((%a%+%b%)*%c%)+%d%
  18. if %js%==%suan% echo ((%a%+%b%)×%c%)+%d%=%suan%&set cg=1
  19. set /a js=((%a%+%b%)*%c%)-%d%
  20. if %js%==%suan% echo ((%a%+%b%)×%c%)-%d%=%suan%&set cg=1
  21. set /a js=((%a%+%b%)*%c%)*%d%
  22. if %js%==%suan% echo ((%a%+%b%)×%c%)×%d%=%suan%&set cg=1
  23. set /a js=((%a%+%b%)*%c%)/%d%
  24. if %js%==%suan% echo ((%a%+%b%)×%c%)÷%d%=%suan%&set cg=1
  25. set /a js=((%a%+%b%)/%c%)+%d%
  26. if %js%==%suan% echo ((%a%+%b%)÷%c%)+%d%=%suan%&set cg=1
  27. set /a js=((%a%+%b%)/%c%)-%d%
  28. if %js%==%suan% echo ((%a%+%b%)÷%c%)-%d%=%suan%&set cg=1
  29. set /a js=((%a%+%b%)/%c%)*%d%
  30. if %js%==%suan% echo ((%a%+%b%)÷%c%)×%d%=%suan%&set cg=1
  31. set /a js=((%a%+%b%)/%c%)/%d%
  32. if %js%==%suan% echo ((%a%+%b%)÷%c%)÷%d%=%suan%&set cg=1
  33. set /a js=((%a%-%b%)+%c%)+%d%
  34. if %js%==%suan% echo ((%a%-%b%)+%c%)+%d%=%suan%&set cg=1
  35. set /a js=((%a%-%b%)+%c%)-%d%
  36. if %js%==%suan% echo ((%a%-%b%)+%c%)-%d%=%suan%&set cg=1
  37. set /a js=((%a%-%b%)+%c%)*%d%
  38. if %js%==%suan% echo ((%a%-%b%)+%c%)×%d%=%suan%&set cg=1
  39. set /a js=((%a%-%b%)+%c%)/%d%
  40. if %js%==%suan% echo ((%a%-%b%)+%c%)÷%d%=%suan%&set cg=1
  41. set /a js=((%a%-%b%)-%c%)+%d%
  42. if %js%==%suan% echo ((%a%-%b%)-%c%)+%d%=%suan%&set cg=1
  43. set /a js=((%a%-%b%)-%c%)-%d%
  44. if %js%==%suan% echo ((%a%-%b%)-%c%)-%d%=%suan%&set cg=1
  45. set /a js=((%a%-%b%)-%c%)*%d%
  46. if %js%==%suan% echo ((%a%-%b%)-%c%)×%d%=%suan%&set cg=1
  47. set /a js=((%a%-%b%)-%c%)/%d%
  48. if %js%==%suan% echo ((%a%-%b%)-%c%)÷%d%=%suan%&set cg=1
  49. set /a js=((%a%-%b%)*%c%)+%d%
  50. if %js%==%suan% echo ((%a%-%b%)×%c%)+%d%=%suan%&set cg=1
  51. set /a js=((%a%-%b%)*%c%)-%d%
  52. if %js%==%suan% echo ((%a%-%b%)×%c%)-%d%=%suan%&set cg=1
  53. set /a js=((%a%-%b%)*%c%)*%d%
  54. if %js%==%suan% echo ((%a%-%b%)×%c%)×%d%=%suan%&set cg=1
  55. set /a js=((%a%-%b%)*%c%)/%d%
  56. if %js%==%suan% echo ((%a%-%b%)×%c%)÷%d%=%suan%&set cg=1
  57. set /a js=((%a%-%b%)/%c%)+%d%
  58. if %js%==%suan% echo ((%a%-%b%)÷%c%)+%d%=%suan%&set cg=1
  59. set /a js=((%a%-%b%)/%c%)-%d%
  60. if %js%==%suan% echo ((%a%-%b%)÷%c%)-%d%=%suan%&set cg=1
  61. set /a js=((%a%-%b%)/%c%)*%d%
  62. if %js%==%suan% echo ((%a%-%b%)÷%c%)×%d%=%suan%&set cg=1
  63. set /a js=((%a%-%b%)/%c%)/%d%
  64. if %js%==%suan% echo ((%a%-%b%)÷%c%)÷%d%=%suan%&set cg=1
  65. set /a js=((%a%*%b%)+%c%)+%d%
  66. if %js%==%suan% echo ((%a%×%b%)+%c%)+%d%=%suan%&set cg=1
  67. set /a js=((%a%*%b%)+%c%)-%d%
  68. if %js%==%suan% echo ((%a%×%b%)+%c%)-%d%=%suan%&set cg=1
  69. set /a js=((%a%*%b%)+%c%)*%d%
  70. if %js%==%suan% echo ((%a%×%b%)+%c%)×%d%=%suan%&set cg=1
  71. set /a js=((%a%*%b%)+%c%)/%d%
  72. if %js%==%suan% echo ((%a%×%b%)+%c%)÷%d%=%suan%&set cg=1
  73. set /a js=((%a%*%b%)-%c%)+%d%
  74. if %js%==%suan% echo ((%a%×%b%)-%c%)+%d%=%suan%&set cg=1
  75. set /a js=((%a%*%b%)-%c%)-%d%
  76. if %js%==%suan% echo ((%a%×%b%)-%c%)-%d%=%suan%&set cg=1
  77. set /a js=((%a%*%b%)-%c%)*%d%
  78. if %js%==%suan% echo ((%a%×%b%)-%c%)×%d%=%suan%&set cg=1
  79. set /a js=((%a%*%b%)-%c%)/%d%
  80. if %js%==%suan% echo ((%a%×%b%)-%c%)÷%d%=%suan%&set cg=1
  81. set /a js=((%a%*%b%)*%c%)+%d%
  82. if %js%==%suan% echo ((%a%×%b%)×%c%)+%d%=%suan%&set cg=1
  83. set /a js=((%a%*%b%)*%c%)-%d%
  84. if %js%==%suan% echo ((%a%×%b%)×%c%)-%d%=%suan%&set cg=1
  85. set /a js=((%a%*%b%)*%c%)*%d%
  86. if %js%==%suan% echo ((%a%×%b%)×%c%)×%d%=%suan%&set cg=1
  87. set /a js=((%a%*%b%)*%c%)/%d%
  88. if %js%==%suan% echo ((%a%×%b%)×%c%)÷%d%=%suan%&set cg=1
  89. set /a js=((%a%*%b%)/%c%)+%d%
  90. if %js%==%suan% echo ((%a%×%b%)÷%c%)+%d%=%suan%&set cg=1
  91. set /a js=((%a%*%b%)/%c%)-%d%
  92. if %js%==%suan% echo ((%a%×%b%)÷%c%)-%d%=%suan%&set cg=1
  93. set /a js=((%a%*%b%)/%c%)*%d%
  94. if %js%==%suan% echo ((%a%×%b%)÷%c%)×%d%=%suan%&set cg=1
  95. set /a js=((%a%*%b%)/%c%)/%d%
  96. if %js%==%suan% echo ((%a%×%b%)÷%c%)÷%d%=%suan%&set cg=1
  97. set /a js=((%a%/%b%)+%c%)+%d%
  98. if %js%==%suan% echo ((%a%÷%b%)+%c%)+%d%=%suan%&set cg=1
  99. set /a js=((%a%/%b%)+%c%)-%d%
  100. if %js%==%suan% echo ((%a%÷%b%)+%c%)-%d%=%suan%&set cg=1
  101. set /a js=((%a%/%b%)+%c%)*%d%
  102. if %js%==%suan% echo ((%a%÷%b%)+%c%)×%d%=%suan%&set cg=1
  103. set /a js=((%a%/%b%)+%c%)/%d%
  104. if %js%==%suan% echo ((%a%÷%b%)+%c%)÷%d%=%suan%&set cg=1
  105. set /a js=((%a%/%b%)-%c%)+%d%
  106. if %js%==%suan% echo ((%a%÷%b%)-%c%)+%d%=%suan%&set cg=1
  107. set /a js=((%a%/%b%)-%c%)-%d%
  108. if %js%==%suan% echo ((%a%÷%b%)-%c%)-%d%=%suan%&set cg=1
  109. set /a js=((%a%/%b%)-%c%)*%d%
  110. if %js%==%suan% echo ((%a%÷%b%)-%c%)×%d%=%suan%&set cg=1
  111. set /a js=((%a%/%b%)-%c%)/%d%
  112. if %js%==%suan% echo ((%a%÷%b%)-%c%)÷%d%=%suan%&set cg=1
  113. set /a js=((%a%/%b%)*%c%)+%d%
  114. if %js%==%suan% echo ((%a%÷%b%)×%c%)+%d%=%suan%&set cg=1
  115. set /a js=((%a%/%b%)*%c%)-%d%
  116. if %js%==%suan% echo ((%a%÷%b%)×%c%)-%d%=%suan%&set cg=1
  117. set /a js=((%a%/%b%)*%c%)*%d%
  118. if %js%==%suan% echo ((%a%÷%b%)×%c%)×%d%=%suan%&set cg=1
  119. set /a js=((%a%/%b%)*%c%)/%d%
  120. if %js%==%suan% echo ((%a%÷%b%)×%c%)÷%d%=%suan%&set cg=1
  121. set /a js=((%a%/%b%)/%c%)+%d%
  122. if %js%==%suan% echo ((%a%÷%b%)÷%c%)+%d%=%suan%&set cg=1
  123. set /a js=((%a%/%b%)/%c%)-%d%
  124. if %js%==%suan% echo ((%a%÷%b%)÷%c%)-%d%=%suan%&set cg=1
  125. set /a js=((%a%/%b%)/%c%)*%d%
  126. if %js%==%suan% echo ((%a%÷%b%)÷%c%)×%d%=%suan%&set cg=1
  127. set /a js=((%a%/%b%)/%c%)/%d%
  128. if %js%==%suan% echo ((%a%÷%b%)÷%c%)÷%d%=%suan%&set cg=1
复制代码

但有数会显示一些错误结果,可能由于set不能计算小数点,请问如何解决
作者: Batcher    时间: 2008-9-13 22:19

关于小数计算,可以到这个帖子里面找找。
http://www.cn-dos.net/forum/viewthread.php?tid=27667&fpage=1
作者: terse    时间: 2008-9-13 23:14

用P处理小数可能很吃力
以前也写了一个 没用除
http://bbs.bathome.net/thread-168-1-1.html
作者: yslyxqysl    时间: 2008-9-14 21:52

  1. @echo off&color c0&title 算24
  2. setlocal ENABLEDELAYEDEXPANSION
  3. ::from 771815005
  4. :number1
  5. set /a shu1=%random%%%11
  6. if "%shu1%"=="0" goto number1
  7. :number2
  8. set /a shu2=%random%%%11
  9. for %%b in (%shu1% 0) DO if %shu2%==%%b goto number2
  10. :number3
  11. set /a shu3=%random%%%11
  12. for %%j in (%shu1% %shu2% 0) DO if %shu3%==%%j goto number3
  13. :number4
  14. set /a shu4=%random%%%11
  15. for %%h in (%shu1% %shu2% %shu3% 0) DO if %shu4%==%%h goto number4
  16. echo.&echo 请用%shu1% %shu2% %shu3% %shu4%算出24。
  17. echo.&echo S键跳过,E键退出。
  18. :input
  19. Echo.&Set /p suan=请输入算式:&cls&echo.
  20. echo 验证中,请稍候...&echo.
  21. if "%suan%"=="" goto input
  22. if %suan%==s cls&goto number1
  23. if %suan%==e cls&echo.&Echo goodbye!&pause>nul&exit
  24. set suan=%suan:[=(%
  25. set suan=%suan:]=)%
  26. set /a jieguo="%suan%"&set tp=0
  27. for /l %%i in (1 1 4) do (
  28. echo "%suan%"|find "+!shu%%i!">nul||echo "%suan%"|find "-!shu%%i!">nul||^
  29. echo "%suan%"|find "*!shu%%i!">nul||echo "%suan%"|find "/!shu%%i!">nul||^
  30. echo "%suan%"|find "(!shu%%i!">nul||set /a tp+=1
  31. )
  32. if not "%suan:~0,1%"=="(" set /a tp-=1
  33. if %jieguo% equ 24 if %tp% lss 1 goto yes
  34. :no
  35. echo 啊,不对!&goto next
  36. :yes
  37. echo Yes,对了!
  38. :next
  39. echo.&echo 下一题...
  40. pause>nul&cls&goto number1
复制代码

2008.09.29更新

[ 本帖最后由 yslyxqysl 于 2008-9-29 14:57 编辑 ]
作者: Batcher    时间: 2008-9-14 22:15     标题: 回复 4楼 的帖子

本版规则
  1、求代码、寻求代码解释、探讨代码得失的帖子均可发在本版块,其余话题禁止在本版讨论;
  2、求助时,务必在顶楼一次性把问题交代清楚;若文字难以表述,请配图说明,或是上传附件;但是,一切操作应从节约论坛资源的角度出发,能文字说明清楚的就无需再发图片,小图能说明问题的尽量不截全图,在不影响效果的前提下尽量压缩图片及附件;
  3、所发代码若不止一行,请务必用code标签把代码部分首尾括起来,以便他人复制;

作者: batman    时间: 2008-9-19 21:24

一楼、四楼的都写的过于复杂了,看着眼都花了,以前也写过一个算24的,现在一时找不到了,重写又懒得动手了,建议将算号和括号都用变量来表示,将会极大简化代码的。
作者: wxcute    时间: 2008-9-19 22:24

楼主纯粹是列举,可采纳6楼的方法

不过用for来循环好像乘号*会被识别为文件名,不知为什么。
作者: Batcher    时间: 2008-9-19 23:54     标题: 回复 7楼 的帖子

你的for怎样写的?
乘号*会被识别为文件名是因为*被看作统配符了吧
作者: terse    时间: 2008-9-27 20:51

除法是个问题
  1. @echo off&
  2. setlocal enabledelayedexpansion
  3. set/p str=输入4个数(空格隔开)
  4. for %%i in (!str!) do set/a n+=1&set var=!var! !n!&set "!n!=%%i"
  5.         set m1=+&set m2=-&set m3=*
  6.         for %%i in (!var!) do (
  7.         set "var1=!var:%%i=!"
  8.         for %%j in (!var1!) do (
  9.         set "var2=!var1:%%j=!"
  10.         for %%k in (!var2!) do (
  11.         set "var3=!var2:%%k=!"
  12.         for %%l in (!var3!) do (
  13.                 for /l %%a in (1,1,3) do (
  14.                 for /l %%b in (1,1,3) do (
  15.                 for /l %%c in (1,1,3) do (
  16.       set/a str=!%%i!!m%%a!!%%j!!m%%b!!%%k!!m%%c!!%%l!
  17.       if !str! equ 24 set/p=!%%i!!m%%a!!%%j!!m%%b!!%%k!!m%%c!!%%l!=!str!&exit
  18.       set/a str=^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!!m%%c!!%%l!
  19.       if !str! equ 24 set/p=^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!!m%%c!!%%l!=!str!&exit
  20.       set/a str=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!
  21.       if !str! equ 24 set/p=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
  22.       set/a str=!%%i!!m%%a!!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)
  23.       if !str! equ 24 set/p=!%%i!!m%%a!!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)=!str!&exit
  24.       set/a str=^(!%%i!!m%%a!!%%j!!m%%b!!%%k!^)!m%%c!!%%l!
  25.       if !str! equ 24 set/p=^(!%%i!!m%%a!!%%j!!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
  26.       set/a str=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!!m%%c!!%%l!^)
  27.       if !str! equ 24 set/p=!%%i!!m%%a!^(!%%j!!m%%b!!%%k!!m%%c!!%%l!^)=!str!&exit
  28.       set/a str=^(!%%i!!m%%a!!%%j!^)!m%%b!^(!%%k!!m%%c!!%%l!^)
  29.       if !str! equ 24 set/p=^(!%%i!!m%%a!!%%j!^)!m%%b!^(!%%k!!m%%c!!%%l!^)=!str!&exit
  30.       set/a str=^(!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)^)!m%%c!!%%l!
  31.       if !str! equ 24 set/p=^(!%%i!!m%%a!^(!%%j!!m%%b!!%%k!^)^)!m%%c!!%%l!=!str!&exit
  32.       set/a str=^(^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!^)!m%%c!!%%l!
  33.       if !str! equ 24 set/p=^(^(!%%i!!m%%a!!%%j!^)!m%%b!!%%k!^)!m%%c!!%%l!=!str!&exit
  34.       set/a str=!%%i!!m%%a!^(!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)^)
  35.       if !str! equ 24 set/p=!%%i!!m%%a!^(!%%j!!m%%b!^(!%%k!!m%%c!!%%l!^)^)=!str!&exit
  36.       set/a str=!%%i!!m%%a!^(^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!^)
  37.       if !str! equ 24 set/p=!%%i!!m%%a!^(^(!%%j!!m%%b!!%%k!^)!m%%c!!%%l!^)=!str!&exit
  38.       )))))))
  39. echo.
  40. echo 对不起,没算出来!
  41. echo.
  42. pause&exit
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2