Lab1实验报告

发布时间:2022-06-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Lab1实验报告脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

1 实验目标概述 训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用GIT作为代码配置管理的工具,学会Git的基本使用方法。 2 实验环境配置

  1. 安装Git并运行,并通过网上教程建立本地版本库,并与远程库相连接。但上传Lab1相关文件的时候,与远程库连接时出现了无法连接的情况,报错为“The current branch master has no upstream branch.”,经过查阅相关博客(6条消息) The current branch master has no upstream branch.的解决_punk-pp的博客-CSDN博客,发现是没有将远程分支设置为此分支上游;
  2. 下载JDK,并配置环境变量,因为有之前javaee课程的经验,还算顺利;
  3. 下载Eclipse并进行配置,并练习使用Java编程;
  4. 下载Junit,利用Lab0中给的仓库,下载了两个jar包并导入到Eclipse中,但在PRoject中buildBath时又出错了,把项目中的proPErity删去后正常
  5. 下载gradle,进行build。但因为没有相关知识储备,查询了很久的教程才找到一篇合适的网上教程https://blog.csdn.net/ChenDolph7in/article/details/117716245; GitHub Lab1 URL: https://github.COM/ComputerScienceHIT/HIT-Lab1-120L021329 3 实验过程 3.1 Magic Squares 本次任务主要包括两个任务: 任务一:。MagicSquare是一个正方形行列式,他的每一行、每一列和对角线的数字之和都相等并等于一个常数。从五个提供的txt文档中读入数据,来判断文件内的是否为一个MagicSquare,若是则返回true,若不是则返回false并在console上输出错误原因。 任务二:首先理解并明白generateMagicSquare()这个函数的原理,并写备注。然后对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输出到文本6.txt中,并且须输入的为奇数而输入偶数或者负数会返回false。然后利用任务一编写的isLegalMagicSquare()判断其是否为一个MagicSquare并返回true或者false。

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>,每一次通过ArrayList得到一行数据,之后在循环结束之后再添加到ArrayList<ArrayList>中;

(3) 对三个错误的检验: a) 对行列数不相等并非矩阵的情况,我在所有数据读入ArrayList<ArrayList>之后,循环比较每一行的长度和列的长度,出现不相等的情况就返回false,结束程序运行并打印错误提示信息; b) 对于矩阵中某些数字不是正整数的情况:每一次Integer.valueOf()后对数字进行检验,若非正整数则返回false,结束程序运行并打印错误提示信息,同时Integer.valueOf()函数得到substring非整数形式的字符串会报错,我在catch得到的exception后返回false,结束程序运行并打印错误提示信息,可以避免小数的作用; c) 对于并非使用t分割:和上文同理,若spilt字符串得到的字符串中有非数字和负号的情况,都会报错,通过catch得到的exception后返回false,结束程序运行并打印错误提示信息,可以避免其他符号的情况。

(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 过程:

  1. 获取任务代码: a) 首先连接远程库: git remote add origin https://github.com/rainywang/Spring2022_HITCS_SC_Lab1/tree/master/P2 b) 然后获取任务代码 git clone https://github.com/rainywang/Spring2022_HITCS_SC_Lab1/tree/master/P2
  2. 在本地创建git仓库及管理 a) 首先创建一个空文件夹 b) 然后在git bash下输入 i. git int c) 管理仓库 i. git add ii. git -m “…” iii. git push origin master 3.2.2 Problem 3: Turtle graphics and drawSquare 3.2.2.1 思路: 这个问题要求我们画一个正方形,每次旋转90度,并前进相同距离就可以。 过程: for(int i=0;i<4;i++) { turtle.forward(sideLength); turtle.turn(90);//每一次旋转90度即可 } 3.2.2.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)); }

  1. 实现calculateRegularPolygonAngle() a) 利用公式 (sides-2)*(180)得到总的内角和 b) 除以边数,每一个内角的度数;
  2. 实现本函数 a) 确定旋转角度: i. 为了在画好的图像之后,出发点是最左下角那个点 ii. 我们首先旋转90度 iii. 之后再每次旋转内角度数加180就可以; b) 每一次旋转固定角度前进固定长度并重复sides次即可。 结果:

