结对编程-带UI的小初高数学学习软件

  在看到结对编程的要求之后,我和我的搭档决定使用java来完成结对编程项目,并且使用我之前生成题目的逻辑作为参考。

完成过程:

  首先第一天,我们为如何能成功向手机发送验证码想破了头,经过几番尝试,我们最终选定榛子云作为我们本次要使用的短信发送平台。但是我们在使用过程中,一度认为这个平台在维护中无法使用,并且在写代码实现的过程中,屡屡出错,我们尝试了一个晚上,最终才成功。

  我主要负责的是出题逻辑的这一部分。将已经有的C++代码改成java代码并不困难,但是问题在于如何正确计算这个算式,这就需要我们的算式首先从逻辑上来说是正确的,其次这个算式的计算要符合四则运算的运算规律。因为我第一次写的出题逻辑比较简单,开方和平方操作都只针对的是一个正数,tan不能为90°,所以在出题逻辑这一方面,得到的算式已经是逻辑正确的,就不用修改。难点就落在了如何计算上。

  我使用了一个数组和一个队列来解决这个问题。我的思路是,要符合四则运算的运算规律,那么在计算的时候,就应该先计算乘和除,如果有乘号出现,就把两个要乘的数字相乘后再放入数组里,队列中保存的仅仅是+和-号。利用队列先进先出的特点,相当于从左到右计算这个式子。例如:13+8*9-79 在这个算式中,我们将13放入数组,+号放入队列,遇到8*9这时,首先计算8*9=72,然后将72放入数组,再把-号和79分别放入队列和数组中,这样最终计算的时候,只需要计算13+72-79即可。那么,就迎来了一个新的问题,当出现括号的时候应该如何计算呢?首先,我们将括号中的算式计算出来,然后根据前括号前面一个符号的不同来做出不同的运算。如果前一个符号是+或者-,那么直接将括号中的算式结果加入队列就可以。如果是乘号,那么我们要将这个算式的结果和前一个数字相乘后再把这个结果放入数组。除号同理。如果出现的是开方或者乘方的运算符号,先将这一部分的运算结果得到,然后根据该运算符号前的运算符的不同而做出不同的运算。三角函数同理。

  在生成算式的同时进行以上操作,当算式生成结束以后,调用计算函数,对数组中的每一个数字,根据队列中保存的符号不同,做出+或者-的操作。最终得到的结果就是这个算式的运算结果。

  

 

经验与教训:

   我之前想要使用栈来解决算式的计算问题,我的思路是,将需要用到除了加和减以外的运算符号的部分都先计算出来,也就是说,先把乘除和开方,三角函数运算的部分首先计算出来,将这些结果压入栈中,然后把减法算式中的减数保存为负数存在栈中。

例如:19-3*(23-12)这个算式中,首先计算23-12=11,然后计算3*11=33,然后把-33压入栈中。这样在最后计算的时候就只需要把栈中所有的数字相加就可以了。但是在实际操作的过程中,压入栈中的数字都是正确的,但是在计算的过程中,虽然都只是加法操作,但是总会出现一些不可理喻的错误,得到的答案总会有几个出错。所以我最终只能放弃了这种思路,采用了数组+队列的方法来解决这个问题。

  在验算算式的时候,我一直是在自己手动验算来看正确性,但这个方法只能知道算式的计算是否正确,很难找到症结所在。我们应该输出数组和队列中的内容,根据数组和队列中的内容,我们可以通过数组中的内容来判断我们保存的符号是否正确,我们可以通过队列中的内容来判断我们保存的数字是否正确。根据以上输出,就可以帮助自己找到出错的地方。

在生成各个选项的部分,我原本的打算是,对于那些非正确选项,他们的值等于正确选项的值加或减一个20以内的随机数,但是如果直接这样做的话,对于结果为整数的情况,很有可能出现有选项重复的情况,所以,我增加了一个判断过程,使得当结果为整数的时候,每个选项不能重复。

 

 

 

 

但是对于结果为小数的情况,首先一个问题就是如果结果位数较多,并不能完全显示,所以我控制了小数点后精确三位输出,但这样会带来一个问题,就是如果正确结果非常小,很可能小数点后三位都是0,选项中很可能出现0.000或者-0.000的情况。或者因为控制小数位的输出,在经过四舍五入之后,出现两个选项有重复的情况。

总之,本次结对编程的完成并不简单,但是在我和舍友的配合之下,也算是成功的完成了本次的任务。

posted @ 2020-10-09 12:39  李雨辰  阅读(100)  评论(0)    收藏  举报