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

2020年春季学期
计算机学院《软件构造》课程
Lab 1实验报告
姓名
学号
班号
电子邮件
手机号码

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Magic Squares 1
3.1.1 isLegalMagicSquare() 1
3.1.2 generateMagicSquare() 1
3.2 Turtle Graphics 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
3.2.7 Submitting 2
3.3 Social Network 2
3.3.1 设计/实现FriendshipGraph类 2
3.3.2 设计/实现Person类 2
3.3.3 设计/实现客户端代码main() 2
3.3.4 设计/实现测试用例 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 3
6 实验过程中收获的经验、教训、感想 3
6.1 实验过程中收获的经验和教训 3
6.2 针对以下方面的感受 3

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

从群中下载了JDK1.8版本,并配置环境,配置的步骤如下:
·在Windows. 上,启动安装程序。会询问你要在哪里安装JDK。 最好不要接受路径名中包含空格的默认位置,如c:Program FilesVJava\jdk 1.8.0 _version。 取出路径名中的Program Files 部分就可以了。
·在Windows.上,启动控制面板,选择“系统与安全”(System and Security),再选择“系统”(System) , 选择高级系统设置(Advanced System Settings)。在系统属性(System Properties)对话框中,点击“高级”(Advanced)标签页,然后点击“环境”( Environment)按钮。
· 滚动“系统变量”列表,直到找到名为Path的变量。点击编辑按钮。将jdk\bin目录增加到路径最前面,并用一个分号分隔新增的这一项:jdk\bin;other stuff
·保存所做的设置。之后新打开的所有控制台窗口都会有正确的路径。
·可以如下测试设置是否正确:打开一个终端窗口,键入:javac -version
然后按回车键。应该能看到显示某些信息:

在实验指导书所给的网站下载安装了Gitbush,分为GUI(图形)和CMD(命令行)两种模式,并简单学习了两种模式的使用。
中间由于有python环境设置的经验,没有出现什么大的困难。

最后是Junit测试环境的导入,由于本次实验运用的是Junit4,idea软件本身自带Junit4的文件。以下为导入步骤:
·打开idea,打开idea菜单栏中的文件中的项目结构菜单。
·点击模块,选择依赖,点击右边的加号,寻找idea的lib目录中的junit文件,并导入,再次重复操作导入hamcrest文件,Junit4需要此文件共同运行。

3实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1Magic Squares
该任务是需要判断一个矩阵是不是幻方。首先了解幻方的性质,便可大概梳理出需要判断的性质。首先是判断是否是合格的矩阵,即方阵,是否有不是正整数的元素,每个元素是否由\t隔开等等。其次判断幻方性质,其行列对角线的和是否都相同。
3.1.1isLegalMagicSquare()
·首先确定要用的结构。由于要储存多条字符串,因此我选用了list类型的变量。
·然后烦恼的是读取文件。
经过对于java的学习,了解到了文件读取的比较优异的方式:

不要忘记关闭文件。
其次是对于文件读取异常的捕捉,运用到try-catch结构,这个结构在该函数之后的步骤中也可以运用。
开始按行读取文件。

读取后的文件,以每行的字符串存储在list中,之后用split方法切割开。
将字符串类型的数字转换成为整型,并存入存放矩阵的二维数组中。
在此过程中穿插入异常捕捉,以及判断是否为正整数的条件。

·最后通过数组找到不同需求的地方求和,判断条件。

这些条件满足之后即为合格的幻方。
3.1.2generateMagicSquare()
·本函数实质上为罗伯法构造幻方:
1 居上行正中央——数字 1 放在首行最中间的格子中
依次斜填切莫忘——向右上角斜行,依次填入数字
上出框界往下写——如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中
右出框时左边放——同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中
重复便在下格填——如果数字{N} 右上的格子已被其它数字占领,就将{N+1} 填写在{N}下面的格子中
右上重复一个样——如果朝右上角出界,和“重复”的情况做同样处理
本题为这个布尔类型的方法补充一些代码即可。

·首先要补充输入偶数负数要会报错。
输入负数的话会不满足矩阵条件,如果是偶数时,会越界。

·其次是能够写入文件并判断。

与上一个函数类似,打开文件并写入。

·流程图
·
·结果

3.2Turtle Graphics
这道题趣味性很高,最难上手的地方是凸包问题,这道题对于算法的要求比较高。
重点理解一下凸包的问题:给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点。

MIT实验书建议使用边界漫游法,另外由于不要求算法复杂度,思维较简单的还有蛮力法去做。
3.2.1Problem 1: Clone and import
在https://github.com/rainywang/Spring2020_HITCS_SC_Lab1/tree/master/P2下载代码并解压放在src里,git init初始化仓库
3.2.2Probl‘em 3: Turtle graphics and drawSquare
运用turtle工具简单画图画一个正方形。Forward前进length距离,turn转过九十度,重复四次即可,要注意的是turn转过的是多边形的外角。

3.2.3Problem 5: Drawing polygons
首先第一个函数运用公式计算正多边形的内角大小,运用搜索到的公式即可,公式有很多。

其次第二个函数为画正多边形,需要知道边数,重复边数次循环,以第一个函数得到的角的外角大小转向,要注意是外角。长度为传入的sidelength。

进行Junit测试:

运行测试

3.2.4Problem 6: Calculating Bearings
本题是计算与目标位置方向的夹角。
为了获取夹角,想到使用atan2函数,通过极坐标的性质简化,需要得到x与y的距离,算出角度,要注意的是该函数得到的是弧度制,需要再使用todegree函数转换为角度。
转换为角度后其为与x轴正向的夹角,还需要将其转换成与y轴正向夹角,再将其与原角度相减。如果为负数需要再增加360度。
以上数据均为double类型。

