BUAA2020软工作业(三)——个人项目
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2020春季计算机学院软件工程(罗杰 任健) |
这个作业的要求在哪里 | 个人项目作业 |
我在这个课程的目标是 | 进一步提高自己的编码能力,工程能力 |
这个作业在哪个具体方面帮助我实现目标 | 学习c++,掌握测试方法,掌握软件工程开发规范和相关工具的使用 |
其他参考文献 | 博客1 |
教学班级 | 006 |
项目地址 | https://github.com/Michael-Steven/BUAA-software-engineering-personal-project.git |
一、写在前面
本次作业内容比较简单,比较适合软件工程入门,由于之前没有用c++写过程序,所以这次写起来不算是特别顺利,出过很多玄学bug,不过借助搜索引擎的帮助,我的问题都解决了。通过这次作业我也正好入门了c++的面向对象机制,为以后的作业打下基础。
下述 PSP 表格记录了我在程序的各个模块的开发上耗费的时间:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 20 | 20 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 60 | 60 |
· Design Spec | · 生成设计文档 | 30 | 50 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 240 | 300 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 240 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 50 | 30 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 700 | 800 |
二、解题思路
拿到这个题之后,首先明白这是一道求交点的题,根据数学知识即可得出求交点的公式:
- 两直线的交点:直接联立两个直线的方程即可得解;
- 直线与圆的交点:参考博客1,采用辅助线的方法进行求解,比直接联立方程组求解简单得多;
- 两个圆的交点:将两个圆的标准方程相减得到两个圆交点所在直线的方程,然后根据直线与圆的交点算法进行求解。
三、实现过程
算法选择
采用O(n^2)的算法,每新增一条直线或者一个圆,就和之前输入的所有直线和圆进行交点计算,并存储到相应容器中,最后统计存储的交点数量。
类和方法的设计
本代码共有4个类:
- Point:存储交点坐标;
- Line:存储直线方程的参数;
- get_line_line_intersect():求直线和直线交点
- get_line_circle_intersect():求直线和圆的交点
- Circle:存储圆方程的参数;
- get_circle_line_intersect():求圆和直线的交点
- get_circle_circle_intersect():求圆和圆的交点
- Intersect:存储所有直线、圆和交点。
- add_line():新增直线
- add_circle():新增圆
容器的选择
采用STL中的Set存储,Set中的Insert方法可以在插入新元素的同时自动去除重复的元素,由于本次作业的交点是浮点数,所以在代码中重载了Set中的<运算符,在进行浮点数比较时忽略极小的数值差异,达到去重的目的。
单元测试
对于以下每种情况分别手动编写测试数据:
- 多个直线相交于一个点;
- 直线和圆相切;
- 圆和圆内切/外切;
- 多个圆相交于一个点;
- 一条直线和多个圆相交于一点;
- 多条直线和一个圆相交于一点;
- 其他普通情况。
四、性能改进
本次作业我在算法上没有什么改进的地方,主要是一些细节的改善,比如减少重复的函数调用等等。
性能分析
Code Quality Analysis工具分析
五、关键代码
直线和直线的交点
这里是直接套公式计算交点坐标并存储在intersect中。
直线和圆的交点
直接翻译上面提到的算法就可以,这里要注意的是,答案可能是两个相同的点也可能是两个不同的点,由于Set有去重的功能,这里统一按两个不同点的情况来计算。
圆和圆的交点
在计算出交点连线的方程后直接调用直线和圆的交点方法即可。
BUAA2020软工作业(三)——个人项目的更多相关文章
- BUAA2020软工作业——提问回顾与个人总结
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...
- BUAA2020软工作业(四)——结对项目
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力,团队协作能力 这个作业在哪 ...
- BUAA2020软工作业(五)——软件案例分析
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面 ...
- BUAA2020软工作业(二)——对软件工程的初步理解
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面帮助 ...
- BUAA2020软工作业(一)——谈谈我和计算机的缘分
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...
- BUAA2020软工团队beta得分总表
BUAA2020软工团队beta得分总表 [TOC] 零.团队博客目录及beta阶段各部分博客地址 团队博客 计划与设计博客 测试报告博客 发布声明博客 事后分析博客 敏 杰 开 发♂ https:/ ...
- [软工作业]-软件案例分析-CSDN
[软工作业]-软件案例分析-CSDN(app) 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 ...
- 软工作业-----Alpha版本第一周小结
软工作业-----Alpha版本第一周小结 Part1.第一周周计划记录 姓名 学号 周前计划安排 每周工作记录 自我打分 yrz(队长) 1417 1.进行任务分析 2.任务分配 ...
- 【软工作业&思考】关于软工的一些概念性理解暨第一次阅读作业
概述 项目 内容 本次作业所属课程 2019BUAA软件工程 周二班 本次作业要求 第1次个人作业当然,比这个更重要百倍的还是实实在在的思考,这也是标题如此命名的原因 我在本课程的目标 在原有实践经验 ...
随机推荐
- Codeforces 1365D Solve The Maze
### 题目大意: 在一个 $n * m$ 的矩阵中,有空地.坏人.好人和墙.你可以将空地变成墙来堵住坏人.$(n, m)$为出口,是否存在一个方案使得矩阵中所有好人能够走到出口,而所有坏人不能通过出 ...
- adb 常用命令大全(7)- 其他实用功能
屏幕截图 adb exec-out screencap -p > sc.pn 截图保存到电脑执行该命令的目录下 如果指定文件名以 .png 结尾时可以省略 -p 参数 注意 如果 adb 版本较 ...
- Element NavMenu动态生成导航菜单
为了演示方便,不从数据库获取了 { "data":[ { "id":125, " ...
- Abp Vnext3 vue-admin-template(三获取用户信息)
因为获取用户比较简单,只需要把用户名及头像地址赋值即可(也许理解错误,如果发现请告知谢谢), 首先将src\api\usr.js中的url请求地址改为以下代码 export function getI ...
- Apache网页优化
目录: 一.Apache网页优化概述 二.网页压缩 三.网页缓存 四.隐藏版本信息 五.Apache防盗链 一.Apache网页优化概述 在企业中,部署Apache后只采用默认的配置参数,会引发网站很 ...
- 74cms v3.3 后台SQL注入
注入存在于后台 admin_baiduxml.php 代码 52-63行 elseif($act == 'setsave') { $_POST['xmlmax']=intval($_POST['xml ...
- go相关
mac 上build go 如果想要在centos上面执行 必须使用下面的方式 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o hello ...
- PHP设计模式之模板方法模式
模板方法模式,也是我们经常会在不经意间有会用到的模式之一.这个模式是对继承的最好诠释.当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式的最简单通俗的解释.就像我们平 ...
- Linux下Nodejs安装(完整详细)转
Linux下安装有两种方式,一个是下载源码make编译安装. 另外一种是比较推荐的,直接下载编译好的二进制,官方比较推荐后者. //Linux 64bit version wget --no-chec ...
- Jmeter系列(30)- 性能指标(3) | 性能指标峰值
性能指标峰值 简述 彻底理解了性能指标(1)(2)的内容,这一篇随笔其实就不用看了,而且大家也能猜到这一篇内容是啥:二八原则 性能指标不要硬性的往那些性能指标上去靠,要根据业务来,熟悉业务,明白了解你 ...