一、前三次作业内容分析总结

前言

前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式求导展开,输出目的都是一致的,即对输入的多项式进行求导,将求导结果打印到显示屏,作业难度递增,每一次对多项式的要求都更加宽松,相应而言,求导的难度也就加大,从简单而固定的多项式到复杂而灵活的多项式,处理的难度随之加大,从正则表达式解决一切到继承接口多态的引入,java代码也越来越复杂,那么就让我们来分别剖析一下这三次作业。

1、第一次作业

作业要求简述:多项式求导,多项式由多个项之间用加减运算符连接而成,项由有符号整数和幂函数的乘积构成,支持1*x和x^1的省略形式,支持+1*x的省略形式,需要注意的是多项式前面可以有一个符号,而有符号整数之间不可以出现空格,其余地方都可以出现空格,以上就是这次作业要求的提炼;

作业解题思路:本次我的作业架构:

实现简述:

主类为DerivationPolynomial,提供函数入口,然后调用Polynomial进行合法性检查,在本次作业中我使用了大正则匹配法,(这也注定了本次作业要被刀爆),在多项式类中,首先遍历字符串,检查是否存在不合法的字符,然后对空格不合法的情况进行了罗列,最后进行大正则匹配,在检查合法后,将字符串所有的空格去除,并且将多符号合并

Polynomial类检查合法性后实例化Derivation进行求导,利用正则表达式的捕获组将字符串的每一项单独提取出来,存入数组中,然后创建Term类,Term类中提取了每一项的系数指数和符号,并且创建了求导方法,将求导结果返回,然后实例化MergeLikeTerm类进行多项式合并,合并的算法非常简单,就是判断是否有指数相同的项,有则合并,并将其中一项标记为不合法,重写toString类,将标记为合法的项输出

测试时存在的问题:

1、自己的bug:主要有两处,一是在空格的合法性检查的时候没有罗列完全,少考虑了在指数上有符号整数间存在空格的情况;二是算法本身的问题,大正则表达式爆栈,虽然在本地测试中并没有出现爆栈的情况,但是评测机还是认定了我的爆栈,只能说大正则的做法本身就是一个巨大的bug;

2、第一次刀别人的bug:刀人首秀的战绩并不理想,在刀人实验中发现了自己的bug,同组的小伙伴也有中招的,用自己的bug拿到了第一滴血可谓是有点心痛,还发现的bug就是空格输入出现RE的状况,至于刀人的方法,采用先盲刀(疯狂构造样例)+逐个侦破(看被人的代码),但是可能是由于第一次作业比较简单,并没有发现过多的bug

3、暴露的问题:大正则回溯导致爆栈、整体架构不清晰,类之间的依赖关系明显

本次作业的UML图和类的复杂度分析

2、第二次作业

作业要求简述:在第一次作业的基础上增加了三角函数sin(x)和cos(x),要求是三角函数保留字内不可以有空格,而且三角函数的参数里只能是x,不能是其他函数,除此之外,因子之间组合形式更加复杂,项可以是多个因子的乘积,而且第一个因子如果是1*的形式可以简写为+,-1*可以简写为-,其他要求和第一次相同

作业解题思路:

实现思路简述:三个类分别表示多项式、项、因子,项和因子创建Arraylist来储存,每一项都可以固定为常数*幂函数*sin(x)*cos(x)的形式,这样进行求导

测试时发现的问题:

自身的bug:在互测和强测阶段发现了两个bug,一是在指数上存在多符号的情况时没有WF,这是在预检查阶段没有罗列所有的情况,考虑欠妥,这和第一次作业的bug非常类似,也显示了我思维上的短板;二是在化简的时候出现了错误,这也是很多人的共性错误,在化简的时候直接检测输出的字符串中是否有1*和^1,有则直接替换为空串“”,这样^10和11*的情况就会出错,也是情况考虑不周全,没能兼顾所有情形

刀别人的bug时主要使用构造样例,由于本次作业我在设计阶段就考虑了很多比较刁钻的样例,因此在互测的时候直接使用这些样例就能够发现很多bug了,因此我也希望以后的作业设计阶段就能够尽量多地考虑到一些比较极端的样例,一方面可以在改善自身的代码防止踩坑,另一方面在互测阶段也可以直接使用,非常方便

暴露的问题:考虑不周到,很多并不是非常极端的样例没有考虑到,化简的算法没有好好想,bug较多

本次作业的UML图和参数分析:

3、第三次作业

作业要求简述: 与前两次作业相比,第三次作业在多项式求导上进一步加大难度,增加了三角函数里的嵌套,并且增加了表达式因子,因子不再是简单的常数,三角函数或者幂函数,而括号括起来的表达式同样可以作为因子出现在某一项中,三角函数内的参数不再是x,而可以是任何表达式

本次作业我没有能够完成,没能在规定时间内实现基本功能,但是大体的框架是没有问题的,下面介绍一下我的框架:

遇到的困难:在其他部分没有问题,卡在了嵌套的问题上,使用递归下降法,但是由于类与类之间层次不清晰,分工不够明确,对象的功能不单一,总会出现各种各样的bug,最终没能在ddl前被捞起来,十分遗憾

