作业三

合作者学号及博客链接

设计思路

实现这个计算器主要有两方面的内容

  • 随机生成题目

  • 得到题目的正确答案

除了这两个部分其他的诸如中英双界面什么的都不是问题,也因此我和我的队友各负责一部分,我负责得出正确的答案。

关于计算功能的实现我第一反应是仿照编译器的编译原理,好像是用了一种树形结构来处理算式,但好像处理起来也很复杂的样子,于是我还是决定用传统的人的思维来解决计算的问题,首先需要两个容器,一个存放数字,一个存放运算符,然后在运算符容器中不断寻找除号和乘号,然后对数字容器运算,再寻找加号和减号,运算同上。这样一个没有括号的四则运算就完成了。我把这个过程设为 count() ,然后再设置一个 getAnswer() ,在这个函数中不断寻找括号,将括号及其内容变为使用count得出的答案,例如将1+(1+1) 变为 1+2,再处理完括号后,再执行一遍 count(),最终答案就出来了。

当然实际实现过程没这么简单,过程中伴随着大量的bug。一下列出碰到的逻辑bug警醒我编程道路的凶险。

  • bug 1 运算符的优先级

最初我是按照乘除加减的优先级来进行运算的,但后来发现不可行,比如 1-1+1,就会变成1-2,答案就会是-1,所以后来我用乘除一并寻找,谁在前面先算谁的方针,解决了这一bug。

  • bug 2 括号内的分数

我对括号的处理是如果括号内答案有分数,将其变为假分数,比如(3-1/2)就是5/2而不是2+1/2,这就导致了一个问题,5/(3/2)和5/3/2答案是不同的,当初以为乘除的优先级相同,括号没影响,没想到会出现这样的问题,最后我在括号处理的那部分代码加上一个条件判断,如果括号前是除号且括号内为分数,将分数内的除号变为乘号,这样就能完美解决这个bug了。

  • bug 3 提前删除运算符

这个是我的实现的问题,在加减运算方面因为分数的存在,需要额外判别当前加减符号的前后有没有除号,有则是分数,我分了四种情况,每种情况处理完后都会删除当前的加减号,这就出现了一个问题,比如 1-1+2/3 ,会对减号进行运算,算式变为0+2/3,这是当前运算符变为+,因为减号被删除了,问题就在这,四种情况的if是并列的,接下来程序会判别 + 后面是 / ,就又会进行一次减法运算,同时删除 + ,最后处理方法就是将运算符的删除放在最后,就不会有这个问题了。提这个问题主要是提醒各位,在用到if的时候要注意逻辑的清晰,同时要注意变量的改变对其他if的影响。

编码规范

  • 题目和答案的返回使用string类型
  • 计算答案的类名solve,存放在solve.h中,solve有一个getAnswer方法,传入string类型的题目,返回string类型的答案

本来想让队友也写类的,奈何还不会,我也不知道队友是如何写随机生成题目的,唯一肯定的是题目是string类型,并保证分母不为0。

程序的实现和结果测试的截图

github的提交链接和提交日志截图

代码链接

分工和协作证据截图

合作过程

基本上在组完队友后就明确了职责,我和队友各负责一部分,彼此不会产生干扰,就是完成自己的功能部分就没事了,本来我是想和队友各写一个类,我负责main函数的编写,主要就是调用方法。但是队友好像还不会类,而且还要用main来生成题目,所以就把main函数的编写也交给他,我只负责solve类的编写。完成后上传GitHub,剩下的就是修复测试中碰到一些少见的bug。

合作体会

总的来说感觉还好。个人负责自己的代码的话编写的效率也高,不必费力气去理解别人的代码是什么意思。合作的话只要有一定的规范,基本和自己编码没什么差。

原文地址:https://www.cnblogs.com/unbelievablecj/p/6402109.html