经过整整五天的高强度开发,我终于完成了软件构造的第一次实验。下面我谈一谈我个人的一些实验时的思路和实验后感受,希望能对在实验中遇到困难的学弟学妹们有帮助。
首先是第一个实验magicsquare。其主要任务是从文件中读取一个矩阵,判断其是否为幻方,还有对一个产生幻方的程序写注释(实际上就是读明白这个程序)。
首先要知道幻方的定义,这里建议查看百度百科
https://baike.baidu.com/item/%E5%B9%BB%E6%96%B9/169544?fr=aladdin
(百度百科里幻方的产生会对读产生幻方程序有很大帮助)
这里给一下我的思路:先假定其是正常的矩阵,先读第一行的字符串,把所有分隔符去掉后,根据字符串长度决定读取多大的矩阵(n个字符读n*n矩阵),然后判断是否合法,合法的话分别计算每行每列和两个对角线的总共2n+2个值,并算其是否相等。
本次任务的难点在判断矩阵是否合法,要考虑行数和列数不等的情况
如3*3矩阵中间一行少一个数:
* * *
* *
* * *
3*3矩阵多一行之类的情况(当然情况会更复杂,我只是随便举两个例子)。还有分隔符不是\t的情况。
中间一行少一个数的情况我的解决方案是一行一行的读矩阵,同时每读一次计算一次读了几个数,如果和第一行的不一样,提示错误并返回false。
多出(少)一行的情况我的解决方案是把数据放在n*n矩阵后重读一遍,若行数不为n则不合法。
总之第一个任务还算是简单的,就是从零构造有点烦人。
第二个任务是给一个java版本的海龟库(学过Python的同学应该知道海龟库是什么东西,简单来说是一种画图软件),要你按照他提供的库来完成各个任务。
这个任务比较像填空题,只需要按照规约,编写一些函数即可,个人认为其较易上手。直到第6个任务为止都很简单,第6个任务稍微有点难度但还好,第七个任务是本任务中最难的一部分,是一道关于凸包的题目(凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点)。简单说一下我的思路:取最“右下角”的点,设为p1,如果点数小于四,直接返回点集合;若不小于4,则设立一个凸包集合,最开始只有p1,然后在原来的点集合(副本)中把p1去掉。然后p1在原来的点集合中找需要转动角度最小的点,把其加入凸包集合里。若有两个以上转动角度最小的点,取离p1最远的点。然后把这个新加入的点设为新的p1。在第二轮循环时,把最开始从原来集合副本中去掉的p1加回到原来集合副本,这样当再次访问这个点时,说明凸包集合构造完毕,返回之。(本质是贪心算法)
第三个任务是一个人际关系网的实验,主要考验新建类和构建方法的能力。任务要求不太详细,有很多细节需要自己补充。这个任务最有挑战性的是getDistance部分。不同人有不同的思路,我的思路如下:
采用BFS,定义开始的点距离为0,用一个新队列distance来存,然后每一个新节点入队列,其距离都较父节点加1(父节点的距离在出队的时候也一并从distance中出队了)。当节点相同时,返回e.distances。否则说明两点不连通,返回-1。
这就是我对实验的一些思考和感想,希望能够有所帮助。