结对编程复盘-小初高数学习系统
前言
在之前,有做过生成小初高试卷的个人项目。在这个项目中,我花费了很多时间学习写ui界面,创建监听实现功能响应。对于javax.swing.*包下的框体Jframe以及各种轻量级组件的使用有了一些心得。可以通过对类重写达到自己喜欢的效果。监听的设置也用到很多。对按钮监听,使用actionlistener等。
在这个过程中我也尝试对标签进行监听,发现对标签进行监听只能一个监听器对应一个标签,不然无法判断点击的哪个标签。这都是我在个人项目中获得的经验。
这次结对编程我和我的partner乔祥硕经过商量,这次他负责整个程序框架的构建和ui设计,我就负责我前期个人项目的弱项:题目的生成以及结果的运算部分,相当于对彼此的弱项进行加深巩固,达到共同提高的目的。
言归正传
前期:
队友乔祥硕思路清晰,将程序分为了一下几个部分:短信验证码功能实现、UI界面实现、出题功能的实现、题目正确答案的计算与四个选项的给定。他负责登录界面,短信验证,修改密码选择出题类型和做题界面的设置。承担了整个程序框架,和大部分工作。这里实名点赞。
整体的框架由乔构建,我负责给出题目和正确结果以及四个选项。那么两个人如何实现精准对接,如何统一接口,是我们起先考虑的问题。在这里,经过深思熟虑,我们决定他传给我一个String型的出题类型,和一个int型的出题数目。而我就以链表的形式存储题目、正确答案、模拟出的四个选项。然后在通过出题类调用链表存储数据。在他那边通过调用出题类就可以取出链表中的值显示在做题界面上。
商定好之后,我就开始我的工作:出题、算答案。
中期:
在这里对于随机生成计算式我就不过多的赘述了。我将重点的精力放在了如何计算一个有根号、平方、乘号、除号、sin、tan、cos、+、-、多重括号的式子。
兵马未动、粮草先行。打赢一场仗的必备条件就是要充足准备。 我在网上查了一些相关资料,大部分都是用逆波兰表达式求解。实际上就是通过定义优先级,然后入栈出栈,以计算机习惯的顺序进行计算。大概看懂了,但是又觉得索然无味。没有采用。
在partner-乔祥硕对操作数进行运算的思路下,我进行了实际的探索和深挖。最终完成了最后的计算代码。
算法简析:
先不去理会根号,我们知道对于加减乘除、根号、平方、三角函数中,根号和平方、三角函数优先级更高,接着才是加减乘除。如果我们以操作数为操作对象,那么就是先对他的根号、三角函数、平方进行处理。形成只有加减乘除的运算,再乘除,最后加减。看起来很简单对吧。
但是遇到括号怎么办呢?
解决方法就是把括号整体看做一个操作数来处理。
那么问题又来了,括号里的式子的值是不知道的,我们怎么对她进行运算处理呢?
解决就是递归!
通过递归返回括号里表达式的值,作为当前的一个操作数,进行运算。
A op B op (c+d) op E
如以上式子,总共记做4个操作数。我们对其进行前后遍历,运算去掉根号,三角运算,平方。然后就如最开始一样运算。
当然这是一个String型,运算还是很复杂的。下面写下算法步骤。
1.定义一个运算函数 double Calculate(char []ch,left,right) ch是字符串数组名,left,right是左右括号的位置。为什么这样,是为了方便递归。如果刚开始的式子是没有左右括号的,可以先加上在用这个函数处理。函数会返回当前括号中表达式的值。
2.定义三个数组,记录每个操作数的起始位置、终止位置、值。对于非括号的操作数取他的值很简单,对于括号,其value[k]=Calculate(char []ch,left,right);
3.对每个操作数前后进行遍历,对根号、三角函数、平方进行运算,之后更改value的值,并相应的扩展该操作数的起始位置。
4.经过如上操作后,每个操作数与操作数起始位置之间完全由加减乘除连接。我们从左到右遍历当前范围的字符串,找到乘号或者除号,就通过起始位置的比对,找到前一个操作数和后一个操作数,将运算结果存在后一个操作数的value里,然后将其起始位置更改为前一个操作数的起始位置。并将前一个操作数value清0.
5.最后遍历操作数、如果起始位置之前是加号就加到answer里,减号就从answer里减去。没有加减就直接加到结果里。并将answer return.
思路如上,代码还在整理中就先不上传了。希望看到的朋友也可以尝试一下这个思路写一个自己的计算器。
后期:
后期工作主要是查找bug,出一下很奇葩的式子来完善结果。在我和partner乔祥硕找到了一下bug,并全部解决。
1.选项随机出重复
2.由于随机选项是参照正确答案,当正确答案为0,选项也为0.
3.对于多重括号嵌套的优化。
4.如果答案为整数,随机出的选项却有可能是小数的问题。这种题一眼看出答案,视为bug。
5.根号下数值为负数,或者分母为0,或者tan90度的避免,以及科学计数法的不完全显示问题。我们通过判断,如果出现这种题就重出。
我们针对以上bug都已经完成修复。助教如果看到了可以亲自验证。嘿嘿。
最后万分感谢我的partner ,跟着他我确实学到了很多,算法的提升、函数的命名规范等。