软件构造Lab1

1.幻方——MagicSquare

幻方:每一行之和、每一列之和、对角线之和、反对角线之和均相等的矩阵,如下图所示:软件构造Lab1

MagicSquare类需要满足以下要求:

  1. 从文件读入数据
  2. 判断读入的数据是不是满足要求的矩阵
  3. 如果矩阵满足要求,判断其是否为幻方
  4. 输入一个正奇数,生成一个以这个数为行数和列数的幻方,并将其数据写入文件。
  5. 验证生成的矩阵是否为幻方。

按照以下结构设计:
软件构造Lab1

isLegalMagicSquare()

  1. 程序根据文件名找到文件,并将文件数据按行读入。
  2. 首先,检测数据中是否出现小数、负数,分隔符是否为“\t”,并判断数据是否为方阵。如果不满足要求,函数返回false并终止。
  3. 再次读入数据,将字符串转换为整数并存入数组,期间判断是否出现0。如果出现0,返回false并终止程序。
  4. 将第一行元素的和作为标志,与其他行、列、对角线的和比较。如果都相等,f返回true,此文件中的数据是幻方。如果出现不相等的情况,返回false,此文件中的数据不是幻方。

generateMagicSquare

  1. 判断n是否为正奇数,如果不是,返回false并终止程序。
  2. 按参数生成一个空矩阵。
  3. 循环n*n次填充矩阵。
    将矩阵的[row, col]位置填充为i。
    在保证坐标在矩阵范围内的情况下使Row–,Col++。

2.Turtle Graphics

本节采用MIT作业。点击查看
需要实现的目标:

  1. 使用Turtle画图
  2. 计算图形中的一些问题

drawSquare

此函数需要画一个正方形。只需画一个边长的线并顺时针转90度,重复4次即可。
运行结果如下:软件构造Lab1

Drawing polygons

此函数需要画一个正n边形。首先算出正n边形的内角a,然后与正方形类似,画一个边长的线并顺时针转a,重复n次。
6边形运行结果如下:
软件构造Lab1

Calculating Bearings

此函数需要计算前进方向与y轴正向的夹角。
先利用atan2()计算方向与x周正向夹角,再计算前进方向与y轴正向夹角。注意使每一步的计算结果都大于0度小于360度。

Convex Hulls

此函数需要计算凸包。
凸包(Convex Hull)是一个计算几何(图形学)中的概念。
在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,…Xn)的凸组合来构造。
在二维欧几里得空间中,凸包可想象为一条刚好包着所有点的橡皮圈。
软件构造Lab1
计算凸包算法点击查看→Java实现凸包算法

本文采取相对简单的边界漫游法。

  1. 遍历所有的点,找到最左下角的点。
  2. 以找到的点为基点,y轴正向为目前偏移角,开始依次找顺势针转角最小的点,记录这个点并将他加入到凸包集合中,以这次的偏向角累加上之前的角度度作为下一次的目前偏向角。
  3. 循环直到再次遇到最左下角为止退出。

时间复杂度O(n^2)

Social Network

这一部分需要实现一个社交网络,并计算人与人之间的社交距离。

FriendshipGraph

数据结构:图,用邻接表形式存储。

  1. addVertex:将Person添加到社交网络中。
    将Person添加到邻接表。
  2. addEdge:添加人际关系。
    将对应的Person添加EdgeNode。
  3. getDistance:获取社交距离。
    使用广度优先搜索算法得出社交距离。

软件构造Lab1

Person

定义类Node作为辅助,存储姓名和关系。

  • addEdge:使用头插法将节点插入邻接表。

软件构造Lab1

测试用例

两个相同人名
软件构造Lab1
两个相同关系软件构造Lab1
实验手册中的测试用例
软件构造Lab1
JUnit测试结果
软件构造Lab1