软件构造实验一

3 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。

3.1 Magic Squares

矩阵以txt形式储存,读入文件,判断输入的矩阵是否为幻方。在main()函数中调用五次isLegalMagicSquare()函数,将5个文本文件名分别作为参数输入进去,看其是否得到正确的输出(true, false);需要能够处理输入文件的各种特殊情况,例如:文件中的数据不符合Magic Square的定义(行列数不相等、并非矩阵等)、矩阵中的某些数字并非正整数、数字之间并非使用 /t 分割等。若遇到这些情况,终止程序执行(isLegalMagicSquare函数返回false),并在控制台输出错误提示信息。

1. 3.1.1 isLegalMagicSquare()
该函数作用为判断读入文件是否为幻方,输出true或false。

1、 先读入文件,将文件按行输出到字符串数组中,然后按照“/t”进行分割
2、 判断行数和列数是否相等
3、 将字符数组转为数字数组并检测是否有负数和小数
4、 计算各行、各列和两个对角线的和,并比较是否相等
5、 以上不满足幻方要求输出false,否则输出true

2. 3.1.2 generateMagicSquare()

按步骤给出你的设计和实现思路/过程/结果。

java.lang.ArrayIndexOutOfBoundsException:数组越界
java.lang.NegativeArraySizeException:数组大小为负数

该构建幻方方法为La Loubere 法奇数幻方构造
思路为:
1、数字 1 放在首行最中间的格子中;
2、向右上角斜行,依次填入数字;
3、如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中;
4、同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中;
5、如果数字n右上的格子已被其它数字占领,就将n+1 填写在n下面的格子中;
6、如果朝右上角出界,和上面重复的情况做同样处理。
在这里插入图片描述

3.2 Turtle Graphics

通过函数移动turtle在屏幕上作图。通过turtle Graphics的各种函数接口,调用设置好的函数,实现作图,使用.Math库的几个函数实现一些计算。
3.2.1 Problem 1: Clone and import
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
使用克隆方法

  1. 打开终端(Git Bash)转到存储目录(cd)
  2. 克隆仓库:在页面中仓库用户名已填写,在终端运行以下命令,并填写URL
    Git clone 仓库地址
    3.克隆存储库后,将项目添加到Eclipse
    3.2.2 Problem 3: Turtle graphics and drawSquare
    画笔前进并旋转重复4次即可
    在这里插入图片描述

3.2.3 Problem 5: Drawing polygons
1.通过正多边形边数计算内角
绘制多边形,编写calculateRegularPolygonAngle计算多边形内角和
内角公式:180-360/size 返回应该是doubule类型
在这里插入图片描述

2.通过正多边形内角计算边数
编写函数calculatePolygonSidesFromAngle根据多边形的内角计算出边的条数。需要向上舍入(math.ceil)
边数公式:360/(180-angle)
在这里插入图片描述

  1. 绘制多边形
    将边数sides传给函数calculateRegularPolygonAngle得到内角度数,然后画笔旋转180-得到的度数。根据sideLength画出直线,循环sides次,即可得到正多边形。
    在这里插入图片描述

3.2.4 Problem 6: Calculating Bearings

  1. 实现函数calculateBearingToPoint: 实现函数calculateBearingToPoint, 利用atan2函数计算前进方向与x轴正向夹角(相对角度关系 = Math.atan2(targetX - currentX, targetY - currentY))

  2. 实现函数calculateBearings结合calculateBearingToPoint函数计算两点之间当前点和目标点的角度,保存它。
    3.2.5 Problem 7: Convex Hulls
    要求:在给定n个点的基础上确定它们的凸包。凸包可以具体为包含所有点的一个圈。所以要找出“最外面的点”。
    凸包是指:在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,…Xn)的凸组合来构造。

先对所有的点进行排序,先按x轴坐标再按y轴坐标,找到最左下的点,然后找到与这个点最小夹角的点,一直到最右面的一个点。
判断条件需要加上:夹角要大于180度,直到又回到最初的点
3.2.6 Problem 8: Personal art

Turtle包里好像没有填充,就只画了月亮与星星

3.2.7 test
测试结果

3.2.8 Submitting
a. 首先使用ssh-keygen建立一个密钥
b. 登陆Github将公钥上传
c. 使用ssh连接至Github
d. 使用git remote add origin关联至指定仓库
e. 使用git push将文件上传至Github

3.3 Social Network

要求拟刻画的社交网络是无向图,如果两人认识就加一条边,编写计算任意两人之间最短距离。

3.3.1 设计/实现FriendshipGraph类

1、 数据类型采用邻接矩阵
在这里插入图片描述

2、 addVertex函数实现了加入点的操作。
判断名字是否重复,没有则人物列表中的对象即为顶点

3、 addEdge函数实现的加入边的操作
得到人物在列表中的位置,加入到领接矩阵即edge[][]=1

4、 getDistance函数实现计算两点间的距离,若不存在关系则返回-1.
利用广度优先搜索,第几层即为距离是多少
3.3.2 设计/实现Person类
Person类中person只需要name这个信息
在这里插入图片描述

3.3.3 设计/实现客户端代码main()
1.不修改提供的main代码结果为:

2.将graph.addEdge(rachel, ross)注释掉结果为

  1. 输入重复名字结果为:

3.3.4 设计/实现测试用例
给出你的设计和实现思路/过程/结果。

1、对添加顶点进行测试
用assertTrue判断graph的顶点集中是否包含这些顶点

在这里插入图片描述

2、对添加边进行测试
用assertEquals判断
在这里插入图片描述

3、对计算两点距离进行测试
在这里插入图片描述

发布了4 篇原创文章 · 获赞 0 · 访问量 102

猜你喜欢

转载自blog.csdn.net/qq_44051913/article/details/105444860