BUAA 软件工程个人作业
BUAA 软件工程 个人项目作业
Author: 17373015 乔玺华
教学班级 :005
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 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 软件工程个人作业的更多相关文章
- BUAA软件工程个人作业-软件案例分析
BUAA个人博客作业-软件案例分析 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析 我在这个课程的目标是 学习开发软件的能力 这个作 ...
- BUAA软件工程热身作业
写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 热身作业(阅读) 课程目标 培养软件开发能力 本作业对实现目标的具体作用 深入认识自己,总结过往并展望 ...
- 【BUAA软件工程】第一次阅读作业
BUAA软件工程 第一次阅读作业 项目 内容 这个作业属于哪个课程? 北航软工 这个作业的要求在哪里? 第一次个人作业 我在这个课程的目标是? 学习高效严谨的软件工程开发过程,建立团队意识 这个作业在 ...
- BUAA软件工程结对项目作业
BUAA软件工程结对项目 小组成员:16005001,17373192 1.教学班级和项目地址 项目 内容 这个作业属于哪个课程 博客园班级连接 这个作业的要求在哪里 结对项目作业 我在这个课程的目标 ...
- BUAA软件工程个人项目作业
BUAA软件工程个人项目作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 学习软件开发的流程 这个作业在哪 ...
- BUAA 2020 软件工程 热身作业
BUAA 2020 软件工程 热身作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! ...
- BUAA软件工程:软件案例分析
BUAA软件工程:软件案例分析 Author:17373015 乔玺华 项目 内容 这个作业属于哪个课程 2020计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析博客作业 我在这个 ...
- [2019BUAA软件工程]结对作业
Tips Link 作业链接 [2019BUAA软件工程]结对作业 GitHub地址 WordChain PSP表格 psp2.1 预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 ...
- 软件工程大作业(学生会管理系统)Web端个人总结报告
软件工程大作业(学生会管理系统)Web端个人总结报告 一.小组信息 1.所在小组:第二组 2.小组选题:学生会管理系统 3.项目源代码链接: Web端源代码:code 小程序端源代码:code APP ...
随机推荐
- KMP算法中的几个疑问
KMP算法next数组求解实现 首先我们通过应用场景将KMP算法中用到的名词做一个说明: 在一个字符串(string1)中查询是否存在另一个字符串(string2). 在字符串匹配算法中,我们通常将字 ...
- C语言实现任务调度与定时器
代码实现是在xl2tpd的源码中get到的,感觉很有意思的一段代码.基本功能就是实现定时器,时间到后从定时队列中取出,然后完成指定的任务. 1. schedule.c代码(自己添加了main函数,用来 ...
- WebDriverAgent重签名爬坑记
接上一篇博文,已经配置好了Xcode环境,那接下来要完成的就是重签名WebDriverAgent.在讲重签名之前,我们还是先来了解下WebDriverAgent,熟悉的朋友,可以直接跳过. WebDr ...
- 轻量化模型系列--GhostNet:廉价操作生成更多特征
前言 由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难.特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究. 论文提出了一种新颖的 Gh ...
- Markdown主要语法及使用
最近,我发现使用Markdown这一标记语言的人越来越多了,我也去试了一下,感觉确实在编辑文档上方便了很多.于是我将一些关于Markdown的语法和编写时的快捷键整理在这里,方便以后查阅,也欢迎评论区 ...
- centos7 下安装 mysql5.7
由于CentOS7的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件. 下载命令: wget https://dev.mysql.com/get/mysql57-commu ...
- 洛谷P1603——斯诺登的密码(字符串处理)
https://www.luogu.org/problem/show?pid=1603#sub 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事 ...
- Ts基本数据类型
TS的基本数据类型 string let str : string str = 1 //报错 会提示num是字符串 不是数字 str = 'test' //正确 //拼接字符串 let str2 : ...
- php保留2位小数方法
$num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_ ...
- Nginx系列(10)- Nginx配置文件详解
nginx文件结构 ... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全 ...