哈工大软件构造Lab1

1 实验目标概述

本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO

发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够

为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。

另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。

l 基本的 Java OO 编程

l 基于 Eclipse IDE 进行 Java 编程

l 基于 JUnit 的测试

l 基于 Git 的代码配置管理

2 实验环境配置

简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。

特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

本次实验我用的开发环境是IDEA原因是我的eclipse没法从官网下载,多次尝试无果.而在IDEA中运行代码时出现了无法导入junit的问题

解决方法:

在项目结构中接口设置中将junit文件导入即可

Git的ssl地址也需要配置,配置过程中按照网上所给的用vim/cat文本编辑器查看密钥无果后我选择用记事本方式打开,解决了问题

在这里给出你的GitHub Lab1仓库的URL地址。

git@github.com:ComputerScienceHIT/HIT-Lab1-120L020709.git

3 实验过程

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

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

3.1 Magic Squares

主要任务:从txt文件中解析数据,并判断数据是否构成一个幻方,通过5个文件进行测试。同时阅读和改进产生幻方的代码,并进行测试。

3.1.1 isLegalMagicSquare()

首先,需要从txt文件中读出数据,读txt文件可以使用固定的格式,即使用BufferedReader并用try-cache语句处理异常。

用一个二维动态数组存储数组内容,try-cache捕获异常并按照指定方式提示错误信息.

3.1.2 generateMagicSquare()

这个方法的实现关键在于幻方的填法,这里用到的方法是奇数幻方填法,就是不断向当前位置的右上方移动,因此每当输入n个数时肯定就会回到原来的位置,进而我们需要向下移动一位然后继续循环.所以当n是奇数的时候,每输n个数进去当前的位置永远不会在最后一行,但偶数就没这个性质.所以在代码中,每当执行到i是n的倍数时,若n是奇数,就可以保证row<n-1,即row++后仍然在数组定义的大小范围内;而若n是偶数,则保证不了row!=n-1,若刚好n==n-1了,那程序就出错了。

程序拓展方面选择增加异常处理和输出异常到控制台.

3.2 Turtle Graphics

这个任务要求根据函数的注释补全代码,实现一系列绘图可能用到的功能。包括画出正方形、计算正多边形的内角、计算对应内角的正多边形边数、计算绘图时的角度转移、计算凸包、以及绘制自己独特的图形。

3.2.1 Problem 1: Clone and import

由于我用的是IDEA,所以直接git clone后出现了大范围的报错,在采用”用IDEA优雅实现实验一”的博客中的方法后,出现了模块重叠的问题,(不知道是版本问题还是什么),不过通过文件资源管理器将P2复制到src这一步我做对了,后通过研究报错内容和提示解决方法,知道是由于P2复制到src中后turtle中的包应该是P2.turtle,因为它原本的包结构中P2是source层,总之,改正之后程序就能正常运行了

3.2.2 Problem 3: Turtle graphics and drawSquare

这一部分要求我们画正方形,阅读Turtle.java,发现了forward()和turn()函数,那么画正方形就很好实现了,让小乌龟循环走四步就可以了,每次前进距离为正方形的边长(forword(length)),然后旋转90度(turn(90))(这里注意到旋转是顺时针旋转,后面有用到).

3.2.3 Problem 5: Drawing polygons

这里要实现两个程序:参数为正多边形边数,求内角大小;参数为正多边形内角,求正多边形边数 公式是:内角=180-(360/n)

要注意的是,小乌龟转过的角度相当于多边形的外角才能构成图形

3.2.4 Problem 6: Calculating Bearings

这里实现两个函数,一个给定当前小乌龟的坐标和朝向,计算起点和终点所连直线的斜率,利用arctan函数得到最终朝向的角度,它和当前朝向的差值就是要转过的角度.计算顺序就是纯粹数学问题了.

这里对函数结构进行了一定的修改,由于解凸包问题时还要用到坐标,直接将

另一个函数用于计算经过一系列点时每次要转过的角度,已知初始朝向,按顺序在列表中取出两个点,调用calculateBearingToPoint()就可以得到这两个点之间需要转过的角.修改当前朝向为转向之后的角度,就可以进行下一次计算.

要注意的是,角度有可能超过360,需要减去360

3.2.5 Problem 7: Convex Hulls

计算凸包问题,可以利用前面的计算夹角函数,每次计算与当前点夹角最小的点,如果有多个,选择距离最远的点,这里的点使用集合HashSet类存储

首先用循环找出平面上最左下角的点,然后用calculateBearingTopoint函数计算最小角,由于其坐标Point函数构造时用的是double型,所以就修改了函数参数类型,全为double型

