软件构造-实验一-仅供参考

 

 

姓名

 

扫描二维码关注公众号,回复: 7983645 查看本文章

学号

 

班号

 

电子邮件

 

手机号码

 

 


 

 

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编程技能,并且利用JavaOO开发基本的功能模块,阅读已有的代码框架并且根据需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试。学会使用GIT。

2 实验环境配置

安装jdk 随意选择目录 只需把默认安装目录 \java 之前的目录修改即可

安装jre→更改→ \java 之前目录和安装 jdk 目录相同即可

安装完JDK后配置环境变量  计算机→属性→高级系统设置→高级→环境变量

系统变量→新建 JAVA_HOME 变量 。

变量值填写jdk的安装目录

系统变量→寻找 Path 变量→编辑

在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

系统变量→新建 CLASSPATH 变量

变量值填写   .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)

系统变量配置完毕

URL:

3 实验过程

3.1 Magic Squares

Magic Squares就是一个矩阵横竖斜都的和都一样就算Magic Squares。这个实验考验了打开文件和处理从文件中获得数据的能力。

3.1.1 isLegalMagicSquare()

从文件中读取的矩阵,如果有负数或小数,行和列不一样再或者和有一个和不一样就返回false。可以运用求和和判断类型来排除不是幻方的文件。

3.1.2 generateMagicSquare()

生成一个幻方,然后用上面写的函数判断是否是幻方,只能生成为基数的矩阵,如果输入为负就报错。

如果输入偶数则返回:

生成的文件写入6.txt中。

3.2 Turtle Graphics

完善TurtleSoup.java文件,这个实验是为了训练使用java自带的画图库。

每个方法上都有注释让我们了解这个函数应该完成什么样的功能。再加上MIT给的实验指导很清晰,让我们有了很清晰的方向。

3.2.1 Problem 1: Clone and import

代码在GitHub中点击按钮就可以下载到本地,也可以使用URL下载到本地,还有GitHub的客户端进行管理。客户端的功能很全面,能实现克隆代码上传等功能。

3.2.2 Problem 3: Turtle graphics and drawSquare

这个方法考察的是基本的turtleforwardturn函数,实现起来很简单。向前走再转90度,每次转向都是一个方向即可。

3.2.3 Problem 5: Drawing polygons

  这个任务包含了几个方法

1 calculatePloygonSidesFromAngle

 给定内角度数要求计算出边数。

2 drawRegularPolygon

根据给定的长度和边数画出多边形,根据我们上面的函数我们可以很快的完成。

3 calculateRegularPolygonAngle

给定边数要求计算出来边数。

根据数学上的技巧可以解出答案。

3.2.4 Problem 6: Calculating Bearings

1 calculateHeadingToPoint

这个函数是计算给定两个向量之间的方向角,通过给定的点进行处理。

2 calculateHeadings

函数计算边构成的向量之间的夹角,得出转动的角度的大小,使用上一个函数计算出角度。

3.2.5 Problem 7: Convex Hulls

计算凸边,使用递归和分治的方法。

将这些点集分为两个部分。如果点的个数小于两个直接返回,否则根据递归法则将点分成小一点的集合。

3.2.6 Problem 8: Personal art

我画出了一个渐近线

3.2.7 Submitting

先用git clone URI 将在github上创建的库克隆到本地,然后将要上传的文件移到目录下。

然后使用命令

Git add -A

Git commit -m “lab1”

Git pull –rebase origin master

Git push origin master

就能将本地仓库同步到云端

3.3 Social Network

该任务是考验我们使用图的功夫,然后建立社交网,判断一个人的社交活动和影响力。

3.3.1 设计/实现FriendshipGraph类

       这个类是实现了主函数要求的功能。

主要要求的方法有:

adjGraph 是表明这是一个图,统计点的个数

addVertex添加一个人进入图中

addEdge将存在图中的两个人联系起来

getDistance获取两个联系人之间的距离

BFS广度搜索来获取距离

3.3.2 设计/实现Person类

Person方法将名字赋给类中的name

linkListAdd在SocialList中添加一个联系人

netWorkSize获取联系人的大小

edgeExist判断边是否存在

getSocial判断联系人的社会位置

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

