HIT 软件构造LAB1

 

2022年春季学期
计算学部《软件构造》课程

Lab 1实验报告
 

姓名

薄文

学号

120L020513

班号

2003004

电子邮件

604094538@qq.com

手机号码

18104568559

 

目录

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 编程

基于 IntelliJ IDEA 进行 Java 编程

基于 JUnit 的测试

基于 Git 的代码配置管理。

2.实验环境配置

首先在官网下载JDK,然后进行安装,并安装IDEA和git,先进行了git的配置,同时用ssh公钥将自己的本地仓库连接到github上的仓库,进行实验2时,开始会报错,需要链接Junit4,才会不报错。

URL地址:

https://github.com/ComputerScienceHIT/HIT-Lab1-120L020513

3. 实验过程

请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。

为了条理清晰,可根据需要在各节增加三级标题。

3.1 Magic Squares

MagicSquare是一个正整数组成的正方形,他的每一行、每一列和对角线的数字之和都相等。

任务一:编写一个Java程序(Magicsquare.java)用于检查矩阵的行/列/对角线值,该程序能够从五个已经提供的txt文档中读入数据,来判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是则返回false且说明原因。

任务二:对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输入到文本6.txt中,然后对其判断是否为MagicSquare。并且满足若输入的为奇数能产生MagicSquare,而输入偶数或者负数会返回false。

3.1.1isLegalMagicSquare()

ArrayList Ar1储存读取进来的txt:

ArrayList Ar2是将读取进来的txt转化为二维数组:

判断幻方的行列数是否相等:

 

判断行列,对角线的数相加是否相等:

 

判断是否能读取的文件以及数字之间是否是用\t分割:

通过try-catch组合,检测到出现\t抛出的错误,然后显示出错误

 

结果:

 

3.1.2 generateMagicSquare()

该段代码为罗伯法构造幻方

上面的开始先将1赋值最上行的中间位置,向右上角斜行,依次填入数字,如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中,同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中,如果数字{N} 右上的格子已被其它数字占领,就将{N+1} 填写在{N}下面的格子中,如果朝右上角出界,和“重复”的情况做同样处理。

此段为将写好的幻方写入文件6.txt中。

当输入负数和偶数时分别会抛出NegativeArraySizeException错误和ArrayIndexOutOfBoundsException错误,所以用try-catch,如果检测到如上错误输出错误提示。

 

流程图:

 

结果:

3.2 Turtle Graphics

实现一个绘图工具Trurtle Graphics,需要我们完成的任务为:画出一个正方形,计算正多边形内角,由正多边形内角得到边数,计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中,计算一系列点中的凸包,调用函数绘制个人艺术作品,使用junit进行单元测试。

​​​​​​​3.2.1 Problem 1: Clone and import

通过SSH公钥获取后,从IDEA的git插件直接clone文件,用idea初始化git本地仓库后,登录github账号,可以直接Clone

​​​​​​​3.2.2 Problem 3: Turtle graphics and drawSquare

该函数需要通过已知边长画出正方形,通过循环4次,每次前进40旋转90度,即可画出正方形

代码如下:

 

结果如下:

 

​​​​​​​3.2.3 Problem 5: Drawing polygons

首先我们需要计算正多边形的内角是多少,根据已知公式可以得到相关函数代码

 

根据正方形,可以推导将画笔转向角度调制内角的补角,循环边的数量,即可画出多边形

​​​​​​​

3.2.4 Problem 6: Calculating Bearings

已知起点和当前朝向角度,求起点到终点需要转动的角度,可以将起始点设为极点,通过极坐标系下的运算,能够算出需要转动的角度

 

同时,对于有多个点的时候,从第一个点先到第二个点,然后将第二个点最为起点,下一个作为终点,以此类推,,循环n-1次,即可得到旋转角的List

​​​​​​​3.2.5 Problem 7: Convex Hulls

