软件构造lab1

初次接触软件构造实验觉得这是最难的一门实验了,因为实验项目大部分是英文加上之前对java语言没有任何的基础,导致实验前期困难重重,步步坎坷。但是经过不懈的努力,以及老师助教们的解答和答疑,才让我慢慢走出困境,找到求解实验的好方法。实验内容其实蛮有意思,只要用心钻研,真的可以找到软件构造实验的乐趣所在。也能加深对知识的理解和应用。

目录

1 实验目标概述

2 实验环境配置

3 实验过程

3.1 Magic Squares

3.1.1 isLegalMagicSquare()

3.1.2 generateMagicSquare()

3.2 Turtle Graphics

3.2.1 Problem 1: Clone and import

3.2.2 Problem 3: Turtle graphics and drawSquare

3.2.3 Problem 5: Drawing polygons

3.2.4 Problem 6: Calculating Bearings

3.2.5 Problem 7: Convex Hulls

3.2.6 Problem 8: Personal art

3.2.7 Submitting

3.3 Social Network

3.3.1 设计/实现FriendshipGraph类

3.3.2 设计/实现Person类

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

3.3.4 设计/实现测试用例

1.实验目标概述

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

·基本的 Java OO 编程 

·基于 Eclipse IDE 进行 Java 编程 

·基于 JUnit 的测试 

·基于 Git 的代码配置管理

PS:由于是第一次实验,且涉及到之前为学习过得java知识,所以要在上课之前及时预习有关java的框架和知识,才能做好实验。

2.实验环境配置

首先在lab0的实验报告中根据给出的网址下载安装了ecilpse,在git官网下载安装了git-bash,然后下载了jdk11,并配置在eclipse上。

在装eclipse是由于老师给的参考文章是全英文,所以去了csdn求助,详见参考文章Eclipse 下载、安装、配置教程_woniuxyy的博客-CSDN博客_eclipse安装教程配置

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

详见自己的仓库地址

3.实验过程

请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。

为了条理清晰,可根据需要在各节增加三级标题。

        3.1 Magic Squares

要求一:从给定的5个txt文档中读入数据,来判断输入的数据是否可以构成一个幻方(magic ssquare),如果可以则返回true,如果不可以则返回false并说明原因。其中,magic square是一个正方形,n阶幻方是n*n个数的排列,通常 是不同的整数,以平方为单位,使得所有行,列,对角线上的n个数之和等于同一常数。

要求二:对给出的generateMagicSquare(int n)函数进行扩充,使之能够产生一个magicsquare并且将其输入到文本6.txt中,然后判断其是否为magicsquare。并且满足,若输入的数为奇数能产生magicsquare,输入的数是偶数或者负数会返回false。

                3.1.1 isLegalMagicSquare()

思路:函数能够读取文件中的数字并存储在矩阵中。首先需要判断的是,读入的数据是否符合magic square的定义,如需判断行、列数不相等,并非矩阵;矩阵中某些数字不是正整数;不是以\t作为分隔符。对三种错误进行判断并输出返回false。当没有这些错误时,分别计算矩阵每一行,每一列,对角线的和是否相等来判断是否能构成magicsquare,并返回true.

过程:使用传入的文件路径新建一个file对象,再使用FileInputStream流读取文件的内容成一个长string,使用split("\n")方法将长文本按矩阵划分成行保存进一个字符串数组String line[],再利用split("\t");方法划分成一个个数字(当遇到行列数不对报错:因为不能构成矩阵),随后定义如下变量保存之后的计算过程。

随后将字符转换成int 型整数(如果出现不是整数或者非数字会报错),保存在二维数组int nums[][]中。若出现负数会报错,否则对每个元素遍历求各行和各列的和:

随后判断各行各列之和与对角线之和是不是都相等,如果是返回true,如果不是返回false。

结果:

 

                3.1.2 generateMagicSquare()

按步骤给出你的设计和实现思路/过程/结果。

思路:大致函数已经在实验ppt中给出,只需要增加部分功能:

  1. 将产生的幻方写入文件\src\P1\txt\6.txt中;
  2. 当输入的n不合法时(例如n为偶数,n为负数等等),不要抛出异常并退出,而是提示错误并“优雅的”退出——函数输出 false 结束

过程:

流程图为:

 

在函数开头增加判断合法输入的操作:

在后面加入写入文件的操作:

结果:

​​​​​​​        3.2 Turtle Graphics

