HIT软构Lab1心得

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

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.       实验环境配置

本次实验开发测试运行的环境为IDEA,在配置环境的过程中,主要遇到的是JDK版本实验要求不符的情况,打开IDEA集成开发环境工具,点击:File--Project Structure进行JDK的更改。

安装Junit

Idea自带,根据提示配置成功。

GIT安装:

根据Lab0提示下载安装。

3.        实验过程

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

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

3.1        Magic Squares

读取五个文本文件,并检查其中矩阵行列对角线值,并判断他是否为幻方矩阵。

3.1.1        isLegalMagicSquare()

按步骤给出你的设计和实现思路/过程/结果。

FileReader文件字符输入流,BufferedReader缓冲输入流,将字符串并保存在一个String类型的tmp字符串中,并加入集合list中。

定义int类型row记录行列式的行数,将字符串每行用“\t”split分隔,记录length为列数(如果输入格式中未用“\t”分隔,此时列数并非真实的列数),length不等于row时,输出错误提示,return false。

采用Integer的valueOf()方法判断是否存在非整数和非正数的情况。

计算行、列、对角线上数字和的值,进行判断是否符合幻方矩阵的性质。

3.1.2        generateMagicSquare()

流程图

判断n不合法的情况,return false。

n合法时,对n*n的矩阵进行填充。从第一行中间位置(0,n/2)开始填充,1赋值给初始位置。进行边界检查,达到上边界时,跳至下边界。其他情况正常row--。达到右边界时,跳至左边界。其他情况时正常col++。当i能被n整除时,下移一行,赋值为i + 1,然后继续循环赋值。当循环n的平方次后,则生成好了n*n的幻方矩阵。

输出生成的幻方矩阵并且写入6.txt文件中。

 

3.2 Turtle Graphics

利用git clone 获取代码,根据注释补全代码,实现一系列绘图可能用到的功能:画出正方形、计算正多边形的内角、计算对应内角的正多边形边数、计算角度转移(以某点作为出发点,面向某个方向,要前往指定坐标点,需要转过多少角度)、求解凸包问题、以及绘制自己独特的图形。​​​​​​​

3.2.1 Problem 1: Clone and import

git init 用于初始化项目

克隆项目的地址 git clone xxx ,显示100%时就代表项目克隆成功

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

调用已经实现的forward和turn函数,向前走sideLength,转90°角,实现正方形的绘制。

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

calculateRegularPolygonAngle()函数求解给定边数的正多边形的内角度数。

每次前进sidelength,转向的角度为外角的度数(通过调用calculateRegularPolygonAngle()函数得到),循环次数为边数

calculatePolygonSidesFromAngle()函数求解给定正多边形内角大小的边数。

绘制边长为40的正八边形

Problem 6: Calculating Bearings

以某点作为出发点,面向某个方向,要前往指定坐标点,需要转过多少角度。我们通过调用math.atan2函数,计算角度,最终确定转角。

​​​​​​​​​​​​​​3.2.4        Problem 7: Convex Hulls

当点集中的点少于等于两个时,凸包由点集中的所有点组成,直接将两点返回。

当大于两个点时,选择最左下的角作为出发点,通过循环遍历整个点集,查找横纵坐标最小的点。找到该点后记录下来,并加入到凸包的点集中。之后开始对点集进行遍历,找到偏角最小的点依次加入集合。出现两个点转向角相同的情况时,选择距离更远的点。当筛选下一个点又返回到起始点时,说明形成一个闭环,返回结果点集。

​​​​​​​​​​​​​​3.2.5        Problem 8: Personal art

通过调用drawRegularPolygon()函数,在循环中实现正多边形的绘制,每次绘制完一个正多边形,角度转10度,形成对称规律的图形(形似花朵)。简单绘制茎秆和叶子(平行四边形)。

绘制结果:

​​​​​​​3.2.6        Submitting

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

打开GitBash,输入git push origin master即可。

​​​​​​​​​​​​​​3.3        ​​​​​​​Social Network

该问题需要我们将社交网络建模为一个无向图,其中每个人连接到零个或多个用户。

3.3.1        设计/实现FriendshipGraph类

首先定义集合来存储people和name。addVertex:起到添加朋友的作用,定义hashset方便判断重复情况。

