Board logo

标题: 【练习-039】批处理输出设定范围内的字母 [打印本页]

作者: batman    时间: 2009-2-28 11:57     标题: 【练习-039】批处理输出设定范围内的字母

出题目的:
  掌握将常量字符转划成数字变量的方法
  掌握随机取值的方法
加分规则:
  满分10分,视情形加分(以思路为重)
解题限制:
  此题仅限普通会员作答,技术组和管理层可做解题指导,如贴出代码,则法不容情
题目如下:
  编写批处理代码,当使用者输入1-26(因为字母有26个)间的任意一个数后,程序在
26个字母中再随机生成一个不等于输入位序上字母的字母(a-z的位序为1-26),最后程序
将这两个字母中的所有字母在一行内列出,示例如下:
  1. 请输入1-26中的任意一个数值:18
  2. g和r之间的字母是:hijklmnopq
复制代码
给出参考答案如下:
  1. @echo off
  2. set "code=abcdefghijklmnopqrstuvwxyz"
  3. set /p input=请输入1-26内的任意数值:
  4. :lp
  5. set /a _random=%random%%%26+1,a=_random-input
  6. if "%a:-=%" lss "2" goto lp
  7. if %_random% gtr %input% (
  8.    set /a a=input,b=27-_random,c=a-1,d=_random-1
  9.    ) else (
  10.    set /a a=_random,b=27-input,c=a-1,d=input-1
  11. )
  12. call,set /p=%%code:~%c%,1%%和%%code:~%d%,1%%间的字母是:%%code:~%a%,-%b%%%<nul
  13. pause>nul
复制代码


[ 本帖最后由 batman 于 2009-4-9 00:15 编辑 ]
作者: irresolute    时间: 2009-2-28 13:05     标题: 我也来试试

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "line=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"
  4. for %%i in (!line!) do (set /a n+=1 & set _!n!=%%i)
  5. set /a aa=%random%%%26+1
  6. set /p bb=请输入一个0--26之间的随机数
  7. if !aa! leq !bb! (
  8. for /l %%i in (!aa!,1,!bb!) do set /p =!_%%i! <nul
  9. ) else (
  10. for /l %%i in (!bb!,1,!aa!) do set /p =!_%%i! <nul
  11. )
  12. pause>nul
复制代码

作者: batman    时间: 2009-2-28 16:18

楼上的代码还有两个问题:
  一、会出现aa等于bb的情况,这样没有中间的字母可列。
  二、没有显示出由输入数确定的字母以及系统随机选择的字母。
程序运行的结果应该如下:
  1. 请输入1-26中的任意一个数值:3
  2. c和w之间的字母是:defghijklmnopqrstuv
复制代码

作者: 523066680    时间: 2009-2-28 16:47

你再也没给我加过分~     俺做题来了

@echo off
set a=abcdefghijklmnopqrstuvwxyz
set /p inp="输入一个1~26内的数字: "
if %inp% gtr 13 (set /a inp=26-inp-1)
set /a left=inp-1
call,echo,%%a:~%left%,1%% 和 %%a:~-%inp%,1%% 之间的字符是: %%a:~%inp%,-%inp%%%
pause



啊 好象不对  上网时间到了~ 闪

我自己算了算   1楼的 输入 18  应该是 g和t 对应~


哈哈  原来是我没看清题意,  当是个错误示范   扣个分吧~

[ 本帖最后由 523066680 于 2009-2-28 17:14 编辑 ]
作者: irresolute    时间: 2009-2-28 20:29     标题: 再来试试

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "line=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"
  4. for %%i in (!line!) do (set /a n+=1 & set _!n!=%%i)
  5. set /a aa=%random%%%26+1
  6. set /p bb=请输入一个1-26之间的随机数:
  7. if !aa! lss !bb! (set cc=!aa!&set aa=!bb!&set bb=!cc!)
  8. set /a cc=%aa%-%bb%
  9. call set /p=%%_%bb%%%和<nul & call set /p=%%_%aa%%%之间的字母是:<nul
  10. if %cc%==0  (set /p=空<nul) else (
  11. if %cc%==1 (set /p=空<nul) else (
  12.   set /a a2=!aa!-1
  13.   set /a b2=!bb!+1
  14.   for /l %%i in (!b2!,1,!a2!) do set /p =!_%%i! <nul
  15. )
  16. )
  17. echo.
  18. pause>nul
复制代码

作者: BBCC    时间: 2009-2-28 22:16

  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. set "var= abcdefghijklmnopqrstuvwxyz"
  4. set /p Get_var=
  5. set bc=%random%%random%%random%
  6. set count=1
  7. :Count
  8.     if %count% lss 27 (
  9.         if "!var:~%count%,1!" equ "!Get_var!" set /a Num1=count
  10.         set /a count+=1
  11.         goto :Count
  12.         )
  13.     set/p,=!Num1! <nul
  14. :GetRan
  15.     set /a Ran=%random%%%26+1
  16.     set/p,=!Ran!<nul
  17.     set /a Tem=Ran-Num1
  18.     if %Tem% lss 0 (set /a n1=Ran+1,n2=Num1-Ran-1) else (if %Tem% gtr 0 (set /a n1=Num1+1,n2=Tem-1) else (goto :GetRan))
  19. :Print
  20.     echo. !var:~%n1%,%n2%!
复制代码
看似简单,其实有点难度...
在获取输入字母的编号时是不是还有什么好方法呢?
嗯...搞了那么久原来搞复杂了...囧.

[ 本帖最后由 BBCC 于 2009-2-28 22:26 编辑 ]
作者: batman    时间: 2009-2-28 22:37

