一、概述
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2020春季计算机学院软件工程(罗杰 任健) |
这个作业的要求在哪里 | 作业要求 |
班级 | 006 |
项目地址 | https://github.com/c2170/personal_program |
## 二、PSP 表格
Psp2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 10 | 5 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 30 | 40 |
· Design Spec | · 生成设计文档 | 15 | 10 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
· Design | · 具体设计 | 30 | 20 |
· Coding | · 具体编码 | 100 | 120 |
· Code Review | · 代码复审 | 20 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 100 | 200 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 30 | 20 |
· Size Measurement | · 计算工作量 | 15 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 15 | 15 |
合计 | 390 | 480 |
## 三、解题思路
思考过程
对于这道题目,我的想法比较直接,就是两两求交点,用一个集合来存这些交点。每次求出交点后就和已经在集合中的点比较,判断是否有重合,如果无重合,则总数加一。
资料查找
关于如何根据两点坐标求出直线方程,和根据两条直线方程求交点,我查找了一些资料。
## 四、设计实现过程
代码组织
关于数据的表示,我设计了两个结构体分别来表示直线和交点。
我设计了两个主要函数:1.判断两条直线是否平行;2.求两条直线的交点。这两个函数的传入参数都是两个表示直线的结构体。
单元测试
我的代码中只有一个有返回值函数,所以对这个函数进行单元测试。编写测试代码如下:
测试结果:
## 五、性能分析
用N=500的数据进行性能分析,大约用时20分钟。
CPU使用率
函数calculate用来计算两条直线的交点,它占据了90%以上的CPU使用率。我使用了set来存交点,并且用lower_bound()来判断是否存在重合的点。一开始我就选择了使用容器本身的lower_bound(),这样效率会比较高。
内存使用率
如图所示,内存使用正常。
## 六、代码说明
定义Line结构体表示由两点(x1,y1)和(x2,y2)所确定的直线Ax+By+C=0。
定义Point结构体表示两条直线的交点坐标(x,y)。
isParallel()函数的功能是判断两条直线是否平行,若平行则返回1,不平行返回0。
在calculate()函数中,首先判断两条直线是否平行,若不平行,则计算出交点坐标,并判断该交点是否与已经存在的交点重合,若不重合,则加入集合中。
如图所示,已经消除所有警告。