标题: 【练习-067】批处理2012的基础练习 [打印本页]
作者: batman 时间: 2012-2-17 11:28 标题: 【练习-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变量换成其他数值运行下)- @echo off&setlocal enabledelayedexpansion
- set /a number=2012
- rem 计算字符串长度(9位以内)
- set "str=%number%987654321"&set "str=!str:~9!"
- set /a counter=%str:~,1%-1
- echo 题目1&echo,
- echo 分行输出
- for /l %%a in (0,1,%counter%) do echo !number:~%%a,1!&set /a total+=!number:~%%a,1!
- echo 不换行输出
- for /l %%a in (0,1,%counter%) do set /p=!number:~%%a,1!<nul
- echo,
- echo 倒序输出
- for /l %%a in (%counter%,-1,0) do set /p=!number:~%%a,1!<nul
- echo,&echo,
- echo 题目2&echo,
- echo %number%数值%str:~,1%位数相加的和为%total%
- echo,
- echo 题目3&echo,
- echo 下面这种随机生成效率相当低还有可能因超出cmd计算上限而退出
- :lp
- set /a n+=1
- if %random% neq %number% goto lp
- echo 随机了%n%次生成%number%
- echo,&set /a min=0
- echo 题目4&echo,
- echo 下面这种随机生成效率较高
- for /l %%a in (1,1,%number%) do (
- set /a "rand=min+(!random!%%(number-min+1))"
- echo !rand!
- if !rand! equ %number% echo 随机了%%a次生成!rand!&echo,&goto :next
- if !rand! gtr !min! set /a min=rand
- )
- :next
- echo 题目5&echo,
- rem 因为开启变量延迟后!会被当做逃逸字符被脱去使得下面闰年判断命令出错
- endlocal&set "number=%number%"&set "counter=%counter%"
- set /a "yp=!(%number%%%4)^!(%number%%%100)|!(%number%%%400)"
- if %yp% equ 1 (
- echo %number%年为闰年
- ) else (
- echo %number%年为平年
- )
- echo,&setlocal enabledelayedexpansion
- echo 题目6&echo,
- set /a _2=28+yp,month_days=31
- for %%a in (1 3 5 7 8 10 12 4 6 9 11) do (
- if %%a equ 4 set /a month_days-=1
- set /a _%%a=month_days
- )
- (for /l %%a in (1,1,12) do (
- for /l %%b in (1,1,!_%%a!) do echo %number%年%%a月%%b日
- ))>%number%.txt
- echo %number%年所有的日期已输入%number%_date.txt
- echo,
- echo 题目7&echo,
- for %%a in (xls word txt pdf gpg) do >%number%.%%a echo 2012 0&echo %number%.%%a文件已生成
- echo,
- echo 题目8&echo,
- for %%a in (零0 一1 二2 三3 四4 五5 六6 七7 八8 九9) do (
- set "str=%%a"
- set "_!str:~1,1!=!str:~,1!"
- )
- for /l %%a in (0,1,%counter%) do (
- set "str=!number:~%%a,1!"
- for %%b in (!str!) do set /p=!_%%b!<nul
- )
- echo,&echo,
- echo 题目9&echo,
- set /a counter=0
- (for /l %%a in (1,1,%number%) do (
- set "str=%%a"&set "input="
- for %%a in (10 100 1000) do if %%a equ !str! set /a counter+=1
- for /l %%a in (0,1,!counter!) do (
- set "var=!str:~%%a,1!"
- for %%b in (!var!) do set "input=!input!!_%%b!"
- if %%a equ 0 (
- if !counter! equ 1 set "input=!input!十"
- if !counter! equ 2 set "input=!input!百"
- if !counter! equ 3 set "input=!input!千"
- )
- if %%a equ 1 (
- if !counter! equ 2 set "input=!input!十"
- if !counter! equ 3 set "input=!input!百"
- )
- if %%a equ 2 if !counter! equ 3 set "input=!input!十"
- )
- for %%a in (十零-十 零十-零 零百零-零 零百-零) do (
- for /f "tokens=1,2 delims=-" %%b in ("%%a") do set "input=!input:%%b=%%c!"
- )
- if "!input:~-2!" equ "百零" set "input=!input:百零=百!"
- if "!input:~-2!" equ "千零" set "input=!input:千零=千!"
- echo !input!
- ))>%number%_汉字.txt
- echo 1至%number%间的数值已全转换为汉语数值并输入到%number%_汉字.txt中
- echo,
- echo 题目10&echo,
- rem 运行时请将下面的tab的值改为实际的tab
- set "tab= "
- for /f "delims=:" %%a in ('findstr "::" %0') do (
- set "str=%%a"
- if "!str:~,1!" neq "f" (
- for /l %%a in (0,1,20) do (
- set /p=!str:~%%a,1!<nul
- for /l %%b in (1,1,500) do ver>nul
- )
- )
- echo,&echo,
- )
- pause>nul
- :: 2012年注定是个不平凡之年
- :: 她是传说中的世界末日
- :: 她也是批处理之家发展的第六个年头
- :: 我们将在2012年迎来盛大的伦敦奥运
- :: 而对于我,2012年更是不寻常
- :: 因为今年是小女儿的第一个本命年
- :: 也是她迈入初中的紧张之年
- :: 在此,我衷心祝愿:
- :: 批处理之家!tab!红红火火 蒸蒸日上
- :: 中华健儿!tab!英姿飒爽 再创辉煌
- :: 小女儿!tab!快乐成长 学业有成
- :: 全世界!tab!和平安祥 再无战荒
复制代码
作者: 594850072 时间: 2012-2-17 11:32
本帖最后由 594850072 于 2012-2-17 11:56 编辑
思考中 留待编辑
Q1:- @echo off
- for %%i in (2 0 1 2) do echo %%i
- for /f "delims= tokens=1-4" %%i in ("2 0 1 2") do echo %%i %%j %%k %%l
- pause
复制代码
Q2:
Q3:
Q4:
Q5:
Q6:
Q7:- for %%i in (xls word txt pdf gpg) do echo "2012 0">2012.%%i
复制代码
Q8:
Q9:
Q10:
作者: 小胖狐狸 时间: 2012-2-17 11:38
本帖最后由 小胖狐狸 于 2012-2-20 20:24 编辑
把题目看完才知道好几题都不会做啊,捡会做的做一下 :)
1、在屏幕上分别分行和同行输出2012字符串的2 0 1 2四个字符以及反序输出(在这里要将2012视为不可知数值)- @echo off&setlocal enabledelayedexpansion
- set /p var=请输入四个字符(如2012):
- set v5=%var:~4,1%
- echo.
- if defined v5 echo 警告:输入超出4个字符,只显示前4个字符;&echo.
- :4Rows
- echo 分行输出(%var:~,4%):
- for %%i in (0 1 2 3) do echo !var:~%%i,1!
- echo.
-
- :1Row
- echo 单行输出(%var:~,4%):
- echo %var:~,4%
- echo.
-
- :Reverse
- echo 反序输出(%var:~,4%):
- echo %var:~3,1%%var:~2,1%%var:~1,1%%var:~,1%
-
- pause
复制代码
2、计算2012字符串四个数值的和(在这里要将2012视为不可知数值- @echo off
- setlocal enabledelayedexpansion
-
- set /p var=请输入计算各位数之和的四位数字(如2012):
- set v5=%var:~4,1%
- echo.
- if defined v5 echo 警告:输入超出4个字符,只操作前4个字符;&echo.
-
- set var4=%var:~,4%
- set /a sum=%var4%/1000+((%var4%%%1000)/100)+((%var4%%%100)/10)+((%var4%%%10)/1)
-
- echo 四位数 %var4% 之和为 :%sum%
复制代码
3、利用random生成2012,并计算random的次数- @echo off
- set count=1
- set target=2012
- set /a mo=%target%+1
-
- :loop
- set /a var=%random%%%%mo%
- if not %var% == %target% (
- set /a count=%count%+1
- goto :loop
- )
- echo var = %var% 随机次数为:%count%
复制代码
4、利用random生成2012,并保证每次使用最少的random次数(近渐法)- @echo off
- set count=1
- set target=2012
- set target2=0
- set /a mo=%target%+1
-
- :loop
- set /a var=%random%%%%mo%
- set /a target2=%target2%+%var%
- echo 当前值:%target2%
- if not %target2% == %target% (
- set /a count=%count%+1
- set /a mo=%mo%-%var%
- goto :loop
- )
- echo 最后一次随机值 = %var% 随机次数为:%count%
复制代码
5、证明2012年是闰年(在这里要将2012视为不可知数值)- @echo off
- set t=%time%
- set target=2012
- set /a n400=%target%%%400
- set /a n4=%target%%%4
- set /a n100=%target%%%100
- if %n400% == 0 (echo %target% 是闰年&goto :eof)
- if %n4% == 0 if not %n100% == 0 ( echo %target% 是闰年&goto :eof )
- echo %target% 不是闰年
复制代码
6、输出2012年所有的日期
7、分别生成以2012命名的xls word txt pdf gpg的文件并在里面输入“2012 0”字符
8、将2012转换成二零一二(在这里要将2012视为不可知数值)
9、将1-2012之间的数值全转换成中文数值,如2001转换成二千零一
10、写出一段关于2012年的感想或祝福,并在屏幕上逐字逐行延时输出
作者: ivor 时间: 2012-2-17 12:37
本帖最后由 ivor 于 2012-2-18 17:10 编辑
3_2.- @echo off & setlocal enabledelayedexpansion
- for /l %%a in (1,1,10000000) do (
- if !random! EQU 2012 echo 运行了%%a次 && pause
-
- )
复制代码
5.- @echo off
- set /p year=输入一个年份:
- set /a run1=%year% %% 3200
- set /a run2=%year% %% 172800
- set /a run3=%year% %% 100
- set /a run4=%year% %% 400
- set /a run5=%year% %% 4
- if %run1% equ 0 if %run2% equ 0 echo 闰年 & pause & exit
- if %run3% equ 0 if %run4% equ 0 echo 闰年 & pause & exit
- if %run5% equ 0 echo 闰年 & pause & exit
- echo 平年
- pause
复制代码
7.- for %%i in (xls word txt pdf gpg) do (echo 2012 0)>2012.%%i
复制代码
8.- @echo off
-
- call :Conver 2213
- call :Conver 2012
-
- :Conver
- setlocal enabledelayedexpansion
- set count=0
- set tem=%1
- set num=零 一 二 三 四 五 六 七 八 九
- for %%a in (%num%) do (
- set !count!=%%a
- set /a count+=1
- )
- echo !%tem:~,1%!!%tem:~1,1%!!%tem:~2,1%!!%tem:~3,1%!
- pause
复制代码
9.- @echo off & setlocal enabledelayedexpansion
- set a=零,一千,二千,三千,四千,五千,六千,七千,八千,九千
- set b=零,一百,二百,三百,四百,五百,六百,七百,八百,九百
- set c=零,一十,二十,三十,四十,五十,六十,七十,八十,九十
- set d=零,一,二,三,四,五,六,七,八,九
- for %%a in (%q%) do (
- for %%b in (%b%) do (
- for %%c in (%s%) do (
- for %%d in (%g%) do (
- if %%a EQU 零 if %%b EQU 零 if %%c EQU 零 echo %%d
- if %%a EQU 零 if %%b EQU 零 if %%c NEQ 零 echo %%c%%d
- if %%a EQU 零 if %%b NEQ 零 echo %%b%%c%%d
- if %%a NEQ 零 echo %%a%%b%%c%%d
- set /a count+=1
- if !count! EQU 2012 pause
- )
- )
- )
- )
- pause
复制代码
作者: batman 时间: 2012-2-17 20:13
很高兴楼上的几位新人参与训练,待你们的代码更新完毕一并加分(请注意有些代码还是有问题的。。。)
作者: apang 时间: 2012-2-17 20:35
好难哦,好多不会。占位。。。
作者: apang 时间: 2012-2-17 22:10
本帖最后由 apang 于 2012-2-24 10:22 编辑
1- @echo off
- :start
- cls&set/p str=请输入一个4位数:
- if "%str:~,-3%"=="" goto start
- if not "%str:~4%"=="" goto start
- echo 分行输出:&(for /l %%a in (0 1 3) do call echo %%str:~%%a,1%%)
- echo 同行输出:&(for /l %%a in (0 1 3) do call set/p=%%str:~%%a,1%% <nul)
- echo.&echo 反序输出:&(for /l %%a in (3 -1 0) do call set/p=%%str:~%%a,1%%<nul)
- echo.&pause
复制代码
2- @echo off
- :start
- cls&set/p str=请输入一个4位数:
- if "%str:~,-3%"=="" goto start
- if not "%str:~4%"=="" goto start
- for /l %%a in (0 1 3) do call set/a sum+=%%str:~%%a,1%%
- echo 4个数值的和: %sum%&pause
复制代码
3- @echo off
- set n=0&set str=
- call :loop 2 0 1 2
- echo %str%运行了%n%次&pause&exit
-
- :loop
- if "%1"=="" goto :eof
- set/a n+=1&set aa=%random:~-1%
- if "%aa%"=="%1" (set str=%str%%aa%&shift&goto loop) else goto loop
复制代码
4- @echo off
- set n=0
- set min=0&set max=2012
- :loop
- set/a n+=1
- set/a mod=%max%-%min%+1
- set /a str=%random%%%%mod%+%min%
- echo 第%n%次 %str%
- if not "%str%"=="%max%" set min=%str%&goto loop
- pause
复制代码
5- @echo off
- set/p input=请输入年份(如2012):
- set/a "year=!(%input%%%4)&!(!(%input%%%100))|!(%input%%%400)"
- if "%year%"=="1" (echo 闰年) else echo 平年
- pause
复制代码
6- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (1 1 12) do (
- set month=%%a&set day=31
- set/a m=!month!%%2
- if !month! geq 8 (if !m! equ 1 set/a day-=1) else if !m! equ 0 set/a day-=1
- if !month! equ 2 set/a day-=1
- for /l %%b in (1 1 !day!) do set/p=2012/!month!/%%b <nul
- echo.
- )
- pause
复制代码
7- @echo off
- set "str=2012 0"
- for %%a in (xls doc txt pdf jpg) do call echo %%str%%>2012.%%a
复制代码
8- @echo off&setlocal enabledelayedexpansion
- :start
- cls&set/p input=请输入一个4位数:
- if "!input:~,-3!"=="" goto start
- if not "!input:~4!"=="" goto start
- :loop
- for %%i in (1一 2二 3三 4四 5五 6六 7七 8八 9九 0零) do (
- set "var=%%i"
- if "!input:~,1!"=="!var:~,1!" set str=!str!!var:~1,1!&goto shift
- )
-
- :shift
- set "input=!input:~1!"
- if not "!input!"=="" goto loop
- echo !str!
- pause
复制代码
9- @echo off&setlocal enabledelayedexpansion
- set str=&set output=
- echo 正在生成result.txt文件, 请稍候...
- (for /l %%a in (1 1 2012) do (
- set str=%%a
- for %%b in (1一 2二 3三 4四 5五 6六 7七 8八 9九 0零) do (
- set var=%%b&set m=!var:~,1!&set n=!var:~1,1!
- call set str=%%str:!m!=!n!%%
- )
- if "!str:~4!"=="" set output=!str:~,1!千!str:~1,1!百!str:~2,1!十!str:~3,1!
- if "!str:~3!"=="" set output=!str:~,1!百!str:~1,1!十!str:~2,1!
- if "!str:~2!"=="" set output=!str:~,1!十!str:~1,1!
- if "!str:~1!"=="" set output=!str:~,1!
- set output=!output:零百=零!&set output=!output:零十=零!
- set output=!output:零零零=零!&set output=!output:零零=零!
- if "!output:~-1!"=="零" set output=!output:~,-1!
- if "!output:~,1!"=="零" set output=!output:~1!
- if "!output:~,2!"=="一十" set output=!output:~1!
- set/p=!output! <nul
- ))>result.txt
复制代码
10- @echo off&setlocal enabledelayedexpansion
- set "str1=2012年,祝愿大家:"
- set "str2=天天好心情!"
- set "str3=事事随心愿!"
- for /l %%a in (1 1 3) do set n=0&set str=!str%%a!&call :loop
- echo.&pause
-
- :loop
- if "!str:~%n%!"=="" echo.&goto :eof
- set/p=!str:~%n%,1!<nul&set/a n+=1
- for /l %%b in (1 1 500) do echo %%b>nul
- goto loop
复制代码
做完了,交差 。。。
作者: find 时间: 2012-2-17 23:37
楼主在每个要求下面给个例子行吗?只看文字描述容易产生歧义啊
作者: batman 时间: 2012-2-18 11:19
回复 8# find
我想这些题目应该还不要举例说明吧,个人对自己的文字描述能力还是有一点信心的,如兄弟对题目中哪一点描述不明白,也可以跟帖提问啊,本来论坛就需要这个“讨论”的氛围,你说是不?
作者: find 时间: 2012-2-18 16:32
回复 9# batman
不好意思,我当时没看清,还以为是“2012字符串和2 0 1 2四个字符”,着实困惑了一下。
作者: jinzeyu 时间: 2012-2-18 21:03
本帖最后由 jinzeyu 于 2012-2-20 14:59 编辑
已全部完成
第四题有点没听明白
第四题我是random后订一个范围
(如:random20000后 因为20000大于2012 范围就变成0~19999 下次取值在这个范围里)
这样random次数就能最少
(没想到 规则我蒙对了...)
Q1:
欲取其他数,请改变a的值2012- @echo off&set b=&set a=2012
- :1
- if "%a%"=="" goto 2
- echo %a:~0,1%
- set "b=%b%%a:~0,1% "&set "a=%a:~1%"
- goto 1
- :2
- echo 结果是:%b%&pause>nul
复制代码
欲取其他数,请改变a的值2012- @echo off&setlocal EnableDelayedExpansion
- set a=2012
- :1
- If defined a (
- set "c=%c%%a:~-1%"
- set "a=%a:~,-1%"
- goto 1
- )
- echo %c%&pause
复制代码
Q2:
欲取其他数,请改变a的值2012- @echo off&setlocal EnableDelayedExpansion&set b=&set a=2012&set c=0
- :1
- if "%a%"=="" goto 2
- set "b=%b%%a:~0,1% "&set "a=%a:~1%"
- goto 1
- :2
- for %%i in (%b%) do set /a c+=%%i
- echo !c!&pause
复制代码
Q3:
欲取其他数,请改变第三行的2012- @echo off&set a=0
- :1
- if not "%random%"=="2012" (set /a a+=1&goto 1) else echo 运行了%a%次 random=2012&pause
复制代码
Q4:
如果想取0~2012的值(像lz说的 就把下面的32767改成2012)
欲取其他数,请改变7 8 9行的2012- @echo off&setlocal enabledelayedexpansion&set /a c=1,zs=0,zd=32767
- set "tab= "
- ::请把以上的tab换成实际的制表符 为了显示好看点
- :1
- set /a a=%random%%%((zd+1)-zs)+zs
- set "ml=echo !c!次%tab%%a%%tab%最多%zd%%tab%最少%zs%"
- if %a% lss 2012 set /a zs=%a%+1&%ml%&set /a c+=1
- if %a% gtr 2012 set /a zd=%a%-1&%ml%&set /a c+=1
- if %a% equ 2012 (%ml%&pause>nul&exit)
- goto 1
复制代码
Q5:
欲取其他数,请改变第一行的2012- @set /a "yp=!(2012%%4)&!(!(2012%%100))|!(2012%%400)"
- @if "%yp%"=="1" (@echo 闰年) else (@echo 平年)
- @pause
复制代码
Q6:
欲取其他数,请改变year的值2012- @echo off&setlocal EnableDelayedExpansion&set n=0&set year=2012&set /a "yp=^!(year%%4)&^!(^!(year%%100))|^!(year%%400)+28"
- for %%a in (31 !yp! 31 30 31 30 31 31 30 31 30 31) do (set /a n+=1&for /l %%i in (1,1,%%a) do echo %year%年!n!月%%i日)
- pause
复制代码
Q7:
欲取其他数,请改变第一行的2012 0- @for %%i in (xls doc txt pdf gpg) do ((@echo 2012 0)>2012.%%i)
复制代码
Q8:
欲取其他数,请改变a的值2012- @echo off&setlocal enabledelayedexpansion&set a=2012
- for %%i in (零0 一1 二2 三3 四4 五5 六6 七7 八8 九9) do (set b=%%i&call:1 !b:~1! !b:~0,1!)
- echo !a! &pause&exit
- :1
- set a=!a:%1=%2!
复制代码
Q9:
欲取其他数,请改变23 29行的2012- @echo off&setlocal enabledelayedexpansion
- echo 正在初始化中....
- for /l %%a in (1,1,9) do (
- set n%%a00=%%a百
- set n%%a000=%%a千
- set n%%a=%%a
- if not "%%a"=="1" set i=%%a
- set n%%a0=!i!十
- for /l %%b in (1,1,9) do (
- set n%%a%%b0=%%a百%%b十
- set n%%a%%b00=%%a千%%b百
- set n%%a%%b=!i!十%%b
- for /l %%c in (1,1,9) do (
- set n%%a%%b%%c=%%a百%%b十%%c
- set n%%a0%%c=%%a百零%%c
- set n%%a%%b%%c0=%%a千%%b百%%c十
- set n%%a0%%c0=%%a千零%%c十
- for /l %%d in (1,1,9) do (
- set n%%a00%%d=%%a千零%%d
- set n%%a0%%c%%d=%%a千零%%c十%%d
- set n%%a%%b0%%d=%%a千%%b百零%%d
- set n%%a%%b%%c%%d=%%a千%%b百%%c十%%d
- if "%%a%%b%%c%%d"=="2012" call:end
- )
- )
- )
- )
- :end
- for /l %%a in (1,1,2012) do (
- set a=!n%%a!
- for %%i in (一1 二2 三3 四4 五5 六6 七7 八8 九9 零0) do (
- set b=%%i
- call:1 !b:~1! !b:~0,1!
- )
- echo !a!
- )
- pause>nul
- :1
- set a=!a:%1=%2!
复制代码
下面这个比上面这个快得多(不算初始化...)可能是call的原因- @echo off&setlocal enabledelayedexpansion
- echo 正在初始化中....
- for /l %%a in (1,1,9) do (
- set n%%a00=%%a百
- set n%%a000=%%a千
- set n%%a=%%a
- if not "%%a"=="1" set i=%%a
- set n%%a0=!i!十
- for /l %%b in (1,1,9) do (
- set n%%a%%b0=%%a百%%b十
- set n%%a%%b00=%%a千%%b百
- set n%%a%%b=!i!十%%b
- for /l %%c in (1,1,9) do (
- set n%%a%%b%%c=%%a百%%b十%%c
- set n%%a0%%c=%%a百零%%c
- set n%%a%%b%%c0=%%a千%%b百%%c十
- set n%%a0%%c0=%%a千零%%c十
- for /l %%d in (1,1,9) do (
- set n%%a00%%d=%%a千零%%d
- set n%%a0%%c%%d=%%a千零%%c十%%d
- set n%%a%%b0%%d=%%a千%%b百零%%d
- set n%%a%%b%%c%%d=%%a千%%b百%%c十%%d
- if "%%a%%b%%c%%d"=="2012" call:end
- )
- )
- )
- )
- :end
- set c=0
- :2
- set /a c+=1
- set a=!n%c%!
- set a=!a:1=一!
- set a=!a:2=二!
- set a=!a:3=三!
- set a=!a:4=四!
- set a=!a:5=五!
- set a=!a:6=六!
- set a=!a:7=七!
- set a=!a:8=八!
- set a=!a:9=九!
- set a=!a:0=零!
- echo !a!
- if not "%c%"=="2012" goto 2
- pause>nul
复制代码
Q10:- @echo off
- call:2 "2012 年 祝 大 家 :"
- call:2 "心 想 事 成"
- call:2 "万 事 如 意"
- call:2 "最 后 祝 大 家"
- call:2 "在 2012 年 12 月 22 日 能 存 活 下 来 . . . . . ."
- set x=0
- set color=0123456789abcdef
- :3
- set /a x+=1
- set /a ra=%random%%%16
- cmd /v:on /c color !color:~%ra%,1!
- if "%x%"=="70" exit
- goto 3
- :2
- set "b=%~1"
- for %%i in (%b%) do (
- set /p "a=%%i"<nul
- for /l %%x in (1,1,1000) do ver>nul
- )
- echo.
复制代码
作者: batman 时间: 2012-2-18 21:16
本帖最后由 batman 于 2012-2-18 21:18 编辑
从大家的解来看,第七题基本都落入了我的陷井。。。
注意系统默认的句柄啊(2012 0像你们这样是不能输出的)
同时请大家在解题时稍微注意下代码的运行效率,call来call去再加上goto,代码基本无效率可言。。。
作者: jinzeyu 时间: 2012-2-18 21:23
回复 12# batman
有11道题 2个3题...
作者: batman 时间: 2012-2-18 21:29
回复 13# jinzeyu
不好意思是我的失误,顶楼已改正,将原来的2题合并到1题中了,还是10题
作者: apang 时间: 2012-2-19 00:37
同时请大家在解题时稍微注意下代码的运行效率,call来call去再加上goto,代码基本无效率可言。。。
batman 发表于 2012-2-18 21:16
有的题偶根本不会做,会做的也是想破脑袋瓜才做出来滴。对偶来说,实在没办法考虑效率问题呀。。。
超版是不是对新手过于苛求了。。。
作者: jinzeyu 时间: 2012-2-19 17:31
回复 14# batman
第四题能解释一下吗
作者: batman 时间: 2012-2-19 18:18
回复 16# jinzeyu
此题确实有点难懂,就这样吧,第一次取0-2012间的随机值,如取到948,就取948到2012间的随机值,依次下去,直到取到2012。。。
作者: QIAOXINGXING 时间: 2012-2-20 08:54
本帖最后由 QIAOXINGXING 于 2012-2-22 22:42 编辑
1- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
-
- set /p a=输入一个四位数:
- for /l %%i in (0 1 3) do (set "b=!b! !a:~%%i,1!")
- echo !b!
- echo ---------------
- for /l %%i in (0 1 3) do (set "c= !a:~%%i,1!!c!")
- echo !c!
- echo ---------------
- for /l %%i in (0 1 3) do (echo !a:~%%i,1!)
- echo ---------------
- for /l %%i in (3 -1 0) do (echo !a:~%%i,1!)
- echo ---------------
- pause
复制代码
2- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
- set /p a=输入一个四位数:
- for /l %%i in (0 1 3) do (
- set /a "b=!b!+!a:~%%i,1!"
- set "bb=!bb!+!a:~%%i,1!"
- )
- set "bb=!bb:~1!"
- echo !bb!=!b!
- pause
复制代码
3- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
- set "n=0"
- :a
- set /a "n+=1"
- if not "!random!"=="2012" ( cls&echo 第 !n! 次 &goto :a) else (echo 行勒!! 共 !n! 次)
- pause
复制代码
看了下前面的帖子:- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
-
- :start
- for /l %%i in (1 1 1000) do (
- set /a "n+=1"
- if !random!==2012 (echo ok & pause & exit) else (cls & echo 第 !n! 次)
- )
- goto :start
-
- rem 纯 goto 效率确实很低,for的确强大。
- rem for 语句的上限是1000还是100000000,速度差别很小
- rem 两个 bat 同时运行,最后的次数是一样的。。。。。。
复制代码
4- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
-
- set "b=32768"
- set "c=0"
- set "n=0"
-
- :go1
- set /a "n+=1"
- set /a "a=!random!%%!b!+!c!"
- if !a! lss 2012 (if !a! gtr !c! set "c=!a!")
- if !a! gtr 2012 (set /a "b1=!a!-!c!" & if !b1! lss !a! set /a "b=!a!-!c!")
- if !a! equ 2012 echo 共 !n! 次 & pause &exit
- echo !a!
- goto :go1
复制代码
5- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
- set /p a=输入年份:
- set /a "b1=!a!%%4"
- set /a "b2=!a!%%100"
- set /a "b3=!a!%%400"
-
- if "!b3!"=="0" (set "d=0"
- ) else (
- if not "!b2!"=="0" (if "!b1!"=="0" set "d=0")
- )
- if defined d (echo 是闰年) else (echo 不是闰年)
-
- pause
复制代码
6- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
-
- set "a=31 29 31 30 31 30 31 31 30 31 30 31"
- for /l %%i in (0 3 33) do (
- set /a "m=%%i/3+1"
- set "n=!a:~%%i,2!"
- for /l %%a in (1 1 !n!) do (
- echo 2012 年 !m! 月 %%a 日
- )
- )
-
- pause
复制代码
7- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
-
- set "a=xls doc txt pdf gpg"
- for %%i in (!a!) do (>2012.%%i echo 2012 0)
- rem 今天第一次见 “>”的前置用法。。。。。才知道了还有“句柄”这词儿。。。。
-
- pause
复制代码
8- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
- set /p n=输入数字:
-
- set "aa=零 一 二 三 四 五 六 七 八 九"
- set "a=-1"
- for %%i in (!aa!) do (
- set /a a+=1
- set "b=%%i"
- call set "n=%%n:!a!=!b!%%"
- )
- echo !n!
- pause
复制代码
9- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
- set "nn=0"
- :start
- set /p nn=输入位数不超过5的数字:
- set "n="
- set "n4="
- set "n3="
- set "n2="
-
- for /l %%i in (0 1 3) do (set "n= !nn:~%%i,1!!n!")
- rem 数字间加空格并倒序
-
- set "aa=零 一 二 三 四 五 六 七 八 九"
- set "a=-1"
- for %%i in (!aa!) do (
- set /a a+=1
- set "b=%%i"
- call set "n=%%n:!a!=!b!%%"
- )
- rem 阿拉伯数字变为汉字
-
- set "x=0"
- for %%i in (!n!) do (set /a x+=1 & set n!x!=%%i)
-
- if defined n4 (set n=!n4!千!n3!百!n2!十!n1! ) else (
- if defined n3 (set n=!n3!百!n2!十!n1!) else (
- if defined n2 (set n=!n2!十!n1!) else (
- if defined n1 set n=!n1!)))
- rem 判断位数
-
- set "n=!n:零百=零!"
- set "n=!n:零十=零!"
- set "n=!n:十零=十!"
- set "n=!n:零零=零!"
- set "n=!n:零零=零!"
- if "!n2!!n1!"=="零零" set "n=!n:百零=百!"
- if "!n3!!n2!!n1!"=="零零零" set "n=!n:千零=千!"
- echo !n!
- echo ---------------------------------
- goto :start
复制代码
10- @echo off&setlocal enabledelayedexpansion&cd /d "%~dp0"
-
- set "a1=希望今年能少蛋疼。。。"
- set "a2=希望世界上所有人都好好的。。。"
- set "a3=谢谢!!!!!!"
-
- :go1
- set /a "a+=1"
- call set "b=%%a!a!%%"
-
- for /l %%i in (0 1 20) do (
- set /p=!b:~%%i,1!<nul
- ping 127.1 /n 1 >nul
- )
- echo.
- if "!a!"=="3" pause >nul & exit
- goto :go1
复制代码
作者: BAT1 时间: 2012-2-20 14:23
本帖最后由 BAT1 于 2012-2-20 14:24 编辑
回复 17# batman
请将要求更新至顶楼!
(这句话平时都是版主对我们说的,想不到今天我却对超级版主说 /汗)
作者: jinzeyu 时间: 2012-2-26 18:09
我7天前做完了 管理员能否帮忙看一看
作者: batman 时间: 2012-2-28 10:08
本帖最后由 batman 于 2012-2-28 10:19 编辑
由于本人工作原因
一直没有时间仔细看看代码很是对不起大家了
今天终于抽出时间来阅读了大家的解法和思路
但还是由于时间原因不能做到细致详实敬请谅解
同时希望大家在帖子能踊跃跟帖进行充分的讨论
毕竟讨论才出真知嘛。。。
作者: jinzeyu 时间: 2012-2-28 10:21
回复 11# batman
呵呵 第九题慢了点...
作者: QIAOXINGXING 时间: 2012-2-28 22:47
回复 21# batman
嗯,我是一上来不管用不用,先把变量延迟打开,能用!!坚决不用%% 。
开变量延迟有什么不利还是不清楚,是不是会增加预处理的次数,从而影响速度??还会影响某些应用??
您在第 8 题 用:for %%b in (!str!) do set /p=!_%%b!<nul
我觉得这句样更好理解: call set /p=%%_!str!%%<nul
您也是出于变量延时的考虑吗??
作者: batman 时间: 2012-2-29 09:17
回复 23# QIAOXINGXING
兄弟注意到我顶楼给出的答案中的第五题中写的备注不。。。
作者: QIAOXINGXING 时间: 2012-2-29 10:08
回复 24# batman
注意到了。。
您的意思是:有些地方不能开变量延迟??开了会影响某些应用??
我是说:在既能用!!,又能用%%的情况下,优先选择 !! 除了要多写一句话以外,有没有其他什么不好的??
作者: apang 时间: 2012-2-29 10:22
请问超版,第三题我用这种方式生成2012,是不是不妥,或者根本就是错的?- @echo off
- set n=0&set str=
- call :loop 2 0 1 2
- echo %str%运行了%n%次&pause&exit
-
- :loop
- if "%1"=="" goto :eof
- set/a n+=1&set aa=%random:~-1%
- if "%aa%"=="%1" (set str=%str%%aa%&shift&goto loop) else goto loop
复制代码
作者: guaiwu 时间: 2012-2-29 12:32
本帖最后由 guaiwu 于 2012-3-1 20:19 编辑
问题纯属自己思考,也没看其他的“同鞋”的,还有需要补充的。待续...
1、在屏幕上分别分行和同行输出2012字符串的2 0 1 2四个字符以及反序输出(在这里要将2012视为不可知数值)
2、计算2012字符串四个数值的和(在这里要将2012视为不可知数值)- @echo off
- set /p aa=
- set /a b=%aa:~0,-3%+%aa:~1,-2%+%aa:~2,-1%+%aa:~3%
- echo %b%
- pause
复制代码
3、利用random生成2012,并计算random的次数- @echo off&setlocal enabledelayedexpansion
- :random
- set/a i=%random%%%2012+1
- echo %i%
- set /a a+=1
- if %i%==2012 goto yes
- goto random
- :yes
- echo 第!a!次找到了%i%
- pause
复制代码
4、利用random生成2012,并保证每次使用最少的random次数(第一次取0-2012间的随机值,如取到948,就取948到2012间的随机值,依次下去,直到取到2012。。。)- @echo off
- set /a b=%random% %%2012+1
- :with
- set /a n+=1
- set /a aa=2013-%b%
- set /a b=%random% %%%aa%+%b%
- set /a aa=%b%
- echo %b%
- if %b% == 2012 goto ok
- goto with
- :ok
- echo 第%n%次找到了%b%
- pause
复制代码
5、证明2012年是闰年(在这里要将2012视为不可知数值)- @echo off
- set /p a=
- set /a b=%a%%%4
- if %b% == 0 echo %a%年是闰年
- pause
复制代码
6、输出2012年所有的日期
7、分别生成以2012命名的xls word txt pdf gpg的文件并在里面输入“2012 0”字符
8、将2012转换成二零一二(在这里要将2012视为不可知数值)- @echo off&setlocal enabledelayedexpansion
- set /p aa=输入一个四位数:
- set a=%aa:~-1%
- for %%i in (%aa:~0,-3%,%aa:~1,-2%,%aa:~2,-1%,%aa:~3%) do (
- set /a n+=1
- if %%i == 0 set .!n!=零
- if %%i == 1 set .!n!=一
- if %%i == 2 set .!n!=二
- if %%i == 3 set .!n!=三
- if %%i == 4 set .!n!=四
- if %%i == 5 set .!n!=五
- if %%i == 6 set .!n!=六
- if %%i == 7 set .!n!=七
- if %%i == 8 set .!n!=八
- if %%i == 9 set .!n!=九
- )
- cls
- echo 转换中文为:%.1%%.2%%.3%%.4%
- pause>nul
复制代码
9、将1-2012之间的数值全转换成中文数值,如2001转换成二千零一
10、写出一段关于2012年的感想或祝福,并在屏幕上逐字逐行延时输出
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |