2022年春季学期
计算学部《软件构造》课程
lab1实验报告
- 1 实验目标概述
- 2 实验环境配置
- 3 实验过程
- 3.1 Magic Squares
- 3.2 Turtle Graphics
- 3.2.1 Problem 1: Clone and import
- 3.2.2 Problem 3: Turtle graphics and drawSquare
- 3.2.3 Problem 5: Drawing polygons
- 3.2.4 Problem 6: Calculating Bearings
- 3.2.5 Problem 7: Convex Hulls
- 3.2.6 Problem 8: Personal art
- 3.2.7 Submitting
- 3.3 Social Network
- 3.3.1 设计/实现FriendshipGraph类
- 3.3.2 设计/实现Person类
- 3.3.3 设计/实现客户端代码main()
- 3.3.4 设计/实现测试用例
1 实验目标概述
本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
- 基本的Java OO编程
- 基于Eclipse IDE进行Java编程
- 基于JUnit的测试
基于Git的代码配置管理
2 实验环境配置
开始的时候在官网上下载eclipse,发现下载不下来,然后上网百度了一个国内路径进行下载。其他的文件建立测试过程中倒是没有遇到什么困难都是按照老师习题课上讲的步骤进行的。
在这里给出你的GitHub Lab1仓库的URL地址。
https://github.com/ComputerScienceHIT/HIT-Lab1-120L020713.git
3 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
幻方是一个n*n的且每行、每列、两条对角线的上的数的和都相等的一个方形结构。实验要求是对于一个矩阵判断其是否为幻方,并且构造一个边长为奇数的幻方。
3.1.1 isLegalMagicSquare()
首先读取文件,按行读取并且记录行数
其次,将非空readline字符串进行分割,去除头尾空格后转化为数字存储在二维数组中,然后对文件内容进行检测,判断其是否存在违法内容,分别对其是否是矩阵、是否是正整数,是否用\t对其进行分割,等等进行检验。
然后,先计算两条对角线的和,若相等那么继续计算,然后计算每行每列的和,跟之前计算的值比较。若相等,那么说明这是一个幻方。
3.1.2 generateMagicSquare()
首先按照输入数据申请二位数组,然后生成一个空矩阵,初始化Row=0,Col=n/2。然后循环n次填充数据,将矩阵的[row, col]位置填充为i,在坐标允许的范围内Row–,Col++然后打开文件并打印结果。
3.2 Turtle Graphics
这道题首先让我们克隆文件,利用所给程序进行一些简单的几何作图,学习设计了凸包算法,并且写了personal art设计自己喜欢的图案。
3.2.1 Problem 1: Clone and import
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
通过git clone代码将对应网址上的文件克隆到本地
3.2.2 Problem 3: Turtle graphics and drawSquare
通过drawSquare函数绘制了一个长度150的正方形,程序如下图所示,GUI结果如上图所示。
3.2.3 Problem 5: Drawing polygons
此题首先希望在我们已知正多边形变数的条件下,求解正多边形内角
其次根据我们的几何知识我们可以得知正多边形内角公式:
(double)180.0−(double)360.0/sides
该测试的结果如下:
类似于绘制正方形的方法,先前进一个sidelength,然后旋转一个角度,执行变数次。如上图绘制了一个8边形,其边长为50
3.2.4 Problem 6: Calculating Bearings
此题是已知当前点和当前角的朝向,想知道到终点需要转动的度数
- 首先使用Math.atan2函数计算两点相对于坐标轴的角度,并且减去当前的朝向角
- 然后取相反数
- 再减去90度
- 最后调整范围到0~360
测试样例如下所示:
1.将“起点”选为第一个点(坐标为(xCoords.get(0),yCoords.get(0)));
2.循环n-1次
3.每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中;
4.将下一次的“起点”用当前“终点”更新,继续循环;
5.退出循环后返回List。
代码如下:
3.2.5 Problem 7: Convex Hulls
凸包算法就是首先先寻找一个最外围的点,我寻找的点在最左下,然后调用calcuateBearing计算所需旋转角的度数找到最小旋转角度数并记录,然后以找到的点作为起点重复之前的操作,最终回到起点之后,结束算法。
测试结果如下图所示:
3.2.6 Problem 8: Personal art
3.2.7 Submitting
如何通过Git提交当前版本到GitHub上你的Lab1仓库。
3.3 Social Network
该任务就是设计一个网络社交图,用来记录人与人之间的关系的。
3.3.1 设计/实现FriendshipGraph类
该类的实现意义是建立一个网络社交图,包括代表每个person的点,两点之间的关系,以及两者计算距离的方法
3.3.1.1
首先使用邻接表的存储结构,使所有的node都连接到一起
3.3.1.2
再建立一个node类将person点转换为邻接表中的点,所以node中有邻接表中点的重要成员:下一个为next ,对应的person类person,直接连接的边lastedge
3.3.1.3
然后通过addvertex的方法在社交网络中加入一个新的节点,加入的参数就是person类,首先要对person进行重复性检验,然后用哈希表记录下所有加入person的名字,然后使person与node类联系到一起。
3.3.1.4
接着通过方法addedge将两个person建立起联系,由于题目是默认双向的,若要考虑单向,仅需将B->A删掉即可
3.3.1.5
最后是方法getdistance,此方法是要计算任意两个person间的距离,若没有任何关系则输出-1。对于两个person间的计算使用BFS
3.3.2 设计/实现Person类
该类的目标是每一个输入的人可以对应到一个person变量
3.3.3 设计/实现客户端代码main()
3.3.4 设计/实现测试用例
简单图检测:
复杂图检测:
检测结果:
当注释掉第10行代码的时候,
程序的输出为:
当输入相同的姓名时,程序出现以下输出: