2022年春季学期
计算学部《软件构造》课程
Lab 1实验报告
姓名 | ***** |
学号 | ***** |
班号 | ***** |
电子邮件 | ***** |
手机号码 | ***** |
3.2.1 Problem 1: Clone and import
3.2.2 Problem 3: Turtle graphics and drawSquare
3.2.3 Problem 5: Drawing polygons
3.2.4 Problem 6: Calculating Bearings
1.实验目标概述
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
l 基本的 Java OO 编程
l 基于 Eclipse IDE 进行 Java 编程
l 基于 JUnit 的测试
l 基于 Git 的代码配置管理
2.实验环境配置
在官网下载了java的jdk,IDEA以及Git。并在IDEA中安装配置了JUnit。
3.实验过程
3.1Magic Squares
编写一个程序,用isLegalMagicSquare函数在已有的txt文件中以矩阵形式读取数据,判断所存储的数据是否是符合幻方性质的矩阵。并且能够对不同情况做出反应;自己用generateMagicSquare函数创建一个符合幻方性质的矩阵,并用第一个编写的函数去判断。
3.1.1isLegalMagicSquare()
字符输入流buf读取txt文件中的数据,创建数组magic存储txt文件中的数据。
按行读入txt文件,若读到的数据是负数、浮点数或者数据间不是以“\t”间隔,则返回false,表示不是幻方。如果最终得到的矩阵行列数不相等,说明不符合幻方要求,也返回false。
若前面都不返回false,说明数据格式无误,接下来用s1和s2分别存储主对角线和副对角线的值,如果不等,就返回false。如果等于,就继续判断每一行和每一列的和是否和对角线的值相等,如果存在一组不相等,就返回false,表示不是幻方;如果全部遍历完依旧没有返回false,说明该矩阵符合幻方性质,就返回true。
3.1.2generateMagicSquare()
该函数生成的幻方的思路大致是
首先将数字1放置在幻方最上方正中央位置,而后每次将下一个数放置在右斜上方位置,每放置n个数字行数加一。若到达第一行,则下一次到最后一行放置,否则行数减一;若到达最后一列,则下一次到第一列放置,否则列数加一。
扩展:
1.判断输入的n,如果为偶数或为负数,就返回false
2.将生成的幻方矩阵写入文件 \src\P1\txt\6.txt中,并返回true。
以n=7生成幻方示例:
3.2Turtle Graphics
使用git clone获得需要使用的代码,实现drawSquare函数、calculateRegularPolygonAngle函数、drawRegularPolygon函数、calculateBearingToPoint函数、calculateBearingsh函数、convexHull函数、drawPersonalArt函数,完成所有的问题,包括图形设计,并且还要通过TurtleSoupTest.java中的测试用例.
3.2.1Problem 1: Clone and import
使用git clone指令获取代码。
建立一个目录,通过git init命令就可以把这个目录变成git管理的仓库。
通过各种git命令就可以管理本地开发了。
3.2.2Problem 3: Turtle graphics and drawSquare
每执行一次sidelength长度,就转90度,重复四次,就可以完成一个正方形,如图所示:
3.2.3Problem 5: Drawing polygons
正n边型每个内角的度数为180*(n-2)/n度。
故这么实现calculateRegularPolygonAngle函数。
测试通过。
然后实现drawRegularPolygon函数,只需要画n次,每次画完旋转即可。
3.2.4Problem 6: Calculating Bearings
先实现calculateBearingToPoint函数,该函数根据当前点,当前朝向与目标点坐标计算指向目标点的方位角。当算出来的角度小于0时,加上360之后再返回。
再实现calculateBearings函数,将“起点”选为第一个点(坐标(xCoords.get(0),yCoords.get(0)));循环n-1次(n为点的个数)每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中;将下一次的“起点”用当前“终点”更新,继续循环;退出循环后返回List。
测试通过
3.2.5Problem 7: Convex Hulls
根据提示,这里求凸包时利用The gift-wrapping algorithm,具体步骤如下:
1)先找到所有点中最左下角的点,即x最小,y最小
2)将1)中的点作为初始点,从初始点开始寻找和它夹角最小的点,如果出现夹角相等的情况取距离远的点
3)将2)中取到的点作为新的点,重复操作,直到取到的点是最开始设置的初始点
另外calculatePolygonSidesFromAngle函数
3.2.6Problem 8: Personal art
3.2.7Submitting
如何通过Git提交当前版本到GitHub上你的Lab1仓库。
$git clone将Lab1仓库内的文件夹拷贝到你的本地仓库文件夹
在本地仓库文件夹下,进入拷贝得到的文件夹,打开git bash,键入命令行序列:
$git add .
$git commit -m “statement”
$git push origin master
3.3Social Network
该任务要求实现Person和FriendshipGraph两个类,用FriendshipGraph来构建Person之间的关系来模拟一个社交网络,能够计算出每两个Person之间的社交距离。
3.3.1设计/实现FriendshipGraph类
对于addVertex(Person p)函数,要先将现有人的名字和新准备加入的名字进行比较,如果相等,说明有名字重复,程序结束,如果不相等再加入。
对于addEdge(Person a, Person b)函数,要注意参数的传递顺序,是将b存到a的next列表中,这样可以方便扩展到有向图。
对于getDistance(Person a, Person b)函数,借助队列利用BFS算法求解从p1到p2的最短路径,当p1和p2相等时,直接返回0。先创建哈希表distance,其中key为每个人,value为boolean类型,如果该人已经被访问过了,value = true。
3.3.2设计/实现Person类
具体实现代码如下:
3.3.3设计/实现客户端代码main()
运行程序,结果为:
与预期相同,如若注释掉第10行,即rachel和ross之间只存在单向的社交关系 ross->rachel,
结果如图。
若有名字重复
就会输出
打印重复的名字,并结束程序。
3.3.4设计/实现测试用例
检测重复名字错误
接下来两个是对于图中点的距离测试。
4.实验进度记录
日期 | 时间段 | 任务 | 实际完成情况 |
2021-05-03 | 14:30-15:30 | 编写问题1的isLegalMagicSquare函数并进行测试 | 按计划完成 |
2021-05-04 | 19:30-22:30 | 编写问题2的各类函数并测试 | 延期1天完成 |
2021-05-06 | 15:10-17:50 | 编写问题3的social work | 延期半小时完成 |
5.实验过程中遇到的困难与解决途径
遇到的困难 | 解决途径 |
对于Java不熟悉 | 遇到困难就网上查相关资料 |
不会使用git | 搜索git常用指令,实践中学习 |
bfs算法生疏 | 查看数据结构课本 |
6.实验过程中收获的经验、教训、感想
熟悉了java程序的基本编写方式,体会到java的强大,同时也对git的各种指令有了初步的了解,在实验过程中认识到自己所掌握的知识还不够,对时间的安排也不恰当,动手能力有待提高。
6.2针对以下方面的感受(必答)
- Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
Java很棒,功能强大,自带许多库函数,但是由于函数过多,可能在使用中会有许多迷茫。
- 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
Eclipse插件编写更容易,使用资源少,但稍微负载就出现不兼容情况,新版本与旧版本的插件也不兼容。
IDEA调试功能强大,开发效率高,重构更智能。但maven功能集成度一般,console多且分散。
- 关于Git和GitHub,是否感受到了它在版本控制方面的价值;
感受到,在版本控制方面很方便
- 关于CMU和MIT的作业,你有何感受;
可以显著提高学生的动手能力,在实践中学习。
- 关于本实验的工作量、难度、deadline;
感觉工作量有点大,难度稍高,deadline在5.8,与考试时间冲突,有点赶
- 关于初接触“软件构造”课程;
对于编写代码有了更多实践的机会