找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29386|回复: 12

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

[复制链接]
发表于 2008-8-13 10:05:59 | 显示全部楼层 |阅读模式

出题目的
       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 编辑 ]

评分

参与人数 1PB +6 收起 理由
keen + 6 关键:%%i=%%i

查看全部评分

发表于 2008-8-13 14:37:08 | 显示全部楼层

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 编辑 ]
发表于 2008-8-13 14:37:44 | 显示全部楼层
  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
复制代码

评分

参与人数 2PB +11 收起 理由
batman + 9 除了思路独特,其他要求都满足了。
523066680 + 2

查看全部评分

发表于 2008-8-13 14:47:33 | 显示全部楼层
耶?………………………………………………无语,你太英明了!
我得练多两年
(可惜我只有两分可以加别人,嘿嘿 不过两分也是分)

[ 本帖最后由 523066680 于 2008-8-13 14:51 编辑 ]
发表于 2008-8-13 15:50:41 | 显示全部楼层
^_^
 楼主| 发表于 2008-8-13 16:28:01 | 显示全部楼层
支持一题多解,大家继续。

[ 本帖最后由 batman 于 2008-8-13 16:35 编辑 ]
 楼主| 发表于 2008-8-13 16:33:56 | 显示全部楼层
原帖由 523066680 于 2008-8-13 14:37 发表

hoho 开个玩笑……

下次不可再开这样的玩笑,不然扣分!!!
发表于 2008-8-13 16:52:50 | 显示全部楼层
事实上我有想到一些题目 但不敢拿来放,觉得---累
我一直都是一个懒散的人,或许批处理会改变我,我在尝试改变,现在,还不是时候
我的基础 还不够好


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

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

[ 本帖最后由 523066680 于 2008-8-13 17:21 编辑 ]
发表于 2008-8-14 13:21:27 | 显示全部楼层
我总是赶不上潮流
我写两个
  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
复制代码

评分

参与人数 1PB +2 收起 理由
523066680 + 2

查看全部评分

发表于 2009-7-31 13:05:27 | 显示全部楼层

回复 1楼 的帖子

.......call set "str=%%str:%%i=%%i%%"....
不明白百分号如何识别和处理的。不是从左至右么?那么%str:%%应该被识别为变量,然后语义就不对了,这里如何识别是要替换字符呢?还有为什么%%i=%%i就可以替换为大写呢?批处理中不是区分大小写的么?
发表于 2009-7-31 14:34:37 | 显示全部楼层

回复 10楼 的帖子

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

变量替换时不区分大小写,但写的是大写就会替换成大写...
发表于 2009-7-31 15:38:39 | 显示全部楼层

回复 11楼 的帖子

多谢回复,第二个问题算是清楚了。但是%和(不一样,%是找就近的配对,而(的原理不一样,是通过压栈结构识别的,配对最远的。“%%str:%%i=%%i%%”这样的形式应该会报错才对啊。
发表于 2017-6-17 14:48:52 | 显示全部楼层
本帖最后由 老刘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. 老刘制作~
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:18 , Processed in 0.026886 second(s), 10 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表