欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lab1 report

程序员文章站 2022-03-10 14:52:32
...
仅保留了参考价值比较大的部分实验内容。

1 实验目标概述

2 实验环境配置

3 实验过程

3.1Magic Squares

n阶幻方是n×n数在方格中的排列,通常是独立的,使得所有行中的n个数、所有列的n个数以及两个对角线都等于同一个常数。

3.1.1 isLegalMagicSquare()

实验任务:判断给定文件内容是否为幻方。
实验思路
文件的读入和切割处理

  1. · 以字符串形式按行读入测试文件,文件采用相对路径; · 用.append(s+"\n")方法还原文件总格式;
  2. 调用String.split(),对按”\n”分割,存到Map[][]二维数组作为它的每一行; ·
  3. 再针对每一行调用String.split(),对按”\t”分割,存到Map[][]二维数组作为它相应行的列元素,此时如果不是/t分割提示不满足分割规则;

//注:对于文件的读写和切割总结了一篇blog:https://blog.csdn.net/CynthiaLLL/article/details/104849571

至此字符串型二维矩阵准备完毕,下面是其他条件判断

  1. · 方阵的判断:根据java中矩阵的存储方式,可以判断矩阵的行数Map.length和列数Map[i].length是否相等
  2. 正整数的判断:调用Integer.parseInt()方法将矩阵转化为int内容方阵,并以此判断其中是否有非正整数元素
  3. 设置int数组分别存放每一行、列及对角线和; 先在行、列、对角线内部比较,判断是否相等; 再将行、列、对角线相互比较,判断是否相等。

至此MagicSquare的判断完毕
以上任何条件不满足都直接以false返回,当条件全部满足时返回true。

3.1.2 generateMagicSquare()

  • 奇数矩阵时依次填入1到n^2,第一个填在第一行正中间,依次向上和向右移动一位,顺序填写,第一行向上会到最后一行,最右向右会到最左,每填n个数,下一个数填在该数下面。
  • 对于违法输入,可以采取if条件判断,也可以用try-catch检测异常。

3.2 Turtle Graphics

3.2.4 Problem 6: Calculating Bearings

3.2.4.1 public static double calculateBearingToPoint

计算当前向量转过多少度后达到目标向量。其中当前向量由当前点、当前方向决定,目标方向由当前点、目标点决定,当前方向由当前方向与y轴正方向的夹角表示,目标向量的方向由当前点与目标点的连线与y轴正方向的夹角表示。
  1. 求当前点与目标点的连线与y轴夹角的正切值,tan=(targetX-currentX)/(targetY-currentY);
  2. 调用Math库中的atan2将其转化为角度,即为当前向量与y轴正方向的夹角;
  3. 减去currentBearing(当前方向),得解。

//作差的结果为负数时需要+360转化为正角。

3.2.4.2 public static List calculateBearings

对相邻两个点调用3.2.4.(1)的函数求夹角,保存在列表中,返回该列表。

3.2.5 Problem 7: Convex Hulls

凸包问题,给出一组点的坐标,求最少的点的集合,使其他所有点都在这些点围成的闭合凸多边形内。

使用gift-wrapping算法:

  1. 扫描list列表,找最左下点作为基点,并加入凸包集合中;
  2. 调用夹角计算的函数,找顺时针夹角最小的中继点,加入凸包集合;
  3. 再找后继点B,加入凸包集合;
  4. 将中继点设为起点、后继点设为中继点,依次循环查找直到新找到的点与初始基点。

//每次查找范围为凸包集合以外的点;
//多点平行于y轴时,若要取这个向量,注意中间点忽略的情况判断。

3.3 Social Network

3.3.1设计/实现FriendshipGraph类

  • private List namelist = new ArrayList<>();
  • public boolean addVertex(Person person) //插入结点,注意可能存在的重名情况
  • public boolean addEdge(Person p1, Person p2)//连接p1->p2,注意判断p1、p2的存在性及可能存在的重复连接情况
  • public int getDistance(Person p1, Person p2)//获取p1到p2的最短路径,注意判断p1和p2的存在性
    BFS算法

3.3.2 设计/实现Person类

String name;//名字
List<Person> friends=new ArrayList<Person>();//朋友关系列表
boolean visited=false;//用于BFS计算最短路径的标记
public Person(String name) {
		this.name=name;
}
public void add_friend(Person new_friend) //在朋友关系列表中添加一个新朋友
public List<Person> get_friends()//返回当前结点的friends属性

3.3.4 设计/实现测试用例

  • 加点
    • 重复加点
  • 建立关系
    • 单人不存在时建立关系
    • 双人不存在时建立关系
    • 重复建立关系
  • 测试最小距离
    • 常规最小距离
    • 单人不存在时的最小距离
    • 双人不存在时的最小距离
相关标签: 软件构造