批处理之家's Archiver

batman 发表于 2010-9-20 10:21

【练习-061】小学生加减法算式批处理生成器

出题目的:
  综合考查对set 命令以及if判断语句的运用
加分原则:
  优秀代码予以技术+1的鼓励
解题要求:
  1、请版主、技术组成员先将机会留给新人
  2、代码简洁、高效、无临时文件
题目如下:
  编写代码随机生成指定运算范围内的整数加减法算式,其中指定范围是由使用者输入,在这其中要注意加法运算
的和不能超过指定范围(上限),减法运算结果不能为负数(减数不能大于被减数),然后接收输入的答案并做出判
断,如果结果正确则显示正确,不正确显示不正确并给出正确结果,接收回车指令后给出下一个随机算式,这时不要
求再接收运算范围的输入。运行过程如下所示:
[attach]2980[/attach]

sgaizxt001 发表于 2010-9-20 11:24

[code]@echo off
setlocal enabledelayedexpansion
set /p max=请输入范围上限:
cls
set /a ran=!random!%%2
if %ran% equ 0 (goto jiafa) else (goto jianfa)

:jiafa
set /a a=!random!%%%max%+1
set /a b=!random!%%%max%+1
set /a number=%a%+%b%
if %number% gtr %max% goto jiafa
echo %a%+%b%=?
set /p res=请输入答案:
echo.
if %res% equ %number% (echo 正确) else (echo 错误,正确答案是%number%)
pause
goto :eof


:jianfa
set /a a=!random!%%%max%+1
set /a b=!random!%%%max%+1
if %a% gtr %b% (call :jian %a% %b%) else (call :jian %b% %a%)
set /p res=请输入答案:
if %res% equ %num% (echo 正确) else (echo 错误,正确答案是%num%)
pause
goto :eof


:jian
echo %1-%2=?
set /a num=%1-%2
echo.
goto :eof[/code]已经修改为随机加减法了,加法的运算的上限的判断问题,我没有更好的思路,batman可否给讲解一下?

[[i] 本帖最后由 sgaizxt001 于 2010-9-20 14:14 编辑 [/i]]

batman 发表于 2010-9-20 11:38

指出二楼代码需要改进的地方

1、算式是随机生成的,不用选择加减法

2、代码采用了判断加返回call循环模式,在算法上效率较低

batman 发表于 2010-9-20 11:53

郁闷,没办法给贴子加分!!!

netbenton 发表于 2010-9-20 12:13

晕~~~~只能扣分,不能加分~~~~~

为什么这样 /ku

523066680 发表于 2010-9-20 12:59

回复 5楼 的帖子

你们啊,现在流行+技术! 技术!
我们要尊重党的策略。

robinsnelson 发表于 2010-9-20 13:15

[code]@echo off
@color 4e
set /p max="请输入最大值:":
::这里有点繁琐 鉴于我是小白 好多功能还不会使用 见谅。

::产生随机数
:start1
set num1=%random%
if %num1% gtr %max% goto start1
:start2
set num2=%random%
if %num2% gtr %max% goto start2
if %num1% lss %num2% goto start1

::随机产生加减法
if %random:~1,1% LSS 5 (goto plus) else (goto minus)

::加法
:plus
set /a true=%num1%+%num2%
echo %num1%+%num2%=?
goto judge

::减法
:minus
set /a true=%num1%-%num2%
echo %num1%-%num2%=?
::判断结果
:judge
set /p typein="请输入结果:":
if %true% equ %typein% (echo 恭喜你答对了!!
                        goto end) else (
                        echo 计算错误,正确答案是%true%
                        goto end)
:end
@pause >nul[/code]写的不是一般的麻烦 不过应该符合要求了

贴上来之后才发现加法的判断有点小问题。。
9#是我修改过后的代码 看那个吧。。

[[i] 本帖最后由 robinsnelson 于 2010-9-20 13:57 编辑 [/i]]

edmond 发表于 2010-9-20 13:29

