软构第一次实验

软构第一次实验

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 的代码配置管理

2 实验环境配置

3 实验过程

3.1 Magic Squares
幻方(Magic Square)即任一行,列,对角线上元素之和都相等的方阵。本实验题要求我们:
1.自己编写一个函数用以判断我们所输入(从文件)的数据 (1是不是所有元素为int (2每一个元素之间是否用 ’\t’(制表符)隔开 (3是否是方阵
2.将给出的函数加入自己代码,并添加中文注释,了解函数的具体功能和实现方法,然后对该函数进行拓展
本题java文件输入、输出本分是难点,出题的目的是为了让我们熟悉java语法和函数等。

3.1.1 isLegalMagicSquare()
按步骤给出你的设计和实现思路/过程/结果。
函数功能:判断读入的数据是不是符合要求的Magic Square
函数参数:String
设计思路:
Magic Square是有严格定义的方阵,只要读入的数据有任一点不符合定义要求都不是Magic Square。所以先设定一个标识位flag,初始为真,一旦判断过程中有不符定义的地方置为false并返回,函数结束。
具体实现:
1.首先从文件读入所给数据。数据以string形式读入,需要先进行处理。
2.先以split函数将数据按行划分存入line_array[],同时记录一共有多少行rows。任取一行split(‘\t’)把元素单个隔开,看数据的列数columns,若rows与columns不相等,返回false。
3.再将line_array[]通过split(‘\t’)把元素单个隔开存入magic_str[][]。此时的magic_str[][]元素为string类型,需经过Intiger.valueOf将每个元素转化为int型并存入MagicSquare[][]中。若转化过程出现错误,则:1)数据在某行有缺漏,不是方阵 2)数据不是int型,不符要求 3)数据不是以’\t’隔开。返回false
4.到此MagicSquare[][]是符合要求的方阵,接下来验证每一行,列,对角线之和是否相等且等于同一个数字。若不相等,返回false
5.至此,所读入数据为MagicSquare,返回ture

3.1.2 generateMagicSquare()
按步骤给出你的设计和实现思路/过程/结果。
函数功能:按给定的数据int n生成n*n的MagicSquare
函数参数:int n
具体实现:
在这里插入图片描述

3.2 Turtle Graphics
此任务主要是利用已经封装好的turtle类提供的四个方法来实现各种功能。此实验的实现不需了解已封装的类的具体细节,只需调用已经提供好的方法来完成任务。意图在于模拟软件开发过程中利用现有工具和工作成果来实现功能的目的,同时训练了git的使用。

3.2.1 Problem 1: Clone and import
创建本地git仓库:在相应的目录下使用命令行:git init即可创建。
使用git add命令即可以向仓库添加文件。添加完成后,执行提交命令git commit,就能把添加的文件提交到仓库使用cd指令指定路径,使用git log命令就能查看log。

3.2.2 Problem 3: Turtle graphics and drawSquare
函数功能:画一个正方形
函数参数:Turtle turtle,int sides
返回值: void
具体实现:
Turtle给出起点,正方形每两条边之间夹角为90度。所以想画一个正方形,只需每画一条边后,将方向转90度,循环四次即可。效果如下:
在这里插入图片描述

3.2.3 Problem 5: Drawing polygons
3.2.3.1 calculateRegularPolygonAngle( )
函数功能:给定边数计算正多边形的内角
函数参数:int sides
返回值: double angle、正多边形内角
具体实现:
任意正n边形内角和均等于(n-2)*180/n

3.2.3.2calculatePolygonSidesFromAngle( )
函数功能:给定内角计算正多边形的边数
函数参数:double angle
返回值: int sides、正多边形边数
具体实现:
任意正多边形内外角和均等于360,所以外角为360/n。则内角大小为180-360/n

3.2.3.3drawRegularPolygon( )
函数功能:给定边数,画正多边形
函数参数:Turtle turtle, int sides (边数), int sideLength(边长)
返回值:void
具体实现:
调用calculateRegularPolygonAngle(int sides)计算出内角angle
实现同画正方形。每画一条边长为sideLength的边,转angle,循环sides次。
效果如下(sides=8,sideLength=60)
在这里插入图片描述

3.2.4 Problem 6: Calculating Bearings
3.2.4.1 calculateBearingToPoint( )
函数功能:给定两点坐标以及初始偏转角,求两点间偏转角
函数参数:double currentBearing, int currentX, int currentY, int targetX, int targetY
返回值: double angle、偏转角
具体实现:
以出发点为原点建立直角坐标系,计算两点连线与x轴所成角α的tan值。再使用Math.atan函数以及Math.toDegrees将tan值转化成角度。
为防止angle出现负数或者大于360的情况,对所有的angle执行以下操作
angle=(angle + 360)%360,完成,返回angle

3.2.4.2calculateBearings( )
函数功能:给定一组坐标,求从起点到终点每一步的偏转角
函数参数:List xCoords, List yCoords
返回值: List angle、偏转角
具体实现:
调用 calculateBearingToPoint( )函数,初始偏移量 currentBearing初始为0,循环求第i点和第i+1点之间的偏转角,求得的偏转角为下一步的初始偏移量 currentBearing。循环n-1次,每次求出的偏转角加入List angle中,结束返回angle

