软件构造学习笔记-实验1

记录一下做实验1时遇到的问题。

准备工作

1.GitHub的注册和配置
由于之前没有接触过GitHub,所以碰到了一些问题。GitHub是什么?怎么建立GitHub远程仓库与本地仓库的连接?怎么在GitHub上传和下载文件?
实验完成后我可以简单回答上述问题:Git是分布式版本控制系统;通过SSH key建立远程与本地的连接;通过Git Bash中的命令进行文件的上传和下载。

图1-常用的git命令

GitHub新手详细教程
https://blog.csdn.net/Hanani_Jia/article/details/77950594?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
Git教程
https://www.liaoxuefeng.com/wiki/896043488029600

2.maven的配置和初步使用
由于实验要求代码完成后要从Eclipse环境脱离开来,所以我选择使用maven进行build。首先下载maven,在下载目录中打开apache-maven-3.6.3\conf\settings.xml(这里强烈建议使用Notepad++进行编辑,非常好用)。将图示位置修改成本地maven仓库的位置,本地maven仓库简单来说就是maven自动下载的外部库存放的位置。

图2-修改settings本地库的位置

然后如下位置添加阿里的镜像,之前没有添加时下载插件速度很慢甚至会失败。然后就能建立maven project了!

图3-修改setting的镜像地址

问题1

问题1主要涉及到Java的文件读写问题。由于之前对这部分不熟悉,我又把文件部分看了一遍,再做时思路就明确了。
题目中提示按行读入,那么我就用类java.io,BufferedReader进行读取。读取一行后,将其转化成字符数组并检查输入合法性。如果输入合法,则用String类的split方法,将字符串转化成字符串数组,再分别转化成数字,存放在二维数组中。当对所有行操作完毕时,对所得二维数组进行验证即可。
对各列求和时,想起计算机系统史老师教我们的,考虑到了局部性原理的问题。

图4-求数组每列的和

问题2

问题2比较困难的部分是convexHull的完成,也就是凸包问题。
当代码出现细微问题的时候,对它进行测试却发生了不可思议的问题。完成问题2的所有方法后,我用JUnit单独测试了每个方法,过了,非常开心。但是当我运行TurtleSoupTest的时候,裂开了,凸包没过。我很不甘心,把凸包测试方法的语句在main里重写一遍,发现跟答案一模一样。我又从测试方法里一步步debug,也没有发现问题。但是再运行TurtleSoupTest,还是报错。

图5-莫名其妙的错误

在piazza上求助,有人说换Eclipse试试( 我一直在用IDEA),我用Eclipse运行测试类,出现了绿条。在Eclipse上运行了一下convexHullTest方法,又报错了。
终于发现了一个不严谨的地方,修改之后一切都正常了。

图6-测试类通过

下面说一说我写的凸包算法的思路:
1.选取横坐标最小的点为起始点。如果有多个则选择纵坐标最大的。
2.标记起始点为已加入,每次循环遍历除自身外的所有点,从其余点中找到顺时针角度最小的点。
3.标记该点为起始点,重复2直到下一个找到的目标点为已加入的状态。
特殊情况:输入点数为0,1,2时,直接返回输入集合;多个点同时在一条边上时,创建并加入一个临时集合,在遍历完成后如果该集合的点满足角度最小,则选择边长最大的。

图7-每次遍历的操作

问题3

无向图的建立和广度优先搜索的问题。当定义好Person类之后,操作会比较简单。

图8-我定义的Person类

FriendshipGraph的方法除getDistance都比较简单。重点说一下getDistance方法的实现。
要采用广度优先搜索,我首先想到了队列。Java库中有队列的类,所以用起来很方便。当输入和输出为同一元素时,直接返回0即可。如果不同,则建立队列进行广搜。上学期的cxk实验让我对广搜的写法异常熟悉,很快就能写出来。

图9-利用队列完成广度优先搜索

关于Java队列类的成员方法,建议参考
Java 实例 - 队列(Queue)用法 https://www.runoob.com/java/data-queue.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值