@echo off
setlocal enabledelayedexpansion
color 1f
title 小学加减法练习簿
set /p max=请输入范围上限:
set /p count=请输入练习次数:
set t=0
set r=0
set s=0
:start
if !count!==!t! (
cls&echo 您已经完成了练习次数,正确!r!次,错误!s!次,加油!&echo 按任意键结束练习&pause>nul&exit
)
cls
set /a m=!random!%%!max!+1
set /a n=!random!%%!max!+1
if !n! lss !m! (set /a  res=!m!-!n!&echo !m!-!n!=) else (set /a res=!m!+!n!&echo !m!+!n!=)
:res
set /p result=请输入答案:
echo !result!
echo.
if !res! equ !result! (echo 恭喜,正确&set /a r+=1) else (echo 错误,正确答案是!res!&set /a s+=1)

ping 127.1 -n 2 >nul
set /a t+=1
goto start

给点分,可以不咯

[[i] 本帖最后由 edmond 于 2010-9-20 13:31 编辑 [/i]]

robinsnelson 发表于 2010-9-20 13:33

[code]@echo off
@color 4e
set /p max="请输入最大值:":
::随机产生加减法
:loop
if %random:~1,1% LSS 5 (goto plus) else (goto minus)

::加法
:plus
:start1
set num1=%random%
if %num1% gtr %max% goto start1
:start2
set num2=%random%
if %num2% gtr %max% goto start2
set /a true=%num1%+%num2%
if %true% gtr %max% goto plus
echo %num1%+%num2%=?
goto judge

::减法
:minus
:start3
set num1=%random%
if %num1% gtr %max% goto start3
:start4
set num2=%random%
if %num2% gtr %max% goto start4
set /a true=%num1%-%num2%
if %true% lss 0 goto minus
echo %num1%-%num2%=?
::判断结果
:judge
set /p typein="请输入结果:":
if %true% equ %typein% (echo 恭喜你答对了!!
                        goto end) else (
                        echo 计算错误,正确答案是%true%
                        goto end)
:end
goto loop
@pause >nul[/code]修改了一下 虽然代码更麻烦了 不过运行的快了一些 最后一个要求接受回车给出下个指令 不太会 所以我就全部设成循环了 退出的话 我想的是可以对那个tpyein的判断 给出输入特定字符退出 然后再执行一下exit命令 就不在里面写了

[[i] 本帖最后由 robinsnelson 于 2010-9-20 14:02 编辑 [/i]]

q120072949 发表于 2010-9-20 14:38

再次学习了!!!!!

batman 发表于 2010-9-20 14:48

回复 8楼 的帖子

参与精神是最重要的,不管你的代码写的怎么样,也不管你最后会得到什么样的评价,但起码你动了脑动了手,

你自己得到了提高。另外论坛现在的设置是不能加pb了,所以我只能对优秀的代码加技术分,希望兄弟不要为此而灰

心,继续努力,ok?

batman 发表于 2010-9-20 14:50

回复 9楼 的帖子

有进步,但代码运算效率仍然不高,建议不要采用判断加返回的运算方法

小提示:加减法可以不分开写不?

[[i] 本帖最后由 batman 于 2010-9-20 14:55 编辑 [/i]]

随风 发表于 2010-9-20 15:20

用户输入的范围数是指的什么数的范围?
比如输入 20
是指 a 和 b 都不能大于 20 吗?

batman 发表于 2010-9-20 15:24

回复 13楼 的帖子

如输入100,表明生成100以内的加减法,也就是减数和算式和均不大于100

随风 发表于 2010-9-20 15:34

感觉按我13楼的提议会更好点,否则你那个cmd数值范围的要求不大啊。

batman 发表于 2010-9-20 15:48

回复 15楼 的帖子

这是跟着教科书走的,10以内就是结果在10以内,100以内就是结果在100以内。

robinsnelson 发表于 2010-9-20 18:45

回复 12楼 的帖子

超版大人 能不能给的提示多一些 我学批处理才几天 好多都没听说过 说实话 刚看到题目 我想到的就是我写出来的这些 或者给我说下您的QQ 我也好请教您不是
PS:回复帖子是不是没有通知啊 我都不知道有人回复了 是回来学习其他代码的时候才看到回复的。

