- 实验目标概述
训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
- 基本的Java OO编程
- 基于Eclipse IDE进行Java编程
- 基于JUnit的测试
- 基于Git的代码配置管理
- 实验环境配置
Eclipse IDE for java Developers-2022-03
Java SE 11.0.14
GitHub Desktop
在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。
- 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
-
- Magic Squar
该任务的目标:设计isLegalMagicSquare()函数,判定给定的几个矩阵是否为magicsquare;将给定的生成奇数阶的magicsquare的generateMagicSquare()函数作为静态函数加入我的程序代码中,将生成的矩阵存入6.txt并调用isLegalMagicSquare()判断所生成的矩阵是否正确。该阶段涉及到文件读写操作、对某些特定函数的调用,对部分异常的处理(例如矩阵中有负数、浮点数,或是行列数不相等)等。
-
-
- isLegalMagicSquare()
-
根据实验要求,先判断给定的矩阵是否合理,即判断行列数是否相等、矩阵中是否有浮点数、负数等。设置一个整型变量n = 0,对于txt文件先按行读入,每读入一行n++,直到读完文件,此时n的值即为矩阵行数。然后,依旧是按行读入文件,每读入一行,将其存入String line中,并调用split(“\t”)将其分割并存入String[] line_cut,比较行数n与line_cut.length,不相等则输出错误提示并返回false,后经过测试,当文件未用“\t”进行分割时,也会导n != line_cut.length,因此在这里一并输出错误提示;然后判断line_cut中的每一个元素是否都是正整数,按位寻访line_cut,若出现某一位不在数字字符‘0’-‘9’中,则输出错误提示并返回false。综上所述,即有如下代码:
以上错误判断完毕后,将读入的文档存入矩阵magic中,并按照magic矩阵定义进行测试,若不符合magic矩阵定义,则返回false。注意,在此过程中,并未输出错误提示,表示矩阵本身不存在行列数不相等等错误。于是有以下代码:
-
-
- generateMagicSquare()
-
除该程序代码外,需对该函数的输入进行测试,以防输入为偶数或负数。该测试在main函数中完成,输入阶数为负数或偶数或输入阶数小于2时输出错误提示并予以重新输入,但是,如果输入根本并非整数,而是浮点数或字符时,则输出错误提示且不允许重新输入,于是有如下代码:
除此之外,还需要在函数中加入文件写入操作,将产生的magic矩阵存入6.txt以便于main函数中测试其生成的magic矩阵的正确性,添加的代码如下:
-
- Turtle Graphics
这个实验是MIT的经典实验,通过自己完成几个函数来层层递进,最后实现求闭包的算法,并绘制自己的图案。
-
-
- Problem 1: Clone and import
-
复制链接在cmd中运行即可下载文件
-
-
- Problem 3: Turtle graphics and drawSquare
-
该函数需要实现:已知边长,画出边长为指定数值的正方形。参数是海龟对象turtle和边长sideLength。循环执行,每次画笔直行sideLength距离,然后画笔方向旋转90度,循环执行4次后即可得到所需要的正方形,函数代码如下:
运行结果为(sideLength=40):
-
-
- Problem 5: Drawing polygons
-
首先,要求计算已知正多边形边数的内角度,该计算由已知公式可以推导,因此相关函数代码如下:
根据正方形的画法,只需要将画笔的转向角度设置为180 –内角度数,循环多边形边数次数即可。考虑到画笔转向既能是顺时针又能是逆时针,故在此声明:sides可为负数,且当sides为负整数时,代表着画笔将逆时针旋转,且旋转度数为180–内角度数,并且取sides的绝对值为正多边形边数。函数代码如下:
-
-
- Problem 6: Calculating Bearings
-
首先,已知起点和当前朝向角度,要求起点到终点需要转动的角度。根据几何运算,得函数代码如下:
上述问题的扩展:此时有若干个点,要求从第一个点开始到第二个点,再从第二个点到第三个点……以此类推每次转向的角度。以起点为第一个点,循环n-1次,每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中,将下一次的“起点”用当前“终点”更新,继续循环。程序代码如下:
-
-
- Problem 7: Convex Hulls
-
对于平面上的一些点,总可以找到这样一些点,由他们依次相连构成的凸多边形可以让其它所有点均在多边形内,这样的点集合和凸多边形是唯一的。在数学上,这样的方法很简单,只要取出平面上一条让所有点都在它一侧的直线,任取一点为轴,顺时针旋转,若碰到另外一个点,则以这个点为新的转轴,当再次碰到同一个点,则结束旋转,被碰到过的所有点即为凸包集合。只要对于一个点,找到其它所有点中和它的连线与之前找到它的连线夹角最大即可,多点共线的情况下只需要选取最远的点即可。
-
-
- Problem 8: Personal art
-
运行结果为:
-
-
- Submitting
-
通过Github桌面版进行提交:
-
- Social Network
该任务的目标:设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间需要的最少的关联路径。于是,该问题为最短路径问题,而构建的图为无向无权图,所以利用DFS深度优先遍历即可得到两点间的最短路径。
-
-
- 设计/实现FriendshipGraph类
-
在FriendshipGraph中声明两个类,第一个用来保存人的实例,另一个用来检测是否有重复名字。
addVertex函数用来添加一个成员,先检查名字是否有重复。有则输出提示并推出程序。
addEdge函数是用来表明p1有一个朋友p2,调用Person类中的addFriend方法
getDistance函数是用来计算两个Person之间的距离。使用Queue和Map实现BFS求最短路。
-
-
- 设计/实现Person类
-
定义了两个私有成员,同时定义了两个方法调用Person类的姓名和朋友列表。
-
-
- 设计/实现客户端代码main()
-
由实验手册得:
运行结果为:
-
-
- 设计/实现测试用例
-
- testaddVertex
我们调用addVertex函数,向交际网络中添加一个人,然后判断people中最后一个人是不是我们添加进去的。 - testaddEdge
我们调用addEdge函数,给其中两人添加关系,然后判断a的朋友列表中的最后一人是否是b。
- testgetDistance
建立了一个这样的交际网络:
- 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 任务 | 实际完成情况 |
2022-05-02 | 15:45-17:30 | 编写问题1的isLegalMagicSquare函数并进行测试 | 按计划完成 |
2022-05-02 | 18:30-19:30 | 编写问题1的generateMagicSquare()函数并进行测试 | 按计划完成 |
2022-05-02 | 19:30-23:00 | 编写问题2的函数并进行测试 | 延时一小时 |
2022-05-03 | 18:30-19:30 | 编写问题3的函数进行测试 | 按计划完成 |
2022-05-03 | 19:30-20:00 | 编写问题3的Test | 按计划完成 |
- 实验过程中遇到的困难与解决途径
遇到的难点 | 解决途径 |
编写Convex Hulls函数时不了解概念,思路不清晰 | 在CSDN上学习思路,编写代码 |
在写java代码时不熟练,缺乏经验 | 多写多练,锻炼自己的代码编写经验 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训
在本次实验中锻炼了我的java代码编写能力,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
-
- 针对以下方面的感受
- Java编程语言是否对你的口味?
对我的品味,但还缺少写java代码的经验。
- 关于Eclipse IDE
方便了我的代码编写过程,十分好用。
- 关于Git和GitHub
还需更多的使用才能更加熟练的操作。
- 关于CMU和MIT的作业
应该更多地学习其作业,锻炼我们的能力
- 关于本实验的工作量、难度、deadline
实验工作量略大,难度略高。Dealine略紧。
- 关于初接触“软件构造”课程
对这门课十分感兴趣
- 实验目标概述
训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
- 基本的Java OO编程
- 基于Eclipse IDE进行Java编程
- 基于JUnit的测试
- 基于Git的代码配置管理
- 实验环境配置
Eclipse IDE for java Developers-2022-03
Java SE 11.0.14
GitHub Desktop
在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。
- 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
-
- Magic Squar
该任务的目标:设计isLegalMagicSquare()函数,判定给定的几个矩阵是否为magicsquare;将给定的生成奇数阶的magicsquare的generateMagicSquare()函数作为静态函数加入我的程序代码中,将生成的矩阵存入6.txt并调用isLegalMagicSquare()判断所生成的矩阵是否正确。该阶段涉及到文件读写操作、对某些特定函数的调用,对部分异常的处理(例如矩阵中有负数、浮点数,或是行列数不相等)等。
-
-
- isLegalMagicSquare()
-
根据实验要求,先判断给定的矩阵是否合理,即判断行列数是否相等、矩阵中是否有浮点数、负数等。设置一个整型变量n = 0,对于txt文件先按行读入,每读入一行n++,直到读完文件,此时n的值即为矩阵行数。然后,依旧是按行读入文件,每读入一行,将其存入String line中,并调用split(“\t”)将其分割并存入String[] line_cut,比较行数n与line_cut.length,不相等则输出错误提示并返回false,后经过测试,当文件未用“\t”进行分割时,也会导n != line_cut.length,因此在这里一并输出错误提示;然后判断line_cut中的每一个元素是否都是正整数,按位寻访line_cut,若出现某一位不在数字字符‘0’-‘9’中,则输出错误提示并返回false。综上所述,即有如下代码:
以上错误判断完毕后,将读入的文档存入矩阵magic中,并按照magic矩阵定义进行测试,若不符合magic矩阵定义,则返回false。注意,在此过程中,并未输出错误提示,表示矩阵本身不存在行列数不相等等错误。于是有以下代码:
-
-
- generateMagicSquare()
-
除该程序代码外,需对该函数的输入进行测试,以防输入为偶数或负数。该测试在main函数中完成,输入阶数为负数或偶数或输入阶数小于2时输出错误提示并予以重新输入,但是,如果输入根本并非整数,而是浮点数或字符时,则输出错误提示且不允许重新输入,于是有如下代码:
除此之外,还需要在函数中加入文件写入操作,将产生的magic矩阵存入6.txt以便于main函数中测试其生成的magic矩阵的正确性,添加的代码如下:
-
- Turtle Graphics
这个实验是MIT的经典实验,通过自己完成几个函数来层层递进,最后实现求闭包的算法,并绘制自己的图案。
-
-
- Problem 1: Clone and import
-
复制链接在cmd中运行即可下载文件
-
-
- Problem 3: Turtle graphics and drawSquare
-
该函数需要实现:已知边长,画出边长为指定数值的正方形。参数是海龟对象turtle和边长sideLength。循环执行,每次画笔直行sideLength距离,然后画笔方向旋转90度,循环执行4次后即可得到所需要的正方形,函数代码如下:
运行结果为(sideLength=40):
-
-
- Problem 5: Drawing polygons
-
首先,要求计算已知正多边形边数的内角度,该计算由已知公式可以推导,因此相关函数代码如下:
根据正方形的画法,只需要将画笔的转向角度设置为180 –内角度数,循环多边形边数次数即可。考虑到画笔转向既能是顺时针又能是逆时针,故在此声明:sides可为负数,且当sides为负整数时,代表着画笔将逆时针旋转,且旋转度数为180–内角度数,并且取sides的绝对值为正多边形边数。函数代码如下:
-
-
- Problem 6: Calculating Bearings
-
首先,已知起点和当前朝向角度,要求起点到终点需要转动的角度。根据几何运算,得函数代码如下:
上述问题的扩展:此时有若干个点,要求从第一个点开始到第二个点,再从第二个点到第三个点……以此类推每次转向的角度。以起点为第一个点,循环n-1次,每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中,将下一次的“起点”用当前“终点”更新,继续循环。程序代码如下:
-
-
- Problem 7: Convex Hulls
-
对于平面上的一些点,总可以找到这样一些点,由他们依次相连构成的凸多边形可以让其它所有点均在多边形内,这样的点集合和凸多边形是唯一的。在数学上,这样的方法很简单,只要取出平面上一条让所有点都在它一侧的直线,任取一点为轴,顺时针旋转,若碰到另外一个点,则以这个点为新的转轴,当再次碰到同一个点,则结束旋转,被碰到过的所有点即为凸包集合。只要对于一个点,找到其它所有点中和它的连线与之前找到它的连线夹角最大即可,多点共线的情况下只需要选取最远的点即可。
-
-
- Problem 8: Personal art
-
运行结果为:
-
-
- Submitting
-
通过Github桌面版进行提交:
-
- Social Network
该任务的目标:设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间需要的最少的关联路径。于是,该问题为最短路径问题,而构建的图为无向无权图,所以利用DFS深度优先遍历即可得到两点间的最短路径。
-
-
- 设计/实现FriendshipGraph类
-
在FriendshipGraph中声明两个类,第一个用来保存人的实例,另一个用来检测是否有重复名字。
addVertex函数用来添加一个成员,先检查名字是否有重复。有则输出提示并推出程序。
addEdge函数是用来表明p1有一个朋友p2,调用Person类中的addFriend方法
getDistance函数是用来计算两个Person之间的距离。使用Queue和Map实现BFS求最短路。
-
-
- 设计/实现Person类
-
定义了两个私有成员,同时定义了两个方法调用Person类的姓名和朋友列表。
-
-
- 设计/实现客户端代码main()
-
由实验手册得:
运行结果为:
-
-
- 设计/实现测试用例
-
- testaddVertex
我们调用addVertex函数,向交际网络中添加一个人,然后判断people中最后一个人是不是我们添加进去的。 - testaddEdge
我们调用addEdge函数,给其中两人添加关系,然后判断a的朋友列表中的最后一人是否是b。
- testgetDistance
建立了一个这样的交际网络:
- 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 任务 | 实际完成情况 |
2022-05-02 | 15:45-17:30 | 编写问题1的isLegalMagicSquare函数并进行测试 | 按计划完成 |
2022-05-02 | 18:30-19:30 | 编写问题1的generateMagicSquare()函数并进行测试 | 按计划完成 |
2022-05-02 | 19:30-23:00 | 编写问题2的函数并进行测试 | 延时一小时 |
2022-05-03 | 18:30-19:30 | 编写问题3的函数进行测试 | 按计划完成 |
2022-05-03 | 19:30-20:00 | 编写问题3的Test | 按计划完成 |
- 实验过程中遇到的困难与解决途径
遇到的难点 | 解决途径 |
编写Convex Hulls函数时不了解概念,思路不清晰 | 在CSDN上学习思路,编写代码 |
在写java代码时不熟练,缺乏经验 | 多写多练,锻炼自己的代码编写经验 |
- 实验过程中收获的经验、教训、感想
- 实验过程中收获的经验和教训
在本次实验中锻炼了我的java代码编写能力,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
-
- 针对以下方面的感受
- Java编程语言是否对你的口味?
对我的品味,但还缺少写java代码的经验。
- 关于Eclipse IDE
方便了我的代码编写过程,十分好用。
- 关于Git和GitHub
还需更多的使用才能更加熟练的操作。
- 关于CMU和MIT的作业
应该更多地学习其作业,锻炼我们的能力
- 关于本实验的工作量、难度、deadline
实验工作量略大,难度略高。Dealine略紧。
- 关于初接触“软件构造”课程
对这门课十分感兴趣