哈尔滨工业大学软件构造lab1实验报告

文章目录


1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Magic Squares 1
3.1.1 isLegalMagicSquare() 1
3.1.2 generateMagicSquare() 1
3.2 Turtle Graphics 1
3.2.1 Problem 1: Clone and import 2
3.2.2 Problem 3: Turtle graphics and drawSquare 2
3.2.3 Problem 5: Drawing polygons 2
3.2.4 Problem 6: Calculating Bearings 2
3.2.5 Problem 7: Convex Hulls 2
3.2.6 Problem 8: Personal art 2
3.2.7 Submitting 2
3.3 Social Network 2
3.3.1 设计/实现FriendshipGraph类 2
3.3.2 设计/实现Person类 2
3.3.3 设计/实现客户端代码main() 2
3.3.4 设计/实现测试用例 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 3
6 实验过程中收获的经验、教训、感想 3
6.1 实验过程中收获的经验和教训 3
6.2 针对以下方面的感受 3

1实验目标概述
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
⚫ 基本的 Java OO 编程
⚫ 基于 Eclipse IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理

2实验环境配置
在网上下载了Eclipse和JDK并安装, 在QQ群下载安装了Git,分为GUI(图形)和CMD(命令行)两种模式,并简单学习了两种模式的使用。
在配置环境变量的过程中,遇到了环境变量JAVA在电脑关机重启后就会失效的问题,通过老师在QQ群的讲解,成功解决问题。

3实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1Magic Squares
幻方是一个n*n矩阵,行,列,对角线之和都相等
3.1.1isLegalMagicSquare()
本题要求写一个函数判断txt文件中保存的矩阵是不是符合幻方要求的矩阵。输入参数为文件路径。返回布尔值。
1.用FileReader、BufferReader、StringBuilder按行读取文件
2.用‘/t’作为分隔符,将每行的字符用split分隔开
哈尔滨工业大学软件构造lab1实验报告
3.分别计算各行各列各对角线的和,判断是否都相等,不相等就返回false
哈尔滨工业大学软件构造lab1实验报告
3.1.2generateMagicSquare()
该函数要求实现一个n为奇数的幻方
哈尔滨工业大学软件构造lab1实验报告
哈尔滨工业大学软件构造lab1实验报告
完成之后将幻方输出到文件中
哈尔滨工业大学软件构造lab1实验报告
3.2Turtle Graphics
该任务需要我们clone已有的程序后,利用turtle按照要求画图,其中需要利用几何知识设计一些函数简化编程,最后可以发挥想象力进行图像设计。
3.2.1Problem 1: Clone and import
打开Github Desktop,找到老师所给的仓库,clone到本地。
3.2.2Problem 3: Turtle graphics and drawSquare
重复四次前进转弯90度
哈尔滨工业大学软件构造lab1实验报告
3.2.3Problem 5: Drawing polygons
计算n边形的内角
哈尔滨工业大学软件构造lab1实验报告
由内角计算边数
哈尔滨工业大学软件构造lab1实验报告
随后重复sides次前进转向即可
哈尔滨工业大学软件构造lab1实验报告
3.2.4Problem 6: Calculating Bearings
利用atan2函数计算前进方向与x轴正向夹角,然后再把该角度转换成和y正向的夹角,注意如果出现负数要加上360度
哈尔滨工业大学软件构造lab1实验报告
3.2.5Problem 7: Convex Hulls
凸包问题有点难,我在网上找到了一种思路
任意凸包上的点,以该点建立一个极角坐标系,该点连结其它所有点的极角中,该点逆时针方向的第一凸包点到该点极角最小,例如P0,到所有点的极角中P0P1极角最小。
算法中首先找到最左边的点,这个点必然在凸包上,然后计算该点连接点极角最小的,这里计算有技巧,算法中进行toright测试,直到找到到最右端的点,找到P1后,就可以从P1开始,接着顺次找到P2,又以P2为起点……

3.2.6Problem 8: Personal art
哈尔滨工业大学软件构造lab1实验报告
哈尔滨工业大学软件构造lab1实验报告

3.3Social Network
实现一个无向图用来存储人际关系,并计算人际关系的距离
3.3.1设计/实现FriendshipGraph类
在FriendshipGraph类中声明两个HashSet:people为Person类型,用来保存人的实例,另写一个namelist为String类型,用来检测是否有重复名字的。
哈尔滨工业大学软件构造lab1实验报告
addVertex(Person newPerson)函数用来加入新的“人”到people列表,再次之前要在namelist中检查是否有重复的名字,有则输出提示。
哈尔滨工业大学软件构造lab1实验报告
addEdge(Person pa, Person pb)函数调用people类的addFriend方法,在每个人的朋友列表中增加新的朋友。
哈尔滨工业大学软件构造lab1实验报告
getDistance函数为难点,声明一个Map<Person, Integer> distant数据结构,来保存起点到当前点的键值对(名字,距离),使用邻接表广度搜索的方法,借助队列,先将起点入队,然后执行循环,直到队列为空前:弹出队列头元素,计算当前距离,把弹出点的所有“朋友”入队,并加入map中,设置距离为先前计算的距离+1。直到找到结束的节点。返回这个点在map中键值对的“值”。
哈尔滨工业大学软件构造lab1实验报告
3.3.2设计/实现Person类
包含保存名字的字符串private String name

保存朋友的字符串private HashSet friendList

哈尔滨工业大学软件构造lab1实验报告
他们相应的get方法getName()和getFriendList()
哈尔滨工业大学软件构造lab1实验报告
构造函数Person,用来给name赋值
哈尔滨工业大学软件构造lab1实验报告
函数addfriend,用来添加朋友关系
哈尔滨工业大学软件构造lab1实验报告
3.3.3设计/实现客户端代码main()
哈尔滨工业大学软件构造lab1实验报告
如果把graph.addEdge(rachel, ross),注释掉,结果为
哈尔滨工业大学软件构造lab1实验报告
原因是rachel到ross的边不存在了,所以rachel和ross距离为-1,其他点也无法达到。只有getDistance(rachel, rachel)返回0。
如果输入相同名字,则输出
哈尔滨工业大学软件构造lab1实验报告

3.3.4设计/实现测试用例
哈尔滨工业大学软件构造lab1实验报告
哈尔滨工业大学软件构造lab1实验报告