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

【练习-013】将字符串小写转大写并延时输出的批处理


出题目的
       1 掌握大、小写互换的技巧
       2 掌握延时输出技巧
       3 掌握字符截取技巧
解题要求
       1 确保代码高效、通用
       2 尽量简洁代码
       3 不生成临时文件
加分规则
       1 思路独特基准分5分
       2 代码高效、通用基准分4分
       3 技巧高超基准分3分
       4 代码简洁基准分2分
       5 完美代码加分15分
题目如下
       有一字符串i like the bathome,because here is the batch of the world.
       要求用批处理将字符串的所有字母转成大写并在屏幕上以打字的效果延
       时输出。
解题限制
       暂无限制
--------------------------------------------------------------------------------------------
      三楼terse兄弟的代码和本人的惊人的相似,只是感觉还是站在前人的肩
膀上,没有多少自己的技术成份,下面给出本人的代码:
  1. @echo off
  2. set "str=i like the bathome,because here is the batch of the world."
  3. set "code=A B C D E F G H I J K L N M O P Q R S T U V W X Y Z"
  4. for %%i in (%code%) do call,set "str=%%str:%%i=%%i%%"
  5. :lp
  6. set /p=%str:~,1%<nul&set "str=%str:~1%"
  7. for /l %%i in (1,1,200) do echo>nul
  8. if defined str goto lp
  9. pause>nul
复制代码


[ 本帖最后由 batman 于 2008-8-13 20:20 编辑 ]
1

评分人数

    • keen: 关键:%%i=%%iPB + 6
***共同提高***

hoho 开个玩笑……

  1. @echo off &setlocal enabledelayedexpansion
  2. color 0a
  3. set hang= i like the batman,because he is the hero of the world.
  4. set /a a=0,b=0
  5. for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  6. set /a a+=1
  7. set n!a!=%%a
  8. )
  9. for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  10. set /a b+=1
  11. call,set zimu=%%n!b!%%
  12. call,set hang=%%hang:%%a=!zimu!%%
  13. )
  14. :a
  15. set /a c+=1
  16. ping -n>nul
  17. set /p=!hang:~%c%,1!<nul
  18. if not "!hang:~%c%,1!"=="" goto :a
  19. echo,
  20. pause
复制代码

[ 本帖最后由 523066680 于 2008-8-13 14:55 编辑 ]

TOP

  1. @echo off&setlocal EnableDelayedExpansion
  2. set "str=i like the bathome,because here is the batch of the world."
  3. for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set str=!str:%%i=%%i!
  4. :lp
  5. set/p=!str:~%n%,1!<nul
  6. set/a n+=1
  7. for /l %%j in (1,1,500) do ver>nul
  8. if not "!str:~%n%,1!"=="" goto lp
  9. pause>nul
复制代码
2

评分人数

TOP

耶?………………………………………………无语,你太英明了!
我得练多两年
(可惜我只有两分可以加别人,嘿嘿 不过两分也是分)

[ 本帖最后由 523066680 于 2008-8-13 14:51 编辑 ]

TOP

^_^
心绪平和,眼藏静谧。

TOP

支持一题多解,大家继续。

[ 本帖最后由 batman 于 2008-8-13 16:35 编辑 ]
***共同提高***

TOP

原帖由 523066680 于 2008-8-13 14:37 发表

hoho 开个玩笑……

下次不可再开这样的玩笑,不然扣分!!!
***共同提高***

TOP

事实上我有想到一些题目 但不敢拿来放,觉得---累
我一直都是一个懒散的人,或许批处理会改变我,我在尝试改变,现在,还不是时候
我的基础 还不够好


这道题 依然想象着用echo,I LIKE……告终 呵呵,题目的限制就在这里了

呵呵 我还是想想别的吧 觉得3楼的应该是比较好的方法了。

[ 本帖最后由 523066680 于 2008-8-13 17:21 编辑 ]

TOP

我总是赶不上潮流
我写两个
  1. @echo off&setlocal enabledelayedexpansion
  2. set "SmallNum=i like the bathome,because here is the batch of the world"
  3. set "ChangeSmallNum=%SmallNum% "
  4. set "BigNum=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
  5. :lp
  6. set frist=%SmallNum:~,1%
  7. for %%i in (%BigNum%) do (
  8.    for /l %%m in (1 1 5) do (for %%x in (a b c d e f) do color %%x)
  9.   if /i "%frist%"=="%%i" set /p=%%i<nul
  10. )
  11. if "%frist%"=="," set /p=,<nul
  12. if "%frist%"==" " set /p= <nul
  13. set SmallNum=%SmallNum:~1%
  14. if defined SmallNum goto :lp
  15. pause>nul
