1 Magic Squares
该任务就是:
判断一个n阶矩阵是否是一个幻方,理解由奇数n生成一个n阶幻方的程序。
isLegalMagicSquare()的实现思路:
- 读入文件
- 分割数字,输入到数组中
- 建立循环函数,三次循环判断行,列,对角线是否满足幻方定义
isLegalMagicSquare()实现过程需要的学习任务:
- 学习java中关于如何读入txt文件
- 学习java中如何利用正则表达式分隔字符串
- 学习如何处理异常流并输出到控制台
- 学习隐藏异常信息防止干扰用户体验
- 将不满足条件的矩阵剔除,输出false
- 编写程序对满足幻方条件的矩阵的检验算法
generateMagicSquare():即罗伯法构造幻方
2 Turtle Graphics
任务理解:
徽标是麻省理工学院创建的一种编程语言,最初是用来在空间中移动机器人的。 添加到徽标语言中的Turtle图形,使程序员可以向移动的屏幕“ turtle”发出一系列命令,并随即画一条线。 Turtle图形也已添加到许多不同的编程语言中,包括Python,它是标准库的一部分。
综述,从github下载代码,根据函数作用的注释补充函数内容,并在turtle中完成目标操作
首先导入代码
在导入代码文件后,eclipseIDE出现很多错误提示,通过网上寻找资料发现问题出现在import上,只需将 import XXX加上前缀import P2.XXX即可解决
代码自带函数解读:
DrawableTurtle 初始化起点、方向、颜色、动作
forward(int steps) 将以当前方向和位置长画为steps的直线的动作加入actionList
turn(double degrees) 将当前方向顺时针旋转degrees(弧度制)的动作加入actionList
color(PenColor color) 将笔的颜色设置为color中颜色的动作加入actionList
draw() 在画布中画出actionList所有动作
画正方形:
turtle.forward是画边,turtle.turn是进行一次转角,于是我们就可以进行一次循环,完成4次便得到正方形
画正多边形
完成函数,并调用sides次forward和turn即可画出多边形
calculateBearingToPoint函数:以当前点为原点建立坐标系,则目标点可能在四个象限,先用atan函数求出角度,对这个角度在四个象限分别作处理,第一象限为90-a;第二象限90+a;第三象限270-a;第四象限270+a;再减去原来的角,判断正负,如果为负,+360。
calculateBearings函数:初始方向为0°,每次迭代用前一个点和当前点和当前方向,调用calculateBearingToPoint函数求出角度,加入结果的容器,调整当前方向,下一个点作为当前点,如此循环。
凸包的构造步骤为:
- 选取第一个点作为起始点
- 计算该点和其他所有点的转角
- 选出转角最小的点,如果有相同的,则选择距离当前点最远的
- 这个点为凸包的下一个点
- 重复以上步骤,直到某一个点的下一个点为第一个点
自画图
3 Social Network
任务理解:
编写两个类,一个person,一个friendshipGraph类,实现社交网络的模拟,实现添加点,添加边,计算距离等操作。对有向图进行各项操作,加入点,加入边,计算点之间的单个功能。
设计/实现FriendshipGraph类:
addVertex(Person newPerson)函数用来加入新的“人”到people列表,在此之前要在namelist中检查是否有重复的名字,有则输出提示
addEdge(Person p1, Person p2)函数在每个人的朋友列表中增加新的朋友
getDistance(Person Person1, Person Person2)函数,声明一个Map<Person, Integer> distantMap数据结构,来保存起点到当前点的键值对(名字,距离),使用邻接表广度搜索的方法,借助队列,先将起点入队,然后执行循环,直到队列为空前:弹出队列头元素,计算当前距离,把弹出点的所有“朋友”入队,并加入map中,设置距离为先前计算的距离+1。直到找到结束的节点。返回这个点在map中键值对的“值”。
设计/实现Person类:
包含保存名字的字符串
保存朋友的字符串
和他们相应的get方法getName()和getFriendList()