一、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);
需要设计很多特殊情况和输入违法情况。在这次实验中,我按照题目顺序先写了代码后写了测试类,在测试过程中消耗了很多时间,日后应该养成测试优先的编程习惯,事先编写测试类,一边写代码一边进行调试,可以尽早的发现错误,节约时间和精力。
来源:CSDN
作者:周岐
链接:https://blog.csdn.net/weixin_45133977/article/details/104646488