脚本宝典收集整理的这篇文章主要介绍了Lab1实验报告,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
1 实验目标概述 训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用GIT作为代码配置管理的工具,学会Git的基本使用方法。 2 实验环境配置
3.1.1 isLegalMagicSquare()
3.1.1.1 思路: (1) 将从文件中的数据一行一行读入,并利用split("t")和.valueOf(substring),把字符串转化为整形存储在可变数组中; (2) 在读入时检验可能出现的三个错误并报错,在控制台上输出错误信息; (3) 最后将的得到的数组实现对行、列以及对角线的检验。 3.1.1.2 过程: (1) 读入文件,我选择了BufferedReader()作为输入流实现一行一行的读入; BufferedReader in = new BufferedReader( new InputStreamReader( newFileinputStream(filename)));
(2) 然后可变数组我选择了容器类ArrayList<ArrayList
(3) 对三个错误的检验:
a) 对行列数不相等并非矩阵的情况,我在所有数据读入ArrayList<ArrayList
(4) 检验:按照行、列、对角线的顺序 a) 对行,我先计算第一行的值,并循环比较第i行的和与第一行的值,若不相等,则返回false; b) 若行通过检验,我再循环比较第i列的和与第一行的值,若不相等,则返回false; c) 若行列都通过检验,我再计算正对角线和反对角线的值,并和第一行的值比较,若不相等,则返回false; 3.1.1.3 结果:
3.1.2 generateMagicSquare() 3.1.2.1 构造原理—罗伯法:
(1) 从初始位置(0,n/2)开始赋值,赋值为1,之后每次取当前位置的右上角的位置,每n次就是更新一个右斜对角线。且每次赋的值依次加1,依次从1加到n^n。能对每一个节点都赋值且不重复赋值。 (2) 但如果当前行是第一行,则下一行为最后一行,如果当前列是最右边的列,则下一次取左边第一列,如此重复平方次,就对整个矩阵赋值了,而且满足了每行每列以及对角线之和都是相同数字的效果。
3.1.2.2 错误分析: (1)“java.lang.ArrayIndexOutOfBoundsException “是因为在输入为偶数时,遍历n次后,进入下一个对角线是,row会越过了列下标的界限; (2)“java.lang.NegativeArraySizeException “是因为在输入为负数时,数组构造会报错。 3.1.2.3 思路: (1) 增加写出文件功能,将得到的数组一行一行输入到txt文件中; (2) 在n不合法时,捕捉异常并优雅的退出而不是非法地退出; 3.1.2.4 过程: (1) 增加写入文件功能: a) 利用PrintWriter可以实现对数组直接的文本输入,每一个输入后输入一个”t”; b) 每一行输入后除了最后一行再输入一个一个换行符’n’; try { PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter( new FileOutputStream("srcP1txt"+filename))));
for(i=0;i<n;i++) {
for(j=0;j<n-1;j++) {
out.print(magic[i][j]);
out.print("t");
}
out.print(magic[i][j]);
if(i!=n-1) {
out.print("n");
}
}
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("PrintWriter error opening the file:"+filename);
}
(2) 捕获异常并返回false: a) 直接利用try-catch函数实现: try (Scanner in = new Scanner(System.in)) { }catch(ArrayIndexOutOfBoundsException e) { System.out.println(false); System.out.println("The function is over."); return false; }catch(NegativeArraySizeException e) { System.out.println(false); System.out.println("The function is over."); return false; } n=in.nextInt(); } 3.1.2.5 结果:
3.2 Turtle Graphics 这次任务利用提供的绘图工具类Trurtle Graphics,完成所给任务: (1) 画出一个正方形; (2) 计算正多边形内角; (3) 由正多边形内角得到边数; (4) 计算从一个点到另外一个点所需要转过的角度; (5) 给定一系列点计算每次转过的角度并返回在集合中; (6) 计算一系列点中的凸包; (7) 调用函数绘制图形; (8) 并使用junit进行单元测试。 3.2.1 Problem 1: Clone and import 如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。 3.2.1.1 准备: 参照https://www.liaoxuefeng.com/wiki/896043488029600学习了git的基本语法并通过命令行指令获取密钥并添加至github。 3.2.1.2 过程:
3.2.3 Problem 5: Drawing polygons 3.2.3.1 思路: 本题要求我们在calculateRegularPolygonAngle()的基础上,编写画正多边形的函数。 3.2.3.2 过程: turtle.turn(90); for(int i = 0;i<sides;i++) { turtle.forward(sideLength); turtle.turn(180+calculateRegularPolygonAngle(sides)); }
3.2.4 Problem 6: Calculating Bearings 3.2.4.1 思路: 以出发点为原点,利用Math类中的acos()来计算到达点连线与X轴正向夹角,并且分情况确定是否加180。 然后把初始的角度也转化为与X轴的夹角,相减。若为负数加上360即可。 3.2.4.2 过程:
转化初始的角度为与X轴的夹角:
计算与X轴的夹角
计算最终角度
3.2.4.3 结果:通过测试
3.2.5 Problem 7: Convex Hulls 3.2.5.1 思路: 本题要求我们利用Gift wrapping algorithm算法,得到能包络所有点的闭包。 我们首先找到最左下角的那个点,然后从这一点利用calculateBearingToPoint函数挨个找转向角最小的点,并加入集合,直到再次找到第一个点为止。限制条件为每一次不能取现在的点。 同时,当出现相同转向角的时候,与现在的暂存点比较选择距离更远的那个点。 3.2.5.2 过程:
如果当前集合点数小于等于1,直接返回当前集合;
判断最左下角的点: 依次比较x,相同x取y小的那一个;
挨个找点加入集合: 每一次选择符合要求的转向角度最小的节点,加入闭包中。并直到找到的下一个点为第一个点时结束。
3.2.5.3 结果:测试通过
3.2.6 Problem 8: Personal art 3.2.6.1 思路: 通过不断的旋转与前进,并利用提供的颜色绘制一个‘HIT‘。 3.2.6.2 过程:
3.2.6.3 结果:
3.2.7 Submitting (1) 打开git bash
(2) 连接远程库 https://github.com/ComputerScienceHIT/HIT-Lab1-120L021329 (3) 上传文件 git add / git commit /git push origin master
3.3 Social Network 这个任务主要包括两个内容:
实现Person和FriendshipGraph两个类,并构建人际关系网;
实现getDistance(),获取两个人之间最近的社交距离。 3.3.1 设计/实现FriendshipGraph类 3.3.1.1 思路:该类首先需要我们完成的功能为: (1) addVertx(),增加一个人名,若重名则输出“Same name”并结束程序; (2) addEdge(),增加一个人到另一个人的关系(单向); (3) getDistance(),采用广度搜索的方法找到两个人之间的最短距离; 此外我增加的函数: (4) fresh(),每一次搜索时都刷新一下,每个Person()对象的flag; (5) BFS,广度搜索函数。 3.3.1.2 过程:
定义一个Person的容器来存储所有人的对象:
实现addVertx(): a) 首先判断输入是否为空,是则返回,不是则继续; b) 再需要判断增加的名字是否已经存在,首先循环判断当前是否有重名的对象,若有则输出“SameNameWrong”,并返回。 c) 若没有,则加入到persons中。
实现addEdge() a) 首先判断输入的两个人名是否相同,相同则返回; b) 若不是则调用Person()的adDFriends()方法;
实现getDistance() a) 我们利用广搜的算法+邻接表的数据结构进行; b) 首先若输入同一个点,则返回0;若输入两个邻近的点,则返回1; 若不然,则调用BFS()进行广度搜索。将BFS得到的值返回;
实现BFS() a) 我们给每个对象一个标志变量,代表该变量是否被搜索过; b) 每个对象有一个friends的容器类,用来存储该对象对应的朋友; c) 我们按照广度搜索的思想,挨个对当前节点的朋友节点进行搜索并置其flag为true,代表这个节点已经被搜索过来。最后若当前节点的朋友节点搜索到目标节点,则将返回的最小距离+1再返回。 d) 当当前节点是目标节点的朋友节点时,返回1;若未搜索到则返回-1;
结果:在实验指导书原代码+增加了addVertex(Rachel,rachel)之后的输出
3.3.2 设计/实现Person类 3.3.2.1 思路:在Person类中,我们要实现的功能有: (1) addfriend()添加Person到该对象的friends列表中; (2) getName()得到该对象的姓名; (3) getfriends()得到给对象的朋友列表; (4) findfriend()在该对象的朋友列表中找寻; (5) getFlag()得到该对象的flag,以区分是否被查找; (6) setFlag()设置当前对象的flag。 3.3.2.2 过程: (1) 定义容器类变量ArrayList<>来存储friends,定义名字和标志:
(2) 设置Person的构造器:
(3) 设置flag的相关函数:
(4) 实现findfriend() a) 将输入的字符串挨个与当前对象的朋友列表进行判断,若有相同名字,则返回true,没有则返回false。
(5) 实现addfriends() a) 首先调用findfriend,判断是否输入的Person已在列表中,若在则打印“He has a friend with this name. ”; b) 若不在,则添加到friends中。
3.3.3 设计/实现客户端代码main() 将实验手册的代码增加一个节点和三条边即可:实现一个五人的社交网络。 3.3.3.1 过程:
加入五个人:
加入三段关系:
计算距离并输出 3.3.3.2 结果:
3.3.4 设计/实现测试用例 3.3.4.1 思路: 分别要对addVertex,addEdge,getDistance三个功能进行测试,并尽可能包含多的情况; 3.3.4.2 过程:
b) 然后依次测试无输入、输入一个对象、输入相同对象、输入两个对象、三个对象的情况;
c) 然后依次检测:输入两个相同名字,输入单向边,输入一条边,再输入已经添加过的名字,输入三条边的情况。
b) 首先加入四个点和三条边,测试情况:输入同一个人的名字,距离为1的两个名字、距离为2的两个名字;
c) 再加入一个点和一条边,测试:距离为3的情况;
d) 再加入一个点,测试:不相邻的情况。
3.3.4.3 结果:
4 实验进度记录
日期 时间段 任务 实际完成情况 2022-04-30 18:30-22:30 完成环境的建立 提前一小时完成 2022-05-01 20:00-24:00 编写isLegalMagicSquare函数和generate并进行测试 按计划完成 2022-05-02 20:00-24:00 编写P2的1-6并进行测试 延期2小时完成 2022-05-03 15:00-20:00 编写P2的7-8和P3 遇到困难,未完成 2022-05-04 15:00-19:00 编写P3 延期1小时完成 5 实验过程中遇到的困难与解决途径 遇到的困难 解决途径 不熟悉容器类的相关操作; 查找容器类的相关方法 相对路径下的文件读写
查询网上博客,模仿学习
不会gradle的build
在网上找到学长的博客,模仿学习了一下
6 实验过程中收获的经验、教训、感想 6.1 实验过程中收获的经验和教训(必答)
以上是脚本宝典为你收集整理的Lab1实验报告全部内容,希望文章能够帮你解决Lab1实验报告所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。