热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OO第一单元自白:简单多项式导函数的设计与bug分析

本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。

Homework 1  简单多项式导函数

 对于初次接触的OO,第一次作业已经可以体会到其与面向过程的C语言之间的差别。

 

我的想法是,建立了Multinomial和Monomial 两个类,分别能够实现多项式和单项式。

对于多项式类,只提供默认的无参数构造方法。对单项式类,提供参数为系数和指数的构造方法。

个人认为,多项式的append方法是我的设计中较好的一个方法,通过将单项式append进入,将组合为一个多项式。并且,在append方法中,还拥有合并同类项的作用。

对于求导,在单项式和多项式都拥有求导方法。单项式求导返回单项式,多项式求导调用单项式的求导方法,将单项式求导结果使用append添加进一个多项式即可。

也就是说,在main方法利用正则进行了各个单项式的提取,随后只需将各个单项式简单的append,再调用多项式求导方法即可得出结果。

 

 

 

第一次作业bug分析

在互测中,我被hack10次,主要原因在于我对输入合法性的判断上。

对于指数情况的整数与符号分离问题,对于指数出现两个符号的情况,等等问题,我在第二次作业前进行了深刻的反思,尽可能避免再次发生同样的错误。

 

寻找别人的bug

阅读过别人的代码,发现自己一无所获(主要是自己太菜,有很多的格式错误,导致自己也无法找到别人的格式错误)

进行了\\v\\f的攻击,以及爆栈的攻击

 

Homework 2  包含简单幂函数和简单正余弦函数的导函数

 

第二次作业大体延续第一次的append想法,其中有两三个主要的改动:

1.第一次作业的单项式仅仅 a * x ^ b形式,求导结果仍为这样的单项式, 但第二次作业形式 a * x ^ b * sin(x) ^ c * cos(x) ^ d,求导后由三个单项组合形成一个多项式,因此,我重载了一个参数为多项式的append方法,扩充多项式的append的参数形式既可以为单项,也可以为多项 。

2.第一次作业中我对单项式和多项式都实现了print方法,其中多项式调用单项式的print方法。但这种方法虽然能够完成第一题的要求,但较为局限。在第一次作业互测中,我发现有的同学写了toString方法,当时就觉得不错,因此第二次作业将print更改为toString,实现了输出。

3.针对第一次互测中出现的字符串格式判断进行反思,大概采取了 先判断空格相关错误->删除空格->判断多符号相关错误->化多符号为单符号 的策略

最后进行正则进行匹配于捕获。

 

第二次作业bug

在强测和互测中,暂未发现bug(可能还有未发现的bug)

 

第二次作业寻找bug

在阅读别人的代码时,我主要关注了正则的书写,并发现了一些忘记在特定地方判断空格的情况。

以及末尾出现了一个符号等等错误的情况。

 

 

 Homework 3  包含简单幂函数和简单正余弦函数的导函数

 

 

 

第三次的作业较为复杂,我在周六进行了一上午的思考,初步想法是使用正则,将其分为因子,分别对应到五种因子类,并且这五类继承自因子总类Factor(可以定义为抽象类)。但是,最让我崩溃的事情出现了,正则无法成对的匹配括号,于是我整个人都不好了。进度停滞。

在周日下午,有同学分享了他的作法,采用状态机的方式进行括号的分析,我深以为然,在周日晚上再次投入战斗。

具体实现方式依旧类似,不同的是,单项式里存放了因子的一个arraylist,对每种因子类,都提供了求导的方法。

 

我出现的bug:

在我的三角函数因子类中,我忘记匹配了指数的正负号而导致出现了错误,致使三角函数的指数出现符号无法匹配。

所幸强测中并没有。。。

 

怎么找别人的bug?

在没法WF的情况下用空格和TAB来找bug成为了王道。

在各种各样的可以添加的地方随意添加了几个空格和\t就发现了三个同学的bug





Applying Creational Pattern

 关于第三次作业当中出现的一些问题与改进。

首先,我的判断括号的状态机直接写入了多项式类的构造方法中,导致构造方法过长,理应单独分出一个类对此进行分析操作,再将得到的结果进行对象的构造。

其次,就是我的append方法并没有进行同类项的合并,一方面是因为情况众多,比较复杂,另一方面也是时间有限,优化分数占比不高。

最后,关于各种因子类的求导问题。在我的设计中, 因子共五类,常数类,x^\d 类,sin类(sin里面可以是任意的,只要最外层是sin即可,例如sin(x),sin((x+x))等),cos类,表达式类。

常数求导还是常数类,x^\d,sin,cos求导结果为单项式类,而表达式因子类的求导结果为表达式因子类。

问题便是求导方法的返回值,对于抽象类factor,其提供的方法返回值究竟应该设定为什么?为了使得求导结果的返回值常数类或单项式类都能匹配factor类的求导方法,我竟然设定factor求导方法返回值为object类型(这样常数类和单项式类都是object子类,编译才能通过)。

其实只需要将常数类和表达式因子的返回值设定为单项式类就可以解决了。。。

 

如果你看到了这里,那就很感谢你啦~


推荐阅读
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • Qt QTableView 内嵌控件的实现方法
    本文详细介绍了在 Qt QTableView 中嵌入控件的多种方法,包括使用 QItemDelegate、setIndexWidget 和 setIndexWidget 结合布局管理器。每种方法都有其适用场景和优缺点。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 序列化与反序列化是数据处理中的重要技术,特别是在网络通信和数据存储中。它们允许将复杂的数据结构转换为可传输或存储的格式,再从这些格式恢复原始数据。本文探讨了序列化与反序列化的基本概念,以及它们在不同协议模型中的角色。 ... [详细]
author-avatar
曾军78930
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有