软件构造 Lab1

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

实验用到的知识: 文件读写、正则表达式

实验任务共有四个:

1、Magic Squares:
isLegalMagicSquare()
进行以下几个判断:
1、各数为正整数。
解决方法:
(1)对于每次读入的字符串用“.”进行划分,若划分出不同部分,则说明有浮点数存在,幻方不成立。
(2)对于每个数都进行一次判断,若小于等于0,则不为幻方。
2、各数以空格划分
解决方法:用split(” ”)对读取的每行字符串进行划分,并计算划分出的数据数量是否符合矩阵阶数。并判断划分出的数据能否转化为整数,若不能,说明不是幻方。
3、矩阵为方阵
解决方法:对读取的每一行都进行一次记录。当读取完毕后,判断行列数是否相等,若不相等,说明不是幻方。

若以上几个检测都通过,说明该输入矩阵是幻方。

generateMagicSquare()
流程图如下:
在这里插入图片描述

这部分的内容需要进行文件读写。使用FileReader/Writer进行读写
如下是写入的写法:
在这里插入图片描述

2、Turtle Graphics
这部分任务按照要求绘图与计算即可。

Turtle graphics and drawSquare
根据说明可知,turn(degrees)是向右旋转degrees角度, forward(length)是向前绘制长度为length的直线。
根据本小问要求,我们只需执行forward(length)与turn(90)四次即可。
在这里插入图片描述

Drawing polygons
本小文要求根据输入的边数绘制正多边形。
我们有计算内角度数的公式
degrees = (sides - 2) * 180 / sides;
故用于旋转的外角度数为 degrees = 180 - degrees。
因此我们只需循环sides次的forward(length)与turn(degrees)操作即可绘制出所要的正多边形。
在这里插入图片描述

Calculating Bearings
本题是计算当前角度转向目标点所需旋转的角度。
首先有一个特殊情况,即当前点与目标点重合,此时返回角度为0;
其余情况下,都可以使用数学函数atan2进行计算。
根据两点坐标之差即可求出角度atan2(targetY - currentY, targetX - currentX)。
但这个角度是逆时针的弧度角,正左方向为0。
所以我们需要将其转为角度,并取相反数再加上90°才是正确的旋转角度。
除此之外,我们所要求的角度范围为0-360°,所以角度小于0时,要循环加360°以符合取值范围。
在这里插入图片描述

Convex Hulls
凸包算法问题。
我的算法是:先找到左下的点,初始化方向向下。利用先前的求目标点的旋转角,找到所需旋转最大的角,即当前点方向左转角度最小的角。将当前点加入点集,更新点位,循环到当前点已在点集为止,即完成凸包。
类似下图,但有些改变。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、Social Network
考察图的数据结构与广度优先搜索算法。

设计/实现FriendshipGraph类
我在本题使用邻接表的方式实现图的数据结构,使用邻接表可以更方便的实现有向图,方便之后的改进,另一方面,在本体这种较少边的情况可以节省空间。
在这里插入图片描述
首先创建了两个类。
一个是顶点节点类,包含person与邻接边表,并有一个int类型的dis来方便实现之后的广度优先搜索算法;
另一个是边表节点类,包含顶点节点指针与下一个边节点指针。

实现图结构时,按照需求创造顶点节点列表,尾插各顶点,再根据输入的边进行连接即可。
在这里插入图片描述
添加边的函数如下:
在这里插入图片描述
根据输入的两个person,双层遍历寻找相应信息的顶点,找到后在第一个person的邻接边表尾插第二个person的边节点即可。

设计/实现Person类
Person类记录每个Person的姓名即可。用字符串保存姓名。
在这里插入图片描述

设计/实现客户端代码main()
在这里插入图片描述
main函数实现如上。
当“Ross”改为“Rachel”后,getDistance的操作会出现偏差,为0。
所以在原来的插入顶点代码上加上了判断,若出现同名人加入,则输出错误信息并退出。

设计/实现测试用例
测试用例仿照main函数。
并添加新人——lan。
lan与ben相连。
在这里插入图片描述
主要测试三种情况:
1、自己到达自己的距离
2、到不可达人物的距离
3、到可达人物的距离
以上三种情况都被测试通过,完成测试。

4、Tweet Tweet
本题大多数操作都是字符串操作,需要运用正则表达式。

Extracting data from tweets
本题有两个问题,一个是确定一批Tweet的时段,另一个是确定@中的人。
第一问十分简单,具体代码如下:
在这里插入图片描述
只需遍历Tweet的列表,找到最早发送的和最晚发送的Tweet即可,类似Max和Min的求解。

第二问就需要使用到正则表达式。
根据题目要求,@后的用户名必须是合法字符,所以我的正则表达式如下:
“@([A-Za-z0-9_-]+)[\s*|\t|\r|\n]”
具体操作是选出@后的用户名,用户名以空格/制表符/换行结尾,此处规则是百度贴吧的@规则。
根据该正则表达式即可匹配出括号中的用户名,加入到集合中并返回。
并且因为大小写不敏感,所以将所有用户名转为小写存储。
在这里插入图片描述

Filtering lists of tweets
本题目的是实现一个过滤器。
第一问,使用正则表达式,过滤掉非法输入,之后选出输入的人名所发的Tweet,较为简单。人名不区分大小写,所以比较时双方都转为小写。
代码如下:
在这里插入图片描述
第二问,时间过滤,也是十分简单的一题,遍历所给的Tweet的列表,选出符合时间段的Tweet加入列表输出即可。代码如下:
在这里插入图片描述
第三问,找出包含某些词汇的Tweet,也较为简单。遍历Tweet,使用String.contain函数即可判断是否包含某一词汇,因为不分大小写,所以事先将两者都转为小写。
在这里插入图片描述
总结:本题还是十分简单的一题,考的都是基本的内容。

Inferring a social network
问题1:
本题是要计算某人的关注对象。
只要@某人即可成为某人的粉丝,所以建立一个Map,若自己@了某人,则自己作为key,对方加入自己的set中,如此操作后,加入Map中,最后返回即可。又因人名不分大小写,此处比较前人名都转为小写。
在这里插入图片描述
问题2:计算各人的粉丝数,按降序输出。
此处建一个类,记录tweeter的名字和粉丝数。
在这里插入图片描述
可以根据前一问的结果,Map中每有一个人关注一个对象,则对该对象的粉丝书加一。

降序实现使用sort,需要编写一个comparator,代码如下:
在这里插入图片描述
用于排序。

总的代码如下:
在这里插入图片描述

Get smarter
实现更加智能的上述题目。
我所选择的题目是实现某一话题下的人互相关注。话题使用#开头空格结尾。
实现如下:
先判断是否包含合法的话题,正则表达式如下:
“#([A-Za-z0-9_-]+)[\s*|\t|\r|\n]”
之后找出所有发过该话题的人,加入同一集合。
之后遍历集合,对于集合中的每一个人,关注集合中的其他所有人即可。
同时因为名字不分大小写,比较时将所有名字转为小写。
代码如下:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值