复制代码
  1. @echo off&setlocal enabledelayedexpansion&color 5c
  2. set "SmallNum=i like the bathome,because here is the batch of the world"
  3. set "ChangeSmallNum=%SmallNum% "
  4. set "BigNum=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
  5. for %%i in (%BigNum%) do (
  6. set ChangeSmallNum=!ChangeSmallNum:%%i=%%i!
  7. )
  8. ::echo %SmallNum%
  9. ::echo %ChangeSmallNum%
  10. :lp
  11. for /l %%m in (1 1 5) do (for %%x in (a b c d e f) do color %%x)
  12. set Frist=%ChangeSmallNum:~,1%
  13. set ChangeSmallNum=%ChangeSmallNum:~1%
  14. if defined ChangeSmallNum set /p=%Frist%<nul&ping -n 1. localhost >nul &goto :lp
  15. pause>nul
复制代码
1

评分人数

TOP

回复 1楼 的帖子

.......call set "str=%%str:%%i=%%i%%"....
不明白百分号如何识别和处理的。不是从左至右么?那么%str:%%应该被识别为变量,然后语义就不对了,这里如何识别是要替换字符呢?还有为什么%%i=%%i就可以替换为大写呢?批处理中不是区分大小写的么?
Still with wax

TOP

回复 10楼 的帖子

call set "str=%%str:%%i=%%i%%"
是从左往右,所以预处理后这里的三对百分号都相应地变为了单个:
call set "str=%str:%i=%i%"
然后再执行以上命令

变量替换时不区分大小写,但写的是大写就会替换成大写...

TOP

回复 11楼 的帖子

多谢回复,第二个问题算是清楚了。但是%和(不一样,%是找就近的配对,而(的原理不一样,是通过压栈结构识别的,配对最远的。“%%str:%%i=%%i%%”这样的形式应该会报错才对啊。
Still with wax

TOP

本帖最后由 老刘1号 于 2017-6-17 14:58 编辑

用8086写的最后一道练习题
相关:http://www.bathome.net/redirect.php?goto=findpost&ptid=43372&pid=200443
延时就不搞了
用法 UPPER_Case.CMD Hollo World!
  1. %老刘制作——字符串转大写(只改动英文字母)%
  2. %由于DOS子系统的限制,汉字将会丢失,变作两个英文问号%
  3. @Echo off
  4. IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
  5. Echo DEBUG和8086_ASM不支持64位的系统。
  6. Pause&Exit
  7. )
  8. IF "%*" NEQ "" (Set "Str=%*") Else GOTO :EOF
  9. For /F "DELIMS=" %%. in (
  10. '^(Echo E 20:0 "%Str:"=%",0^&MORE +18 "%~0"^)^|DEBUG'
  11. ) Do (
  12. IF "%%." NEQ "Program terminated normally" (
  13. Set "转换后字符=%%."
  14. ) Else (
  15. CALL ECHO %%转换后字符%%
  16. GOTO :EOF
  17. )
  18. )
  19. R DS
  20. 20
  21. R AX
  22. 200
  23. A 100
  24. ;汇编代码开始——————————————
  25. MOV DL,[BX] ;得到BX指向字符的Ascii码
  26. CMP DL,00 ;检测是否为字符串末端
  27. JE 11B ;如果为末端,跳到INT指令处退出
  28. ;分割————————————————————
  29. CMP DL,61 ;检测是否是小写字母
  30. JB 114
  31. CMP DL,7A
  32. JA 114
  33. ;分割————————————————————
  34. AND DL,5F ;转换为大写字符
  35. INT 21H ;显示字符
  36. INC BX ;BX指向下一个字符
  37. JMP 100 ;循环读取
  38. ;分割————————————————————
  39. MOV AH,0 ;退出
  40. INT 20H
  41. ;汇编代码结束——————————————
  42. ;注意:下方的空行不能移除
  43. G
  44. Q
  45. 老刘制作~
复制代码

TOP

返回列表