2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

1实验目标概述

本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。 另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
⚫ 基本的 Java OO 编程
⚫ 基于 Eclipse/IDEA IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理

2实验环境配置

按实验要求安装JDK11,安装后不会配置环境变量,参考了https://blog.csdn.net/qq_41873673/article/details/108027074教程中的方法。
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

安装Eclipse,但安装后创建Java Project后报错无法运行,一直没有找到什么错误。后重新安装,问题解决。
安装Git Bash,参考了progit_v2.1.55,文档非常详细,全中文,所以并没遇到什么问题。

GitHub Lab1仓库的URL地址https://github.com/ComputerScienceHIT/HIT-Lab1-1190202002

3实验过程

3.1Magic Squares

主要是需要读取一个文档,将文档中的数字全部放入二维数组中,如果二维数组为正方形二维数组且每行每列和两条对角线上数字之和全部相等,则可判断为Magic Squares,否则不为Magic Squares。(在二维数组不为正方形,或其中有负数、小数,或数字之间并非使用\t 分割都不为Magic Squares)。还要生成奇数行列的Magic Squares,存入txt中。

3.1.1isLegalMagicSquare()

思路:
如果二维数组为正方形二维数组且每行每列和两条对角线上数字之和全部相等,则可判断为Magic Squares,否则不为Magic Squares。(在二维数组不为正方形,或其中有负数、小数,或数字之间并非使用\t 分割都不为Magic Squares)。
过程:
首先将文件名传入isLegalMagicSquare()函数,并读取文件,然后读取文件第一行以\t分隔放入字符数组中,计算第一行长度作为标准长度,将第一行每个字符以数值方式放入二维数组第一行,计算第一行的和作为标准和。然后重复上述步骤将其他行都放入二维数组中。
在上述过程中如果遇到小数,负数,或其他行长度与标准长度不符,直接返回false。(不以\t分隔,两数中间有其他符号,则无法转换为Integer,直接作为NumberFormatException异常抛出,返回false)。最后行列不等,也返回false。
然后计算每行每列和两条对角线上数字之和,如果在此过程中与标准和不等,直接返回false。
如果以上都不返回,最后返回true,是Magic Squares。
结果:
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.1.2generateMagicSquare()

按步骤给出你的设计和实现思路/过程/结果。
思路:
目标是根据输入的参数(奇数 n)生成一 个 n×n 的 Magic Square。所以当n为负数,偶数,小数时均不符合。当n为奇数时,进行构造。
过程:
n不为奇数,返回false。n为奇数,构造如下:
⑴ 将1放在第一行中间一列;
⑵ 从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右下
每一个数存放的行比前一个数的行数减1,列数加1
⑶ 如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最上一行,列数同样加1;
⑷ 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的上面。
代码如图
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

结果:
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.2Turtle Graphics

利用Turtle Graphics进行画图,分别需要完成画正方形,计算正多边形内角角度,画正多边形,计算固定角度正多边形几条边,计算形成凸包的最少点的集合,设计画图,使用junit进行单元测试。

3.2.1Problem 1: Clone and import

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。获取代码:git clone gitinithttps://github.com/rainywang/Spring2021_HITCS_SC_Lab1/tree/master/P2
git init 该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件
git add 指定所需的文件来进行追踪
git status 命令查看哪些文件处于什么状态
git commit -m “说明” 提交命令

3.2.2Problem 3: Turtle graphics and drawSquare

循环4次:前进并转90度。
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.2.3Problem 5: Drawing polygons

先写出计算正多边形内角函数calculateRegularPolygonAngle (int sides),内角=(边数-2.0)*180/sides
然后用循环:前进固定长度,旋转180-angle角度。
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.2.4Problem 6: Calculating Bearings

补全函数calculateBearingToPoint(),通过Math.atan2()计算出两点连线与y轴的夹角值,通过计算转向值=360-(现在点的方向与y轴夹角-两点连线与y轴的夹角值)。当所得角不在[0,360)之间,通过加减360的方式进行调整。
利用calculateBearingToPoint()算出每一次旋转角度,放入角度的列表中。每一次List 角度最后一个值作为下一个currentBearing的值(初始放入0.0)。最后取List的1到最后一个形成一个List作为返回值。
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.2.5Problem 7: Convex Hulls

