3.2.1 Problem 1: Clone and import
3.2.2 Problem 3: Turtle graphics and drawSquare
3.2.3 Problem 5: Drawing polygons
3.2.4 Problem 6: Calculating Bearings
本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开
发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够
为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。
另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
⚫
基本的 Java OO 编程
⚫
基于 Eclipse/IDEA IDE 进行 Java 编程
⚫
基于 JUnit 的测试
⚫
基于 Git 的代码配置管理
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
这部分分两个问题。
第一个问题是要求编写一个方法,从指定的txt文件中读取数据,并且判断读取的文件是否能够构成Magic Square(每行,每列,每条对角线的和都相等的矩阵)。如果满足条件则返回true,否则返回false。返回true的文件里,数据应该满足数字全部都是正整数,并且数与数之间用\t隔开。除此之外,对于非法输入,未按\t隔开,不构成矩阵等情况也要返回false,并且打印错误提示信息。
第二个问题是要求理解给定的方法generateMagicSquare()是如何生成Magic Square的,并且绘制流程图。然后对该函数进行扩展,使其能够将生成的Magic Square输出到\src\P1\txt\6.txt中,并且能够对于输入为偶数或负数时返回false,抛出错误信息。最后使用问题一编写的方法进行判断是否为Magic Square。
思路:先从文件中按照\t分隔的格式把数据读取出来放在一个二维数组里面,然后从行列数是否相等,每行、每列、每条对角线的和是否相等来判断是否构成Magic Square。如果行列数不相等,存在非正整数,数据未按\t分隔,应该报错,并且返回false。
过程:将FileReader包装成BufferReader,按行读取文件,把每一行当成一个字符串放入numstr,再把numstr中每个字符串按\t分割,放入temp,据此得到两个字符串数组,根据数组长度是否相等判断是否是矩阵
然后将temp中每个字符串转化成int,依次放入一个二维数组。在转化过程中,如果出现了异常,那么就说明存在非法输入(字母,浮点数等),或者是没有按照\t分隔
然后判断转化成的int是否是正整数
对于正常得到的二维数组,然后就分别对于每行每列每个对角线求和来判断是否相等,从而判断是否是Magic Square。
读给定的方法,可以得到流程图如下:
思路:在生成Magic之后,按照\t分隔,写入指定的路径即可。对于输入为偶数或者负数的情况下,加入if语句判断即可。最后将生成的路径作为参数,调用问题一的方法。
本问题是在引导之下实现并测试一个可以绘制图形的类TurtleSoup。具体需要实现的部分包括计算转向角,绘制多边形,计算凸包,调用完成的方法绘制图形,并且使用Junit进行测试。
首先打开老师提供的url,创建好远端仓库,然后在git bush中,使用git clone命令,将远端仓库克隆到本地(忘记截图了)。
然后设定本地的用户名和邮箱
git config -global user.name xxxx
git config -global user.email xxxxx
修改clone到本地的仓库,然后执行以下命令更新远端仓库
git add .
git commit -m “描述”
git push
前进sides,然后转弯90度,重复即可。
先按照内角和公式编写calculateRegularPolygonAngle
然后调用这个方法绘制多边形
calculateBearingToPoint部分:使用Math.atan2(反正切)计算两个点的连线与x轴正向的角度,然后换算成y轴,再减去初始角即可。如果小于0,则按照角度的周期性,加上360度即可。
calculateBearings部分:每个点到下个点的初始角又这个点和上个点的连线决定,然后调用calculateBearingToPoint即可。
先得到最左侧的点,然后循环找到顺时针转动角度最小的点作为下个点,如果有多个点角度相同,则取距离较远点,直到下个点是起点为止。
以下给出了找下个点的循环部分
此时应该所有的测试都通过
让i从1到1200,每次让i=i/3缩进,然后依次使用不同的颜色,并且进行转动
绘制出来的 图形如下:
按照3.2.1中的命令push即可
先实现person类,在类中应该包含姓名和朋友的信息,然后FriendGraph类构建person类之间的关系,通过修改person中的信息即可。
-
-
- 设计/实现FriendshipGraph类
-
思路:先创建person对象的列表,然后依次操作即可。需要在函数中检测是否有重名。具体思路看每个功能。
过程:
- addVertex:每次执行列表的add即可。重名检测放在person类中
- addEdge:需要扩展到有向图,所以a中加入b即可
- getDistance:采用广度优先搜索即可:如果队空了,则表明无法到达
-
-
- 设计/实现Person类
-
思路:类中应该包含名字和朋友,名字使用静态变量检测重名
此后只需要常规的get方法就行
-
-
- 设计/实现客户端代码main()
-
只需要测试是否graph中是否存在
- addEdge
只需要测试a中是否有b
- getDistance
需要测试无法到达(-1),自己(0),距离为1和大于1