hit软件构造lab1

1.实验目标概述

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

  1. 基本的 Java OO 编程
  2. 基于 Eclipse IDE 进行 Java 编程
  3. 基于 JUnit 的测试
  4. 基于 Git 的代码配置管理

2.实验环境配置

首先在官网进行下载jdk,选择实验要求的jdk11。

 

然后完成安装过程。

到我的电脑-属性-高级系统设置-环境变量,修改环境变量。

配置JAVA_HOME、CLASSPATH、Path。

通过命令行程序确定配置完成。

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

https://github.com/ComputerScienceHIT/HIT-Lab1-xxxxxxx

3.实验过程

 

3.1Magic Squares

       要求构造一个MagicSquare.java来检验幻方,即对于一个n*n的二维矩阵,每一行,每一列以及对角线上的数相加都是相等的。主要考察了文件读写,exceptions处理和类型转换。

3.1.1isLegalMagicSquare()

思路:读取数据,逐行,列,对角线求和,判断是否相等,满足正确性。同时考虑各种exceptions,保证代码的健壮性。

       过程:首先根据fileName读入文件,若文件不存在则抛出则直接返回false并提示错误。

然后按照顺序一行一行地存入到ArrayList变量list中

 

将list中元素依次存入字符串中,再使用split方法以\t分隔开数字,之后再依次将分隔后的数字存入到一个二维数组中。

最后采用循环,计算每一行,每一列,对角线的和。有不同则返回false,全部相等则返回true。

结果:

3.1.2generateMagicSquare()

思路:首先判断输入的n是否合法,合法则继续,不合法则作为exceptions处理后退出。然后进行新建文件,按给定的算法生成数组,将数组写入文件中。

算法分析:流程图如下

主要思路是:首先计算初始位置(0,n/2),赋值为1,之后每次取当前位置的右上角的位置,设置的值每次加1,如果当前行是第一行,则下一行为最后一行,如果当前列是最右边的列,则下一次取左边第一列,当每设置好n个数时,向下移动一行,如此重复平方次,就对整个矩阵赋完值了,且满足幻方定义。

结果:

3.2Turtle Graphics

        该任务需要我们clone已有的程序后,利用turtle按照要求画图,其中需要利用几何知识设计一些函数简化编程解决相应的问题,其中问题八较为复杂,最后可以发挥个人想象力进行Personal Art。

3.2.1Problem 1: Clone and import

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

打开目标存储文件夹 右键点击Git Bash

输入git clone https://github.com/ComputerScienceHIT/Lab1-xxxxxxx.git

3.2.2Problem 3: Turtle graphics and darwSquare

该函数要求实现:已知边长,画出指定边长的正方形。参数是海龟对象turtle和边长sidelength。

       向前移动sidelength个长度,再旋转90度,这个过程循环四次就可以画出一个以sidelength为边长的正方形。下图是一个以sidelength=100画出的正方形。

代码如下:

​​​​​​​3.2.3Problem 5: Drawing polygons

       该函数要求实现:已知边数和边长,画出指定边数和边长的正多边形。参数是海龟对象,边数和边长。

       通过calculateRegularPolygonAngle函数计算出该正多边形每个角angle的大小,再通过循环,循环内容为向前移动sidelength个长度,再旋转180-angle的角度(即外角),循环次数为边数。下图是sidelength为100,sides为6的正多边形。

 

代码如下:

 

​​​​​​​3.2.4Problem 6: Calculating Bearings

该函数要求:已知一组点的坐标,计算出对于相邻两个点,从一个点到另一个点需要调整的角度,将结果存在一个列表中。

通过循环,调用calculateBearingToPoint函数计算出两个点直接需要调整的角度(角度要对360取模),并将结果存到了adjustments列表中。

代码如下:

 

​​​​​​​3.2.5Problem 7: Convex Hulls

这题比较复杂,尤其是涉及几何的部分,比较繁琐。

该函数要求:已知一个点的集合,求出这个点集的凸包

