windows批处理文件打印幻方

时间:2022-08-04 06:02:51

无论是批处理文件还是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