HIT2022春软件构造实验1

 

2022年春季学期

计算学部《软件构造》课程

Lab 1实验报告

姓名

*****

学号

*****

班号

*****

电子邮件

*****

手机号码

*****

目录

1 实验目标概述

2 实验环境配置

3 实验过程

3.1 Magic Squares

3.1.1 isLegalMagicSquare()

3.1.2 generateMagicSquare()

3.2 Turtle Graphics

3.2.1 Problem 1: Clone and import

3.2.2 Problem 3: Turtle graphics and drawSquare

3.2.3 Problem 5: Drawing polygons

3.2.4 Problem 6: Calculating Bearings

3.2.5 Problem 7: Convex Hulls

3.2.6 Problem 8: Personal art

3.2.7 Submitting

3.3 Social Network

3.3.1 设计/实现FriendshipGraph类

3.3.2 设计/实现Person类

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

3.3.4 设计/实现测试用例

4 实验进度记录

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

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

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

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

1.实验目标概述

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

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

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

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

l 基本的 Java OO 编程

l 基于 Eclipse IDE 进行 Java 编程

l 基于 JUnit 的测试

l 基于 Git 的代码配置管理

2.实验环境配置

在官网下载了java的jdk,IDEA以及Git。并在IDEA中安装配置了JUnit。

3.实验过程

  3.1Magic Squares

编写一个程序,用isLegalMagicSquare函数在已有的txt文件中以矩阵形式读取数据,判断所存储的数据是否是符合幻方性质的矩阵。并且能够对不同情况做出反应;自己用generateMagicSquare函数创建一个符合幻方性质的矩阵,并用第一个编写的函数去判断。

 3.1.1isLegalMagicSquare()

字符输入流buf读取txt文件中的数据,创建数组magic存储txt文件中的数据。

按行读入txt文件,若读到的数据是负数、浮点数或者数据间不是以“\t”间隔,则返回false,表示不是幻方。如果最终得到的矩阵行列数不相等,说明不符合幻方要求,也返回false。

 

若前面都不返回false,说明数据格式无误,接下来用s1和s2分别存储主对角线和副对角线的值,如果不等,就返回false。如果等于,就继续判断每一行和每一列的和是否和对角线的值相等,如果存在一组不相等,就返回false,表示不是幻方;如果全部遍历完依旧没有返回false,说明该矩阵符合幻方性质,就返回true。

​​​​​​3.1.2generateMagicSquare()

该函数生成的幻方的思路大致是

首先将数字1放置在幻方最上方正中央位置,而后每次将下一个数放置在右斜上方位置,每放置n个数字行数加一。若到达第一行,则下一次到最后一行放置,否则行数减一;若到达最后一列,则下一次到第一列放置,否则列数加一。

扩展:

1.判断输入的n,如果为偶数或为负数,就返回false

 

2.将生成的幻方矩阵写入文件 \src\P1\txt\6.txt中并返回true。

 

以n=7生成幻方示例:

​​​​​​​3.2Turtle Graphics

使用git clone获得需要使用的代码,实现drawSquare函数、calculateRegularPolygonAngle函数、drawRegularPolygon函数、calculateBearingToPoint函数、calculateBearingsh函数、convexHull函数、drawPersonalArt函数,完成所有的问题,包括图形设计,并且还要通过TurtleSoupTest.java中的测试用例.

3.2.1Problem 1: Clone and import

 

 使用git clone指令获取代码。

建立一个目录,通过git init命令就可以把这个目录变成git管理的仓库。

通过各种git命令就可以管理本地开发了。

3.2.2Problem 3: Turtle graphics and drawSquare

 

 每执行一次sidelength长度,就转90度,重复四次,就可以完成一个正方形,如图所示:

 

 3.2.3Problem 5: Drawing polygons

正n边型每个内角的度数为180*(n-2)/n度。

故这么实现calculateRegularPolygonAngle函数

 

 测试通过。

 

 然后实现drawRegularPolygon函数,只需要画n次,每次画完旋转即可

 ​​​​​​​3.2.4Problem 6: Calculating Bearings

