HIT 软件构造 lab1

 

  1. 实验目标概述

本次实验通过求解三个问题,训练基本 Java 编程技能,能够利用 Java OO

发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够

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

另一方面,利用 Git 作为代码配置管理的工具,学会 Git 的基本使用方法。

基本的 Java OO 编程

基于 Eclipse/IDEA IDE 进行 Java 编程

基于 JUnit 的测试

基于 Git 的代码配置管理

  1. 实验过程

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

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

    1. Magic Squares

这部分分两个问题。

第一个问题是要求编写一个方法,从指定的txt文件中读取数据,并且判断读取的文件是否能够构成Magic Square(每行,每列,每条对角线的和都相等的矩阵)。如果满足条件则返回true,否则返回false。返回true的文件里,数据应该满足数字全部都是正整数,并且数与数之间用\t隔开。除此之外,对于非法输入,未按\t隔开,不构成矩阵等情况也要返回false,并且打印错误提示信息。

第二个问题是要求理解给定的方法generateMagicSquare()是如何生成Magic Square的,并且绘制流程图。然后对该函数进行扩展,使其能够将生成的Magic Square输出到\src\P1\txt\6.txt中,并且能够对于输入为偶数或负数时返回false,抛出错误信息。最后使用问题一编写的方法进行判断是否为Magic Square。

      1. isLegalMagicSquare()

思路:先从文件中按照\t分隔的格式把数据读取出来放在一个二维数组里面,然后从行列数是否相等,每行、每列、每条对角线的和是否相等来判断是否构成Magic Square。如果行列数不相等,存在非正整数,数据未按\t分隔,应该报错,并且返回false。

过程:将FileReader包装成BufferReader,按行读取文件,把每一行当成一个字符串放入numstr,再把numstr中每个字符串按\t分割,放入temp,据此得到两个字符串数组,根据数组长度是否相等判断是否是矩阵

 

然后将temp中每个字符串转化成int,依次放入一个二维数组。在转化过程中,如果出现了异常,那么就说明存在非法输入(字母,浮点数等),或者是没有按照\t分隔

 

 

然后判断转化成的int是否是正整数

 

对于正常得到的二维数组,然后就分别对于每行每列每个对角线求和来判断是否相等,从而判断是否是Magic Square。

 

      1. generateMagicSquare()

读给定的方法,可以得到流程图如下:

 

思路:在生成Magic之后,按照\t分隔,写入指定的路径即可。对于输入为偶数或者负数的情况下,加入if语句判断即可。最后将生成的路径作为参数,调用问题一的方法。

 

 

 

    1. Turtle Graphics

本问题是在引导之下实现并测试一个可以绘制图形的类TurtleSoup。具体需要实现的部分包括计算转向角,绘制多边形,计算凸包,调用完成的方法绘制图形,并且使用Junit进行测试。

      1. Problem 1: Clone and import

首先打开老师提供的url,创建好远端仓库,然后在git bush中,使用git clone命令,将远端仓库克隆到本地(忘记截图了)。

然后设定本地的用户名和邮箱

git config -global user.name xxxx

git config -global user.email xxxxx

修改clone到本地的仓库,然后执行以下命令更新远端仓库

git add .

git commit -m “描述”

git push

      1. Problem 3: Turtle graphics and drawSquare

前进sides,然后转弯90度,重复即可。

 

      1. Problem 5: Drawing polygons

先按照内角和公式编写calculateRegularPolygonAngle

 

然后调用这个方法绘制多边形

 

      1. Problem 6: Calculating Bearings

calculateBearingToPoint部分:使用Math.atan2(反正切)计算两个点的连线与x轴正向的角度,然后换算成y轴,再减去初始角即可。如果小于0,则按照角度的周期性,加上360度即可。

 

calculateBearings部分:每个点到下个点的初始角又这个点和上个点的连线决定,然后调用calculateBearingToPoint即可。

 

 

      1. Problem 7: Convex Hulls

先得到最左侧的点,然后循环找到顺时针转动角度最小的点作为下个点,如果有多个点角度相同,则取距离较远点,直到下个点是起点为止。

以下给出了找下个点的循环部分

 

此时应该所有的测试都通过

 

      1. Problem 8: Personal art

让i从1到1200,每次让i=i/3缩进,然后依次使用不同的颜色,并且进行转动

 

 

绘制出来的 图形如下:

 

      1. Submitting

按照3.2.1中的命令push即可

    1. Social Network

先实现person类,在类中应该包含姓名和朋友的信息,然后FriendGraph类构建person类之间的关系,通过修改person中的信息即可。

      1. 设计/实现FriendshipGraph

思路:先创建person对象的列表,然后依次操作即可。需要在函数中检测是否有重名。具体思路看每个功能。

过程:

  1. addVertex:每次执行列表的add即可。重名检测放在person类中

 

  1. addEdge:需要扩展到有向图,所以a中加入b即可

 

  1. getDistance:采用广度优先搜索即可:如果队空了,则表明无法到达

 

      1. 设计/实现Person

思路:类中应该包含名字和朋友,名字使用静态变量检测重名

 

此后只需要常规的get方法就行

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

main方法按照实验手册中提供的即可:

 

      1. 设计/实现测试用例
  1. addVertex:

只需要测试是否graph中是否存在

 

  1. addEdge

只需要测试a中是否有b

 

  1. getDistance

需要测试无法到达(-1),自己(0),距离为1和大于1

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值