AddEdge:起到添加到边的作用,本问题拟刻画的社交网络是无向图,但类设计需要支持未来扩展到有向图。所以在两个 Person 对象 A 和 B 之间增加一条边时需要同时调用 addEdge(A,B)和 addEdge(B,A)两条语句。

getDistance:利用HashMap采用广度优先算法获取最小距离,未联通时返回值为-1.

3.3.2        设计/实现Person类

设计存储String类型存储person的name,存储人的朋友集合FriendshipList以及AddFriend,getName,getFriendshipList方法。

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

输出与测试样例结果一致。

注释掉“graph.addEdge(rachel, ross)”

Rachel与任何人都不相邻,返回-1;自己到自己的距离为0,getDistance(rachel, rachel)返回0。

如果将第 3 行引号中的“Ross”替换为“Rachel”,违反了“Each person has a unique name”的约束条件,此时提示出错并结束程序运行。

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

针对addVertex测试:主要测试添加人的情况,首先测试是否能加入person a 和 b,其次测试重复的person(b)加入后,是否会输出FALSE而使程序终止。

针对addEdge测试:测试无向图中是否成功加入了加入边ab。

对getDistance的测试:构建无向图,检验距离是否与预期吻合。

4.        实验进度记录

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

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

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

日期

时间段

任务

实际完成情况

2022-03-06

16:00-18:30

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

按计划完成

2022-03-08

14:00-16:30

根据注释补充问题2的TurtleSoup代码

遇到困难,未完成,凸包问题未完成

2022-03-08

18:00-19:00

补充问题2的凸包算法代码

按计划完成

2022-03-10 

14:00-16:00

编写问题3的主要代码

延期半小时完成

2022-03-11

14:00-16:00

编写问题3的测试

按计划完成

2022-03-12

14:00-15:00

优化代码

按计划完成

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

遇到的困难

解决途径

初学JAVA做实验的时候有思路,但是不知道JAVA中用什么方法来实现

查阅资料,积累经验,增强自己对java语言的掌握

初次使用Git,中间出错很多次

在CSDN上查找资料,并进行实践

初次接触凸包问题,对解决凸包问题的算法不是很了解

查询资料进行学习,学习算法内在的思想,并完善自己的代码

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

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

        初次使用Java语言进行编程,先大致了解了IDEA集成开发环境工具的使用。并且在实验中发现了自己存在很多不足,边做实验边学习,使得自己对Java编程更加熟悉。同时,在本次实验第一次接触Junit单元测试进行边测试边编程的方式写程序,发现程序健壮性得到了显著性提高。此外,在本次实验我还了解了GitGit是一款源代码管理工具,我们写的代码需要使用Git进行管理。在网上学习了Git的基本操作,并且动手实践。

       在本次实验,我也深刻地意识到自己对Java的语法掌握不好,写代码时总有“心有余而力不足”的感觉,常常需要查阅资料,极大的降低了效率,在以后的学习中会注重巩固自己的基础知识,对Java语法能够更加熟悉并且熟练地掌握。

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

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

较好。

优势:Java提供的库函数功能十分强大,有大量封装好的方法。

不足:Java删除了指针,所以不如C语言灵活,并且不像C语言那样写代码直接编译运行,需要自己创建class等等。

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

我使用的是IDEA,我认为它的优点是它能生成某个类的测试类,还能正确的放到test相应的目录下,此外它还有着强大的整合能力例如:精准搜索、提示功能的快速、Git等等。缺点是,idea使用的是内存空间,会把创建的索引都保存到内存中,而实际占用的cpu少。

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

感受到了,支持保存原版本和多设备查看。

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

喜欢MIT作业的形式,可以根据规约来实现方法,也是对自己编程的一种锻炼,完成后进行test还可以更好的检验。

完成CMU的作业巩固了自己对Java语法的学习。

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

工作量中等偏多,但是给的时间很充裕,难度的话我认为凸包算法那部分较难,由于本学期刚刚接触算法,所以觉得有些吃力。Deadline时间合理。

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

我认为这门课很好,将理论与实践很好的结合了,真正地去了解了开发软件时的一些事项,为未来同学们的实习和就业都奠定了良好的理论基础和实践基础。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值