HIT软件构造Lab1总结


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方法带参构造写在里面了:

  1. Person对象需要保有一个私有成员变量name,且对外提供访问接口
  2. 需要一个带参构造方法,依据字符串名字初始化对象
    复杂的方法都在FriendshipGraph里。

FriendshipGraph的部分是一个巨大的对数据结构与算法的复习,因为java里边的List确实好用,所以用了邻接表存储图。图的顶点集和边集分别存储为:

  1. 顶点:private List vex
  2. 边: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的练手,甚至锻炼的英语阅读能力,翻译插件有些地方翻得实在是太怪了,软件构造挺好玩,爱学。

  • 44
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值