二、反思与总结

第一单元的作业对于Java初学者来说确实是很好的练习,对于程序的鲁棒性和面向对象的结构都完成了从无到有的转变,经过三次作业也发现了自身知识储备上的不足,在程序的鲁棒性方面,如何正确高效地使用try catch来捕获异常;对于继承和接口的应用还不够熟练,每一个对象功能的单一性不能实现,很多类的有相互依赖关系的,这也直接导致了我第三次作业的失败,可以说虽然积累了一些经验,但是还是有很多知识等着我去学习和理解,加以实践。我的程序架构基本上都是比较主流的,与很多同学的比较类似,也可以说是实现起来相对容易的架构,在表达式的化简上,我没有下太多功夫,这也是强测阶段没能进入A房的主要原因,对于第三次作业的失利,我认为主要原因是懒惰,没有提早写,花费的时间不够,还有就是架构的不清晰,希望在以后的作业中能够做好时间分配,完成所有的作业。

2019北航OO第一单元作业总结的更多相关文章

  1. 北航OO第一单元作业总结(1.1~1.3)

    经过了三次作业之后,OO第一单元告一段落,作为一个蒟蒻,我初步了解了面向对象的编程思想,并将所学内容用于实践. 一.第一次作业 1.架构分析 本次作业需要完成的任务为简单多项式导函数的求解.表达式仅支 ...

  2. 北航OO第一单元作业总结(Retake)

    前言:当我写这篇博客的时候,我的心情是复杂的,因为这实际上是我第二次写这篇博客--我今年重修的这门课.我对去年的成绩心有不甘--在激烈的竞争下,我虽然尽可能完成了所有作业(仅一次作业未通过弱测),但爆 ...

  3. 【OO学习】OO第一单元作业总结

    OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...

  4. 【作业1.0】OO第一单元作业总结

    OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...

  5. OO第一单元作业总结——表达式求导

    OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...

  6. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  7. 2020北航OO第一单元总结

    前言 学习面向对象这门课程的后的第一单元作业,主线是多项式求导,三次作业层层推进,由单一的幂函数求导,到幂函数和三角函数的复合求导,最后再到两种函数的嵌套求导,由两个类到重构后的十几个类,我逐渐对面向 ...

  8. 2019年北航OO第一单元(表达式求导任务)总结

    2019面向对象课设第一单元总结 一.三次作业总结 1. 第一次作业 1.1 需求分析 第一次作业的需求是完成简单多项式导函数的求解,表达式中每一项均为简单的常数乘以幂函数形式,优化目标为最短输出.为 ...

  9. OO第一单元作业小结

    前言 第一单元的主题是表达式求导,第一次作业是只带有常数和幂函数的求导,第二次作业加入了正余弦函数,第三次作业又加入了表达式嵌套,难度逐渐提升.总体来说前两次作业还易于应对,而第三次作业做得相对有些艰 ...

随机推荐

  1. p2p状态码

    因为需要的确定状态太多,减少数据库的压力,采取二进制表示状态码 状态码工具类 package com.xmg.p2p.base.util; /** * 用户状态类,记录用户在平台使用系统中所有的状态. ...

  2. github上手实践教程

    简介: SSH公私钥的使用 github的使用 git 工具的基本使用 基本步骤: 一.github的使用 1.github账号的创建[官网一步一步创建就行了,这一步骤省略] 2.创建远程仓库: 创建 ...

  3. 获取本地IP地址的vc代码

    作者:朱金灿 来源:http://blog.csdn.net/clever101 获取本地IP地址有两种做法.一种是使用gethostname函数,代码如下: bool CSocketComm::Ge ...

  4. c# 后台异步请求接口

    第一步:引用程序集:Systen.Net.Http 第一种方式: 异步 Get请求 HttpClient client = new HttpClient();            //client. ...

  5. CentOS7系列--2.2CentOS7中配置SSH服务

    CentOS7配置SSH服务 1. SSH配置 1.1. 使用SSH服务更加安全 [root@centos7 ~]# vi /etc/ssh/sshd_config 设置如下 PermitRootLo ...

  6. Ubuntu 添加删除用户 How to Add and Delete Users on Ubuntu 16.04

      Introduction One of the most basic tasks that you should know how to do on a fresh Linux server is ...

  7. vue使用百度地图

    1.在百度地图申请密钥:http://lbsyun.baidu.com/ 将 <script type="text/javascript" src="http:// ...

  8. HAproxy simple

    下载地址 start install: wget     http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gz tar   -xf  ...

  9. Azure 和 Linux

    Azure 正在不断集结各种集成的公有云服务,包括分析.虚拟机.数据库.移动.网络.存储和 Web,因此很适合用于托管解决方案. Azure 提供可缩放的计算平台,允许即用即付,而无需投资购买本地硬件 ...

  10. 【Kettle】8、变量参数传递介绍

    本文为转载,感觉作者的辛勤劳作:http://blog.csdn.net/rotkang/article/details/21008271 ------------------------------ ...