[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

出题目的:
        掌握数值计算
解题要求:
        代码通用、高效
        尽量简洁
        不生成临时文件
加分规则:
        1 新手完成前六个步骤的加分10分
   2 新手完成前七个步骤的加分15分
   3 老手完成第七个步骤的加分10分
   4 老手完成第七、第八步骤的加分15分
题目如下:
  通过批处理实现如下操作(要求适应于1-9的输入数)

解题限制:
  请老手不要写出前六个步骤的代码(不要求老手完成)
  高手只需完成第八个步骤
-------------------------------------------------------------------------
螺旋矩阵的解见:18楼我的解和19楼terse的解

[ 本帖最后由 Batcher 于 2009-5-1 21:13 编辑 ]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
***共同提高***

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set /a length=20 & set /a width=23
  4. set /a max=length*width
  5. call :len %max% maxlength
  6. 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
  7. :setvalue
  8.     set /a count+=1
  9.     call :loop temp %count% %maxlength%
  10.     set matrix[%i%][%j%]=%temp%
  11.     if "%idelta%,%jdelta%"=="0,1" ( if %j%==%jmax% ( set /a idelta=1 & set /a jdelta=0 & set /a jmax-=1 ))
  12.     if "%idelta%,%jdelta%"=="1,0" ( if %i%==%imax% ( set /a idelta=0 & set /a jdelta=-1 & set /a imax-=1))
  13.     if "%idelta%,%jdelta%"=="0,-1" ( if %j%==%jmin% ( set /a idelta=-1 & set /a jdelta=0 & set /a jmin+=1))
  14.     if "%idelta%,%jdelta%"=="-1,0" ( if %i%==%imin% ( set /a idelta=0 & set /a jdelta=1 & set /a imin+=1))
  15.     set /a i+=idelta & set /a j+=jdelta
  16.     if %count% lss %max% (
  17.         goto:setvalue
  18.     )
  19. for /l %%i in (1,1,%length%) do (
  20.     set str=!matrix[%%i][1]!
  21.     for /l %%j in (2,1,%width%) do ( set "str=!str! !matrix[%%i][%%j]!" )
  22.     echo !str!
  23. )
  24. exit
  25. :loop
  26.    set number=         %2
  27.    set %1=!number:~-%3!
  28. goto :eof
  29. :len
  30.    set Tempstrs=%~1 & Set Tempnum=0
  31.    :下一位
  32.       set Tempstr=!Tempstrs:~%Tempnum%,1!
  33.       if defined Tempstr ( set /a Tempnum+=1 & goto :下一位 )
  34.       set /a %~2=%Tempnum%-1
  35. goto :eof
复制代码

TOP

求点评~~~
1-6:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p "p=请输入要操作的数(1-9):"
  3. set j=1
  4. for /l %%a in (1,1,%p%) do (
  5. set /a p2=%%a*%%a
  6. set /a p3=%%a*%%a*%%a
  7. set /a h=!h!+%%a
  8. set /a j=%%a*!j!
  9. set /a ph=!ph!+!p2!
  10. set /a lh=!lh!+!p3!
  11. )
  12. echo %p%的平方:%p2%
  13. echo %p%的立方:%p3%
  14. echo 从1到%p%的和:%h%
  15. echo 从1到%p%的积:%j%
  16. echo 从1到%p%的平方和:%ph%
  17. echo 从1到%p%的立方和:%lh%
复制代码
数列:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p "p=请输入要操作的数(1-9):"
  3. for /l %%a in (1,1,%p%) do (
  4. for /l %%i in (1,1,%p%) do (
  5. set /a n+=1
  6. set /p=!n! <nul
  7. )
  8. echo;
  9. )
复制代码
螺纹:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p p=输入:
  3. set /a x=1,num=%p%,sum=%p%*%p%
  4. set yuns=--
  5. for /l %%y in (1,1,%num%) do (set/a n+=1,y+=1&set _%x%_%%y=!n!)
  6. :lp
  7. set /a num-=1
  8. for /l %%a in (1,1,%num%) do (set/a n+=1,x=!x!%yuns%1&set _!x!_!y!=!n!)
  9. set yuns=-%yuns%
  10. for /l %%a in (1,1,%num%) do (set/a n+=1,y=!y!%yuns%1,ys+=1&set _!x!_!y!=!n!)
  11. if not %n% equ %sum% goto :lp
  12. for /l %%a in (1,1,%p%) do (
  13. for /l %%b in (1,1,%p%) do (
  14. set /p=!_%%a_%%b! <nul
  15. )
  16. echo;
  17. )
复制代码

TOP

第一到第六题。
  1. @echo off
  2. set /p no=请输入想要操作的数  (1-9) :
  3. set /a no1=%no%*%no%
  4. set /a no2=%no%*%no%*%no%
  5. for /l %%i in (1 1 %no%) do (set /a no3+=%%i)
  6. set no4=1
  7. for /l %%i in (1 1 %no%) do (set /a no4*=%%i)
  8. for /l %%i in (1 1 %no%) do (set /a no5+=%%i*%%i)
  9. for /l %%i in (1 1 %no%) do (set /a no6+=%%i*%%i*%%i)
  10. echo %no%的平方为:%no1%
  11. echo %no%的立方为:%no2%
  12. echo 1到%no%的和为:%no3%
  13. echo 1到%no%的积为:%no4%
  14. echo 1到%no%的平方和为:%no5%
  15. echo 1到%no%的立方和为:%no6%
  16. pause>nul
复制代码
nothing's gonna change
and I've never changed

TOP

第7题格式上有点问题:
  1. @echo off&Setlocal EnableDelayedExpansion
  2. For /l %%i in (1 1 16) do (Set a=%%i
  3. Set /p =!a! <nul
  4. Set /a b=!a!%%4
  5. If !b!==0 Echo\)
  6. pause
复制代码

TOP

1# batman
1-6题:
  1. @echo off & setlocal enabledelayedexpansion
  2. Set /p a=请输入要操作的数(1-9):
  3. Set /a b=%a%*%a%
  4. Set /a c=%a%*%a%*%a%
  5. Set e=1
  6. For /l %%i in (1 1 %a%) do (Set /a d+=%%i & Set /a e*=%%i
  7. Set f=%%i & Set /a f*=!f! & Set /a g+=!f!
  8. Set f=%%i
  9. Set /a h=!f!*!f!*!f! & Set /a m+=!h!
  10. )
  11. Echo %a%的平方:%b%
  12. Echo %a%的立方:%c%
  13. Echo 1到%a%的和:%d%
  14. Echo 1到%a%的积:%e%
  15. Echo 1到%a%的平方和:%g%
  16. Echo 1到%a%的立方和:%m%
  17. pause
复制代码

TOP


使用对角分割解螺旋方阵:
  1. @echo off
  2. :s
  3. setlocal enabledelayedexpansion&cls
  4. set/p n=输入阶数:
  5. if %n% gtr 46340 goto:s
  6. set/a k=n*n&set k= !k!
  7. for /l %%a in (1,1,11) do if not "!k:~%%a,1!"=="" set q=%%a&set "s=!s! "
  8. for /l %%a in (1,1,%n%) do (
  9.         for /l %%b in (1,1,%n%) do (
  10.                 set/a k=n+1-%%a
  11.                 if %%b geq %%a if %%b leq !k! set/a "p=4*(n-%%a)*%%a-4*n+7*%%a+%%b-3"
  12.                 if %%b leq %%a if %%b gtr !k! set/a "p=4*(n-%%a)*%%a-2*n+5*%%a-%%b-1"
  13.                 if %%b gtr %%a if %%b gtr !k! set/a "p=4*(n-%%b)*%%b-2*n+%%a+3*%%b-1"
  14.                 if %%b lss %%a if %%b leq !k! set/a "p=4*(n-%%b)*%%b-%%a+%%b+1"
  15.                 set p=%s%!p!&set/p"=!p:~-%q%! "<nul
  16.         )
  17.         echo;
  18. )
  19. pause&endlocal&goto:s
复制代码
JS版:
  1. <script>
  2. hy(20);
  3. function hy( n)
  4. { var i,j;
  5. document.write("<body bgcolor=#008000><center><table border=1 bgcolor=#B0E2FF bordercolor=#fff000> ");
  6. for(i=1;i<=n;i++){document.write("<tr>");
  7. for(j=1;j<=n;j++){
  8. var Han=4*(n-i)*i-4*n+7*i+j-3;
  9. var Ye=4*(n-j)*j-2*n+i+3*j-1;
  10. var Gu=4*(n-i)*i-2*n+5*i-j-1;
  11. var Xing=4*(n-j)*j+-i+j+1;
  12. 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>");}
  13. document.write("</table> ");
  14. }
  15. </script>
复制代码

[ 本帖最后由 hanyeguxing 于 2011-2-8 11:15 编辑 ]
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
2

评分人数

    • zm900612: 厉害,学习下技术 + 1
    • stance: 哇塞,好强壮哦。技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

第八题

@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

TOP

看了19楼的代码,原来是通过定位坐标的方式,形成螺旋阵列。

我知道还有通过坐标定位的另一种方式,只是不知道,具体怎么写。

坐标定位,好像是:
1-1 1-2 1-3 1-4
2-1 2-2 2-3 2-4

继续学习,继续研究!
(*^_^*)

TOP

回复 17楼 的帖子

既然设定整个代码不断循环,就要把tempnum在下一次循环时,清零。要么就不要进行循环。
(*^_^*)

TOP

回复 5楼 的帖子

pp 是立方,你写的是平方。。。。。

TOP

第7题:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p num=请输入要操作的数,范围是1-9:
  3. echo\&echo %num%行%num%列数列:
  4. for /l %%i in (1 1 %num%) do (
  5.     for /l %%j in (1 1 %num%) do (
  6.          set /a sum7+=1&set sum7= !sum7!&set /p=!sum7:~-2! <nul
  7. )
  8. echo\
  9. )
  10. echo\&pause
复制代码
(*^_^*)

TOP

1-6:
  1. @echo off
  2. set /p num=请输入要操作的数,范围是1-9:
  3. set sum4=1
  4. for /l %%i in (1 1 %num%) do (
  5.      set /a sum1=%%i*%%i,sum2=sum1*%%i,sum3+=%%i,sum4*=%%i,sum5+=sum1,sum6+=sum2
  6. )
  7. echo\
  8. echo %num%的平方是:%sum1%
  9. echo %num%的立方是:%sum2%
  10. echo 从1到%num%的和:%sum3%
  11. echo 从1到%num%的积:%sum4%
  12. echo 从1到%num%的平方和:%sum5%
  13. echo 从1到%num%的立方和:%sum6%
  14. echo\&pause
复制代码
(*^_^*)

TOP

骗分
  1. @echo off&Setlocal EnableDelayedExpansion
  2. Set /p N=num:
  3. Set /a ALL=N*N,w=0,h=w,s=h,c=s,l=n-1
  4. For /l %%a in (1,1,%all%) Do (Set _o!h!!w!=%%a
  5. if !c! EQU 0 (call :c w + GEQ 1 "l-s") else  if !c! EQU 1 (call :c h + GEQ 2 "l-s"
  6. ) 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")
  7. for /f "tokens=1,2 delims==" %%a in ('set _o^|sort') do (
  8. Set/P=%%b <nul&Set /a count+=1,1/^(count%%%N%^)2>nul||echo.)
  9. pause >nul&goto :eof
  10. :c
  11. Set /a %1%2=1,tmp=%~5
  12. if !%1! %3 %tmp% Set /a %1=tmp,c=%~4
  13. goto :eof
复制代码

TOP

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

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

TOP

返回列表