软件构造Lab1总结

第一次的实验其实主要是对于一个java基础比较好的人来说,其实不算难,但是对于我这样的java初学者,还是在实验过程中踩了很多坑的。

Problem 1 Magic Square

这个问题应该是4个问题里最简单的一个问题,从文件中读入一个矩阵,然后判断这个矩阵是否符合magic square的定义,只需要把矩阵的行列数据相加比较即可。但是其中还是有很多需要注意的地方

1数据大小

一般来说,想到矩阵,肯定是用一个二维矩阵来储存,但是这个地方的话,我们并不能提前知道矩阵的大小,所以唯一的办法就是设计一个很大的二维数组,但这在数据量小时对空间是一种极大的浪费,有一个更好的方法就是利用双重的Arraylist,利用list动态分配的特点,就可以做到不浪费空间。

2合法数据

对于每次的输入,我们需要判断输入的是否是正整数,这里直接catch NumberformatException 然后输出采集到了非法数据

Problem 2

这个实验是MIT的实验,应该是基于MIT先修的Python课程中的turtle,前面几个画图和算多边形的内外角的问题都比较简单,主要的问题在于算角度和凸包问题

calculateBearingToPoint

这个问题是知道现在所在点的坐标和目前所指方向,然后知道下一个点的坐标,求我们需要转动多少度。
首先,这两点的相对坐标有下面四种情况
软件构造Lab1总结_第1张图片
我们需要对这四种情况分类讨论,全部以相对于正北的角度来考虑。

凸包问题

这个地方利用的是卷包裹算法,从所有点中,找出x值最小的,如果有两个一样的,则比较y值。从这个点出发,找到所有点中最外侧的那个点,再从那个点出发,寻找下一个点,这样找到的每一个点,都是在凸包上。
软件构造Lab1总结_第2张图片
软件构造Lab1总结_第3张图片
利用向量的叉积确定外侧点,如让向量JK与JI相乘,得到一个负数,代表JI向量在JK向量的外侧。最后一个问题就是共线的问题,这里我让共线所有的点都算入凸包中,方法就是共线的所有点中首先取y轴坐标最小的点。

Problem 3

CMU的这个社交网络问题其实就是一个数据结构中的图模型,把人看做图中的点,人与人之间的关系就是图中的边。
因为实验中建议使用广度优先搜索,所以采用邻接矩阵的方式来表示图的信息,所以首先用了一个list来代表图中的每个点。
然后在Person类里也建立一个list代表与某个人有关系的所有人。

Problem 4

这个实验是4个实验中需要考虑的问题最多的一个,也是花费的时间最长的一个,主要是字符串处理的过程中需要考虑的情况很多。后面与室友讨论也发现,这个地方如果采用正则表达式来完成的话会简单许多,而不是从头到尾一个字符一个字符的扫描判断。

最后附上一些在实验过程中遇到问题的解决办法
eclipse设置pom.xml打开方式
https://blog.csdn.net/wobendiankun/article/details/24832119
Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing
https://blog.csdn.net/sunny2038/article/details/6926079/
学习凸包(五):卷包裹算法–兼解POJ1113(JAVA)
https://blog.csdn.net/jiuai455/article/details/8596043
Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法!
https://blog.csdn.net/chenleixing/article/details/44816629
eclipse中package,source folder,folder区别
https://blog.csdn.net/zhu_xun/article/details/21242501

你可能感兴趣的:(JAVA)