欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软件构造 Lab1

程序员文章站 2024-02-09 17:07:58
...

2020年春季学期
计算机学院《软件构造》课程

Lab 1实验报告

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 2
3.1 Magic Squares 2
3.1.1 isLegalMagicSquare() 2
3.1.2 generateMagicSquare() 3
3.2 Turtle Graphics 4
3.2.1 Problem 1: Clone and import 4
3.2.2 Problem 3: Turtle graphics and drawSquare 4
3.2.3 Problem 5: Drawing polygons 5
3.2.4 Problem 6: Calculating Bearings 5
3.2.5 Problem 7: Convex Hulls 6
3.2.6 Problem 8: Personal art 6
3.2.7 Submitting 7
3.3 Social Network 7
3.3.1 设计/实现FriendshipGraph类 7
3.3.2 设计/实现Person类 7
3.3.3 设计/实现客户端代码main() 8
3.3.4 设计/实现测试用例 8
4 实验进度记录 9
5 实验过程中遇到的困难与解决途径 9
6 实验过程中收获的经验、教训、感想 10
6.1 实验过程中收获的经验和教训 10
6.2 针对以下方面的感受 10

1 实验目标概述
根据实验手册简要撰写。本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO 开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。
⚫ 基本的 Java OO 编程
⚫ 基于 Eclipse IDE 进行 Java 编程
⚫ 基于 JUnit 的测试
⚫ 基于 Git 的代码配置管理
2 实验环境配置
JDK安装:首先安装java 8.0 jdk,然后进行环境变量的配置,输入简单的程序进行测试,发现可用,然后安装IDE。
IDE安装:本次试验使用的开发环境主要为eclipse的IDE集成开发环境,
GIT安装:最后安装GIT,由于之前没有用过GIT和GIThub的经验,这个过程进行了一些学习,包括GIT的下载,以及使用GIT的一些简单的操作,将代码进行上传更新管理等操作,然后对github的使用也进行了一些学习,包括将hub上的代码下载到本地环境之中,以及一些在线开源的coding合作的方式进行了一定的了解。
GitHub Lab1仓库的URL地址(Lab1-学号)。
https://github.com/ComputerScienceHIT/Lab1-1153470114
3 实验过程
3.1 Magic Squares
首先创建一个Magic Squares class,其中包含两个方法isLegalMagicSquare()和generateMagicSquare()其中方法一对应于问题一,方法二对应于问题二,主要是对于关于输入的矩阵是不是幻方进行判断和如何生成幻方的代码的理解。
3.1.1 isLegalMagicSquare()
数据的读入:首先对于数据的读取进行操作,参考了一些对于txt矩阵文档的读入的操作,分为两种方式分别为逐行读取和整体读取的方式,使用的是fileinputstream方式,本次试验采用的是整体读取的方式,然后再整体读取后再使用.split方法进行对于整体的矩阵的操作。

数据规格检验:当数据读入之后,进行标准化的处理。使用了两层的循环方式,逐行和逐个的检测数据的类型和是否有非法字符的出现等。通过split方法的使用来检测是否有上述的情况。

行列规格的检验:检验是否为方阵,检查给出的测试文件,观察数字的规律主要通过换行和缩进来组织整个矩阵的规律,所以程序中通过line[i].split("\t");和fileContent.split("\n");来对文件中的行列进行提取处理,通过.split("\n")算出整个矩阵的行数,然后通过.split("\t")算出每行的数据的个数,然后验证两个数据行数和列数是否相等。如果第一行就不相等那说明该矩阵行列数不想等,如果第一行相等而后面不想等则说明不为矩阵。

行列对角线加和检验:分别计算两个对角线的数据加和,各行数据加和,各列的数据加和,检测是否这些数据相等,如果相等则说明该矩阵为幻方。

3.1.2 generateMagicSquare()
代码分析:

奇数矩阵时依次填入1到n^2,第一个填在第一行正中间,依次向上和向右移动一位,顺序填写,第一行向上会到最后一行,最右向右会到最左,每填n个数,下一个数填在该数下面。
由于该算法只能生成行列数为奇数的幻方矩阵,所以要对在输入了偶数的情况进行catch进行异常处理。
该方法的流程图:

3.2 Turtle Graphics
Turtle是一个图形生成系统,已经定义好了一些方法和类,通过完善一些方法和留好的接口进行任务操作。
3.2.1 Problem 1: Clone and import
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发:首先在github查到该任务的仓库,对该仓库进行fork操作到自己的仓库中,针对已经给出的地址,进行clone到本地,在本地地址下进行git clone 网址代码的操作,将代码clone到本地。然后在IDE中打开文件夹进行操作。
3.2.2 Problem 3: Turtle graphics and drawSquare
在已经给出的文件中定义了一系列的方法和接口,通过查看找出其中的设计,主要为两个方法forward()沿该方向画出一段长度的线和turn()改变画线的方向
该任务要求画出一个方形,所以旋转九十度然后画出四段等距离的线条。

3.2.3 Problem 5: Drawing polygons
该任务要求画出多边形,和上一个画方形的操作类似,旋转固定的角度,画出和边数一致的长度,相比上一个任务,只需根据输入的边数计算角度,然后输入长度即可计算。

