003 課程設計報告 學號 姓名

2022-08-22 22:27:04 字數 3445 閱讀 3300

最短路徑

一目的 根據圖的基本概念,圖的儲存結構,複習圖的兩種儲存方法,生成最短路徑的兩種方法的應用:弗洛伊德演算法和狄克斯特拉演算法,此程式主要是應用弗洛伊德演算法。

二需求分析

本程式演示從乙個文字文中讀取資料,並且以鄰接矩陣的方式進行儲存,採用輸出路徑的方法判斷任意兩個分點之間是否互相連通,求到各個分店平均距離最短的分店的演算法主要應用的是弗洛伊德的演算法,以下是對於弗洛伊德的演算法的分析:

有向圖g=(v,e)採用鄰接矩陣cost儲存,另外外接乙個二維陣列a用於存放當前頂點之間的最短路徑長度,分量a[i][j]表示當前頂點vi到頂點vj的最短路徑長度。弗洛伊德演算法的基本思想是遞推產生乙個矩陣序列a0,a1,…,ak,…,an,其中ak[i][j]表示從頂點vi到頂點vj的路徑上所經過的頂點編號不大於k的最短路徑長度。

2、弗洛伊德演算法可用如下的表示式來描述:

a_1[i][j]=cost[i][j]

ak+1[i][j]=min(-1<=k<=n-2)

用二維陣列path儲存最短路徑,它與當前迭代的次數有關。求ak[i][j]時,path[i][j]存放從頂點vi到頂點vj的中間編號不大於k的最短路徑上的前一結點的編號。在演算法結束時,由二維陣列path的值追溯,可以得到從頂點vi到vj的最短路徑,若path[i][j]=-1,則沒有中間頂點。

3.計算平均距離最短的點

將求得的距離個頂點之間的距離以一維陣列的形式儲存起來,再將一維陣列轉化為二維陣列,則再次得到乙個矩陣,此矩陣的列項之和就是每個頂點到其他頂點之間的距離之和,求平均距離最小的點,那麼到各個點的距離的和也是最小的,即求平均距離最短的點可以轉為求到各個點之和最短的點。

三概要設計

1、程式包含2個模組:

(1)主函式模組:

main()

讓使用者控制,作圖的呼叫

詢問使用者是否繼續操作的提示;

(2)圖的函式單元模組——實現圖的建立,生成最小路徑,列印路徑,求得平均距離最短的點;

主函式呼叫圖的函式單元模組。

2.圖的函式單元模組的定義:

void file_open(mgraph g,int num,int n);

n是圖的頂點的個數,先從檔案中讀取n*n個資料(每個頂點到各個頂點的距離),num是從檔案傳入儲存資料的一維陣列,mgraph g是圖的定義,將num[n*n]以圖的鄰接矩陣的方式(二維陣列)傳入。

操作結果:先列印出從檔案讀取的資料的個數n*n,再列印出一維陣列儲存的形式,然後列印出以鄰接矩陣(二維陣列)儲存的形式。

void floyd(mgraph g,int num,int n);

採用弗洛伊德演算法求各個頂點之間的最短路徑,n是圖的頂點的個數。

操作結果:path儲存利用弗洛伊德演算法求得的各個頂點之間的距離。

void minpath(mgraph g,int num,int n);

n是圖的頂點的個數。

操作結果:得出各個點之間的距離和,求出平均距離最短的那個分店

void ppath(int path[maxv],int i,int j);

由path計算的路徑遞迴輸出路徑長度,i為輸出路徑的起點,j為輸出路徑的終點。

操作結果:輸出路徑長度,起點,中間點,終點

void dispath(int a[maxv],int path[maxv],int n);

由path計算最短路徑。

操作結果:計算最短路徑,呼叫輸出函式

void view();

選單函式

操作結果:列印選單

int user();

詢問使用者是否繼續?

操作結果;輸入y,繼續,輸入n,退出。

四詳細設計

#include<> 標頭檔案

#include<>

#define maxv 100 最大頂點數

#define inf 32767 設此值為極大,即無邊

實際定義的頂點數n

#define n 4

typedef struct

vertextype;

typedef int adjmatrix;

typedef struct 圖的定義

mgraph;

file *fp;檔案指標;

int a[maxv][maxv]賦值陣列,int path[maxv]計算最短路徑;

五除錯分析

