软件构造lab1

        补发一下之前做的实验报告

  1. 实验目标概述

本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开 发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够 为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。 另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。

· 基本的 Java OO 编程

· 基于 Eclipse IDE 进行 Java 编程

· 基于 JUnit 的测试

· 基于 Git 的代码配置管理

  1. 实验环境配置在之前已经下载过eclipse的基础上,配置安装插件Junit,用以进行单元测试。注册GitHub并创立仓库,使用Visual Studio Code作为接口上传代码文件至GitHub仓库。

在这里给出你的GitHub Lab1仓库的URL地址。

  1. 实验过程
    1. Magic Squares

该问题需要从文件中读入一个矩阵,并判断其是否为幻方,即各行、列、对角线上的元素和是否相等。同时注意判断各种出错情况,如数据不是矩阵、某些数字非正整数、数字间未用\t分割等。

      1. getFileSize()

采用BufferedReader的readLine()方法,先读取并记录矩阵行数,第二次循环时用split(“\t”)方法分割即判断矩阵列数,若矩阵行列数不相等有两种可能:1.矩阵由非法字符隔开,无某些元素法被分割导致列数减少;2.输入的矩阵不是方阵。此时可以对该行尝试整型的强制类型转换,若try...catch...捕捉到异常,则证明为前者,反之为后者。

      1. isLegalMagicSquare()

若经3.1.1方法判断矩阵无误(即返回值countRow != 0),则可进行进一步操作。同样按行读取并用split分割元素,将得到的元素存入一个二维数组中。此后用四次循环分别遍历矩阵的行、列、两个对角线元素之和是否与定义相符。

      1. generateMagicSquare()

将题目所给方法作为静态函数加入MagicSquare类中,再补充输入参数的判断、文件的写入即可。

该方法即把1放在第一行正中,按以下规律排列剩下的(n×n-1)个数:

(1)每一个数放在前一个数的右上一格;

(2)如果这个数所要放的格行数小于1,则放在底行,仍然要放在上一个放置的数的右一列;

(3)如果这个数所要放的格列数大于n,则放在第1列,仍然要放在上一个放置的数的上一行;

(4)如果这个数所要放的格行数小于1,且列数大于n,那么就把它放在第n行第1列;

(5)如果这个数所要放的格已经有数填入,那么就把它放在上一个放置的数的下一行同一列。

    1. Turtle Graphics

按照给定规则(forward、turn等),结合MIT的实验要求和代码注释,补充完成TurtleSoup.java中的目标方法。

      1. Problem 1: Clone and import

如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。

获取代码:访问https://github.com/rainywang/Spring2021_HITCS_SC_Lab1/ tree/master/P2下载P2文件夹,获取任务代码。

git init 初始化仓库

touch.gitignore 创建ignore 文件,并且后面编辑该文件

git add. 将当前目录暂存

git commit -m “idea init”

git remote add origin

git push origin master --force 强制覆盖远程分支

之后下载数据文件和已提供的代码,对应好目录之后再次提交推送

      1. Problem 3: Turtle graphics and drawSquare

问题:给定爬行长度sideLength,使用turtle画一个边长为sideLength的正方形。

解决:用一个for循环,执行四次直行forward以及转角turn即可。运行结果如下图:

      1. Problem 5: Drawing polygons

先实现两个功能函数:由正多边形边数求内角、由正多边形内角求边数。分别由公式angle = 180.0 - (360.0 / sides)以及sides = (int) Math.round(360 / (180 - angle))完成。

再利用上述函数由所给边数得到内角度数,用与画正方形类似的方法即可完成绘制。注意turtle旋转的角度实际上为外角度数,用180减所得内角度数即可。drawRegularPolygon(turtle, 9, 50)运行结果如下图:

      1. Problem 6: Calculating Bearings
  1. 先实现函数calculateBearingToPoint;即给定当前方向、当前点和目标点,计算由当前状态顺时针转至目标点所需角度。可用正切值计算前后两点角度,再用当前方向减去即可。需注意每一步负角度的处理以及当前角度的参照是y轴正方向,而所求正切值对应角度的参考方向为x轴正方向。
  2. 在此基础上实现calculateBearings函数,先定义列表储存传入坐标值:List angles = new ArrayList< >(); 再用for循环遍历列表中前后元素夹角即可。
      1. Problem 7: Convex Hulls

问题:凸包问题,即给出一组点的坐标,求最少的点的集合,使其他所有点都被包裹在这个闭合多边形内。

解决:1.当集合中的点小于等于3时,直接返回原集合即可

2.寻找点集中最左下角的点,以之作为起点

3.逐一判断到达下一个点顺时针所转过的角度,选择最小的作为下一个点。若存在旋转角度相同的点,则判断并选择与基准点距离较远的点。因此增加了public static double distance(double x1, double y1, double x2, double y2) 方法以求得指定两点间的距离。

4.以前后二点连线方向作为当前方向,逐次寻找旋转角度最小的点并放入新集合convexHull中。

5.当目标点与起始点重合时,说明以完成点集的寻找。此时由于集合set类型不存放相同的元素,故不需要对重复选取的起始点做特殊处理。

      1. Problem 8: Personal art

要求自主设计实现一个图形的绘制。

经过100次循环,每次由switch函数交替从六种颜色中选择一种为画笔颜色,逐边、长度递进(i*2)地绘制六边形。

绘制结果如下:

      1. Submitting

如何通过Git提交当前版本到GitHub上你的Lab1仓库。

由于vs code实现了提交的可视化操作,只需点击提交、推送即可。

    1. Social Network

该任务要求实现一个社交网络图,该图是无向图,并且可以被扩展为有向图。图中,如果A和B认识,则A与B之间就会有一条连线,同时要求该图可以扩展,可以不断的加入顶点,加入边,并且能计算出图中任意两点间的最短距离,也要求能够处理一些特殊情况,诸如不同的人有相同的名字,图中两点之间不存在路径,以及所求最小距离的两个点是同一个点。

      1. 设计/实现FriendshipGraph类

1.首先设置成员变量:需要一个列表保存社交网络中的每一个人;设置二维数组保存图的邻接矩阵;同时需要设置一个Map为每一个人编号,其编号就是该人在列表中的位置。即:

2.addVertex方法,向图中加顶点,如果名字出现重复,则提示错误信息并结束程序运行,每加一个顶点,都需在映射中对这个人进行编号,编号为该人在列表中的序号。

3.addEdge方法,实现函数addEdge,利用Map中由key求value的方法,求出两个人的编号,对应二维数组中的行号和列号,保存到邻接矩阵中。由于要求图是可扩展的,所以图中每加两个人需要调用两次addEdge。

4.getDistance方法,利用以贪心算法为本质的Dijkstra算法得到最短路径。

      1. 设计/实现Person类

给出你的设计和实现思路/过程/结果。

置一个私有成员变量name,设置构造函数,将name作为参数,并实现一个返回name的函数以及判断两人是否相同的方法(用于getDistance中)。

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

给出你的设计和实现思路/过程/结果。

首先需要实例化一个FriendshipGraph对象:graph,然后实例化若干个Person对象,调用addVertex将Person加入图中,调用addEdge在不同的Person之间增加边,此时对应邻接矩阵的值被赋为1,而其余元素在调用getDistance方法时将被赋为100,代表两点之间不存在路径。最后由getDistance方法计算得到最短路径。

      1. 设计/实现测试用例

给出你的设计和实现思路/过程/结果。

构造新的网络图如下:

经测试与预期相符:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值