sgaizxt001 发表于 2010-9-20 18:53

[code]@echo off
setlocal enabledelayedexpansion
set /p max=请输入范围上限:
cls
set /a ran=!random!%%2
if %ran% equ 0 (set str=-) else (set str=+)
:loop
set /a a=!random!%%%max%+1
set /a b=!random!%%%max%+1
set /a n=%a%+%b%
if %n% gtr %max% goto :loop
if %a% gtr %b% (call :lp %a% %b%) else (call :lp %b% %a%)
set /p res=请输入答案:
if %res% equ %num% (echo 正确) else (echo 错误,正确答案是: %num%)
echo.
pause
goto :eof

:lp
echo %1%str%%2=?
set /a num=%1%str%%2
echo.[/code]略有改进,但是还是无法解决和上限的问题

Batcher 发表于 2010-9-20 21:05

回复 17楼 的帖子

可以加论坛的QQ群

zqz0012005 发表于 2010-9-20 21:46

[color=white][code]@echo off
setlocal enableDelayedExpansion
set limit=100
set /p limit=指定范围:
:loop
set /a "x = %random% %% (limit+1)"
set /a "p = %random% %% (limit-x+1)"
set /a "q = %random% %% (x+1)"
set /a "bool = %random% %% 2"
if %bool%==1 (set y=+%p%) else (set y=-%q%)
set /a r=%x%%y%
echo %x%%y%=?
set /p ans=请输入答案:
if not "%ans%"=="%r%" (echo 错误,正确答案是%r%&pause>nul)
goto loop
pause[/code][/color]

bat_521 发表于 2010-9-21 00:52

菜鸟的答案

[code]@echo off
setlocal enabledelayedexpansion
color 0a
echo.
echo 以下是小学加减练习题
echo.
set/p var=请输入计算范围:
:a
set /a a=%random%%%%var%
set /a b=%random%%%%var%
if %a% gtr %b% (goto :b) else goto :a
:b
set /a c=%a%-%b%
echo.
echo %a%-%b%=?
echo.
set/p d=请输入答案:
echo.
if %c%==%d% (echo 答案正确) else echo 答案错误;正确答案是:%c%
echo.
set /a e=%random%%%%var%
set /a f=%random%%%%var%
set /a g=%e%+%f%
echo.
echo %e%+%f%=?
echo.
set/p h=请输入答案:
echo.
if %g%==%h% (echo 答案正确) else echo 答案错误;正确答案是:%g%
echo.
pause[/code]

robinsnelson 发表于 2010-9-21 09:52

[code]@echo off
@color 4e
set /p max="请输入最大值:":
setlocal enabledelayedexpansion
:loop
set /a num1=%random%%%%max%+1
set /a num2=%random%%%%max%+1
set /a base=%random%%%2+1
cls
if %base% equ 1 (
                set /a true=%num1%+%num2%
                if !true! gtr %max% goto loop
                echo %num1%+%num2%=?
                ) else (
                set /a true=%num1%-%num2%
                if !true! lss 0 goto loop
                echo %num1%-%num2%=?
                )
set /p typein="请输入答案:":
if %typein% equ %true% (echo 恭喜你,答对啦!
                       goto end) else (
                       echo 计算错误,正确答案为%true%
                       goto end)
:end
pause>nul
goto loop[/code]参考前面几位前辈 我又写了一下 请管理员大人再看一下

netbenton 发表于 2010-9-21 13:18

[color=white][code]@echo off&color 2f
setlocal enableDelayedExpansion
set /p max=输入上限数:
set /a max+=1
:lp
set /a tre=!random!%%max,one=!random!%%max,fh=!random!%%2
if !tre! gtr !one! (
  set/a two=tre-one
if !fh! equ 0 (set str=!tre!-!one!) else (set str=!one!+!two!)
) else (
  set/a two=one-tre
  if !fh! equ 0 (set str=!one!-!tre!) else (set str=!tre!+!two!)
)
set/a des=!str!
echo;!str!=?
set in=err
set /p in=输入结果:
if !in! equ !des! (echo;答对了!你真聪明!) else (echo;真可惜,正确答案是!des!)
pause>nul
echo;
echo;
goto :lp[/code][/color]