解决凸包问题,采用Gift−Wrapping 算法。我们发现任意凸包上的点,你会发现以该点建立一个极角坐标系,该点连结其它所有点的极角中,该点逆时针方向的第一凸包点到该点极角最小,例如P0,到所有点的极角中P0P1极角最小。

算法中首先找到最左边的点,这个点必然在凸包上,然后计算该点连接点极角最小的,这里计算有技巧,算法中进行toright测试,直到找到到最右端的点,找到P1后,就可以从P1开始,接着顺次找到P2,又以P2为起点进行运算。

代码如下:

 

​​​​​​​3.2.6 Problem 8: Personal art

该函数我通过正五边形旋转十次,并给予每个五边形不同的颜色,即可花一朵五边形花朵

​​​​​​​

3.2.7 Submitting

先提交到git上,在直接提交并推送到github上

 

​​​​​​​3.3 Social Network

设计一张社交网络无向图,连接互为朋友的人与人,并且能计算任意两人之间,并且能计算两人之间需要的最少的关联路径,该问题为最短路径问题,所以利用BFS广度优先遍历即可得到两点间的最短路径。

3.3.1 设计/实现FriendshipGraph类

用两个ArrayList一个储存社交网络中的人,另一个储存人的名字

addVertex()函数:首先判断Person k是否存在于图中,若已经存在于图中,则输出错误信息并返回false,程序结束;否则将k添加到存有社交网络的人的ArrayList中。

 

addEdge()函数,首先判断读入的两个人是否存在于社交网络中,若存在,在p1的朋友列表里假如p2.

 

GetDistance()函数,用BFS广度优先遍历求最短路径,如果无法达到的返回0

 3.3.2 设计/实现Person类

Person类则储存一个人的名字,朋友列表,以及广度优先遍历所需要的标志,里面储存各个变量的接口函数。

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

main()则按照实验手册的给出的main()

​​​​​​​3.3.4 设计/实现测试用例

在测试AddVertex函数时,我们需要判断,添加一个人A后,测试A和未添加的人B是否存在,再测试添加同名的人,是否会按照实验要求提示错误信息。

 

    在测试AddEdge函数时,我们要判断,社交网络添加A,B,C后,不添加D,测试添加A到B的关系是否为单向的,不添加A到C的关系时,是否能正常返回false,还有A到D是否能正常返回错误信息。

在测试GetDistance函数时,我们要判断,社交网络在形成圈时是否能正常读取,以及在测距不存在的社交网络的人时是否能正常返回错误信息,还有当人与人不存在连接时,是否能正常返回-1

4. 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。

不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期

时间段

任务

实际完成情况

2022-04-30

13:30-24:00

编写问题1和问题2的函数并进行测试

按计划完成

2022-05-01

14:00-20:46

编写问题3和报告并进行测设

按计划完成

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

遇到的困难

解决途径

初次接触java,文件读写出现很多问题

                   通过查阅资料理解了flie类和bufferreader类等的关系与使用

             p2的英文教程在初次接触时造成了许多困难

经过耐心阅读领会了题目的意思和大致目标

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

​​​​​​​6.1 实验过程中收获的经验和教训(必答)

此次实验初次使用java,我对众多语法和结构不熟悉。但是在一段时间的钻研后,我学到了java领域的许多新奇知识,并逐渐熟悉了git、idea和junit的使用,受益匪浅。

​​​​​​​6.2 针对以下方面的感受(必答)

(1) Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?库函数很丰富,面向对象编程有很多优点和特色;

(2) 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;不够简洁,容易找不到功能。

(3) 关于Git和GitHub,是否感受到了它在版本控制方面的价值;上传版本文件很方便,节省了人为控制版本的时间成本。

(4) 关于CMU和MIT的作业,你有何感受;英语阅读有一定你难度。

(5) 关于本实验的工作量、难度、deadline;适中

(6) 关于初接触“软件构造”课程;

收获颇丰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值