zoukankan      html  css  js  c++  java
  • 结对编程复盘-小初高数学习系统

             前言

            在之前,有做过生成小初高试卷的个人项目。在这个项目中,我花费了很多时间学习写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 ,跟着他我确实学到了很多,算法的提升、函数的命名规范等。

           

         

  • 相关阅读:
    ASP.NET -- repeater控件的使用
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40
    错误提示:在此上下文中不允许使用名称 "***"。有效表达式包括常量、 常量表达式和变量(在某些上下文中),不允许使用列名。
    mongodb 性能提高之利用索引, 待续
    工程化 经历的 4 个阶段
    把连续的字符 变成 一个
    sort 排序详解
    理解正则 的 ?! ?:
    [ 订单查询 ] 性能 高并发 : 分表 与 用户id%1024 存放表
    搭建LNMP基础框架
  • 原文地址:https://www.cnblogs.com/MR-miao-kk/p/11605481.html
Copyright © 2011-2022 走看看