哈工大lab1实验部分问题解决心得

lab1中有三个问题需要解决,其中以下的问题我觉得对于我这种新手来说难度很大,在参考了部分资料后,自己尝试模仿写出了这些代码,并觉得这些代码值得复习和记录下来。

首先来看第一个问题吧:

一、Magic Squares

该任务的目标:1、设计isLegalMagicSquare()函数,判定给定的几个矩阵是否为magicsquare;2、将generateMagicSquare()函数作为静态函数加入程序代码中,该函数作用为产生一个奇数阶的magicSquare;3、对第二个函数做扩展,将生成的矩阵存入6.txt并调用isLegalMagicSquare()判断所生成的矩阵是否正确。该阶段涉及到对某些特定函数的调用(例如split等)、文件读写操作、对部分异常的处理(例如矩阵中有负数、浮点数,或是行列数不相等)等。

(1)关于isLegalSquare()方法:

①首先需要能够读取文件内容,关键是怎么读。考虑一行一行读入方便,所以设置一个字符串接纳每一行的读入(即代码中的String txtLine),还需要设置一个字符串数组String[] matrixLine,用于将字符串中的每一个数字字符串分隔开存放。

 要使用一个File类和Scanner类用于读取文件。

②判断文件是否为空,如果文件为空需要输出相应信息。

 

③现在要考虑该幻方的边长(在这里也就是指一行数字的个数),我们可以选择先读入一行,在之后的循环中每一行都进行一次比较,查看是否列数相等。需要用到两个函数完成读入和分割:

 

④设置int型数组magicSquare和数组colsum、rowsum,用于存放每一行或每一列的和,数组diagSum只设置两个元素,分别存放上斜对角线和下斜对角线的和。

⑤进入循环,考虑到各种输入情况,我们要使用异常捕捉,保证每一种错误输入都能“优美地”结束程序。

由于第一行已经读过,所以我们无需再读一次,除此之外,每一次读取一行,我们都需要做一次分割写入数组matrixLine,且在分割后进行判断,判断是否每一行的数字个数相等。

在外层for循环内,我们使用一个for-each循环,该循环利用parseInt(String temp)方法将二维数组赋值,同时对每一行和每一列的和相加存入对应数组。由于外层循环完毕后,i多加了一次,最后需要i--。并且在这之后增加判断,如果此时的i值不为length-1,说明行和列数不等,将要弹出对应信息。

⑥异常捕捉:

 

分别对应输出相应信息,即输入格式错误以及由于数组访问越界判断出的列数行数不等。

⑦最后是简单的判断各个和相加是否相等了:

 

哪种情况不相等需要显示相应信息,最后函数返回true表示该数组确实是幻方。

运行结果展示:

(2)关于generateMagicSquare()方法

产生一个幻方的流程图展示如下:

注意,这种算法中n不能为负数或偶数。

还需要增加n的输入判断,在每次输入偶数或负数时都显示相应错误信息,同时让用户重新输入:

 ​​​​

 二、​​Turtle Graphics

 这一部分前面都是比较简单的操作,只需要按照要求写出画图形的代码。最难的部分为凸包部分,这一部分要求我们实现一个Convex Hulls方法。

使用较简单的算法Gift-wrapping算法,该算法描述如下:

我们发现任意凸包上的点,以该点建立一个极角坐标系,该点连结其它所有点的极角中,该点逆时针方向的第一凸包点到该点极角最小,如图,P0到所有点的极角中P0P1极角最小。

算法中首先找到最左边的点,这个点必然在凸包上,然后计算该点连接点极角最小的,这里计算有技巧,算法中进行toright测试,直到找到到最右端的点,找到P1后,就可以从P1开始,接着顺次找到P3,又以P3为起点……如此一直重复,直到P12找到了P0,于是我们得到了一个凸包。

首先我们构建一个Set类,

用headPoint表示第一个放入点集的点,nextPoint表示下一个将要放入点集的点,curPoint是当前遍历到的点。

首先判断点集points的size是否足够,如果小于等于3则直接输出相关信息。

然后需要找到第一个点,我们找到点集中最左下角的点。将该点加入到点集中,并且设置为当前点。

之后就是不断循环找出下一个点。代码如下:

最后返回点集convexHullPoint。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值