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思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...
随机推荐
- Valgrind与内存问题
1 简介 "Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具.Valgrind这个名字取自北欧神话中英灵殿的入口. Valgrind的最初作者是Julian Sew ...
- bootstrap弹窗、弹出层、modal
bootstrap弹窗.弹出层.modal 引入bootstrap的js文件 如下div代码 <div class="modal fade" id="myMo ...
- vue.cli脚手架初次使用图文教程
vue-cli作用 vue-cli作为vue的脚手架,可以帮助我们在实际开发中自动生成vue.js的模板工程. vue-cli使用 !!前提:需要vue和webpack 安装全局vue-cli npm ...
- 2018-2019-1 20189201 《LInux内核原理与分析》第七周作业
我的愿望是 好好学习Linux 一.书本第六章知识总结[进程的描述和进程的创建] 基础知识1 操作系统内核实现操作系统的三大管理功能,即进程管理功能,内存管理和文件系统.对应的三个抽象的概念是进程,虚 ...
- webpack打包后的文件
用了webpack打包工具,你是不是有时会疑惑,写了一个很简单的函数,结果生成那么多东西,而且还没有问题?下面,我从三种情况来分析打包后的入口文件,帮助自己理解webpack打包,也为平时定位产出目录 ...
- angular中service封装$http做权限时拦截403等状态及获取验证码倒计时、跨域问题解决
封装$http.做权限时拦截403等状态及获取验证码倒计时: 拦截接口返回状态 var app = angular.module('app'); app.factory('UserIntercepto ...
- BZOJ5254 : [Fjwc2018]红绿灯
显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间. 将所有询问的时间模$g+r$,并按时间用set维护. 那么对于每个红灯,在set中可以找出$1$到$2$ ...
- numpy中的广播
目录 广播的引出 广播的原则 数组维度不同,后缘维度的轴长相符 数组维度相同,其中有个轴为1 参考: 广播的引出 numpy两个数组的相加.相减以及相乘都是对应元素之间的操作. import num ...
- node环境配置
1.进入node的官网https://nodejs.org/en/download/ 2.选择自己需要的安装包 3.下载之后,直接安装http://www.runoob.com/nodejs/node ...
- 201771010126 王燕《面向对象程序设计(java)》第八周学习总结
实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 掌握接口定义方法 JAVA中通过interface关键字定义接口: 接口中只能定义public static fi ...