1.实验目标概述
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
2.实验环境配置
先安装IDEA作为IDE,去上官网找社区版IDEA进行安装,在IDEA上下载关于git的相关文件,又去社区进行Junit的文件下载,并安装了一些辅助程序便于提交文件。
之前没有弄过github对于相关配置信息不是很明白,在相关网站上建立仓库和将文件commit以及push上去有很大问题,在网上查找资料和群里看相关同学的讨论用的SSH来改变原有方式进行提交。
GitHub Lab1仓库的URL地址
https://github.com/ComputerScienceHIT/HIT-Lab1-HIT-Lab1-2021111584
3.实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1Magic Squares
任务一:从五个文件中读取数据并检验是不是MagicSquare根据是否为整数,是否为矩阵行列对角线是否相等判断是不是MagicSquare.
在不是的时候返回false并说明错误原因正确时输出该矩阵为魔方矩阵。
3.1.1isLegalMagicSquare()
该方法能够读入文件中的数字来储存在矩阵中,本代码中采用的是java.io.BufferedReader包中的函数实现这一功能的。首先需要判断读入的数据能否构成一个矩阵,根据实验手册,文件中的数据不符合 Magic Square 的定义(行列数不相等、并非矩阵等)、矩阵中的某些数字并非正整数、数字之间并非使用\t 分割、等。当没有以上错误时,分别计算矩阵每一行、每一列、对角线的和是否相等来判断能否构成MagicSquare,并返回true。
过程:读文件的第一行,以\t为分隔,确定第一行有多少数字,记为N,并生成二维数组存储矩阵,对每个读取到的string,判断它是不是一个整数,如果是整数则存入二维数组,依次读取文件的接下来部分,依然以\t为分隔,判断是否仍为N,若不为N,则不满足矩阵,遍历完成后判断列数和行数是否相等,如果行数和列数不等则不可能是magic square。最后利用isEqualSquare方法来判断判断是否满足每行每列每个对角线的和都相等。
3.1.2 generateMagicSquare()
把1(或最小的数)放在第一行正中;每一个数放在前一个数的右上一格;若该数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;若该数数所要放的格已经超出了最右列那么就把它放在最左列,上一行;若该数所要放的格已经超出了顶行且超出了最右列,则放在底行左列;若该数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。
3.2Turtle Graphics
需要获取源代码,然后创建和管理本地仓库。完成对如下方法的补充:画正方形、据内角求边数、据边数求内角,画正多边形,计算方位角,计算凸包,个性创作。
3.2.1Problem 1: Clone and import
获取代码,使用的是IDEA中的 pull命令获取需要的代码文件。在本地使用git管理时需要先对需要管理的文件夹使用git init命令初始化之后,使用git add,git commit等命令进行管理。最后使用git push origin master命令将代码上传到github仓库中。
3.2.2Problem 3: Turtle graphics and drawSquare
利用代码画出一个正方形,每次转九十度角
3.2.3Problem 5: Drawing polygons
计算正多边形的每一个内角的大小,假设是正n边形,那么每一个内角的大小是(n-2)*180/n,计算出每一个内角大小之后,需要进行的是n次循环,每次循环执行前进与转角任务,其中每次转角的度数为180- n-2)*180/n。根据这一思路就可以画出正n边形。
3.2.4Problem 6: Calculating Bearings
调用atan2函数得到弧度,然后调用toDegree转换成角度,特别注意若角度为负值,需要加上360。
计算一系列点的偏转角不断调用上面的函数即可
3.2.5Problem 7: Convex Hulls
这一部分需要对给定的点求凸包,也就是最少的点组成的多边形能够包含所有的点。思路是找到所有的点中左下角的那个点,这个点一定是需要的点,从这个点开始遍历所有的点,在遍历每个点的时候需要求该点与未选定点之间的距离与需要的转角,选择最小的那个转角的点作为下一个点,如果有多个最小转角的点,那么选择与当前点距离最远的那个点作为下一个点,选定下一个点之后将这个点从未选点集合中删除,加入已选点中。在实现的过程中使用的是对List的二重遍历,同时使用了上述步骤中求两点之间需要的转角的函数实现的。部分代码如下:
3.2.6Problem 8: Personal art
3.2.7Submitting
利用IDEA中push按钮进行提交。
3.3Social Network
实现Person和FriendshipGraph两个类,用FriendshipGraph来构建Person之间的关系来模拟社交网络,能够计算出每两个Person之间的最短路径。
3.3.1设计/实现FriendshipGraph类
3.3.1.1.定义一个Person集合来储存所有人的对象,定义一个String集合来储存所有已经存在的名字在FriendshipGraph类中我们需要增加一个人的对象addVertex(若是增加的人为已存在的则输出“此名已存在,重复”并结束程序),增加一条有向边addEdge,得到两个人之间的最短距离getDistance。我们决定采取先广的方式求最短路径。
3.3.1.2.定义构造方法对两个集合进行初始化:
- 方法一:addVertex。实现此功能需要注意用来增加的Person对象是否已经存在,所以需要在开始判断allName集合中是否已经有了待增加的Person对象的名字,若已经存在,则输出“此名已存在,重复”并结束程序,若没有,则将待增加的新的Person对象加入allPeople集合中,并且将对象的名字加入allName集合中:
2.方法二:addEdge。调用Person类的addNewFriend方法即可实现:
3.实现功能三:getDistance。采用先广算法
3.2.2设计/实现Person类
在Person类中我们要完成的功能为:增加本人的新朋友addNewFriend,得到本人的名字getMyName,得到本人的朋友列表getHisFriend。
定义一个String变量myName,储存名字,定义一个Person的集合friendOfMyName,定义一个私有静态String集合hisAllPerson(用来储存所有已经存在的名字,防止定义相同名字的Person对象)
3.3.3构造方法:若名字已经在hisallperson中已经存在则输出“名字重复”并结束程序,否则初始化这个名字,并且将这个名字加入hisallPerson中:设计/实现客户端代码main()
3.3.4设计/实现测试用例
分别要对在addVertex ,addEdge ,getDistance三个功能进行测试。对于addVertex,只需要设计test用例addVertextest,在里面建立四个Person对象全部执行addVertex,然后判断allPeople里面是都有这些对象即可。对于addEdge,只需设计test用例addEdgetest,在里面同样建立四个Person对象,执行addVertex后,执行addEdge然后判断他们的朋友中是否包含彼此即可。对于getDistance,只需设计test用例getDistancetest,在里面同样建立四个Person对象,执行addVertex后,执行addEdge后,使得三种距离等价类都存在,即距离为-1,距离为0,距离为正整数。
4.实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
日期 | 时间段 | 任务 | 实际完成情况 |
2023-02-28 | 15:45-17:30 | 编写问题1的isLegalMagicSquare函数并进行测试 | 按计划完成 |
2023-03-01 | 18:00-19:00 | 对于问题1的generationMagicSquare函数并测试 | 延期半小时完成 |
2023-03-07 | 18:00-20:00 | 将第二个实验前面一半的要求解决 | 按计划完成 |
2023-03-10 | 18:00-23:00 | 完成第二个实验剩余要求并测试,第三个实验的Person类写完 | 按计划完成 |
2023-03-17 | 17:50-22:00 | 将实验三friendship类写完并测试 | 按计划完成 |
2023-03-18 | 19:00-21:00 | 测试并提交实验内容 | 延期一个半小时完成 |
5.实验过程中遇到的困难与解决途径
遇到的困难 | 解决途径 |
Junit安装不上去 | 在社区里找到相应文件进行下载 |
GIT网站上传文件下载文件过慢 | 安装相应辅助程序使得提交速度有了提升 |
Git提交失败 | 在群里学习SSH来进行提交更换提交方式 |
P2实验文件报错 | 根据解决办法在文件名前加上P2. |
6.实验过程中收获的经验、教训、感想
6.1实验过程中收获的经验和教训
- JAVA方面由于是初学不太会,总是会报错,根据IDEA上的问题解决办法和CSDN上的相关介绍,大致能够将JAVA按照自己的想法编出来。
- 对于在编程的时候,要去进行检测养成了一定的习惯,对于以后的程序检测也有了一定的基础
- 对于git有了一点了解在多次push过程中了解到了如何上传和编辑文件,更加熟悉github操作
6.2针对以下方面的感受
- ava编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
对于Java语言和之前学过的C语言相比在一些操作上有了简化,在图的操作上不像C需要自己写很多代码,有相关的代码可以直接应用,但是和C相比Java的代码量以及规则要比C语言多很多,并且命名规则方面也有一些不同。
1.关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
IDEA相比于别的IDE更加容易操作,好上手,没有很多复杂的问题,并且IDEA的问题报错有相关解答还可以纠正代码方面的复杂性,让代码更简洁,操作方便。
2.关于Git和GitHub,是否感受到了它在版本控制方面的价值;
对于相关价值有了一点感觉。
3.关于CMU和MIT的作业,你有何感受;
相比于以往做的编程作业和编程题CMU和MIT的作业更加具体有条理一些,往往有多个要求,对于个人的能力有了更多的要求,并且要花更多时间。
4.关于本实验的工作量、难度、deadline;
工作量相对较大,难度方面比较困难需要在网上查询相关知识,并且有的需要同学讨论。Deadline方面还可以基本能写完,时间还是比较够用。
5.关于初接触“软件构造”课程;
仿佛开启了对于软件工程更高深知识探索的大门,对于JAVA方面也有了一些了解,大致对于软件构造的知识有了一点看法。