BUAA 软件工程 个人项目作业

项目 内容
这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健)
这个作业的要求在哪里 个人项目作业
我在这个课程的目标是 学习软件工程的开发知识,培养工程化开发能力
这个作业在哪个具体方面帮助我实现目标 通过实操掌握PSP开发基础
PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 10
· Estimate · 估计这个任务需要多少时间 10 10
Development 开发 280 520
· Analysis · 需求分析 (包括学习新技术) 30 40
· Design Spec · 生成设计文档 30 40
· Design Review · 设计复审 (和同事审核设计文档) 10 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 20
· Design · 具体设计 60 100
· Coding · 具体编码 60 120
· Code Review · 代码复审 20 60
· Test · 测试(自我测试,修改代码,提交修改) 60 120
Reporting 报告 70 70
· Test Report · 测试报告 40 40
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 20
  合计 360 600

一. 解题思路描述

上网搜索

尝试在网络上找到复杂度低于o(n^2)的算法,找到一个涉及线段与线段交点的o(nlogn),关于直线搜寻无果

解题思路

写代码前,并未找到优秀的算法,于是选择暴力求解,即读入一条直线,立即与前n条直线进行相交求解,每一个求解得到的点都需要进行去重处理,即便理vector寻找相同点,复杂度极高。

改进

将点的横纵坐标组成string,形成key,选取哈希存储,即横纵坐标成为哈希列表的key值,value值为点这个结构体,这是写代码前的想法

二. 设计实现过程