3.2.5 Problem 7: Convex Hulls
convexHull( )
函数功能:给定一组坐标,求凸包的最小子集
函数参数:Set points
返回值: Set setOfconvex
具体实现:
1.判断points中元素个数,若points.sizes() <= 3,直接返回points
2.找到y坐标最小的点,根据定义该点一定属于凸包,将之记录为start
3.找到start左边与start间偏转角(>=270)最小的点将这两个点的连线作为起始边若找不到,则找start右边与start间偏转角(<=90)最小的点将这个点计入setOfconvex
4.找到起始边后作为当前边<choosen_1,choosen_2>,开始循环寻找当前边所成夹角最大(偏转角最小)的点next,找到后录入setOfconvex,迭代更新choosen_1=choosen_2,choosen_2=next,每次循环前判断setOfconvex.cotains(start),当start录入setOfconvex中,凸包完成。返回setOfconvex

3.2.6 Problem 8: Personal art
drawPersonalArt( )
函数功能:画自己设计的图形
函数参数:Turtle turtle
返回值: void
设计思路:
首先想到的是叶片的形状以及菱形,画图解析常见的四个菱形相连成叶状的图案。得到以下数据(若菱形锐角为2a):
1.turtle.turn(a),为了使图形水平垂直,改变初始方向,turtle.forward(side)
2.turtle.turn(360-2
a),turtle.forward(side)
3.turtle.turn(180+2a),turtle.forward(side)
4.turtle.turn(360-2
a),turtle.forward(side)
5.turtle.turn(180+a),将方向转会初始方向
这样就能完成一个以原点为顶点关于y轴堆成的菱形接下来turtle.turn(90),修改初始方向并执行上述语句,就能画完另一个。将上述语句循环四次,就形成了四个菱形的简单叶状。
单纯的叶状过于简单,就在画叶状的语句外嵌套循环结构。每循环一次,改变菱形锐角a和边长side
结果如下
在这里插入图片描述

3.2.7 Submitting
使用以下git命令将代码提交至github:
git init //用于初始化本地仓库
git add xxxx //添加文件到暂存区
git commit -m “xxxx” //向本地仓库提交
git remote add origin git@github.com:xxxx/xxxx.git//关联远程仓库
git push -u origin master//推送到远程仓库。

3.3 Social Network
本任务要求编程者通过设计两个类来完成建立一个“社交网络”的任务。一个是用于建立网络的FriendshipGraph类,另一个是作为网络节点的Person类。此任务旨在通过对类的设计和交互,让编程者深入理解java面向对象编程的特点,以及深入理解java的程序组织方式。最后利用测试用例的编写,建立了对于Junit测试的初步认识。

3.3.1 设计/实现FriendshipGraph类
属性:
1.ArrayList netOfPerson: FriendshipGraph只有一个属性,用来记录关系图里有多少人的list。

功能:
1.addVertex( )
函数功能:向关系图中添加顶点(人)
函数参数:Person vertex
返回值:void
具体实现:
当输入已存在的顶点时,提示错误,退出函数

2.addEdge( )
函数功能:为给定的两个顶点添加边(标记两人认识)
函数参数:Person person_1,Person person_2
返回值:void

3.getDistance( )
函数功能:计算给定两顶点的距离(两人的关系有多远)
函数参数:Person person_1,Person person_2
返回值:int distance 距离
具体实现:
1)若person_1的friend为空,返回-1.若person_1与person_2相同,返回0
2)对person_1为起点,person_1为终点,使用广度优先搜索。先把person_1作为起点录入ArrayList bsf_queue和ArrayList visit,用visit记录遍历过的点防止重复遍历,下面开始循环:
循环开始时把计数器count清零。把bsf_queue.get(0)赋值给pointer。通过pointer.friend.coints(person_2)判断是否找到。若未找到person_2,则对所有的pointer,friend.get(j),若pointer,friend.get(j)不在visit中,pointer,friend.get(j)同时添加进bsf_queue和visit,count++。count用来记录每层有多收个数据,遍历完一层,距离distance就加一。将pointer移出bsf_queue。循环直到找到person_2并返回distance,或者bsf_queue为空未找到时返回-1.
具体实现代码如下
在这里插入图片描述

3.3.2 设计/实现Person类
属性:
1.String name:名字
2.ArrayList friend:用来记录与之相连的顶点(认识的人)

功能:
1.Person(String a):用以创建一个对象

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

public static void main(String arg[]) {
		FriendshipGraph graph = new FriendshipGraph();
		Person rachel = new Person("Rachel");
		Person ross = new Person("Ross");
		Person ben = new Person("Ben");
		Person kramer = new Person("Kramer");
		graph.addVertex(rachel);
		graph.addVertex(ross);
		graph.addVertex(ben);
		graph.addVertex(kramer);
		graph.addEdge(rachel, ross);
		graph.addEdge(ross, rachel);
		graph.addEdge(ross, ben);
		graph.addEdge(ben, ross);
		System.out.println(graph.getDistance(rachel, ross)); 
		//should print 1
		System.out.println(graph.getDistance(rachel, ben)); 
		//should print 2
		System.out.println(graph.getDistance(rachel, rachel)); 
		//should print 0
		System.out.println(graph.getDistance(rachel, kramer)); 
		//should print -1
	}

3.3.4 设计/实现测试用例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值