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

【练习-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变量换成其他数值运行下)
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a number=2012
  3. rem 计算字符串长度(9位以内)
  4. set "str=%number%987654321"&set "str=!str:~9!"
  5. set /a counter=%str:~,1%-1
  6. echo 题目1&echo,
  7. echo 分行输出
  8. for /l %%a in (0,1,%counter%) do echo !number:~%%a,1!&set /a total+=!number:~%%a,1!
  9. echo 不换行输出
  10. for /l %%a in (0,1,%counter%) do set /p=!number:~%%a,1!<nul
  11. echo,
  12. echo 倒序输出
  13. for /l %%a in (%counter%,-1,0) do set /p=!number:~%%a,1!<nul
  14. echo,&echo,
  15. echo 题目2&echo,
  16. echo %number%数值%str:~,1%位数相加的和为%total%
  17. echo,
  18. echo 题目3&echo,
  19. echo 下面这种随机生成效率相当低还有可能因超出cmd计算上限而退出
  20. :lp
  21. set /a n+=1
  22. if %random% neq %number% goto lp
  23. echo 随机了%n%次生成%number%
  24. echo,&set /a min=0
  25. echo 题目4&echo,
  26. echo 下面这种随机生成效率较高
  27. for /l %%a in (1,1,%number%) do (
  28.   set /a "rand=min+(!random!%%(number-min+1))"
  29.   echo !rand!
  30.   if !rand! equ %number% echo 随机了%%a次生成!rand!&echo,&goto :next
  31.   if !rand! gtr !min! set /a min=rand
  32. )
  33. :next
  34. echo 题目5&echo,
  35. rem 因为开启变量延迟后!会被当做逃逸字符被脱去使得下面闰年判断命令出错
  36. endlocal&set "number=%number%"&set "counter=%counter%"
  37. set /a "yp=!(%number%%%4)^!(%number%%%100)|!(%number%%%400)"
  38. if %yp% equ 1 (
  39.   echo %number%年为闰年
  40.   ) else (
  41.   echo %number%年为平年
  42. )
  43. echo,&setlocal enabledelayedexpansion
  44. echo 题目6&echo,
  45. set /a _2=28+yp,month_days=31
  46. for %%a in (1 3 5 7 8 10 12 4 6 9 11) do (
  47.   if %%a equ 4 set /a month_days-=1
  48.   set /a _%%a=month_days
  49. )
  50. (for /l %%a in (1,1,12) do (
  51.   for /l %%b in (1,1,!_%%a!) do echo %number%年%%a月%%b日
  52. ))>%number%.txt
  53. echo %number%年所有的日期已输入%number%_date.txt
  54. echo,
  55. echo 题目7&echo,
  56. for %%a in (xls word txt pdf gpg) do >%number%.%%a echo 2012 0&echo %number%.%%a文件已生成
  57. echo,
  58. echo 题目8&echo,
  59. for %%a in (零0 一1 二2 三3 四4 五5 六6 七7 八8 九9) do (
  60.   set "str=%%a"
  61.   set "_!str:~1,1!=!str:~,1!"
  62. )
  63. for /l %%a in (0,1,%counter%) do (
  64.   set "str=!number:~%%a,1!"
  65.   for %%b in (!str!) do set /p=!_%%b!<nul
  66. )
  67. echo,&echo,
  68. echo 题目9&echo,
  69. set /a counter=0
  70. (for /l %%a in (1,1,%number%) do (
  71.   set "str=%%a"&set "input="
  72.   for %%a in (10 100 1000) do if %%a equ !str! set /a counter+=1
  73.   for /l %%a in (0,1,!counter!) do (
  74.     set "var=!str:~%%a,1!"
  75.     for %%b in (!var!) do set "input=!input!!_%%b!"
  76.     if %%a equ 0 (
  77.       if !counter! equ 1 set "input=!input!十"
  78.       if !counter! equ 2 set "input=!input!百"
  79.       if !counter! equ 3 set "input=!input!千"
  80.     )
  81.     if %%a equ 1 (
  82.       if !counter! equ 2 set "input=!input!十"
  83.       if !counter! equ 3 set "input=!input!百"
  84.     )
  85.     if %%a equ 2 if !counter! equ 3 set "input=!input!十"
  86.   )
  87.   for %%a in (十零-十 零十-零 零百零-零 零百-零) do (
  88.     for /f "tokens=1,2 delims=-" %%b in ("%%a") do set "input=!input:%%b=%%c!"
  89.   )
  90.   if "!input:~-2!" equ "百零" set "input=!input:百零=百!"
  91.   if "!input:~-2!" equ "千零" set "input=!input:千零=千!"
  92.   echo !input!
  93. ))>%number%_汉字.txt
  94. echo 1至%number%间的数值已全转换为汉语数值并输入到%number%_汉字.txt中
  95. echo,
  96. echo 题目10&echo,
  97. rem 运行时请将下面的tab的值改为实际的tab
  98. set "tab= "
  99. for /f "delims=:" %%a in ('findstr "::" %0') do (
  100.   set "str=%%a"
  101.   if "!str:~,1!" neq "f" (
  102.     for /l %%a in (0,1,20) do (
  103.       set /p=!str:~%%a,1!<nul
  104.       for /l %%b in (1,1,500) do ver>nul
  105.     )
  106.   )
  107.   echo,&echo,
  108. )
  109. pause>nul
  110. :: 2012年注定是个不平凡之年
  111. :: 她是传说中的世界末日
  112. :: 她也是批处理之家发展的第六个年头
  113. :: 我们将在2012年迎来盛大的伦敦奥运
  114. :: 而对于我,2012年更是不寻常
  115. :: 因为今年是小女儿的第一个本命年
  116. :: 也是她迈入初中的紧张之年
  117. :: 在此,我衷心祝愿:
  118. ::   批处理之家!tab!红红火火 蒸蒸日上
  119. ::   中华健儿!tab!英姿飒爽 再创辉煌
  120. ::   小女儿!tab!快乐成长 学业有成
  121. ::   全世界!tab!和平安祥 再无战荒
复制代码
***共同提高***

很高兴楼上的几位新人参与训练,待你们的代码更新完毕一并加分(请注意有些代码还是有问题的。。。)
***共同提高***

TOP

回复 8# find

我想这些题目应该还不要举例说明吧,个人对自己的文字描述能力还是有一点信心的,如兄弟对题目中哪一点描述不明白,也可以跟帖提问啊,本来论坛就需要这个“讨论”的氛围,你说是不?
***共同提高***

TOP

本帖最后由 batman 于 2012-2-18 21:18 编辑

从大家的解来看,第七题基本都落入了我的陷井。。。

注意系统默认的句柄啊(2012 0像你们这样是不能输出的)

同时请大家在解题时稍微注意下代码的运行效率,call来call去再加上goto,代码基本无效率可言。。。
***共同提高***

TOP

回复 13# jinzeyu


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

TOP

回复 16# jinzeyu

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

TOP

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

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

TOP

回复 23# QIAOXINGXING


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

TOP

返回列表