【无标题】

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

Lab 1实验报告

姓名 刁浩宇
学号 120L020120
班号 2003010
电子邮件 120L020120@stu.hit.edu.cn
手机号码 13231750698

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Magic Squares 1
3.1.1 isLegalMagicSquare() 1
3.1.2 generateMagicSquare() 2
3.2 Turtle Graphics 3
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 4
3.2.5 Problem 7: Convex Hulls 5
3.2.6 Problem 8: Personal art 5
3.2.7 Submitting 7
3.3 Social Network 7
3.3.1 设计/实现FriendshipGraph类 7
3.3.2 设计/实现Person类 9
3.3.3 设计/实现客户端代码main() 10
3.3.4 设计/实现测试用例 11
4 实验进度记录 13
5 实验过程中遇到的困难与解决途径 14
6 实验过程中收获的经验、教训、感想 14
6.1 实验过程中收获的经验和教训(必答) 14
6.2 针对以下方面的感受(必答) 14

1实验目标概述
本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
基本的Java OO编程
基于IntelliJ IDEA进行Java编程
基于JUnit的测试
基于Git的代码配置管理
2实验环境配置
Java18、IntelliJ IDEA、Git
https://github.com/ComputerScienceHIT/HIT-Lab1-120L020120.git
3实验过程
3.1Magic Squares
任务的第一部分是设计一个函数检测 5 个文本文件中的矩阵是否是幻方(幻方定义是首先为方阵,其次行列,对角线之和均相等)其中涉及对于非法输入的处理等;第二部分是使用给定的一个函数生成幻方,并检测,这一部分同样涉及对于非法输入的处理。
任务的第一部分是设计一个函数检测 5 个文本文件中的矩阵是否是幻方(幻方定义是首先为方阵,其次行列,对角线之和均相等)其中涉及对于非法输入的处理等;第二部分是使用给定的一个函数生成幻方,并检测,这一部分同样涉及对于非法输入的处理。
3.1.1isLegalMagicSquare()
首先,实验的第一步是读取 txt 文件中的内容部分,本代码中采用的是java.io包中的函数实现这一功能的。当读取到信息后首先进行非法数据检测,如果出现非数字,非整数等非法字符或出现不是方阵或是数据没有以\t 分割,分别输出错误信息并退出程序。其中非整数和非数字分别手动输出false,不是方阵或者数据没有以\t分割的通过try catch捕获Runtime Exception在这一遍历过程中将 txt 中读到的数据填到一个二维数组中作为判断使用。
接下来判断是否是幻方,采用的方法是首先计算主对角线上的和作为比较标
准,接着遍历计算每一行、每一列的和,如果与主对角线和不同,输出 false,
如果遍历结束发现都符合条件那么输出 true。代码片段如下:
在这里插入图片描述
3.1.2generateMagicSquare()
这一函数如果输入的参数为偶数将会出现报错,主要原因的如果参数是偶数
那么第一步找正中的过程将会找不到一个满足的格,那么将报错。如果是负数的
话由于方阵不可能元素个数不可能是负数因此报错。对于这两种情况实验代码都
进行输出错误原因后退出程序。
在这里插入图片描述
3.2Turtle Graphics
3.2.1Problem 1: Clone and import
首先需要获取代码,采用的方法是将本地仓库与代码仓库连接之后使用 git pull 命令获取需要的代码文件。在本地使用 git 管理时需要先对需要管理的文 件夹使用 git init 命令初始化之后,使用 git add,git commit 等命令进行管 理。最后使用 git push origin master 命令将代码上传到 github 仓库中。
3.2.2Problem 3: Turtle graphics and drawSquare
本函数主要是需要画一个正方形,函数中给出了正方形的边长,所以我们只需要前进边长个距离然后转90度即可所以引用四遍forward()函数和turn()函数。
在这里插入图片描述
3.2.3Problem 5: Drawing polygons
该问题主要让我们实现calculate Regular Polygon Angle函数(给定边数),我们知道正规多边形外角和为360°所以我们计算出外角大小用180减去即可
同时我还实现了calculate Polygon Sides From Angle函数,同理
在这里插入图片描述
然后实现draw Regular Polygon函数,这里我们需要注意函数给的是多边形的内角大小,但是我们旋转的应该是外角大小,所以需要用180转换一下。
在这里插入图片描述
3.2.4Problem 6: Calculating Bearings
这里我们需要实现的函数为calculate Bearing To Point函数和calculate Bearing函数。
calculate Bearing To Point函数里首先计算目标坐标和当前坐标所形成线所成的角度Math.atan2(targetY - currentY, targetX - currentX) * 180.0 / Math.PI;
转换到正角if (angle < 0) angle += 360.0;
然后取相反数(海龟旋转的方向是顺时针,坐标轴角度的旋转角度的逆时针),再减去90°(海龟的0°线是向上,坐标轴的0°线是向右,向右到向上要逆时针旋转90°)bearing = (360 - angle + 90 >= 360 ? 90 - angle : 360 - angle + 90) - currentBearing;
最后调整为0-360°之间(可能大于360°或小于0°)return bearing < 0 ? 360.0 + bearing : bearing;
在这里插入图片描述
基于上一个问题,此时有若干个点,想知道从第一个点开始到第二个点,再从第二个点到第三个点……以此类推每次转向的角度。
将“起点”选为第一个点(坐标为(xCoords.get(0),yCoords.get(0)));
循环n-1次(n为点的个数)
每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中;
将下一次的“起点”用当前“终点”更新,继续循环;
退出循环后返回List。
在这里插入图片描述
3.2.5Problem 7: Convex Hulls
如果凸包点集小于三立即返回,肯定为凸包
minPoint保存最左下角的点,求凸包集合从最左下角开始选,(因为都是正数所以最左下角是最简单的坐标)然后最后如果下一个凸包元素就是minPoint立即停止循环,则shellPoint保存凸包元素边界值
有了第一个凸包元素我们开始找下一个凸包元素,然后我们去找现在点对于上一个凸包元素的级角,也同时拿到了下一点对于上一个凸包元素的级角如果后一个级角小于现在点的级角证明现在点并不是凸包元素,如果后一个级角与现在点级角相等比较两者的边长大小边长较大的那个才是凸包元素,因为我们在找最小凸包元素集合,如果所有的级角都比现在点级角要大,证明我们的现在点就是凸包元素,纳入shellPoint,最后返回shellPoint即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.2.6Problem 8: Personal art
这里我画了一个类似螺旋线的东西一共走100步,每一步前进的时候前进步长越来越长角度也越转越大,然后我把pen color里面的颜色都用了一遍,每前进一步转换一次颜色
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.2.7Submitting
这里我选择三个实验统一提交
3.3Social Network
该任务为构造人的实例对象然后通过Friend Ship Graph来给人之间的关系定性
3.3.1设计/实现FriendshipGraph类
通过addVertex添加人的实例对象,此处人名重复是不能添加的,调用并未添加Vertex
在这里插入图片描述
通过addEdge添加人与人之间的关系
通过getDistance计算人与人之间的关系远近,利用了广度优先搜索
在这里插入图片描述
getDistance是广度优先搜索,首先定义一个queue队列然后定义一个哈希图,因为本图是无向非连通图,所以定义哈希图的目的是保证在非连通图的时候也能够搜索而不至于陷入死循环
在这里插入图片描述
3.3.2设计/实现Person类
首先给出构造函数Person,在构造函数中给Person实例对象命名,该name为Private类型且定义为final,一旦命名不可修改,然后定义该人的朋友列表,并给出查看名字和朋友的方法
在这里插入图片描述
3.3.3设计/实现客户端代码main()
我另外开启了一个client类作为主函数调用的类
在这里插入图片描述
3.3.4设计/实现测试用例
addVertex函数和addEdge函数的测试我添加了几个实例对象检查添加过后的列表最后一个是否为我添加的对象
在这里插入图片描述
getDistance函数的测试我主要是添加了几个实例对象建立了几个联系
在这里插入图片描述
4实验进度记录

日期 时间段 任务 实际完成情况
2021-04-28 15:30-19:30 编写问题1的isLegalMagicSquare函数并进行测试 按计划完成
2021-04-28 19:30-20:30 编写问题1的generate MagicSquare函数并进行测试,学习如何通过Java编译运行 按计划完成
2021-04-29 8:30-10:30 编写问题2的Turtle Soup函数并进行测试 按计划完成
2021-04-29 10:30-12:30 编写问题3的函数并进行测试 按计划完成

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

遇到的困难 解决途径
Java初步接触对面向对象编程理解较难 在网上寻找网课进行学习
只会运用编译器进行编译,不会使用Java进行编译 使用命令行进行试验
不会使用Git 网上进行搜索

6实验过程中收获的经验、教训、感想
6.1实验过程中收获的经验和教训(必答)
我们在进行实验或者编写代码的时候首先进行整体架构的解读,然后才进行具体代码的编写
6.2针对以下方面的感受(必答)
(1)Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
Java面向对象的编程更加偏向整体架构,能够提供更大体系的系统编程
(2)关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足;
Eclipse不提供函数的快捷输入,比较麻烦
IDEA对插件的管理比较好
(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、付费专栏及课程。

余额充值