HIT 软件构造2019春 Lab1 实验报告

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hahalidaxin/article/details/88065547

update:修改convexHull,如果两个点同时处于一条直线则选择距离“初始点”最远的那个

update:增加Person重名判断

    1. Magic Squares
  1. 问题理解:本问题要求实现判断一个nxn矩阵是否是一个幻方,并且理解一个针对n为奇数的幻方的生成算法。主要考察点:Java基本语法,文件读写,判断输入的合法性。

      1. isLegalMagicSquare()
  2. 实现思路:

  3. 使用java输入流读入按行读入文件
  4. 对于每行尝试使用\t进行分割,对于分割之后的每一项,如果不能使用Integer.valueOf成功转化(发生Exception),这有两种可能原因,一种是该矩阵不满足使用\t分隔,一种是该项包含非数字。

  5. 将第一行的数字个数作为基准数目n,在读入的过程中判断该矩阵是否是nxn的矩阵。
  6. 如何判断得到的nxn矩阵是否是一个幻方?使用三次for循环分别检查行、列、对角线数字的和是否相等。
      1. generateMagicSquare()
  7. 按步骤给出你的设计和实现思路/过程/结果。

    思路:使用罗伯法构造一个n为奇数的nxn幻方。罗伯法的算法为

     

    把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:

     

    (1)每一个数放在前一个数的右上一格;

    (2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;

    (3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;

    (4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;

    (5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

    1. Turtle Graphics
  8. 在这里简要概述你对该任务的理解。

    任务理解:该任务要根据代码注释提示补全代码从而实现一个完整的绘制工具Trurtle Graphics。主要考点:计算几何基础知识,正多边形的内角外角,java函数调用绘制多边形,计算向量之间的夹角,计算凸包,使用Junit进行单元测试。

      1. Problem 1: Clone and import
  9. 从github获取代码:网页download

    从本地创建git仓库:1.git init初始化本地仓库 2.git add remote origin 添加远程库源 3.在远程仓库创建master分支 4.git pull origin master将远程仓库同步到本地 5.git add->git commit->git push 将本地文件加入本地仓库,将本地仓库同步到远程仓库。

    此时git仓库本地与远程可以同步。

      1. Problem 3: Turtle graphics and drawSquare
  10. 问题思路:

  11. forward (steps) 首先根据当前坐标和朝向计算走steps步之后的坐标,根据起始点生成线段类lineSeg,根据朝向以及lineSeg构造Action添加到ActionList中等待执行。
  12. turn(degrees) 更改当前朝向,向ActionList中添加turn的Action。
  13. drawSquare,调用drawRegularPolygon(turtle,4,sideLength)
      1. Problem 5: Drawing polygons
  14. 问题思路:

  15. calculateRegularPolygonAngle 计算正多边形的内角,(边数-2)/sides。
  16. drawRegularPolygon :调用calculateRegularPolygonAnglesides计算正多边形的内角为rotation,调用turtle.forward和turtle.turn进行前进和转向。
  17.  

      1. Problem 6: Calculating Bearings
  18. 问题思路:

  19. calculateBearingToPoint :计算(当前点,当前朝向)构成的向量与(当前点,目标点)构成的向量之间的夹角,首先计算(当前点,目标点)构成的向量与y轴之间的tan,使用Math.atan2计算与y轴夹角,与当前朝向夹角(与y轴之间)作差计算两向量之间的夹角,需要注意负角变正角。
  20. calculateBearings:对列表中的每两个相邻节点调用calculateBearingToPoint计算夹角,列表保存。
  21.  

    3.2.5 Problem 7: Convex Hulls

           问题思路:使用gift-wrapping算法实现convexHull

  22. 问题思路:使用gift-wrapping算法实现convexHull

  23. 首先根据坐标选出最左下角的点作为点B。添加一个点A,A位于B点稍下的位置。将(A,B)作为向量Vec1。
  24. 扫描所有的不处于凸包中的点,计算A点与该点之间的夹角,夹角通过两向量点击与向量的模计算cos然后通过acos函数获得,找到形成夹角最小的点,如果有多个选择距离当前直线距离最远的那个点(其实可以选择距离前一个点最远的点)。将点B作为新的A,点C作为新的B,再次循环。
  25. 当新找到的节点是最左边的初始节点时结束循环。
  26.       

      1. Problem 8: Personal art
  27. 使用下面代码实现drawPersonalArt:

    turtle.color(PenColor.PINK);
    
    for(int i = 0; i < 15; i++){ // i < 15 to limit size of shapes
    
            drawRegularPolygon(turtle, i, i*10);
    
            drawRegularPolygon(turtle, i*10, i);
    
    }
      1. Submitting
  28. Git push提交代码

    1. Social Network
  29. 在这里简要概述你对该任务的理解。

    实现Person和FriendshipGraph两个类,模拟社交网络,提供添加节点(人),节点之间添加边(社交关系),通过BFS计算两节点之间最短路的功能。主要考点:java类的实现,java基本数据结构,BFS求最短路。

      1. 设计/实现FriendshipGraph类
  30. 设计思路:

  31. 存储结构:使用List<Person> persons存储所有节点。Map<String,Integer> namePool 用于记录所有的用户名字,从而提示重名错误。
  32. addVertex:添加节点,向persons List中添加一个person对象
  33. addEdge:调用pa的addNeighbor方法添加一条由pa指向pb的有向边。
  34. getDistance:特殊判断stPerson是否与edPerson相等,相等则返回0。使用Queue与Map实现BFS求最短路。Map用来存放距离源点的最短路同时作为当前点是否已经访问过的标志。
      1. 设计/实现Person类
  35. 设计思路:

  36. 存储结构:String nameString存放当前Person的名字,List<Person> neighborList存放当前节点为起始点的所有出边的另一端的Person。
  37. addNeighbor:向neighborList添加新的Person。
  38. getName():获得Person的name的getter
  39. getNeighList():获得Person的相邻节点列表的getter
  40. Person重名判断(使用静态Set)
      1. 设计/实现客户端代码main()
  41. 没有main函数。

      1. 设计/实现测试用例
  42. 测试思路:

  43. 测试单边联通的特殊情况
  44. 测试重名的情况
    1. Tweet Tweet
  45.  

      1. Problem 1: Extracting data from tweets
  46. 实现思路:

  47. getTimespan:如果tweets为空则将当前时间作为始末时间点构造Timespan,否则调用getEarliestTime和getLatestTime分别获得所有tweets中的最早发表时间和最晚发表时间构造Timespan。时间比较调用Time.isBefore和Time.isAfter函数。
  48. getMentionedUsers:对于每条tweet,使用正则表达式匹配满足username-metion条件的字符串,正则表达式匹配字符串为"@([\\w,-]+)",这样匹配到的项满足的条件是后面不包含username合法字符,为了保证前面也满足这一条件,还需要对于匹配项的前一个字符进行特殊判断。
  49. getMetionedHashTags:自实现函数,同样利用正则表达式匹配一条tweet中的所有hash tag,正则表达式字符串为:"#([\\w,-]+)"
      1. Problem 2: Filtering lists of tweets
  50. 实现思路:

  51. writtenBy:for循环检查所有tweet,比较author和username在lowercase下是否相同。
  52. inTimespan:利用Time.isBefore和Time.isAfter进行比较。
  53. containing:首先spec中对于word的定义为被空格字符包围或者处于string的结束,由定义出发这里不考虑实例中有标点符号位于word尾部的情况。对于一条text,直接调用String.split(“ ”)进行分割,然后检查word的lowercase是否存在于lowercase的words之中。
  54.  

      1. Problem 3: Inferring a social network
  55. 实现思路:

  56. guessFollowGraph:第一种证据思路是如果一名author在tweet中@过其他人,那么该author就会follow这些被@的人。扫描每条tweet,调用Extract.getMentionedUsers提取出该条tweet中所有被@到的人,将这些人加入到Map[author]->Set<Stirng>中。
  57. influencers:按照社交网络的影响力(follow数目)对所有user进行排名。首先根据followsGraph统计每个人的follow数目,InfluenceList存放所有username String,Map<String,Integer> influencers存放每个人对应的follow数目,然后调用Array.sort对influnceList进行排序,重写comparator为:
  58.  

    new Comparator<Object>() {
    
           public int compare(Object o1,Object o2) {
    
                 int fl1=influencers.get((String)o1);
    
                 int fl2=influencers.get((String)o2);
    
                 if(fl1>fl2) {
    
                    return -1;
    
                 } else if(fl1<fl2) {
    
                    return 1;
    
                 }
    
                 return 0;
    
         }
    
    }

     

     

      1. Problem 4: Get smarter
  59. 实现思路

  60. guessFollowGraph:第二种证据思路是如果两个人有很多共有的hash tag或者共享有一个热度很低的hash tag那么任务两个人会互相影响即互相follow。首先调用Extract.getMetionedHashTags(tweets)提取出每个人发表过的hash tag,然后统计每个hash tag的出现此处作为其热度。对每两人求其hash tag的交集,如果共享tag超过SHARETAGS_THRESHOLD或者共享有一个热度低于UNINFULENCETAG_THRESHOLD则认为两者互相影响。

                                                              我是迷人的小尾巴


以下外链,利益相关:

济南江鹏工贸有限公司山东济南机械加工),济南彤昌机械科技有限公司山东济南机械加工

猜你喜欢

转载自blog.csdn.net/hahalidaxin/article/details/88065547
今日推荐