本次实验通过求解三个问题,训练基本Java编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
⚫ 基本的 Java OO 编程
⚫ 基于 IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理
2.实验环境配置
配置本次实验所需开发、测试、运行环境的过程:
第一步,JDK下载和环境配置
在官网:Java Downloads | Oracle 中国下载
第二步,下载IDEA,并配置环境
第三步,下载并配置JUnit
第四步,下载Git,并学习相关操作
配置过程中遇到的问题和困难:
1..配置JDK时,在17和11同时切换使用存在问题,后来调查了资料使用JAVA_HOME随时切换。
2.Git安装时的具体操作,在网上搜集资料后成功安装。
3.实验过程
3.1Magic Squares
要编写程序(isLegalMagicSquare()和generateMagicSquare())来判断给出的五个文件是否为Magic Squares,并给出true或false,如果遇到错误,需要给出错误提示,并返回false,例如文件中的数据不符合Magic Squares的定义(行列数不相等、并非矩阵等)、矩阵中的某些数字并非正整数、数字之间并非使用\t 分割,数字的行之和与列之和和对角线之和不相等。
3.1.1isLegalMagicSquare()
首先,判断文件是否存在,如果存在使用字符流从文件中按行读入数字序列,将读入的内容以“\t”分隔,分成若干个字符串,存入String类型动态数组rows中。
然后判断列的大小,如果为0,让他等于第一行的字符个数,如果不为零,让他和下一行的字符个数比较,如果不相等,则给出错误提示“矩阵的行列数不相等或者数字间不是通过'\t'划分”,同时返回false。遍历每一行的数字字符,将他们转化为int型并存入动态数组values中,同时将字符转化为float型的temp,判断转化后的数字,如果小于等于0,给出错误提示“矩阵中某个数字不是正数”,同时返回false。然后将values再转换回单精度浮点数,判断结果与temp是否相等,如果不相等,则给出错误提示“不是整数”,同时返回false。将转化的values动态数组加入矩阵,行数加一。判断最后的行数是否等于列数,如果不相等,给出错误提示“矩阵的行列数不相等”,同时返回false。
最后,遍历矩阵,计算主对角线和副对角线还有行,列的和,,同时用sum保存第一行的数字和,并判断行列的数字和是否相等,如果不相等,则给出错误提示“矩阵行和列的数字之和不相等!”,同时返回false。判断主,副对角线及行列的和是否相等,如果不相等,则给出错误提示“矩阵主对角线和副对角线的数字之和不相等或者对角线和行的数字之和不相等!”,同时返回false。3.1.2generateMagicSquare()
如果输入的n为偶数,则给出错误提示“n是偶数,需要输入奇数!”,同时返回false。如果输入的n为负数,则给出错误提示“n是负数,需要输入正数!”,同时返回false。
同时给出程序流程图如下图所示:
该异常是由于越界,如果输入n为偶数,对于generateMagicSquare函数,在创建矩阵,col = n / 2时,如果奇数会向内取,而偶数不变,会造成出界
静态创建数组时,数组长度不能为负数。如果创建时给数组长度为负数的话会抛出运行时异常NegativeArraySizeException,该异常继承自RuntimeException
3.2Turtle Graphics
实验目的:实验网址:http://web.mit.edu/6.031/www/fa18/psets/ps0/,他是通过Java编写代码,实现各种功能,如计算多边形内角、旋转角度等,最后使用forward和turn函数进行个人艺术图形绘制,即实现一个Turtle小程序。
3.2.1Problem 1: Clone and import
对项目右键,打开Git Bash,git clone远程仓库地址:https://github.com/rainywang/Spring2022_HITCS_SC_Lab1/tree/master/P2
3.2.2Problem 3: Turtle graphics and drawSquare
实验要利用forward和turn方法完成一个正方形的绘制。Forward(units)能够让小海龟在画面上前进距离,turn(degrees)方法能够让小海龟顺时针转。由于每次绘图开始时海龟面朝上,让小海龟前进sideLength个单位,再右转90度,重复4次,完成正方形绘制。
3.2.3Problem 5: Drawing polygons
多边形内角大小为180.0 - 360.0 / sides,可以直接计算得出,运行TurtleSoupTest.java文件,测试对函数calculateRegularPolygonAngle的实现是否正确,然后利用calculateRegularPolygonAngle计算出正多边形内角度数angle,并用forward方法前进sideLength距离,再转角度即可。
3.2.4Problem 6: Calculating Bearings
此函数计算从当前点到目标点所需的参数,并将当前方向作为附加参数。 例如,如果在 (0,1) 朝向 30 度,并且必须达到 (0,0),它必须再转动 150 度,所以会返回。对于 n 个点的列表,您将返回 n-1 个航向调整;此调整列表可用于将引导到列表中的每个点。
3.2.5Problem 7: Convex Hulls
用于计算凸包,凸包是包含一组输入点中所有点的最小凸集。 礼品包装算法是解决这个问题的一种简单方法。
我对礼品包装算法的理解是,先看点的个数,如果小于等于3,直接输出该点集,如果大于3,则将x,y值最小的点纳入点集,逆时针的方向,逐个找凸包上的点,将下一个点设为当前点,并将其添加到凸包的点集中。重复上述过程,直到回到起始点为止。最终得到的点集即为凸包。3.2.6Problem 8: Personal art
3.2.7Submitting
如何通过Git提交当前版本到GitHub上你的Lab1仓库。
- git add .,将文件夹加入暂存区。
- git commit -m “注释”,将暂存区提交至本地仓库。
- git remote add origin your_repo_name,在本地添加远程仓库的地址,在本地创建远程仓库,名为origin。
- git pull拉取更新本地仓库和远程仓库。
- git fetch+git merge 远程仓库名/分支名,更新本地仓库。
- git push -u 远程仓库名 分支名
3.3Social Network
通过java实现一个求得最小距离的程序,如果两个人不存在社交关系,返回-1,反之返回最小社交距离,同时处理错误情况,并用Junit测试。
3.3.1设计/实现FriendshipGraph类
- addVertex函数,如果要加入的人存在,给出错误提示后返回,如果不存在就加入哈希图
- addEdge函数,如果输入的人不存在,给出对应的错误提示后并报错;如果已经存在两个人的关系了,给出错误提示并报错;如果输入同一个人给出错误提示并报错;反之,将两者关系存入哈希集合,同时注意类设计要能够支持未来扩展到有向图。
- getDistance函数,用BFS广度优先搜索算法。如果p1,p2不存在,就给出错误提示并退出;如果是输入重复的名字,给出错误的提示。然后使用BFS算
3.3.2设计/实现Person类
需要给出Person的属性:姓名。
3.3.3设计/实现客户端代码main()
3.3.4设计/实现测试用例
给出你的设计和实现思路/过程/结果。
- 如果将上述代码的第 10 行注释掉(意即 rachel 和 ross 之间只存在单向的社交关系 ross->rachel),输出结果为-1,-1,0,
- 如果将第 3 行引号中的“Ross”替换为“Rache。
按照实验报告要求修改后
- 分別对addVerrtex函数,addEdge函数,getDistance函数进行测试
4.实验进度记录
日期 | 时间段 | 任务 | 实际完成情况 |
2022-03-25 | 15:00-19:00 | 编写问题1的isLegalMagicSquare函数并进行测试 | 按计划完成 |
2022-03-28 | 14:00-24:00 | 编写问题2的全部问题并测试 | 按计划完成 |
2022-03-39 | 18:00-24:00 | 编写问题3,并完成相关测试 | 按计划完成 |
2022-03-30 | 8:00-12:00 | 完善实验报告 | 按计划完成 |
5.实验过程中遇到的困难与解决途径
遇到的困难 | 解决途径 |
从远程仓库克隆p2后,文件报错 | 将文件的package全部改为在P2包里面 |
文件显示非法的表达式开始 | 询问实验老师后,通过粘贴函数的方法改变原函数格式 |
对凸包理解有问题,礼品包装算法没有理解 | 搜索维基百科,询问同学,观看MIT网课多种办法,学习并掌握了礼品包装算法。 |
对FriendShipGraph进行单元测试时,只有main的测试函数被创建出来 | 查阅资料后发现,Junit单元测试只能对无返回值的void进行测试,尝试更改函数,修改函数,函数出错,最后仅测试main函数 |
6.1实验过程中收获的经验和教训(必答)
- 学习并熟练编码技能:通过这次实验,我提高编码技能。通过实践加深对Java编程语言和相关技术的理解,并且掌握解决问题的能力。
- 实践解决问题:在实验项目中,我遇到各种各样的问题和挑战。通过解决这些问题,我学习到如何进行故障排除和解决方案设计。一定程度上提高了我的自学能力。
- 测试与调试:了解到在编写代码时,一定要进行充分的测试。测试有助于发现潜在的问题,并确保代码的质量。同时,明白了学会有效地调试是解决问题的关键。
6.2针对以下方面的感受(必答)
1.Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
Java很合我的口味,Java是一种面向对象的编程语言,它支持封装、继承和多态等面向对象的特性,使得代码更具可重用性、可扩展性和可维护性。同时,具有内置的安全性特性,可以帮助我编写更加健壮和安全的代码。但不可否认的是,java仍有很多缺陷和不足,例如内存消耗较大,语法冗长等。
2.关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
在实验过程中,我使用了IntelliJ IDEA的社区版,作为一个IDE,他可以根据上下文和代码语境提供智能建议,提高编码效率。内置了许多实用的工具和功能,如版本控制、调试器、测试工具等,可以帮助我更轻松地进行软件开发。不足在于社区版相较于收费的商业版,功能有许多不足。
3.关于Git和GitHub,是否感受到了它在版本控制方面的价值;
Git记录了代码库的每次变化,可以轻松地回滚到任何历史版本,从而避免了意外修改带来的风险。
4.关于CMU和MIT的作业,你有何感受;
MIT的作业涉及的知识较为广泛,融合了计算机,数学,美术,完成过程较为有趣。相比之下,CMU的作业比较寻常,但是可以帮助我掌握Java的知识并且学习测试的书写。
5.关于本实验的工作量、难度、deadline;
本次实验的工作量比较适中,负担不大;在凸包和测试的书写上难度较大;没有合理安排好时间,在DDL前一天完成任务。
6.关于初接触“软件构造”课程;
了解了到了好的软件程序,不仅仅要看算法,还应该关注他的质量,以及如何测试代码,感觉和实际项目结合起来了,不只是单纯的理论。希望接下来多多练习实践。