软件构造Lab1
1.幻方——MagicSquare
幻方:每一行之和、每一列之和、对角线之和、反对角线之和均相等的矩阵,如下图所示:
MagicSquare类需要满足以下要求:
- 从文件读入数据
- 判断读入的数据是不是满足要求的矩阵
- 如果矩阵满足要求,判断其是否为幻方
- 输入一个正奇数,生成一个以这个数为行数和列数的幻方,并将其数据写入文件。
- 验证生成的矩阵是否为幻方。
按照以下结构设计:
isLegalMagicSquare()
- 程序根据文件名找到文件,并将文件数据按行读入。
- 首先,检测数据中是否出现小数、负数,分隔符是否为“\t”,并判断数据是否为方阵。如果不满足要求,函数返回false并终止。
- 再次读入数据,将字符串转换为整数并存入数组,期间判断是否出现0。如果出现0,返回false并终止程序。
- 将第一行元素的和作为标志,与其他行、列、对角线的和比较。如果都相等,f返回true,此文件中的数据是幻方。如果出现不相等的情况,返回false,此文件中的数据不是幻方。
generateMagicSquare
- 判断n是否为正奇数,如果不是,返回false并终止程序。
- 按参数生成一个空矩阵。
- 循环n*n次填充矩阵。
将矩阵的[row, col]位置填充为i。
在保证坐标在矩阵范围内的情况下使Row–,Col++。
2.Turtle Graphics
本节采用MIT作业。点击查看
需要实现的目标:
- 使用Turtle画图
- 计算图形中的一些问题
drawSquare
此函数需要画一个正方形。只需画一个边长的线并顺时针转90度,重复4次即可。
运行结果如下:
Drawing polygons
此函数需要画一个正n边形。首先算出正n边形的内角a,然后与正方形类似,画一个边长的线并顺时针转a,重复n次。
6边形运行结果如下:
Calculating Bearings
此函数需要计算前进方向与y轴正向的夹角。
先利用atan2()计算方向与x周正向夹角,再计算前进方向与y轴正向夹角。注意使每一步的计算结果都大于0度小于360度。
Convex Hulls
此函数需要计算凸包。
凸包(Convex Hull)是一个计算几何(图形学)中的概念。
在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,…Xn)的凸组合来构造。
在二维欧几里得空间中,凸包可想象为一条刚好包着所有点的橡皮圈。
计算凸包算法点击查看→Java实现凸包算法
本文采取相对简单的边界漫游法。
- 遍历所有的点,找到最左下角的点。
- 以找到的点为基点,y轴正向为目前偏移角,开始依次找顺势针转角最小的点,记录这个点并将他加入到凸包集合中,以这次的偏向角累加上之前的角度度作为下一次的目前偏向角。
- 循环直到再次遇到最左下角为止退出。
时间复杂度O(n^2)
Social Network
这一部分需要实现一个社交网络,并计算人与人之间的社交距离。
FriendshipGraph
数据结构:图,用邻接表形式存储。
- addVertex:将Person添加到社交网络中。
将Person添加到邻接表。 - addEdge:添加人际关系。
将对应的Person添加EdgeNode。 - getDistance:获取社交距离。
使用广度优先搜索算法得出社交距离。
Person
定义类Node作为辅助,存储姓名和关系。
- addEdge:使用头插法将节点插入邻接表。
测试用例
两个相同人名
两个相同关系
实验手册中的测试用例
JUnit测试结果