2022年春季学期
计算机学院《软件构造》课程
Lab 1实验报告
姓名 | 杨楠 |
学号 | 120L021725 |
班号 | 2003006 |
电子邮件 | 875580022@qq.com |
手机号码 | 13614383499
|
目录
3.1.2 generateMagicSquare(). 3
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
本次实验通过求解三个问题,训练基本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.实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
任务一:能够从五个已经提供的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
结果:
流程图如下:
思路:实验手册已经给出了函数,只需要我们增加部分功能::(1) 将产生的magic square写入文件\src\P1\txt\6.txt中;(2) 当输入的n不合法时(n为偶数、n为负数等),不要该函数抛出异常并非法退出,而是提示错误并“优雅的”退出——函数输出false结束。所以我们只需要在开始判断是否满足n的合法输入并且增加写入文件的操作。
过程:
在函数开头增加判断合法输入的操作:
在后面加入写入文件的操作:
结果:
这次任务是为了实现一个绘图工具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.6Problem 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.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 | 中途出现结果不合适的问题,最后按计划完成 |
遇到的难点 | 解决途径 |
P1书写的时候遇到了一些困难 | 查询资料,上课认真听讲 |
P2的test出现单个函数测试没问题,总体测试出现问题 | 仔细琢磨分析,分析问题出现的原因,逐个解决即可 |
P3没有理解题意 | 仔细阅读,课后请教老师 |
6.1实验过程中收获的经验和教训
1.由于是初次使用java,对java的众多语法不熟悉,处处碰壁;
2.学到了很多新知识,比如git的使用,junit的编写;
3.对java面向对象的特质有了更深的理解。
4.环境并不熟悉,对于eclipse的使用不够熟练,文件调用比较生疏
6.2针对以下方面的感受
- Java编程语言是否对你的口味?
很好,很多数据结构的函数可以直接使用,很多底层的工作不用重复编写,这些方面优于C
2.关于Eclipse IDE
对于初学者还是很友好的,但是据说IDEA更智能,能够帮助改错等,下次尝试IDEA
3.关于Git和GitHub
很智能,很神奇,好多命令行有着独特的功能。
4.关于CMU和MIT的作业
实验内容丰富,收获很大。
5.关于本实验的工作量、难度、deadline
工作量很大,难度还可以,deadline较为合理
6.关于初接触“软件构造”课程
慢慢学路还长。