Windows批处理数值计算实战
文章目录
- 需求和框架
- 转二进制
- 最大公约数和最小公倍数
- 打印乘法表
源码:https://download.csdn.net/download/m0_37816922/89070635
需求和框架
为了巩固命令行的编程技巧,下面编写一个批处理程序,用以实现如下8种功能。
其中框架代码如下,首先关闭回显;然后来一个start标签,每次计算完成之后,都要回到这个标签处。%Mode%用于选择不同的计算功能,当输入不同的数字时,将跳转到不同的Model,这些Model标签,将在后续补充完整。本文对前四个功能进行讲解。
@echo off
:start
echo ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
echo ┃ 工作模式 ┃
echo ┃ 1 2的n次方 2 二进制转换 ┃
echo ┃ 3 最大公约数和最小公倍数 ┃
echo ┃ 4 打印乘法表 5 打印幻方 ┃
echo ┃ 6 查找勾股数 7 查找水仙花数 ┃
echo ┃ 8 生成随机数 ┃
echo ┃ 其他输入均退出 ┃
echo ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛set /P Mode=请输入计算模式:if %Mode%==0 (goto :eof
)else if %Mode%==1 (goto :Mode1
)else if %Mode%==2 (goto :Mode2
)else if %Mode%==3 (goto :Mode3
)else if %Mode%==4 (goto :Mode4
)else if %Mode%==5 (goto :Mode5
)else if %Mode%==6 (goto :Mode6
)else if %Mode%==7 (goto :Mode7
)else if %Mode%==8 (goto :Mode8
)else if %Mode%==9 (goto :Mode9
)else (goto :eof
)
转二进制
二进制转换是经常遇到的一个需求,批处理可以非常便捷地完成这个工作。而二进制转化过程中,第一步就是和 2 n 2^n 2n比较大小,所以在实现这个功能之前,不妨实现一个计算2的n次方的功能,代码如下
:Mode1
set /P N=请输入一个数字:
set /a NN=1"<<"%N%
echo 2的%N%次方等于%NN%
pause
goto :start
转二进制的逻辑就是,从高位到低位,对输入数值和 2 n 2^n 2n做比较,如果大于 2 n 2^n 2n,那么第 n n n位就设为1,同时减去 2 n 2^n 2n,否则这一位就是0。由于批处理的数字实质上是有符号的32位整型,所以能够转换的最大整数就是 2 31 − 1 2^{31}-1 231−1。
代码如下
:Mode2
setlocal enabledelayedexpansion
set /P N=请输入一个数字:set str=0b
for /L %%i in (30, -1, 0)do (set /a div=1"<<"%%iif !N! geq !div! (set /a N=!N!-!div!set str=!str!1)else (set str=!str!0)
)
echo 二进制转化结果:%str%
pause
goto:start
计算结果为
请输入计算模式:2
请输入一个数字:25
二进制转化结果:0b0000000000000000000000000011001
最大公约数和最小公倍数
辗转相除法可以说十分经典了
:Mode3set/p a=输入第一个数
set/p b=输入第二个数
set/a ab=%a%*%b%
set str= %a%和%b%的:gcdloop
set/a num2=%a%%%b%
if %num2% gtr 0 set/a a=%b%&set/a b=%num2%&goto gcdloop
set /a num=%ab%/%b%
echo %str%最大公约数为%b%;最小公倍数为%num%
pause
goto:start
打印乘法表
打印乘法表的时候有个问题,就是echo完事儿之后是默认要回车的,所以每次做完乘法之后,若直接echo出去,那就做不出来所谓的“表”了,为了能真正打印出一张表,所以用P模式的set命令来进行输入。
而且貌似批处理没法单独打印空格或者制表位,所以在制表位前面加个小数点,最后得到的乘法表就像下面这样
代码如下
:: 模式4 打印乘法表
:Mode4
SETLOCAL ENABLEDELAYEDEXPANSION
set line=━━━━━━━━━━━━━━━━━━━━━━━
echo ┏%line%%line%%line%━━┓
for /L %%i in (1,1,9) do (set /p="┃ " < nulfor /L %%j in (1,1,%%i) do (set /a h=%%i*%%jset /p =%%i×%%j^=!h! <nul)for /L %%j in (%%i,1,8) do (set /p =. <nul)echo ┃
)
echo ┗%line%%line%%line%━━┛
pause
goto:start