注:原本我用的是angle<90的判断,结果在angle=90时测试无法通过,找了半天,才发现没考虑全

当偏角相同时,选择距离更远的点

3.2.6 Problem 8: Personal art

这里用已有的前进函数和变色函数让小乌龟爬出一个自己喜欢的图形,根据转角和步长实现,没有详细设计.

3.2.7 Submitting

直接点击Git-commit 将改过的P2版本提交到本地仓库后,再点击Git-Push,将P2放进去即可,或者也可以用命令行,commit后push

3.3 Social Network

这个任务要求按照功能需求设计类和类的方法,以达到构建社交关系网的目的,实现节点,边的增加以及求最小距离等功能.同时还要求编写测试程序

3.3.1 设计/实现FriendshipGraph

有了person类后我们可以看出,FriendshipGraph类中只需存储一个person类的列表即可,为了避免我们每加入一个新人时为了判断名字是否重复都要循环整个图中所有的节点调用getname函数获取他们的名字

又按照实验的提示FriendshipGraph类中要求有addVertex,addEdge,getDistance的方法

要注意:添加新人时要求名字不能有重复,添加新边(关系)时它要满足以后向有向图的扩展的需要:双向都要有边,这时就为person类中加上一个朋友列表提供了理由

3.3.2 设计/实现Person

关系网中的节点,变量应包括名字和朋友的一个列表

创建构造方法用于初始化对象

创建类的两个方法用于获取成员名字,添加朋友(对应添加边),获得朋友名单

为了方便找最短路径,在类中加上一显示节点在树中遍历层数的标识位,根节点设为0,以此类推.

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

题目要求中有写

1. FriendshipGraph graph = new FriendshipGraph();

2. Person rachel = new Person("Rachel");

3. Person ross = new Person("Ross");

4. Person ben = new Person("Ben");

5. Person kramer = new Person("Kramer");

6. graph.addVertex(rachel);

7. graph.addVertex(ross);

8. graph.addVertex(ben);

9. graph.addVertex(kramer);

10.graph.addEdge(rachel, ross);

11.graph.addEdge(ross, rachel);

12.graph.addEdge(ross, ben);

13.graph.addEdge(ben, ross);

14.System.out.println(graph.getDistance(rachel, ross));

//should print 1

15.System.out.println(graph.getDistance(rachel, ben));

//should print 2

16.System.out.println(graph.getDistance(rachel, rachel));

//should print 0

17.System.out.println(graph.getDistance(rachel, kramer));

//should print ‐1

3.3.4 设计/实现测试用例

分别测试有addVertex,addEdge,getDistance方法

依次为:加入一成员,查看图中是否有该成员;

加入一条边,查看成员的friend集中是否成功加入了朋友;

构建一个图,分别对不同距离的成员对调用getDistance方法,与预期的距离作比较

4 实验进度记录

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

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

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

日期

时间段

任务

实际完成情况

2022-05-05

18:30-19:30

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

按计划完成

2022-05-06

编写问题1的剩余代码

按需求完成

2022-05-07

10:00-18:40

编写问题2,3的相关代码

按需求时间完成

2022-05-08

完善代码

按计划完成

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

遇到的困难

解决途径

文件不会读写

百度

对Java类的理解不到位

向同学请教

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

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

理解题意是先决条件,不能蒙头写

知识点虽然琐碎,但是整体掌握后就好写

有问题就直接查

问问题的时候一定言简意赅,而且要提前组织好语言

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

  1. Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?

一开始接触确实不太习惯,但是它的面向对象的编程方法确实还是比较好用的

  1. 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;

这个据网上的说法是IDEA比eclipse要强很多,我本人只了解到了,eclipse在我的电脑上安装不上,IDEA就安装的很顺利

  1. 关于Git和GitHub,是否感受到了它在版本控制方面的价值;

这个工具确实很好用,很方便

  1. 关于CMU和MIT的作业,你有何感受;

除了英文确实需要去习惯外,难度方面其实比较适中

  1. 关于本实验的工作量、难度、deadline;

一开始觉得很难,因为并没有实际接触过java,再加上又有别的事情耽搁,所以有点被吓住了,感觉工作量很大很大,但是其实在deadline之前并没有花多少有效时间在真正沉下心去了解,直到5月7号从早上10点肝到晚上18:40,连做8个多小时后,才算了解了整个结构,其实主要就是一开始的适应比较困难,过去了其实就只要有问题问就ok

  1. 关于初接触“软件构造”课程;

感觉学的东西很多,整体架构啊,各种测试方法啊,内容挺丰富的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值