2020春软件构造lab1实验报告
目 录
1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Magic Squares 1
3.1.1 isLegalMagicSquare() 1
3.1.2 generateMagicSquare() 1
3.2 Turtle Graphics 1
3.2.1 Problem 1: Clone and import 2
3.2.2 Problem 3: Turtle graphics and drawSquare 2
3.2.3 Problem 5: Drawing polygons 2
3.2.4 Problem 6: Calculating Bearings 2
3.2.5 Problem 7: Convex Hulls 2
3.2.6 Problem 8: Personal art 2
3.2.7 Submitting 2
3.3 Social Network 2
3.3.1 设计/实现FriendshipGraph类 2
3.3.2 设计/实现Person类 2
3.3.3 设计/实现客户端代码main() 2
3.3.4 设计/实现测试用例 3
3.4 Tweet Tweet 3
3.4.1 Problem 1: Extracting data from tweets 3
3.4.2 Problem 2: Filtering lists of tweets 3
3.4.3 Problem 3: Inferring a social network 3
3.4.4 Problem 4: Get smarter 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 3
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4
1 实验目标概述
本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开 发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够 为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。 另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
基本的 Java OO 编程
基于 Eclipse IDE 进行 Java 编程
基于 JUnit 的测试
基于 Git 的代码配置管理
2 实验环境配置
简要陈述你配置本次实验所需开发、测试、运行环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
(1)下载最新eclipse安装包,并安装。
问题:原来的eclipse无法更改工作目录。
解决:删了重新安装。
(2)JDK很早之前就配置好了,无需重新配置
(3)下载git并按步骤进行配置、初始参数的设置
在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。
https://github.com/ComputerScienceHIT/Lab1-1180300503
3 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
该题主要意思为首先写一个程序判断一个矩阵是否满足幻方条件,即每一行,每一列,对角线的和都相等。并且检查是否有非法字符的输入。然后编写一个算法构造幻方,并检验构造是否正确。
3.1.1 isLegalMagicSquare()
- 第一次读取文件以计算幻方的行数,便于后面构建二维数组。
- 第二次读取文件根据第一次已知行数构建二维数组来保存文件中的矩阵,检测该矩阵是否为幻方。
- 下面一段代码是判断幻方中的数字是否为正整数,并且以“Tab”隔开。
while(line!=null)
{
str=line.split("\t");
for(i=0;i<str.length;i++)
{
for(j=0;j<str[i].length();j++)
{
if(str[i].charAt(j)<'0'||str[i].charAt(j)>'9')//判断删除制表符后的字符是否为0~9,如不是则视为非法字符
{
return false;
}
}
tmp[k][i]=Integer.valueOf(str[i]);//将文件中的字符转化为数字并且存入二维数组中
}
line=br.readLine();//逐行读取文件
k++;
}
3.1.2 generateMagicSquare()
把1放在第一行正中,按以下规律排列剩下的(n×n-1)个数:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格行数小于1,则放在底行,仍然要放在上一个放置的数的右一列;
(3)如果这个数所要放的格列数大于n,则放在第1列,仍然要放在上一个放置的数的上一行;
(4)如果这个数所要放的格行数小于1,且列数大于n,那么就把它放在第n行第1列;
(5)如果这个数所要放的格已经有数填入,那么就把它放在上一个放置的数的下一行同一列。
int row = 0, col = n / 2, i, j, square = n * n;
//将1~n*n填入幻方中
for (i = 1; i <= square; i++) {
magic[row][col] = i;
if (i % n == 0) //如果i为n的倍数,行号加一
row++;
else {
if (row == 0)//若为第一行转入最后一行,否则行数减一
row = n - 1;
else
row--;
if (col == (n - 1)) //若为最后一列,转为第一列,否则列数加一
col = 0;
else
col++;
}
}
3.2 Turtle Graphics
该任务要根据代码注释提示补全代码从而实现一个完整的绘制工具Trurtle Graphics。主要考点:计算几何基础知识,正多边形的内角外角,java函数调用绘制多边形,计算向量之间的夹角,计算凸包,使用Junit进行单元测试。
3.2.1 Problem 1: Clone and import
如从github获取代码:网页download
从本地创建git仓库:1.git init初始化本地仓库 2.git add remote origin 添加远程库源 3.在远程仓库创建master分支 4.git pull origin master将远程仓库同步到本地 5.git add->git commit->git push 将本地文件加入本地仓库,将本地仓库同步到远程仓库。
此时git仓库本地与远程可以同步。
3.2.2 Problem 3: Turtle graphics and drawSquare
3.2.3 Problem 5: Drawing polygons
绘制多边形时,根据正n边形边数公式:sides=360/(180-angle),以输入的边为基础,计算出夹角,便可绘制多边形。
3.2.4 Problem 6: Calculating Bearings
计算轴承问题利用Java中math.atan2函数即可轻松解决问题。
目标向量的求法如下:先求当前点与目标点的连线与y轴夹角的正切值,tan=(targetX-currentX)/(targetY-currentY),然后调用Math库中的atan2将其转化为弧度,再由公式——角度=弧度*180/PI——求得角度值,即为当前向量与y轴正方向的夹角,与currentBearing(当前方向)作差,得解。
3.2.5 Problem 7: Convex Hulls
使用gift-wrapping算法。
扫描list列表,比较点的横坐标,找到横坐标最小的点作为基点left_most,并加入凸包集合中;设基点BP,中继点A,目标点B,初始化BP、A都为left_most,初始化当前方向角度为0;扫描不属于凸包集合的点作为点B,调用calculateBearingToPoint()计算向量BP->A与向量A->B的夹角,筛选出夹角最小的点B(min_point);
令BP=A,A=B(min_point),将点B加入凸包集合中;循环(3)(4),直到新找到的点B(min_point)是初始基点left_most。
3.2.6 Problem 8: Personal art
3.2.7 Submitting
将完成的项目复制到本地仓库中,输入git add .将所有文件全部加入本地仓库;
输入 git commit -m “备注” 指令,将文件暂存到本地目录并且添加备注说明;
输入 git push -u origin master指令,将本地仓库同步到远程仓库。
3.3 Social Network
填充完成Person和FriendshipGraph两个类,模拟社交网络,能够实现添加节点、节点之间添加边的功能,并且可以计算两节点之间最短路。
3.3.1 设计/实现FriendshipGraph类
利用队列的基本知识,逐个添加每一个人的信息,建立列表表示每一个人与其他人的关系。
社交网络的实现,这里我们需要完成人物的存储与读取
还要实现的是社交网络的村如何读取。
privateArrayListship_graph=newArrayList(); //容器list二维可变数组:第一位下标对应一个人的编码,改为对应的一个数组内存上其朋友们的编码
private HashMap<Person, Integer> person_map=newHashMap<Person,Integer>();//一一对应的存入人物名字和编码
private int number = 0;//用number对每个人按递增正整数的顺序进行编码
这里我们使用的这样一种数据结构实现的。
3.3.2 设计/实现Person类
Person是FriendshipGraph中的一个节点,数据类型包括name,和储存该节点的朋友的Set,方法包括返回名字,返回朋友和添加朋友。
3.3.3 设计/实现客户端代码main()
3.3.4 设计/实现测试用例
Person类的实现,需要存入入伍,我们测试的时候可以针对,存入人物的是否为空进行设计
FriendshipGraph基于Person类,测试也是针对关系是否存在。
4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 任务 实际完成情况
2019-02-29 15:45-17:30 编写问题1的isLegalMagicSquare函数并进行测试 按计划完成
2020-3-2 9:00-11:30 编写问题2的相关代码 未完成
2020-3-2 13:30-16:00 编写问题2的相关代码 基本完成
2020-3-5 9:00-12:00 编写问题3的相关代码 基本完成
2020-3-7 14:00-16:00 完成报告的相关内容 基本完成
5 实验过程中遇到的困难与解决途径
遇到的难点 解决途径
未掌握文件的读入和读出
参照网上的相关内容,利用了固定的模板
计算问题2的轴承问题时不知道如何解。
询问朋友得知有atan2函数,轻松解决问题。
问题3使用BFS算法不熟练
加深学习了Java的相关语法内容,懂得了List等相关知识
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
这次实验,极大的锻炼了我的编程能力,也使我意识到了我的诸多不足,加深了对Java语法的理解,对今后的帮助很大。
6.2 针对以下方面的感受
(1) Java编程语言是否对你的口味?
比较符合
(2) 关于Eclipse IDE
Eclipse IDE功能较全,实用性比较高。
(3) 关于Git和GitHub
起初因为未接触的原因感觉难度很大,但是接触久了之后感觉很方便,但是对于英语的阅读还是比较困难。
(4) 关于CMU和MIT的作业
作业创新型很高,很值得做一做。
(5) 关于本实验的工作量、难度、deadline
该次实验工作量不算太大,难度一般,对于ddl的规定也比较合理。
(6) 关于初接触“软件构造”课程
感觉难度很大,今后学习的要很多。
下一篇: [软件构造]实验回顾:Lab4