• 欢迎光临~

软件构造 Lab 1

开发技术 开发技术 2022-06-07 次浏览

下面是实验一的实验报告,对其进行重新编排转化为markdown格式,并在重新回顾的过程又获得了新的感悟和思考。

软件构造 Lab 1

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

Lab 1实验报告

姓名 赵伟东
学号 120.........
班号 2003...
电子邮件 986579251@qq.com
手机号码 1660929....

目录

1 实验目标概述......................................................................................................................................... 1

2 实验环境配置......................................................................................................................................... 1

3 实验过程.................................................................................................................................................. 2

3.1 Magic Squares.................................................................................................................................. 2

3.1.1 isLegalMagicSquare().................................................................................................. 2

3.1.2 generateMagicSquare()............................................................................................... 2

3.2 Turtle Graphics................................................................................................................................. 2

3.2.1 Problem 1: Clone and import................................................................................................ 3

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

3.2.3 Problem 5: Drawing polygons.............................................................................................. 3

3.2.4 Problem 6: Calculating Bearings.......................................................................................... 3

3.2.5 Problem 7: Convex Hulls....................................................................................................... 3

3.2.6 Problem 8: Personal art.......................................................................................................... 4

3.2.7 Submitting................................................................................................................................. 4

3.3 Social Network................................................................................................................................. 5

3.3.1 设计/实现FriendshipGraph类.................................................................................... 5

3.3.2 设计/实现Person类........................................................................................................... 6

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

3.3.4 设计/实现测试用例.............................................................................................................. 6

4 实验进度记录......................................................................................................................................... 7

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

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

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

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

1 实验目标概述

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

l 基本的 Java OO 编程

l 基于 Eclipse IDE 进行 Java 编程

l 基于 JUnit 的测试

l 基于 Git 的代码配置管理

2 实验环境配置

首先按照Lab0实验指导的提示,安装好JDK-11、Eclipse、IDEA和Git。然后再本地配置JDK环境变量,打开高级系统设置查看环境变量,再系统变量中新建环境变量JAVA_HOME,并将值链接到jdk-11.0.15所在的路径;再在Path变量中新建一个值,链接到%JAVA_HOME%bin。

在了解了一些Java特性和Git的常用命令后,使用IDEA创建了新的项目,并书写了第一个Helloworld程序,初始化了本地仓库,跟踪并提交了文件并Push到了GitHub上。

按照实验指导配置下载Junit所需的jar包,并添加到测试类路径,按指导配置好Maven后,书写自己的test文件,对一个简单的数值返回函数进行测试。

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

​ 由于之前安装过JDK-8,并且距本次实验时间较长,忘记了其安装路径,开始的时候不知道该先卸载JDK-8或者该怎么覆盖安装。通过查询资料得知,IDEA/Eclipse在开始一个工程的时候可以选择不同的JDK,所以只需要在环境变量增加对应的JDK即可,具体JDK的使用可以在创建工程或之后调整。

​ 指导中关于Java的教学都是英文,对于初学者不是很友好,可以自己借阅其他Java的指导书学习。

​ Git本地在与GitHub关联的时候,由于对命令掌握的不够,导致无法clone

​ 首先需要在终端执行ssh-keygen命令按几次回车生成公私钥,将.ssh/id_rsa.pub 文件中的公钥内容复制出来,在GitHub网页上添加公钥。然后够我们就可以克隆Github上的仓库到本地了。

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

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

3 实验过程

3.1 Magic Squares

Magic Squares是一个正整数组成的正方形,其每行、每列以及对角线的数字之和都相等。本次实验需要实现两个任务。

其一,编写一个函数来检查一个矩阵是否是Magic Squares,能将文本文件当作参数输入,并得到输出。并且能够处理输入文件的各种特殊情况并给出错误提示信息。

其二,对代码原本提供的generateMagicSquare函数进行扩写,使其能够产生一个MagicSquare并将其输出到6.txt文件中,

3.1.1 isLegalMagicSquare()

首先对行数和列数进行判断,创建两个BufferedReader对象来分别从文件中读取行数和列数。对于每一行使用String类的split方法,将分隔符设置为”t”,来获取列数,如果行列数不同,返回false输出提示信息。

