哈工大软件构造Lab1

1实验目标概述

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

2实验环境配置

在官网上下载Eclipse、JDK和Git并安装。在为JDK配置环境变量的时候,在系统环境变量中新建一个叫“JAVA_HOME”的环境变量,变量值为JDK的安装路径。然后在Path的环境变量中添加一个“%JAVA_HOME%bin”的变量值。省去很多其它的步骤。
GitHub Lab1仓库的URL地址:“URL”

3 实验过程

3.1 Magic Squares

Magic Squares即幻方,n阶幻方是一个正方形n×n个数(通常是不同的整数)的排列,使得所有行、所有列和两个对角线中的n个数总和为同一常数。

3.1.1 isLegalMagicSquare()

本题要求在main()函数中调用五次isLegalMagicSquare()函数,将5个文本文件名分别作为参数输入进去,看其是否得到正确的输出(true,false)。
首先,逐行阅读文件,使用myLine.split("\t")方法划分得到一个字符串数组,数组的长度即为矩阵的阶,使用正则表达式str.matches(“[0-9]+”)判断其是否为合法数字。转换得到二维int型数组。
哈工大软件构造Lab1
随后遍历每个元素,求各行、各列及对角线之和,判断是否相等,是返回true,否则返回false。
哈工大软件构造Lab1

3.1.2 generateMagicSquare()

哈工大软件构造Lab1
首先计算初始位置(0,n/2),赋值为1,之后每次取当前位置的右上角的位置,设置的值每次加1,如果当前行是第一行,则下一行为最后一行,如果当前列是最右边的列,则下一次取左边第一列,如此重复平方次,就对整个矩阵赋完值了,且满足幻方定义。

3.2 Turtle Graphics

根据代码注释提示补全代码从而实现一个绘制工具Turtle Graphics。
1、从Github上获取任务的源代码,在本地创建git仓库,使用git管理本地开发
2、画出正四边形。
3、完成正多边形内角和外角的计算
4、计算向量之间的夹角
5、计算凸包
6、绘制自己的图形

3.2.1 Problem 1: Clone and import

从github上获取代码:网页download。从本地创建git仓库:1、git init初始化本地仓库2、git add remote添加远程库源3、在远程仓库创建master分支4、git pull origin master将远程仓库同步到本地5、git add * ->git commit -m “”->git push将本地文件加入到本地仓库,将本地仓库同步到远程仓库。

3.2.2 Problem 3: Turtle graphics and drawSquare

1、首先发现forward、turn函数的功能是实现给定参数的前进和转向
2、我们通过四次循环,每次前进+转90°就可以得到我们想要的正方形。

3.2.3 Problem 5: Drawing polygons

1、补全calculateRegularPolygonAngle。正多边形的每个内角等于180.0 – 360.0 / 边数,注意数据类型转换。
哈工大软件构造Lab1
2、补全calculatePolygonSidesFromAngle。知道正多边形的内角,求边数,根据数学公式可以直接得出:
哈工大软件构造Lab1
要注意向上取整和数据类型转换。

3、补全drawRegularPolygon。该函数功能为画出指定边长的正多边形。调用calculateRegularPolygonAngle(sides)计算正多边形的内角,调用forward和turn函数进行前进和转向。
哈工大软件构造Lab1

3.2.4 Problem 6: Calculating Bearings

1、补全calculateBearingToPoint。该函数的功能是当前点朝向的向量与当前点朝向目标点构成的向量之间的夹角。利用atan2函数计算前进方向与x轴正向夹角。
哈工大软件构造Lab1
之后再把该角度转换成与y轴正向的夹角,注意如果出现负数要再加上360°。
2、补全calculateBearings。对列表中的每两个相邻点调用calculateBearingToPoint计算夹角,列表保存并返回。
哈工大软件构造Lab1

3.2.5 Problem 7: Convex Hulls

1、补全Convex Hulls。该函数的功能是求出包围所有点的凸包。
2、首先选取最左下角的点作为起始点,然后每次选择转向角最小的点(同时距离最长)加入集合
哈工大软件构造Lab1
哈工大软件构造Lab1
测试结果:
哈工大软件构造Lab1

3.2.6 Problem 8: Personal art

主要选取一个颜色是画了一个五角星。
哈工大软件构造Lab1

3.2.7 Submitting

git add *->git commit -m “”->git push提交到Lab1仓库

3.3 Social Network

利用图结构实现一张人际关系网。

3.3.1 设计/实现FriendshipGraph类

1、在FriendshipGraph中声明两个类
哈工大软件构造Lab1
第一个用来保存人的实例,另一个用来检测是否有重复名字。
2、addVertex函数用来添加一个成员,先检查名字是否有重复。有则输出提示并推出程序。
哈工大软件构造Lab1
3、addEdge函数是用来表明p1有一个朋友p2,调用Person类中的addFriend方法。
哈工大软件构造Lab1
4、getDistance函数是用来计算两个Person之间的距离。使用Queue和Map实现BFS求最短路。
哈工大软件构造Lab1

3.3.2 设计/实现Person类

1、Person类
哈工大软件构造Lab1
定义了两个私有成员,同时定义了两个方法调用Person类的姓名和朋友列表。

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

由实验手册得:
哈工大软件构造Lab1
结果为:
哈工大软件构造Lab1

3.3.4 设计/实现测试用例

1、testaddVertex。
我们调用addVertex函数,向交际网络中添加一个人,然后判断people中最后一个人是不是我们添加进去的。
哈工大软件构造Lab1
2、testaddEdge.
我们调用addEdge函数,给其中两人添加关系,然后判断a的朋友列表中的最后一人是否是b。
哈工大软件构造Lab1
3、testgetDistance。
我们建立了一个这样的交际网络:
哈工大软件构造Lab1
哈工大软件构造Lab1
4、测试结果:
哈工大软件构造Lab1

4 实验进度记录

日期 时间段 任务 实际完成情况

5 实验过程中遇到的困难与解决途径

遇到的苦难 解决途径

6 实验过程中收获的经验、教训、感想

6.1 实验过程中收获的经验和教训

6.2 针对以下方面的感受

(1) Java编程语言是否对你的口味?
(2) 关于Eclipse IDE;
(3) 关于Git和GitHub;
(4) 关于CMU和MIT的作业;
(5) 关于本实验的工作量、难度、deadline;
(6) 关于初接触“软件构造”课程;
(7) 疫情期间,只能远程授课,个人在家里完成实验任务,你对该学习方式有什么想法?