本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
安装IDEA作为IDE,绑定学校edu邮箱,下载必要插件,在运行项目的过程中安装JUnit4插件作为测试工具。安装过程按照官方文档,没有遇到问题。
Lab1仓库地址:
https://github.com/ComputerScienceHIT/HIT-Lab1-1190200207
这里需要编写两个方法,一个判断从文件中输入的幻方是否为合法幻方,需要考虑各个数字的合法性,另一个是创建一个n阶幻方并写入一个文件,n由用户给出,需要判断n的合法性。
首先需读到用户的文件路径,从文件中读取到字符串以后转换为n * n的整形数组,以方便后面判断。在读取文件时,以”\t”为分隔符获取各个数字(利用split方法)。依次检查各行、列、对角线之和是否为一个常数,而且各数应该是正整数。如果不是合格的幻方,那么返回false;反之返回true。
本部分代码已经给出,只需要继续完善即可。先根据题意,在n为负数或者偶数时抛出异常并返回false,程序依然正常执行,因此需要在本方法内就catch异常,同时输出异常信息。最后将输出流定为输出到6.txt文件中,即完成本方法。
下面为异常处理部分的代码:
try
{
if (n%2==0)
throw new ArrayIndexOutOfBoundsException();
if (n<0)
throw new NegativeArraySizeException();
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
方法流程图:
利用Java实现一个简单的Turtle的核心功能,包括转向,前进等基本操作及其组合。
从https://github.com/rainywang/Spring2021_HITCS_SC_Lab1/tree/master/P2获取代码,在本地利用IDEA IDE建立git仓库,并设置远程仓库地址,跟踪相关文件。
Problem 3: Turtle graphics and drawSquare
了解实验背景,了解实验需求,需要实现的方法都在TurtleSoup.java文件中有详细注解。
drawSquare方法的目的是利用前进和转向的方法,让乌龟画出正方形。因此设置每次前进相同距离后右转90°即可。
画正多边形的原理与正方形相同,只是需要根据边的个数提前计算出每次转向的角度,以及转向次数。利用calculateRegularPolygonAngle方法计算得到每次转向的角度即可。
Problem 6: Calculating Bearings
先实现calculateHeadingToPoint方法,根据当前位置及朝向,判断目的位置需要转向的角度,这里利用Math.atan2方法计算目标角度,如果目标角度为负数则手动增加360°以符合对返回值的要求。
计算闭包,先找到左下角的点,再依次扫描其他点,注意考虑三点共线的情况,依次取逆时针旋转的最外点,当再次扫描到左下角点时任务结束,返回闭包点集合。若输入的点集合中点个数不多于4个,则原样返回。
个人艺术环节,由于本人艺术细胞极其缺乏,只利用现有的一些方法任意组合得到了一个非常简单的图形。
设置好远程仓库,在编写一个阶段后commit并附加说明,最后直接push进入仓库。
主要任务是实现Person和FriendshipGraph类,并通过图的BFS得到两人之间关系的最近距离。
设计/实现FriendshipGraph类
类图设计如图所示。addVertex实现将顶点加入图中,并且检测是否有重复人名出现(利用Set的特性),并初始化每个人的num作为标记方便记录。addEdge方法负责在顶点间加入边以表示“朋友”关系。getDistance方法负责利用BFS搜索,找到两人间的关系最短距离,如果两个人毫无关联则返回-1;如果“两个人”实际上是同一个人,则直接返回0.
设计/实现Person类
设计五个成员变量,name是标记该对象的名字,num作为该人加入图中的顺序,friend标记这个人的所有朋友,visited标记这个人是否已经被访问过,dist标记从起点到这个人的距离。在每次调用getDistance方法时,都会重置Person中的dist以及visited变量。尽可能使用私有变量,利用get和set方法获取变量和改变变量。
设计/实现客户端代码main()
日期 | 时间段 | 任务 | 实际完成情况 |
2021-05-12 | 19:30-20:30 | 研究git的使用 | 延期完成 |
2021-05-16 | 16:00-19:00 | 学习基础Java,完成P1两个方法的编写与调整 | 按时完成 |
2021-05-16 | 19:00-21:00 | 完成P2的problem1-problem5 | 按时完成 |
2021-05-18 | 19:00-21:00 | 完成P2全部,并进行测试 编写P3的主要部分 | 按时完成 |
2021-05-21 | 15:00-17:00 | 完成P1和P2部分实验报告以及P3的测试 | 按时完成 |
2021-05-21 | 18:00-20:00 | 完成P3的实验报告,收尾 | 按时完成 |
遇到的困难 | 解决途径 |
IDEA内置的Git非常难push,成功率极低 | 下一个GitHub desktop,在IDEA中commit,最后在GitHub desktop中一次性push。 |
不会用Java语言读取文件 | 从电脑桌面的角落里找出Java核心技术的电子书文件,硬啃。 |
设计/实现测试用例
自行构造一个关系图如下:
利用Junit的AssertEquals方法测试当前用例的正确性:
assertEquals(-1,graph.getDistance(alan,turing));//no relationship
assertEquals(3,graph.getDistance(alan,bill));
assertEquals(1,graph.getDistance(ben,bill));//shortest path
assertEquals(2,graph.getDistance(ben,van));
assertEquals(1,graph.getDistance(chomsky,turing));//only path
assertEquals(2,graph.getDistance(turing,bush));
分别测试没有关系、最短路径、唯一路径三种情形下的结果,与手动推导的结果对比验证。
开始学习OOP,以一种全新的视角编写程序。
Java编程语言是否对你的口味?
API数量之丰富让人望而止步,手册查到头秃。但也正是这些包装好了的API减少了重复造的轮子数量。
关于Eclipse IDE;
没有使用Eclipse,使用IDEA进行编程,代码提示功能十分好用,教育邮箱真香。
关于Git和GitHub;
Git很好用,GitHub迫于恶劣的网络环境很难用。
关于CMU和MIT的作业;
MIT的作业说明十分丰富,每一步的任务目标非常清晰,要用到的算法甚至提供了网址说明;CMU的说明明显要少一些,让人没有方向感,不知如何入手。
关于本实验的工作量、难度、deadline;
作为第一次实验,工作量之大超乎想象。用到的各类算法把人打回了数据结构与算法课堂,头发一把一把的掉。Deadline比较适中。
关于初接触“软件构造”课程;
概念非常多,纸上得来终觉浅,还是需要多实践来体会软件构造。