2020软件工程作业05

软件工程作业05

软件工程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10458
作业目标 结对编程完成家族树的实现
作业正文 见下文
参考文献 知乎 百度 CSDN
PSP表格
=======
PSP Personal Software Process Stages
-------- :-----:
pianing 计划
Estimate 估计这个任务需要多少时间
Development 开发
Analysis 需求分析 (包括学习新技术)
Design Spec 生成设计文档
Design Review 设计复审
Coding Standard 代码规范 (为目前的开发制定合适的规范)
Design 具体设计
Coding 具体编码
Code Review 代码复审
Test 测试(自我测试,修改代码,提交修改)
Reporting 报告
Test Repor 测试报告
Size Measurement 计算工作量
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划
calculer 合计

Github 项目地址:https://github.com/lbs20177711/storehouse/blob/master/20177711

结对成员
李文博 20177673
刘博殊 20177711

解题思路描述与设计实现说明
需求分析
读完题目,经过认真的分析,NABCD模型,我们将整个需求分成三个模块

处理输入数据模块
TreeGraph模块
个人信息展示模块
算法关键
主要在于处理输入数据,首先空行分割数据,数据按组来处理,每一组在通过关键字检测提取分割,最后维护出图的邻接表。然后通过dfs递归遍历图,将数据格式修改为指定要求的构建树图数据格式,传入对应的类,渲染出关系树。

  handleData() {
  let text = document.getElementById("data");
  var data = text.value; //从输入框获取数据
  var lis = data.split("\n");  //先按空行分割成多组数据
  let rk = new Map();  //用于比较排名,记录某人的最高学历
  (rk["导师"] = 0),
    (rk["博士生"] = 1),
    (rk["硕士生"] = 2),
    (rk["本科生"] = 3);
  var ID = 0;
  let str = ["博士生", "硕士生", "本科生"]; //关键字检测
  var _this = this;
  for (var i = 0; i < lis.length; ) {
    var j;
    for (j = i + 1; j < lis.length; ++j) {
      if (lis[j] == "") break;
    }    
    // [i,j)为一组数据
    let th = lis[i].substring(3);

    _this.edge[th] = [];
    _this.info[th] = "导师";
    //使用map,map的第一维是字符串,对应人名,第二维对应一个数组,对应他连接的人
    for (var k = i + 1; k < j; ++k) {
      var cur, idx;
      for (var value of str) {
        idx = lis[k].indexOf(value);
        if (idx != -1) {
          cur = lis[k].substring(0, idx + 3);
          _this.edge[th].push(lis[k].substring(0, idx + 3) + th);
          _this.edge[cur + th] = [];
          _this.info[cur + th] = value;
          _this.used[cur + th] = 1;
           //used用于标记某个点是否有父节点
            //info用于处理每个人的最高学历
          break;
        }
      }
      var stu = lis[k].substring(idx + 4).split("、");
      for (var value of stu) {
          //更新最高学历
        if (_this.info[value] == null || rk[_this.info[value]] > rk[cur])
          _this.info[value] = cur;
         //通过、分割,进行连边
        _this.edge[cur + th].push(value);
        _this.used[value] = 1;
      }
    }
    i = j + 1;
  }
	
  for (var key in _this.info) {
    	//可能存在多个树,我们之前将有父节点的点used都标记了,
      //因此used没被标记过的点则一定是根节点,从根节点出发,递归遍历图,处理数据格式
      if (_this.used[key] == null) {
      _this.data.push(_this.formatData(key, -1));
    }
  }
  this.$router.push({
    path: "/user/relation",
    query: {
      data: JSON.stringify(_this.data)
    }
  });
},
formatData(rt, fa) {
   //每个点的信息包括id,name,lv(学历),以及他的儿子节点,其他就是普通的dfs。
  let now = {};
  now.name = rt;
  now.id = this.ID;
  this.ID += 1;
  now.lv = this.info[rt];
  now.children = [];
  let arr = this.edge[rt];
  if (arr == null) return now;
  for (var i = 0; i < arr.length; ++i) {
    now.children.push(this.formatData(arr[i], rt));
  }
  if (rt.indexOf(fa) != -1) {
    let tmp = rt.substring(0, rt.indexOf(fa));
    now.name = tmp;
  }
  return now;
}

成果展示

显示个人信息,以及以他为根的关系树。

Github的代码签入记录

遇到的代码模块异常或结对困难及解决方法
问题描述
树图的位置和button一直不对,以及组件的样式问题。

做过哪些尝试
查找博客,去社区和qq群提问。

是否解决?
已经解决。

收获
提升了解决问题的能力,对框架的使用和一些坑点有了更深的理解。

评价你的队友
值得学习的地方
能够制作出精美的流程图,还能够使用测试工具,遇到困难总是很积极的去寻找解决的办法,

需要改进的地方
还需要提高沟通能力,寻找更合适的问题解决办法

posted @ 2020-04-17 19:36  刘博殊  阅读(139)  评论(0编辑  收藏  举报