3.2.4 Problem 6: Calculating Bearings 3.2.4.1 思路: 以出发点为原点,利用Math类中的acos()来计算到达点连线与X轴正向夹角,并且分情况确定是否加180。 然后把初始的角度也转化为与X轴的夹角,相减。若为负数加上360即可。 3.2.4.2 过程:

  1. 转化初始的角度为与X轴的夹角:

  2. 计算与X轴的夹角

  3. 计算最终角度

3.2.4.3 结果:通过测试

3.2.5 Problem 7: Convex Hulls 3.2.5.1 思路: 本题要求我们利用Gift wrapping algorithm算法,得到能包络所有点的闭包。 我们首先找到最左下角的那个点,然后从这一点利用calculateBearingToPoint函数挨个找转向角最小的点,并加入集合,直到再次找到第一个点为止。限制条件为每一次不能取现在的点。 同时,当出现相同转向角的时候,与现在的暂存点比较选择距离更远的那个点。 3.2.5.2 过程:

  1. 如果当前集合点数小于等于1,直接返回当前集合;

  2. 判断最左下角的点: 依次比较x,相同x取y小的那一个;

  3. 挨个找点加入集合: 每一次选择符合要求的转向角度最小的节点,加入闭包中。并直到找到的下一个点为第一个点时结束。

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 这个任务主要包括两个内容:

  1. 实现Person和FriendshipGraph两个类,并构建人际关系网;

  2. 实现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 过程:

  3. 定义一个Person的容器来存储所有人的对象:

  4. 实现addVertx(): a) 首先判断输入是否为空,是则返回,不是则继续; b) 再需要判断增加的名字是否已经存在,首先循环判断当前是否有重名的对象,若有则输出“SameNameWrong”,并返回。 c) 若没有,则加入到persons中。

  5. 实现addEdge() a) 首先判断输入的两个人名是否相同,相同则返回; b) 若不是则调用Person()的adDFriends()方法;

  6. 实现getDistance() a) 我们利用广搜的算法+邻接表的数据结构进行; b) 首先若输入同一个点,则返回0;若输入两个邻近的点,则返回1; 若不然,则调用BFS()进行广度搜索。将BFS得到的值返回;

  7. 实现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 过程:

  1. 加入五个人:

  2. 加入三段关系:

  3. 计算距离并输出 3.3.3.2 结果:

3.3.4 设计/实现测试用例 3.3.4.1 思路: 分别要对addVertex,addEdge,getDistance三个功能进行测试,并尽可能包含多的情况; 3.3.4.2 过程:

  1. addVertextest: a) 我们利用三个Person对象和一个ArrayList容器类对象进行测试;

b) 然后依次测试无输入、输入一个对象、输入相同对象、输入两个对象、三个对象的情况;

  1. addEdgeTest: a) 我们利用四个Person对象和一个ArrayList容器类对象,利用Person()的getFriends进行测试; b) 首先将四个顶点添加到图中;

c) 然后依次检测:输入两个相同名字,输入单向边,输入一条边,再输入已经添加过的名字,输入三条边的情况。

  1. getDistanceTest() a) 我们利用六个Person对象进行测试;

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 实验过程中收获的经验和教训(必答)

  1. java语言不扎实,还需要进一步学习;
  2. 实现画好UML图,确定编程的大概思路,能不在编程的时候改来改去; 6.2 针对以下方面的感受(必答) (1) Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足? 对;优势在于java提供的类和方法很多,可以在编程时充分调用、java面向对象编程的语言,更模块化分别编程;不足暂未发现。 (2) 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足; Eclipse优势在于很稳定,而且网上教程很多;不足在于UI界面以及一些插件的缺失。 (3) 关于Git和GitHub,是否感受到了它在版本控制方面的价值; 可以查看自己的提交记录,并且还可以回溯版本,价值还是蛮大的。 (4) 关于CMU和MIT的作业,你有何感受; 词汇量不够,读起来很力,但是他们的作业都能实实在在锻炼我们的编程能力,学习很多工具,还是蛮有效的。 (5) 关于本实验的工作量、难度、deadline; 工作量很大,难度在熟悉java之后还行,deadline还行,但是和考试撞上了。 (6) 关于初接触“软件构造”课程; 还不知道具体要学什么。

脚本宝典总结

以上是脚本宝典为你收集整理的Lab1实验报告全部内容,希望文章能够帮你解决Lab1实验报告所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。