进行Junit测试

calculateBearings函数的功能是通过给出许多的坐标,得出turtle需要转过的角度,可以调用上一个函数。值得注意的是运用了list类,也是今后要学习的方向。

3.2.5Problem 7: Convex Hulls
凸包问题,使用gift-wrapping algorithm算法,对于点数大于三时,首先遍历,找到横纵坐标最小,即最左侧的点,然后每次从这个点找到转向角最小的点,作为下一次的起始,重复该步骤,直到回到最开始的点。本题要注意的是利用的set’类,也是以后要学习的方向之一。
为了方便操作,进行了强制转换,但是后来才学明白Set也可以完成我的所想。

该部分是找出最左最下的点,从此点开始漫游。

进行漫游循环,注意一个continue,因为不确定最下最左的那个点在何处,只能确定他在凸包里面,因此第一次遇到和他相同的点时,即为我们的开始漫游点,此时不退出循环。

·Junit测试结果:

3.2.6Problem 8: Personal art
调用之前的函数就好,以下是作品。

3.2.7Submitting
git add
git commit -m ““
git remote
git push -u origin master
Social Network
本题涉及到的是学习过的数据结构中的图的实际运用,操作较为简单,停留在加入点和边的基础上,加入一些对于输入的判断。较难的是代码从无到有,需要自己从中思考解决的方法,以及加深对于类的思考与设计。
3.2.8设计/实现FriendshipGraph类
·为了实现图的设计,我选用了map类型构造。

·为了实现添加顶点的操作,首先判断是否人名重复,如果不重复,构造该人名入map中并创建属于他的朋友list。

·为了实现添加边的操作,首先判断第一个人名所对应的朋友列表中是否有第二个人名,如果没有证明还没有关系,加入关系。

由于是双向的,因此以后可以向有向图扩展。
·为了实现获取距离的操作,需要用到之前学的队列的方法,在这里使用广度优先会更好,因此从距离0出发,进行一层的搜索,距离便加一,如果没有搜索到,则返回-1,即他们两个没有关系。

·其次设计了两个可以返回是否有顶点和边的布尔函数,为了测试用例时的方便。

3.2.9设计/实现Person类
Person类较为简单,只需要将输入的字符串类型,转换为Person类型即可,同时构造一个方法方便使用。

3.2.10设计/实现客户端代码main()
Main方法可以从实验指导书中获得,可以通过修改其中的几个人名获取想要的结果

·结果为:

3.2.11设计/实现测试用例
对于测试用例,实验指导书中明确要求需要三个主要函数的的测试
·首先对于添加顶点函数的测试,通过添加人名,测试添加前后是否可以达到预期的效果:

·其次对于添加边函数的测试类似:

这时候在原本类中构造的两个方法便起了很大的作用。
·最后是获取距离的测试,测试用例的图为:

得到想要的测试结果:

4实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 任务 实际完成情况
2020-03-11 19:00-21:00 编写问题1的isLegalMagicSquare函数并进行测试 遇到困难,未完成
2020-03-12 19:00-20:30 编写问题1的isLegalMagicSquare函数并进行测试,修改generateMagicSquare函数 按计划完成
2020-03-13 19:00—20:00 编写问题2除凸包外的所有问题 按计划完成
2020-03-14 15:00-20:00 编写问题2及问题三 按计划完成
2020-03-15 19:00-20:00 编写实验报告并上传 按计划完成
5实验过程中遇到的困难与解决途径
遇到的难点 解决途径

首当其冲的是第一个方法中的文件读取和写入

经过搜索寻找到FileInputStream与FileOutPutStream,可以很好的进行文件读取和写入。

其次是对于各种过程中异常的获取

经过搜索使用try-catch组合,获取各个过程中出现的异常,并安全退出。

将每行的字符串存储,获取总行数以便后续使用

判断矩阵的元素是否是正整数

使用list类型,将每行的字符串存放入一个list中,对于后续的操作有很大的便利。

使用正则表达式Pattern pattern = Pattern.compile("[0-9]*")

对于角度的判断

运用了Math类中的atan2函数,得到弧度并转换为角度

对于凸包以及凸包问题的解决

回顾以前学些的内容,搜集资料,使用边界漫游法和蛮力法均破解了一边,最后选用边界漫游法

对于类和接口的理解不够好

重新回顾java基本概念,选用合适的数据结构,回顾学习过的先广搜索以及关于图的内容,成功解决问题三

6实验过程中收获的经验、教训、感想
6.1实验过程中收获的经验和教训
本次实验下来,对于java的学习的确上了一个层次,学习到之前没有接触过的一门语言,还是非常的兴奋与开心的,学习java实际上补足了我对该类型语言的知识面。通过这次的编程,我发现我对于类的理解不够深刻,同时对于java本身存在的类还不够了解,不能够合理选用已有的java类来减少工作量。希望以后能够继续加油学习。
6.2针对以下方面的感受
(1)Java编程语言是否对你的口味?
还是比较和我的口味的,java拥有丰富的类资源,可以更好的帮助编程,使用起来非常的顺畅和方便。
(2)关于Eclipse IDE
Eclipse编辑器我觉得比较简陋,因此使用了Idea编辑器。
(3)关于Git和GitHub
Git和Github方便了本地能够上传到网站上供大家学习合作。
(4)关于CMU和MIT的作业
CMU和MIT的实力有目共睹,实验也能学到真正的东西。
(5)关于本实验的工作量、难度、deadline
本次实验比较合理。
(6)关于初接触“软件构造”课程
本课能够更好的学习软件的一系列内容。

你可能感兴趣的:(2020年春季学期 计算机学院《软件构造》课程 Lab 1实验报告)