Lab1实验过程及心得体会

实验过程
1 Magic Squares
检验矩阵是否是幻方矩阵。首先要检验文本中输入数据是否满足规范(包括是否构成方阵、是否按要求将数据以制表符隔开、是否包含小数和负数、是否有非法字符等),在满足规范的前提下,检验该方阵是否每行、每列和每条对角线上的元素相加都相等,最后,根据给出的参数生成一个新的矩阵存入第六个文本中并检验它。1.1 isLegalMagicSquare()
1、 先从文件中读取数据。在这里我先建立了一个输入流对象,再把输入的文件内容转换成计算机能读懂地语言,最后按行读取数据。为了防止异常,我用了try cash捕捉异常
2、 识别不合法输入。数据是否满足以制表符隔开、行列数是否相等、是否存在负号和小数点、是否存在其他非法符号
3、判断行、列、对角线相加是否相等。将数据通过函数Integer.valueOf将字符串转化为int型并存入int型数组,再通过多个for循环语句遍历数组,检验并得出结论。
开始时,对于返回false的原因没有仔细考虑,经过多次修正完善,最后得出较为完善的返回错误原因(包括数据是否满足以制表符隔开、行列数是否相等、是否存在负号和小数点、是否存在其他非法符号和是正整数方阵但不满足幻方矩阵定义)。运行结果如下:

1.2 generateMagicSquare()
这是生成magic square函数。流程图如下:

2 Turtle Graphics
按照实验指导书要求,补全turtle soup中的各个函数功能。包括用turtle画图,多边形角度计算,凸包问题等。
测试结果如下:

2.1 Problem 1: Clone and import
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
2.2 Problem 3: Turtle graphics and drawSquare
画正方形只需要调用forward,转动90°四次,即可。具体代码如下:turtle.draw();
turtle.forward(sideLength);
turtle.turn(90.00);
turtle.forward(sideLength);
turtle.turn(90.00);
turtle.forward(sideLength);
turtle.turn(90.00);
turtle.forward(sideLength);
运行结果如下:

2.3 Problem 5: Drawing polygons
画多边形需要计算方位角,公式为180-(360/边数),注意这里计算时要注意浮点数问题,代码为:public static double calculateRegularPolygonAngle(int sides) {
double polygonAngle = 180 - (360.0 / sides);
return polygonAngle;
测试结果如下:

2.4 Problem 6: Calculating Bearings
要求:实现函数calculateBearingToPoint和calculateBearings,分别用于计算从一点到一点需要转动的角度(给出初始指向角度)和给出点集的情况下,返回一个转动的角度集。
(2).具体实现:通过数学函数atan2计算两点之间方位角,在根据方位角取值为-180°~180°根据具体问题分析得到如何由方位角转化到由一点(已知初始朝向偏离正y轴的角度)到目标点应该转过的角度。
3.2.5 Problem 7: Convex Hulls
(1).算法思想:外包装法。从距离原点坐标最近的点开始,想象用胶带紧绷着缠绕一圈,直到回到初始点,所经过的最少的点即为所求凸包。具体代码实现:用函数atan2实现对方位角的计算,每次转过相同角度时,选择最长距离,忽略路径上的中间点。
(2).具体测试代码和测试结果:

2.6 Problem 8: Personal art
要求画出自己的艺术图形。运行结果如下:

2.7 Submitting
通过git的add、remote、push等指令将代码提交到自己绑定好的Github仓库上。

3 Social Network
通过Person类、FriendshipGraph两个类的实现完成关系图的建立,要求两个人之间的距离是最短关系路径距离。
3.1 设计/实现FriendshipGraph类
这里我用了java里的函数映射,map变量具有完备性,很方便。但是缺点是里面的元素无序,需要用迭代器。
1.数据结构定义
Map<Person, ArrayList> Friendship = new HashMap<>();
2.函数接口:
public void addEdge(Person name1, Person name2)
public void addVertex(Person name)
public Integer getDistance(Person name1, Person name2)
3.具体实现:通过上诉数据结构和接口,利用栈、深搜,不断更新最短路径,将结果储存在Map<Person, ArrayList> Friendship = new HashMap<>()中中。

3.2 设计/实现Person类
由于我用的是map,这里的数据结构就会非常简单。

3.3 设计/实现客户端代码main()
Main函数只需要在点集、边集里加入人名和他们之间的关系即可。
public static void main(String args[]) {
FriendshipGraph graph = new FriendshipGraph();
Person rachel = new Person(“Rachel”);
Person ross = new Person(“Ross”);
Person ben = new Person(“Ben”);
Person kramer = new Person(“Kramer”);
graph.addVertex(rachel);
graph.addVertex(ross);
graph.addVertex(ben);
graph.addVertex(kramer);
graph.addEdge(rachel, ross);
graph.addEdge(ross, rachel);
graph.addEdge(ross, ben);
graph.addEdge(ben, ross);
System.out.println(rachel.name + " to " + ross.name + “:” + graph.getDistance(rachel, ross));
System.out.println(rachel.name + " to " + ben.name + “:” + graph.getDistance(rachel, ben));
System.out.println(rachel.name + " to " + rachel.name + “:” + graph.getDistance(rachel, rachel));
System.out.println(rachel.name + " to " + kramer.name + “:” + graph.getDistance(rachel, kramer));

}
1
4 设计/实现测试用例
需要注意的是,为了保证结果的准确性,添加测试例子时尽量使图中存在一个人到另一个人有两条路径,其中有一条比另一条短,看看最后函数的返回值。

4 Tweet Tweet
请自行组织子目录结构。
1.函数接口和对应功能:
public static Timespan getTimespan(List tweets)
传递参数为tweet表,返回一个时间戳,其起始时间是该tweet表中第一条被发出的tweet的发布时间,其结束时间是该tweet表中最后一条被发出的tweet的发布时间。
public static Set getMentionedUsers (List tweets)
传递参数为tweet表,返回这个tweet表中所有被@的用户名集合。鉴定是否是合法用户名的原则是符合规定的正则表达式(|[A-Za-z0-9_-]+)@([A-Za-z0-9_-]+)

4.2:Filtering lists of tweets
1.函数接口和对应功能:
public static List writtenBy(List tweets, String username)
传递参数为tweet表和要一个用户名,遍历整个tweet表中的tweet,将作者为传入参数的用户名所作的tweet存放在一个线性表中并返回。
public static List inTimespan(List tweets, Timespan timespan)传递参数为tweet表和一个时间戳,遍历整个tweet表,将在时间戳内发布的tweet存放在一个线性表内并返回。
public static List containing(List tweets, List words)
传递参数为tweet表和一组words,遍历整个tweet表,将含有words关键字text的tweet存放在一个线性表中并返回。

4.3&4.4:Inferring a social network and Get smarter
1.函数接口和对应功能:
public static Map<String, Set> guessFollowsGraph(List tweets)
(1).未改进的版本:建立一个map,记录tweet表中提及的用户(包括发过tweet的或被@的用户)为关键字,value设置为他们对应的关注者集合(a@b,则表示b的关注者中有a)。
(2).改进的版本:加入三元闭合,即若a@b,b@c,则认为a@c,即c的关注者中有a。
public static List influencers(Map<String, Set> followsGraph)
(1).传递参数为一个建立好的、有tweet中完整关注者信息的map变量,通过冒泡排序按关注者数量(影响力)由高到低排序用户名,存入一个线性表并返回。

实验过程中收获的经验、教训、感想
实验过程中收获的经验和教训
写实验之前要多熟悉语言,对Java语言不熟悉的我在这次实验中遇到了很多困难,有很多Java自带的函数和数据结构都不了解,导致走了很多弯路。这个时候千万不能放弃,应该努力通过各种途径去学习相关知识,来弥补自己的不足。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值