引言

四周过去了,oo课程的第一阶段作业也算告一段落。在第一单元的内容中,主题是始终如一的多项式求导,但三次作业要求完善的求导功能一次比一次丰富,难度也逐渐增加,也是费了不少心思。接下来就回顾与小结一下这三次作业,分析一下程序结构、遇到的bug以及总结这第一单元作业给我的感受。

第一次作业(关于幂函数多项式求导)

类图:

度量分析:

程序分析:

由于是第一次作业对于面向对象了解不是很透彻,只是根据面向对象的教材依葫芦画瓢创建了两个类,Term类完成项的求导,Poly类完成多项式的求导。但显然类的封装性并不好,并且class内部的架构考虑的不是很清楚。

但由于第一次作业比较简单,并且当时没有考虑到性能的问题,并没有对多项式进行化简的处理,因此整体程序较为简单。

Bug分析:

第一次作业最困扰我的是多项式判定的问题,一开始采用一个正则表达式判定多项式的正确性,但是发现过于暴力,程序会爆栈,于是又费尽心机使用多种方法判定多项式的正确性。但是由于考虑不全面,互测时几乎全部都是由于多项式判定考虑不全面的bug。

而关于找寻别人的bug,我主要采取阅读代码与测试数据一起进行的方式,在测试数据时进行代码阅读,找出可能的bug。但是主要找到的bug大部分还是因为多项式判定的问题。

第二次作业(关于幂函数与三角函数相乘的多项式求导)

类图:

度量分析:

程序分析:

这一次作业应该是上次作业里最不满意的一次,甚至因为这一次作业非常混乱的逻辑,导致第三次作业进行了大篇幅的重构。这一次作业由于吸取了第一次作业没有化简多项式,导致代码复杂度很高的问题,在修改第一次作业的同时,增加了合并同类项这样的功能。为了化简多项式,我的思路是对要求导的多项式进行化简,求完导后再进行一次化简。于是我将化简写入了Poly类的构造器部分,产生了每次构造一个多项式都要进行化简的问题,使得代码逻辑混乱。

Bug分析:

由于第一次作业的教训,加上第二次作业在中测时就进行了大部分的多项式判定测试,在多项式判定的部分bug就少了很多。主要的bug是在多项式化简的问题上,很多细节没有考虑到位。包括有时候会因为字符串和数组大小的问题,使得程序RUNTIME_ERROR。

在对别人的代码进行测试的时候,由于作业代码量比第一次明显偏大,所以主要采用测试数据的方式。但是发现的bug仅仅停留在多项式判定上,并且大部分是因为化简的问题。

第三次作业(关于幂函数与三角函数的复合函数多项式求导)

类图:

度量分析:

程序分析:

由于第二次作业失败的多项式化简以及代码逻辑混乱,再加上对于类的理解的深入,我对第三次代码进行了大范围的重构,包括多项式的判定,幂函数、三角函数求导,复合函数求导等,我一一构造类来完成这些功能,然后完成项的求导类,最后再将他们运用到多项式类里,完成一个多项式求导。这一次作业性能分占比较小,因此我并没有考虑,仅仅实现了求导的功能。实际上这一次作业代码内在逻辑很容易理顺,但是如果遇上疯狂递归,运行时间较长。

Bug分析:

这一次作业同样在多项式判定上没有问题,但由于很多小细节被忽略,导致代码错误较多。比方说因为没有考虑到+/-()这样的形式造成的问题,再比如在最后化简输出时没有考虑到输出多项式长度只有1的可能等等。而这些细节错误,主要还是由于自己的测试数据不够全面,自己应该认识到仅仅过中测是不够的。

在互测阶段,由于这次的代码需要考虑递归,可以说看别人的代码找bug是比较费时费力的,因此我还是采用测试数据的方式进行,但是不大理想。

第一单元总结

在这一阶段的代码编辑过程中,对于面向对象有了一定的了解,对于一个类的编辑,还是有了一些体会,特别是构造器,在三次作业中类的构造器,逐渐简化,不会再出现第二次作业那种每次构造一个类就要进行很复杂的操作这样子。但是显然,对于面向对象,我还有很多方面不是很清晰,特别是继承这一块,还并不了解。