edmond 发表于 2010-9-21 13:33

[code]@echo off
setlocal enabledelayedexpansion
color 1f
mode con: cols=55 lines=20
title 小学加减法练习簿
set /p max=请输入范围上限:
set /p count=请输入练习次数:
set t=0
set r=0
set s=0
:start
if !count!==!t! (
cls&echo 您已经完成了练习次数,正确!r!次,错误!s!次,加油!&echo 按任意键结束练习&pause>nul&exit
)
cls
set /a m=!random!%%!max!+1
set /a n=!random!%%!max!+1
set /a u=!m!+!n!
if !n! lss !m! (set /a  res=!m!-!n!&echo !m!-!n!=
) else if !u! lss !max! (set /a res=!u!&echo !m!+!n!=) else (set /a res=!n!-!m!&echo !n!-!m!=)
:res
set /p result=请输入答案:
if not defined result (echo 您没有输入任何数据,请再次输入答案&goto res)
echo.
if !res! equ !result! (echo 恭喜,正确&set /a r+=1) else (echo 错误,正确答案是!res!&set /a s+=1)

ping 127.1 -n 2 >nul
set /a t+=1
set "result="
goto start[/code]这个是 符合了 老版 的题意了

batman 发表于 2010-9-25 11:17

先公布下我出题前的代码吧:

[code]@echo off&setlocal enabledelayedexpansion
color 9f&mode con cols=40 lines=10
echo.
set /p num=请输入运算范围(如10以内输入10):
set ".0=+"&set ".1=-"
:lp
cls&echo.
set /a a=%random%%%%num%+1,b=%random%%%2
if %a% equ 0 if %b% equ 1 set /a b=0
if %a% equ %num% if %b% equ 0 set /a b=1
if %b% equ 0 (
   set /a "c=%random%%%(num-a)+1"
   ) else (
   set /a "c=%random%%%%a%+1"
)
set /a anser=%a%!.%b%!%c%&echo %a%!.%b%!%c%=?
echo.
set "_anser="&set /p _anser=请输入答案:
echo.
if "%anser%" equ "%_anser%" (
   echo 正确
   ) else (
   echo 错误,正确答案是%anser%
)
pause>nul&goto lp[/code]

powerbat 发表于 2010-9-25 13:44

[quote]原帖由 [i]zqz0012005[/i] 于 2010-9-20 21:46 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=60715&ptid=9360][img]http://www.bathome.net/images/common/back.gif[/img][/url]
@echo off
setlocal enableDelayedExpansion
set limit=100
set /p limit=指定范围:
:loop
set /a "x = %random% %% (limit+1)"
set /a "p = %random% %% (limit-x+1)"
set /a "q = %random% %% (x+1)"
set ... [/quote]
这个有意思。
setlocal enableDelayedExpansion 好像是多余的,惯性吧,或者是模板?

随风 发表于 2010-9-27 01:14

[code]@echo off
set /a g="1<<31",d="~g"
echo; 请输入范围数,不能大于 %d%
echo;&set /p n=
set f=-
:loop
    setlocal&cls
    set /a a=%random%%%n,x=n-a,b=%random% %% x
    if %a% lss %b% set a=%b%&set b=%a%&set f=+
    set /a c=a%f%b
    echo  %a% %f% %b% = ?
    echo;&set /p j= 请输入答案  
    if %j% equ %c% (set k= 正确) else set "k= 错误,%a% %f% %b% = %c%"
    echo;&echo %k%
    echo;&pause
