结对项目-Subway



·项目地址

github地址:Subway
结对伙伴博客:~InspAlgo~


·PSP

PSP2.1Personal Software Process Stage预估耗时(分钟)实际耗时(分钟)
Planning计划
·Estimate·估计这个任务需要多长时间1015
Development开发
·Analysis·需求分析(包括学习新技术)60120
·Design Spec·生成设计文档300200
·Design Review·设计复审(和同事审核设计文档)6020
·Coding Standard·代码规范(为目前的开发制定合适的规范)6060
·Design·具体设计120120
·Coding·具体编码12002400
·Code Review·代码复审20030
·Test·测试(自我测试,修改代码,提交修改)300100
Reporting报告
·Test Report·测试报告6030
·Size Measurement·计算工作量3030
·Postmortem & Process Improvement Plan·事后总结,并提出过程改进计划6030
合计24603155

·解题思路

  • Dijkstra算法
void Subway::Dijkstra()
{
    int book[STATION_NUM];  // book[]节点是否被访问
    int dis[STATION_NUM];  // dis[i]起始点到i的最短距离

    memset(book, 0, sizeof(book));  // 一开始每个点都没被访问
    for (int i = 0; i < STATION_NUM; i++)
    {
        dis[i] = this->station_link[this->start_station_][i].value;
        if (dis[i] < INF)  // start_station_到i有直接路径
        {
            this->station_path[i][0] = this->start_station_;  // start_station_到i最短路径经过的第一个顶点
            this->station_path[i][1] = i;  // start_station到i最短路径经过的第二个顶点
        }
    }

    /* 核心语句 */
    for (int i = 0; i < STATION_NUM - 1; i++)
    {
        int min = INF;  // 记录最小dis[i]
        int u;  // 记录小dis[i]的点
        for (int j = 0; j < STATION_NUM; j++)
        {
            if (book[j] == 0 && dis[j] < min)
            {
                min = dis[j];
                u = j;
            }
        }
        book[u] = 1;
        if (u == this->start_station_)
            continue;
        for (int v = 0; v < STATION_NUM; v++)
        {
            if (v == this->start_station_)
                continue;
            if (!book[v] && this->station_link[u][v].value < INF
                && dis[v] > dis[u] + this->station_link[u][v].value)
            {
                dis[v] = dis[u] + this->station_link[u][v].value;

                for (int i = 0; i < STATION_NUM; i++)
                {
                    this->station_path[v][i] = this->station_path[u][i];
                    if (this->station_path[v][i] == -1)
                    {
                        this->station_path[v][i] = v;
                        break;
                    }
                }

                /* 是否为换乘优化模式 */
                if (this->transfer_par)
                {
                    dis[u] = 0;
                    for (int i = 0; i < STATION_NUM; i++)
                    {
                        if (i != 0 && this->station_path[u][i - 1] > -1
                            && this->station_path[u][i + 1] > -1)
                        {
                            dis[u] += this->station_link[this->station_path[u][i]][this->station_path[u][i]].value;
                            if (this->station_link[this->station_path[u][i - 1]]
                                [this->station_path[u][i]].line_name
                                != this->station_link[this->station_path[u][i]]
                                [this->station_path[u][i + 1]].line_name)
                                dis[u] += this->transfer_par;
                        }
                    }
                    dis[v] = dis[u] + this->station_link[u][v].value;
                }
            }
        }
    }
}

·设计实现过程

  • Project_Subway_Console解决方案的函数关系图
    函数关系图
  • DLLCS解决方案的函数关系图
    函数关系图
  • CS_Project_Console解决方案的函数关系图
    函数关系图

·程序性能分析及改进

  • CS_Project_Console解决方案
    1. /a 模式性能分析 以郭公庄为例
      /a模式
    2. /b 模式性能分析 以巴沟到十里河为例
      /b模式
    3. /c 模式性能分析 以1号线为例
      /c模式
    4. /d 模式性能分析 以巴沟到十里河为例
      /d模式
    5. 站点显示性能分析 以郭公庄为例
      站点显示模式

·代码说明

  • 关键的调用动态依赖库的代码
/// <summary>
/// 控制台使用的DLL调用函数
/// </summary>
[DllImport("DLLCS.dll", EntryPoint = "ConsoleInterface")]
public static extern void InterFace();
  • 对站点和两站点之间的线路的绘制
/// <summary>
/// 绘制指定颜色粗细带箭头的线
/// </summary>
public static void DrawArrowLine(Graphics g, float x1, float y1, float x2, float y2, float width)
{
    Pen p = new Pen(DrawTool.line_brush_color, width);
    p.EndCap = LineCap.ArrowAnchor;  // 定义线尾的样式为箭头
    g.DrawLine(p, x1, y1, x2, y2);
}

/// <summary>
/// 绘制圆心(x,y),半径r,宽度为width的空心圆
/// </summary>
public static void DrawCircle(Graphics g, float x, float y, float r, float width)
{
    Pen p = new Pen(DrawTool.circle_brush_color, width);
    g.DrawEllipse(p, (int)(x - r), (int)(y - r), (int)(2 * r), (int)(2 * r));
}
/// <summary>
/// 地图复原,使用原地图覆盖
/// </summary>
public void ResetMap()
{
    Bitmap bitmap = new Bitmap(Resources.subway_map);
    Rectangle r = new Rectangle(0, 0,
        this.pictureBox_Map.Size.Width, this.pictureBox_Map.Size.Height);
    MainForm.graphics.DrawImage(bitmap, r);  // 使用原地图覆盖
}

·黑盒测试

·控制台测试

  • /b 良乡大学城北 魏公村
20
良乡大学城北
广阳城
篱笆房
长阳
稻田
大葆台
郭公庄 换乘9号线
丰台科技园
科怡路
丰台南路
丰台东大街
七里庄
六里桥 换乘10号线
莲花桥
公主坟 换乘1号线
军事博物馆 换乘9号线
白堆子
白石桥南
国家图书馆 换乘4号线/大兴线
魏公村
  • 结果:
20
良乡大学城北
广阳城
篱笆房
长阳
稻田
大葆台
郭公庄 换乘9号线
丰台科技园
科怡路
丰台南路
丰台东大街
七里庄
六里桥
六里桥东
北京西站
军事博物馆
白堆子
白石桥南
国家图书馆 换乘4号线/大兴线
魏公村

正解。

  • /d 良乡大学城北 可可西里
Error: 站名错误!

能够正确判别站点出错。

  • /b 魏公村 魏公村
    选取理由:当起点与终点相同。
    输出结果:
0.

判断出距离为0,说明为相同站。

  • /b 2号航站楼 3号航站楼
    选取理由:机场线为单行线。
    输出结果:
3
2号航站楼
三元桥
3号航站楼

符合实际情况,得到正确解。

·界面测试

  • /b 良乡大学城北 魏公村
    这里写图片描述
    符合预期。
  • /d 良乡大学城北 魏公村
    这里写图片描述
    符合预期。
  • /a 郭公庄
    这里写图片描述
    缺陷,很难看出遍历过程。
  • /b 良乡大学城北 可可西里
    这里写图片描述
    成功报错。
  • /b 魏公村 魏公村
    直接退出,这里应设计有提示。
  • /b 2号航站楼 3号航站楼
    这里写图片描述
    符合预期。
  • /c 10号线
    这里写图片描述
    符合预期
  • 站点显示 郭公庄
    这里写图片描述
    符合预期,不过画的圈有点小且颜色较淡,不太明显。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值