3.1.2 generateMagicSquare(). 2
3.2.1 Problem 1: Clone and import 5
3.2.2 Problem 3: Turtle graphics and drawSquare. 6
3.2.3 Problem 5: Drawing polygons. 7
3.2.4 Problem 6: Calculating Bearings. 7
3.2.5 Problem 7: Convex Hulls. 8
3.2.6 Problem 8: Personal art 10
3.3.1 设计/实现FriendshipGraph类... 11
本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
l 基本的Java OO编程
l 基于Eclipse IDE进行Java编程
l 基于JUnit的测试
l 基于Git的代码配置管理
2.实验环境配置
我跟着b站上的尚硅谷教程安装git,安装eclipse,安装idea,配置了jdk和junit没有什么困难。
在github上操作时老是遇到打不开的情况,后通过在csdn上的学习,知道了添加IP到hosts文件的操作,虽然很麻烦且不稳定,但是能进入github操作了。
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
该任务就是判断从文件读入的是否是幻方,并且能够生成一个幻方并写入文件中,验证函数的正确性,期间要注意处理非法情况。
思路、过程:
1. 读入文件:读入文件得到数阵行数、列数 以此我们创建一个行数*行数的二维数组,这避免了我们在一开始创建数组时数组过大。以\t为分隔符将每一个元素存入字符串数组a中,列数就是a.length,如果行数列数不相等提示错误返回false。通过Integer.valueOf()方法我们将字符转换为数字,通过try-catch利用了Integer.valueOf()方法中如果遇到了空格就会出错以此分辨是否有多个\t。最后判断是否有非整数或负数。
2. 验证行列对角线数之和相等:由于对角线只有两条,我们先检查它,找到和,再对每一行每一列遍历检查是否与其相等。
结果:
思路:实验手册已经给出了函数,只需要我们增加部分功能:(1) 将产生的magic square写入文件\src\P1\txt\6.txt中;(2) 当输入的n不合法时(n为偶数、n为负数等),不要该函数抛出异常并非法退出,而是提示错误并“优雅的”退出——函数输出false结束。所以我们只需要在开始判断是否满足n的合法输入并且增加写入文件的操作。
过程:
- 生成幻方
当n为负数时,会提示数据为负数。是因为数组大小不能为负数。
当n为偶数时,会提示数组越界。已在代码处注释。
- 写入文件
与读取文件类似。注意要有IO异常处理。
结果:
本任务就是实现一个画图软件Turtle Graphic,其中大多数代码已经给出,我们所需要做的就是简单地填充函数然后实现简单的功能。
在git bash中使用pull命令和clone命令将该任务的代码下载到本地。按照提供的项目目录将指定文件放入对应的位置,简单修改一下包名和import即可使用。
在本地创建git仓库、使用git管理本地开发的方法如下:
在本地创建git仓库、使用git管理本地开发(以下参考网络)
1. git init初始化本地仓库
2. git add remote origin 添加远程库源
3. 在远程仓库创建master分支
4. git pull origin master将远程仓库同步到本地
5. git add +文件名
6. git commit将本地文件加入本地仓库
7. git push将本地仓库同步到远程仓库。
-
-
- Problem 3: Turtle graphics and drawSquare
-
边长函数已经给出,我们利用turtle.forward和turtle.turn让点前进相同长度转弯90度即可。
|
根据几何性质求出正多边形内角,注意类型转换。
同样利用几何性质,使用atan2函数得到弧度,随后转换为角度,若是负值注意还要+360度。
调用上一个函数我们得到下一个函数的结果。
这个问题要求我们求一堆顶点的凸包集,要求集合中顶点数最小且围起来包含所有顶点。
想法很简单,我们先找到最左下角的顶点,它一定在我们的凸包集中,我们将它作为初始点加入到集合中。
接下来进行遍历,寻找那个与current顶点偏转角最小的target点,将其加入到我们的凸包集合中,直到我们要找的target顶点就是初始点,寻找结束,我们得到一个凸包集。
这个任务花了我大量时间,虽然想法很简单但是我发现我的顶点集合老是莫名其妙的减少。通过print大法我找到了问题所在,在找到target点进行删除时,我将其从points里删掉了,这样做导致下次调用方法points里的点就少了并没有重置。随后我添加了一个all接受所有顶点,从all里删除target,问题解决。
通过颜色的随机读取、直线长度的递增,我得到了如上图形。
打开Git Bash Here,输入以下命令行
(1) git add Lab1-1190201826
(2) git commit -m “备注” 将本地文件加入本地仓库
(3) git push将本地仓库同步到远程仓库
本次任务要求实现FriendshipGraph和Person两个类,利用图的模型进行图上的各种操作,在求最短距离时还要用到BFS。要注意对非法情况的处理。
-
-
- 设计/实现FriendshipGraph类
-
- 设计addVertex函数
此函数实现添加点的功能,需要检查是否名字和已有的点重复。
2.设计addEdge函数
此函数实现添加边的功能,需要检查两个点是否在图中,都在的话则添加一条边。
3.设计getDistance函数
此函数实现计算出两个点之间最短路径长度的功能,我们采用BFS算法实现此功能。通过队列存储广搜的遍历结果。
如果直到队列为空还没找到第二个人,我们就返回-1。
4.结果
-
-
- 设计/实现Person类
-
Person类很简单,存储名字即可。
-
-
- 设计/实现客户端代码main()
-
代码输出-1,在main()函数输出替换后的结果如下。
-
-
- 设计/实现测试用例
-
分别要对addVertex ,addEdge ,getDistance三个功能进行测试。
测试成功!
测试成功!
- 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 任务 | 实际完成情况 |
2021-05-15 | 18:30-21:30 | 编写问题1的isLegalMagicSquare函数并进行测试 | 按计划完成 |
2021-05-15 | 20:30-23:30 | 编写问题1的generateMagicSquare函数并进行测试 | 提前1小时完成 |
2021-05-17 | 21:30-22:30 | 完成P2的1-4 | 按计划完成 |
2021-05-19 | 20:30-23:30 | 完成P2的剩下所有 | 延期2小时完成 |
2021-05-20 | 19:30-22:30 | 完成P3的FriendshipGraph类 | 按计划完成 |
2021-05-21 | 21:30-22:30 | 完成P3的剩下所有 | 按计划完成 |
2021-05-22 | 8:30-9:30 | 完成实验报告上传到github | 延期1小时完成 |
遇到的困难 | 解决途径 |
Github上不了
| 添加IP地址到hosts文件中 |
P2做凸包问题时陷入死循环
| 通过print大法发现点集元素不断减少,发现错误 |
在idea中Git上传不了代码
| 地址使用ssh而非https |
- 自己应该早点学java的,随便一个bug都能搞两小时;
- 遇到问题不能死扣,还是得多问同学学长,会茅塞顿开。
- 感觉到了java的方便之处,方法是真的多。
- Java编程语言是否对你的口味?
是,方法很多。
- 关于Eclipse IDE;
没怎么用,一直在用idea感觉很方便。
- 关于Git和GitHub;
感觉很神奇。。。
- 关于CMU和MIT的作业;
容易想复杂了,其实仔细想想不是很难。
- 关于本实验的工作量、难度、deadline;
大,挺难的对于我来说,还好。
- 关于初接触“软件构造”课程;
感觉到代码量很大,有很多任务在等着自己。。。