哈工大 软件构造Lab1的设计实现
2021年春季学期
计算学部《软件构造》课程
Lab 1实验报告
目录
1. 实验目标概述 3
2. 实验环境配置 3
3. 实验过程 6
3.1 Magic Squares 6
3.1.1 isLegalMagicSquare() 6
3.1.2 generateMagicSquare() 8
3.2 Turtle Graphics 10
3.2.1 Problem 1: Clone and import 10
3.2.2 Problem 3: Turtle graphics and drawSquare 10
3.2.3 Problem 5: Drawing polygons 11
3.2.4 Problem 6: Calculating Bearings 11
3.2.5 Problem 7: Convex Hulls 12
3.2.6 Problem 8: Personal art 12
3.2.7 Submitting 14
3.3 Social Network 14
3.3.1 设计/实现FriendshipGraph类 14
3.3.2 设计/实现Person类 15
3.3.3 设计/实现客户端代码main() 16
3.3.4 设计/实现测试用例 17
4. 实验进度记录 18
5. 实验过程中遇到的困难与解决途径 19
6. 实验过程中收获的经验、教训、感想 19
6.1 实验过程中收获的经验和教训 19
6.2 针对以下方面的感受 19
实验目标概述
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
⚫ 基本的 Java OO 编程
⚫ 基于 Eclipse IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理
实验环境配置
在这里给出你的GitHub Lab1仓库的URL地址。
https://github.com/ComputerScienceHIT/HIT-Lab1-1190200828
实验过程
Magic Squares
该任务的目标:设计isLegalMagicSquare()函数,判定给定的几个矩阵是否为magic
square;将给定的生成奇数阶的magic
square的generateMagicSquare()函数作为静态函数加入我的程序代码中,将生成的矩阵存入6.txt并调用isLegalMagicSquare()判断所生成的矩阵是否正确。该阶段涉及到文件读写操作、对某些特定函数的调用(例如split等)、对部分异常的处理(例如矩阵中有负数、浮点数,或是行列数不相等)等。
isLegalMagicSquare()
1.根据实验要求,我不能上来直接就去用magic矩阵的定义去判断其正确性,即每行每列每个对角线的元素和都相等;而是应该先判断给定的矩阵是否合理,即判断行列数是否相等、矩阵中是否有浮点数、负数等。由此,我的想法是设置一个整型变量n = 0,对于txt文件先按行读入,每读入一行n++,直到读完文件,此时n的值即为矩阵行数。然后,依旧是按行读入文件,每读入一行,将其存入String line中,并调用split(“\t”)将其分割并存入String[] line_cut,比较行数n与line_cut.length,不相等则输出错误提示并返回false,后经过测试,当文件未用”\t”进行分割时,也会导n != line_cut.length,因此在这里一并输出错误提示;然后判断line_cut中的每一个元素是否都是正整数,按位寻访line_cut,若出现某一位不在数字字符’0’-‘9’中,则输出错误提示并返回false。综上所述,即有如下代码:
- 以上错误判断完毕后,将读入的文档存入矩阵magic中,并按照magic矩阵定义进行测试,若不符合magic矩阵定义,则返回false。注意,在此过程中,并未输出错误提示,表示矩阵本身不存在行列数不相等等错误。于是有以下代码:
至此,isLegalMagicSquare()函数设计完毕;
- 结果展示:
generateMagicSquare()
程序代码已经在ppt中给出,程序流程图如下:
除该程序代码外,需对该函数的输入进行测试,以防输入为偶数或负数。该测试在我的main函数中完成,输入阶数为负数或偶数或输入阶数小于2时输出错误提示并予以重新输入,但是,如果输入根本并非整数,而是浮点数或字符时,则输出错误提示且不允许重新输入,于是有如下代码:
除此之外,还需要在函数中加入文件写入操作,将产生的magic矩阵存入6.txt以便于main函数中测试其生成的magic矩阵的正确性,添加的代码如下:
结果展示:
Turtle Graphics
该任务的目标:clone已有的程序后,利用turtle按照要求画图,主要需要修改及再编程的是TurtleSoup类,其中的一些函数编程时需要结合我们已有的数学几何知识、TurtleSoup类中的提示信息以及测试用的TurtleSoupTest类中的提示信息,最后可以发挥想象力进行自己的创作。
Problem 1: Clone and import
- 从github获取代码
由于clone出现问题,找不到实验报告上给的那个链接,所以我进入该链接后,将代码逐个复制到我的程序类中。
初始化本地仓库
git init
Problem 3: Turtle graphics and drawSquare
该函数需要实现:已知边长,画出边长为指定数值的正方形。参数是海龟对象turtle和边长sideLength。
循环执行,每次画笔直行sideLength距离,然后画笔方向旋转90度,循环执行4次后即可得到所需要的正方形,函数代码如下:
结果展示(sideLength = 40):
Problem 5: Drawing polygons
首先,要求计算已知正多边形边数的内角度,该计算由已知公式可以推导,因此相关函数代码如下:
根据正方形的画法,只需要将画笔的转向角度设置为180 –
内角度数,循环多边形边数次数即可。考虑到画笔转向既能是顺时针又能是逆时针,故在此声明:sides可为负数,且当sides为负整数时,代表着画笔将逆时针旋转,且旋转度数为180
– 内角度数,并且取sides的绝对值为正多边形边数。函数代码如下:
Problem 6: Calculating Bearings
首先,已知起点和当前朝向角度,要求起点到终点需要转动的角度。根据几何运算,得函数代码如下:
上述问题的扩展:此时有若干个点,要求从第一个点开始到第二个点,再从第二个点到第三个点……以此类推每次转向的角度。以起点为第一个点,循环n-1次,每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中,将下一次的“起点”用当前“终点”更新,继续循环。程序代码如下:
Problem 7: Convex Hulls
由凸包算法(CSDN(ConvexHull凸包算法之Gift-Wrapping_Innovative
Workstation-CSDN博客)上查阅),可得该函数代码为:
Problem 8: Personal art
函数代码:
结果展示:
Submitting
由于第一次提交时已经进行过初始化以及与我的云仓库的关联,本次提交中只需要添加文件、注释以及提交三个步骤。
Social Network
该任务的目标:设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间需要的最少的关联路径。于是,该问题为最短路径问题,而构建的图为无向无权图,所以利用DFS深度优先遍历即可得到两点间的最短路径。
设计/实现FriendshipGraph类
存储图中的人姓名的集合:
addVertex()函数:首先判断Person
p是否在图中,若已经存在于图中,则输出错误信息,程序结束;否则将p添加至person中。
addEdge()函数:在a、b的朋友列表里分别加入彼此。
getDistance()函数:DFS深度优先算法求最短路径
设计/实现Person类
Person类包括:
Person():包括这个人的名字p_name,这个人的朋友列表friends;
IsFriendOf(Person p):在p_name的朋友列表里加入p;
设计/实现客户端代码main()
由ppt给出:
设计/实现测试用例
思想:将a通过addVertex()函数加入testGraph1中,b不加入,因此,测试用例为a在testGraph1.person中,b不在;
思想:将a、b通过addVertex()函数加入testGraph1中,调用addEdge()函数,在a、b加一条线,即关联在一起,那么,a、b的朋友列表将包含彼此,因此测试用例中,a在b.friends中,b也在a.friends中;
思想:getDistance测试中应包括自己与自己、相互认识的两人、相互不认识但是有中间人关联的两人以及互不相干的两人;
测试结果:
至此,实验设计结束。
哈工大 软件构造Lab1的设计实现相关推荐
- 2022哈工大软件构造lab1小结(知识点)
哈工大软件构造lab1小结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 问题一 使用的库 异常处理机制 字符串内容检查 写入文件 问题二 problem 3:画一 ...
- 哈工大软件构造lab1
2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 姓名 麦昌瀚 学号 190110920 班号 7 电子邮件 835889372@qq.com 手机号码 目录 1 实验目 ...
- 哈工大软件构造Lab1实验报告
2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 目录 1 实验目标概述... 1 2 实验环境配置... 1 3 实验过程... 1 3.1 Magic Squares ...
- 哈工大软件构造Lab1(2022)
目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...
- HIT哈工大软件构造实验lab3设计
报告下载地址lab3报告 目录 一.对于ADT设计 1.1共性设计 1.2个性化设计 1.3代码展示 二.对于方案及设计模型的设计 2.1方案设计 2.1.1装饰器模式(方案6) 2.2.2委派模式( ...
- 哈工大软件构造实验一
哈工大软件构造lab1 实验目标 实验过程 Magic Square 第一部分 要求 实现 第二部分 要求 实现 Turtle Graphics 第一部分 绘制多边形 第二部分 计算方位 第三部分 凸 ...
- 哈工大2021软件构造lab1总结
哈工大2021软件构造lab1总结 作为软件构造的第一次实验,感觉内容本身不是很难,里面功能的实现用上学期在数据结构和算法分析两门课里学到的知识就可以解决(尽管其实已经忘没了).这次实验主要目的还是准 ...
- 哈工大软件构造期末知识点总结
哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...
- 哈工大软件构造课程知识点总结(一)
系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...
最新文章
- day16 递归函数
- pythond的执行原理_python基础——继承实现的原理
- 荣耀9igoogle模式_iGoogle个性化主页的6种替代方法
- ARM9之NAND FLASH总结
- 【CodeChef - CLIQUED 】Bear and Clique Distances(建图,缩点技巧,思维)
- linux系统运行pbs出现ntf,Linux系统启动故障修复
- Java String转int、float、double
- 现在程序员的工资是不是被高估了?不存在的!
- IOS开发--网络篇--GET请求和POST请求
- 2013-07-23 IT 要闻速记快想
- Solidworks:Solidworks2016软件程序破解详细攻略说明(也适合长时间没使用SW2016再次破解)
- [Zer0pts2020]ROR1
- kali局域网扫描ip_kali 扫描局域网的QQ
- 智能卡破解入门二三事(转载)
- Python实战项目(一)刷网页访问量程序
- 矩阵的谱分解 (详细推导步骤~~~特征值分解特征向量
- 服务器硬件配置及RAID配置操作
- 认识RAM、ROM、CACHE
- IDC机房网络系列视频
- 日本NTT Yamamoto教授荣获2022年兰姆奖