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

转载于:https://www.cnblogs.com/weiyinfu/p/6366711.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值