返回列表 发帖

【练习-067】批处理2012的基础练习

本帖最后由 batman 于 2012-2-29 09:15 编辑

前言:
  今年是2012年,也是传说中的世界末年,所以就以这个特殊的2012做为主题来开始本次的基础训练。

加分原则:
  总共10题,每题10分,总分100分,视情况打分
解题要求:
  独立解题,新手最好能全部做一遍(毕竟是基础练习)
题目如下:
  1、在屏幕上分别分行和同行输出2012字符串的2 0 1 2四个字符以及反序输出(在这里要将2012视为不可知数值)
  2、计算2012字符串四个数值的和(在这里要将2012视为不可知数值)
  3、利用random生成2012,并计算random的次数
  4、利用random生成2012,并保证每次使用最少的random次数(第一次取0-2012间的随机值,如取到948,就取948到2012间的随机值,依次下去,直到取到2012。。。)
  5、证明2012年是闰年(在这里要将2012视为不可知数值)
  6、输出2012年所有的日期
  7、分别生成以2012命名的xls word txt pdf gpg的文件并在里面输入“2012 0”字符
  8、将2012转换成二零一二(在这里要将2012视为不可知数值)
  9、将1-2012之间的数值全转换成中文数值,如2001转换成二千零一
  10、写出一段关于2012年的感想或祝福,并在屏幕上逐字逐行延时输出
-----------------------------------
下同给出所有题的参考答案,9-10题因为难度比较大,大家可以多思考思考(同时大家可以试着将开头的number变量换成其他数值运行下)
@echo off&setlocal enabledelayedexpansion
set /a number=2012
rem 计算字符串长度(9位以内)
set "str=%number%987654321"&set "str=!str:~9!"
set /a counter=%str:~,1%-1
echo 题目1&echo,
echo 分行输出
for /l %%a in (0,1,%counter%) do echo !number:~%%a,1!&set /a total+=!number:~%%a,1!
echo 不换行输出
for /l %%a in (0,1,%counter%) do set /p=!number:~%%a,1!<nul
echo,
echo 倒序输出
for /l %%a in (%counter%,-1,0) do set /p=!number:~%%a,1!<nul
echo,&echo,
echo 题目2&echo,
echo %number%数值%str:~,1%位数相加的和为%total%
echo,
echo 题目3&echo,
echo 下面这种随机生成效率相当低还有可能因超出cmd计算上限而退出
:lp
set /a n+=1
if %random% neq %number% goto lp
echo 随机了%n%次生成%number%
echo,&set /a min=0
echo 题目4&echo,
echo 下面这种随机生成效率较高
for /l %%a in (1,1,%number%) do (
  set /a "rand=min+(!random!%%(number-min+1))"
  echo !rand!
  if !rand! equ %number% echo 随机了%%a次生成!rand!&echo,&goto :next
  if !rand! gtr !min! set /a min=rand
)
:next
echo 题目5&echo,
rem 因为开启变量延迟后!会被当做逃逸字符被脱去使得下面闰年判断命令出错
endlocal&set "number=%number%"&set "counter=%counter%"
set /a "yp=!(%number%%%4)^!(%number%%%100)|!(%number%%%400)"
if %yp% equ 1 (
  echo %number%年为闰年
  ) else (
  echo %number%年为平年
)
echo,&setlocal enabledelayedexpansion
echo 题目6&echo,
set /a _2=28+yp,month_days=31
for %%a in (1 3 5 7 8 10 12 4 6 9 11) do (
  if %%a equ 4 set /a month_days-=1
  set /a _%%a=month_days
)
(for /l %%a in (1,1,12) do (
  for /l %%b in (1,1,!_%%a!) do echo %number%%%a%%b
))>%number%.txt
echo %number%年所有的日期已输入%number%_date.txt
echo,
echo 题目7&echo,
for %%a in (xls word txt pdf gpg) do >%number%.%%a echo 2012 0&echo %number%.%%a文件已生成
echo,
echo 题目8&echo,
for %%a in (零0123456789) do (
  set "str=%%a"
  set "_!str:~1,1!=!str:~,1!"
)
for /l %%a in (0,1,%counter%) do (
  set "str=!number:~%%a,1!"
  for %%b in (!str!) do set /p=!_%%b!<nul
)
echo,&echo,
echo 题目9&echo,
set /a counter=0
(for /l %%a in (1,1,%number%) do (
  set "str=%%a"&set "input="
  for %%a in (10 100 1000) do if %%a equ !str! set /a counter+=1
  for /l %%a in (0,1,!counter!) do (
    set "var=!str:~%%a,1!"
    for %%b in (!var!) do set "input=!input!!_%%b!"
    if %%a equ 0 (
      if !counter! equ 1 set "input=!input!十"
      if !counter! equ 2 set "input=!input!百"
      if !counter! equ 3 set "input=!input!千"
    )
    if %%a equ 1 (
      if !counter! equ 2 set "input=!input!十"
      if !counter! equ 3 set "input=!input!百"
    )
    if %%a equ 2 if !counter! equ 3 set "input=!input!十"
  )
  for %%a in (十零-十 零十-零 零百零-零 零百-零) do (
    for /f "tokens=1,2 delims=-" %%b in ("%%a") do set "input=!input:%%b=%%c!"
  )
  if "!input:~-2!" equ "百零" set "input=!input:百零=百!"
  if "!input:~-2!" equ "千零" set "input=!input:千零=千!"
  echo !input!
))>%number%_汉字.txt
echo 1%number%间的数值已全转换为汉语数值并输入到%number%_汉字.txt中
echo,
echo 题目10&echo,
rem 运行时请将下面的tab的值改为实际的tab
set "tab= "
for /f "delims=:" %%a in ('findstr "::" %0') do (
  set "str=%%a"
  if "!str:~,1!" neq "f" (
    for /l %%a in (0,1,20) do (
      set /p=!str:~%%a,1!<nul
      for /l %%b in (1,1,500) do ver>nul
    )
  )
  echo,&echo,
)
pause>nul
:: 2012年注定是个不平凡之年
:: 她是传说中的世界末日
:: 她也是批处理之家发展的第六个年头
:: 我们将在2012年迎来盛大的伦敦奥运
:: 而对于我,2012年更是不寻常
:: 因为今年是小女儿的第一个本命年
:: 也是她迈入初中的紧张之年
:: 在此,我衷心祝愿:
::   批处理之家!tab!红红火火 蒸蒸日上
::   中华健儿!tab!英姿飒爽 再创辉煌
::   小女儿!tab!快乐成长 学业有成
::   全世界!tab!和平安祥 再无战荒COPY
***共同提高***