由于是较为简单的C++代码,并没有刻意使用面向对象的思路

  • class: Function(即整个程序本体,为方便进行Test时,直接调用接口

    • set<Node, cmp> nodes:写代码时使用set而不是hashmap,是由于hashmap的开销远大于set,需要多出一个double转string的过程,可能存在精度损失,开销亦极大

    • void getLinePara: 使用ax + b = cy的方式代表直线,而不是使用最初的y = kx + b是为了减少除法的使用,最大限度保留数据的精度和准确性,读入直线时,调用此函数,获取a b c的数值,存入直线的结构体种

    • void readFile: 使用本函数进行文件读入,并将所有的Line存入vector<Line>Lines中

    • bool L2LIsCross: 使用本函数求解直线与直线的交点,即解二元一次方程组,求解前会先判断直线是否存在交点,求解得到焦点后立刻存入nodes中,并返回true,否则不存在交点,返回false

    • bool C2LIsCross: 使用本函数求解圆与直线的交点,根据圆心以及给出直线的垂线斜率,得到过圆心关于给出直线的垂线,后求出两直线的交点,根据交点到圆心的距离,判断相交相切相离,若相离,则返回false;否则,得到给出直线的正负单位向量,分别乘以与圆交线段的一半,计即可得到两个交点的坐标,返回true

    • bool C2LIsCross: 使用本函数求解两个圆的交点,首先利用圆的方程相减,得到过焦点的直线的方程,简化为求直线与圆的交点问题,直接调用函数即可

    • int Solve: 调用上述函数,完成读入到求出交点个数的过程,方便test接口使用

  • pair: Node(存放点的typedef,并未使用结构体,而是用了pair)

  • struct: Line (存放直线的结构体,包括两个点的横纵坐标,使用long存储,以及ax + b = cy中的a, b, c)

  • struct: Circle(存放圆的结构体,包括圆心node以及半径r)

小tricks:

  • 使用set<pair>,无需double转string,减少大量工作量

  • 重写set中pair的比较函数,保证精度达到小数点后12位

单元测试

  • 考虑极端情况,直线平行,直线垂直,直线与圆相交,直线与圆相切,直线与圆相离,圆与圆相交,圆与圆内含,圆与圆相切

  • 压力测试,2000条直线,进行测试

三. 性能测试

根据总CPU时间分配,可以看出主要占用时间的函数

可以看出set.insert函数,消耗最大,也可以理解,而第一版代码中使用的hashmap,由于需要double转string,其消耗极大,甚至超过了向hashmap中插入的消耗,因此改进为使用set,红黑树存储,既可以保证不出现重复,又可以减少不必要的消耗,而向set中插入pair的方法,我并没有太多的好办法进行优化。

四. 代码说明

代码质量分析图

单元测试

关键函数实现

  • 圆与直线交点求解

  • 圆与圆交点求解

  • 直线与直线交点求解

BUAA 软件工程个人作业的更多相关文章

  1. BUAA软件工程个人作业-软件案例分析

    BUAA个人博客作业-软件案例分析 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析 我在这个课程的目标是 学习开发软件的能力 这个作 ...

  2. BUAA软件工程热身作业

    写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 热身作业(阅读) 课程目标 培养软件开发能力 本作业对实现目标的具体作用 深入认识自己,总结过往并展望 ...

  3. 【BUAA软件工程】第一次阅读作业

    BUAA软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...

  4. BUAA软件工程结对项目作业

    BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...

  5. BUAA软件工程个人项目作业

    BUAA软件工程个人项目作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 学习软件开发的流程 这个作业在哪 ...

  6. BUAA 2020 软件工程 热身作业

    BUAA 2020 软件工程 热身作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! ...

  7. BUAA软件工程:软件案例分析

    BUAA软件工程:软件案例分析 Author:17373015 乔玺华 项目 内容 这个作业属于哪个课程 2020计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析博客作业 我在这个 ...

  8. [2019BUAA软件工程]结对作业

    Tips Link 作业链接 [2019BUAA软件工程]结对作业 GitHub地址 WordChain PSP表格 psp2.1   预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 ...

  9. 软件工程大作业(学生会管理系统)Web端个人总结报告

    软件工程大作业(学生会管理系统)Web端个人总结报告 一.小组信息 1.所在小组:第二组 2.小组选题:学生会管理系统 3.项目源代码链接: Web端源代码:code 小程序端源代码:code APP ...

随机推荐

  1. KMP算法中的几个疑问

    KMP算法next数组求解实现 首先我们通过应用场景将KMP算法中用到的名词做一个说明: 在一个字符串(string1)中查询是否存在另一个字符串(string2). 在字符串匹配算法中,我们通常将字 ...

  2. C语言实现任务调度与定时器

    代码实现是在xl2tpd的源码中get到的,感觉很有意思的一段代码.基本功能就是实现定时器,时间到后从定时队列中取出,然后完成指定的任务. 1. schedule.c代码(自己添加了main函数,用来 ...

  3. WebDriverAgent重签名爬坑记

    接上一篇博文,已经配置好了Xcode环境,那接下来要完成的就是重签名WebDriverAgent.在讲重签名之前,我们还是先来了解下WebDriverAgent,熟悉的朋友,可以直接跳过. WebDr ...

  4. 轻量化模型系列--GhostNet:廉价操作生成更多特征

    ​  前言  由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难.特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究. 论文提出了一种新颖的 Gh ...

  5. Markdown主要语法及使用

    最近,我发现使用Markdown这一标记语言的人越来越多了,我也去试了一下,感觉确实在编辑文档上方便了很多.于是我将一些关于Markdown的语法和编写时的快捷键整理在这里,方便以后查阅,也欢迎评论区 ...

  6. centos7 下安装 mysql5.7

    由于CentOS7的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件. 下载命令: wget https://dev.mysql.com/get/mysql57-commu ...

  7. 洛谷P1603——斯诺登的密码(字符串处理)

    https://www.luogu.org/problem/show?pid=1603#sub 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事 ...

  8. Ts基本数据类型

    TS的基本数据类型 string let str : string str = 1 //报错 会提示num是字符串 不是数字 str = 'test' //正确 //拼接字符串 let str2 : ...

  9. php保留2位小数方法

    $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_ ...

  10. Nginx系列(10)- Nginx配置文件详解

    nginx文件结构 ... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全 ...