数学表达式计算器

今天闲来无事,使用C++写了一个数学表达式计算器,即输入一段包含数字、加减乘除(+、-、*、/)、括号(()),输出计算的结果,例如输入:1+2*3+4,输出11。

代码中,并没有使用逆波兰式实现,之所以没用,是因为我希望遍历完整个字符串后,就能得到我期待的中间结果,最后使用中间结果进行加或减即可,以达到最大性能。其中,中间结果可能是表达式中算法的积或者商,或者括号中的子表达式计算出来的结果。因为存在子表达式,所以使用递归算法来计算出子表达式的结果。无论怎么样,我的目的,不希望多次遍历字符串,只希望遍历一次字符串,但是遍历过程中只是计算出来中间结果,所以使用到栈这个数据结构来存储中间结果,等遍历完整个字符串后,就得到所有的中间结果,最后从栈中弹出中间结果计算出最终结果。

整体来看,有效代码,大概150行左右,不包括测试代码,感觉还可以优化更简洁写,然后异常的话,兼容类似,-1+2、-1+2+-3,即数字前面可以有+/-表示正数还是负数,还有允许前后,中间有空格(\’ \’、\’\\n\’、\’\\t\’),-1+2+-3+4 4,这个4 4按44来处理,还有就是不支持除以0。

最后,再说下,为什么想写这个。一个觉得有趣,一个觉得看看一次遍历字符串结合状态机能不能很好的完成这件事情,目前来看,虽然代码简洁性、程序健壮性还有优化空间,但目的达到了,这里更像给大家,希望能帮助到有需要的小朋友。如若您觉得对您有帮助,谢谢点击上您的小爱心,您的鼓励是我的动力,谢谢。然后这里再提一下,下一次,我还想写一个类似遍历字符串就完成解析工作的代码,可能是解析http请求、可能是解析c语言源代码、可能是解析html,可能是解析elf二进制格式,我内心最感兴趣的是些解析c语言源代码的,但是刚觉空闲时间也就可能只能解析出中间结果,至于运行还需要更多空闲时间,要解决运行时考虑的相互引用问题,需要的时间就更多,这个挑战就更大啦,不过没挑战,也没写的兴趣。所以,还没决定好,敬请期待啦~

所有代码如下:包括测试代码,全部放在一个文件:

输出的结果为:

使用 Go GUI 库 fyne 编写一个计算器程序

以下文章来源于GoUpUp ,作者dj

在之前文章中,我们介绍了一个 Go 的高颜值 GUI 库fyne。本文接着,介绍如何使用fyne编写一个简单的计算器程序。程序效果如下:

我们使用widget.Entry来显示输入的数字、运算符和运算结果。先创建一个widget.Entry对象,设置可显示多行:

其它数字和符号控件都用widget.Button来表示。按钮也分为两种,一种是没有特殊效果的,点击后直接在显示框中添加对应的字符即可。一种是有特殊效果的,例如清空显示框(AC)、进行计算(=)。中间三行按钮都是前一种,我们使用GridLayout来布局,每行显示 4 个:

input回调后面介绍。

第一行有 3 个具有特殊效果的按钮:

  • AC:清空显示框;
  • +/-:切换正负号;
  • %将数字变为百分数,即除以 100。

外加一个除法按钮。这一行同样使用GridLayout布局:

几个回调处理后面统一介绍。

最后一行由于0这个按钮宽度是其它按钮的 2 倍。我们先使用GridLayout布局,将这一行平均分成两Grid(即每行 2 个控件)。按钮0独占一个Grid,由于GridLayout布局中每个Grid大小相同,故按钮0有整个行一半的宽度。后一个Grid,按钮.和=平分,同样使用一个GridLayout达到这个效果:

最后我们将所有部分用垂直的BoxLayout组合到一起:

在实际开发中,一般会组合使用多种布局实现界面效果。

清空按钮响应比较简单,直接将显示框的Text设置为空即可:

注意,要调用Entry.Refresh()方法刷新界面。由于按钮响应都是对应显示框进行操作,所以都需要传入该对象。

我们设计在显示框中显示两行,第一行是上次计算的表达式,第二行是本次的。切换正负号在本次只输入一个数字时将该数字的正负号进行切换:

输入回调我们只做了简单的处理——将对应字符串拼接到显示框中:

计算表达式的函数也很简单,我这里使用了govaluate库(可以看我之前的文章):

注意,这里做了一点容错,把前后多余的运算符去掉了。另外,我们前面为了显示,使用了÷表示除法符号,×表示乘法符号。要使用govaluate,必须将它们分别替换为/和*。

至此计算器就编写完成了,下面我们介绍如何打包。