已知有一系列点的坐标(x,y)。设置凸包列表和所有点列表。
第一步选择最左边的点(即x最小),若x相同则选择y比较小的那个点添加到凸包列表中,并在所有点列表将其删除。
第二步选择与第一个点转角最小的点,可调用calculateBearingToPoint函数进行计算,若多个点角度相同选择y更大的点添加到凸包列表中,并在所有点列表中将其删除。
第三步,进行类似步骤二的循环,选择与凸包中最后一个点转角最小的点,可调用calculateBearingToPoint函数进行计算,若多个点角度相同选择y更大的点添加到凸包列表中,并在所有点列表中将其删除。循环结束条件:将第一个点重新添加到所有点列表中,如果循环中找到的符合条件的点为第一个点,则循环结束。
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.2.6Problem 8: Personal art

设计一个颜色的字符数组,循环15次,每次通过字符数组选择一个颜色,画正六边形,旋转50度。最后转90度画一条线。形成花朵图形。
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.2.7Submitting

git init 该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件
git add 指定所需的文件来进行追踪
git status 命令查看哪些文件处于什么状态
git commit -m “说明” 提交命令

3.3Social Network

实现并测试一个FriendshipGraph类,它表示社交网络中的友谊,并可以计算图中两个人之间的距离。还需要实现一个辅助类Person 。您应该将社交网络建模为一个无向图,其中每个人都连接到零或更多的人,但您的底层图的实现应该是定向的。

3.3.1设计/实现FriendshipGraph类

给出你的设计和实现思路/过程/结果。
思路:FriendshipGraph类有三个功能:添加成员addVertex(若成员存在,输出“人名重复”,退出;不存在添加这个人和他的名字),增加有向边addEdge,计算两个人相连的最短距离getDistance(自己和自己距离为0,无法相连输出-1)。
过程:addVertex:人员重复或人名重复,输出“人名重复”,退出;不存在添加这个人和他的名字;
addEdge:连接a,b,直接将b添加到a的朋友列表中即可。
getDistance:采用先广搜索,构建一个队列,并构建一个HashMap<Person, Integer> map。将出发点的人添加到队列,添加到map的Key处,0加到Value处,读取队首,poll队首,读取他的每个朋友,若其朋友不在map中,则将其朋友全部添加到队列,并map.put(朋友,队首人的value+1),如果队列不空则一直循环,在循环中如果找到了终止点的人,则返回这个人在map中对应value值,即为距离。否则返回-1。
示意如下图:
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

结果:
添加成员addVertex。
增加有向边addEdge。
getDistance输出两个人相连的最短距离,自己和自己距离为0,无法相连输出-1。

3.3.2设计/实现Person类

给出你的设计和实现思路/过程/结果。
思路:Person类实现三个功能:返回自己的名字sname;添加朋友addfriend;返回朋友列表lsfriend。
过程:这三个功能都非常简单,代码如下
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

结果:返回自己名字,朋友列表,添加朋友。

3.3.3设计/实现客户端代码main()

实验要求中已经给出,不做过多赘述。就进行了创建人员,添加人员,建立朋友关系,输出距离。
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

3.3.4设计/实现测试用例

思路:测试用例可仿照3.3.3中给出的进行设计。创建人员,添加人员,建立朋友关系,输出距离。并进行断言。
过程:
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告
2021年春季学期 计算学部《软件构造》课程 Lab 1实验报告

4实验进度记录

日期 时间段 任务 实际完成情况
2021-05-21 8:00-23:00 编写问题1,问题2,问题3 延期4小时完成
2021-05-23 17:00-19:00 写实验报告 延期1小时完成
2021-05-23 19:00-20:00 上传实验 按时完成

5实验过程中遇到的困难与解决途径

遇到的困难 解决途径

安装Eclipse,但安装后创建Java Project后报错无法运行

重新安装
Turtle Graphics中Problem 7: Convex Hulls,不太清楚如何求凸包,且对Set类型不太了解如何操作。

上网查找求凸包的算法,用List进行操作,然后再改为Set型返回。

不太会用git,不知道如何上传实验

参考老师发布的资料progit_v2.1.55

6实验过程中收获的经验、教训、感想

6.1实验过程中收获的经验和教训

要先看清楚实验要求再进行编写程序,对整体的构建要在局部之前。
由于没有看清要求,导致代码都写完后才发现对于项目的目录结构,文件命名方式都有要求,还要重新更改。

6.2针对以下方面的感受

上一篇:【pytorch】tensor张量、vector向量、numpy array数组、image图像、RGB空间、LAB空间之间相互转换大全


下一篇:6.824 Lab 1: MapReduce