HIT软件构造lab1心得
HIT软件构造Lab1
#1 实验目标概述 1
2 实验环境配置 1
3 实验过程 3
3.1 Magic Squares 3
3.1.1 isLegalMagicSquare() 3
3.1.2 generateMagicSquare() 4
建立成功并在isLegalMagicSquare()测试通过: 5
3.2 Turtle Graphics 6
3.2.1 Problem 1: Clone and import 6
3.2.2 Problem 3: Turtle graphics and drawSquare 6
3.2.3 Problem 5: Drawing polygons 7
3.2.4 Problem 6: Calculating Bearings 8
3.2.5 Problem 7: Convex Hulls 8
3.2.6 Problem 8: Personal art 10
3.2.7 Submitting 11
3.3 Social Network 12
3.3.1 设计/实现FriendshipGraph类 12
3.3.2 设计/实现Person类 13
3.3.3 设计/实现客户端代码main() 13
3.3.4 设计/实现测试用例 14
4 实验进度记录 14
5 实验过程中遇到的困难与解决途径 15
6 实验过程中收获的经验、教训、感想 15
6.1 实验过程中收获的经验和教训 15
6.2 针对以下方面的感受 15
1 实验目标概述
本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
⚫ 基本的 Java OO 编程
⚫ 基于 Eclipse IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理
2 实验环境配置
首先去官网下载jdk的安装包,结果下不了。苦恼我好长时间,最后直接向同学要的安装包。安装之后不知道如何配置环境,后来在B站找到了配置环境的视频地址是 https://www.bilibili.com/video/av87343795 下面是配置环境的截图
(虽然我下的是jdk13但是写实验的时候用的是jdk8)
关于下载安装eclipse的过程及问题:
Eclipse很容易就在官网下载了,但是下载完之后不知道怎么使用eclipse写程序在B站和中国大学MOOC中发现了相关视频,学习到了使用eclipse写第一个程序。从中学习了java语言。
视频地址: https://www.bilibili.com/video/av85902324
https://www.bilibili.com/video/av55452883
以及 https://www.icourse163.org/learn/ZJU-1001541001#/learn/announce
我还买了相关书籍:java从入门到精通第四版
3.1 Magic Squares
幻方问题我认为主要的难点在于从txt文件中提取实验要用的数据,并把字符型数据转换成int型数据,由于是刚学习java对这方面还不是很熟悉(是相当不熟悉)。将数据转换成int型数据后将每行每列即对角线的和存进数组。判断是否这些值相等。
3.1.1 isLegalMagicSquare()
这个函数判断储存在TXT文件中的矩阵是否符合幻方的要求。如果符合返回true,如果错误返回false并且返回错误原因。
首先建立文件流;
把TXT文件中的数据按行读入,并且在每行间添加一个tap键
用.split(“” )将字符串分成字符数组
使用Integer.parseInt()将字符数组转化成整型数组。并且判断是否存在空或者是负数
x,y,z[]中装的是每行每列对角线的和
下面判断是否是矩阵,并把每行每列对角线的和存入x,y,z。比较是否相等
判断值是否相等,相等返回true。不相等返回false。
结果:
3.1.2 generateMagicSquare()
思路:首先计算初始位置(0,n/2),赋值为1,之后每次取当前位置的右上角的位置,设置的值每次加1,如果当前行是第一行,则下一行为最后一行,如果当前列是最右边的列,则下一次取左边第一列,如此重复平方次,就对整个矩阵赋值了,而且满足了每行每列以及对角线之和都是相同数字的效果。
把创建的幻方存进文件6.txt。数字之间的距离为一个tap键1
建立幻方
建立成功并在isLegalMagicSquare()测试通过:
3.2 Turtle Graphics
熟悉turtle Graphics的各种函数的功能,调用设置好的函数,实现作图,使用.Math库的几个函数实现一些计算。需要一定的数学知识来计算。以及集合类的知识如list,map,set等等
3.2.1 Problem 1: Clone and import
因为网速比较差,从github上无法下载实验所需安装包。所以使用的是教学群其他同学分享的。与GitHub上下载的相同。
3.2.2 Problem 3: Turtle graphics and drawSquare
画一个正方形只需要四次拐弯就行了。
Turtle.forward(sidelength)是前进sidelength的长度。Turtle.turn(90)是转90度
成品图如下:
3.2.3 Problem 5: Drawing polygons
计算sides边型的内角大小:
通过上面的函数算出sides边型的内角大小。转sides次每次转内角的补交即可:
3.2.4 Problem 6: Calculating Bearings
利用atan2()函数来判断当前点与目标点需要转的角度,由弧度转为角度。在减去当前点方向的已经偏的角度。得到的就是需要转的角度。如果得到负数就+360。转为正的角度。
将“起点”选为第一个点(坐标为(xCoords.get(0),yCoords.get(0)));
循环n-1次(n为点的个数)
每次将第i+1号点设置为“终点”,通过上一个函数计算旋转角度并存储到List中;
将下一次的“起点”用当前“终点”更新,继续循环;
退出循环后返回List。
3.2.5 Problem 7: Convex Hulls
任意凸包上的点,你会发现以该点建立一个极角坐标系,该点连结其它所有点的极角中,该点逆时针方向的第一凸包点到该点极角最小,例如P1,到所有点的极角中P1P2极角最小。
算法中首先找到最左边的点,这个点必然在凸包上,然后计算该点连接点极角最小的,这里计算有技巧,算法中进行toright测试,直到找到到最右端的点,找到P2后,就可以从P2开始,接着顺次找到P3,又以P3为起点……
3.2.6 Problem 8: Personal art
利用前面学的知识进行的个人艺术
实例图如下:
3.2.7 Submitting
从官网下载git的安装包
以下是上传步骤(上传的不是实验用的),是我之前上传的案例。
3.3 Social Network
利用各种数据结构,实现一张人际关系网络。写一个计算人际关系“距离”的函数。
3.3.1 设计/实现FriendshipGraph类
数据结构:
private Listnamelist = new ArrayList<>(); //建立名字的集合列表
addVertex(Person newperson)函数用来加入新的“人”到people列表,再次之前要在namelist中检查是否有重复的名字,有则输出提示。
addEdge(Person a, Person b)函数调用people类的addFriend方法,在每个人的朋友列表中增加新的朋友
使用public int getDistance(Person a,Person b) { //计算输入两人啊a,b的距离,即有向图中点的距离(广度优先算法)
3.3.2 设计/实现Person类
包含保存名字的字符串private String name; //名字
保存朋友的字符串
private List FriendList = new ArrayList<>(); //朋友列表
和他们相应的get方法getName()和getFriendList()
以及构造函数public Person(String Myname)
以及添加朋友的函数public void addFriend(Person a)
3.3.3 设计/实现客户端代码main()
采用实验手册上的代码
程序运行结果:
3.3.4 设计/实现测试用例
通过观看老师发的视频,和P3的测试。了解到test主要是通过assertEquals函数:
在每个函数前添加@test即可
上面的是测试结果
下面的是具体的测试的写法: