批处理之家's Archiver

batman 发表于 2008-8-27 17:20

【练习-017】批处理根据输入值进行数值计算

出题目的:
        掌握数值计算
解题要求:
        代码通用、高效
        尽量简洁
        不生成临时文件
加分规则:
        1 新手完成前六个步骤的加分10分
   2 新手完成前七个步骤的加分15分
   3 老手完成第七个步骤的加分10分
   4 老手完成第七、第八步骤的加分15分
题目如下:
  通过批处理实现如下操作(要求适应于1-9的输入数)
[attach]1239[/attach]
解题限制:
  请老手不要写出前六个步骤的代码(不要求老手完成)
  高手只需完成第八个步骤
-------------------------------------------------------------------------
螺旋矩阵的解见:18楼我的解和19楼terse的解

[[i] 本帖最后由 Batcher 于 2009-5-1 21:13 编辑 [/i]]

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
后面的还在想,想好就发上来!

[[i] 本帖最后由 wangwei4106 于 2008-8-27 18:53 编辑 [/i]]

batman 发表于 2008-8-27 19:55

[quote]原帖由 [i]wangwei4106[/i] 于 2008-8-27 18:26 发表 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=8873&ptid=1655][img]http://www.bathome.net/images/common/back.gif[/img][/url]
第一,二题
@echo off
set /p n=请输入数字(1-9)
set /a mun=1^ [/quote]
学到的东西不能生搬硬套,要理解后合理地使用,同时还要养成测试的习惯,杜绝将错误的代码贴上来。

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

[[i] 本帖最后由 wangwei4106 于 2008-8-27 20:40 编辑 [/i]]

mkl 发表于 2008-8-27 20:54

前6题[code]@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[/code]

shqf 发表于 2008-8-27 22:23

前6题如下(后2题明日有空再想想):[code]@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[/code]

[[i] 本帖最后由 shqf 于 2008-8-27 22:25 编辑 [/i]]

mkl 发表于 2008-8-27 22:34

第7题[code]@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[/code]

batman 发表于 2008-8-27 23:22

建议楼上用for来简化代码。。。

batman 发表于 2008-8-28 10:22

简化下7楼的代码

[code]@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[/code]
还可减少一个变量:
[code]
@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
[/code]

[[i] 本帖最后由 batman 于 2008-8-28 10:31 编辑 [/i]]

shqf 发表于 2008-8-28 12:40

batman给我加分,受鼓励,前6步精简了二行代码,再贴出第7步我的解法(第8步实在无从下手了):[code]@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[/code]

[[i] 本帖最后由 shqf 于 2008-8-28 12:49 编辑 [/i]]

pusofalse 发表于 2008-8-28 14:10

for 的/l产生的就是现有的数列,不必再在for里面set/a v+=1
[code]@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
[/code]

[[i] 本帖最后由 pusofalse 于 2008-8-28 14:13 编辑 [/i]]

batman 发表于 2008-8-28 15:00

楼上确实将代码进一步进行了简化,但变量个数还是一样的吧,少了个v多了个mod。

batman 发表于 2008-8-28 15:12

[quote]原帖由 [i]shqf[/i] 于 2008-8-28 12:40 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=8957&ptid=1655][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
batman给我加分,受鼓励,前6步精简了二行代码,再贴出第7步我的解法(第8步实在无从下手了):@echo off&setlocal enabledelayedexpansion
set ji=1
set /p n=请输入数字(1-9)

for /l %%i in (1,1,%n%) do  ... [/quote]
有几个问题:
1 这是个小问题,一直显示的是4行4列
2 数例没有完全对齐,原因在没有对小于10的数进行处理
3 代码书写不规范,切不可以为将代码挤在一堆就是简洁了,这样大大降低了代码的可读性
4 set /a 可以如此连写:set /a a+=1,b+=a,c+=b

[[i] 本帖最后由 batman 于 2008-8-28 17:05 编辑 [/i]]

shqf 发表于 2008-8-28 16:45

哦,以为想得很周全了,竟仍还有好多问题。领教了,谢谢。

pusofalse 发表于 2008-8-28 16:52

回复 13楼 的帖子

[code]4 set /a 可以如此连写:set /a a+=1,b+=a,c+=b ,当然前提是开启了变量延迟[/code]
不必开启变量延迟啊,set/a 的特性就是这样。

batman 发表于 2008-8-28 17:08

[quote]原帖由 [i]pusofalse[/i] 于 2008-8-28 16:52 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=8995&ptid=1655][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
4 set /a 可以如此连写:set /a a+=1,b+=a,c+=b ,当然前提是开启了变量延迟
不必开启变量延迟啊,set/a 的特性就是这样。 [/quote]
多谢指正,已修改。

yslyxqysl 发表于 2008-8-28 21:53

[code]
@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[/code]

[[i] 本帖最后由 yslyxqysl 于 2008-8-29 18:43 编辑 [/i]]

batman 发表于 2008-8-29 00:23

[color=blue]
&&看来螺旋矩阵确实难住了众位新手,同时高手们都不肯冒然出手,
所以只有本人来抛砖引玉了:
----------------------------------------------------------------------------------
首先做下解题说明:
     其实解此题的关键是在找规律,这个螺旋矩阵最大的规律就是在
行、列值的递增递减上,我们就将x变量设为行将y变量设为列,于是
一个y+ x+ y- x-的循环呈现在我们面前,而同时从上一步跳到下一步
的临界值也在变化,不难看出这是个递减的变化,所以只要我们掌握
了以上两点规律,解题的思路便会清晰起来:
[code]@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[/code]
ps:期望各位高手贴出更完美的方案。
----------------------------------------------------------------------------------
[/color]

terse 发表于 2008-8-29 01:03

刚在联盟那边贴了
和batman 兄的代码比较还是不够精炼
本不想贴了但还是献个丑哦
我看到  if %p% equ 0 就可结束  更改下[code]@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[/code]

[[i] 本帖最后由 terse 于 2008-8-29 02:21 编辑 [/i]]

shqf 发表于 2008-8-29 08:19

代码竟是如此短啊!可怜我还是难以理解其精妙之处。除了佩服,只剩穷顶。

[[i] 本帖最后由 shqf 于 2008-8-29 08:22 编辑 [/i]]

everest79 发表于 2009-5-2 08:16

骗分[code]@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[/code]

keen 发表于 2009-5-12 12:19

1-6:[code]@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[/code]

keen 发表于 2009-5-12 12:22

第7题:[code]@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[/code]

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

[attach]3427[/attach]
使用对角分割解螺旋方阵:[code]@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[/code]JS版:[code]<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>[/code]

[[i] 本帖最后由 hanyeguxing 于 2011-2-8 11:15 编辑 [/i]]

Hello123World 发表于 2011-7-20 17:00

[b] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=8868&ptid=1655]1#[/url] [i]batman[/i] [/b]
1-6题:[code]@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[/code]

Hello123World 发表于 2011-7-20 17:09

第7题格式上有点问题:[code]@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[/code]

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.