3.2.4 Problem 6: Calculating Bearings
该任务中要求计算两个两个方向向量之间的角度,通过旋转一定的角度之后进行计算,通过方法输入组成两个方向向量的两个点,通过组成的点计算出来方向向量,然后调用math函数中的通过方向向量计算角度的方法

3.2.5 Problem 7: Convex Hulls
该任务主要要求给出一个凸包算法。形成一个封闭的图形,所有的点都在这个图形之内,首先选取整个给出的点立面最边缘的点本任务中选取的是x坐标最小的点。如果多个点x坐标相同选取y坐标更小的点进行处理。然后进行与其他的点连线处理,选取角度最小的点,即为凸包上的点,然后进行递归计算,当最后的点和第一个选取的点为一个点的时候计算结束。

3.2.6 Problem 8: Personal art

3.2.7 Submitting
如何通过Git提交当前版本到GitHub上你的Lab1仓库:
Push上传远程仓库
3.3 Social Network
该任务主要建立社交网络有向图,实现增加节点,增加关系,判断关系功能。
3.3.1 设计/实现FriendshipGraph类
创建两个List,一个定义为people存放person类的成员,另一个定义为namelist存放person中的name。
private List people = new ArrayList();
private List nameList = new ArrayList();
增加节点的实现:该过程需要判断要增加的节点是否已经在图中存在,如果已经存在那么应当打印姓名已存在并直接返回,如果没有那么就把person加入到people中,name加入到namelist中。

增加有向边的实现:通过调用person类中的addfriend方法来实现,在person类中进行friendlist列表构建,将person的输入的friend加入到friendlist之中,有向边则只在person1中添加person2,如果无向则同时调用person2中添加person1。

Getdistance的实现:通过复习广度优先算法,在该算法基础上进行修改实现任务中的函数,首先创建队列,依据广度优先算法,将开始点放到队列当中,然后逐渐将与该点相邻的点放入到该队列中,创建map映射关系,每个点与该点与起始点的distance进行关系映射,通过广度优先的方式,确定与起始点相关联的各个点的距离。

3.3.2 设计/实现Person类
基础信息的创建:首先进行类中的信息的创建,主要为name和List friendList
相关方法的创建:person中名字定义的方法,添加friend到friendlist中的方法,获取friendlist的方法,返回person中name的方法。
3.3.3 设计/实现客户端代码main()
应用任务给出的关系进行实现

3.3.4 设计/实现测试用例
主要对FriendshipGraph中的三个主要的方法进行测试,分别addvertex Test,addEdgeTest,getDistanceTest三个方法进行测试,主要使用assertEquals的方法进行测试。在测试前首先 new FriendshipGraph,以及创建一些person节点应用于后续的测试。
addvertex Test:调用增加节点的函数是否返回true,如果添加的节点是重复的那么在测试中则会返回false
addEdgeTest:测试能否创建有向边,对于已经存在的节点之间创建有向边,返回true值,当对为创建的节点进行有向边的创建返回false值
getDistanceTest:创建一个关系图,然后将关系图的值和方法构建assertEquals进行测试

最终测试结果:

4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 任务 实际完成情况
2020-03-02 12:00-19:30 编写问题1的isLegalMagicSquare函数并进行测试 按计划完成
2020-03-03 12:00-15:30 P1 测试 问题二研究 完成
2020-03-04 12:00-20:30 P1遇到奇怪的问题找问题出处 遇到困难,未完成
2020-03-05 12:00-20:30 P2问题123 完成
2020-03-07 12:00-15:30 P2问题45 完成
2020-03-08 12:00-16:30 P2完成凸包算法 自创图形 遇到困难,未完成
2020-03-09 12:00-20:30 P3研究图结构 完成
2020-03-10 12:00-19:30 P3程序框架构建 遇到困难,未完成
2020-03-11 12:00-20:30 P3广度优先搜索学习应用 遇到困难,未完成
2020-03-12 12:00-14:30 完成p3 完成
2020-03-13 12:00-19:30 实验报告填写 git提交 完成
5 实验过程中遇到的困难与解决途径
遇到的难点 解决途径

P1中.split()方法问题
在换行符\n调用split时候每行最后一位仍然有一个换行符,导致数据出错,将换行符调换””为空
P2中凸包运算不熟悉

参考晚上别人做的凸包运算和思路逻辑,进行重新梳理

P3中对于distance方法的对于图结构运算不熟悉
参考算法书籍书籍中对于广度优先处理的方式进行学习,同时学习java的map结构
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
对于java语言熟悉程度不够,包括一些特殊的用法,和面相对象的形式。在本次试验中学习到很多对于编程的知识和对于一些用法的巧妙应用,对于整体建构思路的梳理等。
6.2 针对以下方面的感受
(1) Java编程语言是否对你的口味?符合但是上手需要一些学习参考和练习
(2) 关于Eclipse IDE 较为好用
(3) 关于Git和GitHub 之前没有用过本次试验中进行了学习,社会化的过程
(4) 关于CMU和MIT的作业
(5) 关于本实验的工作量、难度、deadline 工作量和难度较为适度
(6) 关于初接触“软件构造”课程 目前较为有收获,期待度较高