OO_2019_第一单元总结——表达式求导

一、基于度量的程序结构分析

  首先给出Complexity metrics中参数的含义:

  ev(G):基本复杂度是用来衡量程序非结构化程度的,非结构成分降低了程序的质量,增加了代码的维护难度,使程序难于理解。因此,基本复杂度高意味着非结构化程度高,难以模块化和维护。

  Iv(G):模块设计复杂度是用来衡量模块判定结构,即模块和其他模块的调用关系。软件模块设计复杂度高意味模块耦合度高,这将导致模块难于隔离、维护和复用。模块设计复杂度是从模块流程图中移去那些不包含调用子模块的判定和循环结构后得出的圈复杂度,因此模块设计复杂度不能大于圈复杂度,通常是远小于圈复杂度。

  v(G):圈复杂度是用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径的条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,经验表明,程序的可能错误和高的圈复杂度有着很大关系。

  第一次作业(包含幂函数的简单表达式求导)

  第一次作业对面向对象的了解很浅,故而将读入的字符串全部放到一个DifferPoly类里面处理,包括了判断合法性,提取系数和指数,求导,合并同类项,输出这一系列过程。

  

  由复杂度分析可以看出总体复杂度不高,其中output()和polylist()的模块设计复杂度高,说明耦合度高,在后面的作业中难以复用。

  

  第二次作业(包括三角函数的简单表达式求导)

  第二次作业分出了字符串类,单项式类和读入类,但是没有分三角函数类和多项式类,可以重构改进。

  由复杂度分析可以看出有几个方法的基本复杂度高,应该降低其复杂度,提高结构性。output()方法对求导结果进行了化简输出,可以考虑化简和输出分开进行。

  第三次作业 (包含函数嵌套的复杂表达式求导)

  第三次作业是前两次的升级版, 需要比较好的对类的设计。我的程序分为读入类、字符串类、项类、多项式类、单项式类和嵌套项类,其中多项式、单项式和嵌套项都从项类中继承而来,使结构更加清楚。

  递归求导的过程在对象与对象之间的转换过程中得以实现,让复杂问题简单化。缺点是每次求导直接返回结果字符串,没有很好的化简办法;判断合法性在字符串类中进行,应该在重构时考虑将判断这一过程同样交给其他类完成。

 

  由复杂度分析可以看出Wholestr()类整体复杂度高,如上文所说,判断合法性全部在Wholestr()中进行,过于冗长,基本复杂度高,重构应重点修改。

二、程序bug分析

  在三次作业中,第二次在强测中被测出bug:输出时为了优化“1*x”,replace“1*”时只考虑了1前面不能为数字,没有考虑“1”前面是“^”的情况。其余两次作业没有在强测和互测中被发现bug。

  规避bug的策略:首先,TDD是非常重要的策略,在动手编程之前,应该认真阅读指导书,了解清楚要求,比如这三次作业的WRONG FORMAT问题,我在互测中发现很多同学出现bug都是因为对指导书中描述的什么是合法格式的输入不是很清楚,这也是很致命的问题;其次,在编程过程中,每写完一个部分都应该进行针对性的测试,这样可以有效避免bug累积,避免debug火葬场;最后,自己写完程序要自己进行测试,从格式问题到功能实现,各个方面检测,不要依赖测评机,自己测试的能力很重要。

三、发现别人bug采用的策略

  主要采用黑盒测试,分类构造比较容易出错的测试样例,如,对于格式问题,构造非法字符,空白字符出现错误,不符合要求的函数格式,正负号数量问题等测试样例,对于合法情况的功能测试也应该由简单到复杂开展测试。其中前两次比较重视格式错误情况,第三次主要注重求导功能的测试。当发现了他人的bug时应对产生bug的原因进行一定的判断,避免构造同质测试样例。

  在测试的时候写了比较简单的批处理脚本,批量产生运行结果,比较方便。 