准备好一张图片资源作为图标,放到项目目录下:

打包:

在同目录下生成了一个.exe文件和一个.syso文件。现在可直接点击calculator.exe运行程序,没有其他依赖。

本文介绍如何使用fyne编写一个简单的计算器程序,主要介绍如何组合使用多种布局。当然计算器功能和错误处理还不完善,而且实现偏过程式编程,感兴趣的可自行完善。完整代码在fyne/calculator中。

大家如果发现好玩、好用的 Go 语言库,欢迎到 Go 每日一库 GitHub 上提交 issue

  1. fyne GitHub:https://github.com/fyne-io/fyne
  2. fyne 官网:https://fyne.io/
  3. fyne 官方入门教程:https://developer.fyne.io/tour/introduction/hello.html
  4. Go 每日一库 GitHub:https://github.com/darjun/go-daily-lib

简单的html网页(社保计算器)

<!DOCTYPE html>

<html>

<head>

<meta charset=\”UTF-8\”>

<title>个人社保计算器–网页版</title>

<script src=\”https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js\”></script>

<script src=\”https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js\”></script>

<link href=\”https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css\” rel=\”stylesheet\”>

<script><!–脚本–>

function calc(){

//1.把用户输入的工资拿到

//jQuery函数

sal = $(\”#salary\”).val();

//2.把sal转成数字

salnum = parseInt(sal);

//3.开始计算

//3.1 算各种数据

ylgr = salnum * 0.08;

ylgs = salnum * 0.2;

ybgr = salnum * 0.02;

ybgs = salnum * 0.06;

sygr = salnum * 0.0005;

sygs = salnum * 0.0015;

gsgs = salnum * 0.0005;

sybx = salnum * 0.0008;

gjjgr = salnum * 0.12;

gjjgs = salnum * 0.12;

grhj = ylgr+ybgr+sygr+gjjgr;

gshj = ylgs+ybgs+sygs+gsgs+sybx+gjjgs;

total = grhj+gshj;

//4.把计算结果放到格子里

$(\”#ylgr\”).text(ylgr);

$(\”#ylgs\”).text(ylgs);

$(\”#ybgr\”).text(ybgr);

$(\”#ybgs\”).text(ybgs);

$(\”#sygr\”).text(sygr);

$(\”#sygs\”).text(sygs);

$(\”#gsgs\”).text(gsgs);

$(\”#sybx\”).text(sybx);

$(\”#gjjgr\”).text(gjjgr);

$(\”#gjjgs\”).text(gjjgs);

$(\”#grhj\”).text(grhj);

$(\”#gshj\”).text(gshj);

$(\”#total\”).text(total);

}

</script>

</head>

<body>

<div class=\”container text-center\”>

<h1>个人社保计算器</h1>

<table class=\”table table-bordered\”>

<tr>

<td>工资</td>

<td colspan=\”3\”>

<input id=\”salary\” class=\”form-control\” placeholder=\”请输入工资\” type=\”text\” >

</td>

<td>

<button onclick=\”calc()\” class=\”btn btn-danger btn-block\”>计算</button>

</td>

</tr>

<tr class=\”bg-primary\”>

<td>险种</td>

<td>个人%</td>

<td>个人</td>

<td>公司%</td>

<td>公司</td>

</tr>

<tr>

<td>养老</td>

<td>8%</td>

<td id=\”ylgr\”></td>

<td>20%</td>

<td id=\”ylgs\”></td>

</tr>

<tr>

<td>医保</td>

<td>2%</td>

<td id=\”ybgr\”></td>

<td>6%</td>

<td id=\”ybgs\”></td>

</tr>

<tr>

<td>失业</td>

<td>0.5%</td>

<td id=\”sygr\”></td>

<td>1.5%</td>

<td id=\”sygs\”></td>

</tr>

<tr>

<td>工伤</td>

<td></td>

<td></td>

<td>0.5%</td>

<td id=\”gsgs\”></td>

</tr>

<tr>

<td>生育</td>

<td></td>

<td></td>

<td>0.8%</td>

<td id=\”sybx\”></td>

</tr>

<tr>

<td>公积金</td>

<td>12%</td>

<td id=\”gjjgr\”></td>

<td>12%</td>

<td id=\”gjjgs\”></td>

</tr>

<tr>

<td>合计</td>

<td>个人合计</td>

<td id=\”grhj\”></td>

<td>公司合计</td>

<td id=\”gshj\”></td>

</tr>

<tr>

<td>总额</td>

<td colspan=\”4\” id=\”total\”></td>

</tr>

</table>

开发者:一字赌团队2021

</div>

</body>

</html>

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。