public static void main(String[] args)

       {

              // TODO Auto-generated method stub

              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(graph.getDistance(rachel,ross));

           System.out.println(graph.getDistance(rachel,ben));

           System.out.println(graph.getDistance(rachel,rachel));

           System.out.println(graph.getDistance(rachel,kramer));

       }

3.3.4 设计/实现测试用例

测试用例涵盖了非法情况,就是考验我们代码的健壮性。

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(graph.getDistance(rachel,ross));

           System.out.println(graph.getDistance(rachel,ben));

           System.out.println(graph.getDistance(rachel,rachel));

           System.out.println(graph.getDistance(rachel,kramer));

我就用的是实验报告中的实验用例。

3.4 Tweet Tweet

3.4.1 Problem 1: Extracting data from tweets

获得发tweet的时间和发tweet的人

public static Timespan getTimespan(List<Tweet> tweets)

获取时间间隔

public static Set<String> getMentionedUsers(List<Tweet> tweets)

获取用户,通过截断字符串来实现。

3.4.2 Problem 2: Filtering lists of tweets

public static List<Tweet> writtenBy(List<Tweet> tweets, String username)

获取特定用户的tweet

public static List<Tweet> inTimespan(List<Tweet> tweets, Timespan timespan)

获取特定时间段发的tweet。

public static List<Tweet> containing(List<Tweet> tweets, List<String> words)

获取包含关键词的tweet

3.4.3 Problem 3: Inferring a social network

检索用户可能感兴趣的联系人和计算影响力

计算影响力时建立一个联系人和数字对应的哈希表,这样再找出最大的数字即可。这是一个很聪明的方法。

3.4.4 Problem 4: Get smarter

这个方法中我实现了查找互相关注的人的一个图。

public static Map<String, Set<String>> getSmarter(List<Tweet> tweets) {

           String name=null;

           String[] word=null;

           Map<String, Set<String>> MAP = guessFollowsGraph(tweets);

              Map<String, Set<String>> Map = new HashMap<>();

        for(Tweet onlyuser: tweets)

        {

               word=onlyuser.getText().split("[^0-9a-zA-Z-_@]");

               for(String hi:word)

               {

                      if(hi.startsWith("@")&&hi.length()>1)

                      {

                             name=hi.substring(1);

                             for(Tweet user: tweets)

                             {

                                    if(Map.containsKey(user.getAuthor()))

                                    {

                                           Map.get(user.getAuthor()).add(name);

                                    }

                                    else {

                                                 Set<String>  tt=new HashSet<>();

                                                 tt.add(name);

                                                 Map.put(user.getAuthor(),tt);

                                          }

                             }

                             }

                      }

    }

        for(String username:MAP.keySet())

        {

               Set<String> followers=new HashSet<String>();

               followers=MAP.get(username);

               for(String ttt:followers)

               {

               if(RTMap.containsKey(ttt))

               {

                      MAP.get(username).addAll(Map.get(ttt));

               }

        }

        }

        return MAP;

    }

4 实验进度记录

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

每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。

不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。

日期

时间段

任务

实际完成情况

2019.3.6

15:45-17:30

编写问题1的isLegalMagicSquare函数并进行测试

开始查找资料,开始写P1

2019.3.10

写P1

P1完成

2019.3.11

写P2

P1未完成

2019.3.13

写P2

P2完成

2019.3.14

写P3

P3未完成

2019.3.15

写P4

P3完成,P4未完成

2019.3.16

写P4

P4完成

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

遇到的难点

解决途径

不太会Java

通过看Java编程思想和看mooc完成

一些函数不太理解

通过百度来完成

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

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

这次的实验需要java而我是第一次接触,所以在完成上遇到了很大的困难。参考了很多的资料。仍然在完成上遇到了困难,但是我相信情况会越来越好。

开始不懂junit测试的时候,按照网上的方法一步一步来结果有一个初始化的问题,查遍全网发现是测试的函数不能带有static字样,修改后才正确,这让我意识到java有一套严格的权限控制体系。

6.2 针对以下方面的感受

因为以前也安装过类似的IDE,所以并不算困难。初次接触软件构造,希望能学到一些使用的软件编程技巧。

猜你喜欢

转载自www.cnblogs.com/yanzhao-x/p/11936452.html
今日推荐