2019年秋季学期软件构造 Lab1

Magic Squares

我们要理解幻方是什么。幻方,是n*n的数阵,里面的数字多半都是整数,幻方满足要求:每一行、每一列、两条对角线相加之和为一个常数。

题目要求写一个Java文件,验证数阵是否为幻方,这里题目又给出5个文件,作为输入参数

我们需要注意我们的文件输入是否满足要求,非法输入有:1) 输入不满足幻方要求,如:行数和列数不相等、输入不是矩阵矩阵中的某些数字 并非正整数、数字之间并非使用\t 分割等,所以基于这样的考虑我们又要写另一个函数isLegalMagicSquare,作为函数输入的判断。

我们要根据给出的生成幻方的函数,分析为什么提供的函数会在n为偶数或者负数的时候产生异常,并修改成直接退出函数,同时我们需要用这个函数生成一个幻方写进文件里,并通过isLegalMagicSquare函数检查是否为幻方

isLegalMagicSquare()

首先我们要从文件里读入数据,这里我采用的函数如图所示

在这里插入图片描述
然后就进行输入是否合法的判断,在我的代码中,我判断了1)是否是\t分割2)行数和列数是否相等 3)输入是否为数字
如果是非法输入就直接退出 判断过程如图所示

在这里插入图片描述
接下来就进行数阵是否是幻方的检查,这里我就通过三个n的循环分别计算行向量之和、列向量之和、对角线数据的和,最后比较是否相等,正确返回true、错误返回false

generateMagicSquare()

负数异常较为简单,这里我会说明为什么n为偶数会发生异常。我们可以看到函数中有下面几行代码,这里我们将N带成一个偶数的时候row—会导致得到一个负数,用这个数去访问数组时,会发生越界,所以会有异常
在这里插入图片描述

这里我们的解决方法较为简单,就是写出如下图所示的代码,直接判断为错,出函数
在这里插入图片描述
最后我们需要调用生成幻方的函数,生成一个幻方,并用isLegalMagicSquare函数检查数阵是否为幻方,所以我们需要的是写文件的函数和上述两个函数的调用,最后结果如下图
在这里插入图片描述

Turtle Graphics

  1. 从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
  2. 完成画出正四边形,并得出所画的结果
  3. 通过git命令commit
  4. 完成正多边形角的计算
  5. 给出参数为坐标点,算出转角大小
  6. 求出包围所有点的凸包
  7. 通过上面的函数,自己画出需要的图形

Problem 1: Clone and import

  1. 建立一个远程的仓库
  2. 打开git终端,然后通过cd进入你将要存代码的地方
  3. 从SSH得到克隆
  4. 然后把项目加到eclipse里面去

Problem 3: Turtle graphics and drawSquare

  1. 首先去找forword、turn函数,发现他们的功能就是实现后面参数所规定的前进和转向
  2. 然后我们就通过四次循环(转九十度+前进)得到我们要画的正四边形

在这里插入图片描述

Drawing polygons

  1. 补充calculateRegularPolygonAngle,我们利用基本的数学知识,即正多边形的内角和为180*(边数-2),求出正多边形的内角和,进而我们可以得出每个角的大小,但是这里我们需要注意我们最后需要的角度为double类型,所以最后我们需要将结果进行类型转换

  2. 补充calculatePolygonSidesFromAngle,这个函数的功能是知道正多边形的边数,求角,所以我们还是根据数学公式计算,得到如下图代码
    在这里插入图片描述

  3. 补充drawRegularPolygon函数,这个函数的功能就是让乌龟画出指定边数、指定边长的正多边形,经过简单的几何分析,我们可以写出如下图的代码
    在这里插入图片描述

  4. 最后,我们要让我们的代码通过测试用例,所以这块我们要用到juit,首先这个包在现在的eclipse里可以直接插入,所以我们只需要在测试用例的Java文件上点击run as juint就好,方法如下

在这里插入图片描述
5. 最后测试的结果为
在这里插入图片描述

Calculating Bearings

  1. 补充calculateBearingToPoint函数,该函数的功能是知道乌龟现在所在位置(用xoy坐标表示),知道乌龟现在偏离y轴得角度,给出乌龟将要去的地方的位子,求出乌龟需要转的角度(乌龟顺时针转动)这里我一开始考虑的是分8种不同的情况,(利用乌龟现在位子和未来位子的角度和乌龟当前朝向进行比较)算出什么时候乌龟转向哪个角度,但是后来通过和同学的讨论,我决定使用tan2的方法,这样我们就可以通过极坐标的性质将情况简化,代码如下
    在这里插入图片描述
  2. 补充calculateBearings,该函数的功能是通过给出的一系列xoy坐标,得出依次讲过这些点乌龟需要转动的角度(顺时针)由于有了上一个函数的基础,我们可以通过调用上一个函数完成代码,这块我们主要是学习list这个类的性质,代码如下:
    在这里插入图片描述
  3. 测试结果:
    在这里插入图片描述

Convex Hulls

  1. 这个函数的功能是求出包围所有点的凸包

  2. 当点数小于等于3的时候,直接将这三个点作为结果。当点数大于3时,首先找到最左下方的点,然后接着寻找这个点到其他点所要转过的角度最小的那个点作为下一个点,一直找到目前的这个点与第一个最左下方的点重合为止

  3. 这里我们主要说明当给出的点的个数大于三时,遍历所有点,然后找到横坐标和纵坐标最小的点,然后找到这个点到其他点的角度,找到其中的最小值,然后选取该点为下一个初始点,循环上述步骤,直到找到一个点和最开始的那个店重合

  4. 测试结果:
    在这里插入图片描述

Personal art

  1. 这个函数就是利用以上写的代码画出随便什么图形

  2. 结果:

在这里插入图片描述

Submitting

git add -A
git commit -m “1.0”
git remote <远程库>
git push -u origin master

Social Network

设计/实现FriendshipGraph类

  1. 首先,我们完成addVertex,这里我把图设定为map型,所以这块我们就可以用map自己的类函数,现在代码如下
    在这里插入图片描述
  2. 然后,我们完成addEdge,这个函数是增加点之间的边的,这块我们也是调用map类自己的函数

在这里插入图片描述
3. 最后,我们完成getDistance,其实这块就是将图的BSF的算法用Java实现,(先广搜索:从一个点出发,遍历与此点邻接的所有点,再从邻接的第一个点搜下去),所以我们可以得到两个人所在的数的高度差;

在这里插入图片描述

设计/实现Person类

我们针对person类的对象就只用了姓名这个方法,所以这块我们person的实现就比较简单
在这里插入图片描述

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

Main函数和实验给出示例相同,实现代码如下
在这里插入图片描述

设计/实现测试用例

  1. 测试AddVertex,这里我会调用AddVertex函数,向社交网络里加一个人,然后看map中键值的最后一个是否是我们加进去的那个人,如果是我们就判断该函数可以执行描述的功能,代码如下:
    代码如下:
    在这里插入图片描述
  2. 测试addEdge,这里我们调用addEdge函数,表明两个点有邻接关系,这里我的测试用例是先向社交网络里加两个人,然后让两个点有邻接关系,最后检测是否这个图是连通的,实现代码如下:
    在这里插入图片描述
  3. 测试getDistance,这里我们调用getDistance函数,计算社交网络在树的不同层的点之间的距离,这里我的测试用例和题目一样,图形、代码如下:
    在这里插入图片描述

在这里插入图片描述
4. 测试结果:
在这里插入图片描述

Tweet Tweet

Extracting data from tweets

  1. 补充getTimespan函数,该函数的功能是求出给出tweet的时间跨度
    在这里插入图片描述
  2. 补充getMentionedUsers函数,该函数的功能是求出tweet中提到的用户其中用户名的要求如下图所示:
    在这里插入图片描述
    所以这里我们需要pattern和matcher来实现用户名的识别,我的代码如下:
    在这里插入图片描述
  3. 写测试用例,由于函数比较简单,所以我选择的就是比较基础的用例以测试函数的功能
    在这里插入图片描述
    在这里插入图片描述
  4. 测试结果:
    在这里插入图片描述

Filtering lists of tweets

  1. 完成writtenBy函数,该函数的参数为tweet和用户名,然后找出写了这个用户名的用户是那些,并将这些用List返回
    这里我们需要的就是遍历所有的tweet,然后找到推文内容中有这个用户名的,然后把这个tweet放入我们实现开的list里去,我的代码如下:
    在这里插入图片描述

  2. 完成inTimespan函数,该函数的参数为tweet和时间段,然后我们需要找出在这个时间段内发出的tweet,然后将这些用List返回;
    这里由于我们需要时间所以我们需要学习instant这个类,然后我们知道了isBefore和isAfter函数,所以我们就可以比较轻松的写出这个函数了,代码如下:
    在这里插入图片描述

  3. 完成containing函数,这个函数的参数为tweet和字符串,功能为筛选出包含参数字符串的tweet然后返回值为List
    这里我们其实需要的就是字符串的比较,然后我们就可以通过查string的方法然后将这个函数补充完整,代码如下:
    在这里插入图片描述

  4. 测试用例:这里我特别测试了第三个函数功能时测试了函数的大小写敏感性,最后三个函数的junit结果如下图:
    在这里插入图片描述

Inferring a social network

  1. 完成guessFollowsGraph,该函数的参数为List tweets,功能为找到发推文的人的follower(B在自己的推文里@A,则BfollowA),最后返回Map<String, Set>,这个map是社交网络
    所以这个和P3问题类似,实现代码为:
    在这里插入图片描述

  2. 完成函数influencers,该函数的参数为Map<String, Set> followsGraph,功能为对关注者的数量的降序排列,最后返回Listlist中是被关注博主的用户名,实现代码如下:
    在这里插入图片描述

  3. 测试结果:
    在这里插入图片描述

Get smarter

  1. 我做的是要求2,这个要求是若A和B之间为强连通关系,B和C是强连通关系,这样我们就可以自动推出A和C之间为强连通关系
    这里我的实现方法就是一个三重循环,让遇到符合这样关系的A、B、C就将 A、C加入强连通关系,实现方法如下:
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值