面向对象第一单元总结
本单元的任务为求解单变量因子表达式的导函数
三次作业将任务划分为三个阶段:
- 幂函数无嵌套求导 ——》 2. 幂函数及三角函数无嵌套求导 ——》 3. 幂函数及三角函数有嵌套求导
写程序前的种种
分析题目
-
作业1
第一次阅读oo指导书,通读一遍后,只觉茫然无措,只将概念大约理解清楚了就开始动手实施,按自己头脑中对带符号整数及幂函数的定义以及求导法则开始写程序。当然结果就成为了一次惨痛的教训。
-
作业2
吸取了第一次的经验教训,在开始动手之前非常仔细的研究题目,并画出逻辑关系图理清各个层级之间的关系
-
作业3
采取了与作业2相同的做法,画图分析题目
整理思路
-
作业1
-
-
初步判断表达式是否符合规则
-
用 + - 号分割字符串(将分割字符串的+ - 号位置记录在动态数组Mark中)
-
判断每个项是否符合规则(* 号分割每一项)
-
将系数和指数分别存在coe 和ind 数组中
-
合并同类项,计算出导数并打印出来
(当时由于题目分析不仔细,完全将本次求导复杂化,幂函数及整数的连乘情况均可以计算出导函数,但却费力不讨好;并且完全是面向过程的编程思想)
-
作业2
-
-
初步判断表达式是否符合规则
-
用 + - 号分割字符串(将分割字符串的+ - 号位置记录在动态数组Mark中)
-
判断每个项是否符合规则(* 号分割每一项)
-
将系数和指数分别存在coe 和ind 数组中(每一项均为k*x^a*sin(x)^b*cos(x)^c)
-
合并同类项,计算出导数并打印出来
(本想进行重构,但由于周末舞蹈演出占用了大量的时间,第一次又理解错了题意,基本可以完成第二次的功能,因此沿用了第一次作业的思路)
-
作业3
-
-
输入一个式子,new 表达式;用正负号拆分成项,new 项;用*拆分成因子,new 因子
-
若是简单因子(带符号整数、sin(x) cos(x)、幂函数),则返回求导结果到项
若是表达式因子,则去掉括号 new表达式
若是嵌套因子,则剥去一层,new因子
若不符合这三类因子,则格式错误
-
项的求导结果返回到表达式
-
若不是格式错误,则打印出导函数
(进行了重构,经过这段时间的学习,渐渐对面向过程有了一定的了解,这次算是运用了一点面向过程的思想,可以说是有了进步)
写程序ing
-
作业1 & 作业2
作业1与作业2完全和以前的c语言是一个写法,在一个类中写了大量的函数,想到哪,写到哪,一个类的长度非常长
-
作业3
运用了正则表达式及继承关系,使程序的结构更加清晰,每个类的属性方法更加简洁明了
写程序后的种种
-
自测
自测在程序中的地位非常重要,因为自测找到的bug还有机会进行改正,而之后的就是错误,只能进行修复。这三次作业中,我做的自测都不是非常充分,往往最后的错误都不是那种奇奇怪怪的,而是很简单、很容易发现的错误,在之后的作业中,要吸取经验教训,在程序写完后要先自己枚举样例进行测试,不能只满足于通过中测
-
评测
评测覆盖的情况非常全面,在这三次作业中强测都有测试点没有通过,每次都是由于同治bug引起的,而这些错误其实都不是非常难发现的,这再次说明了自测的重要性,要全面测试的重要性
-
互测
在互测过程中,我最开始采用的方法是试错法,列举一群样例,一个一个进行尝试,这种可以说是瞎猫碰死耗子的做法很费时,但还是很有效的;之后我采用了阅读加试错的方法,大致了解一下某个程序的思路,然后再进行试错,这种方法更加高效一点。在列举样例时,我会先列最简单的因子,之后将因子组合成不同的项,再将项组合成不同的表达式,之后再考虑格式错误的样例以及在适当位置添加不定数目的空白字符
经历了这三次互测,每次都被hack,每次都忍不住吐槽,但也渐渐理解了互测的“真谛”,一是学习别人的代码,二是提高自己测试的能力,这大概是我能从中学习到的,而且我也明白了没有一个程序是完美的,bug始终都会存在。作业1被hack了4次,但是很多个错误,主要原因是题目理解错误,例如2*3*x^+8、x*+06本都是格式错误的数据都能运算;作业2被hack了15次,但都是一种错误,类似于x sin(x)这种数据也能进行运算,原因在于没考虑到这种情况;作业3被hack了9次,均为一个错误,正负号问题没有考虑清楚
总结一下,这三次作业带领我迈进了OO的大门,之后还有更多更难的问题等待着我们去解决,我想我准备好接受挑战了,我会尽自己最大的努力去完成,加油💪