技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 85|回复: 5
收起左侧

更新 【批处理】解一元二次方程

[复制链接]

6

主题

30

帖子

189

积分

用户组: 小·技术宅

UID
3517
精华
0
威望
0 点
宅币
152 个
贡献
7 次
宅之契约
0 份
在线时间
23 小时
注册时间
2018-3-2
发表于 6 天前 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
本帖最后由 套路 于 2018-6-16 22:43 编辑

更新:对显示进行优化,可显示带入求根公式的过程

批处理来计算一元二次方程 看起来很简单
不就是利用这个公式
但是
批处理不像C语言,VB等等一样能计算小数和平方根!!!
所以只能用乘除来计算平方根的近似值,在将小数点当成字符插入
[Patch] 纯文本查看 复制代码
@echo off
title 解一元二次方程
:menu
set a=
set b=
set c=
cls
echo aX^^2+bX+c=0 (a≠0)
echo 注:因为批处理不支持小数运算,a,b,c的值请化为整数
set /p a=a^=
set /p b=b^=
set /p c=c^=
::判断是否为数字
set /a a1=a+0
set /a b1=b+0
set /a c1=c+0
if not "%a1%"=="%a%" (goto no1) 
if not "%b1%"=="%b%" (goto no1) 
if not "%c1%"=="%c%" (goto no1) 
::对显示进行美化
if %b% GTR 0 (set b2=+%b%) else (set b2=%b%)
if %c% GTR 0 (set c2=+%c%) else (set c2=%c%)
if %a%==0 (set a2=) else (set a2=%a%)
if %a%==1 (set a2=)
if %b%==0 (set b2=+)
if %c%==0 (set c2=+0)
::判断根的情况
If "%a%"=="0" goto no
set /a h=%b%*%b%-4*%a%*%c%
If "%h%"=="0" goto yeah
If %h% lss 0 goto no2
If %h% GTR 0 goto yes
 
:no
echo.
echo 错误:
echo a=0,不是一元二次方程
pause
goto menu
 
:no1
echo.
echo 错误:
echo a,b,c只能为数字且不能超过批处理支持的最大的数2147483647!
echo 如果没有此项,请用0表示
pause
goto menu
 
:no2
echo.
echo 错误:
echo △=%h%^<0
echo 该方程无实数根
pause
goto menu
 
:yes
::计算判别式的平方根的100倍
set /a d=h
set /a d*=10000,r=d
for /l %%d in (1,1,100) do set /a r=(r+d/r)/2
set /a g=r*r,d/=10000
::计算X1,X2的100倍
set /a x1=(-%b%*100+%r%)/(%a%*2)
set /a x2=(-%b%*100-%r%)/(%a%*2)
::如果不是3位数,前几位补零
set /a x11=x1
if %x1% LSS 0 (
set /a x1=x1*-1
)
if %x1% LSS 10 (
set x1=00%x1%
)
if %x1% LSS 100 (
if %x1% GEQ 10 (
set x1=0%x1%
))
if %x1% GEQ 100 (
set x1=%x1%
)
if %x11% LSS 0 (
set x1=-%x1%
)
set /a x21=x2
if %x2% LSS 0 (
set /a x2=x2*-1
)
if %x2% LSS 10 (
set x2=00%x2%
)
if %x2% LSS 100 (
if %x2% GEQ 10 (
set x2=0%x2%
))
if %x2% GEQ 100 (
set x2=%x2%
)
if %x21% LSS 0 (
set x2=-%x2%
)
::在倒数第二位前加上“.”
set /a n=-b
set /a m=2*a
cls
echo %a2%X^^2%b2%X%c2%=0
echo △=%h%
echo X1=(%n%+√%h%)/%m%=%X1:~,-2%.%X1:~-2%
echo X2=(%n%-√%h%)/%m%=%X2:~,-2%.%X2:~-2%
pause
goto menu
 
:yeah
set /a x=(-%b%)/(%a%*2)
set /a n=-b
set /a m=2*a
cls
echo %a2%X^^2%b2%X%c2%=0
echo △=%h%
echo X1=X2=(%n%+0)/%m%=%x%
pause
goto menu

保留2位小数有点不准确,但每多保留一位就要多写很多代码,所以就将就这样吧

3

主题

33

帖子

119

积分

用户组: 小·技术宅

UID
3808
精华
0
威望
0 点
宅币
86 个
贡献
0 次
宅之契约
0 份
在线时间
18 小时
注册时间
2018-5-6
发表于 6 天前 | 显示全部楼层
试验了一下,还真的可以,但是我试验的时候有一些乱码。
感觉像是中文的字符出现了乱码

6

主题

30

帖子

189

积分

用户组: 小·技术宅

UID
3517
精华
0
威望
0 点
宅币
152 个
贡献
7 次
宅之契约
0 份
在线时间
23 小时
注册时间
2018-3-2
 楼主| 发表于 6 天前 | 显示全部楼层
溯影 发表于 2018-6-14 16:52
试验了一下,还真的可以,但是我试验的时候有一些乱码。
感觉像是中文的字符出现了乱码 ...

应该是保存时不是ANSI编码吧

3

主题

33

帖子

119

积分

用户组: 小·技术宅

UID
3808
精华
0
威望
0 点
宅币
86 个
贡献
0 次
宅之契约
0 份
在线时间
18 小时
注册时间
2018-5-6
发表于 6 天前 | 显示全部楼层
套路 发表于 2018-6-14 17:33
应该是保存时不是ANSI编码吧

我用notepad++保存的,保存的编码是utf-8时候汉字是正常的,但是别的编码例如ansi,gb2312等都是中文乱码,但是运行的时候即使是utf-8也是中文显示乱码。

3

主题

33

帖子

119

积分

用户组: 小·技术宅

UID
3808
精华
0
威望
0 点
宅币
86 个
贡献
0 次
宅之契约
0 份
在线时间
18 小时
注册时间
2018-5-6
发表于 6 天前 | 显示全部楼层
套路 发表于 2018-6-14 17:33
应该是保存时不是ANSI编码吧

哦哦,感谢指点,我刚百度了一下,小弟我在试一下。

3

主题

33

帖子

119

积分

用户组: 小·技术宅

UID
3808
精华
0
威望
0 点
宅币
86 个
贡献
0 次
宅之契约
0 份
在线时间
18 小时
注册时间
2018-5-6
发表于 6 天前 | 显示全部楼层
可以了,另存为,然后编码是ansi就可以了。
学习了

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-6-20 17:39 , Processed in 0.077576 second(s), 15 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表