本帖最后由 guaiwu 于 2012-3-1 20:19 编辑

问题纯属自己思考,也没看其他的“同鞋”的,还有需要补充的。待续...
 1、在屏幕上分别分行和同行输出2012字符串的2 0 1 2四个字符以及反序输出(在这里要将2012视为不可知数值)
  2、计算2012字符串四个数值的和(在这里要将2012视为不可知数值)
@echo off
set /p aa=
set /a b=%aa:~0,-3%+%aa:~1,-2%+%aa:~2,-1%+%aa:~3%
echo %b%
pauseCOPY
3、利用random生成2012,并计算random的次数
@echo off&setlocal enabledelayedexpansion
:random
set/a i=%random%%%2012+1
echo %i%
set /a a+=1
if %i%==2012 goto yes
goto random
:yes
echo!a!次找到了%i%
pauseCOPY
4、利用random生成2012,并保证每次使用最少的random次数(第一次取0-2012间的随机值,如取到948,就取948到2012间的随机值,依次下去,直到取到2012。。。)
@echo off
set /a b=%random% %%2012+1
:with
set /a n+=1
set /a aa=2013-%b%
set /a b=%random% %%%aa%+%b%
set /a aa=%b%
echo %b%
if %b% == 2012 goto ok
goto with
:ok
echo%n%次找到了%b%
pauseCOPY
5、证明2012年是闰年(在这里要将2012视为不可知数值)
@echo off
set /p a=
set /a b=%a%%%4
if %b% == 0 echo %a%年是闰年
pauseCOPY
6、输出2012年所有的日期
  7、分别生成以2012命名的xls word txt pdf gpg的文件并在里面输入“2012 0”字符
  8、将2012转换成二零一二(在这里要将2012视为不可知数值)
