标题: 【练习-017】批处理根据输入值进行数值计算 [打印本页]
作者: batman 时间: 2008-8-27 17:20 标题: 【练习-017】批处理根据输入值进行数值计算
出题目的:
掌握数值计算
解题要求:
代码通用、高效
尽量简洁
不生成临时文件
加分规则:
1 新手完成前六个步骤的加分10分
2 新手完成前七个步骤的加分15分
3 老手完成第七个步骤的加分10分
4 老手完成第七、第八步骤的加分15分
题目如下:
通过批处理实现如下操作(要求适应于1-9的输入数)
解题限制:
请老手不要写出前六个步骤的代码(不要求老手完成)
高手只需完成第八个步骤
-------------------------------------------------------------------------
螺旋矩阵的解见:18楼我的解和19楼terse的解
作者: wangwei4106 时间: 2008-8-27 18:26
第一,二题
@echo off
set /p n=请输入数字(1-9)
set /a mun=1^<^<n
echo 平方是:%mun%
pause>nul
set /a mun=4^<^<n
echo 立方是:%mun%
pause>nul&goto :eof
第三题
@echo off
set n=1
set /p n=请输入数字(1-9)
for /l %%i in (1 1 %n%) do (
set /a sum+=%%i
)
echo 1-%n%的和是:%sum%
pause
后面的还在想,想好就发上来!
[ 本帖最后由 wangwei4106 于 2008-8-27 18:53 编辑 ]
作者: batman 时间: 2008-8-27 19:55
原帖由 wangwei4106 于 2008-8-27 18:26 发表
第一,二题
@echo off
set /p n=请输入数字(1-9)
set /a mun=1^
学到的东西不能生搬硬套,要理解后合理地使用,同时还要养成测试的习惯,杜绝将错误的代码贴上来。
作者: wangwei4106 时间: 2008-8-27 20:37
第一题
@echo off&setlocal enabledelayedexpansion
set /p n=请输入数字(1-9)
set a=%n%
set b=%n%
set /a mun=%a%*%b%
echo 你要的平方是:!mun!
pause
第二题
@echo off&setlocal enabledelayedexpansion
set /p n=请输入数字(1-9)
set a=%n%
set b=%n%
set c=%n%
set /a mun=%a%*%b%*%c%
echo 你要的立方是:!mun!
pause
[ 本帖最后由 wangwei4106 于 2008-8-27 20:40 编辑 ]
作者: mkl 时间: 2008-8-27 20:54
前6题- @echo off
- set /p n=请输入数字(1-9)
- set /a p=%n%*%n%
- set /a pp=%p%*%n%
- set o=0 &set oo=1 &set m=0 &set mm=0
- set a=1
- :jj
- set /a o=%o%+%a%
- set /a oo=%oo%*%a%
- set /a c=%a%*%a%
- set /a cc=%a%*%a%*%a%
- set /a m=%m%+%c%
- set /a mm=%mm%+%cc%
- if not %a%==%n% set /a a+=1 &goto jj
- echo %n%的平方:%p%
- echo %n%的平方:%pp%
- echo 从1到%n%的和:%o%
- echo 从1到%n%的积:%oo%
- echo 从1到%n%的平方和:%m%
- echo 从1到%n%的立方和:%mm%
- pause>nul
复制代码
作者: shqf 时间: 2008-8-27 22:23
前6题如下(后2题明日有空再想想):- @echo off&setlocal enabledelayedexpansion
- set ji=1
- set /p n=请输入数字(1-9)
- set /a pf=%n%*%n%
- set /a lf=%pf%*%n%
- for /l %%i in (1,1,%n%) do (
- set /a he+=%%i
- set /a ji*=%%i
- set /a pfh_pf=%%i*%%i&set /a pfh+=!pfh_pf!
- set /a lfh_lf=!pfh_pf!*%%i&set /a lfh+=!lfh_lf!
- )
- echo %n%的平方:%pf%
- echo %n%的平方:%lf%
- echo 从1到%n%的和:%he%
- echo 从1到%n%的积:%ji%
- echo 从1到%n%的平方和:%pfh%
- echo 从1到%n%的立方和:%lfh%
-
- pause>nul
复制代码
[ 本帖最后由 shqf 于 2008-8-27 22:25 编辑 ]
作者: mkl 时间: 2008-8-27 22:34
第7题- @echo off
- set /p n=请输入数字(1-9)
- set s=%n% &set nn=0 &set v=1
- :jj
- set /a nn=%nn%+1
- set "mn= %nn%"
- set /p=%mn:~-2% <nul
- if %nn% lss %s% goto jj
- echo.
- set /a s=%s%+%n%
- set /a v=v+1
- if %v% leq %n% goto jj
- pause>nul
复制代码
作者: batman 时间: 2008-8-27 23:22
建议楼上用for来简化代码。。。
作者: batman 时间: 2008-8-28 10:22 标题: 简化下7楼的代码
- @echo off&setlocal enabledelayedexpansion
- set /p n=请输入数字(1-9)
- set /a nn=n*n
- for /l %%i in (1,1,%nn%) do (
- set "a=%%i"&set /a v+=1
- if !a! lss 10 set "a= !a!"
- set /p=!a! <nul
- if !v! equ %n% set "v=0"&echo.
- )
- pause>nul
复制代码
还可减少一个变量:
- @echo off&setlocal enabledelayedexpansion
- set /p n=请输入数字(1-9)
- set /a nn=n*n
- for /l %%i in (1,1,%nn%) do (
- set /a v+=1
- if %%i lss 10 (
- set /p= %%i <nul
- ) else (
- set /p=%%i <nul
- )
- if !v! equ %n% set "v=0"&echo.
- )
- pause>nul
复制代码
[ 本帖最后由 batman 于 2008-8-28 10:31 编辑 ]
作者: shqf 时间: 2008-8-28 12:40
batman给我加分,受鼓励,前6步精简了二行代码,再贴出第7步我的解法(第8步实在无从下手了):- @echo off&setlocal enabledelayedexpansion
- set ji=1
- set /p n=请输入数字(1-9)
-
- for /l %%i in (1,1,%n%) do (
- set /a he+=%%i
- set /a ji*=%%i
- set /a pf=%%i*%%i&set /a pfh+=!pf!
- set /a lf=!pf!*%%i&set /a lfh+=!lf!
- )
-
- echo %n%的平方:%pf%
- echo %n%的平方:%lf%
- echo 从1到%n%的和:%he%
- echo 从1到%n%的积:%ji%
- echo 从1到%n%的平方和:%pfh%
- echo 从1到%n%的立方和:%lfh%
- echo 4行4列的数列:
- for /l %%i in (1,1,%n%) do (
- for /l %%j in (1,1,%n%) do (set /a ij=%%i*%n%-%n%+%%j&set /p=!ij! <nul)
- echo.
- )
-
- pause>nul
复制代码
[ 本帖最后由 shqf 于 2008-8-28 12:49 编辑 ]
作者: pusofalse 时间: 2008-8-28 14:10
for 的/l产生的就是现有的数列,不必再在for里面set/a v+=1
- @echo off&setlocal enabledelayedexpansion
- set/p n=输入:
- set/a m=n*n
- for /l %%a in (1 1 %m%) do (
- set/a mod=%%a%%n
- if %%a lss 10 (set/p= %%a <nul) else set/p=%%a <nul
- if !mod! equ 0 echo.
- )
- pause>nul
复制代码
[ 本帖最后由 pusofalse 于 2008-8-28 14:13 编辑 ]
作者: batman 时间: 2008-8-28 15:00
楼上确实将代码进一步进行了简化,但变量个数还是一样的吧,少了个v多了个mod。
作者: batman 时间: 2008-8-28 15:12
原帖由 shqf 于 2008-8-28 12:40 发表
batman给我加分,受鼓励,前6步精简了二行代码,再贴出第7步我的解法(第8步实在无从下手了):@echo off&setlocal enabledelayedexpansion
set ji=1
set /p n=请输入数字(1-9)
for /l %%i in (1,1,%n%) do ...
有几个问题:
1 这是个小问题,一直显示的是4行4列
2 数例没有完全对齐,原因在没有对小于10的数进行处理
3 代码书写不规范,切不可以为将代码挤在一堆就是简洁了,这样大大降低了代码的可读性
4 set /a 可以如此连写:set /a a+=1,b+=a,c+=b
[ 本帖最后由 batman 于 2008-8-28 17:05 编辑 ]
作者: shqf 时间: 2008-8-28 16:45
哦,以为想得很周全了,竟仍还有好多问题。领教了,谢谢。
作者: pusofalse 时间: 2008-8-28 16:52 标题: 回复 13楼 的帖子
- 4 set /a 可以如此连写:set /a a+=1,b+=a,c+=b ,当然前提是开启了变量延迟
复制代码
不必开启变量延迟啊,set/a 的特性就是这样。
作者: batman 时间: 2008-8-28 17:08
原帖由 pusofalse 于 2008-8-28 16:52 发表
4 set /a 可以如此连写:set /a a+=1,b+=a,c+=b ,当然前提是开启了变量延迟
不必开启变量延迟啊,set/a 的特性就是这样。
多谢指正,已修改。
作者: yslyxqysl 时间: 2008-8-28 21:53
-
- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- :input
- set /p num=请输入:
- for /l %%i in (1 1 %num%) do (
- for /l %%p in (1 1 %num%) do (
- set /a tempnum+=1
- if !tempnum! lss 10 set /p tp= <nul
- set /p tp=!tempnum! <nul
- )
- echo.
- )
- pause
- goto input
复制代码
[ 本帖最后由 yslyxqysl 于 2008-8-29 18:43 编辑 ]
作者: batman 时间: 2008-8-29 00:23
&&看来螺旋矩阵确实难住了众位新手,同时高手们都不肯冒然出手,
所以只有本人来抛砖引玉了:
----------------------------------------------------------------------------------
首先做下解题说明:
其实解此题的关键是在找规律,这个螺旋矩阵最大的规律就是在
行、列值的递增递减上,我们就将x变量设为行将y变量设为列,于是
一个y+ x+ y- x-的循环呈现在我们面前,而同时从上一步跳到下一步
的临界值也在变化,不难看出这是个递减的变化,所以只要我们掌握
了以上两点规律,解题的思路便会清晰起来:
- @echo off&setlocal enabledelayedexpansion
- set /p var=请输入螺旋阵级数(9级内):
- set /a x=1,y=1,total=var*var,tt=1,n=0,m=1,num=var+1
- :begin
- set /a num-=1,n+=1,m+=1
- set "s=y+x+y-x-"&set "ss=%num%%num%%n%%m%"&set "gl=lsslssgtrgtr"
- :again
- set /a %s:~,2%=1,tt+=1
- if %tt% lss 10 set "tt= %tt%"
- if not defined _%x%%y% set "_%x%%y%=%tt%"
- if !%s:~,1%! %gl:~,3% %ss:~,1% goto again
- set "s=%s:~2%"&set "ss=%ss:~1%"&set "gl=%gl:~3%"
- if defined s goto again
- if %tt% lss %total% goto begin
- set "_11= 1"
- for /l %%a in (1,1,%var%) do (
- for /l %%i in (1,1,%var%) do (
- set /p=!_%%a%%i! <NUL
- )
- echo.
- )
- pause>nul
复制代码
ps:期望各位高手贴出更完美的方案。
----------------------------------------------------------------------------------
作者: terse 时间: 2008-8-29 01:03
刚在联盟那边贴了
和batman 兄的代码比较还是不够精炼
本不想贴了但还是献个丑哦
我看到 if %p% equ 0 就可结束 更改下- @echo off&setlocal enabledelayedexpansion
- set/p p=输入阶数:
- set/a n+=1,o=p
- :lp
- set/a b+=2
- for /l %%i in (%n% 1 %p%) do set/a a+=1&set %n%%%i=!a!
- set/a n+=1
- for /l %%i in (%n% 1 %p%) do set/a a+=1&set %%i%p%=!a!
- set/a m=p-1,t+=1
- for /l %%i in (%m% -1 %t%) do set/a a+=1&set %p%%%i=!a!
- set/a p-=1,s+=1
- for /l %%i in (%p% -1 %n%) do set/a a+=1&set %%i%s%=!a!
- if %b% gtr %o% (
- for /l %%i in (1 1 %o%) do (
- for /l %%j in (1 1 %o%) do if !%%i%%j! lss 10 (set /p = !%%i%%j! <nul)else set /p =!%%i%%j! <nul
- echo.)
- pause>nul)else goto lp
复制代码
[ 本帖最后由 terse 于 2008-8-29 02:21 编辑 ]
作者: shqf 时间: 2008-8-29 08:19
代码竟是如此短啊!可怜我还是难以理解其精妙之处。除了佩服,只剩穷顶。
[ 本帖最后由 shqf 于 2008-8-29 08:22 编辑 ]
作者: everest79 时间: 2009-5-2 08:16
骗分- @echo off&Setlocal EnableDelayedExpansion
- Set /p N=num:
- Set /a ALL=N*N,w=0,h=w,s=h,c=s,l=n-1
- For /l %%a in (1,1,%all%) Do (Set _o!h!!w!=%%a
- if !c! EQU 0 (call :c w + GEQ 1 "l-s") else if !c! EQU 1 (call :c h + GEQ 2 "l-s"
- ) else if !c! EQU 2 (call :c w - LEQ 3 "s") else if !c! EQU 3 call :c h - LEQ "0,s+=1" "s+1")
- for /f "tokens=1,2 delims==" %%a in ('set _o^|sort') do (
- Set/P=%%b <nul&Set /a count+=1,1/^(count%%%N%^)2>nul||echo.)
- pause >nul&goto :eof
- :c
- Set /a %1%2=1,tmp=%~5
- if !%1! %3 %tmp% Set /a %1=tmp,c=%~4
- goto :eof
复制代码
作者: keen 时间: 2009-5-12 12:19
1-6:- @echo off
- set /p num=请输入要操作的数,范围是1-9:
- set sum4=1
- for /l %%i in (1 1 %num%) do (
- set /a sum1=%%i*%%i,sum2=sum1*%%i,sum3+=%%i,sum4*=%%i,sum5+=sum1,sum6+=sum2
- )
- echo\
- echo %num%的平方是:%sum1%
- echo %num%的立方是:%sum2%
- echo 从1到%num%的和:%sum3%
- echo 从1到%num%的积:%sum4%
- echo 从1到%num%的平方和:%sum5%
- echo 从1到%num%的立方和:%sum6%
- echo\&pause
复制代码
作者: keen 时间: 2009-5-12 12:22
第7题:- @echo off&setlocal enabledelayedexpansion
- set /p num=请输入要操作的数,范围是1-9:
- echo\&echo %num%行%num%列数列:
- for /l %%i in (1 1 %num%) do (
- for /l %%j in (1 1 %num%) do (
- set /a sum7+=1&set sum7= !sum7!&set /p=!sum7:~-2! <nul
- )
- echo\
- )
- echo\&pause
复制代码
作者: xmaoh234 时间: 2009-5-12 12:43 标题: 回复 5楼 的帖子
pp 是立方,你写的是平方。。。。。
作者: keen 时间: 2009-5-12 22:48 标题: 回复 17楼 的帖子
既然设定整个代码不断循环,就要把tempnum在下一次循环时,清零。要么就不要进行循环。
作者: keen 时间: 2009-5-12 23:13
看了19楼的代码,原来是通过定位坐标的方式,形成螺旋阵列。
我知道还有通过坐标定位的另一种方式,只是不知道,具体怎么写。
坐标定位,好像是:
1-1 1-2 1-3 1-4
2-1 2-2 2-3 2-4
继续学习,继续研究!
作者: netbenton 时间: 2009-5-13 22:20 标题: 第八题
@echo off&Setlocal EnableDelayedExpansion
Set /p k=19内阶数:
Set /a all=k*k,t1=1,h1=1,sk=k,ck=k,m=1,n=1,x=0,y=1,a=1
set str1=n sk 1 0 t1 1
set str2=m ck 0 -1 sk -1
set str3=n h1 -1 0 ck -1
set str0=m t1 0 1 h1 1
for /l %%a in (1,1,!all!) do (
set #!m!.!n!=%%a
set/a m+=x,n+=y
for %%b in (!a!) do (
for /f "tokens=1-6" %%c in ("!str%%b!") do (
if !%%c! equ !%%d! set/a x=%%e,y=%%f,%%g+=%%h,a+=1,a=a%%4
) ) )
for /l %%a in (1,1,!k!) do (
set str=
for /l %%b in (1,1,!k!) do (set one= !#%%a.%%b!&set str=!str!!one:~-4!)
echo !str!
)
pause
作者: hanyeguxing 时间: 2011-2-7 19:42
使用对角分割解螺旋方阵:- @echo off
- :s
- setlocal enabledelayedexpansion&cls
- set/p n=输入阶数:
- if %n% gtr 46340 goto:s
- set/a k=n*n&set k= !k!
- for /l %%a in (1,1,11) do if not "!k:~%%a,1!"=="" set q=%%a&set "s=!s! "
- for /l %%a in (1,1,%n%) do (
- for /l %%b in (1,1,%n%) do (
- set/a k=n+1-%%a
- if %%b geq %%a if %%b leq !k! set/a "p=4*(n-%%a)*%%a-4*n+7*%%a+%%b-3"
- if %%b leq %%a if %%b gtr !k! set/a "p=4*(n-%%a)*%%a-2*n+5*%%a-%%b-1"
- if %%b gtr %%a if %%b gtr !k! set/a "p=4*(n-%%b)*%%b-2*n+%%a+3*%%b-1"
- if %%b lss %%a if %%b leq !k! set/a "p=4*(n-%%b)*%%b-%%a+%%b+1"
- set p=%s%!p!&set/p"=!p:~-%q%! "<nul
- )
- echo;
- )
- pause&endlocal&goto:s
复制代码
JS版:- <script>
- hy(20);
- function hy( n)
- { var i,j;
- document.write("<body bgcolor=#008000><center><table border=1 bgcolor=#B0E2FF bordercolor=#fff000> ");
- for(i=1;i<=n;i++){document.write("<tr>");
- for(j=1;j<=n;j++){
- var Han=4*(n-i)*i-4*n+7*i+j-3;
- var Ye=4*(n-j)*j-2*n+i+3*j-1;
- var Gu=4*(n-i)*i-2*n+5*i-j-1;
- var Xing=4*(n-j)*j+-i+j+1;
- document.write("<td>"+((i<=j&&i+j<=n+1)?Han:(i<j&&i+j>n+1)?Ye:(i>=j&&i+j>n+1)?Gu:Xing)+"</td>");} document.write("</tr>");}
- document.write("</table> ");
- }
- </script>
复制代码
[ 本帖最后由 hanyeguxing 于 2011-2-8 11:15 编辑 ]
作者: Hello123World 时间: 2011-7-20 17:00
1# batman
1-6题:- @echo off & setlocal enabledelayedexpansion
- Set /p a=请输入要操作的数(1-9):
- Set /a b=%a%*%a%
- Set /a c=%a%*%a%*%a%
- Set e=1
- For /l %%i in (1 1 %a%) do (Set /a d+=%%i & Set /a e*=%%i
- Set f=%%i & Set /a f*=!f! & Set /a g+=!f!
- Set f=%%i
- Set /a h=!f!*!f!*!f! & Set /a m+=!h!
- )
- Echo %a%的平方:%b%
- Echo %a%的立方:%c%
- Echo 1到%a%的和:%d%
- Echo 1到%a%的积:%e%
- Echo 1到%a%的平方和:%g%
- Echo 1到%a%的立方和:%m%
- pause
复制代码
作者: Hello123World 时间: 2011-7-20 17:09
第7题格式上有点问题:- @echo off&Setlocal EnableDelayedExpansion
- For /l %%i in (1 1 16) do (Set a=%%i
- Set /p =!a! <nul
- Set /a b=!a!%%4
- If !b!==0 Echo\)
- pause
复制代码
作者: asd821089612 时间: 2011-7-21 06:41
第一到第六题。- @echo off
- set /p no=请输入想要操作的数 (1-9) :
- set /a no1=%no%*%no%
- set /a no2=%no%*%no%*%no%
- for /l %%i in (1 1 %no%) do (set /a no3+=%%i)
- set no4=1
- for /l %%i in (1 1 %no%) do (set /a no4*=%%i)
- for /l %%i in (1 1 %no%) do (set /a no5+=%%i*%%i)
- for /l %%i in (1 1 %no%) do (set /a no6+=%%i*%%i*%%i)
- echo %no%的平方为:%no1%
- echo %no%的立方为:%no2%
- echo 1到%no%的和为:%no3%
- echo 1到%no%的积为:%no4%
- echo 1到%no%的平方和为:%no5%
- echo 1到%no%的立方和为:%no6%
- pause>nul
复制代码
作者: 437153 时间: 2015-7-8 13:54
求点评~~~
1-6:- @echo off&setlocal enabledelayedexpansion
- set /p "p=请输入要操作的数(1-9):"
- set j=1
- for /l %%a in (1,1,%p%) do (
- set /a p2=%%a*%%a
- set /a p3=%%a*%%a*%%a
- set /a h=!h!+%%a
- set /a j=%%a*!j!
- set /a ph=!ph!+!p2!
- set /a lh=!lh!+!p3!
- )
- echo %p%的平方:%p2%
- echo %p%的立方:%p3%
- echo 从1到%p%的和:%h%
- echo 从1到%p%的积:%j%
- echo 从1到%p%的平方和:%ph%
- echo 从1到%p%的立方和:%lh%
复制代码
数列:- @echo off&setlocal enabledelayedexpansion
- set /p "p=请输入要操作的数(1-9):"
- for /l %%a in (1,1,%p%) do (
- for /l %%i in (1,1,%p%) do (
- set /a n+=1
- set /p=!n! <nul
- )
- echo;
- )
复制代码
螺纹:- @echo off&setlocal enabledelayedexpansion
- set /p p=输入:
- set /a x=1,num=%p%,sum=%p%*%p%
- set yuns=--
- for /l %%y in (1,1,%num%) do (set/a n+=1,y+=1&set _%x%_%%y=!n!)
- :lp
- set /a num-=1
- for /l %%a in (1,1,%num%) do (set/a n+=1,x=!x!%yuns%1&set _!x!_!y!=!n!)
- set yuns=-%yuns%
- for /l %%a in (1,1,%num%) do (set/a n+=1,y=!y!%yuns%1,ys+=1&set _!x!_!y!=!n!)
- if not %n% equ %sum% goto :lp
- for /l %%a in (1,1,%p%) do (
- for /l %%b in (1,1,%p%) do (
- set /p=!_%%a_%%b! <nul
- )
- echo;
- )
复制代码
作者: lengmoke 时间: 2021-11-2 15:14
- @echo off
- setlocal EnableDelayedExpansion
- set /a length=20 & set /a width=23
- set /a max=length*width
- call :len %max% maxlength
- set /a i=1 & set /a j=1 & set /a idelta=0 & set /a jdelta=1 & set /a imax=length & set /a jmax=width & set /a count=0 & set /a imin=2 & set /a jmin=1
- :setvalue
- set /a count+=1
- call :loop temp %count% %maxlength%
- set matrix[%i%][%j%]=%temp%
- if "%idelta%,%jdelta%"=="0,1" ( if %j%==%jmax% ( set /a idelta=1 & set /a jdelta=0 & set /a jmax-=1 ))
- if "%idelta%,%jdelta%"=="1,0" ( if %i%==%imax% ( set /a idelta=0 & set /a jdelta=-1 & set /a imax-=1))
- if "%idelta%,%jdelta%"=="0,-1" ( if %j%==%jmin% ( set /a idelta=-1 & set /a jdelta=0 & set /a jmin+=1))
- if "%idelta%,%jdelta%"=="-1,0" ( if %i%==%imin% ( set /a idelta=0 & set /a jdelta=1 & set /a imin+=1))
- set /a i+=idelta & set /a j+=jdelta
- if %count% lss %max% (
- goto:setvalue
- )
- for /l %%i in (1,1,%length%) do (
- set str=!matrix[%%i][1]!
- for /l %%j in (2,1,%width%) do ( set "str=!str! !matrix[%%i][%%j]!" )
- echo !str!
- )
- exit
-
- :loop
- set number= %2
- set %1=!number:~-%3!
- goto :eof
-
- :len
- set Tempstrs=%~1 & Set Tempnum=0
- :下一位
- set Tempstr=!Tempstrs:~%Tempnum%,1!
- if defined Tempstr ( set /a Tempnum+=1 & goto :下一位 )
- set /a %~2=%Tempnum%-1
- goto :eof
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |