HIT软件构造lab1

1 实验目标概述

实验目的:解决3个问题,来熟悉利用JAVA来进行编程
基本的Java OO编程
基于Eclipse IDE进行Java编程
基于Junit的测试
基于Git代码配置管理

2 实验环境配置

通过网络视频教学,完成jdk,eclipse,git的下载和配置过程

3 实验过程

3.1 Magic Squares

任务一:自己设定isLegalMagicSquare函数判断已有的数字矩阵是否是一个幻方
任务二:测试已有的generateMagicSquare函数,生成一个奇数行数的幻方

3.1.1 isLegalMagicSquare()

1.从文件中读取矩阵,判断是否矩阵中的每一行都由\d,\t,\n组成

2.判断行列是否相等,用String.split(‘\t’)来分隔字符串
3.判断行数和列数是否一致,来判断是否为方阵。
4.判断是否有浮点数和负数,若没有则将第一行数字的和作为基准,分别将每一行、每一列、正负对角线上的数字求和与之比较,出现不一致则证明不是幻方;否则,判定该数字矩阵为幻方。

3.1.2 generateMagicSquare()

(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格行数小于1,则放在底行,仍然要放在上一个放置的数的右一列;
(3)如果这个数所要放的格列数大于n,则放在第1列,仍然要放在上一个放置的数的上一行;
(4)如果这个数所要放的格行数小于1,且列数大于n,那么就把它放在第n行第1列;
(5)如果这个数所要放的格已经有数填入,那么就把它放在上一个放置的数的下一行同一列。

3.2 Turtle Graphics

3.2.1 Problem 1: Clone and import

直接登录github下载即可,下载后直接把文件上传到本地路径完成

3.2.2 Problem 3: Turtle graphics and drawSquare

drawSquare:turtle初试状态是朝向Y轴正向,且每一次只能右转
所以画正方形只需要画四条等长边,转三次90°即可。

3.2.3 Problem 5: Drawing polygons

与正方形相似,只不过利用角度和边数的关系即可

3.2.4 Problem 6: Calculating Bearings

根据当前的位置和朝向,判断去往目的位置需要右转的角度。直接利用Math.atan2函数计算出来由当前位置指向目的位置向量的与X轴正向的夹角,然后计算当前朝向的夹角,然后作差即可

3.2.5 Problem 7: Convex Hulls

先画一个正方形,turn(20),递增sidelength,循环18次。
重置sidelength,画正五边形,turn(20),递增sidelength,循环18次。
直到正八边形。

3.2.6 Problem 8: Personal art

HIT软件构造lab1

3.2.7 Submitting

如何通过Git提交当前版本到GitHub上你的Lab1仓库。
1.将完成的项目复制到本地仓库中,输入git add .将所有文件全部加入本地仓库;
2.输入 git commit -m “备注” 指令,将文件暂存到本地目录并且添加备注说明;
3.输入 git push -u origin master指令,将本地仓库同步到远程仓库。

3.3 Social Network

3.3.1 设计/实现FriendshipGraph类

实现过程,addVertex函数主要注意判断是否有重复的人名出现,利用Set来判断人名之间是否重复,同时记录初始化每个人的index变量并加入personList,方便记录。addEdge函数注意判断边的两个端点是否已经存在,如果存在则将对应的person2加入person1的“朋友”中。getDistance利用bfs来寻找最短路径,只需要从person1开始进行广度搜索直到person2为止,如果找不到之间输出-1,否则输出person2的成员变量distance即可

3.3.2 设计/实现Person类

Person类有5个成员变量,name为该对象的名字,与其对应的还有获得其名字的方法getName();其余的成员变量,distance为在某一次询问中距离起点的距离,visited为访问标志,friend为该成员拥有的单向朋友的集合,index为该成员加入某个graph时的顺序。

3.3.3 设计/实现客户端代码main()

客户端代码的测试主要利用可以确定答案且与实验手册中已经给出的样例相同。建立新的社交网络,在不改变测试样例的情况下检验输出结果是否一致;然后将rachel→ross的边删掉,手工检验结果是否一致;将ross的名字替换为“Rachel”,检验程序能否正常退出。
在建立与原社交网络相同的结构后,输出与样例相同;删除掉rachel→ross的单向边,与手工检验的结果“-1, -1, 0, -1”相同;在将ross的名字替换后,程序提示错误“Rachel name has been used”,结束程序运行

3.3.4 设计/实现测试用例

设计思路:(1)测试新创建的图是否为空,初始化检测;

1.插入新节点,测试addVertex方法是否能够实现功能;
2.插入name属性相同的节点,测试addVertex方法是否按约定抛出提示;
3.插入新的有效边,测试addEdge方法是否能够实现功能;
4.插入重复边,测试addEdge方法是否按约定抛出提示;
5.选取两个连通点,测试getDistance方法是否返回正确结果;
选取两个非连通点,测试getDistance方法是否返回-1