1.实验目标概述
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法
- 基本的 Java OO 编程
- 基于 Eclipse IDE 进行 Java 编程
- 基于 JUnit 的测试
- 基于 Git 的代码配置管理
2.实验环境配置
首先在官网进行下载jdk,选择实验要求的jdk11。
然后完成安装过程。
到我的电脑-属性-高级系统设置-环境变量,修改环境变量。
配置JAVA_HOME、CLASSPATH、Path。
通过命令行程序确定配置完成。
在这里给出你的GitHub Lab1仓库的URL地址。
https://github.com/ComputerScienceHIT/HIT-Lab1-xxxxxxx
3.实验过程
3.1Magic Squares
要求构造一个MagicSquare.java来检验幻方,即对于一个n*n的二维矩阵,每一行,每一列以及对角线上的数相加都是相等的。主要考察了文件读写,exceptions处理和类型转换。
3.1.1isLegalMagicSquare()思路:读取数据,逐行,列,对角线求和,判断是否相等,满足正确性。同时考虑各种exceptions,保证代码的健壮性。
过程:首先根据fileName读入文件,若文件不存在则抛出则直接返回false并提示错误。
然后按照顺序一行一行地存入到ArrayList变量list中
将list中元素依次存入字符串中,再使用split方法以t分隔开数字,之后再依次将分隔后的数字存入到一个二维数组中。
最后采用循环,计算每一行,每一列,对角线的和。有不同则返回false,全部相等则返回true。
结果:
3.1.2generateMagicSquare()思路:首先判断输入的n是否合法,合法则继续,不合法则作为exceptions处理后退出。然后进行新建文件,按给定的算法生成数组,将数组写入文件中。
算法分析:流程图如下
主要思路是:首先计算初始位置(0,n/2),赋值为1,之后每次取当前位置的右上角的位置,设置的值每次加1,如果当前行是第一行,则下一行为最后一行,如果当前列是最右边的列,则下一次取左边第一列,当每设置好n个数时,向下移动一行,如此重复平方次,就对整个矩阵赋完值了,且满足幻方定义。
结果:
3.2Turtle Graphics该任务需要我们clone已有的程序后,利用turtle按照要求画图,其中需要利用几何知识设计一些函数简化编程解决相应的问题,其中问题八较为复杂,最后可以发挥个人想象力进行Personal Art。
3.2.1Problem 1: Clone and import如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
打开目标存储文件夹 右键点击Git Bash
输入git clone https://github.com/ComputerScienceHIT/Lab1-xxxxxxx.git
3.2.2Problem 3: Turtle graphics and darwSquare该函数要求实现:已知边长,画出指定边长的正方形。参数是海龟对象turtle和边长sidelength。
向前移动sidelength个长度,再旋转90度,这个过程循环四次就可以画出一个以sidelength为边长的正方形。下图是一个以sidelength=100画出的正方形。
代码如下:
3.2.3Problem 5: Drawing polygons该函数要求实现:已知边数和边长,画出指定边数和边长的正多边形。参数是海龟对象,边数和边长。
通过calculateRegularPolygonAngle函数计算出该正多边形每个角angle的大小,再通过循环,循环内容为向前移动sidelength个长度,再旋转180-angle的角度(即外角),循环次数为边数。下图是sidelength为100,sides为6的正多边形。
代码如下:
3.2.4Problem 6: Calculating Bearings
该函数要求:已知一组点的坐标,计算出对于相邻两个点,从一个点到另一个点需要调整的角度,将结果存在一个列表中。
通过循环,调用calculateBearingToPoint函数计算出两个点直接需要调整的角度(角度要对360取模),并将结果存到了adjustments列表中。
代码如下:
3.2.5Problem 7: Convex Hulls
这题比较复杂,尤其是涉及几何的部分,比较繁琐。
该函数要求:已知一个点的集合,求出这个点集的凸包
当点的个数小于等于3个时,这组点即位所求。直接返回即可。当点的个数大于3时,首先找到纵坐标最小的点,然后找到下一个点,使得两点连线相对于x轴正方向的夹角最小,这样可以覆盖尽可能多的点,并将找到符合要求的点存到集合中。然后以新找到的点为起点,寻找下一个点,使得上一条边到这两点之间的连线转动的角度最小。这样一直循环直到首尾相同(即rtPoint=minPoint)。返回这组点的集合。
测试结果为:
代码如下:
3.2.6Problem 8: Personal art
通过循环,以不同起点画出正六边形,在每一轮循环中又改变了正六边形的颜色和边长。
3.2.7Submitting
如何通过Git提交当前版本到GitHub上你的Lab1仓库。
IDEA为git提供了友好的图形化界面,点击commit提交到本地,然后push到github即可。
3.3Social Network首先要求构造两个类:Person,FriendshipGraph。然后以Person为节点,在FriendshipGraph中构造一个有向图,可以在这个有向图中实现填加节点Person,添加边。并且要求实现一个方法,可以给出任意两点之间的最短距离,不存在返回-1,两点相同返回0。
然后在FriendshipGraph.class的main中放入作业给出的client implementation,再对Person,FriendshipGraph的测试。然后按照要求写出FriendshipGraphTest.class,再进行测试。
3.3.1 设计/实现FriendshipGraph类
3.3.1.1 数据结构设计
首先应该建立一个列表persons存储所加入节点的列表,其次要有一个集合names存储各个节点的名字用于判断是否有重复名字的节点加入,再建立一个二维数组来实现领接矩阵,所以选择Vector
3.3.1.2 addVertex方法
首先利用集合name的contains方法判断集合中是否有和要添加的节点同名的节点,如果有则打印错误信息并返回false,若没有则可以新建一个vector变量SinglePerson存储新节点与其他节点的关系,并将这个SinglePerson加入到已有的二维vector中,再将每一行增加一位存储各点与新节点的关系,最后返回ture。
3.3.1.3 addEdge方法
addEdge方法接收有向边起始点p1和终点p2(二者为Person类型),若二者中有一个为null则打印错误信息并返回false,若二者有一在图中没有对应顶点,同样打印错误信息并返回false。保证二者在图中有对应顶点后,新建有向边并将其添加进邻接矩阵并返回true。
3.3.1.4.getDistance方法
首先判断起始点p1和终点p2是否为空若二者中有一个为空则打印错误信息并返回-2,若二者之一不在图中则打印错误信息并返回-1。然后从第一个点开始进行BFS,用队列queue保存接下来要访问的节点,数组visit保存各个节点是否被访问过,每访问完一轮distance加一,最后访问p2,得到两者之间的距离并返回。
3.3.2 设计/实现Person类
3.3.2.1 name
每个节点显然都需要一个字符串存各自的名字,对构造方法重写后,新建节点时就需要输入相应的name。通过getName可以获得节点的name。
3.3.2.2 Index
新建节点后,节点的Index默认为-1,只有当加入到关系图后,使用setIndex方法才会对Index进行修改。通过getIndex可以获得节点的Index。
3.3.3设计/实现客户端代码main()
由于实验手册已经规定了client代码,因此复制即可。运行结果也符合要求
3.3.3.1 设计/实现测试用例
设计思路:分别对addVertex, addEdge, getDistance三个方法进行测试。
1.对于addVertex,设计test用例addVertexTest,内建4个Person对象全部执行addVertex,判断persons是否包含这些对象即可。
2.对于addEdge,设计测试用testaddEdgeTest,内建4个Person对象,执行addVertex后,执行addEdge然后判断他们的朋友中是否包含彼此即可。
3.对于getDistance,设计test用例testgetDistanceTest,内建11个Person对象,执行addVertex,addEdge后,测试三种距离等价类:距离为-1,距离为0,距离为正整数。



