Lab1-实验心得

痞子三分冷 提交于 2020-03-04 09:33:13

一、Magic Square

相对路径
这部分遇到的第一个问题是输入矩阵的文本找不到,后来经过查资料和测试发现,相对路径应该是Sting path=“src//P1//txt//”+“文件名”,在路径开始时用./src和src均可,/src不行。
非法字符排除
最初在写代码的时候直接将所有的矩阵按行读入后,进行tab分割,并转化为整形存进二维数组,但是对于有不是用tab隔离的文件或包含小数的文件,程序会报错。最终的解决方式是按行读入文件后,首先对每行字符串进行判断,如果字符中存在除数字和tab外的其它字符(如“-”,“.”“ ”等)表示输入不合法,跳过后续步骤判断“不是魔方”,如通过了此次判断,则用tab对字符串进行分割,将每个分割后的字符串转换为整形字符存入数组,在全部读入后进行求和和比较。
Git提交
这部分在提交时txt文件夹在目录下始终是灰色文件夹的状态,不能打开。我上网搜索了一下原因,有很多说是因为这个文件夹下有git相关文件,删除就可以。但是我的文件夹下(包括隐藏内容)只有六个.txt文件,最后采取了先把文件移到其他文件夹下,最后再复制粘贴的方法。但是还是没有从根本解决这个问题,以后会继续查资料找到问题的原因。

二、Turtle Graph

凸包问题
这是这次实验困扰我时间最长的一个问题,因为没有接触过凸包算法,几何的功底也比较薄弱(捂脸哭),所以这部分对我来说很有难度。
我查找了一些资料,了解了一些凸包算法,最后采取的算法是对散点中任意两点进行连线,当其余所有点都在连线的同一侧时这对点就在凸包上。如果出现了多点在同一条凸包边界上的情况,只取连线最长的两个点作为凸包上的点。

       if(x1!=x2)   //两点之间存在斜率
       {
           double k=(y1-y2)/(x1-x2);//求斜率
           double b=y2-k*x2;  //求一次函数的常数项
           flag=0;
           for(q=0;q<size;q++)    //对所有的点进行遍历
           {
            if(q==i||q==j)     //除去线段的两个端点
            {
             continue;
            }
            double x3=points1[q].x();
            double y3=points1[q].y();
               
           if(x3*k+b<y3)     //在函数图像的上方
           {
                if(flag==2)
                {
                 flag=3;
                }
                else if(flag==0)
                {
                 flag=1;
                }
           }
           else if(x3*k+b>y3)    //在函数图像的下方
           {
                if(flag==1)
                {
                 flag=3;
                }
                else if(flag==0)
                {
                 flag=2;
                }
           }
           else                //在函数图像上
           {
               double m=x1-x3;
               double n=x2-x3;
               if(m*n<0)      //比较是否在线段上,放弃三点连线中间的点
               {
                 flag=0;
               }
               else
               {
                 flag=3;
               }
           }
       }
       if(flag==1||flag==2)
       {
            hullPoints.add(points1[j]);
            hullPoints.add(points1[i]);
       }
   }

Personal art
最后要求自己设计一个图案,参考了网上的一些图案,以下是我的设计结果和代码
在这里插入图片描述

 for (int i = 0 ; i < 1000; i++) {
            turtle.forward(i);
            switch ((i/10)%5) {
                case 0:turtle.color(PenColor.RED);break;
                case 1:turtle.color(PenColor.MAGENTA);break;
                case 2:turtle.color(PenColor.PINK);break;
                case 3:turtle.color(PenColor.ORANGE);break;
                case 4:turtle.color(PenColor.YELLOW);break;
                
            }
            turtle.turn(89);
        }

三、Social Network

广度优先搜索算法
最开始在用队列做广度优先算法的时候采用front的值记录最短路径,后来发现front只是记录了遍历的所有“父节点”,而在本题中需要记录的是遍历的“层数”。因此在实现的过程中,用front记录正在遍历的所有结点的“父节点”,rear记录正在遍历的结点,定义List类型L1 L2,L2记录在同一front下rear遍历过的所有值,当front的值在L1中时,表示在遍历同一层,当front超出L1的范围时表示换层,L2赋给L1,L2重新开始记录,直到遍历结束,L1更改的次数即为层数(最短路径长度)。
JUnite测试类
在问题二中已经接触过一次JUnite测试类的代码,由于应该导入Junit4,而我最开始导入了JUnit3导致始终不能正常运行耽误了很多时间。在写测试类代码的时候,用到最多的语句是

assertEquals(3,graph.getDistance(p3, p6),0.00);

需要设计很多特殊情况和输入违法情况。在这次实验中,我按照题目顺序先写了代码后写了测试类,在测试过程中消耗了很多时间,日后应该养成测试优先的编程习惯,事先编写测试类,一边写代码一边进行调试,可以尽早的发现错误,节约时间和精力。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!