@echo off&setlocal enabledelayedexpansion
set /p aa=输入一个四位数:
set a=%aa:~-1%
for %%i in (%aa:~0,-3%,%aa:~1,-2%,%aa:~2,-1%,%aa:~3%) do (
set /a n+=1
if %%i == 0 set .!n!=零
if %%i == 1 set .!n!=一
if %%i == 2 set .!n!=二
if %%i == 3 set .!n!=三
if %%i == 4 set .!n!=四
if %%i == 5 set .!n!=五
if %%i == 6 set .!n!=六
if %%i == 7 set .!n!=七
if %%i == 8 set .!n!=八
if %%i == 9 set .!n!=九
)
cls
echo 转换中文为:%.1%%.2%%.3%%.4%
pause>nulCOPY
9、将1-2012之间的数值全转换成中文数值,如2001转换成二千零一
  10、写出一段关于2012年的感想或祝福,并在屏幕上逐字逐行延时输出
莫求昨天无悔,但愿今日无愧。

TOP

请问超版,第三题我用这种方式生成2012,是不是不妥,或者根本就是错的?
@echo off
set n=0&set str=
call :loop 2 0 1 2
echo %str%运行了%n%次&pause&exit
:loop
if "%1"=="" goto :eof
set/a n+=1&set aa=%random:~-1%
if "%aa%"=="%1" (set str=%str%%aa%&shift&goto loop) else goto loopCOPY

TOP

回复 24# batman


    注意到了。。
您的意思是:有些地方不能开变量延迟??开了会影响某些应用??

我是说:在既能用!!,又能用%%的情况下,优先选择 !! 除了要多写一句话以外,有没有其他什么不好的??

TOP

回复 23# QIAOXINGXING


    兄弟注意到我顶楼给出的答案中的第五题中写的备注不。。。
***共同提高***

TOP

回复 21# batman


   
但是变量延迟有点滥用了

嗯,我是一上来不管用不用,先把变量延迟打开,能用!!坚决不用%% 。
开变量延迟有什么不利还是不清楚,是不是会增加预处理的次数,从而影响速度??还会影响某些应用??

您在第 8 题 用:for %%b in (!str!) do set /p=!_%%b!<nul
我觉得这句样更好理解:  call set /p=%%_!str!%%<nul
您也是出于变量延时的考虑吗??

TOP

回复 11# batman


    呵呵 第九题慢了点...

TOP

本帖最后由 batman 于 2012-2-28 10:19 编辑

由于本人工作原因
一直没有时间仔细看看代码很是对不起大家了
今天终于抽出时间来阅读了大家的解法和思路
但还是由于时间原因不能做到细致详实敬请谅解
同时希望大家在帖子能踊跃跟帖进行充分的讨论
毕竟讨论才出真知嘛。。。
***共同提高***

TOP

我7天前做完了 管理员能否帮忙看一看

TOP

本帖最后由 BAT1 于 2012-2-20 14:24 编辑

回复 17# batman


    请将要求更新至顶楼!
(这句话平时都是版主对我们说的,想不到今天我却对超级版主说 /汗)
1

评分人数

TOP

本帖最后由 QIAOXINGXING 于 2012-2-22 22:42 编辑

