哈工大2023年软件构造lab1实验经验总结

目录

1 实验目标概述

2 实验过程

    2.1 MagicSquare

    2.2 Turtle Graphics

    2.3 Social Network

3 遇到的其他问题与总结


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放在第一行中间一列,从1开始到n*n每一个数存放在前一个数的前一行后一列。
  2. 如果行数或列数达到矩阵边界,则将行数重置为n-1,列数重置为0。
  3. 如果第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有了更深的理解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值