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次个人作业当然,比这个更重要百倍的还是实实在在的思考,这也是标题如此命名的原因 我在本课程的目标 在原有实践经验 ...
随机推荐
- Docker(36)- docker run 的流程和原理
背景 目前项目组上, Docker 用的非常重,所有微服务都是通过 docker 来部署的 所以不能仅仅会命令,还得会一些原理的东西,特此补一篇基础点的,后面再更加深入一些 docker 原理 本篇学 ...
- Asp.Net 5上传文件 (Core API方式)
参考文档 首先在控制器中注入IWebHostEnvironment IWebHostEnvironment提供有关正在运行应用程序的Web托管环境的信息. 属于命名空间Microsoft.AspNet ...
- mybatis和hibernate区别
一.本质区别和应用场景
- Excel导入保存附件和解析数据
Excel导入保存附件和解析数据 一,前端上传附件的组件 1.先给一个下载模板的按钮 // 下载Excel模板 downLoadExcel: function () { window.open(GLO ...
- k8s nodes节点 notready问题
1.在master查看node状态 [root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready co ...
- 洛谷P1019——单词接龙(DFS暴力搜索)
https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- EditPlus配置C/C++运行环境
1.安装MinGW和EditPlus 2.打开EditPlus ctrl+1 编译 ctrl+2 运行
- Java Web下MySQL数据库的增删改查(二)
前文:https://www.cnblogs.com/Arisf/p/14095002.html 在之前图书管理系统上做了改进优化 图书管理系统v2 首先是项目结构: 1.数据库的连接: 1 pack ...
- 浅析Java中的static关键字
关键点 <Java编程思想>对static方法的描述:"static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建对象的 ...
- centos修改ssh默认端口号的方法
修改/etc/ssh/sshd_config配置文件(注意:这里是sshd_config,而不是ssh_config) vi /etc/ssh/sshd_config 在sshd_config文件中添 ...