哈工大软件构造lab1总结

 

1 实验目标概述... 1

2 实验环境配置... 1

3 实验过程... 1

3.1 Magic Squares. 1

3.1.1 isLegalMagicSquare(). 1

3.1.2 generateMagicSquare(). 1

3.2 Turtle Graphics. 1

3.2.1 Problem 1: Clone and import 2

3.2.2 Problem 3: Turtle graphics and drawSquare. 2

3.2.3 Problem 5: Drawing polygons. 2

3.2.4 Problem 6: Calculating Bearings. 2

3.2.5 Problem 7: Convex Hulls. 2

3.2.6 Problem 8: Personal art 2

3.2.7 Submitting. 2

3.3 Social Network. 2

3.3.1 设计/实现FriendshipGraph类... 2

3.3.2 设计/实现Person类... 2

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

3.3.4 设计/实现测试用例... 3

3.4 Tweet Tweet 3

3.4.1 Problem 1: Extracting data from tweets. 3

3.4.2 Problem 2: Filtering lists of tweets. 3

3.4.3 Problem 3: Inferring a social network. 3

3.4.4 Problem 4: Get smarter 3

4 实验进度记录... 3

5 实验过程中遇到的困难与解决途径... 3

6 实验过程中收获的经验、教训、感想... 4

6.1 实验过程中收获的经验和教训... 4

6.2 针对以下方面的感受... 4

  1. 实验目标概述

本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。

  1. 基本的Java OO编程
  2. 基于Eclipse IDE进行Java编程
  3. 基于JUnit的测试
  4. 基于Git的代码配置管理
  1. 实验环境配置

(1)下载最新eclipse安装包,并安装。

(2)JDK很早之前就配置好了,无需重新配置

(3)下载git并按步骤进行配置、初始参数的设置

2.2在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。

https://github.com/ComputerScienceHIT/Lab1-120L022220-1.git

  1. 实验过程
    1. Magic Squares

Magic Squares这个任务分为两个问题:第一,设计算法来识别输入的矩阵是否是幻方,要保持正确性和健壮性;第二,分析所给代码,画流程图,找出偶数负数报错的原因,并且把输入的矩阵保存为6.txt,再用第一个问题中所设计的矩阵进行测试。

      1. isLegalMagicSquare()

思路:函数能够读入文件中的数字来储存在矩阵中,所以首先需要判断读入的数据能否构成一个矩阵,根据实验手册,需要判断的三张错误分别为行列数不相等、并非矩阵,矩阵中某些数字不是正整数,不是以\t作为分隔符。对三种错误进行判断并输出返回false。当没有这些错误时,分别计算矩阵每一行、每一列、对角线的和是否相等来判断能否构成MagicSquare,并返回true。

过程

对于三种错误:

1. 行列数不相等、并非矩阵:我首先定义一个变量在读入每一行时进行加一的操作,来计算总行数,然后对每一列按照\t进行分割装在矩阵中,判断每一列是否与行数相等,若有一列不相等,则返回false。

2. 矩阵中某些数字不是正整数:与1中一样,首先按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含”.”或者”-”,若包含,则返回false。这样能够除掉包含小数和负数的情况。

3. 不是以\t作为分隔符:若不是以\t作为分隔符,则会在Integer.valueOfs时抛出异常信息,并返回false。

对于判断是否是MagicSquare定义如下:

分别计算每一行、每一列、对角线的和储存在相应数组中,首先判断三个数组的首元素是否相等,不相等返回false,然后在每一个数组内判断是否相等。最后返回true

结果

      1. generateMagicSquare()

流程图如下:

思路:实验手册已经给出了函数,只需要我们增加部分功能::(1) 将产生的magic square写入文件\src\P1\txt\6.txt中;(2) 当输入的n不合法时(n为偶数、n为负数等),不要该函数抛出异常并非法退出,而是提示错误并“优雅的”退出——函数输出false结束。所以我们只需要在开始判断是否满足n的合法输入并且增加写入文件的操作。

过程

