2022年春季学期
计算学部《软件构造》课程
Lab 1实验报告
姓名 | 薄文 |
学号 | 120L020513 |
班号 | 2003004 |
电子邮件 | 604094538@qq.com |
手机号码 | 18104568559 |
1 实验目标概述...................................................................... 1
2 实验环境配置...................................................................... 1
3 实验过程................................................................................ 1
3.1 Magic Squares............................................................... 1
3.1.1 isLegalMagicSquare()............................ 1
3.1.2 generateMagicSquare()......................... 1
3.2 Turtle Graphics............................................................. 1
3.2.1 Problem 1: Clone and import.......................... 2
3.2.3 Problem 5: Drawing polygons........................ 2
3.2.4 Problem 6: Calculating Bearings................... 2
3.2.5 Problem 7: Convex Hulls.................................. 2
3.2.6 Problem 8: Personal art..................................... 2
3.2.7 Submitting.............................................................. 2
3.3 Social Network.............................................................. 2
3.3.1 设计/实现FriendshipGraph类.............. 2
3.3.2 设计/实现Person类...................................... 2
3.3.3 设计/实现客户端代码main()................... 2
3.3.4 设计/实现测试用例.......................................... 3
4 实验进度记录...................................................................... 3
5 实验过程中遇到的困难与解决途径.......................... 3
6 实验过程中收获的经验、教训、感想..................... 3
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开 发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够 为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。 另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
基本的 Java OO 编程
基于 IntelliJ IDEA 进行 Java 编程
基于 JUnit 的测试
基于 Git 的代码配置管理。
首先在官网下载JDK,然后进行安装,并安装IDEA和git,先进行了git的配置,同时用ssh公钥将自己的本地仓库连接到github上的仓库,进行实验2时,开始会报错,需要链接Junit4,才会不报错。
URL地址:
https://github.com/ComputerScienceHIT/HIT-Lab1-120L020513
3. 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
MagicSquare是一个正整数组成的正方形,他的每一行、每一列和对角线的数字之和都相等。
任务一:编写一个Java程序(Magicsquare.java)用于检查矩阵的行/列/对角线值,该程序能够从五个已经提供的txt文档中读入数据,来判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是则返回false且说明原因。
任务二:对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输入到文本6.txt中,然后对其判断是否为MagicSquare。并且满足若输入的为奇数能产生MagicSquare,而输入偶数或者负数会返回false。
3.1.1isLegalMagicSquare()
ArrayList Ar1储存读取进来的txt:
ArrayList Ar2是将读取进来的txt转化为二维数组:
判断幻方的行列数是否相等:
判断行列,对角线的数相加是否相等:
判断是否能读取的文件以及数字之间是否是用\t分割:
通过try-catch组合,检测到出现\t抛出的错误,然后显示出错误
结果:
3.1.2 generateMagicSquare()
该段代码为罗伯法构造幻方
上面的开始先将1赋值最上行的中间位置,向右上角斜行,依次填入数字,如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中,同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中,如果数字{N} 右上的格子已被其它数字占领,就将{N+1} 填写在{N}下面的格子中,如果朝右上角出界,和“重复”的情况做同样处理。
此段为将写好的幻方写入文件6.txt中。
当输入负数和偶数时分别会抛出NegativeArraySizeException错误和ArrayIndexOutOfBoundsException错误,所以用try-catch,如果检测到如上错误输出错误提示。
流程图:
结果:
3.2 Turtle Graphics
实现一个绘图工具Trurtle Graphics,需要我们完成的任务为:画出一个正方形,计算正多边形内角,由正多边形内角得到边数,计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中,计算一系列点中的凸包,调用函数绘制个人艺术作品,使用junit进行单元测试。
3.2.1 Problem 1: Clone and import
通过SSH公钥获取后,从IDEA的git插件直接clone文件,用idea初始化git本地仓库后,登录github账号,可以直接Clone
3.2.2 Problem 3: Turtle graphics and drawSquare
该函数需要通过已知边长画出正方形,通过循环4次,每次前进40旋转90度,即可画出正方形
代码如下:
结果如下:
3.2.3 Problem 5: Drawing polygons
首先我们需要计算正多边形的内角是多少,根据已知公式可以得到相关函数代码
根据正方形,可以推导将画笔转向角度调制内角的补角,循环边的数量,即可画出多边形
3.2.4 Problem 6: Calculating Bearings
已知起点和当前朝向角度,求起点到终点需要转动的角度,可以将起始点设为极点,通过极坐标系下的运算,能够算出需要转动的角度
同时,对于有多个点的时候,从第一个点先到第二个点,然后将第二个点最为起点,下一个作为终点,以此类推,,循环n-1次,即可得到旋转角的List
3.2.5 Problem 7: Convex Hulls
解决凸包问题,采用Gift−Wrapping 算法。我们发现任意凸包上的点,你会发现以该点建立一个极角坐标系,该点连结其它所有点的极角中,该点逆时针方向的第一凸包点到该点极角最小,例如P0,到所有点的极角中P0P1极角最小。
算法中首先找到最左边的点,这个点必然在凸包上,然后计算该点连接点极角最小的,这里计算有技巧,算法中进行toright测试,直到找到到最右端的点,找到P1后,就可以从P1开始,接着顺次找到P2,又以P2为起点进行运算。
代码如下:
3.2.6 Problem 8: Personal art
该函数我通过正五边形旋转十次,并给予每个五边形不同的颜色,即可花一朵五边形花朵
3.2.7 Submitting
先提交到git上,在直接提交并推送到github上
3.3 Social Network
设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间,并且能计算两人之间需要的最少的关联路径,该问题为最短路径问题,所以利用BFS广度优先遍历即可得到两点间的最短路径。
3.3.1 设计/实现FriendshipGraph类
用两个ArrayList一个储存社交网络中的人,另一个储存人的名字
addVertex()函数:首先判断Person k是否存在于图中,若已经存在于图中,则输出错误信息并返回false,程序结束;否则将k添加到存有社交网络的人的ArrayList中。
addEdge()函数,首先判断读入的两个人是否存在于社交网络中,若存在,在p1的朋友列表里假如p2.
GetDistance()函数,用BFS广度优先遍历求最短路径,如果无法达到的返回0
3.3.2 设计/实现Person类
Person类则储存一个人的名字,朋友列表,以及广度优先遍历所需要的标志,里面储存各个变量的接口函数。
3.3.3 设计/实现客户端代码main()
main()则按照实验手册的给出的main()
3.3.4 设计/实现测试用例
在测试AddVertex函数时,我们需要判断,添加一个人A后,测试A和未添加的人B是否存在,再测试添加同名的人,是否会按照实验要求提示错误信息。
在测试AddEdge函数时,我们要判断,社交网络添加A,B,C后,不添加D,测试添加A到B的关系是否为单向的,不添加A到C的关系时,是否能正常返回false,还有A到D是否能正常返回错误信息。
在测试GetDistance函数时,我们要判断,社交网络在形成圈时是否能正常读取,以及在测距不存在的社交网络的人时是否能正常返回错误信息,还有当人与人不存在连接时,是否能正常返回-1
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 任务 | 实际完成情况 |
2022-04-30 | 13:30-24:00 | 编写问题1和问题2的函数并进行测试 | 按计划完成 |
2022-05-01 | 14:00-20:46 | 编写问题3和报告并进行测设 | 按计划完成 |
遇到的困难 | 解决途径 |
初次接触java,文件读写出现很多问题 | 通过查阅资料理解了flie类和bufferreader类等的关系与使用 |
p2的英文教程在初次接触时造成了许多困难 | 经过耐心阅读领会了题目的意思和大致目标 |
6.1 实验过程中收获的经验和教训(必答)
此次实验初次使用java,我对众多语法和结构不熟悉。但是在一段时间的钻研后,我学到了java领域的许多新奇知识,并逐渐熟悉了git、idea和junit的使用,受益匪浅。
6.2 针对以下方面的感受(必答)
(1) Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?库函数很丰富,面向对象编程有很多优点和特色;
(2) 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;不够简洁,容易找不到功能。
(3) 关于Git和GitHub,是否感受到了它在版本控制方面的价值;上传版本文件很方便,节省了人为控制版本的时间成本。
(4) 关于CMU和MIT的作业,你有何感受;英语阅读有一定你难度。
(5) 关于本实验的工作量、难度、deadline;适中
(6) 关于初接触“软件构造”课程;
收获颇丰