1 、該程式的關鍵是弄清楚弗洛伊德演算法,並根據弗洛伊德演算法求得各個點之間的最短距離,在編寫各個函式的功能時,應該乙個乙個函式的編寫,保證演算法的正確性,這樣可以節省很多時間。

2、當程式出現與需求中要求的資料不符時,可以在適當的位置加上printf或者cout,特別是在for,while以及if等容易出現錯誤的地方,除了多加幾個容易區分的中括號時,在適當的位置加上printf或者cout更是利於我們找出錯誤的地方,便於程式的除錯。

3、這次實驗由於對檔案操作不是很熟悉,所以,檔案操作的函式是最後完成的,但是,為了驗證前幾個函式演算法的正確性,因此又在主函式中事先定義好了資料,導致了最後將幾個函式拼接的時候,在引數的傳遞過程中,經常出錯,耗費了許多不必要的時間與精力,因此,感覺還是循序漸進的好,這樣在是最好的策略。

4、檔案的讀入與輸出要熟練掌握,才能正確實現程式的功能,達到目的。

六測試結果

1、通過寫該程式複習了圖的鄰接矩陣,與鄰接表的儲存方法的區別於聯絡,並且熟悉了檔案的操作,更深的了解了一維陣列與二維陣列的聯絡。

2、在從檔案讀取資料的同時,以圖的鄰接矩陣的方式儲存了圖的資料,然後採用弗洛伊德演算法計算與輸出各個點到其他店的最短路徑。

3、利用弗洛伊德演算法計算各個點到其他店的距離之和,距離和最少的那個點就是平均距離最短的那個點。

4、退出程式。

七使用者使用說明

1、此程式在vc++和dev c++下都可以執行。

2、 程式執行後,自動執行了選單函式,有提示和結果提示。然後有語言提示使用者選擇要實現的功能,每次當使用者輸入選擇後,結果都會馬上出來,如果使用者輸入了非法字元,那麼就會提醒使用者重新輸入。以下為程式執行後的選單的畫面,通過選單方式,是使用者能更好的使用該程式。

八課程設計總結

因為時間匆忙雖然按照任務書完成了程式的基本功能,但是,在定義資料的範圍上並沒有實現人機對話的靈活性,這是這個程式的明顯不足,而且,在檔案的讀取上耗費太多不必要的時間與精力,而且,不是循序漸進的實現函式的功能,因此,在引數的傳遞上經常出錯,不是在矩陣的輸出都是0,要麼就是在輸出路徑時,漏掉了中間點,然後在最後一維陣列變成二維陣列,求二維陣列列項之和時,費了許多腦筋,總之是感覺是熬盡了心血,同時收穫也是很豐富滴!

在剛剛看到任務書的時候大腦裡對圖一點概念都沒有,就把圖的那章的所有內容全看了一遍,當時,腦子中思路很多,但是,經過對程式的編寫,除錯,及執行後,最後覺得函式的功能以我現在僅有的能力只能以這樣的方式實現。編寫**,為了符合使用者的要求,實現功能的方法很多,每個人的思路與風格也各有不同。我在網上參考了很多人的方法,發現每個人的程式都有它獨有的亮點,因此,可謂是取其精華了吧!

但是,絕對是在裡面並且吸收的同時加以應用的!希望自己的程式設計能力可以再有更多的提高!

學號 姓名 導引課程專案報告

成都東軟學院 專案導引課程 專案報告 目錄 1.影片概述 1.1影片描述頁 2.影片劇情的深入 2.1影片劇情頁 2.1影片拍攝計畫頁 3在影片中負責的工作描述 3.1影片中各部門介紹頁 3.2自己在該負責的主要工作描述頁 4.本片製作過程 4.1製作步驟頁 5.分析本片創作過程中的不足與改進意見 ...

2019課程設計

大連理工大學課程設計 大連理工大學本科課程設計題目 the subject of undergraduate graduation project thesis of dut 學院 系 專業學生姓名 學號指導教師 完成日期 大連理工大學 dalian university of technology...

01 課程設計

湖南工業大學 資料袋 冶金工程學院 系 部 20 11 20 12 學年第 1 學期 課程名稱冶金專業課程設計指導教師高澤平職稱教授 學生姓名陳琪專業班級冶金工程081 學號 08495200113 題目 80氧氣轉爐設計 成績起止日期 2011年11月28日 2011年12月 9日 目錄清單 湖南...