2023年春季学期
计算学部《软件构造》课程
Lab 1实验报告
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 的基本使用方法。
·基本的 Java OO 编程
·基于 Eclipse IDE 进行 Java 编程
·基于 JUnit 的测试
·基于 Git 的代码配置管理
本次实验开发测试运行的环境为IDEA,在配置环境的过程中,主要遇到的是JDK版本实验要求不符的情况,打开IDEA集成开发环境工具,点击:File--Project Structure进行JDK的更改。
安装Junit:
Idea自带,根据提示配置成功。
GIT安装:
根据Lab0提示下载安装。
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
读取五个文本文件,并检查其中矩阵行列对角线值,并判断他是否为幻方矩阵。
3.1.1 isLegalMagicSquare()
按步骤给出你的设计和实现思路/过程/结果。
FileReader文件字符输入流,BufferedReader缓冲输入流,将字符串并保存在一个String类型的tmp字符串中,并加入集合list中。
定义int类型row记录行列式的行数,将字符串每行用“\t”split分隔,记录length为列数(如果输入格式中未用“\t”分隔,此时列数并非真实的列数),length不等于row时,输出错误提示,return false。
采用Integer的valueOf()方法判断是否存在非整数和非正数的情况。
计算行、列、对角线上数字和的值,进行判断是否符合幻方矩阵的性质。
3.1.2 generateMagicSquare()
流程图
判断n不合法的情况,return false。
n合法时,对n*n的矩阵进行填充。从第一行中间位置(0,n/2)开始填充,1赋值给初始位置。进行边界检查,达到上边界时,跳至下边界。其他情况正常row--。达到右边界时,跳至左边界。其他情况时正常col++。当i能被n整除时,下移一行,赋值为i + 1,然后继续循环赋值。当循环n的平方次后,则生成好了n*n的幻方矩阵。
输出生成的幻方矩阵并且写入6.txt文件中。
利用git clone 获取代码,根据注释补全代码,实现一系列绘图可能用到的功能:画出正方形、计算正多边形的内角、计算对应内角的正多边形边数、计算角度转移(以某点作为出发点,面向某个方向,要前往指定坐标点,需要转过多少角度)、求解凸包问题、以及绘制自己独特的图形。
3.2.1 Problem 1: Clone and import
git init 用于初始化项目
克隆项目的地址 git clone xxx ,显示100%时就代表项目克隆成功
3.2.2 Problem 3: Turtle graphics and drawSquare
调用已经实现的forward和turn函数,向前走sideLength,转90°角,实现正方形的绘制。
3.2.3 Problem 5: Drawing polygons
calculateRegularPolygonAngle()函数求解给定边数的正多边形的内角度数。
每次前进sidelength,转向的角度为外角的度数(通过调用calculateRegularPolygonAngle()函数得到),循环次数为边数
calculatePolygonSidesFromAngle()函数求解给定正多边形内角大小的边数。
绘制边长为40的正八边形
Problem 6: Calculating Bearings
以某点作为出发点,面向某个方向,要前往指定坐标点,需要转过多少角度。我们通过调用math.atan2函数,计算角度,最终确定转角。
3.2.4 Problem 7: Convex Hulls
当点集中的点少于等于两个时,凸包由点集中的所有点组成,直接将两点返回。
当大于两个点时,选择最左下的角作为出发点,通过循环遍历整个点集,查找横纵坐标最小的点。找到该点后记录下来,并加入到凸包的点集中。之后开始对点集进行遍历,找到偏角最小的点依次加入集合。出现两个点转向角相同的情况时,选择距离更远的点。当筛选下一个点又返回到起始点时,说明形成一个闭环,返回结果点集。
3.2.5 Problem 8: Personal art
通过调用drawRegularPolygon()函数,在循环中实现正多边形的绘制,每次绘制完一个正多边形,角度转10度,形成对称规律的图形(形似花朵)。简单绘制茎秆和叶子(平行四边形)。
绘制结果:
3.2.6 Submitting
如何通过Git提交当前版本到GitHub上你的Lab1仓库。
打开GitBash,输入git push origin master即可。
3.3 Social Network
该问题需要我们将社交网络建模为一个无向图,其中每个人连接到零个或多个用户。
3.3.1 设计/实现FriendshipGraph类
首先定义集合来存储people和name。addVertex:起到添加朋友的作用,定义hashset方便判断重复情况。
AddEdge:起到添加到边的作用,本问题拟刻画的社交网络是无向图,但类设计需要支持未来扩展到有向图。所以在两个 Person 对象 A 和 B 之间增加一条边时需要同时调用 addEdge(A,B)和 addEdge(B,A)两条语句。
getDistance:利用HashMap采用广度优先算法获取最小距离,未联通时返回值为-1.
3.3.2 设计/实现Person类
设计存储String类型存储person的name,存储人的朋友集合FriendshipList以及AddFriend,getName,getFriendshipList方法。
3.3.3 设计/实现客户端代码main()
输出与测试样例结果一致。
注释掉“graph.addEdge(rachel, ross)”
Rachel与任何人都不相邻,返回-1;自己到自己的距离为0,getDistance(rachel, rachel)返回0。
如果将第 3 行引号中的“Ross”替换为“Rachel”,违反了“Each person has a unique name”的约束条件,此时提示出错并结束程序运行。
3.3.4 设计/实现测试用例
针对addVertex测试:主要测试添加人的情况,首先测试是否能加入person a 和 b,其次测试重复的person(b)加入后,是否会输出FALSE而使程序终止。
针对addEdge测试:测试无向图中是否成功加入了加入边ab。
对getDistance的测试:构建无向图,检验距离是否与预期吻合。
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 | 时间段 | 任务 | 实际完成情况 |
2022-03-06 | 16:00-18:30 | 编写问题1的isLegalMagicSquare函数并进行测试 | 按计划完成 |
2022-03-08 | 14:00-16:30 | 根据注释补充问题2的TurtleSoup代码 | 遇到困难,未完成,凸包问题未完成 |
2022-03-08 | 18:00-19:00 | 补充问题2的凸包算法代码 | 按计划完成 |
14:00-16:00 | 编写问题3的主要代码 | 延期半小时完成 | |
2022-03-11 | 14:00-16:00 | 编写问题3的测试 | 按计划完成 |
2022-03-12 | 14:00-15:00 | 优化代码 | 按计划完成 |
- 实验过程中遇到的困难与解决途径
遇到的困难 | 解决途径 |
初学JAVA做实验的时候有思路,但是不知道JAVA中用什么方法来实现 | 查阅资料,积累经验,增强自己对java语言的掌握 |
初次使用Git,中间出错很多次 | 在CSDN上查找资料,并进行实践 |
初次接触凸包问题,对解决凸包问题的算法不是很了解 | 查询资料进行学习,学习算法内在的思想,并完善自己的代码 |
初次使用Java语言进行编程,先大致了解了IDEA集成开发环境工具的使用。并且在实验中发现了自己存在很多不足,边做实验边学习,使得自己对Java编程更加熟悉。同时,在本次实验第一次接触Junit单元测试进行“边测试边编程”的方式写程序,发现程序健壮性得到了显著性提高。此外,在本次实验我还了解了Git,Git是一款源代码管理工具,我们写的代码需要使用Git进行管理。在网上学习了Git的基本操作,并且动手实践。
在本次实验,我也深刻地意识到自己对Java的语法掌握不好,写代码时总有“心有余而力不足”的感觉,常常需要查阅资料,极大的降低了效率,在以后的学习中会注重巩固自己的基础知识,对Java语法能够更加熟悉并且熟练地掌握。
6.2 针对以下方面的感受(必答)
1.Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
较好。
优势:Java提供的库函数功能十分强大,有大量封装好的方法。
不足:Java删除了指针,所以不如C语言灵活,并且不像C语言那样写代码直接编译运行,需要自己创建class等等。
2.关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
我使用的是IDEA,我认为它的优点是它能生成某个类的测试类,还能正确的放到test相应的目录下,此外它还有着强大的整合能力例如:精准搜索、提示功能的快速、Git等等。缺点是,idea使用的是内存空间,会把创建的索引都保存到内存中,而实际占用的cpu少。
3.关于Git和GitHub,是否感受到了它在版本控制方面的价值;
感受到了,支持保存原版本和多设备查看。
4.关于CMU和MIT的作业,你有何感受;
喜欢MIT作业的形式,可以根据规约来实现方法,也是对自己编程的一种锻炼,完成后进行test还可以更好的检验。
完成CMU的作业巩固了自己对Java语法的学习。
5.关于本实验的工作量、难度、deadline;
工作量中等偏多,但是给的时间很充裕,难度的话我认为凸包算法那部分较难,由于本学期刚刚接触算法,所以觉得有些吃力。Deadline时间合理。
6.关于初接触“软件构造”课程;
我认为这门课很好,将理论与实践很好的结合了,真正地去了解了开发软件时的一些事项,为未来同学们的实习和就业都奠定了良好的理论基础和实践基础。