3.1.2 generateMagicSquare(). 1
3.2.1 Problem 1: Clone and import 2
3.2.2 Problem 3: Turtle graphics and drawSquare. 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
本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
l 基本的 Java OO 编程
l 基于 Eclipse IDE 进行 Java 编程
l 基于 JUnit 的测试
l 基于 Git 的代码配置管理
- 实验环境配置
我的JDK是在年初的时候安装的,所以版本比较新是JDK15
- 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
在这道题中需要编写一个方法,去验证一个矩阵是否是幻方,同时要处理输入文件的各种特殊情况,例如:文件中的数据不符合Magic Square 的定义(行列数不相等、并非矩阵等)、矩阵中的某些数字并非正整数、数字之间并非使用\t分割、等。若遇到这些情况,终止程序执行(isLegalMagicSquare 函数返回 false),并在控制台输出错误提示信息。
先使用scanner尝试性的读一行,将这一行的长度设置为length。
然后用try,catch继续进行读操作。
如果行和列的值不相等,即i!=length-1就直接返回false。
在整个读的过程中会出现类似\t5 6\t这种数字之间并非使用\t分割,或是不是正整数的情况,使用NumberFormatException捕获,还有一种情况是length的值小于行数,也就是列数小于行数,使用ArrayIndexOutOfBoundsException捕获。
紧接着rowsum【i】和columnsum【i】是读操作中计算得到的,其中分别代表第i行/列的和,因此只需先判断第一行与第一列是否相等,然后再判断是否每一行与每一列都与第一行第一列相等即可证明行列是否都相等。
最后用两个循环计算sum1与sum2,代表着两个对角线的和,判断是否相等即可。
首先我们应该在方法开始的时候首先判断是否是奇数且大于0,否则就直接返回false,然后使用try catch,先判断文件是否存在,如果文件不存在,就创建一个新的文件,如果存在,就直接覆盖原有的文件。
-
-
- Problem 3: Turtle graphics and drawSquare
-
循环四次,先用turn转90度,再用forward行进即可。
可以通过函数calculateRegularPolygonAngle(int sides)是通过边数得到对应的角度,另一个是calculatePolygonSidesFromAngle(double angle),通过角度得到边数。
然后进行循环,次数即为边数,然后每次用turn转边数对应的角度,forward行进一定长度即可。
-
-
-
- calculateRegularPolygonAngle(int sides)
-
-
如果边数为n,则角度为(n-2)*180/n,其中将180写为180.0,使得返回值为double类型
-
-
-
- calculatePolygonSidesFromAngle(double angle)
-
-
边数即为360/(180-角度),但是得到的结果并非为整数,而是一个double类型的小数,因此我们需要注意四舍五入,在我的函数中我将计算得到的结果加了0.5之后再转为了int。
-
-
- Problem 6: Calculating Bearings
- calculateBearingToPoint(double currentBearing, int currentX, int currentY, int targetX, int targetY)
- Problem 6: Calculating Bearings
-
计算由一个点转向另一个点的角度,我们先用目的向量减去当前向量得到(newX,newY),然后通过cosa=newX/Math.sqrt(newX*newX+newY*newY)得到新向量与x轴正方向的夹角,进而再根据几种情况得到新向量与y轴正方向夹角,再跟currentBearing做差就能得出结果了。
-
-
-
- List<Double> calculateBearings(List<Integer> xCoords, List<Integer> yCoords)
-
-
我们只要设置一个保存结果的list【】a,然后循环的调用calculateBearingToPoint,将结果保存到a中即可。
首先判断点的个数,如果点的个数不大于三,则这个集合就是一个凸包。如果大于三,那么先找到一个横坐标最小的点里面纵坐标也是最小的点,然后对集合里面的所有的点求一次calculateBearingToPoint,然后选出角度最大的那个,作为下一个点,循环的调用直到选择的点跟横坐标最小的点里面纵坐标也是最小的点重合,或者目前的点跟横坐标最小的点里面纵坐标也是最小的点的连线垂直于X轴,就是循环的结束。
-
-
- Problem 8: Personal art
-
我的函数中采用了drawRegularPolygon(turtle, i, 1),即画出边数为i(从3到1000)长为1的多边形,由于我写的函数最后并没有将方向调整回指向y轴正方向,因此连续的调用可以实现旋转的效果,再通过switch操作实现颜色的改变,就得到了如下图象。
输入git add .命令,回车,将项目中所有的文件添加到仓库中。输入git commit -m "first commit" 命令,本次提交的注释。
git config --global user.email "abcde@qq.com",再次输入git commit -m "first commit"就会成功了。
输入git remote add origin https://github.com/Sylphid172/HIT-Lab1-1190201310
输入git push -u origin master,将代码上传到githunb仓库中,过一会儿,会提示你输入github的账号密码,接着就上传完成了。
-
- Social Network
这道题就是让我们构建一个人与人间可以存在特定关系的图。因此我们需要两个类,一个为图,一个为人,其中图中需要一个存储人对象的集合,人中需要存储关系对象的集合,以及几个后续要用到的变量。
-
-
- 设计/实现FriendshipGraph类。
-
使用Set<Person> PersonSet = new HashSet<Person>()来保存人的对象。
-
-
-
- addVertex(Person p1)
-
-
这个方法是向图中增加点,我们首先需要判断这个点是否已将在图中的,用PersonSet.contains(p1)即可判断,如果已经在图中了,就输出已经存在了。并且还要再利用Personset的迭代器判断是否有与p1同名的,如果有同名则直接退出程序。如果都不满足,再将这个点加到图中,并输入提示信息,返回true。
-
-
-
- addEdge(Person p1, Person p2)
-
-
这个方法是向点上加边,首先判断是否这两个点都存在图中。我们应该先看这两个点之间有没有边,如果已经有边,我们就应该输出一条提示讯息并且返回false,否则我们才向点上加边。
-
-
-
- getDistance(Person p1, Person p2)
-
-
使用队列,java中已经有Queuel了,主要思路是检测这两个人是否都在图里,如果有一个人不在,就直接返回-1,并且输出提示讯息,如果都在图里我们就通过visit判断是否被遍历、distance为目前点距离p1的路径长度执行广搜。先利用Personset的迭代器方法将图中所有人的visit设为false,distance设为0,之后通过广搜即可。其中我用relation的迭代器构造一个方法Person.iterator(),实现了对于每一个人的关系的检测。然后通过tostring(),即判断两个类中人的名字是否相同来判断是不是p2.
-
-
- 设计/实现Person类
-
String name;存放名字
Boolean visit 判断是否遍历过
Int distance 广搜中的距离
Set<Person> relation=new HashSet<Person>();存放有关联的人的名字
-
-
-
- String Getdistance()
-
-
获取距离
-
-
-
- boolean GetVisit()
-
-
获取在BFS中是否遍历过
-
-
-
- void setfalse()/settrue()
-
-
设置visit的布尔值
-
-
-
- void add (Person p1)
-
-
添加有关联的人,同时判断p1是否为空
-
-
-
- Person(String name)
-
-
类的方法,初始化的时候使用
-
-
-
- Boolean IsEmpty()
-
-
判断relation是否为空
-
-
-
- Iterator<Person> iterator()
-
-
返回一个relation的迭代器
-
-
-
- boolean contains(Person p1)
-
-
判断relation中是否包含p1
-
-
-
- tostring函数
-
-
利于提示信息的抛出,同时用于判断两个人是否是同一个人。
@Override
public String toString() {
return name;
}
-
-
- 设计/实现客户端代码main()
-
FriendshipGraph graph = new FriendshipGraph();
Person rachel = new Person("Rachel");
Person ross = new Person("Ross");
Person ben = new Person("Ben");
Person kramer = new Person("Kramer");
graph.addVertex(rachel);
graph.addVertex(ross);
graph.addVertex(ben);
graph.addVertex(kramer);
graph.addEdge(rachel, ross);
graph.addEdge(ross, rachel);
graph.addEdge(ross, ben);
graph.addEdge(ben, ross);
System.out.println(graph.getDistance(rachel, ross));
System.out.println(graph.getDistance(rachel, ben));
System.out.println(graph.getDistance(rachel, rachel));
System.out.println(graph.getDistance(rachel, kramer));
-
-
- 设计/实现测试用例
- void addVertexTest()
- 设计/实现测试用例
-
加入重复的点应该返回false,正确的加入返回true
-
-
-
- void addEdgeTest()
-
-
加入图中没有的点应该返回false,加入重复的边应该返回false,正确的加点应该返回true
-
-
-
- void getDistanceTest()
-
-
按照pdf中给出的几个点的距离进行测试,同时如果输入的点有一个或者两个点不在图中应该返回false
-
-
-
- void addVertexTest()
-
-
加入重复的点应该返回false,正确的加入返回true
-
-
-
- void addEdgeTest()
-
-
加入图中没有的点应该返回false,加入重复的边应该返回false,正确的加点应该返回true
-
-
-
- void getDistanceTest()
-
-
按照pdf中给出的几个点的距离进行测试,同时如果输入的点有一个或者两个点不在图中应该返回false