当点的个数小于等于3个时,这组点即位所求。直接返回即可。当点的个数大于3时,首先找到纵坐标最小的点,然后找到下一个点,使得两点连线相对于x轴正方向的夹角最小,这样可以覆盖尽可能多的点,并将找到符合要求的点存到集合中。然后以新找到的点为起点,寻找下一个点,使得上一条边到这两点之间的连线转动的角度最小。这样一直循环直到首尾相同(即rtPoint=minPoint)。返回这组点的集合。

测试结果为:

 

代码如下:

​​​​​​​3.2.6Problem 8: Personal art

 

通过循环,以不同起点画出正六边形,在每一轮循环中又改变了正六边形的颜色和边长。

 

​​​​​​​3.2.7Submitting

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

IDEA为git提供了友好的图形化界面,点击commit提交到本地,然后push到github即可。

​​​​​​​3.3Social Network

      首先要求构造两个类:Person,FriendshipGraph。然后以Person为节点,在FriendshipGraph中构造一个有向图,可以在这个有向图中实现填加节点Person,添加边。并且要求实现一个方法,可以给出任意两点之间的最短距离,不存在返回-1,两点相同返回0。

       然后在FriendshipGraph.class的main中放入作业给出的client implementation,再对Person,FriendshipGraph的测试。然后按照要求写出FriendshipGraphTest.class,再进行测试。

3.3.1 设计/实现FriendshipGraph类

3.3.1.1 数据结构设计

       首先应该建立一个列表persons存储所加入节点的列表,其次要有一个集合names存储各个节点的名字用于判断是否有重复名字的节点加入,再建立一个二维数组来实现领接矩阵,所以选择Vector<Vector<Integer>> relationships,vector方便增加元素,在这个二维数组中1代表两个节点连接,而0代表两个节点没有连接。

3.3.1.2 addVertex方法

        首先利用集合name的contains方法判断集合中是否有和要添加的节点同名的节点,如果有则打印错误信息并返回false,若没有则可以新建一个vector变量SinglePerson存储新节点与其他节点的关系,并将这个SinglePerson加入到已有的二维vector中,再将每一行增加一位存储各点与新节点的关系,最后返回ture。

3.3.1.3 addEdge方法

        addEdge方法接收有向边起始点p1和终点p2(二者为Person类型),若二者中有一个为null则打印错误信息并返回false,若二者有一在图中没有对应顶点,同样打印错误信息并返回false。保证二者在图中有对应顶点后,新建有向边并将其添加进邻接矩阵并返回true。

3.3.1.4.getDistance方法

        首先判断起始点p1和终点p2是否为空若二者中有一个为空则打印错误信息并返回-2,若二者之一不在图中则打印错误信息并返回-1。然后从第一个点开始进行BFS,用队列queue保存接下来要访问的节点,数组visit保存各个节点是否被访问过,每访问完一轮distance加一,最后访问p2,得到两者之间的距离并返回。

3.3.2 设计/实现Person类

3.3.2.1 name

        每个节点显然都需要一个字符串存各自的名字,对构造方法重写后,新建节点时就需要输入相应的name。通过getName可以获得节点的name。

3.3.2.2 Index

       新建节点后,节点的Index默认为-1,只有当加入到关系图后,使用setIndex方法才会对Index进行修改。通过getIndex可以获得节点的Index。

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

       由于实验手册已经规定了client代码,因此复制即可。运行结果也符合要求

3.3.3.1 设计/实现测试用例

设计思路:分别对addVertex, addEdge, getDistance三个方法进行测试。

1.对于addVertex,设计test用例addVertexTest,内建4个Person对象全部执行addVertex,判断persons是否包含这些对象即可。

2.对于addEdge,设计测试用testaddEdgeTest,内建4个Person对象,执行addVertex后,执行addEdge然后判断他们的朋友中是否包含彼此即可。

3.对于getDistance,设计test用例testgetDistanceTest,内建11个Person对象,执行addVertex,addEdge后,测试三种距离等价类:距离为-1,距离为0,距离为正整数。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值