哈工大计算机 2019春 软件构造 lab1

软件构造 同时被 2 个专栏收录
12 篇文章 0 订阅
1 篇文章 0 订阅

 

哈工大计算机 2019春 软件构造 lab1

 

目录

哈工大计算机 2019春 软件构造 lab1

实验目标概述

实验环境配置

实验过程

Magic Squares

isLegalMagicSquare()

generateMagicSquare()

Problem 3: Turtle graphics and drawSquare

Problem 5: Drawing polygons

Problem 6: Calculating Bearings

Problem 7: Convex Hulls

Problem 8: Personal art

Submitting

Social Network

设计/实现FriendshipGraph类

设计/实现Person类

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

设计/实现测试用例

Tweet Tweet

Problem 1: Extracting data from tweets

Problem 2: Filtering lists of tweets

Problem 3: Inferring a social network

Problem 4: Get smarter

实验进度记录

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

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

实验过程中收获的经验和教训

针对以下方面的感受


实验目标概述

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

实验环境配置

在qq群下载了Eclipse和JDK并安装, 在GitHub网站下载安装了Gitbush,分为GUI(图形)和CMD(命令行)两种模式,并简单学习了两种模式的使用。

在配置环境变量的过程中,遇到了环境变量JAVA在电脑关机重启后就会失效的问题,在CSDN上找到了解决方案,参考文章:https://blog.csdn.net/zhijingmu/article/details/80647174

把PATH变量分成数行加入后问题解决。

GitHub Lab1仓库的URL地址

https://github.com/ComputerScienceHIT/Lab1-1170300817

 

实验过程

Magic Squares

首先要了解什么是Magic Squares,Magic Squares也就是幻方是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。

isLegalMagicSquare()

本题要求写一个函数判断txt文件中保存的矩阵是不是符合幻方要求的矩阵。输入参数为文件路径。返回布尔值。

首先使用传入的文件路径新建一个file对象,再使用FileInputStream流读取文件的内容成一个长string,使用split("\n")方法将长文本按矩阵划分成行保存进一个字符串数组String line[],再利用split("\t");方法划分成一个个数字(注意行列数不对报错:不是矩阵),随后定义如下变量保存之后的计算过程。

随后将字符换转换成int型整数(注意如果出现不是整数或者非数字报错),保存在二维数组int nums[][]。(出现负数报错)对每个元素遍历求各行和各列之和:

随后判断各行各列之和与对角线是不是都相等,如果是返回true,否则返回false。

generateMagicSquare()

 

思路:首先计算初始位置(0,n/2),赋值为1,之后每次取当前位置的右上角的位置,设置的值每次加1,如果当前行是第一行,则下一行为最后一行,如果当前列是最右边的列,则下一次取左边第一列,如此重复平方次,就对整个矩阵赋值了,而且满足了每行每列以及对角线之和都是相同数字的效果。

 

完成矩阵的设置后输出矩阵成一个txt文件,代码如下:

 

Turtle Graphics

熟悉turtle Graphics的各种函数接口,调用设置好的函数,实现作图,使用.Math库的几个函数实现一些计算。

Problem 1: Clone and import

从教学QQ群下载了原文件,使用eclipse建立相关文件夹后,把文件放到项目中的合适的文件夹中,刷新eclipse,修改包名后使用。

进入project文件夹,右键GIT GUI HERE,

点击create new repository ,选择好目录后点击创建

就完成了。

 

Problem 3: Turtle graphics and drawSquare

很简单,重复四次前进转弯90就行了。

Problem 5: Drawing polygons

利用以下代码编写calculateRegularPolygonAngle (int sides)计算n边形的内角:

(sides - 2) * (180.0/ sides);

随后重复sides次前进转向即可

Problem 6: Calculating Bearings

利用atan2函数计算前进方向与x轴正向夹角,

之后再把该角度转换成和y正向的夹角,

注意如果出现负数要加上360度

Problem 7: Convex Hulls

运用Gift wrapping algorithm算法,每次选择转向角最小的点(同时距离最长的点),加入集合,求转向角函数直接使用的之前写好的calculateBearingToPoint函数,

其中注意点是相同转向角额点的取舍,在循环中设置一个targetdis变量记录当前目标点的距离,如果之后出现了新的目标点,就用targetdis和计算得到的当前点的距离tempdis来比较进行取舍。

 

Problem 8: Personal art

主要想法是把之前编写的drawRegularPolygon(画多边形)函数,和改变颜色的功能利用起来,所以循环:画四边形,转换颜色,边长增加,转一个小角度。

其中color数组保存了已经定义的各个颜色。

 

 

Submitting

依次点击点击rescan ,stage changed 输入commit message在右侧方框之后点击commit,之后点击push,输入仓库地址,就成功了

 

Social Network

利用各种数据结构,实现一张人际关系网络。写一个计算人际关系“距离”的函数。

设计/实现FriendshipGraph类

在FriendshipGraph类中声明两个list:people为person类型,用来保存人的实例,另写一个namelist为string类型,我用来检测是否有重复名字的,这样避免使用people列表来查找是否有重复的人,较为麻烦。

addVertex(Person newPerson)函数用来加入新的“人”到people列表,再次之前要在namelist中检查是否有重复的名字,有则输出提示。

 

addEdge(Person pa, Person pb)函数调用people类的addFriend方法,在每个人的朋友列表中增加新的朋友。

