zoukankan      html  css  js  c++  java
  • windows批处理文件打印幻方

    无论是批处理文件还是shell都是没有意义的,它们只是一种工具,并且是非常低级难懂的工具。
    如果不会,那就保持不会就好了。不要花费太多时间在这些没意义的事情上。
    批处理的没意义体现在:

    • 难以表达
      随便一门正经的语言就比批处理清晰简洁
    • 玄学
      许多命令设计的毫无道理,白白的占用大脑容量。参数太多了,命令太多了。就连看一遍也要花费很长时间。

    批处理文件注释的四种形式

    1. :: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)
    2. rem 注释内容(不能出现重定向符号和管道符号)
    3. %注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)
    4. :标签 注释内容(可以用作标签下方段的执行内容)

    变量

    %CD% - 扩展到当前目录字符串。
    %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
    %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
    %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
    %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
    %CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。
    %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
    %HIGHESTNUMANODENUMBER% - 扩展到此计算机上的最高 NUMA 节点号。

    set命令

    控制台下输入help查看全部命令
    set命令可以查看全部环境变量
    help set可以查看set命令的详细信息

    • set p
      /P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
      行之前,显示指定的 promptString。promptString 可以是空的。
    • set a
      /A 命令行开关指定等号右边的字符串为被评估的数字表达式。

    其它重要词汇

    help if
    help for

    代码

    只能打印奇数阶幻方

    @echo off 
    :start 
    set /p n=Please input your odd integer:
    set /a p=n%%2
    if %p% equ 0 echo Input error! && goto start
     
    set /a i=%n%
    set /a t=(%n%+1)/2
    set /a a%t%_%n%=1,temp=1,m=n-1,p=n
    :repeat
    set /a p-=1
    if %p% lss 0 goto array
    for /l %%a in (1 1 %m%) do (
       setlocal enabledelayedexpansion
       if !t! gtr %n% set /a t=1
       if !i! gtr %n% set /a i=1
       set /a s=!t!+1,q=!i!+1
       if !s! gtr %n% set /a s=1
       if !q! gtr %n% set /a q=1
       set /a a!s!_!q!=a!t!_!i!+1,t+=1,i+=1
       set /a temp+=1
       if !temp! equ %n% (
             set /a temp=1,tmp=a!s!_!q!,q-=1,i-=1
             if !q! equ 0 set /a q=n
             set /a a!s!_!q!=tmp+1
             goto repeat
       )   
    )
    pause
    :array
    echo Now behold the powerful Magic Sqaure^^!:
    set /a a!t!_!n!=1
    for /l %%c in (!n! -1 1) do (
       for /l %%d in (1 1 !n!) do (
                  set /a result=a%%d_%%c
                  set /p=!result!<nul      
    )
    echo.
    )
    pause>nul
    

    代码详细解释如下

    @echo off
    关闭回显
    :start
    语句标号,用于语句跳转
    set /p n=Please input your odd integer:
    /p开关用于读入数据,读入之前显示提示信息
    set /a p=n%%2
    /a开关用于表达式求值,因为%用来表示变量,所以%%表示一个%,即取模
    if %p% equ 0 echo Input error! && goto start
    如果p==0,说明输入值n为偶数,程序只能处理奇数情况,所以跳转到start,要求用户重新输入
     
    set /a i=%n%
    set /a t=(%n%+1)/2
    set /a a%t%_%n%=1,temp=1,m=n-1,p=n
    在第一行,正中间,填1
    :repeat
    set /a p-=1
    if %p% lss 0 goto array
    p用来记录填过多少个数字,p从n减到0
    for /l %%a in (1 1 %m%) do (
    变量a从1按步长为1递增至m=n-1
       setlocal enabledelayedexpansion
       if !t! gtr %n% set /a t=1
       若t>n,则t=1
       if !i! gtr %n% set /a i=1
       若i>n,则i=1
       a(t,i)处的数值
       set /a s=!t!+1,q=!i!+1
       if !s! gtr %n% set /a s=1
       if !q! gtr %n% set /a q=1
       a(s,q)处的数值,为a(t,i)的右下角
       set /a a!s!_!q!=a!t!_!i!+1,t+=1,i+=1
       令a(s,q)=a(t,i),同时向右下角走一格
       set /a temp+=1
       temp表示当前的一个小圈,也就是斜着填n个数字
       if !temp! equ %n% (
       如果temp=n说明已经走完一个圈了,应该向左下角走一格,如果左下角走出了边界,那就要走回来
             set /a temp=1,tmp=a!s!_!q!,q-=1,i-=1
             if !q! equ 0 set /a q=n
             set /a a!s!_!q!=tmp+1
             goto repeat
             走完一圈之后开始下一圈
       )   
    )
    pause
    :array
    运行结束,下面打印结果
    echo Now behold the powerful Magic Sqaure^^!:
    set /a a!t!_!n!=1
    for /l %%c in (!n! -1 1) do (
    第一重for循环从n递减到1
       for /l %%d in (1 1 !n!) do (
       第二重for循环从1递增到n
              set /a result=a%%d_%%c
              set /p=!result!<nul   
              nul为null文件,因为set /p命令可以输出prompt用于提示用户输入,这里使用nul文件输入空,所以跳过了用户输入过程,只进行提示,也就相当于输出语句   
       )
       echo.
       输出一个换行
    )
    pause>nul
    
  • 相关阅读:
    JVM探究之 —— HotSpot虚拟机对象探秘
    JVM探究之 —— Java内存区域
    线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式
    dubbo线程模型配置
    hash bucket
    java 查看线程的信息
    List,Set,Map存取元素各有什么特点
    java 让图片变黑白
    springMVC 防重校验(拦截器)
    BigDecimal 的幂次方运算
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6366711.html
Copyright © 2011-2022 走看看