目 录
3.1.2 generateMagicSquare(). 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.3.1 设计/实现FriendshipGraph类... 2
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
本次实验通过求解三个问题,训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
- 基本的Java OO编程
- 基于Eclipse IDE进行Java编程
- 基于JUnit的测试
- 基于Git的代码配置管理
- 实验环境配置
(1)下载最新eclipse安装包,并安装。
(2)JDK很早之前就配置好了,无需重新配置
(3)下载git并按步骤进行配置、初始参数的设置
2.2在这里给出你的GitHub Lab1仓库的URL地址(Lab1-学号)。
https://github.com/ComputerScienceHIT/Lab1-120L022220-1.git
Magic Squares这个任务分为两个问题:第一,设计算法来识别输入的矩阵是否是幻方,要保持正确性和健壮性;第二,分析所给代码,画流程图,找出偶数负数报错的原因,并且把输入的矩阵保存为6.txt,再用第一个问题中所设计的矩阵进行测试。
思路:函数能够读入文件中的数字来储存在矩阵中,所以首先需要判断读入的数据能否构成一个矩阵,根据实验手册,需要判断的三张错误分别为行列数不相等、并非矩阵,矩阵中某些数字不是正整数,不是以\t作为分隔符。对三种错误进行判断并输出返回false。当没有这些错误时,分别计算矩阵每一行、每一列、对角线的和是否相等来判断能否构成MagicSquare,并返回true。
过程:
对于三种错误:
1. 行列数不相等、并非矩阵:我首先定义一个变量在读入每一行时进行加一的操作,来计算总行数,然后对每一列按照\t进行分割装在矩阵中,判断每一列是否与行数相等,若有一列不相等,则返回false。
2. 矩阵中某些数字不是正整数:与1中一样,首先按照\t将分割后的字符串装入数组中,然后判断这些字符串是否包含”.”或者”-”,若包含,则返回false。这样能够除掉包含小数和负数的情况。
3. 不是以\t作为分隔符:若不是以\t作为分隔符,则会在Integer.valueOfs时抛出异常信息,并返回false。
对于判断是否是MagicSquare定义如下:
分别计算每一行、每一列、对角线的和储存在相应数组中,首先判断三个数组的首元素是否相等,不相等返回false,然后在每一个数组内判断是否相等。最后返回true
结果:
-
-
- generateMagicSquare()
-
思路:实验手册已经给出了函数,只需要我们增加部分功能::(1) 将产生的magic square写入文件\src\P1\txt\6.txt中;(2) 当输入的n不合法时(n为偶数、n为负数等),不要该函数抛出异常并非法退出,而是提示错误并“优雅的”退出——函数输出false结束。所以我们只需要在开始判断是否满足n的合法输入并且增加写入文件的操作。
过程:
在函数开头增加判断合法输入的操作:
在后面加入写入文件的操作:
结果:
-
- Turtle Graphics
这次任务是为了实现一个绘图工具Trurtle Graphics,需要我们完成的任务为:画出一个正方形,计算正多边形内角,由正多边形内角得到边数,计算从一个点到另外一个点所需要转过的角度,给定一系列点计算每次转过的角度并返回在集合中,计算一系列点中的凸包,调用函数绘制图形,使用junit进行单元测试。
首先打开实验手册提供的网站,从上面下载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.
-
-
- Problem 3: Turtle graphics and drawSquare
-
重复前进转弯90即可:
计算正多边形内角只需根据正多边形内角=(边数-2)/sides写出calculateRegularPolygonAngle (int sides)
然后画正多边形只需调用此函数即可:
计算前进方向的偏转角只需要调用atan2函数得到弧度,然后调用toDegree转换成角度,特别注意若角度为负值,需要加上360。
计算一系列点的偏转角不断调用上面的函数即可:
计算给定集合中的凸包需要利用Gift wrapping algorithm算法,先找到最左下角的点加入集合,然后比较剩余点到此点的偏转角,找到偏转角最小的加入集合,当偏转角相同时,需要找到最长的一条边的点加入集合,最后即可得到凸包的点集。
本人画的图代码如下:
如图所示:
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
本次任务要求实现Person和FriendshipGraph两个类,用FriendshipGraph来构建Person之间的关系来模拟社交网络,能够计算出每两个Person之间的最短路径。
-
-
- 设计/实现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:
结果:
-
-
- 设计/实现Person类
-
思路:在Person类中我们要完成的功能为:增加本人的新朋友addnewfriend,得到本人的名字getmyname,得到本人的朋友列表getthisfriend。
过程:
1.定义一个String变量myname,储存名字,定义一个Person的集合friendofmyname,定义一个私有静态String集合hisallperson(用来储存所有已经存在的名字,防止定义相同名字的Person对象):
2.构造方法:若名字已经在hisallperson中已经存在则输出“此名字已存在”并结束程序,否则初始化这个名字,并且将这个名字加入hisallperson中:
3.增加本人新朋友addnewfriend:直接将新Person对象加入friendofmyname中即可:
4. 得到本人的名字getmyname:直接返回即可:
5. 得到本人的朋友列表getthisfriend,直接返回即可:
-
-
- 设计/实现客户端代码main()
-
输出结果为:
-
-
- 设计/实现测试用例
-
思路:分别要对在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
是否同一个人划分:同一个人之间距离,两个人之间距离
结果:
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
日期 | 时间段 | 任务 | 实际完成情况 |
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类 | 出现了单个函数测试没问题但综合测试出错的为题 |
- 实验过程中遇到的困难与解决途径
遇到的难点 | 解决途径 |
git提交一次后第二次提交出现了问题 | 重新绑定ssh,全部从头设置 |
P3的test出现单个函数测试没问题,总体测试出现问题 | 函数中private static变量时不变的,修改代码即可 |
脱离eclipse环境后用cmd运行java失败,全部抛出IO异常 | 将所有java程序放入与src同级的目录下用cmd运行 |
1.由于是初次使用java,对java的众多语法不熟悉,处处碰壁;
2.学到了很多新知识,比如git的使用,junit的编写;
3.对java面向对象的特质有了更深的理解。
- Java编程语言是否对你的口味?
很好,很多数据结构的函数可以直接使用
- 关于Eclipse IDE
对于初学者还是很友好的,但是据说IDEA更智能
- 关于Git和GitHub
尚待深入研究
- 关于CMU和MIT的作业
主要由于英文太多,显得不太友好,但实验却使我颇有收获
- 关于本实验的工作量、难度、deadline
工作量很大,难度还可以,deadline会和别的课冲突
- 关于初接触“软件构造”课程
不清楚具体要干嘛