HIT-软件构造-第一次实验总结

  1. 实验目标概述

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

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

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

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

l 基本的 Java OO 编程

l 基于 Eclipse IDE 进行 Java 编程

l 基于 JUnit 的测试

l 基于 Git 的代码配置管理

2.实验环境配置

 

 

IDE使用了idea,其他使用了git,在命令行或powershell中使用

第一次使用java语言的ide,一开始下载了eclipse,后来根据个人喜好选择了idea

https://classroom.github.com/a/K_B5NllB

3.实验过程

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

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

3.1Magic Squares

该任务分为两部分,第一部分是从给定的5个txt文件中读取矩阵,然后判断其是否满足magic square的要求,首先要求每行的数据由\t隔开,其次要求数据不为小数,不为字符,而应该为正整数,输入错误要给出相应的错误提示。输入正确的话要判断矩阵行、列、对角线之和是否都等于同一个整数,即magic square的要求。第二部分,在实现了读取并判断矩阵是否为magic square后,要利用给定的生成magic square函数生成一个矩阵并写入6.txt中,再对6.txt进行判断。3.1.1isLegalMagicSquare()

在写的时候,我是先考虑输入格式是否正确

 

读txt的时候,使用readline函数读入一行,然后判断是否用分隔符分开(利用了习题课讲到的matches函数,学习了一些正则语言的写法,构造了识别是否用分隔符分开的正则表达式)

 

然后利用用split将用分隔符分开的数据作为字符串读入str[]中,用lastn记录上一行读入的数据个数,每一次判断上下两行数据个数是否相同,不同则报错。如果数据数量没问题的话就判断每一行数据是否有错误,也是利用了正则表达式构造。

 

在读入过程中记录读入的行数,然后用最后一行数据个数作为列数比较(因为每一行数据都判断了是否相等,那么直接用最后一行数据数代表列数),如果矩阵行列数不同,则输入错误。

读入后将字符串用integeparse转为整数,存在一个二维数组中,然后对二维数组行列、对角线的和进行判断是否相等,返回true或者false。

3.1.2generateMagicSquare()

 

当n为偶数时,函数产生异常java.lang.ArrayIndexOutOfBoundsException即填充过程中在row++时发生数组越界访问。并且当n是负数时,不能有效处理非法输入,产生异常java.lang.NegativeArraySizeException即初始化了行列数为负数的数组。这导致了很差的健壮性。

 

在进行制造magic square前,利用两个if判断输入的n是否合理

3.2Turtle Graphics

主要任务:根据函数的注释补全代码,实现一系列绘图可能用到的功能。包括画出正方形、计算正多边形的内角、计算对应内角的正多边形边数、计算绘图时的角度转移、计算凸包、以及绘制自己独特的图形。

3.2.1Problem 1: Clone and import

直接在github上下载,或者git clone到本地

我第一步使用了直接下载,然后构造文件夹,在命令行中cd到该文件夹下,

利用git init初始化,然后利用git add,git status,git commit,git push,git log等操作进行实验

3.2.2Problem 3: Turtle graphics and drawSquare

这个就是根据注释,要画一个正方形,熟悉一下forward和turn的操作。

3.2.3Problem 5: Drawing polygons

先写给定边数求正多边形外角度数的函数

 

再利用这个函数去写一个画正多边形的函数

 

再写一个利用角度求边数的函数

 

这里用到了math.round函数,不然向下取整会出错误

3.2.4Problem 6: Calculating Bearings

 

这里查阅了一些计算数学三角函数的函数,然后进行编写

 

对一个点集的计算,利用current更新每一次的当前角度

3.2.5Problem 7: Convex Hulls

凸包算法,计算一个点集

 

首先是,如果点的个数小于2,直接返回。

算法中先寻找最左下方的点,然后对一些后面需要使用的数据初始化

 

这里是写好后的版本,每一次寻找偏移角度最小的点,以便于连线后其他更大角度的点都在里面,然后对于角度相同的点,选取离当前点距离大的,依次选择并把选择的点依次加入点集,如果最后一次加到了已经存在的点,说明这些点已经连线完成,退出循环。

 ​​​​​​​​​​​3.2.6 Submitting

 

利用git add追踪git commit提交版本 git push -u 地址 master提交到仓库

3.3 Social Network

主要任务:设计Person类和FriendshipGraph类来模拟一个社交网络,并实现社交网络中需要的一些简单功能,包括添加人、添加社交关系以及计算两个人之间的距离。同时,编写测试程序来检查实现的正确性。

3.3.1设计/实现FriendshipGraph

  1. 利用Hashmap存储信息,利用name作为key,Person类作为value
  2. 编写加点函数,在网络中加入一个点

 

判断是否存在相同name,相同则报错并退出

 

判断增加的边,利用Person类中每个点的出点集或入点集判断

第三个函数是计算两人社交最短距离,利用了先广搜索,在每增加一层时,将深度变量count+1,找到需要找的点时,返回count,没找到,返回-1,对于自己到自己的距离,定义为0

 

 

利用flag标志是否需要增加深度,例如距离点a搜出了b,c,那么记录b搜出的第一个点d,因为队列具有先进先出的性质,搜索到d时,深度+1,再将flag修改,在搜到d搜出的第一个点x时,记录下一层第一个点x,遇到x时深度才++,这是原创(但应该好多人已经写过了),还有一种方法是从a点搜起,记录每一个新搜的点的深度,但如此做要开辟一个数组。

​​​​​​​3.3.2 设计/实现Person

 

Name作为person的标识信息,flag_visit记录先广搜索中是否遍历,InOutdegrees分别记录出点集和入点集,addInedge和addoutdegree是入点集和出点集的增加操作。(没考虑绝交,没写删除操作,实验中也没有要求)

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

 

一个社交网络例子

3.3.4 设计/实现测试用例

 

测试加点,增加li和wang,并用assert判断,后面这个增加wang是为了重复增加,但代码中由于ppt要求是检测到相同的输入 直接退出,就用了exit,而没用return false,(这种exit的测试直接中断了程序,不知道怎么写)

 

测试了正常状态加边,以及加入一些不存在的点,以及加入已经存在的边

 

计算距离,挑选了正常距离1,2,3自己到自己的距离0以及没有关系的点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值