結對專案-Subway
阿新 • • 發佈:2018-12-22
·專案地址
·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解決方案
- /a 模式效能分析 以郭公莊為例
- /b 模式效能分析 以巴溝到十里河為例
- /c 模式效能分析 以1號線為例
- /d 模式效能分析 以巴溝到十里河為例
- 站點顯示效能分析 以郭公莊為例
- /a 模式效能分析 以郭公莊為例
·程式碼說明
- 關鍵的呼叫動態依賴庫的程式碼
/// <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號線
符合預期 - 站點顯示 郭公莊
符合預期,不過畫的圈有點小且顏色較淡,不太明顯。