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. GIT:修改上一次提交的注释信息(git commit --amend)

    git commit -m 注释信息 如果这时候注释信息输入错误,就可以输入以下指令更改 git commit --amend 键入" i "进入编辑模式 修改后键入ESC,:wq ...

  2. 部署yum仓库以及NFS共享服务

    目录: 一.YUM概述 二.准备安装源 三.访问YUM仓库 四.本地YUM仓库 五.YUM工具概述 六.软件包查询.安装.卸载 七.NFS共享 一.YUM概述 YUM(Yellow dog Updat ...

  3. 可选链运算符、空值合并运算符 --应用到vue项目

    1.npm安装 npm install @babel/plugin-proposal-optional-chaining // 可选链运算符 ?. npm install @babel/plugin- ...

  4. 【C++基础教程】第四课

    上次的课后练习 第1题输出: 第二题输出:1 第三题: #include<iostream> #include<cmath> using namespace std; int ...

  5. html 表单input disabled属性提交后台无法获得数据

    在input上加入disabled属性后, 点击提交会遗漏该值, 有两个办法: 一 可以考虑readonly属性,一样的不可修改操作,但是可以提交 二 在提交时 js 代码操作去除input上的dis ...

  6. javascript 字符串反转 strip_tags 字符串常用的自定义函数,加载css etc.

    字符串反转 String.prototype.reverse = function() { var a = this.split(''); for (var i = 0, j = a.length-1 ...

  7. html网页乱码

    html乱码原因与网页乱码解决方法   html乱码原因与网页乱码解决方法,浏览器浏览网页内容出现乱码符合解决篇(html中文乱码) 造成html网页乱码原因主要是html源代码内中文字内容与html ...

  8. Hbuilder 生成移动App资源升级包

    建立文件夹www,将需要更新的文件放置在里面. 将manifest.json文件中version字段的版本修改为新编号. 在文件夹www外建立文件update.xml,内容如下: <?xml v ...

  9. Jmeter压测学习6---登录参数CSV

    前言 我们在压测登录接口的时候,如果只用一个账号去设置并发压测,这样的结果很显然是不合理的,一个用户并发无法模拟真实的情况.如果要压测登录接口,肯定得准备几百,甚至上千的账号去登录,测试的结果才具有可 ...

  10. 03-Jwt在.netcore中的实现

    1)jwt的加密解密过程 jwt验证的核心就是加密解密的过程,掌握了这个过程,也就掌握了jwt的原理.jwt的三部分中,header和payload是明文的,能够直接读出来,签名Signature部分 ...