软件构造1——lab1P1P2P3心得

第一次学Java,说实话还是有点困难的,期间我上网上查了不少东西,现在先放一些链接都是我在完成这次实验的过程中用到的(由于本人是小白,查的东西有点多,大家见谅)
XMU1016 Magic Square【幻方构造】:https://blog.csdn.net/lianai911/article/details/47832673
Java中判断字符串是否为数字:
https://www.cnblogs.com/kexianting/p/10391166.html
Java的try…catch的用法和作用(为什么要用try…catch):
https://blog.csdn.net/qq_36186690/article/details/81172500
https://www.cnblogs.com/coder-zyc/p/10364528.html
java读取文件完整版:
https://www.cnblogs.com/JonaLin/p/11057398.html
java写入文件的几种方法:
https://blog.csdn.net/BanketBoy/article/details/86504704
Math类常用方法解析:
https://blog.csdn.net/Goodbye_Youth/article/details/81178103
java double类型保留位数、double转int:
https://blog.csdn.net/qiy6010/article/details/78783070
Java中List集合的三种遍历方式(全网最详):
https://www.cnblogs.com/lianoulay/p/8849747.html
GiftWrapping算法解决二维凸包问题:
https://www.cnblogs.com/hxsyl/p/3222688.html
Java面试题10(如何取到set集合的第一个元素):
https://blog.csdn.net/weixin_30755393/article/details/98763437
Java Set.contains()方法:判断Set集合是否包含指定的对象:
http://c.biancheng.net/view/4755.html
Java从控制台读取数据:
https://www.cnblogs.com/zhuangbijingdeboke/p/12077225.html