endlocal&goto loop[/code]两数都不能大于指定范围数,和不能大于cmd范围数[code]@echo off
set /a g="1<<31",d="~g"
echo; 请输入范围数,即两数都不能大于的数,不能大于 %d%
echo;&set /p n=
set /a x=d-n+1
set f=-
:loop
    setlocal&cls
    set /a a=%random%%%n,b=%random% %% x %%n
    if %a% lss %b% set a=%b%&set b=%a%&set f=+
    set /a c=a%f%b
    echo  %a% %f% %b% = ?
    echo;&set /p j= 请输入答案  
    if %j% equ %c% (set k= 正确) else set "k= 错误,%a% %f% %b% = %c%"
    echo;&echo %k%
    echo;&pause
endlocal&goto loop[/code]

yangfengoo 发表于 2010-9-27 10:05

[code]@echo off&setlocal enabledelayedexpansion
set/p fw=请输入运算范围:
:loop
set/a x1=!random!%%!fw!,x2=!random!%%!fw!,x=!random!%%2
if !x!==0 (
     set/a xx=x1+x2
     if !xx! leq !fw! (echo !x1!+!x2!=?) else (goto loop)   
   ) else (
     set/a xx=x1-x2
  if !xx! geq 0 (echo !x1!-!x2!=?) else (goto loop)
   )
set/p da=请输入答案:
if "!xx!"=="!da!" (echo,正确) else (echo,错误,正确答案是:!xx!)
echo,&goto loop[/code]

[[i] 本帖最后由 yangfengoo 于 2010-9-27 10:12 编辑 [/i]]

gshccr 发表于 2010-10-13 11:04

基本符合版主的要求,不过代码太长了,不知道哪里需要改进的地方,还请大家多多指教![code]
@echo off
setlocal enabledelayedexpansion
set /p a=请输入指定范围数:
set /a a1=%a%+1
:a
cls
set /a t1=%random%%% %a1%,t2=%random%%% %a1%
set /a y1=%a1%-%t1%-1,y2=%a1%-%t2%-1
if %y1% geq %y2% (
if %y2% geq 1 (set /a the=%y1%+%y2%
if !the! gtr %a% (
set /a daan=%y1%-%y2%&echo %y1%-%y2%=?&goto b)))
set /a r=%random%%% 2+1
if %r%==1 (set n=2) else (set n=1)
set /a wet=!y%r%!+!y%n%!
if %wet% gtr %a% (set /a daan=%y2%-%y1%&echo %y2%-%y1%=?) else (
set /a daan=!y%r%!+!y%n%!&echo !y%r%!+!y%n%!=?)
:b
set /p g=请输入正确答案:
if "%g%"=="%daan%" (echo 正确) else (echo 错误,正确答案为%daan%)
pause
goto a[/code]

[[i] 本帖最后由 gshccr 于 2010-10-13 11:11 编辑 [/i]]

qzwqzw 发表于 2011-3-13 12:36

贴一个没有循环和选择结构的顺序性解法
常规之外略作创新
没有刻意处理诸如0或者最大值的边界问题
在运算范围为1时可能会丢失某些可能
为0时则直接报错退出

[code]
@echo off
echo.
set /p num=请输入运算范围(如10以内输入10):
set ops=+-
:loop
cls&echo.
rem 生成大数big,在减法中作被减数,在加法中作和数
set /a big=%random% %% %num%+1
rem 生成运算符op,并转换为字符opr,0为加法,1为减法
set /a op=%random% %% 2
call set opr=%%ops:~%op%,1%%
rem 生成运算数opd1,减法为大数big,加法时为小于big的随机数
set /a opd1=big*op + (%random% %% big)*(!op)
rem 生成运算数opd2,减法为小于big的随机数,加法时为big-opr1
set /a opd2=(%random% %% big)*op + (big-opd1)*(!op)
rem 生成结果值result
set /a result=opd1 %opr% opd2
echo %opd1% %opr% %opd2% = ?
echo.
set "answer="
set /p answer=请输入答案:
echo.
rem 根据结果与输入的异同显示提示信息
set _0=正确
set _1=错误,正确答案是%result%
rem 两次取反是想将相减后的差值转换为是否相等的逻辑值0或1
set /a judge=!(!(answer-result))
call echo %%_%judge%%%
pause>nul
goto loop
[/code]

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.