实验感想
虽然写实验一的总结已经是实验一结束好几周,实验一和现在的实验比起来有点小巫见大巫,但我还是忍不住吐槽一下,这门课对于一个转专业且没什么Java基础的人实在是不太友好 ,实验一给了我们一个很好的开头,算是一个友(can)好(ren)的过渡,P1的n阶幻方其实理解起来很简单,需要提前了解一下输入流(虽然对大部分人来说很简单,但我是菜鸡新手),然后P2真的很有意思,根据老师给好的模板自己完善去实现自己想要的图形(这个真的很有意思,真心话),然后P3的话就是一个图的实现,我做的比较简单。
P1
n阶幻方即一个边长为n的int型正方形,并且其每一行、每一列、对角线之和都相等。知道定义之后检测的思路也很明了,先判断输入的幻方是否符合标准:即检查是否是int型数字,行与列格式是否正确等,然后再进行对角线与行列的和是否相等,但其实这都不是问题,我的问题是怎么把文件中的幻方读入到程序当中,或许每个人的问题都不相同,但我的确被困在了这么个奇葩问题上(基础实在太差),在菜鸟教程上进行了有关知识的学习后完成了文件流的读入
首先我判断行与列个数是否相同,不相同直接返回false
然后进行了是否是整数的判断
最后检查每一行、每一列。对角线之和是否相等,这个很简单就不放代码了,就是每行每列暴力相加,只要有一个不相等的就返回false,然后经历了重重困难之后就可以返回true了(实在是不容易)
P2
1.正方形
这个任务实际上很简单,通过文件中已经写好的forward函数和turn函数让海龟行动即可,turn 90度,循环四次就可以得到一个正方形
3.2.3 Problem 5: Drawing polygons
此任务包含几个小任务
1)calculateRegularPolygonAngle
给定边数返回内角度数,通过数学公式很容易求得
return (double)180*(sides-2)/sides即可
2)calculatePolygonSidesFromAngle
给定边数返回内角度数,反解上式的方程即可
return (int)Math.round(360/(180-angle));
3)drawRegularPolygon
给定边数画多边形,调用上面的函数即可得到海龟转动的角度,循环n次就能得到n边形
3.2.4 Problem 6: Calculating Bearings
1) calculateBearingToPoint
计算两个点之间的方向角,通过两个点的坐标可以计算出两个点构成直角三角形的tan值,然后反tan可以得到角度,再减去初始的角度即可,注意把角度调成正值
2) calculateBearings
3) 函数计算边构成的向量之间的夹角,得出转动的角度的大小,使用上一个函数计算出角度。
3.2.5 Problem 7: Convex Hulls
首先获得坐标轴,凸包点集(用数据结构set实现)中x坐标轴极小点,极大点,以及y坐标轴最大点,最低点,将点集从左向右加入list,将其排序,并使用栈数据结构,按照极角值,一步步入栈,并判断是否在相邻点空间内(坐标比较),最终获得凸包点集
自己发挥,借助先前的海龟自己弄了个小图形
P3
p3实际上是考验我们对于图的构建以及遍历,更重要的是自己编写测试,其实很有用
person类构建的很简单,只有一个string域:name,以及一个获取name的方法
图的数据结构我采用了邻接矩阵
添加点集边集的方法如下
遍历方法采用DFS
而junit test的话我实现的比较简单(请原谅一个没有接触过Java,甚至c也学得不咋地的艺术类转专业菜鸟),自己构建了一个简单的图检测函数是否正确运行
大概就是这样