在函数开头增加判断合法输入的操作:

在后面加入写入文件的操作:

结果

    1. Turtle Graphics

这次任务是为了实现一个绘图工具Trurtle Graphics,需要我们完成的任务为:画出一个正方形,计算正多边形内角,由正多边形内角得到边数,计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中,计算一系列点中的凸包,调用函数绘制图形,使用junit进行单元测试。

      1. Problem 1: Clone and import

首先打开实验手册提供的网站,从上面下载P2的包,并解压导入eclipse中。

大概步骤为:

1.获取秘钥: ssh -keygen -t rsa -C "your_email@youremail.com";

2.找到秘钥并复制添加到github上;

3.ssh –T git@github.com;

4.git config –global user.name ”1180300829”;

5.git config –global user.emal ”1063695334@qq.com”;

管理本地开发:

1. git add ;

2. git commit -m "   " ;

3. git push origin master.

      1. Problem 3: Turtle graphics and drawSquare

重复前进转弯90即可:

      1. Problem 5: Drawing polygons

计算正多边形内角只需根据正多边形内角=(边数-2)/sides写出calculateRegularPolygonAngle (int sides)

然后画正多边形只需调用此函数即可:

      1. Problem 6: Calculating Bearings

计算前进方向的偏转角只需要调用atan2函数得到弧度,然后调用toDegree转换成角度,特别注意若角度为负值,需要加上360。

计算一系列点的偏转角不断调用上面的函数即可:

      1. Problem 7: Convex Hulls

计算给定集合中的凸包需要利用Gift wrapping algorithm算法,先找到最左下角的点加入集合,然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,需要找到最长的一条边的点加入集合,最后即可得到凸包的点集。

      1. Problem 8: Personal art

本人画的图代码如下:

如图所示:

      1. Submitting

junit测试如下:

如何通过Git提交当前版本到GitHub上你的Lab1仓库。

(1).打开git-bash

(2).cd /F/Lab1-1180300829-1

(3).git add . Lab1-1180300829

(4).git commit –m “P1P2”

(5)git push origin master

    1. Social Network

本次任务要求实现Person和FriendshipGraph两个类,用FriendshipGraph来构建Person之间的关系来模拟社交网络,能够计算出每两个Person之间的最短路径。

      1. 设计/实现FriendshipGraph类

思路:在FriendshipGraph类中我们要完成的功能为:增加一个人的对象addVertex(若是增加的人为已存在的则输出“此名已存在,重复”并结束程序),增加一条有向边addEdge,得到两个人之间的最短距离getDistance。对此三个功能的实现,主要是功能三的实现相对复杂,我们决定采取先广的方式求最短路径。

过程

1.定义一个Person集合来储存所有人的对象,定义一个String集合来储存所有已经存在的名字:

2.定义构造方法对两个集合进行初始化:

3.实现功能一:addVertex。实现此功能需要注意用来增加的Person对象是否已经存在,所以需要在开始判断allname集合中是否已经有了待增加的Person对象的名字,若已经存在,则输出“此名已存在,重复”并结束程序,若没有,则将待增加的新的Person对象加入allpeople集合中,并且将对象的名字加入allname集合中:

4.实现功能二:addEdge。实现此功能只需要调用Person类的addnewfriend方法即可:

5.实现功能三:getDistance。实现此功能我们需要了解先广方式求最短路径的方法。首先我们需要知道若两个Person对象为同一个,则返回0。然后定义一个Map集合theway和一个Person队列myqueue,队列myqueue用来储存广搜的遍历结果,theway的Map集合用来储存广搜的所有元素及他们与第一个元素的距离。具体实现方法为首先将第一个元素c1入队,并且把第一个元素c1和下标0入集合,当队列非空时,弹出队首元素top,并且得到top在集合theway中的下标distance,然后调用gethisfriend函数得到队首元素的所有朋友allfriend,只要allfriend中的元素与c2不同,就把这些元素全部入队,并且把这些元素及下标distance+1放入集合。只要队列非空,继续执行以上步骤,直到找到某个元素与c2相同并且返回这个元素在集合theway中的下标。如果直到队列为空还没找到c2,则返回-1:

结果

      1. 设计/实现Person类

思路:在Person类中我们要完成的功能为:增加本人的新朋友addnewfriend,得到本人的名字getmyname,得到本人的朋友列表getthisfriend。

过程

1.定义一个String变量myname,储存名字,定义一个Person的集合friendofmyname,定义一个私有静态String集合hisallperson(用来储存所有已经存在的名字,防止定义相同名字的Person对象):

2.构造方法:若名字已经在hisallperson中已经存在则输出“此名字已存在”并结束程序,否则初始化这个名字,并且将这个名字加入hisallperson中:

3.增加本人新朋友addnewfriend:直接将新Person对象加入friendofmyname中即可:

4. 得到本人的名字getmyname:直接返回即可:

5. 得到本人的朋友列表getthisfriend,直接返回即可:

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

直接复制实验报告的代码稍加修改即可:

输出结果为:

      1. 设计/实现测试用例

思路:分别要对在addVertex ,addEdge ,getDistance三个功能进行测试。对于addVertex,只需要设计test用例addVertextest,在里面建立四个Person对象全部执行addVertex,然后判断allpeople里面是都有这些对象即可。对于addEdge,只需设计test用例addEdgetest,在里面同样建立四个Person对象,执行addVertex后,执行addEdge然后判断他们的朋友中是否包含彼此即可。对于getDistance,只需设计test用例getDistancetest,在里面同样建立四个Person对象,执行addVertex后,执行addEdge后,使得三种距离等价类都存在,即距离为-1,距离为0,距离为正整数。

过程

1.addVertextest:

2. addEdgetest:

3.getDistancetest:

按照两个人之间的距离划分:距离为0,距离为-1,距离为大于1

是否同一个人划分:同一个人之间距离,两个人之间距离

结果

  1. 实验进度记录

请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。

日期

时间段

任务

实际完成情况

2022-5-1

17:00-19:30

编写P1的isLegalMagicSquare函数

按计划完成

2022-5-1

18:00-21:30

编写P1的generateMagicSquare函数并写完测试

按计划完成

2022-5-2

18:00-22:00

完成P2的1-6

按计划完成

2022-5-3

14:00-19:00

完成P2的凸包和个人画图并用自带的测试类完成了测试

中途出现结果不合适的问题,最后按计划完成

2022-5-4

19:00-22:00

完成P3的Person类

按计划完成

2022-5-5

15:00-20:00

完成P3的FriendshipGraph类

按计划完成

2022-5-6

19:00-21:00

完成P3的FriendshipGraphTest类

出现了单个函数测试没问题但综合测试出错的为题

  1. 实验过程中遇到的困难与解决途径

遇到的难点

解决途径

git提交一次后第二次提交出现了问题

重新绑定ssh,全部从头设置

P3的test出现单个函数测试没问题,总体测试出现问题

函数中private static变量时不变的,修改代码即可

脱离eclipse环境后用cmd运行java失败,全部抛出IO异常

将所有java程序放入与src同级的目录下用cmd运行

  1. 实验过程中收获的经验、教训、感想
    1. 实验过程中收获的经验和教训

1.由于是初次使用java,对java的众多语法不熟悉,处处碰壁;

2.学到了很多新知识,比如git的使用,junit的编写;

3.对java面向对象的特质有了更深的理解。

    1. 针对以下方面的感受
  1. Java编程语言是否对你的口味?

很好,很多数据结构的函数可以直接使用

  1. 关于Eclipse IDE

对于初学者还是很友好的,但是据说IDEA更智能

  1. 关于Git和GitHub

尚待深入研究

  1. 关于CMU和MIT的作业

主要由于英文太多,显得不太友好,但实验却使我颇有收获

  1. 关于本实验的工作量、难度、deadline

工作量很大,难度还可以,deadline会和别的课冲突

  1. 关于初接触“软件构造”课程

不清楚具体要干嘛

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值