哈工大软件构造lab1

2022年春季学期
计算机学院《软件构造》课程

Lab 1实验报告
 

姓名

杨楠

学号

120L021725 

班号

2003006

电子邮件

875580022@qq.com

手机号码

13614383499

 

目录

1 实验目标概述... 1

2 实验环境配置... 1

3 实验过程... 1

3.1 Magic Squares. 2

3.1.1 isLegalMagicSquare(). 2

3.1.2 generateMagicSquare(). 3

3.2 Turtle Graphics. 5

3.2.1 Problem 1: Clone and import 5

3.2.2 Problem 3: Turtle graphics and drawSquare. 5

3.2.3 Problem 5: Drawing polygons. 6

3.2.4 Problem 6: Calculating Bearings. 6

3.2.5 Problem 7: Convex Hulls. 7

3.2.6 Problem 8: Personal art 8

3.2.7 Submitting. 9

3.3 Social Network. 9

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

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

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

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

4 实验进度记录... 14

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

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

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

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

  1. 实验目标概述

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

l 基本的Java OO编程

l 基于Eclipse IDE进行Java编程

l 基于JUnit的测试

l 基于Git的代码配置管理

2.验环境配置

首先在lab0的实验报告中根据给出的网址下载安装了ecilpse,在git官网下载安装了git-bash,然后下载了jdk13,后来由于实验要求jdk8或jdk10,为了防止出错,又重新下载了jdk8配置在eclipse上,下载了junit4.13和hamcrest-core-1.3的jar包,由于git的操作并不熟悉,所以在csdn上查找了关于用git的操作与github进行联系的一些介绍,详见参考文章:https://blog.csdn.net/qq_37512323/article/details/80693445

由于装eclipse的过程中没有截图,所以只能文字描述遇到的问题了,在装eclipse时由于老师给的参考文章全英文,有些地方晦涩难懂,所以去了csdn求助,详见参考文章:Eclipse 下载、安装、配置教程_woniuxyy的博客-CSDN博客_eclipse安装教程配置。后来在配置环境变量时不知道怎么做,教程好像少了一点讲解,然后又去搜索了关于如何配置环境变量的方法,详见参考文章:https://jingyan.baidu.com/article/ed15cb1bacb6a81be2698110.html

GitHub Lab1仓库的URL地址

https://github.com/ComputerScienceHIT/Lab1-1180300829-1

3.实验过程

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

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

3.1Magic Squares

这次任务的目的是要求设计一个程序:

任务一:能够从五个已经提供的txt文档中读入数据,来判断输入的数据能否构成一个MagicSquare,若是则返回true,若不是则返回false且说明原因。MagicSquare是一个正方形图形,他的每一行、每一列和对角线的数字之和都相等。

任务二:对给出的generateMagicSquare函数进行扩充,使之能够产生一个MagicSquare并且将其输入到文本6.txt中,然后对其判断是否为MagicSquare。并且满足若输入的为奇数能产生MagicSquare,而输入偶数或者负数会返回false。

3.1.1isLegalMagicSquare()

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

过程

对于三种错误:

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

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

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

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

int [] sumhang=new int [hang];

int  [] sumlie=new int[lie];

int [] sumdia = new int;

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

结果

 

3.1.2generateMagicSquare()

流程图如下:

 

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

过程

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

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

结果

3.2Turtle Graphics

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

3.2.1Problem 1: Clone and import

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

创建git仓库的具体步骤当时并没有截图,大概步骤为:

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

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

3.ssh –T git@github.com;

4.git config –global user.name ”120L021725”;

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

详见参考网址:https://blog.csdn.net/qq_37512323/article/details/80693445

管理本地开发:

1. git add ;

2. git commit -m "   " ;

3. git push origin master.

3.2.2Problem 3: Turtle graphics and drawSquare

重复前进转弯90即可:

 

3.2.3Problem 5: Drawing polygons

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

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

​​​​​​​3.2.4Problem 6: Calculating Bearings

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

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

​​​​​​​3.2.5Problem 7: Convex Hulls

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

3.2.6​​​​​​​Problem 8: Personal art

随心所欲 画什么都可以

3.2.7Submitting

junit测试如下:

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

(1).打开git-bash

(2).cd /F/Lab1-120L021725-1

(3).git add . Lab1-120L021725

(4).git commit –m “P1P2”

(5)git push origin master

​​​​​​​3.3Social Network

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

3.3.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:

 

结果

 3.3.2设计/实现Person类

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

过程

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

 

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

 

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

 

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

 

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

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

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

 

输出结果为:

 

​​​​​​​3.3.4设计/实现测试用例

思路:分别要对在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

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

 

结果

 

4.实验进度记录

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

日期

时间段

任务

实际完成情况

4.28

17:00-19:30

编写P1的isLegalMagicSquare函数

按计划完成

4.29

18:00-21:30

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

按计划完成

4.30

14:00-22:00

完成P2

按计划完成

5.2

14:00-22:00

完成P3

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

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

遇到的难点

解决途径

P1书写的时候遇到了一些困难

查询资料,上课认真听讲

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

仔细琢磨分析,分析问题出现的原因,逐个解决即可

P3没有理解题意

仔细阅读,课后请教老师

 

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

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

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

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

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

4.环境并不熟悉,对于eclipse的使用不够熟练,文件调用比较生疏

​​​​​​​6.2针对以下方面的感受

  1. Java编程语言是否对你的口味?

很好,很多数据结构的函数可以直接使用,很多底层的工作不用重复编写,这些方面优于C

2.关于Eclipse IDE

对于初学者还是很友好的,但是据说IDEA更智能,能够帮助改错等,下次尝试IDEA

3.关于Git和GitHub

很智能,很神奇,好多命令行有着独特的功能。

4.关于CMU和MIT的作业

实验内容丰富,收获很大。

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

工作量很大,难度还可以,deadline较为合理

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

慢慢学路还长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值