考虑代码的重构,对于第三次作业,我可能会将最后一部分x以及常数求导那里因为偷懒直接放上第二次作业代码,对这部分进行化简;并且加上求导结果简化的代码,完善代码风格。而第二次作业,我会考虑将化简与构造器分离。

虽然经过这三次作业对于面向对象有了一定的了解,特别是类的封装的部分,但是对于其他的了解还不够深入,因此希望在今后的学习中,能加深自己对于面向对象的了解。

BUAA-OO第一单元小结的更多相关文章

  1. OO第一单元小结

    写在前面 在接触OO课程之前,自己是完全没有学习过java语言的,因此作为一名初的不能再初的初学者,无论是在哪方面都会有许多茫然,但是我相信通过一次次认真的完成OO作业,我对面向对象的理解应该会渐渐的 ...

  2. 多项式与三角函数求导——BUAA OO 第一单元作业总结

    第一次作业 需求简要说明 针对符合规定的多项式表达式输出其符合格式规定的导函数多项式,格式错误输出WRONG FORMAT! 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16> ...

  3. OO第一单元作业总结

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

  4. OO第一单元总结

    OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...

  5. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

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

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

  7. OO第一单元(求导)单元总结

    OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...

  8. OO第二单元小结

    OO第二单元小结 一.三次作业代码分析. 1.第一次作业 第一次作业是单部电梯的傻瓜调度,由于其过分傻瓜,所以第一次作业我只有两个类,一个main,一个电梯,main类负责不断从输入流中读取命令,如果 ...

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

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

  10. OO第一单元(前四周)作业总结

    OO第一单元(前四周)作业总结 OO第一单元(前四周)作业总结要求(第四次作业) 0.前言 本次博客针对的是本人学习Java的第一阶段的三次作业的作业总结 第一次作业的内容是:7-1 计算税率 (20 ...

随机推荐

  1. json、demjson

    一.json 概述: json.dumps():将 Python 对象编码成 JSON 字符串, dic -> json str json.dump()  :将 Python 对象保存成 JSO ...

  2. 20145338 《网络对抗》 MSF基础应用

    20145338<网络对抗> MSF基础应用 实验内容 ·掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路. 具体需要完成(1)一个主动攻击;(2)一个针对浏览器的攻击 ...

  3. 第一个HTML文档

    属性 和 值 1.作用 用来修饰元素 ex:让 p 标记的文本水平居中对齐 <p>Hello World</p> 2.语法      1.属性的声明必须位于开始标记里      ...

  4. HTML 基于 Python 实现分页功能

    前面的话: 1. 网页引用的bootstrap 中的表格,所以需要引入样式类 2. 第一次写文章,不喜勿喷.有不足的地方,可留言我改正,在此先谢过. HTML代码: <!DOCTYPE html ...

  5. python的列表生成式

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  6. UML与软件建模:第二次作业(类图中类的表示)

    一.类图 (1)类图定义 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是在&q ...

  7. vim安装

    vim的下载与安装 在线安装 sudo yum install vim 源码编译安装 1)   下载源码 git clone https://github.com/vim/vim.git 2)   编 ...

  8. vuex数据持久化插件--指定持久化特定的值

    指定需要持久化的state,配置如下 import createPersistedState from "vuex-persistedstate" conststore = new ...

  9. 【原创】Arduino制作Badusb实践

    1.U盘构造      U盘由芯片控制器和闪存两部分组成. 芯片控制器负责与PC的通讯和识别,闪存用来做数据存储: 闪存中有一部分区域用来存放U盘的固件,它的作用类似于操作系统,控制软硬件交互:固件无 ...

  10. ssh外网穿透

    不同局域网ubuntu如何进行ssh穿透登录不同局域网ubuntu如何进行ssh穿透登录前言一. 建议安装teamview二. openssh服务三. 打开路由器端口映射四.连接@(ubuntu) 前 ...