软件构造--针对Lab1个人出现的问题

这里主要叙述一下针对个人实验中出现的问题以及部分解决方法。(PS:这篇博客是在交完实验1后完成的部分,即4月初,现在已经6月初。。。凭借自己记忆和报告代码开始回想。。。如有不足,希望指正,谢谢!)

一.P1处理过程中出现的问题

这一部分讲述幻方矩阵实验部分的问题和解决方法。

针对这一问题,大家都会有思路,无非就是从文本文件读取,然后切分,最后转化类型,存入数组中。
1. 我这里首先讲一下存入数组的过程。java和c对于数组不同的地方就是c的数组要定义大小,而java则有动态数组ArrayList这一类,所以我们在做实验时,由于输入的规模是由文件中的数据来决定的,相当于对于我们就是未知的,最好使用动态数组避免数组越界问题的发生。
有的同学可能会想使用一个非常大的二维数组,这样就可以不会越界。但是这也同时造成了不必要的空间浪费,对于我们来说并不是最佳方法,所以还是推荐使用动态数组。
在这里插入图片描述
我采用的是上面的方法,先定义一个字符串动态数组,然后从文本文件中读取出来并存入,避免了重复读取。
我们可以利用java中ArrayList中的.size()方法来获取其大小,从而也就获取了文本文件中矩阵的行数。知道了行数,我们就可以利用java二维数组的特性,定义一个已知行数,未知列数的二维数组。
2. 第二部分讲一下数据类型转换过程中的问题。

这里仅强调一点,由于从文本文件读取的过程中,有的文本文件是不规范的数据格式,即每个数字之间可能不是采用 " \t "分割,所以在读取字符串并将其转化为整数时,采用 try…catch…处理异常,防止程序抛出异常结束运行。

二.P2处理过程中出现的问题

在实验的第二部分中,主要是实现一个几何图形的描绘。
第二部分较为复杂点的实现主要在问题7,实现凸包函数。

凸包就是一个点集的一个子集,这个子集中的点连接起来可以包含所有的点且这个子集中元素个数最少。
在这里我介绍一种方法适用于使用Java语言的初学者

在这里插入图片描述
通常情况下大家会想计算凸包,直接把它围一圈就可以了,然而计算机并不会这么做,Java代码在围这一圈的过程中也是要进行复杂的计算的。
但是Java是有办法的,如上图所示,显而易见的是,距离原点最远的点一定是凸包的某个顶点,所以先找到最右上角的点,假设初始方向是指向上的,让这条射线顺时针旋转,转过最小的角度触碰到某个点,这个点就是凸包上的点(如上图右上角彩色线标识),再加上上一次转过的角度为初始方向,这样重复下去,知道遇到第一个点为止,这样凸包就计算出来了。

具体实现的代码这里不再提供,Lab1过程分析中已经给出详尽了。

三.P3处理过程中出现的问题

该部分实现社交网络图,寻找两个人的最短距离,由于各边权值设定为1,采用数据结构的广度优先遍历。
在这里插入图片描述
借用如上个人简略画一个图来表示一下,假如说,abcdef各个顶点之间边的权值都是1,我们要求a->f的最短路径长度。

先从顶点a进行广度搜索遍历,与a连接的点有b和c,然后标记a已经被遍历过。采用队列的形式,将b与c加入队列中,同时标记b,c已经被访问过。

接下来遍历b点,与b相连的点有c,d,e这里c已经被标记为访问过,所以不在访问。将d,e两点加入队列,接着从队列弹出点,访问c点,与c相连的有e和f,由于f已经到的目标点,此时返回层数+1即可,最短路径为3。
采用如此类似的广度遍历的思想,即可轻松求取出边权为1的最短路径长度。

注意,有的边的方向是双向的,有的边是单向的,以及要记录某个点是否被访问过,建议不要在类的属性中加入visited属性,这样如果第一次遍历时该点访问过。第二次求取最短路径,如果包含这个点,很可能会被忽略掉,可以采用List,将访问过的点加入进去即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值