1. 程式人生 > >結對專案-Subway

結對專案-Subway

·專案地址

·PSP

PSP2.1 Personal Software Process Stage 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃
·Estimate ·估計這個任務需要多長時間 10 15
Development 開發
·Analysis ·需求分析(包括學習新技術) 60 120
·Design Spec ·生成設計文件 300 200
·Design Review ·設計複審(和同事稽核設計文件) 60 20
·Coding Standard ·程式碼規範(為目前的開發制定合適的規範) 60 60
·Design ·具體設計 120 120
·Coding ·具體編碼 1200 2400
·Code Review ·程式碼複審 200 30
·Test ·測試(自我測試,修改程式碼,提交修改) 300 100
Reporting 報告
·Test Report ·測試報告 60 30
·Size Measurement ·計算工作量 30 30
·Postmortem & Process Improvement Plan ·事後總結,並提出過程改進計劃 60 30
合計 2460 3155

·解題思路

  • 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號線
    這裡寫圖片描述
    符合預期
  • 站點顯示 郭公莊
    這裡寫圖片描述
    符合預期,不過畫的圈有點小且顏色較淡,不太明顯。