软件构造lab1总结

实验环境

需要安装eclipse,jdk,git,将github个人仓库与本地仓库链接,设置相应的java环境变量。

Magic Square

需要理解幻方矩阵,是一个行列对角线和均相等的矩阵,本问题研究的是,如何编写简单的java程序去判断一个矩阵是否是幻方,需要对各种情况例如:行列对角线和不相等,存在非正整数,文件中并未以\t分隔,行列数不相等这些问题,并且需要理解幻方矩阵建立函数的运行,学会熟练运用java中文件的读写方法

isLegalMagicSquare()

将文件保存在File类型对象,按行读取矩阵文件的每一行至字符串,再用split以\t读取每个数据,得到行数和列数,以此判断是否为矩阵。该问题主要是要求我们熟练掌握java中读写文件的方法
在这里插入图片描述
在这里插入图片描述
将数据转换为integer类型,可以判断是否为正整数,如果数据有异常,说明数据之间并未用\t分隔开,之间返回false,如果符合要求,则一次保存在相应的二维数组中。在这里插入图片描述
如此便得到了一个保存了文件中矩阵的二维数组,进行for循环,求出每一行每一列,和两个对角线上数据的和,保存在sum数组中,将数组中0号元素与之后的元素比较,如果均相等,说明为幻方矩阵,否则返回false。
在这里插入图片描述

generateMagicSquare()

首先找到第一行的中间位置,初始为1,然后找到当前位置的右上一格,依次初始化数据依次加一,如果当前为第一行,则下个位置为最后一行的下一列,如果当前为最后一列,则下一个位置为第一列的上一行,以此类推,直到填满了所有数据为止。
添加写入文件的功能,则需要新建一个文件6.txt,将数组中每一行的每个数据后加\t填入文件,每一行最后填入\n写入文件,不要忘记关闭文件。在这里插入图片描述

Turtle Graphics

本任务要求从github下载源代码,然后进行补充,需要熟练学会使用各种函数接口,使用git

Problem 1: Clone and import

Git init初始化本地仓库,git add将文件夹添加到本地仓库,git commit提交文件夹,将本地仓库与github远程仓库连接,git push将本地仓库内容上传

Problem 3: Turtle graphics and drawSquare

只需调用turtle的forward函数,前进一段距离,然后调用turn函数转90度角循环四次可得到正方形
在这里插入图片描述

Problem 5: Drawing polygons

需要实现两个函数,通过正多边形的边数算出内角,和通过内角算多边形的边数,只需利用数学公式求得
在这里插入图片描述
然后实现多边形的路径,即依次循环边的次数进行forward边长和turn转动角度,转动角度是180-内角度数。
在这里插入图片描述

Problem 6: Calculating Bearings

1、第一个函数是calculateBearingToPoint,给出当前点和目标点,求顺时针转的角度,利用atan2函数先求出两点之间线段与x轴正方向夹角,则用90-当前与y轴正向夹角-与x轴夹角即为转动角度,如果角度小于0,则加上360即可
2、第二个函数是calculateBearings,需要用一个数组保存每次转的角度,需要利用上面的calculateBearingToPoint函数,求出每次偏转角,需要构造ArrayList对象

Problem 7: Convex Hulls

参考了Jarvis’March,先确定边界上的点和下一个点,从凸包上的顶点开始,每当寻找下一个点,则便利平面上所有点,找出最外围的一点来包围,利用叉积进行判断,重复加入到凸集中,直到下一个点与起点相同。
在这里插入图片描述

Problem 8: Personal art

循环1000次,每次前进距离与循环次数相关
在这里插入图片描述
在这里插入图片描述

Submitting

git push origin master,将本地文件上传到github仓库中

Social Network

该问题是实现一个社交网络,要求能够判断重名问题,和记录人际关系,要求能够后续扩展为有向图,即数据结构中的有向图。每个人看做一个点,人际关系看做连接两点的一条线,该问题由于当做无向图所以添加人际关系时,需要添加相反的两次。

设计/实现FriendshipGraph类

需要设置一个ArrayList保存所有成员,二维数组是矩阵,数组中的每个元素是行列值所代表的成员间距离,定义HashMap保存每个Person及其编号。
函数addVertex只需要在List和Map中添加即可,但需要判断是否出现重名,如果重名则需要输入提示,并且返回false。
在这里插入图片描述
函数addEdge,需要判断图中是否有该点,需要用到map的get函数如果返回有一个为null,则返回false,否则正常返回编号,在二维数组中将该行列的数据改为1。
在这里插入图片描述
函数getDistance用到了之前学过Dijkstra算法,首先判断是否为同一点,如果是返回0,如果有一点不在图中返回-2,否则选择第一个点,求所有点距该点的最短距离保存在一维数组中,输出所求最短距离,如果没有路径则返回-1,否则返回最短路径长。
在这里插入图片描述

设计/实现Person类

需要有一个private成员变量name,并为该变量设置get和构造方法
在这里插入图片描述

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

定义一个FriendshipGraph类对象,并且将保存距离的二维数组初始化将数据均设置为1000,也就代表了infinity,然后初始化Person类对象,addVertex并且为他们构造关系addEdge,调用getDistance输出

设计/实现测试用例

首先初始化,FriendshipGraph类和Person类
在这里插入图片描述
addVertexTest函数,assertEquals测试能否加入点,以及加入重复点的情况
在这里插入图片描述
addEdgeTest函数,分别测试两个点都在图中,两个点有一个不在图中,和两个都不在的情况
在这里插入图片描述
getDistance函数,分别测试两点间有最短距离,两点间没有路径,两点重合以及两点中至少有一个点不在图中的最短路径长度的情况
在这里插入图片描述

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

有时候不知道哪里出错了,就不要再继续看了,可以先休息一下,做做别的,回来才会发现问题,一定要多改改,每次测试过程中,都能发现代码不健壮的地方,再将其补充完整。编写代码前要先大体构思一下,想一想需要构造那些数据结构,以及函数之间的调用关系来实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值