1. 实验目标
实验通过求解三个问题,实现以下目标:
⚫ 基本的 Java OO 编程
⚫ 基于 IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理
是一个简单的衔接作用的实验,对大家都蛮友好的。
2. 实验环境配置
如果使用过IDEA和git这部分应该没什么困难,但是我IDEA重装了一遍的时候配JUnit4,我默认导的版本4.13.1会让IDEA卡死,换成4.12就好了。
3. 实验过程
3.1 Magic Square
首先是简单的一个读文件和判断的过程,读的时候用split和regex把数字分出来再用Integer.Integer.valueOf(substr) 转成Integer存了就行,我是用了List<Integer[]>来寸,因为List本身的很多方法比较方便。
在读取文件的时候要对文件格式检查,是否为矩阵,是否用”\t”分割,是否有不是整数的项,是否有不是正数的项,行列数是否相等,都不难判断,用正则表达式或者读完之后判断一下就行。
然后是拿来一个给额的函数,用来判断读取的是不是幻方,只需要理解思路就行:分别存储每行、每列的数据和,分别存储两个对角线的和。获得所需数据后,检查行列的首项和值是否相等,再检查行的所有和是否相同、列的所有和是否相同,最后检查行的首项和是否与两个对角线和相等,若否,在过程中返回false;在最后返回true。
之后是generateMagicSquare(),简单描述一下思路:
首先判断接受的幻方大小的参数是否非法(为偶数或负数),若是,直接返回false;若否,用一个二维数组int magic[][] = new int[n][n] 存放生成的矩阵,并对矩阵进行如下操作:首先将数字 1 放在第一行的中间位置;从数字 2 开始,将下一个数字放在当前数字的右上方具体放置方式为检查当前数字 i 是否是 n 的倍数,如果是,则切换到下一行;若不是,则此时如果当前行已经到达第一行,则需要切换到最后一行继续填数;若在最后一列,则切换到第一列进行填数。
之后存进6.txt再用之前的判断函数判断一下,sout出结果。
3.2 Turtle Graphics
要求克隆仓库到本地仓库并将其导入项目,在此基础上使用仓库中提供的函数,并结合自己编写的代码,实现画正方形、绘制多边形、计算方位角、计算凸包的函数。
这部分都比较简单,只有凸包的函数要仔细学一下,我学习了礼品包装算法实现的:
从给定点集中选取一个起始点,然后逐步添加其他点,以形成凸包的边界。
设计思路如下:
1.遍历点集,找到最左边(或最右边)的点 P,将其作为起始点
2.创建一个空的凸包列表,将起始点 P 添加到凸包列表中,并标记 P 为当前点
3.计算 P 到其他点的极角,选择下一个点 Q,使得 PQ 的极角是最小的。如果有多个极角相同的点,选择最远的点
4.将 Q 添加到凸包列表中,并将 Q 设置为当前点
5.重复步骤 5 和 6,直到下一个点等于起始点 P
最后是画画,本来想画个Miku,但是懒了,就只画了个花(。
3.3 Social Network
实现一个FriendshipGraph类,模拟社交网络中的人际关系,并能够计算图中两个人之间的距离。任务还要求实现一个辅助类Person。在FriendshipGraph类里实现getDistance方法,getDistance方法应以两个Person对象作为参数,并返回两个人之间的最短距离(int),如果两个人没有连接(或者说没有任何从第一个人到达第二个人的路径),则返回-1。
对于Person类,我只把Person的基本信息和getter方法带参构造写在里面了:
- Person对象需要保有一个私有成员变量name,且对外提供访问接口
- 需要一个带参构造方法,依据字符串名字初始化对象
复杂的方法都在FriendshipGraph里。
FriendshipGraph的部分是一个巨大的对数据结构与算法的复习,因为java里边的List确实好用,所以用了邻接表存储图。图的顶点集和边集分别存储为:
- 顶点:private List vex
- 边:private List<List> edge
之后距离的计算用广度优先搜索就行。但是注意还需要满足Person类对象的名字不能重复的原则,可以遍历一遍顶点集来找,也可以考虑把名字拿来单独存一个Set来找。
3.4 测试用例
第一次写测试用例,要记住不仅要观察函数返回值还得观察类内部的变化,只观察返回值的测试是不够深入有说服力的。这次只需要对 FriendshipGraph测试,工作量不大,可以说是一个学习测试的平稳过渡。
当时就主要设计了三个测试函数,现在看来覆盖度好像不是太高:
测试addVertex的方法:addVertexTest
在其中赋给两个Person对象相同的String,根据是否抛出指定异常和FriendshipGraph类对象的Verlist中的有效数据个数测试:
//赋相同name
String name=new String("Alpha");
Person p=new Person(name);
Person p1=new Person(name);
//判断
Assert.assertTrue(graph.getVerlist().contains(p));
Assert.assertEquals(1,graph.getVerlist().size());
测试addEdge的方法addEdgeTest
根据FriendshipGraph类对象的Edgelist中对应元素中的有效数据个数测试
//测试中存在与该句形式相同的数条代码
Assert.assertEquals(1,graph.getEdgelist().
get(graph.getVerlist().indexOf(p1)).size());
测试getDistance的方法:getDistanceTest
根据getDistance函数返回值需是否与实际结果匹配进行测试
//测试中存在与该句形式相同的数条代码
Assert.assertEquals(1, graph.getDistance(p1, p2));
总结
蛮有趣而且很人道(?的一个实验,难度不大,测试的要求也不高,就算没有java基础也能比较好地完成,可以当成试一次把语言换成java以及使用git的练手,甚至锻炼的英语阅读能力,翻译插件有些地方翻得实在是太怪了,软件构造挺好玩,爱学。