软件构造博客1 实验LAB1部分心得记录

Question 1 Magic Squares

  在编写isLegalMagicSquare()函数时,需要注意的方面有:

    1.数字不能重复,必须是正整数。

    2.输入文件格式要正确,数字之间要以制表符分开。

    3.幻方格式要正确,必须是标准的正方形。

    4.对角线,行,列的和必须相等。

  除了关注幻方本身,还要关注文件读取是否会出现异常,用try catch语句处理异常。

      

  在阅读generateMagicSquare()函数并查阅资料后,可得知该函数采用Siamese方法构造函数,具体方法如下:

  • 1放置在第一行的中间。
  • 顺序将2,3,\dots等数放在右上方格中。
  • 当右上方格出界的时候,则由另一边进入。
  • 当右上方格中已经填有数,则把数填入正下方的方格中。
  • 按照以上步骤直到填写完所有N^2个方格。

该方法只能用于奇数级幻方构造,偶数报错java.lang.ArrayIndexOutOfBoundsException::原因为越界访问数组。当填入了偶数,必定有一个n的倍数被填入[n-1][n-1],此时由于原函数未作防越界措施:

if (i % n == 0)

row++;

导致row越界访问,而即使做好防越界措施,计算得出的幻方也不正确。

负数报错java.lang.NegativeArraySizeException:数组的规格被定义为负数,因此报错。

Question 2:Turtle Grapic

  在实验过程中,个人认为Convex Hulls带来的困难较大,另外比较简单。

  首先明确函数的目的以及凸包的定义:该函数目的为计算一系列点阵中构成凸包的点,其中点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。图1中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包。值得注意的是凸包不包括凸包已有线段上的点。

  本人采用的凸包算法为:寻找x坐标最小的点位,并在其中寻找y最小的点,以此为起点,y正方向为初始位置,利用上一个Problem中的计算偏转角度函数寻找偏转角度最小的点,并以那个点为起点继续寻找。

  编写程序过程中出了两次错误:一是没有仔细查看凸包概念,把边界上的点也算入凸包了,在检查test文件以后发现了问题并修改。二是计算偏转角度的函数出错:

 

  要注意偏转角度不能超出0-360的范围,还要注意的是java的atan()方法返回值为弧度制,且范围为-Π/2-Π/2,需要自己调整范围。

  函数caculateBearings()是计算一系列点之间的偏转角度,需要提前了解List类型的使用方法。另外只需要调用上一个函数进行计算即可。

Question 3:Social Network

  主要关注Java类的编写,其中成员为保证安全应该使用private前缀,防止外部直接访问。

  测试的编写要关注多种情况,如对于计算社交距离的函数,应该尝试测试未添加的节点,不连通的节点,有多条通路的节点,重复的节点。

 

 总结

  以前对Java语言不大熟悉的我,经过第一次软件构造实验,初步体验了Git使用与Java的编写。自学的能力也得到了提升,希望在今后的软件构造课程与实验中,我能保持学习状态,更进一步。

posted @ 2022-05-17 16:05  Asteraria  阅读(30)  评论(0编辑  收藏  举报