第二个任务是实现一个绘图工具“Turtle Graphics”,需要我们完成的任务为:

(1)画出一个正方形

(2)计算正多边形内角,由内角得到边数

(3)计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中

(4)计算一系列点中的凸包

(5)调用函数绘制图形

(6)使用junit进行单元测试

​​​​​​​​​​​​​​        ​​​​​​​        3.2.1Problem 1: Clone and import

打开实验ppt上的网站,从上面下载P2的包,并解压导入eclipse中。

在本地创建git仓库:

1.获取密钥:ssh-keygen -t rsa -C "youremail@example.com"

2.找到密钥并复制添加到github上;

3.ssh –T git@github.com;

4.git config –global user.name 

5.git config –global user.emal

详见参考网址:https://blog.csdn.net/zamamiro/article/details/70172900 

管理本地开发:

1. git add ;

2. git commit -m "   " ;

3. git push origin master.

​​​​​​​​​​​​​​        ​​​​​​​        3.2.2 Problem 3: Turtle graphics and drawSquare

 很简单,重复四次前进转弯90度就行了

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

计算正n边形的内角可用公式:((sides-2)*180)/sides。利用它编写出calculateRegularPolygonAngle (int sides),然后重复sides次前进转向即可

 

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

利用atan2函数和toDegree函数计算前进方向与x轴正向夹角,之后再把该角度转换为和y轴正向的夹角,若角度为负值,需要加上360.

若要计算一系列点的偏转角则可不断调用此函数

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

运用Gift wrapping algorithm算法, 每次选择转向角最小的点(同时距离最长的点),加入集合,求转向角函数直接使用之前的calculateBearingToPoint函数。其中注意点是相同转向角点的取舍,在循环中设置一个target变量记录当前目标点的距离,如果之后出现了新的目标点,就用target和计算得到的当前点的距离tempdis来比较进行取舍。

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

利用之前编写的drawRegularPolygon(画多边形)函数,和改变颜色的功能,加以循环:画四边形,转换颜色,边长增加,转一个小角度。

​​​​​​​​​​​​​​                3.2.7 Submitting

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

(1).打开git-bash

(2).cd /C/Desktop/Lab1-xxxxx

(3).git add . Lab1-xxxxx

(4).git commit –m “P1P2”

(5)git push origin master

3.3 Social Network

要求实现Person和FriendshipGraph两个类,并用各种数据结构,实现一张人际关系网络,写一个计算人际关系间两人之间最短路径的函数

        3.3.1设计/实现FriendshipGraph类

思路:我们需要实现:

一,增加一个人addVertex(若是增加的人已经存在则输出“此名已存在,重复”,并结束程序);二,增加一条有向边addEdge;三,得到两个人之间的最短距离getDistance。

过程:

1.定义一个Person集合来储存所有人的对象,定义一个String集合来储存所有已经存在的名字:

​​​​​​​

 2.对两个集合进行初始化

3.功能一:addVertex(Person newPerson)函数用来加入新的“人”到people列表,在此之前要在name中检查是否有重复的名字,有则输出提示。

 功能二:addEdge(Person a, Person b)函数调用people类的addnewfriend方法,在每个人的朋友列表中增加新的朋友。

 功能三:getDistance(Person p1, Person p2)函数较为困难,声明一个Map<Person, Integer> distantMap数据结构,来保存起点到当前点的键值对(名字,距离),使用邻接表广度搜索的方法,使用队列,首先将起点入队,然后进行循环,在队列为空之前:弹出队列头元素,计算当前距离,把弹出点的所有“朋友”入队,并加入map中。设置距离为先前计算的距离+1.直到找到结束的节点,返回这个点在map中对应的值。

结果:

​​​​​​​​​​​​​​

 

         3.3.2设计/实现Person类

思路:实现三个功能:1.增加本人的新朋友;2.得到本人的名字;3.得到本人的朋友列表。

过程:包含保存名字的字符串private String name

保存朋友的字符串private List<Person> friendList

和他们相应的get方法getName()和getFriendList()

        功能一:增加本人新朋友addnewfriend

        功能二:得到本人的名字getName

        功能三:得到本人的朋友列表List<Person> getFriendList()

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

结果:

        3.3.4设计/实现测试用例

思路:对addVertex ,addEdge ,getDistance三个功能进行测试。

过程:1. addVertextest

2. addEdgetest

3.getDistancetest

结果:​​​​​​​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值