楼上的代码有问题:
    一、没有按要求列出根据输入值得出的字母及程序随机选择的字母
    二、程序运行的结果是!var:~,%n%!(n为程序随机取得的数值)
    三、最后少了pause导致双击就会一闪而过
    四、代码书写不规范,嵌套时应进行代码缩进
    五、代码复杂了
作者: BBCC    时间: 2009-2-28 22:45

re 7
一: 的确是我理解错了题意(我是键入字母)
二:因为理解错的原因所以会有这种结果
三:我是一个cli,一般都是直接在cmd里调用的...所以不加pause
四:是的,那里没怎么改好
五:还是因为一的原因...
作者: terse    时间: 2009-2-28 22:51

for /l 好用不呢
还是直接截位吧

[ 本帖最后由 terse 于 2009-2-28 22:57 编辑 ]
作者: 523066680    时间: 2009-3-1 09:33

楼主的代码输入18的时候……

请输入1-26内的任意数值:18
j和z间的字母是:klmnopq


1   该是xx与r之间的
2   即使是z  之间的 rstuvw哪去了?  

谁叫你没鸟我?我就来找漏洞~

[ 本帖最后由 523066680 于 2009-3-1 09:42 编辑 ]
作者: batman    时间: 2009-3-1 12:05

原帖由 523066680 于 2009-3-1 09:33 发表
楼主的代码输入18的时候……



1   该是xx与r之间的
2   即使是z  之间的 rstuvw哪去了?  

谁叫你没鸟我?我就来找漏洞~

呵呵,是改代码时写错一个字符,有一个input写成了_input,感谢兄弟指出,已改正。
作者: BBCC    时间: 2009-3-1 16:32

再来一个
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. set "var=abcdefghijklmnopqrstuvwxyz"
  4. set /p Input=Enter a number
  5. :Get_Ran
  6.     set /a Ran=%random%%%26+1
  7.     set/p,=%Input% %Ran%<nul
  8.     if %Ran% equ %Input% goto :Get_Ran
  9.     if %Ran% lss %Input% (
  10.         set /a N1=%Ran%,N2=%Input%-%Ran%-1
  11.         ) else (
  12.         set /a N1=%Input%,N2=%Ran%-%Input%-1
  13.         )
  14. :Print
  15.     echo. !var:~%N1%,%N2%!
  16.     pause>nul
复制代码

作者: batman    时间: 2009-3-1 17:56

一、楼上的没有将输入的数值转化为字母并和程序随机选择的字母一起输出
二、同时没有考虑对当两个字母为c d中间无字母的情况的判断和筛选

[ 本帖最后由 batman 于 2009-3-1 23:43 编辑 ]
作者: shqf    时间: 2009-3-1 22:41

楼主,你的代码中for 一句好象多余了呀,去掉,直接set "code=abcdefghijklmnopqrstuvwxyz"就可行了吧。
作者: batman    时间: 2009-3-1 23:12

最近老是搞错,可能真的是老糊涂了。。。

[ 本帖最后由 batman 于 2009-3-1 23:44 编辑 ]
作者: shqf    时间: 2009-3-1 23:35

可_!n!的变量后面楼主你没有用到呵,因你后面用的是变量截取的方法。
不过,字母常量和数字变量一一对应的思路也不错,试编一个:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "codes=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"
  3. for %%a in (%codes%) do set /a n+=1&set "_!n!=%%a"
  4. set /p input=请输入1-26内的任意数值:
  5. :lp
  6. set /a _random=%random%%%26+1,a=_random-input
  7. if "%a:-=%" lss "2" goto lp
  8. if %_random% lss %input% (set temp=%input%&set input=%_random%&set _random=!temp!)
  9. set /a a=input+1,b=_random-1
  10. set /p=!_%input%!至!_%_random%!间的字母是:<nul
  11. for /l %%a in (%a%,1,%b%) do (set /p=!_%%a!<nul)
  12. pause>nul
复制代码

[ 本帖最后由 shqf 于 2009-3-1 23:36 编辑 ]
作者: batman    时间: 2009-3-1 23:46

原帖由 shqf 于 2009-3-1 23:35 发表
可_!n!的变量后面楼主你没有用到呵,因你后面用的是变量截取的方法。
不过,字母常量和数字变量一一对应的思路也不错,试编一个:@echo off&setlocal enabledelayedexpansion
set "codes=a b c d e f g h i j k ...

兄弟你说得对,是我搞糊涂了,我最开始就是写的你一样的代码,后来改的时候居然忘记不要将常量和数字变量对应了(后面原确是用的字符截取

作者: 523066680    时间: 2009-3-7 16:44

现在来回贴  还有人看么?
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=abcdefghijklmnopqrstuvwxyz
  3. set /p inp="[1-26] : "
  4. set /a ran=%random%%%25+1
  5. if %ran% equ %inp% set /a ran=26
  6. if %ran% gtr %inp% set /a i=ran,ran=inp,inp=i
  7. set /a ran-=1,inp-=ran
  8. set str=!str:~%ran%,%inp%!
  9. if "%str:~1,-1%"=="" (set ecx=空) else (set ecx=%str:~1,-1%)
  10. echo,%str:~0,1% 与 %str:~-1% 之间的符号为 %ecx%
  11. pause
复制代码

[ 本帖最后由 523066680 于 2009-3-8 13:12 编辑 ]
作者: 523066680    时间: 2009-3-8 12:59

我不写特效 我写什么? 写这个都没人鸟我~
Just for PB

[ 本帖最后由 523066680 于 2009-3-8 14:42 编辑 ]




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2