2021年春季学期 计算机学院《软件构造》课程 Lab 1实验报告
1 实验目标概述 本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。 基本的 Java OO编程 基于 Eclipse IDE进行Java编程 基于 Junit的测试 基于Git的代码配置管理 2 实验环境配置 2.1 IDE 本次实验我选择的编译器是IntelliJ IDEA
2.2 Git 从网上下载Git并且根据教程完成配置
2.3 JUnit 进行JUnit测试的时候没有JUnit支持,所以将JUnit下载到外部库中
2.4 Github仓库
3 实验过程 3.1 Magic Squares 在阅读了实验指导书之后,知道了MagicSquare是一道关于幻方的问题,需要实现如下下的两个功能:
- 从文件中读取幻方并判断是否合法
- 生成一个奇数次的幻方并且保存在文件中 所以我们需要掌握关于文件的读写的能力以及判断幻方是否合法的能力 3.1.1 isLegalMagicSquare() 设计思路: 1.从文件中读取矩阵信息并且将其存储在一个二维数组之中 2.判断读取的幻方是否合法,从以下的几个方面考量: a.存储的行列数是否相等 b.存储的数据类型是否是int型 c.分割数据的是否是tab 3.如果是合法的矩阵我们就判断行列以及对角线的和是否相等判断是否是幻方 4.如果是返回true,如果不是返回false以及错误原因 设计过程: 用bufferedreader读取文件中的内容
将矩阵元素存储在二维数组之中进行判断 非法情况如下: 没有使用tab分隔元素
有非int型数字
有负数
如果都合法,将行列对角线的和存储在数组之中,如果数组中的元素都相等,说明是幻方
设计结果: 对给出的五个txt文件进行测试,结果如下
3.1.2 generateMagicSquare() 流程图:
函数分析: 在初始化的时候,首先将1放置在第一行的中间,然后按顺序将后面的数字放在当前方格的右上方格中,需要注意的是当右上方格出界的时候,就需要将矩阵想象到无限大,然后想象到的矩阵对应实际矩阵的另一边进入。如果当右上方格中已经填有数,则把数填入当前方格正下方的方格中 ,然后我们就可以按照以上步骤循环直到填写完所有方格。 异常分析: n为偶数:错误信息为:Thrown to indicate that an array has been accessed with an illegal index. The index is either negative or greater than or equal to the size of the arra.这是因为在初始化的时候row=n-1,然后循环判断n-1%n==0,所以row++导致row=n,此时数组越界了。 n为负数:错误信息为:Thrown if an application tries to create an array with negative size. 这是因为数组不能用负数当作索引值。 设计结果: 奇数
偶数
负数
3.2 Turtle Graphics 这个问题使用了要求我们使用turtle 绘图包,实现包括绘制正方形、计算并绘制任意正 多边形、计算偏转角、凸包问题以及绘制自己的艺术图形等功能。值得注意的是这些功能应该是可以互相调用。 3.2.1 Problem 1: Clone and import 从github.com/rainywang/S… Lab1-1190200704/src 中,即可得到 P2的相应文件。在 IntelliJ 中的操作是将P2标记为源根,就可以开始操作代码了。 3.2.2 Problem 3: Turtle graphics and drawSquare 画正方形只需要前进sideLength之后旋转90度,重复四次即可。
3.2.3 Problem 5: Drawing polygons 多边形的内角和为(边数-2)*180°,所以每次旋转的角度为(边数-2)*180°/边数。只需要前进sideLength之后旋转得到的度数,重复n次即可。
3.2.4 Problem 6: Calculating Bearings 在calculateBearingToPoint函数中使用Math.atan2() 返回从原点(0,0) 到(targetX-currentX,targetY-currentY)的角度,这是起始点与目标点的夹角,需要注意的是这是相对于x轴正半轴来说的。
用90°减去得到的夹角和给定的currentBearing即为所求
因为不能是负角度,所以在负数的情况下需要加360°。
测试结果如下:
3.2.5 Problem 7: Convex Hulls 凸包的实现方法是: 如果给出的点数小于3,那么我们就直接返回,
不然的话我们就选择最左下的点作为startPoint开始判断。
我们要寻找下一个点nextPoint,寻找的方法是调用calculateBearingToPoint以求找到与目前点currentPoint夹角最小,
值得注意的是在多个点都是夹角最小的情况下,需要找到与目前点currentPoint距离最远的点,
直到nextPoint找到了startPoint得到的点集合就是凸包。 测试结果如下
3.2.6 Problem 8: Personal art 调用drawRegularPolygon画六边形,为了使色彩更加丰富,使用PenColor中的颜色,按顺序变换使得图形有一种动态中的秩序的美感。
3.2.7 Submitting 在powershell下生成公私钥
复制生成的公钥到github
复制github仓库的ssh地址
在intellij中添加远程到github仓库
Commit之后提交即可 3.3 Social Network 这个任务要求的是对有向图进行各项操作,包括加入点,加入边,计算点之间的距离和关系等功能。这个实验在现实中的意义在于可以直接展现人物关系,在操作中还包括了一些对于细节的处理,例如人的名字名字不能相同。 3.3.1 设计/实现FriendshipGraph类
构造addVertex实现加入点的功能,值得注意的是要把姓名存储在nameList链表中,如果出现重复的姓名就需要报错说明添加的姓名重复了。
构造addEdge实现加入边的功能,调用Person类中的makeFriend函数将没有关系的两人单向连接,同时排除连接没有创建的点的情况
还需要读取两个人之间的最短距离,我使用了数据结构课上学的广度优先遍历算法。将开始节点加入队列,然后在循环中先读出队列头,即出队列,读出的头就是当前节点,围绕该节点遍历其能到达的所有所有节点,然后将周围的节点依次加入到队列中,并且设置该节点的距离权值,存储到distanceMap中来。不断循环重复以上操作,逐层遍历直到找到目的节点,或者队列为空,若队列为空都没有找到目标节点那么就是该节点不可达,就返回-1。
3.3.2 设计/实现Person类 Person类的实现相对简单,首先要实现读取名字
构造makeFriend加入新的朋友到friendList链表中
构造isFriend判断链表之中是否有这个朋友。
3.3.3 设计/实现客户端代码main() main函数已经在报告书中给出 运行结果如下
有题目要求我们将Rachel -> Ross的社交关系删除,运行结果如下
有题目要求我们将Ross 改为 Rachel,运行结果如下
3.3.4 设计/实现测试用例 我们创建如下的一张有向图
测试用例如下
测试的结果如下
转载自:https://juejin.cn/post/6980328480097435655