OO第一单元表达式求导作业总结
第一次作业
功能描述:
对输入的表达式进行求导计算和格式正误判断
思路:
一开始的想法是想写一个大正则找到一个通项式,通过这个多项式来判断WRONG FORMAT,结果发现正则写的总是不完善,会漏掉一些没用考虑到的情况,所以就先写一个非法空格可能出现的所有情况的正则

把带非法空格的表达式判断为WRONG FORMAT!
然后按照常数、带x的项,封装放入ArrayList动态数组中进行求导和合并,最后输出。
在处理爆栈的时候,使用了独占模式。独占与贪婪一样匹配最长。不过在独占量词模式下,正则表达式尽可能长地去匹配字符串,一旦匹配不成功就会结束匹配而不会回溯。一开始使用贪婪算法,结果输入的表达式超过1000字符后会爆栈,原因是正则表达式会尽可能长地去匹配符合规则的字符串,且会回溯。
匹配正则:

第一次作业的结构,没有理解到继承,简单的写了三个类,Deri类里放主函数,ComputePoly把表达式的每一项抽出放进Poly类里面,
在Poly类里面放置系数和指数。求导完再合并同类项。
类图:

在ComputePoly类中进行了封装,传进Poly类中进行指数,系数的匹配。
BUG分析:
Hack:
1. 判断完系数的空格格式错误之后默认判断了x的幂的空格错误格式,就是空格格式错误的情况没有考虑全。
2. 对于空格的判断过于特殊,应该是DeBug的时候只对这一个特殊样例进行了特判,导致输出错误。
被Hack:
(强测与互测均未出现bug)
第二次作业
功能描述:
在第一次作业的基础上加入三角函数求导
思路:
延续了第一次作业的风格,在原有的基础上加上了sin(x),cos(x)的判断和计算。
对于表达式里的每一项都可以构造一个带有系数、指数、正弦的指数、余弦的指数(每一项可以看成是常数*幂函数*正弦函数*余弦函数)
按照“*”来分割表达式作为每一项处理。

匹配正则:
与第一次作业相比多了三角函数的判断,不再赘述
BUG分析:
Hack:
1.在输出的时候错误的处理了幂为1的时候(^1),只是单纯的将”^1” replaceAll为””,
这就没有考虑幂的出现情况,导致了错误的输出。
2."/t"以及"/f"的判断过于特殊,导致格式判断出错。
被Hack:
在正则处理三角函数的幂时,没有构造足够多且复杂的测试集,并且因为使用大正则的原因,
并没有发现漏掉了+,导致幂只能匹配一位数 ,间接导致三角函数求导进入的判断语句错误。
第三次作业
功能描述:
对于三角函数()里可以带有常数、x的次方或者三角函数的嵌套。
思路:
改变了一下结构,用到了接口和继承,增加了一个父类,三个子类,存放不同类型的项,常数,幂函数,带三角函数

BUG分析:
Hack:
1. 递归处理进入死循环
2. 没有正确的处理嵌套,导致输出错误
3.括号表达格式错误
被Hack:
(强测与互测均未出现bug,笔者并没有进行任何性能化简)
BUG总结:
互测:
1.使用自己构造的测试集测试代码
2.阅读指导书,寻找边缘数据
3.阅读代码,找Bug
总结:
第一次第二次作业类与类之间并没有任何关系,第二次作业延续了第一次作业的风格,简单加入三角函数的判断即可,第三次作业用到了继承和接口,递归下降处 理表达式。自己的错误,在匹配表达式的正则里漏掉了+,导致只能测一位数的幂,而且我特别喜欢用大正则匹配表达式,写着写着就感觉有些情况没考虑到,就又得在正则里面修补,好在最后也没在这块摔跟头。不过研讨课的时候大佬们都推荐一种一种的匹配,还是有道理的,毕竟大正则很容易出错,检查起来还很不容易。
OO第一单元表达式求导作业总结的更多相关文章
- BUAA-OO-第一单元表达式求导作业总结
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- OO第一单元总结——求导
一.基于度量分析程序结构 (一)第一次作业 (1)设计思路 本次作业只涉及到简单幂函数通过加减运算而复合而成的函数,因此笔者自然的把函数分成了函数本体以及单个的项两个部分,在笔者的设计中两个类的功能如 ...
- 2019年北航OO第1单元(表达式求导)总结
2019年北航OO第1单元(表达式求导)总结 1 基于度量的程序结构分析 量化指标及分析 以下是三次作业的量化指标统计: 关于图中指标在这里简要介绍一下: ev(G):基本复杂度,用来衡量程序非结构化 ...
- OO Unit 1 表达式求导
OO Unit 1 表达式求导 面向对象学习小结 前言 本博主要内容目录: 基于度量来分析⾃己的程序结构 缺点反思 重构想法 关于BUG 自己程序出现过的BUG 分析⾃己发现别人程序bug所采⽤的策略 ...
- OO随笔之魔鬼的第一单元——多项式求导
OO是个借助Java交我们面向对象的课,可是萌新们总是喜欢带着面向过程的脑子去写求导,然后就是各种一面(main)到底.各种方法杂糅,然后就是被hack的很惨. 第一次作业:萌新入门面向对象 题目分析 ...
- OO第一单元
OO第一单元总结 目录 OO第一单元总结 前言 第一次作业 HW1基本思路 UML类图 代码规模 复杂度分析 方法复杂度 分析 类复杂度 分析 优化策略 第二次作业 HW2基本思路 UML类图 代码规 ...
- OO第一单元作业总结——表达式求导
OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...
- 2020 OO 第一单元总结 表达式求导
title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...
- OO第一单元(求导)单元总结
OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...
随机推荐
- python 2.7 数据结构: 基础面试总结
python中基础的数据类型包括: 1 Number(数字) 2 String(字符串) 3 List(列表) 4 Tuple(元组) 5 set(集合) 6 Pictionary(字典) 按照可变数 ...
- LightOJ 1031 Easy Game (区间DP)
<题目链接> 题目大意: 给定一段序列,两人轮流取数,每人每次只能从序列的两端的任意一段取数,取的数字位置必须连续,个数不限,问你这两人取数的最大差值是多少. 解题分析: 每人取数时面对的 ...
- Anaconda介绍、安装及使用教程
https://www.jianshu.com/p/62f155eb6ac5 Anaconda介绍.安装及使用教程 Python是一种面向对象的解释型计算机程序设计语言,其使用,具有跨平台的特点,可以 ...
- 清除电脑缓存的bat文件
电脑在使用了之后,会产生垃圾缓存,若不及时清理会降低电脑的运行速度. 1.步骤: 2.新建一个记事本文件,命名“系统清理”;(或其他名字) 3.原封不动复制下面的文字到该记事本中 @echo off ...
- Angularjs判断页面是否已经渲染结束(动态给标签长度)
相信大家都会碰到这样的问题.页面循环li.但是因为个数不知道.没有办法给li设置固定宽度.那么这时就需要动态计算数据长度并动态改变li的宽度 <!--周边信息--> <div cla ...
- git 强制覆盖分支
假设要用develop覆盖master分支,如下操作 git checkout master git reset --hard develop //先将本地的master分支重置成develop gi ...
- Spark 实现wordcount
配置完spark之后,使用spark实现wordcount,这一部分完全参考<深入理解Spark:核心思想与源码分析> 依然使用hadoop wordcountTest的那几个txt文件 ...
- C语言面试题分类->位运算
1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...
- day 25 二十五、抽象类、多态、鸭子、反射、异常处理
一.接口思想 1.接口:建立关联的桥梁,方便管理代码 python中没有接口语法 def jiao(): pass def chi(): pass def pao(): pass # 清晰知道操作的功 ...
- netbeans10支持php7.1-7.3
2019年1月16日10:56:49 官方发布时间2018年12月27日 PHP支持 NetBeans 10的所有PHP支持都是由我们的NetBeans提交者 Junichi Yamamoto提供的. ...