然后对每个元素进行判断,设置正则表达式match=”[d](file://d)”来匹配整数,如果元素不匹配match或者小于0则返回false输出提示信息。

如果匹配都相等则将矩阵记录在二维数组中,分别计算行、列的和,以及对角线的和,如果出现不相等,返回false输出提示信息。

如果都相等则输出正确提示信息,返回true。

3.1.2 generateMagicSquare()

在理解了生成MagicSquare之后,添加写入文件步骤,加入try{}catch(){}语句处理异常,创建一个File对象,输入文件路径名。创建BufferWriter来写入文件,并使用”t”来分隔数字,每行输入结束后使用”n”换行。

3.2 Turtle Graphics

使用Turtle Graphics绘图工具,完成四个任务:绘制一个正方形;完善计算正多边形的函数,实现从内角到变数,从边数到内角的计算,并绘制正多边形;计算一系列点的凸包;绘制一个自定义绘画。

3.2.1 Problem 1: Clone and import

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。

从GitHub获取该任务的代码:在GitHub打包下载代码。

在本地创建git仓库:

  1. git init初始化本地仓库

  2. git add remote添加远程库源

  3. 在远程仓库创建master分支

  4. git pull origin master将远程仓库同步到本地

  5. git add . 、git commit -m “” 、git push将本地文件加入到本地仓库,将本地仓库同步到远程仓库。

3.2.2 Problem 3: Turtle graphics and drawSquare

通过四次循环,每次使用forward前进,并使用turn旋转90°即可得到正方形

3.2.3 Problem 5: Drawing polygons

首先根据公式,正多边形的内角等于180-(360/边数)补全函数calculateRegularPolygonAngle。注意,返回值为double类型,应将180和360变为180.0和360.0

补全函数calculatePolygonSidesFromAngle,由上边的公式逆向递推即可,但应注意对double类型小数部分的处理

最后,补全drawRegularPolygon,根据输入多边形的边数,如果边数小于等于2或者边的长度为负,直接返回,否则循环sides次,每次向前sideLength,然后旋转内角180-内角的度数。

3.2.4 Problem 6: Calculating Bearings

首先,补全calculateBearingToPoint函数,通过调用Math类中的atan2来计算前进方向与x轴正向夹角,并把该角度转换为y轴正向的夹角,如果角度为负数的话,加上360来使度数处于0-360的范围。

然后补全函数calculateBearings,计算输入的列表中的每两个相邻点的夹角,保存在列表angle并返回

3.2.5 Problem 7: Convex Hulls

使用 gift-wrapping algorithm算法来计算给定集合的凸包,当点集中只有两个点、一个点或者没有点,直接返回点集。首先寻找最左侧的点,然后寻找该点到剩余点中偏转角度最小的一个点 (如果两个点偏转角度相同,则选取距离最远的那个),将找到的点作为下一个基点,直到下一个基点为最左侧的点,过程结束。

软件构造 Lab 1

3.2.6 Problem 8: Personal art

通过循环,改变每次前进的距离和每次画笔的颜色画出多个不同大小的五角星,重叠在一起

软件构造 Lab 1

3.2.7 Submitting

  1. 在HIT-Lab1-120L052314文件夹目录下打开git-bash

  2. git add . 对所有文件添加追踪

  3. git commit -m “P2” 提交到本地仓库并备注P2

  4. git push 同步到远程仓库

3.3 Social Network

实现FriendshipGraph类和Person类来表示一个社交网络中的无向图,图中每个节点代表一个人,每条边代表两个人之间具有社交关系,并且两个人之间应该有两条相互的边以便未来扩展到有向图。需要实现增加节点(即向社交网络中加入一个人)、增加边(即增加两个人的社交关系)、求两个人之间的距离对应的三个函数。

3.3.1 设计/实现FriendshipGraph类

FriendshipGraph类中首先要有一个列表用来存储Person节点,可以使用ArrayList类来实现,将变量名命名为Vertex。

实现FriendshipGraph类的第一个函数addVertex,输入一个Person对象,判断此对象中的人名是否在图中,如果在图中,抛出异常。否则使用List接口中的add方法将此对象添加到列表中。
软件构造 Lab 1

然后实现函数addEdge,如果输入的Person对象是同一个,则抛出异常,否则调用Person对象的addFriend方法,将B添加为A的朋友,即在A对象的成员变量List Friends 中添加B。

软件构造 Lab 1

最后实现函数getDistance函数,该函数输入两个Person对象,根据图中的距离返回一个整数。在查阅资料的过程中,发现接口List和Queue的实现类LinkedList可以实现双向队列,而接口List的实现类Stack在Java中使用的并不多,所以采用LinkedList来实现先广遍历来获取距离,并用HashMap类的键对值来记录距离。先将第一个对象加入LinkedList队列personQueue。当队列不为空时,将队列头元素删除,并将值赋给变量topPerson,遍历topPerson的friends,如果其friends未被访问,将其和此时的tempDis+1记录到HashMap中,并将此节点加入到遍历队列,如果这个过程中找到第二个对象,就根据键值对返回距离。遍历后如果没有找到第二个对象,返回-1。

为了便于添加测试范例,加入existP方法来判断Person对象是否在其中。

软件构造 Lab 1

3.3.2 设计/实现Person类

首先很容易想到添加一个name成员变量,并就此创建一个构造函数来初始化。将name定义为private类型,所以添加了getName方法。最初考虑在FriendshipGraph类中添加Edge成员变量来记录社交关系,但其类型和维护以及距离的获取不容易实现,所以Person类中添加LinkList Friends成员对象,并添加getFriends方法来获取其Friends成员对象,添加addFriends方法来为对象添加朋友。

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

将实验指导中的案例复制到main方法中。

3.3.4 设计/实现测试用例

创建对象测试,调用exitsP方法和assertTrue检测是否成功创建。

加入社交关系测试,在一个图中添加几个节点,使用addEdge添加社交关系,创建一个LinkedList<Person>的临时变量,将一个对象的friends添加进去,调用getFriends和assertEquals方法来测试是否相同。

获取距离测试,添加不同的节点,使用assertEquals方法来测试同一个顶点的距离、两个相邻顶点之间及其反过来的距离,两个不相邻顶点之间及其反过来的距离,两个不连通的顶点之间的距离。

4 实验进度记录

日期 时间段 任务 实际完成情况
2022-04-29 18:30-19:30 初步尝试编写isLegalMagicSquare函数 延期1小时完成
2022-04-29 19:45-21:30 继续编写isLegalMagicSquare函数并对其进行测试 按计划完成
2022-04-29 22:00-23:00 编写generateMagicSquare函数并完成测试 按计划完成
2022-04-30 19:00-20:00 完成P2中的Problem0-5 延期半小时完成
2022-04-30 20:45-23:45 完成P2中剩下的problem并完成测试 延期一个小时完成
2022-05-01 22:45-0:00 编写FriendshipGraph类 遇到困难,没有完成
2022-05-05 20:00-21:00 编写Person类和FriendshipGraph类 按计划完成
2022-05-06 16:00-17:00 优化上边两个类并编写test测试用例 按计划完成

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

遇到的困难 解决途径
读入/写入操作 借阅相关Java指导书,学习相关类和方法
Git相关操作 在蓝桥云网站中,进行了学习和应用演练
对Java中的集合了解不够 借阅相关Java指导书,学习了接口和集合的相关知识,能初步应用List接口、Queue接口和Map接口以及对应的实现类和方法。
对于数学知识的补充 查询相关网站,复习了相关算法

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

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

本次实验收获了许多宝贵的经验,了解了Java的一些特性、方法与类库。逐渐熟悉了环境的配置与Git的使用,打开了我一直想去探索而没有走出去的领域。

同时也获得了许多教训。在编程知识方面,一定要多多阅读,全面地掌握其用法不能想当然地应用某个东西,非常容易出错。在环境配置和使用一个新工具时,也要多查阅资料,并学会取其精华去其糟粕,对比地去吸收知识。

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

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

非常对味,我觉得Java用起来非常方便而且简洁明了,相比之下,之前学的C++给我一种庞大而复杂的感觉,不是说C++不好,许多功能在Java中都能更简易并且高效地实现,比如本次实验进行过程中阅读资料习得的泛型、接口和集合,在C++中也有对应的模板和多重继承等等,但是在C++的学习过程中,感觉到这些内容非常晦涩而不近人情,应用起来比较难,而Java则很形象地阐明了这些操作以及其用途。

(2) 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;

非常好用,尤其是自动提示与纠错功能,对于初学者十分友好。

但是由于其功能强大,刚开始的时候会给人一种眼花缭乱之感,还需进一步地学习

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

对于命令的掌握还不够,目前只是感觉到Git在远程上传和管理方面的价值,能较为便捷地上传和载入一个仓库来进行编程,并没有感受到版本控制的便捷。Github本身并没有给我太深刻的印象,我将其当作一个存储代码和代码版本控制的云端服务器,但是其社区让我感觉非常强大,我像是打开了新世界一般,畅游在这个社区,汲取着知识。

(4) 关于CMU和MIT的作业,你有何感受;

有一种循序渐进的过程,但是英文教程的障碍确实不小。

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

适中

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

感觉就是从冰冷的代码逐渐变得生动,变得有意思,能够亦步亦趋地去应用这个东西,期待后面的课程与实验。

程序员灯塔
转载请注明原文链接:软件构造 Lab 1
喜欢 (0)