以上的网站都是我在完成这次实验的过程中用到的网站。
然后就是我对P1、P2和P3的一些分析:
1.1 Magic Squares
在这道题中,我们需要一个方法,去验证一个矩阵是否是Magic Squares,但是需要能够处理输入文件的各种特殊情况,例如:文件中的数据不符合Magic Square 的定义(行列数不相等、并非矩阵等)、矩阵中的某些数字并非正整数、数字之间并非使用\t分割、等。若遇到这些情况,终止程序执行(isLegalMagicSquare 函数返回 false),并在控制台输出错误提示信息。
1.1.1 isLegalMagicSquare()
按步骤给出你的设计和实现思路/过程/结果。
先int Line=0,Row=0;存储行line和列row的值。用try,catch看是否能打开文件,能打开我们就看有多少行多少列。如果行和列的值不相等就直接返回false。否则,他的行和列数相等,重新读这个文件,获取每个数。判断是否是正整数,如果有不是直接返回false,否则我们继续往下判断。我们定义int[] SumRowAndLine=new int[Line+Row+2];存储行列对角线的和。然后就用一个循环比较行列对角线的值是否都相等。
1.1.2 generateMagicSquare()
按步骤给出你的设计和实现思路/过程/结果。
在这个方法中我们主要是把pdf中给出的方法改一下,由于pdf中给出的函数只能产生奇数阶的Magic Square,所以我们应该在方法开始的时候首先判断是否是正奇数,否则就直接返回。我们用try catch,防止创建文件失败。判断文件是否存在,如果文件不存在,就创建一个新的文件,如果存在,我们就删除文件然后重新新建一个,因为我们不知道这个文件里原来存的是什么。
1.2 Turtle Graphics
在这里简要概述你对该任务的理解。这道题主要是画图,老师已经给出了forward()和turn()这两个方法了,我们在画图的时候只需要疯狂的循环调用这两个函数就好了,后面计算角度的那个还是挺难的,我在草稿纸上画了半天才想明白怎么计算角度。然后是一道题给了两个list然后然你计算角度,由于我们已经计算完上一问了,我们只需要循环调用就好了。最后一个问是真的难,可能是对我来说的。卡了我一个上午,就是由于前面几个方法写的健壮性不够,当数值变成NaN的时候就不好使了,然后就开始疯狂地该前面的,还有一些判断边界值的问题。
1.2.2 Problem 3: Turtle graphics and drawSquare
画一个正方形就是循环四次,每次先直走再拐弯
1.2.3 Problem 5: Drawing polygons先完成两个函数,一个是public static double calculateRegularPolygonAngle(int sides)另一个是public static int calculatePolygonSidesFromAngle(double angle);
1.2.3.1 calculateRegularPolygonAngle(int sides)用边数计算角度就是利用公式:(n-2)*180/n
1.2.3.2 calculatePolygonSidesFromAngle(double angle)由角度计算边数就是利用公式:360/(180-α);但是我们需要注意四舍五入
1.2.3.3 drawRegularPolygon(Turtle turtle, int sides, int sideLength)然后我们就先用边数计算角度,然后在循环画图形就好了
1.2.4 Problem 6: Calculating Bearings
1.2.4.1 calculateBearingToPoint(double currentBearing, int currentX, int currentY, int targetX, int targetY)
计算由一个点转向另一个点的角度,我们先利用Math.toDegrees(Math.atan((tX-cX)/(tY-cY)))计算出这两个点之间的跟Y轴所成的角度,然后再跟currentBearing做差就能得出结果了,但是需要注意的是,我们计算出来的每一个叫的都应该是一个介于0到360之间的角度,所以对于每一个计算出来的角度我们都应该有一个if判断。
1.2.4.2 calculateBearingToPoint(double currentBearing, double currentX, double currentY,double targetX, double targetY)
重写函数,主要是为后面的使用
1.2.4.3 List calculateBearings(List xCoords, List yCoords)我们只要循环的调用calculateBearingToPoint(double currentBearing, int currentX, int currentY, int targetX, int targetY)就好了,但是需要时注意的是,double Temp_Turn=calculateBearingToPoint(angle,TempX_Current,TmepY_Current,TempX_Target,TmepY_Target);应该是这样,同时angle初始化成0。
1.2.5 Problem 7: Convex Hulls
这道题先上网上查一下思路(由于我原来没有做过这种题),然后我们思路就是先找到一个横坐标最小的点里面纵坐标也是最小的点,然后对集合里面的所有的点求一次calculateBearingToPoint(double currentBearing, double currentX, double currentY,double targetX, double targetY),然后选出角度最大的那个,作为下一个点,循环的调用直到选择的点跟横坐标最小的点里面纵坐标也是最小的点重合,或者目前的点跟横坐标最小的点里面纵坐标也是最小的点的连线垂直于X轴,就是循环的结束。
1.2.6 Problem 8: Personal art
我就直接画了一个“工大”
1.3 Social Network
在这里简要概述你对该任务的理解。这道题就是我们需要两个类,然后实现各自的方法。在做test检测的时候,我发现在编写的时候考虑很不充分。
1.3.1 设计/实现FriendshipGraph类
给出你的设计和实现思路/过程/结果。我们先定义一个集合,由于图中的点都是不相同的,所以我们就直接用Set定义Set PersonSet = new HashSet();然后我们依次完成每一个方法就好了。
1.3.1.1 addVertex(Person person)
这个方法是向图中增加点,我们首先需要判断这个点是否已将在图中的,用PersonSet.contains(person)即可判断,如果已经在图中了,我们就应该输出一条提示讯息并返回false,否则我们就应该将这个点加到图中,返回true。
1.3.1.2 addEdge(Person p1, Person p2)
这个方法是向点上加边,由于一个点上不一定有几条边,所以我们在Person类里也定义了一个Set来存放这些边,然后我们首先应该检测这两个点是否都在图里,如果有一个点不在图里,那么我们就不能向这些点上加边,我们应该输出一条提示讯息并且返回false,如果都在图里,我们应该先看这两个点之间有没有边,如果已经有边,我们就应该输出一条提示讯息并且返回false,否则我们才向点上加边。
1.3.1.3 getDistance(Person p1, Person p2)
这个pdf已经要求用BFS实现了,就是使用队列,java中已经有Queue,所以我们直接调用这个ADT,然后写BFS就好了,主要思路是,我们首先应该检测这两个点是否都在图里,如果有一个点不在图里,那么我们就不能计算距离,直接返回-1,并且输出提示讯息,如果都在图里我们就将p1入队,将visit标记成true,然后将p1出队,将与p1有边的点全都入队,重复这个循环,直到我们找到了p2或者队空。然后我们再判断是否已将找到就完事了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值