目录
2 实验过程
2.1 MagicSquare
2.2 Turtle Graphics
2.3 Social Network
1.实验目标概述
通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO开发基本的功能模块,阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
2 实验过程
2.1Magic Squares
主要任务:根据MagicSquare的定义设计isLegalMagicSquare()函数;理解并扩展generateMagicSquare()函数。
实验难点:
1.读取文件的函数
本次实验我使用BufferedReader读取文件,使用其中的readLine()函数按行读出文件内容。
注意,在使用完BufferedReader对象后需要使用close()函数关闭对象。大致实现代码如下:
while((now = br.readLine())!=null){
m++;
n = now.split("\t").length;
}
br.close();
这里可以读出的m和n分别是行数和最后一列的列数,可以初步判断行列数是否相等。
2.使用正则表达式判断是否为正整数
character[i][j].matches("[0-9]+")
这里可以判断每个元素是否匹配正则表达式,得出是否为正整数。
3.理解MagicSquare生成的逻辑
程序框图:
这个程序实现了产生一个n行n列的奇异矩阵,主要算法如下:
- 将1放在第一行中间一列,从1开始到n*n每一个数存放在前一个数的前一行后一列。
- 如果行数或列数达到矩阵边界,则将行数重置为n-1,列数重置为0。
- 如果第i个数,i为n的倍数,则把下一个数放在上一个数的正下方。
2.2Turtle Graphics
主要任务:通过获得GitHub下的代码,进行一些修改再上传到仓库中,从而学习git操作。
实验难点:
1.练习使用git
本次实验主要使用的git函数如下
函数名 | 实现作用 |
git init | 初始化本地仓库 |
git remote add <name> <url> | 建立远程仓库 |
git add . | 增加修改 |
git commit -m master | 提交修改到指定分支 |
git pull <name> <branch> | 下载远程仓库的指定分支到本地 |
git push <name> <branch> | 上传代码 |
git rm -r --cached <name> | 删除指定文件夹 |
2.根据两点坐标和当前角度计算偏转角度,实现calculateBearingToPoint函数
这里我使用Math.atan2(y, x)计算极坐标下向量与x轴的夹角,用90减去该数值得到与y轴的夹角。
最终得到两个与y轴的夹角,差值即为偏转角度。
注意:这里使用的方法会使得测试用例中的第一个得出359.99,不能通过测试。此时的测试函数为:
assertEquals(0.0, TurtleSoup.calculateBearingToPoint(0.0, 0, 0, 0, 1), 0.001);
由于目标为0.0,而测试时无法把359.99转换为-0.01,所以需要在函数出口设计函数将359.99返回为-0.01。具体实现如下:
if(Math.abs(l-360) <= 1e-3) {
l -=360;
}
3.计算最小凸集
使用gift-wrapping算法求解。从一个最左的点开始一次计算每个点的偏转角度和距离,取偏转角小,距离大的点作为凸集的一部分,依次计算得出凸集。
public static Set<Point> convexHull(Set<Point> points) {
if(points.size() < 3) {
return points;
}
Set<Point> set = new HashSet<Point>();
Point xmin = new Point(Double.MAX_VALUE, Double.MAX_VALUE);
for(Point item : points){
if(item.x() < xmin.x()|| item.x() == xmin.x() && item.y() < xmin.y()){
xmin = item;
}
}
Point nowPoint = xmin,tempPoint = xmin;
double nowAngle = 0, minAngle = 360, tempAngle = 0;
double distance;
double maxdistance = -1;
do{
set.add(nowPoint);
for(Point item : points) {
if ((!set.contains(item) || item == xmin) ) {
tempAngle = calculateBearingToPoint(nowAngle, (int)nowPoint.x(), (int)nowPoint.y(), (int)item.x(), (int)item.y());
distance = (item.x() - nowPoint.x())*(item.x() - nowPoint.x()) + (item.y() - nowPoint.y())*(item.y() - nowPoint.y());
if(tempAngle < minAngle || ((tempAngle == minAngle) && (distance > maxdistance))) {
minAngle = tempAngle;
tempPoint = item;
maxdistance = distance;
}
}
}
minAngle = 360;
nowAngle = minAngle;
nowPoint = tempPoint;
} while(nowPoint != xmin);
return set;
}
2.3 Social Network
主要任务:设计有向图和顶点类,使用Dijkstra算法计算ab间的最短距离,并进行测试。
实验难点:编写测试类,由于初步接触JUnit,编写测试需要谨慎。
使用列表和getPerson函数比较测试addVertex和addEdge,根据设计的图计算最短路径与addEdgegetDistance返回的结果比较。
3 遇到的其他问题与总结
连接github出错。
此处参考了这篇文章,我遇到的问题是电脑ping不上github.com,因此更改了hosts文件的配置,增加了以下几行语句:
140.82.112.4 github.com
199.232.69.194 github.global.ssl.fastly.net
185.199.108.153 assets-cdn.github.com
185.199.110.153 assets-cdn.github.com
185.199.111.153 assets-cdn.github.com
以上便是lab1的实验总结,总而言之此次代码的部分不难,主要是增加了git的学习和github的使用,以及JUnit的测试编写,并且对课上介绍的spec有了更深的理解。