getDistance(Person Person1, Person Person2)函数为难点,声明一个Map<Person, Integer> distantMap数据结构,来保存起点到当前点的键值对(名字,距离),使用邻接表广度搜索的方法,借助队列,先将起点入队,然后执行循环,直到队列为空前:弹出队列头元素,计算当前距离,把弹出点的所有“朋友”入队,并加入map中,设置距离为先前计算的距离+1。直到找到结束的节点。返回这个点在map中键值对的“值”。

 

设计/实现Person类

Person类:

包含保存名字的字符串private String name

保存朋友的字符串private List<Person> friendList

和他们相应的get方法getName()和getFriendList()

addFriend方法为对象的朋友列表新增一个朋友项。

 

 

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

如果不修改提供的main代码,结果为

如果把graph.addEdge(rachel, ross),注释掉,结果为

原因是:rachel,到ross的边不存在了,所以rachel,和ross距离-1,其他点也无法达到。只有getDistance(rachel, rachel)返回0。

 

再次修改main()试图输入重复姓名

则输出

原因是之前就设置了查找到重复名字就退出的代码:

 

设计/实现测试用例

简单设计一个test检测各种距离和不可到达的情况,同名的情况根据要求会直接退出,就没写对应test。

 

Tweet Tweet

Problem 1: Extracting data from tweets

getTimespan(List<Tweet> tweets)返回list中的推特覆盖的时间段,先设置好初始起止点,

然后对每条推特,如果时间点在当前时间区间之外,就修改时间区间的上或者下界。

 

Set<String> getMentionedUsers(List<Tweet> tweets)函数根据tweet列表返回tweet中提到的用户名,具体做法是先用Pattern.compile("@([\\w.-]+)");方法匹配满足条件的字符串,

然后对找到的位置进行检查,如果前面不包含合法字符,则满足要求,或者前面没有字符(即开头)也满足要求,把符合条件的加入返回

Problem 2: Filtering lists of tweets

writtenBy(List<Tweet> tweets, String username)函数返回作者是输入的username的tweet的列表,只要对传入的list中的每个tweet调用getAuthor方法获得作者之后进行比对,如果(无视大小写)是一样的,就把当前的tweet加入返回的list。

 

inTimespan(List<Tweet> tweets, Timespan timespan)函数返回list中时间在传入的区间内的所有tweet,只需对所有tweet获取时间后比对,如果符合就加入返回的list。判断条件如下:

 

containing(List<Tweet> tweets, List<String> words)该函数输入多个关键词和一个tweet list,返回包含关键词的所有tweet列表组成的list。我的做法是先把每一个tweet分割成单词,因为数组没有contains方法,所以把数组转成list后,调用contains方法,检查是否包含关键词,有的话把当前检查的tweet加入返回的列表。

 

 

Problem 3: Inferring a social network

Map<String, Set<String>> guessFollowsGraph(List<Tweet> tweets)

思路:对每个tweet取作者Author和提到的人(调用getMentionedUsers)mentionedUsers,然后在map中查找是否有Author这个键,如果已经存在,把mentionedUsers列表添加进去,如果不存在Author这个键,就新建此键值对(Author,mentionedUsers)

 

List<String> influencers(Map<String, Set<String>> followsGraph)函数根据传入的Map对每个人按照影响力大小排序,

首先声明Map<String, Integer> influencersMap数据结构保存(人名,影响力),

对参数map中的每个string数组中的每个人,检查:如果此人已经在influencersMap中,则将对应的值+1,如果不在,则放置新的键值对(人名,1)。

因为会出现有的人没有被别人follow的情况,所以要把剩余的人加入map设置值为0。

随后按value的大小顺序取出map的元素依次加入list

 

 

Problem 4: Get smarter

 

采用建议的第一种策略:修改guessFollowsGraph函数,提取twet中的hashtag,策略是用一个map数据类型保存每个人的名字,和他发过的所有hashtag,

之后再进行判断,对于每两个用户进行比对:如果此二人发过的hashtag集合的交集的数目大于3个,则认为此二人互相影响:

 

 

实验进度记录

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

 

日期

时间段

任务

实际完成情况

2019-02-25

15:45-17:30

学习git

按计划完成

2019-02-25

18:50-22:00

编写isLegalMagicSquare和测试

按计划完成

2019-02-26

19:00-22:00

完成P2的1-6

按计划完成

2019-02-27

19:00-22:00

完成P2的convexHull和个人艺术

按计划完成

2019-02-28

15:00-22:00

完成P3

按计划完成

2019-03-3

19:00-22:00

完成P4的任务1.2

按计划完成

2019-03-6

19:00-22:00

完成P4的任务3

按计划完成

2019-03-7

19:00-22:00

完成P4的任务4

写完了测试始终不通过

2019-03-8

19:00-22:00

修改了P4实现,补充测试

按计划完成

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

遇到的难点

解决途径

Git不会使用,

 

 

上网查找Git教程

访问教程“廖雪峰的官方网站”

实验导入问题,目录结构不知道怎么建立

 

 

咨询了有丰富经验的同学,理清了什么时候要建立folder什么时候要建立package。

 

 

 

 

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

实验过程中收获的经验和教训

对java语言的掌握十分不足,下一次实验前需要加强。

针对以下方面的感受

Java编程语言是否对你的口味?

对,具体就是很多数据结构直接可以用,上学期c语言数据结构手写很酸爽。

关于Eclipse IDE

目录有时不灵敏。。

关于Git和GitHub

需要继续学习才能熟练使用

关于CMU和MIT的作业

能够向世界一流计算机专业学习是迈向世界一流必经之路

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

工作量大,难度不小,deadline要看同时期其他课程的安排。挤在一起就很累。

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

代码量大。

 

  • 3
    点赞
  • 0
    评论
  • 15
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

leolin037

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值