先实现calculateBearingToPoint函数该函数根据当前点,当前朝向与目标点坐标计算指向目标点的方位角。当算出来的角度小于0时,加上360之后再返回。

 再实现calculateBearings函数,将“起点”选为第一个点(坐标(xCoords.get(0),yCoords.get(0)));循环n-1次(n为点的个数)每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中;将下一次的“起点”用当前“终点”更新,继续循环;退出循环后返回List。

 测试通过

 

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

根据提示,这里求凸包时利用The gift-wrapping algorithm,具体步骤如下:

1)先找到所有点中最左下角的点,即x最小,y最小

2)将1)中的点作为初始点,从初始点开始寻找和它夹角最小的点,如果出现夹角相等的情况取距离远的点

3)将2)中取到的点作为新的点,重复操作,直到取到的点是最开始设置的初始点

另外calculatePolygonSidesFromAngle函数

 

 

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

 

  

 ​​​​​​​3.2.7Submitting

如何通过Git提交当前版本到GitHub上你的Lab1仓库。

$git clone将Lab1仓库内的文件夹拷贝到你的本地仓库文件夹

在本地仓库文件夹下,进入拷贝得到的文件夹,打开git bash,键入命令行序列:

$git add .

$git commit -m “statement”

$git push origin master

3.3Social Network

该任务要求实现Person和FriendshipGraph两个类,用FriendshipGraph来构建Person之间的关系来模拟一个社交网络,能够计算出每两个Person之间的社交距离。

3.3.1设计/实现FriendshipGraph

 

 对于addVertex(Person p)函数,要先将现有人的名字和新准备加入的名字进行比较,如果相等,说明有名字重复,程序结束,如果不相等再加入。

 

 对于addEdge(Person a, Person b)函数,要注意参数的传递顺序,是将b存到a的next列表中,这样可以方便扩展到有向图。

 

 对于getDistance(Person a, Person b)函数,借助队列利用BFS算法求解从p1到p2的最短路径,当p1和p2相等时,直接返回0。先创建哈希表distance,其中key为每个人,value为boolean类型,如果该人已经被访问过了,value = true。

 ​​​​​​​3.3.2设计/实现Person

 

具体实现代码如下:

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

 

 运行程序,结果为:

 

 与预期相同,如若注释掉第10行,即rachel和ross之间只存在单向的社交关系 ross->rachel

 结果如图。

 

若有名字重复

 

就会输出

打印重复的名字,并结束程序。

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

检测重复名字错误

 

 接下来两个是对于图中点的距离测试。  

  

 4.实验进度记录

日期

时间段

任务

实际完成情况

2021-05-03

14:30-15:30

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

按计划完成

2021-05-04

19:30-22:30

编写问题2的各类函数并测试

延期1天完成

2021-05-06

15:10-17:50

编写问题3的social work

延期半小时完成

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

遇到的困难

解决途径

对于Java不熟悉

遇到困难就网上查相关资料

不会使用git

搜索git常用指令,实践中学习

bfs算法生疏

查看数据结构课本

6.实验过程中收获的经验教训、感想
6.1实验过程中收获的经验教训(必答)

熟悉了java程序的基本编写方式,体会到java的强大,同时也对git的各种指令有了初步的了解,在实验过程中认识到自己所掌握的知识还不够,对时间的安排也不恰当,动手能力有待提高。

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

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

Java很棒,功能强大,自带许多库函数,但是由于函数过多,可能在使用中会有许多迷茫。

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

Eclipse插件编写更容易,使用资源少,但稍微负载就出现不兼容情况,新版本与旧版本的插件也不兼容。

IDEA调试功能强大,开发效率高,重构更智能。但maven功能集成度一般,console多且分散。

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

感受到,在版本控制方面很方便

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

可以显著提高学生的动手能力,在实践中学习。

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

感觉工作量有点大,难度稍高,deadline在5.8,与考试时间冲突,有点赶

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

对于编写代码有了更多实践的机会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值