哈工大2022软件构造lab1

1.实验目标概述

通过求解实验的三个问题,训练基本Java编程技能,能够利用Java OO开发基本功能模块,通过阅读理解已有代码框架根据功能需要补全代码。

其次,为开发的代码编写基本测试程序,并完成测试初步保证代码正确性。

另外,需要利用Git作为代码配置管理的工具,掌握Git的基本使用方法。

2.实验环境配置

首先,前往IDEA官网下载新版IDEA,按照提示安装完成后,打开IDEA下载Git插件和JUnit插件。

然后前往官网下载JDK8,按照网络上的教程配置路径(比较麻烦)。

接下来,先在Git中生成公钥,再在Github上远程创建ssh key,便可实现通过Git上传代码至仓库。

配置过程中遇到的困难主要产生在JDK配置及Git配置环节,不过通过网上的各种博客教程,还是可以比较方便地解决。

3.实验过程

3.1Magic Squares

在任务P1中,我们需要完成三个要求。

要求一:完成文件输入,并对输入的各种特殊异常情况进行处理,并返回对应的错误提示信息。

要求二:对读入的数据进行各项判断,返回输出其是否为一个幻方。

要求三:理解幻方构造代码,实现文件输出,并对输入异常进行处理并反馈错误信息进行输出。3.1.1isLegalMagicSquare()

一.完成文件输入,并对输入特殊情况进行处理

1.通过BufferedReader实现文件输入

2.逐行输入,对于输入的每一行,首先判断该行输入中是否包含’0’~’9’,’-’,’.’,’\t’以外的字符,若有则输出该行含有非\t的分隔符,并退出。

 

3.通过split方法将输入进行自动分隔,判断该行数字数量,若与之前的不同,则输出该行数字数量不同,并退出。

 

4.将分隔好的字符串转化成数字存入Sqr数组中,同时通过matches方法判断式子正则表达式是否为”^[0-9]*$”,若不是,则输出该行数字存在非正整数,并退出。(这里需要对0进行特判)

5.在输入完成后判断输入行数与列数是否相等,若不相等则输出错误信息,并退出。

二.对输入的数组进行各种判断,返回其是否为幻方

 

1.判断1~n2是否全部出现过有且仅有一次。

2.判断每行每列以及斜线的和是否相等。

3.1.2generateMagicSquare() 

首先分析函数生成Magic Square的过程。

 

该生成方法称为Merzirac法生成奇阶幻方

再分析输入负数与偶数时的报错原因。

输入负数时,在定义magic数组时,数组大小不能为负,故抛出错误。

输入为偶数时,在往magic数组中填入数字的时候会发生数组越界,原因是由这两句话导致。

 

于是在函数开始时增加对n的判断,若为负数或偶数时则输出对应的错误并退出。

最后,将生成的Magic Square写入文件中,并用isLegalMagicSquare()进行判断。

3.2Turtle Graphics

该任务希望锻炼我们通过阅读代码框架对代码进行正确的补全的能力,故分别制定了许多小问题,由易到难地让我们对代码进行补全。另外,任务还希望我们通过自学学习Git的基本用法。3.2.1Problem 1: Clone and import

从链接中下载文件后放入工程文件夹中,打开IDEA便可对其进行编辑,然后在安装完插件后的IDEA上建立本地git仓库,随后就可以使用git进行代码的提交。

3.2.2 Problem 3: Turtle graphics and drawSquare

首先在Turtle.java中阅读这些命令的定义,然后利用这些命令简易地绘制一个正方形。

3.2.3Problem 5: Drawing polygons

补全calculateRegularPolygonAngle()与drawRegularPolygon(),并运行测试程序,调整代码直至测试全部通过。

3.2.4Problem 6: Calculating Bearings

首先补全calculateBearingToPoint(),通过使用Math.atan2()函数,计算出两点之间的角度,再在模360的意义下减去原角度后返回。

再使用刚刚编写的calculateBearingToPoint()补全calculateBearings(),返回n-1个航向调整。

运行calculateBearingToPointTest()和calculateBearingsTest(),调整代码直至测试全部通过。

 3.2.5Problem 7: Convex Hulls

首先,对于点数小于等于2的点集,直接返回该原点集。

对于点数大于2的点集,通过gift-wrapping algorithm对其进行处理。

具体流程为先找到点集中最左下角的点,从该点开始,每次将当前点与其他所有点进行夹角比较,找到与preBearing夹角最小(但大于preBearing)的点,作为下一个凸包中的点加入凸包中,同时更新preBearing为当前点与下一点的夹角。如此循环直至找到初始点为止,至此所有凸包中的点已加入答案点集。需要注意当夹角相同时需要取距离最远的点作为下一个点,以保证三点共直线时中间点不会被取入凸包点集中。

该任务的难点在于算法思路较之前问题复杂,需要理清思路,并避免细节之处出现错误,同时查询Set的用法,能够大幅便利代码编写。

3.2.6Problem 8: Personal art

在该任务中,我选择绘制一个由多个渐变色多边形构成的图案。

 

为了绘制这个图形,我首先需要进行多次等大多边形的绘制,并在每两次绘制多边形之间加入额外的角度调整。

 

另外,由于需要用渐变色进行绘制,需要定义一个色彩数组:

 

并在循环过程中不断循环改变绘制颜色,以实现渐变色的效果。

 3.2.7Submitting

先选中暂存文件,然后提交至本地git,再通过Lab1仓库的ssh使用git将代码推送到GitHub。期间需要用到几个命令为git add,git commit,git push。

3.3Social Network

该任务首先需要完成定义一个辅助类Person,用于存储一些人物信息供程序调用。然后再在FriendshipGraph中实现一张有向图以及下列功能:加点、加边、查询两点的最短路径长。

3.3.1 设计/实现FriendshipGraph

需要实现三个函数。其中hea,vet,nex利用List实现。

1.addVertex()

 

给该Person类赋予一个新的id值,作为其在图中的节点号,并将其边表hea初始化。

2.addEdge()

首先新增一条边并将其指向p2的节点号。然后将其边表next指向p1的hea表头,再将表头指向该新边,实现往p1的出边中新加一条边。

 

3.getDistance()

由于该图为边长为1的有向图,故两点间的距离可用BFS算法求得,其中遍历一个点的所有出边利用边表遍历方法。若最后没有遍历到过p2,则返回-1,否则返回最短路径。

 3.3.2设计/实现Person

Person类中,需要记录该Person的id号以及名字,故需要设计函数用于修改名字、返回名字、修改id、返回id。

 

 

 

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

首先新建Person,在新建过程中将该名字字符串加入Set中用于判断是否有重名,若重名则返回错误。

 

继续进行加点加边操作。

 

 

最后进行点间距离查询。

 3.3.4设计/实现测试用例

1.addVertexTest

首先在FriendshipGraph中添加返回图中节点数的函数,然后在test中往图中添加点,再进行查询。

 

2.addEdgeTest

首先在FriendshipGraph中添加查询图中边数的函数,然后在test中完成加点加边后进行测试。

 

3.getDistanceTest

首先加点加边建立原始图,通过多个不同情况的点对距离测试来检验程序正确性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值