2022年春季学期
计算学部《软件构造》课程
Lab 1实验报告
姓名 | 艾浩林 |
学号 | 120L021917 |
班号 | 2003006 |
电子邮件 | |
手机号码 | 18891201338 |
3.1.1 isLegalMagicSquare()...................................................................... 1
3.1.2 generateMagicSquare()................................................................... 1
3.2.2 Problem 3: Turtle graphics and drawSquare....................................... 2
3.3.1 设计/实现FriendshipGraph类........................................................ 2
3.3.2 设计/实现Person类.............................................................................. 2
3.3.3 设计/实现客户端代码main().............................................................. 2
3.3.4 设计/实现测试用例.................................................................................. 3
5 实验过程中遇到的困难与解决途径.................................................................... 3
6 实验过程中收获的经验、教训、感想............................................................... 3
6.1 实验过程中收获的经验和教训(必答)................................................... 3
6.2 针对以下方面的感受(必答)..................................................................... 3
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试, 初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
基本的 Java OO 编程
基于 Eclipse IDE 进行 Java 编程
基于 JUnit 的测试
基于 Git 的代码配置管理
简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。
- jdk11安装以及jdk版本更换
首先在官网上下载jdk11环境,由于我之前已经安装过jdk,所以需要在电脑上更换一下jdk版本
打开刚才.exe下载好的jdk文件夹
打开bin文件,找到java.exe javaw.exe javaws.exe(java11版本没有javaws)复制一下
按照该路径 C:\Program Files (x86)\Common Files\Oracle\Java\javapath找到之前版本jdk下载好的java.exe和 javaw.exe javaws.exe,删除并替换
更改注册表:win+r,输入regedit进入注册表编辑器。
需要更改Java Development Kit和Java Runtime Environment两处的版本号
命令行输入 java -vesrion 查看版本号
- idea 安装与配置:去官网下载即可
- junit安装以及test调试:junit是idea的一个插件,需要在idea独立下载,只需要下载junit4即可
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
在这里给出你的GitHub Lab1仓库的URL地址。
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
首先需要在GitHub上下载需要测试的五个文件,将五个文件读入后判断是否为题目所要求的幻方,若不满足则需输出的原因:长宽不相等,数组元素有小数或者负数,未使用制表符 ‘\t’ 分隔
创建文件流,将五个文件依次读入并判断:首先将文件按行读取,循环条件为文件的行已经读完,设置正则表达式来匹配输入的数字是否合法,并且记录当前行的列数,如果行列不相等则直接输出错误,数字不合法也输出错误。
若输入合法,接下来要判断行列数字是和否相等,继续创造文件流,构建二维数组并将数字读入,之后将二维数组遍历计算各行各列以及对角线数字和是否相等若相等输出true,不相等输出错误并指出错误原因
构建二维数组,数组大小为n*n
创建循环,循环次数为二维数组的大小square
每次将一个数字填入二维数组中
如果循环变量能被边数整除则说明这个数的左上角已经有数字,则需要另起一行重新开始判断
这样看起来每次都会把数字由小到大填在二维数组中,循环规律是每个数字都在上一个数字的左上角,判断条件分为两类:一是行在第一行则直接跳转到最后一行,二是列在最后一列则直接跳转到第一列
行在第一行则直接跳转到最后一行,或者每次行递减
列在最后一列则直接跳转到第一列,或每次列递增
Turtle包由老师给出,具体原理可查看给出的turtle类,但是可以使用里面的方法,turtle类相当于一个带方向可变颜色的像素点,根据题目要求对像素点进行位移,并按要求给出位移角度等
在老师发布的URL地址打开并下载该任务代码
将P2文件全部复制粘贴到自己的P2包中,注意老师发布的路径与自己的路径有区别,这时候要修改包的导入路径,改成自己的路径
-
-
- Problem 3: Turtle graphics and drawSquare
-
给定边长要求画一个正方形,其实就是让一个像素点按边长距离位移,之后转向90°,循环四次就可以得到一个正方形
实现过程:for循环里循环四次,每次都让turtle 前进(forward)边长个单位并旋转(turn)90°四次之后就可以得到正方形
利用给定的边数以及长度,先设计一个正多边形,再把它画出来,具体原理和drawsquare类似,都是让像素点先位移一定边长后偏转角度,角度大小由正多边形边数决定
实现流程:先根据函数传递的边数sides计算出正多边形的角度angle,并在for循环中,每次让turtle旋转angle角度,循环sides次后得到正多边形
从第一个turtle开始,面朝上(0°),随后对于每个点,给定两个List :xCoords和yCoords,分别含有一系列横坐标和纵坐标,且个数相同(记为n);设最初turtle的朝向为正北并在(xCoords[0], yCoords[0])处,计算n-1次转向的角度。当n=0,返回answer列表。
实现流程:设立一个answer列表,记录每次偏转角度answer值设立一个中间变量currentX和currentY作为每次求答案的起始坐标,调用函数calculatingbearingstopoint求出两点(可以理解为两个向量)的角度差,并存放在answer里
先给出一系列点坐标,找到一个凸多边形使其中的点要不在凸包内要不作为凸包的顶点,如果两个点距离上一个点角度相同则要最远点作为目标纳入凸包集合中
实现流程:先找到所有点中左下角的点,这个点一定在凸包里面,然后按照该点为基准,每次在集合中找到与该点偏转角度最大的点多位凸包的下一个点放入凸包集合,如果找到两个点角度相等,则需要求两点间的距离,比较后取最远点作为凸包顶点放入集合中
设立两个循环变量,让turtle分别以2和3的倍数进行位移旋转即可
在项目文件夹中打开Gitbash,输入git push origin master
-
- Social Network
给定一组person对象,按照要求在邻接表中设计函数要求能添加边(addedge)和点(addvertex),最后根据邻接表构建一个无向图,要求能实现求任意两个点无向图之间路径长度
-
-
- 设计/实现FriendshipGraph类
-
有三个调用函数:addvertex:在邻接表中加入要求的对象,如果输入重复的对象则需要指出错误
Addedge:在两个点中建立联系,要求person类中friend表也要填入值
Getdistance:求输入两个点的距离:利用广度优先遍历,从第一个点开始入队,出队后将第一个点邻接的所有未标记过的点都加入队列中,直到找到目标点,并输出距离,距离的求取和树的层序优先遍历类似,每计算一轮,两个点距离在其出队的点上加一
-
-
- 设计/实现Person类
-
Person可以看成一个抽象的人,每个人都有名字和他自己的一组朋友,每次在无向图中加一条边就意味着他俩是朋友,而在求距离的时候要用广度优先遍历需要用到队列,在遍历的过程中要判断这个人是否被遍历过,所以需要在person类中新建一个标志变量flag,在求距离的时候也需要求两个点的距离所以需要设distance值
-
-
- 设计/实现客户端代码main()
-
按要求先创建person对象,按要求在邻接表中加点,加边并且输出要求的两个人之间路径长度
-
-
- 设计/实现测试用例
-
设置若干个个点,分别将这几个点放到链表中,根据自己设计的无向图加边,添加路径,最后在test类中实现路径检查
测试加点情况
- public void addVertex() {
- FriendshipGraph graph=new FriendshipGraph();
- Set<Person> persons = new HashSet<>();
- Person A = new Person("a");
- persons.add(A);
- Person B = new Person("b");
- persons.add(B);
- Person C = new Person("c");
- persons.add(C);
- Person D = new Person("d");
- persons.add(D);
- Person E = new Person("e");
- persons.add(E);
- Person F = new Person("f");
- persons.add(F);
- graph.addVertex(A);
- graph.addVertex(B);
- graph.addVertex(C);
- graph.addVertex(D);
- graph.addVertex(E);
- graph.addVertex(F);
- assertEquals(true,persons.equals(graph.persons));
- }
测试通过
-
- @Test
- public void addEdge() {
- FriendshipGraph graph=new FriendshipGraph();
- Person A = new Person("a");
- Person B = new Person("b");
- Person C = new Person("c");
- graph.addVertex(A);
- graph.addVertex(B);
- graph.addVertex(C);
- graph.addEdge(A,B);
- graph.addEdge(A,C);
- Set<Person> friend = new HashSet<Person>();
- friend.add(B);
- friend.add(C);
- assertEquals(true,A.friend.equals(friend));
- }
- @Test
- public void getDistanceTest() {
- FriendshipGraph graph=new FriendshipGraph();
- Person rachel = new Person("Rachel");
- Person ross = new Person("Ross");
- Person ben = new Person("Ben");
- Person kramer = new Person("Kramer");
- Person bob = new Person("Bob");
- Person amy = new Person("Amy");
- graph.addVertex(rachel);
- graph.addVertex(ross);
- graph.addVertex(ben);
- graph.addVertex(kramer);
- graph.addVertex(bob);
- graph.addVertex(amy);
- graph.addEdge(rachel,bob);
- graph.addEdge(bob,rachel);
- graph.addEdge(rachel, ross);
- graph.addEdge(ross, rachel);
- graph.addEdge(ross, ben);
- graph.addEdge(ben, ross);
- graph.addEdge(ross,amy);
- graph.addEdge(amy,ross);
- assertEquals(3,graph.getDistance(ben, bob));
- assertEquals(-1,graph.getDistance(bob, kramer));
- assertEquals(2,graph.getDistance(rachel,amy));
- }
- 实验进度记录
日期
时间段
任务
实际完成情况
2022-04-28
17:30-22:30
编写问题1的isLegalMagicSquare函数并进行测试
文件读入遇到bug,数组越界无法将数字读入数组中,未完成
2022-4-29
19:30-21:30
完成问题1的函数并测试
完成
2022-4-30
20:00-1:00
完成问题2
完成,中间切换文件路径存在问题,已解决
2022-5-5
8:00-11:00
完成问题3编写与测试
完成
2022-5-8
15:30-
Github上传程序包
上传完成
遇到的困难
解决途径
文件流读入时close后函数找不到后面的文件
将文件close统一放在函数末尾,这样不用重复关闭和打开文件流
将文件读入二维数组的时候总显示输入错误
前提条件判断的时候未把该去掉的错误情况排除,导致将字符串转为二维数组的时候会显示输入不合法。此前函数判断的时候只是单纯的把空格分开,没有判断输入是否合法,所以在前置条件中多加一条正则表达式匹配,如果输入不合法应该直接结束函数 | |
向老师github仓库导入P2文件的时候报错 | 路径格式不对,把文件名以及代码中的路径修改后解决成功 |
上传git仓库时把文件拖到桌面上导致idea不能正常编译 | 修改默认路径值 |
Git上传过程中无响应 | 网络连接不稳定,猜测是连接外网原因,需要多试几遍 |
- 编译器默认路径不要瞎改,否则可能会导致编译失败
- 设计程序的时候要边学边看,java的类库有很多,方法也很多,用的时候别学边看
- 创建的项目结构要符合题目要求,不能乱写,否则重命名会导致一系列不必要的问题
- 写代码前要想好函数的需求以及功能,提前想好,最好不要边写边改
- 每次写完代码及时记录以及写注释,修改周期不要太长不然看不懂以前的代码
- Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
Java作为一门成熟的编程语言,拥有非常丰富的类库,这让我写代码时省去很多功夫,相比c语言中,没有指针引用会少很多错误
- 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
Eclipse为免费软件,项目打开关闭很方便,字体看着更舒服
IDEA 只有community版本免费,但是代码补全机制较为优秀文件可以实时保存
- 关于Git和GitHub,是否感受到了它在版本控制方面的价值;
Git远程操控让上传代码方式变得更加格式化,这样可以更加标准化的上传以及修改代码
- 关于CMU和MIT的作业,你有何感受;
初读英文文章会很费劲,但是要理解其中的道理写起来很快,大部分思维难度不是很大,但是趣味性很强,写完会有一定成就感
- 关于本实验的工作量、难度、deadline;
工作量难度均适中,思维难度不是很大,关键在于理解,求闭包运算较有难度。deadline适中,关键deadline这天还有考试,不太好调节两边权重,建议老师下次可以弹性调节时间
- 关于初接触“软件构造”课程;
首次尝试用java编写项目,学会github使用流程,了解基本原理,对面向对象编程有了一定层次的理解