标题: 【练习-013】将字符串小写转大写并延时输出的批处理 [打印本页]
作者: batman 时间: 2008-8-13 10:05 标题: 【练习-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兄弟的代码和本人的惊人的相似,只是感觉还是站在前人的肩
膀上,没有多少自己的技术成份,下面给出本人的代码:- @echo off
- set "str=i like the bathome,because here is the batch of the world."
- 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"
- for %%i in (%code%) do call,set "str=%%str:%%i=%%i%%"
- :lp
- set /p=%str:~,1%<nul&set "str=%str:~1%"
- for /l %%i in (1,1,200) do echo>nul
- if defined str goto lp
- pause>nul
复制代码
[ 本帖最后由 batman 于 2008-8-13 20:20 编辑 ]
作者: 523066680 时间: 2008-8-13 14:37 标题: hoho 开个玩笑……
- @echo off &setlocal enabledelayedexpansion
- color 0a
- set hang= i like the batman,because he is the hero of the world.
- set /a a=0,b=0
- 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 (
- set /a a+=1
- set n!a!=%%a
- )
- 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 (
- set /a b+=1
- call,set zimu=%%n!b!%%
- call,set hang=%%hang:%%a=!zimu!%%
- )
-
- :a
- set /a c+=1
- ping -n>nul
- set /p=!hang:~%c%,1!<nul
- if not "!hang:~%c%,1!"=="" goto :a
- echo,
- pause
复制代码
[ 本帖最后由 523066680 于 2008-8-13 14:55 编辑 ]
作者: terse 时间: 2008-8-13 14:37
- @echo off&setlocal EnableDelayedExpansion
- set "str=i like the bathome,because here is the batch of the world."
- 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!
- :lp
- set/p=!str:~%n%,1!<nul
- set/a n+=1
- for /l %%j in (1,1,500) do ver>nul
- if not "!str:~%n%,1!"=="" goto lp
- pause>nul
复制代码
作者: 523066680 时间: 2008-8-13 14:47
耶?………………………………………………无语,你太英明了!
我得练多两年
(可惜我只有两分可以加别人,嘿嘿 不过两分也是分)
[ 本帖最后由 523066680 于 2008-8-13 14:51 编辑 ]
作者: pusofalse 时间: 2008-8-13 15:50
^_^
作者: batman 时间: 2008-8-13 16:28
支持一题多解,大家继续。
[ 本帖最后由 batman 于 2008-8-13 16:35 编辑 ]
作者: batman 时间: 2008-8-13 16:33
原帖由 523066680 于 2008-8-13 14:37 发表
hoho 开个玩笑……
下次不可再开这样的玩笑,不然扣分!!!
作者: 523066680 时间: 2008-8-13 16:52
事实上我有想到一些题目 但不敢拿来放,觉得---累
我一直都是一个懒散的人,或许批处理会改变我,我在尝试改变,现在,还不是时候
我的基础 还不够好
这道题 依然想象着用echo,I LIKE……告终 呵呵,题目的限制就在这里了
呵呵 我还是想想别的吧 觉得3楼的应该是比较好的方法了。
[ 本帖最后由 523066680 于 2008-8-13 17:21 编辑 ]
作者: huahua0919 时间: 2008-8-14 13:21
我总是赶不上潮流
我写两个- @echo off&setlocal enabledelayedexpansion
- set "SmallNum=i like the bathome,because here is the batch of the world"
- set "ChangeSmallNum=%SmallNum% "
- 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"
- :lp
- set frist=%SmallNum:~,1%
- for %%i in (%BigNum%) do (
- for /l %%m in (1 1 5) do (for %%x in (a b c d e f) do color %%x)
- if /i "%frist%"=="%%i" set /p=%%i<nul
- )
- if "%frist%"=="," set /p=,<nul
- if "%frist%"==" " set /p= <nul
- set SmallNum=%SmallNum:~1%
- if defined SmallNum goto :lp
- pause>nul
复制代码
- @echo off&setlocal enabledelayedexpansion&color 5c
- set "SmallNum=i like the bathome,because here is the batch of the world"
- set "ChangeSmallNum=%SmallNum% "
- 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"
- for %%i in (%BigNum%) do (
- set ChangeSmallNum=!ChangeSmallNum:%%i=%%i!
- )
- ::echo %SmallNum%
- ::echo %ChangeSmallNum%
- :lp
- for /l %%m in (1 1 5) do (for %%x in (a b c d e f) do color %%x)
- set Frist=%ChangeSmallNum:~,1%
- set ChangeSmallNum=%ChangeSmallNum:~1%
- if defined ChangeSmallNum set /p=%Frist%<nul&ping -n 1. localhost >nul &goto :lp
- pause>nul
复制代码
作者: Lumiere 时间: 2009-7-31 13:05 标题: 回复 1楼 的帖子
.......call set "str=%%str:%%i=%%i%%"....
不明白百分号如何识别和处理的。不是从左至右么?那么%str:%%应该被识别为变量,然后语义就不对了,这里如何识别是要替换字符呢?还有为什么%%i=%%i就可以替换为大写呢?批处理中不是区分大小写的么?
作者: tireless 时间: 2009-7-31 14:34 标题: 回复 10楼 的帖子
call set "str=%%str:%%i=%%i%%"
是从左往右,所以预处理后这里的三对百分号都相应地变为了单个:
call set "str=%str:%i=%i%"
然后再执行以上命令
变量替换时不区分大小写,但写的是大写就会替换成大写...
作者: Lumiere 时间: 2009-7-31 15:38 标题: 回复 11楼 的帖子
多谢回复,第二个问题算是清楚了。但是%和(不一样,%是找就近的配对,而(的原理不一样,是通过压栈结构识别的,配对最远的。“%%str:%%i=%%i%%”这样的形式应该会报错才对啊。
作者: 老刘1号 时间: 2017-6-17 14:48
本帖最后由 老刘1号 于 2017-6-17 14:58 编辑
用8086写的最后一道练习题
相关:http://www.bathome.net/redirect.php?goto=findpost&ptid=43372&pid=200443
延时就不搞了
用法 UPPER_Case.CMD Hollo World!- %老刘制作——字符串转大写(只改动英文字母)%
- %由于DOS子系统的限制,汉字将会丢失,变作两个英文问号%
- @Echo off
- IF /i "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" (
- Echo DEBUG和8086_ASM不支持64位的系统。
- Pause&Exit
- )
- IF "%*" NEQ "" (Set "Str=%*") Else GOTO :EOF
- For /F "DELIMS=" %%. in (
- '^(Echo E 20:0 "%Str:"=%",0^&MORE +18 "%~0"^)^|DEBUG'
- ) Do (
- IF "%%." NEQ "Program terminated normally" (
- Set "转换后字符=%%."
- ) Else (
- CALL ECHO %%转换后字符%%
- GOTO :EOF
- )
- )
- R DS
- 20
- R AX
- 200
- A 100
- ;汇编代码开始——————————————
- MOV DL,[BX] ;得到BX指向字符的Ascii码
- CMP DL,00 ;检测是否为字符串末端
- JE 11B ;如果为末端,跳到INT指令处退出
- ;分割————————————————————
- CMP DL,61 ;检测是否是小写字母
- JB 114
- CMP DL,7A
- JA 114
- ;分割————————————————————
- AND DL,5F ;转换为大写字符
- INT 21H ;显示字符
- INC BX ;BX指向下一个字符
- JMP 100 ;循环读取
- ;分割————————————————————
- MOV AH,0 ;退出
- INT 20H
- ;汇编代码结束——————————————
- ;注意:下方的空行不能移除
-
- G
- Q
- 老刘制作~
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |