软构复习——重温实验之lab1(2)

上一篇中将知识点具体的总结了以下,这一篇我们着重讲实验的思路和过程:

实验环境配置

在官网上下载Eclipse、JDK和Git并安装。在为JDK配置环境变量的时候,在系统环境变量中新建一个叫“JAVA_HOME”的环境变量,变量值为JDK的安装路径。然后在Path的环境变量中添加一个“%JAVA_HOME%bin”的变量值。省去很多其它的步骤。
GitHub Lab1仓库的URL地址:“URL”

实验过程

首先看要求:

Majic Squares

Magic Squares 就是我们常说的幻方,它是指一个正方形n×n个数(通常是不同的整数)的排列,使得所有行、所有列和两个对角线中的n个数总和为同一常数。
需要完成的任务:

  1. 在 main()函数中调用五次 isLegalMagicSquare()函数,将 5 个文本 文件名分别作为参数输入进去,看其是否得到正确的输出(true, false)。
  2. 需要能够处理输入文件的各种特殊情况,例如:文件中的数据不符合 Magic Square 的定义(行列数不相等、并非矩阵等)、矩阵中的某些数字 并非正整数、数字之间并非使用\t 分割等。若遇到这些情况,终止程序 执行(isLegalMagicSquare 函数返回 false),并在控制台输出错误 提示信息。
  3. 对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输入到文本6.txt中,然后对其判断是否为MagicSquare。并且满足若输入的为奇数能产生MagicSquare,而输入偶数或者负数会返回false

isLeagalMajicSquareh()

思路:分析isLegalMagicSquare函数的功能作用,可知,函数应该读入文件中的数字,并将其储存再矩阵当中,应当先判断读入的数据是否是n*n的形式,
需要判断行列数是否相等,矩阵中某些数字是不是正整数,以及数据是否以\t作为分隔符。对三种错误进行判断并输出返回false。没有这些错误时才分别计算矩阵每一行、每一列、对角线的和是否相等来判断能否构成MagicSquare,当上述条件均满足的时候,返回true
在这里插入图片描述
过程:

  1. 行列数不相等:定义一个变量a,读入每一行a++,a即表示总行数,然后对每一列按照\t进行分割,放入矩阵,比较每一列与a的大小,若有一列不相等,返回false。
  2. 矩阵中某些数字不是正整数:然后判断这些字符串是否包含”.”或者”-”,若包含,返回false。
  3. 不是以\t作为分隔符:在Integer.valueOfs时抛出异常,返回false

3.1.2 generateMagicSquare()

查阅 JDK 了解上述异常的含义,并分析该函数为何会产生这些异常。
在这里插入图片描述

第一种的异常是因为n是偶数的情况下,引起数组元素下标超出范围。
第二种的异常的因为n是复数,不能作为数组元素的下标。
思路:
将产生的magic square写入文件\src\P1\txt\6.txt中,当输入的n不合法时提示错误并“优雅的”退出,并输出false结束。参考实验指导书的函数,我们增加n的合法输入判断即可。
过程:
增加输入是否合法的检测,并再后面添加写入文件功能。具体过程如图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
实验结果:
在这里插入图片描述
在这里插入图片描述

Turtle Graphics

根据代码注释提示补全代码从而实现一个绘制工具Turtle Graphics。
1、从Github上获取任务的源代码,在本地创建git仓库,使用git管理本地开发
2、画出正四边形。
3、完成正多边形内角和外角的计算
4、计算向量之间的夹角
5、计算凸包
6、绘制自己的图形

Clone and import

使用git clone即可

Turtle graphics and drawSquare

已知边长,画出边长为指定数值的正方形。参数是海龟对象turtle和sidelength。执行4次的前进sidelength长度、转完90度,即可完成一个边长为sidelength的正方形。
在这里插入图片描述
在这里插入图片描述

Drawing polygons

(1)已知正多边形边数的情况下计算正多边形的内角度,使用公式计算,处理整数和浮点混合计算时需要注意处理:
在这里插入图片描述

(2)已知正多变型得边数和边长画出一个正多边形。参照画正方形的方法,可以先前进sidelength,再使海龟旋转一个角度,循环。再利用calculateRegularPolygonAngle(int sides),内角,旋转画出正多边形

Calculating Bearings

已知起点和角度,求到终点需要转动的角度。首先使用Math.atan2函数计算两点之间的边在坐标系的角度(得到弧度,然后调用toDegree转换成角度),。若角度为负值,需要加上360
在这里插入图片描述
然后调用上述函数,计算点的偏转角
在这里插入图片描述

Convex Hulls

运用Gift wrapping algorithm算法,先找到最左下角的点加入集合,然后比较剩余点到此点的偏转角,每次选择转向角最小的点加入集合,求转向角函数直接使用的之前写好的calculateBearingToPoint函数,最后即可得到凸包的点集

3.3 Social Network

要求设计一张社交网络图,实现Person和FriendshipGraph两个类,用边连接人与人模拟社会关系网,并且能计算任意两人之间的联系情况(最短路径)

设计/实现FriendshipGraph类

思路:
FriendshipGraph需要实现以下几个功能:

  1. addVertex向社交网络中添加新的节点(若已经存在则输出提示并退出)
  2. addEdge向社交网络中增加新的有向边(社交关系)
  3. getDistance求两个点之间的最短距离。
    1、2的实现较为简单,属于基本的数据结构,对于3,我们容易想到使用广度优先搜索的方式求最短路径。
    过程:
    (1)addVertex。在实现过程中需要注意增加的对象是否已存在
    在这里插入图片描述

3.3.2 设计/实现Person类

思路:
实现增加新朋友、得到本人名字以及好友列表的功能。
过程:
定义my_name存放本人的名字,friend_name存放朋友的名字、all_friends存放所有朋友(已经存在)的名字

在这里插入图片描述

若输入的名字在all_friends中,输出提示并退出,若不存在,则将这个名字加入all_friends中在这里插入图片描述

增加本人新朋友addnewfriend:直接加入集合即可
在这里插入图片描述

设计/实现测试用例

思路:
分别测试addVertex ,addEdge ,getDistance。
(1)addVertex,在test里面建立几个对象,执行addVertex,然后判断all_people里面是都有这些对象即可。
(2)addEdge,在test里面建立几个对象,执行addVertex与执行addEdge,然后判断他们的朋友关系是否是双向的。
(3)getDistance,在test里面建立几个Person对象,执行addVertex、addEdge后,使得三种距离可划分为三个等价类且存在。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值