四、总结

  第一单元主要认识了面向对象的基本思想,并解决了一类具体问题,但是过程中也不可避免地采用过以前面向过程编程的思路。应该多加练习,在实战中对面向对象程序设计加深理解。同时,优化方面的问题也值得继续探索。

  希望继续加油鸭!

原文地址:https://www.cnblogs.com/peggyhss/p/10604734.html

时间: 2024-11-05 18:43:12

OO_2019_第一单元总结——表达式求导的相关文章

第一章基本操作-自动求导

使用目标对象的.backward()进行反向梯度求导 import torch x = torch.randn(3, 4, requires_grad=True) print(x) b = torch.randn(3, 4, requires_grad=True) t = x + b y = t.sum() y.backward() print(b.grad) x = torch.rand(1) b = torch.rand(1, requires_grad=True) w = torch.ra

面向对象第一单元总结

目录 一.任务需求 二.实现方案 多项式数据结构的设计 多项式解析与WRONG FROMAT判断 表达式求导 表达式简化 三.基于OO度量的程序分析 四.程序bug分析 五.对象创建模式 六.对比和心得体会 第一单元通过三次迭代的表达式求导任务建立对面向对象程序的初步认识,并熟悉面向对象的思维和编程方法. 一.任务需求 三次作业的需求如下: 第一次作业:求解简单多项式导函数 第二次作业:求解包含简单幂函数和简单正余弦函数的表达式的导函数 第三次作业:求解包含简单幂函数和可嵌套因子的正余弦函数的表

面向对象-第一单元总结

一.对面向对象的理解 有位同学给java的面向对象做了一个形象生动的类比,我觉得很有道理,大概按我的理解如下: 结构的形成看图之前,我们要先明白,世界上是先有了实体,才有了一步步抽象至以上的体系结构,当然也未必是自底向上逐步抽象,也许在最初的认识体系中,只有故宫里的植物C.植物.和存在,或许迎客松A和蒹葭B都是植物的对象,在之后的认识中逐步向上抽象出生物,向下细分为树和草等等.但无论如何,所有的抽象类都是我们从实体中归纳总结出的,不是凭空产生的. 在真实的程序设计中或许我们也是如此,也即先有简单

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并

R 语言实现求导

前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽脑汁,但始终都不知道为何而学.生活和工作基本用不到,就算是在计算机行业和金融行业,能直接用到高数的地方也少之又少,学术和实际应用真是相差太远了. 不过,R语言为我打开了一道高数应用的大门,R语言不仅能方便地实现高等数学的计算,还可以很容易地把一篇论文中的高数公式应用于产品的实践中.因为R语言我重新学习了高数,让生活中充满数学,生活会变得更有意思. 本节并不是完整的高数计算手册,仅介

面向对象程序设计第一单元总结

一.基于度量的程序结构分析 基于度量的程序结构分析,主要运用IntelliJ里面自带的Diagram功能生成类关系图,以及Metrics插件进行复杂度分析. 其中复杂度分析相关指标含义如下: Complexity Metrics(复杂度分析) 这部分我们需要使用的主要是方法和类的复杂度分析. 方法的复杂度分析主要基于循环复杂度的计算.循环复杂度是一种表示程序复杂度的软件度量,由程序流程图中的“基础路径”数量得来. ev(G):即Essentail Complexity,用来表示一个方法的结构化程

北航OO第一单元

????第①单元 知道要写博客实在太开心啦,因为我就喜欢写些奇奇怪怪的东西,然后沉迷于把它变得越来越??里胡哨(雾 杂谈 废话 和 心路历程 废话 大二下是来6系的第二个学期了,依然频繁地为同学们的强大感慨不已(同时觉得自己菜的不行) 开学不满一周,就能分明地看出来OO这门课和别的课不太一样. 起初在寒假的时候,我以为这有是一门类似于c语言或数据结构的课,教你一些语言或以语言为载体教你一些初级算法.后来寒假的pre2,3一出来我懵了,我以为要学的东西竟然已经要求你在寒假自学完成了?!于是本人承受

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]