1
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set /p a=输入一个四位数:
for /l %%i in (0 1 3) do (set "b=!b! !a:~%%i,1!")
echo !b!
echo ---------------
for /l %%i in (0 1 3) do (set "c= !a:~%%i,1!!c!")
echo !c!
echo ---------------
for /l %%i in (0 1 3) do (echo !a:~%%i,1!)
echo ---------------
for /l %%i in (3 -1 0) do (echo !a:~%%i,1!)
echo ---------------
pause COPY
2
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set /p a=输入一个四位数:
for /l %%i in (0 1 3) do (
set /a "b=!b!+!a:~%%i,1!"
set "bb=!bb!+!a:~%%i,1!"
)
set "bb=!bb:~1!"
echo !bb!=!b!
pauseCOPY
3
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set "n=0"
:a
set /a "n+=1"
if not "!random!"=="2012" ( cls&echo!n! 次 &goto :a) else (echo 行勒!! 共 !n! 次)
pauseCOPY
看了下前面的帖子:
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
:start
for /l %%i in (1 1 1000) do (
  set /a "n+=1"
  if !random!==2012 (echo ok & pause & exit) else (cls & echo!n! 次)
)
goto :start
rem 纯 goto 效率确实很低,for的确强大。
rem for 语句的上限是1000还是100000000,速度差别很小
rem 两个 bat 同时运行,最后的次数是一样的。。。。。。COPY
4
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set "b=32768"
set "c=0"
set "n=0"
:go1
set /a "n+=1"
set /a  "a=!random!%%!b!+!c!"
if !a! lss 2012 (if !a! gtr !c! set "c=!a!")
if !a! gtr 2012 (set /a "b1=!a!-!c!" & if !b1! lss !a! set /a "b=!a!-!c!")
if !a! equ 2012 echo!n! 次 & pause &exit
echo !a!
goto :go1COPY
5
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set /p a=输入年份:
set /a "b1=!a!%%4"
set /a "b2=!a!%%100"
set /a "b3=!a!%%400"
if "!b3!"=="0" (set "d=0"
) else (
  if not "!b2!"=="0" (if "!b1!"=="0" set "d=0")
)
if defined d (echo 是闰年) else (echo 不是闰年)
pauseCOPY
6
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set "a=31 29 31 30 31 30 31 31 30 31 30 31"
for /l  %%i in (0 3 33) do (
  set /a "m=%%i/3+1"
  set "n=!a:~%%i,2!"
  for /l %%a in (1 1 !n!) do (
    echo 2012!m!%%a
  )
)
pauseCOPY
7
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set "a=xls doc txt pdf gpg"
for %%i in (!a!) do (>2012.%%i echo 2012 0)
rem 今天第一次见 “>”的前置用法。。。。。才知道了还有“句柄”这词儿。。。。
pauseCOPY
8
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set /p n=输入数字:
set "aa=零 一 二 三 四 五 六 七 八 九"
set "a=-1"
for  %%i in (!aa!) do (
set /a a+=1
set "b=%%i"
call  set "n=%%n:!a!=!b!%%"
)
echo !n!
pauseCOPY
9
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set "nn=0"
:start
set /p nn=输入位数不超过5的数字:
set "n="
set "n4="
set "n3="
set "n2="
for /l %%i in (0 1 3) do (set "n= !nn:~%%i,1!!n!")
rem 数字间加空格并倒序
set "aa=零 一 二 三 四 五 六 七 八 九"
set "a=-1"
for  %%i in (!aa!) do (
set /a a+=1
set "b=%%i"
call  set "n=%%n:!a!=!b!%%"
)
rem 阿拉伯数字变为汉字
set "x=0"
for %%i in (!n!) do (set /a x+=1 & set n!x!=%%i)
if defined n4 (set n=!n4!!n3!!n2!!n1! ) else (
if defined n3 (set n=!n3!!n2!!n1!) else (
if defined n2 (set n=!n2!!n1!) else (
if defined n1 set n=!n1!)))
rem 判断位数
set "n=!n:零百=零!"
set "n=!n:零十=零!"
set "n=!n:十零=十!"
set "n=!n:零零=零!"
set "n=!n:零零=零!"
if "!n2!!n1!"=="零零" set "n=!n:百零=百!"
if "!n3!!n2!!n1!"=="零零零" set "n=!n:千零=千!"
echo !n!
echo ---------------------------------
goto :startCOPY
10
@echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
set "a1=希望今年能少蛋疼。。。"
set "a2=希望世界上所有人都好好的。。。"
set "a3=谢谢!!!!!!"
:go1
set /a "a+=1"
call set "b=%%a!a!%%"
for /l %%i in (0 1 20) do (
set /p=!b:~%%i,1!<nul
ping 127.1 /n 1 >nul
)
echo.
if "!a!"=="3" pause >nul & exit
goto :go1COPY
1

评分人数

    • batman: 书写较规范,但是变量延迟有点滥用了,加油 ...PB + 80

TOP

回复 16# jinzeyu

此题确实有点难懂,就这样吧,第一次取0-2012间的随机值,如取到948,就取948到2012间的随机值,依次下去,直到取到2012。。。
***共同提高***

TOP

回复 14# batman
第四题能解释一下吗

TOP

同时请大家在解题时稍微注意下代码的运行效率,call来call去再加上goto,代码基本无效率可言。。。
batman 发表于 2012-2-18 21:16



有的题偶根本不会做,会做的也是想破脑袋瓜才做出来滴。对偶来说,实在没办法考虑效率问题呀。。。
超版是不是对新手过于苛求了。。。

TOP

回复 13# jinzeyu


    不好意思是我的失误,顶楼已改正,将原来的2题合并到1题中了,还是10题
***共同提高***

TOP

返回列表