软件构造lab1

Lab1

实验要求

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

Magic Squares

1.本任务重点在于I/O。

采用缓冲字符输入流BufferedReader

FileReader fr = new FileReader(fileName);
BufferedReader in = new BufferedReader(fr);

在java中拥有异常这个概念,在文件读入时就存在检查性异常:要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
所以要采用try{……} catch(){……}语句来捕获可能存在的异常。
这里含有打开不存在文件输入不合法的异常。
在这里插入图片描述
在这里插入图片描述
采用缓冲字符输出流BufferedWriter
在这里插入图片描述

2.处理数据

在这里插入图片描述
在处理数据中,首先根据描述以间隔符“\t”分割字符串数组,然后检验是否满足数字间隔都是“\t”:如果有非法间隔符,则存在字符串含有非自然数(0~9),遍历字符串的每个字符并比较。

3.幻方

利用幻方定义,首先判断行列是否相等:(变量都是整形)利用math求数据总和sum开方row,如果row*row=sum,则行列数相等。
求取行、列、对角线、反对角线和,首先将第一行的和作为标准,将和与它相比,得出结果。

4.La Loubere 法奇数幻方构造

一居上行正中央:数字 1 放在首行最中间的格子中;
依次斜填切莫忘:向右上角斜行,依次填入数字;
上出框时向下放:如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中;
右出框时向左放:同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中;
排重便在下格填:如果数字右上的格子已被其它数字占领,就将 填写在下面的格子中;
右上排重一个样:如果朝右上角出界,和上面重复的情况做同样处理。

Turtle Graphics

在https://github.com/rainywang/Spring2019_HITCS_SC_Lab1/tree/master/P2中选择下载压缩包。
在本任务中先创建一个接口Turtle,在DrawableTurtle实现具体函数。
可使用方法
DrawableTurtle 初始化起点、方向、颜色、动作
forward(int steps) 将以当前方向和位置长画为steps的直线的动作加入actionList
turn(double degrees) 将当前方向顺时针旋转degrees(弧度制)的动作加入actionList
color(PenColor color) 将笔的颜色设置为color中颜色的动作加入actionList
draw() 在画布中画出actionList所有动作

之后所有基本图形利用以上的基本方法即可完成

Convex Hulls

该闭凸包问题可以采取简单的礼品包装问题:每次找到与当前点形成角度(顺时针)最小的点作为下一个点,这样就可以完成闭凸包。
注意事项
(1) 结束条件:从第一个点开始寻找直到又找到第一个点。
(2)避免死循环的问题:从当前点不能回到上次选过的点。

Social Network

FriendshipGraph类

1.addVertex

添加顶点。
采用List保存,还需要判断这个点是否已经被加入(这里采用名字是否已经存在来判断)

2.addEdge 加边

根据有向图的定义,加边必须定义谁是起点和终点。这里确定第一个参数为起点,第二个为终点,而且还需要创建二元数组保存边。

3.Floyd 计算最短距离

根据Floyd算法,可以算出所有的点到其他点的最短距离(如果不连通或该点对该点距离为MAX:一个超大值)。
这里注意:如果图发生更新则需要重新计算。

4.getDistance 根据参量返回

(1) 参量相同。根据下标相同确定返回值为0
(2) 两点不连通。根据最短距离为MAX,返回-1
(3) 两点联通。返回之前保存的最短距离。

2.Person类

Person类需要保存人类的基本信息,根据提示,Person类需要得到人的名字,而图的基本类型采取矩阵,所以需要矩阵下标,故Person类还要有下标。

3.Main

将指示代码写入主函数,经检测与提示相符。

4.Test

java中利用assert可以将理论值和实际值比较,基于此完成测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tweet Tweet

Problem 1: Extracting data from tweets

(1) getTimespan

求推特的公共时间范围可以利用Instant类函数isBefore、isAfter,然后求出最早的时间和最晚的时间

(2) getMentionedUsers

提到的名字必须以@开头,并且@前和名字后必须不是有效字符

1.是否为有效字符
利用isLegal函数判断
2.找到@

利用循环找到@
判断@前不是有效字符:@前是无效字符;@前无字符 j代表推文字母顺序。

判断名字后不是有效字符:结尾有字符且不是有效;结尾无字符将end赋为长度

Problem 2: Filtering lists of tweets

(1) writtenBy

利用Tweet类getAuthor得到名字,再判断名字是否相同确定是否加入返回的List。

(2) inTimespan

利用Instant类isAfter和isBefore找到要求时间范围内的推特。

(3) containing

判断推文是否包含某个字符串,可以以外层循环为推文,内层循环为字符串,然后判断推文中是否包含字符串。
首先根据推文规则可以将它以“ ”分割,然后与word比较,由于不要求区分大小写,所以自行完成了关键函数com(不区分大小写比较字符串),这个循环条件设为word,因为之前分割的字符串可能包含一些标点符号,所以只要比较前word.length即可。

Problem 3: Inferring a social network

(1) guessFollowsGraph

可以利用之前完成的函数getMentionedUsers,将@的明星作为key,推文的主人作为value,这里需要注意 @本人时跳过。

(2) influencers

该函数需要根据粉丝多少降序输出。而粉丝数量可以由Set.size()获得,但是Map并没有下标,所以不能用其他数组记录顺序下标,所以采用每次输出尚未输出的当前最大值:利用list temp.add记录已被输出的。

Problem 4: Get smarter

采用方案:一个人的粉丝的粉丝还是他的粉丝。(已完成初始粉丝)

DFS算法
最外层循环:依此计算各个人的粉丝
第一个内层循环:将第一层粉丝记录
第二个内层循环:将所有粉丝加入
最内层循环:判断下一层粉丝是否存在:如果存在将此人加入粉丝,并弹出栈,并且将此人粉丝加入栈中,直至此人粉丝的粉丝…不存在,依此类推完成DFS。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值