版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p><b> 課程設(shè)計(jì)報(bào)告</b></p><p><b> 班級: </b></p><p><b> 學(xué)號: </b></p><p><b> 姓名: </b>
2、</p><p><b> 指導(dǎo)老師: </b></p><p><b> 日期: </b></p><p> 7.全國交通咨詢模擬</p><p> 出于不同目的的旅客對交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的時間盡可能短,出門旅游的游客則期望旅費(fèi)盡可能省,而老年旅客則要求
3、中轉(zhuǎn)次數(shù)最少。編制一個全國城市間的交通咨詢程序,為旅客提供兩種或三種最優(yōu)決策的交通咨詢。要求:</p><p> ?。?)提供對城市信息進(jìn)行編輯(如添加或刪除)的功能。</p><p> (2)城市之間有兩種交通工具:火車和飛機(jī)。提供對列車時刻表和飛機(jī)航班進(jìn)行編輯(增設(shè)或刪除)的功能。</p><p> (3)提供兩種最優(yōu)決策:最快到達(dá)或最省錢到達(dá)。全程只考慮一
4、種交通工具。</p><p> ?。?)旅途中耗費(fèi)的總時間應(yīng)該包括中轉(zhuǎn)站的等候時間。</p><p> ?。?)咨詢以用戶和計(jì)算機(jī)的對話方式進(jìn)行。</p><p><b> 1.需求分析</b></p><p> 1、設(shè)計(jì)最短路徑的算法及其需要信息的存儲:本設(shè)計(jì)中最短路徑的算法利用迪杰斯特拉算法,存儲方法利用鄰接矩陣
5、存儲。</p><p> 2、 該程序所做的工作的是模擬全國交通咨詢,為旅客提供種最優(yōu)決策的交通咨詢。此程序規(guī)定:</p><p> 在程序中輸入城市名稱時,需輸入10個字母以內(nèi)的字母串;輸入列車或飛機(jī)編號時需輸入一個字符串類型;輸入列車或飛機(jī)的費(fèi)用時需輸入一個實(shí)型數(shù)據(jù);輸入列車或飛機(jī)開始時間和到達(dá)時間時均需輸入一個整型數(shù)據(jù),在選擇功能時,應(yīng)輸入與所選功能對應(yīng)的一個整型數(shù)據(jù)。</
6、p><p> 程序的輸出信息主要是:最快需要多少時間才能到達(dá),或最少需要多少旅費(fèi)才能到達(dá),說明在途中經(jīng)過的城市名稱;</p><p> 程序的功能包括:提供對城市信息的編輯,提供列車時刻表和飛機(jī)航班表的編輯,提供兩種最優(yōu)決策:最快到達(dá)、最省錢到達(dá)。</p><p><b> 設(shè)計(jì)</b></p><p><b&g
7、t; 2.1設(shè)計(jì)思想</b></p><p> 本系統(tǒng)整體上分為存儲系統(tǒng)和求最短路徑兩部分,存儲系統(tǒng)運(yùn)用到數(shù)組和結(jié)構(gòu)體。該系統(tǒng)分別存儲火車列次,航班,出發(fā)點(diǎn)與目的地以及所需要走的路程和所用費(fèi)用。最短路徑使用迪杰斯特拉算法編程求算得出最近或最便宜路徑。該算法主要分為三步:1、起始點(diǎn)(V0)與其相鄰點(diǎn)的權(quán)值(即當(dāng)前最短路徑)。2、求出當(dāng)前最短路徑中的最小值即是該起始點(diǎn)(V0)與另一點(diǎn)(Vi)的最短路徑
8、。3、V0到Vi的距離加上Vi到Vj的距離小于V0到Vj則將V0到Vi的距離加上Vi到Vj的距離記為V0到Vj當(dāng)前最短路徑,循環(huán)第二、三步。如此得到V0到各點(diǎn)的最短路徑,進(jìn)而可以得到想要的一條。</p><p><b> 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):</b></p><p> struct Tra//火車或飛機(jī)的存儲結(jié)構(gòu)</p><p> {
9、 </p><p> char cc[20]; //用"車次"的前兩個字母表示火車或飛機(jī)航班的代碼</p><p> char start[20]; //出發(fā)點(diǎn)</p><p> char destination[20]; //目的地</p><p> float
10、time; //路途時間</p><p> float price; //價(jià)錢</p><p><b> };</b></p><p><b> 算法設(shè)計(jì)</b></p><p> A,本設(shè)計(jì)采用的數(shù)據(jù)結(jié)構(gòu)有圖中的最短路徑。</p><p&g
11、t; (1)、開始-----</p><p> (2)、得到存儲最少花費(fèi)或最短時間信息的鄰接矩陣------</p><p> (3)、得到起始點(diǎn)與相鄰的點(diǎn)的權(quán)值(即當(dāng)前最短路徑)并記錄點(diǎn)-----</p><p> (4)、求出當(dāng)前最短路徑中的最小值即是該起始點(diǎn)(V0)與另一點(diǎn)(Vi)的最短路徑-----</p><p> (5)
12、、V0到Vi的距離加上Vi到Vj的距離小于V0到Vj則將V0到Vi的距離加上Vi到Vj的距離記為V0到Vj當(dāng)前最短路徑并且記錄前一個點(diǎn)。</p><p> (6)、重復(fù)(4),(5)步得到所有點(diǎn)最短路徑。</p><p> (7)、以終點(diǎn)開始逐步向前賦值得到所需路徑并輸出該路徑的權(quán)值。</p><p><b> 代碼:</b></p
13、><p> void short_path(struct Tra* timetable,char* start,char* dest,char city[][20],int tn,int cn,int choice)</p><p><b> { </b></p><p> int i,j,k,st,et;</p><p
14、> float min,t;</p><p> char pcity[10][20];</p><p> float edge[15][15],dist[15];</p><p> int path[15],s[15];</p><p> for(i=0;i<cn;i++)</p><p> f
15、or(j=0;j<cn;j++)</p><p><b> { </b></p><p> edge[i][j]=max;</p><p><b> } </b></p><p> for(i=0;i<tn;i++) {</p><p>
16、j=search(city,timetable[i].start,cn);</p><p> k=search(city,timetable[i].destination,cn);</p><p> if(choice==0)</p><p> { t=timetable[i].time;</p><p> if(t&
17、lt;edge[j][k]) edge[j][k]=t;</p><p><b> }</b></p><p><b> else </b></p><p> {t=timetable[i].price;</p><p> if(t<edge[j][k]) edge[j][k]=
18、t;</p><p><b> }</b></p><p><b> }</b></p><p> st=search(city,start,cn);</p><p> et=search(city,dest,cn);</p><p> for(i=0;i<c
19、n;i++){</p><p> dist[i]=edge[st][i];</p><p><b> s[i]=0;</b></p><p> if(i!=st&&dist[i]<max) path[i]=st;</p><p> else path[i]=-1;</p>&l
20、t;p><b> }</b></p><p> s[st]=1; dist[st]=0;</p><p> for(i=0;i<cn-1;i++){</p><p><b> min=max;</b></p><p><b> k=st;</b></
21、p><p> for(j=0;j<cn;j++)</p><p> if(!s[j]&&dist[j]<min)</p><p> {k=j;min=dist[j];}</p><p><b> s[k]=1;</b></p><p> for(j=0;j<
22、cn;j++)</p><p> if(!s[j]&&edge[k][j]<max&&dist[k]+edge[k][j]<dist[j]){</p><p> dist[j]=dist[k]+edge[k][j]; path[j]=k;</p><p><b> }</b></p>
23、<p><b> }</b></p><p><b> k=et;</b></p><p><b> i=0;</b></p><p> if(path[k]==-1){</p><p> printf("\t\t對不起,不存在從 %s 到 %
24、s 的路線\n\n",start,dest);</p><p><b> return;</b></p><p><b> }</b></p><p> while(path[k]!=-1)</p><p><b> {</b></p><
25、p> strcpy(pcity[i++],city[k]);</p><p> k=path[k];</p><p><b> }</b></p><p> strcpy(pcity[i++],city[st]);</p><p> printf("\t\t最佳路線為:\n\t\t")
26、;</p><p> for(j=i-1;j>=0;j--)</p><p> printf("%s ",pcity[j]);</p><p> printf("\n");</p><p> if(choice==0) printf("\t\t所需總時間為:%5.1f小時\n&
27、quot;,dist[et]);</p><p> else printf("\t\t所需的總費(fèi)用為:%7.2f元\n",dist[et]);</p><p> printf("\n");</p><p><b> }</b></p><p> B,界面以及主函數(shù)功能板塊&
28、lt;/p><p> 本設(shè)計(jì)采用的是在界面上通過輸入相應(yīng)的字符表示的要求來實(shí)現(xiàn)對于不同目的不同函數(shù)的調(diào)用,主要用到的數(shù)據(jù)結(jié)構(gòu)有圖中的交通網(wǎng)的各種信息的鄰接矩陣的存儲。通過顧客輸入不同的字符來實(shí)現(xiàn)不同的功能,主界面上注釋著這個程序的系統(tǒng)名稱,組員以及指導(dǎo)老師等基本學(xué)生信息,用星號來加以修飾;然后就是用一個swich語句來實(shí)現(xiàn)多功能的選取以及程序的退出;主要有一:1:修改地圖 2:編輯火車時刻表 \t3:編輯飛機(jī)
29、航班表 \t4:選擇出游路線 t5:退出;繼而通過選中其中的數(shù)字來實(shí)現(xiàn)自己的目的;然后再引用程序再用一個switch case語句來實(shí)現(xiàn)1 2 3選項(xiàng)中的添加刪除以及退出功能,然后在4中再用if語句來實(shí)現(xiàn)自己的需求考慮??梢噪S時退出程序。最后再經(jīng)調(diào)用函數(shù)再來輸出結(jié)果;</p><p><b> 代碼:</b></p><p> # include<std
30、io.h></p><p> #include<string.h></p><p> #include<float.h></p><p> const float max=FLT_MAX;</p><p> };void main ()</p><p><b> {
31、 </b></p><p> int i,j,k,m,n,cn=5,tn=6,fn=6;</p><p> printf("\t\t******************************************\n");</p><p> printf("\t\t************************
32、******************\n");</p><p><b> loop1:</b></p><p> printf("\t請選擇所需功能:\n\t\t1:修改地圖 \n\t\t2:編輯火車時刻表 \n\t\t3:編輯飛機(jī)航班表 \n\t\t4:選擇出游路線 \n\t\t5:退出");</p><
33、;p> switch(i) //switch語句</p><p><b> {</b></p><p> case 1:{ //第一種情況,修改地圖*****</p><p> while(j!=1&&j!=2&&j!=3)</p><p><b>
34、 {</b></p><p> case 2:{ //修改火車時間表</p><p> case 3:{//修改飛機(jī)航班表,和列車相似</p><p><b> case 4:{</b></p><p> printf("\t\t請選擇交通工具(1.火車 2.飛機(jī)):");<
35、;/p><p> scanf("%d",&j);</p><p> printf("\n");</p><p> if(j==1&&k==1)short_path(train,city[m-1],city[n-1],city,6,5,0);</p><p> if(j==1&
36、amp;&k==2) short_path(train,city[m-1],city[n-1],city,6,5,1);</p><p> if(j==2&&k==1) short_path(flight,city[m-1],city[n-1],city,6,5,0);</p><p> if(j==2&&k==2) short_path(fli
37、ght,city[m-1],city[n-1],city,6,5,1);</p><p> goto loop1;//回到主菜單</p><p> case5:return;//退出系統(tǒng)}</p><p><b> 2.2設(shè)計(jì)表示</b></p><p><b> 函數(shù)調(diào)用關(guān)系圖</b>&l
38、t;/p><p><b> Main()</b></p><p> short_path()</p><p><b> Search()</b></p><p><b> 各模塊調(diào)用關(guān)系</b></p><p><b> 主菜單</
39、b></p><p> 修改地圖 編輯火車時刻表 編輯飛機(jī)航班表 選擇出游路線 退出</p><p><b> 修改地圖</b></p><p> 增加城市 刪除城市 返回</p><p><b> 編輯火車時刻表</b></p&g
40、t;<p> 添加 刪除 返回</p><p><b> 編輯飛機(jī)航班表</b></p><p> 添加 刪除 返回 </p><p><b> 選擇出游路線</b></p><p> 飛機(jī)
41、 火車</p><p> 最短時間 最少花費(fèi) 最短時間 最少花費(fèi)</p><p><b> 2.3詳細(xì)設(shè)計(jì)</b></p><p> void main ()</p><p><b> { </b></p><p> int i
42、,j,k,m,n,cn=5,tn=6,fn=6;</p><p> printf("\t\t************************************************\n");</p><p> printf("\t\t******** 歡迎使用全國交通咨詢模擬 ********\n");</p>
43、<p> printf("\t\t******** 黃建釗 ********\n");</p><p> printf("\t\t******** 191113 ********\n");</p><p> printf("\t\
44、t******** 20111000611 ********\n");</p><p> printf("\t\t******** 計(jì)算機(jī)學(xué)院 ********\n");</p><p> printf("\t\t******** 指導(dǎo)老師:朱曉蓮
45、 ********\n");</p><p> printf("\t\t************************************************\n");</p><p> char city[15][20]={"深圳","成都","南昌","杭州"
46、;,"北京"};//現(xiàn)有城市,最多15個城市</p><p> struct Tra train[20]={</p><p> {"T1","杭州","深圳",10,190},</p><p> {"T2","北京","深圳&quo
47、t;,18,270},</p><p> {"T3","北京","南昌",13,150},</p><p> {"T4","北京","成都",25,300}, </p><p> {"T5","北京",
48、"杭州",14,160},</p><p> {"T6","南昌","杭州",11,200}</p><p><b> };</b></p><p> struct Tra flight[20]={</p><p> {"F
49、1","杭州","北京",3,1500},</p><p> {"F2","深圳","北京",2.5,1300},</p><p> {"F3","北京","成都",1,600},</p><p&g
50、t; {"F4","南昌","北京",3,1400},</p><p> {"F5","深圳","南昌",1,700},</p><p> {"F6","成都","杭州",3,1650}</p>
51、<p><b> };</b></p><p> printf("\t\t現(xiàn)有城市"); //輸出現(xiàn)有地圖上的城市,便于后面的輸入和修改</p><p> for(j=0;j<cn;j++)</p><p> printf("%d.%s\t",j+1,cit
52、y[j]);</p><p> printf("\n\n");</p><p><b> loop1:</b></p><p> printf("\t請選擇所需功能:\n\t\t1:修改地圖 \n\t\t2:編輯火車時刻表 \n\t\t3:編輯飛機(jī)航班表 \n\t\t4:選擇出游路線 \n\t\t5
53、:退出");</p><p> printf("\n\t請選擇:");</p><p> scanf("%d",&i);</p><p> while(i!=1&&i!=2&&i!=3&&i!=4&&i!=5)</p><
54、;p><b> {</b></p><p> printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&i);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> switch(i) /
55、/switch語句</p><p><b> {</b></p><p> case 1:{ //第一種情況,修改地圖</p><p><b> loop2:</b></p><p> printf("\t現(xiàn)有城市:\n\t\t");</p><p
56、> for(j=0;j<cn;j++)</p><p> printf("%d.%s\t",j+1,city[j]);</p><p> printf("\n\n");</p><p> printf("\t\t功能:\n\t\t 1:添加 2:刪除 3:返回\n");</p
57、><p> printf("\t\t請選擇:");</p><p> scanf("%d",&j);</p><p> while(j!=1&&j!=2&&j!=3)</p><p><b> {</b></p><p
58、> printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&j);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> printf("\n");</p><p><b> if(j==1
59、)</b></p><p><b> {</b></p><p> printf("\t請輸入城市名:");</p><p> scanf("%s",city[cn]);</p><p><b> cn++;</b></p>
60、<p> goto loop2;</p><p> } //if語句</p><p><b> if(j==2) </b></p><p> {printf("\t請選擇要刪除的城市的編號:");</p><p> scanf("%d",&k);&l
61、t;/p><p> while(k>cn||k<1)</p><p><b> {</b></p><p> printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&k);</p><p>
62、} //避免按錯而導(dǎo)致程序錯誤</p><p> if(k==cn) cn--;</p><p><b> else { </b></p><p> for(m=k-1;m<cn-1;m++) </p><p> strcpy(city[m],city[m+1]); //k后面的城市依次往前移一
63、位 </p><p> cn--; //城市總數(shù)減少一個</p><p><b> }</b></p><p> goto loop2; //查看修改后的地圖,便于判斷或是再次修改</p><p><b> }</b></p><p> else goto
64、loop1; //回到主菜單</p><p><b> }</b></p><p> case 2:{ //修改火車時間表</p><p><b> loop3:</b></p><p> printf("\n\t\t現(xiàn)有火車時刻表:\n");</p>&l
65、t;p> printf("\t\t 車次 起點(diǎn)站 終點(diǎn)站 路途時間(h) 票價(jià)(元)\n"); //輸出各火車時刻表</p><p> for(j=0;j<tn;j++)</p><p> printf("\t\t%d:%s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,train[j].cc,t
66、rain[j].start,train[j].destination,train[j].time,train[j].price);</p><p> printf("\n\n");</p><p> printf("\t功能:1.添加\t2.刪除\t3.返回\n");</p><p> printf("\t請選
67、擇:");</p><p> scanf("%d",&j);</p><p> while(j!=1&&j!=2&&j!=3)</p><p><b> {</b></p><p> printf("\t\t輸入有誤,請重新輸入:&q
68、uot;);</p><p> scanf("%d",&j);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> printf("\n");</p><p><b> if(j==1)</b></p><p><
69、b> {</b></p><p> printf("現(xiàn)有城市:\n");</p><p> for(k=0;k<cn;k++)</p><p> printf("%d.%s\t",k+1,city[k]);</p><p> printf("\n")
70、;</p><p> printf("請輸入數(shù)據(jù):\n");</p><p> printf("火車時刻表:\n");</p><p> printf("車次 起點(diǎn)站 終點(diǎn)站 路途時間(h)票價(jià)(元)\n");</p><p> scanf("%s %s %s
71、 %f %f",train[tn].cc,train[tn].start,train[tn].destination,&train[tn].time,&train[tn].price);</p><p> tn++; //火車車次加一</p><p> goto loop3; //回到loop3,查看修改后的列車信息</p><p&g
72、t;<b> }</b></p><p> else if(j==2)</p><p><b> {</b></p><p> printf("\t請選擇所需刪除車次編號:");</p><p> scanf("%d",&k);</p&
73、gt;<p> while(k>tn||k<1)</p><p><b> {</b></p><p> printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&k);</p><p> }
74、//避免按錯而導(dǎo)致程序錯誤</p><p> if(k==tn) tn--; //火車車次減一</p><p><b> else{</b></p><p> for(m=k-1;m<tn-1;m++) //k后面的列車依次往前移一位</p><p> train[m]=train[m+1];</
75、p><p><b> tn--; </b></p><p><b> }</b></p><p> goto loop3; //回到loop3,查看修改后的列車信息</p><p><b> }</b></p><p> else goto
76、loop1; //回到主菜單</p><p><b> }</b></p><p> case 3:{//修改飛機(jī)航班表,和列車相似</p><p><b> loop4:</b></p><p> printf("\t\t現(xiàn)有飛機(jī)航班表:\n");</p>
77、<p> printf("\t\t 班次 起點(diǎn) 終點(diǎn) 路途時間(h) 票價(jià)(元)\n");</p><p> for(j=0;j<fn;j++)</p><p> printf("\t\t%d: %s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,flight[j].cc,flight[j].s
78、tart,flight[j].destination,</p><p> flight[j].time,flight[j].price);</p><p> printf("\n\n");</p><p> printf("\t\t功能:1.添加\t2.刪除\t3.返回\n");</p><p>
79、 printf("\t\t請選擇:");</p><p> scanf("%d",&j);</p><p> while(j!=1&&j!=2&&j!=3)</p><p><b> {</b></p><p> printf(&q
80、uot;\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&j);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> printf("\n");</p><p><b> if(j==1){</b><
81、;/p><p> printf("現(xiàn)有城市:\n");</p><p> for(k=0;k<cn;k++)</p><p> printf("%d.%s\t",k+1,city[k]);</p><p> printf("\n");</p><p>
82、; printf("請輸入數(shù)據(jù):\n");</p><p> printf("車次\t起點(diǎn)站\t終點(diǎn)站\t路途時間(h)\t票價(jià)(元)\n");</p><p> scanf("%s%s%s%f%f",flight[fn].cc,flight[fn].start,flight[fn].destination,&fli
83、ght[fn].time,&flight[fn].price);</p><p><b> fn++;</b></p><p> goto loop4;</p><p><b> }</b></p><p> else if(j==2) </p><p>&l
84、t;b> {</b></p><p> printf("\t\t請選擇所要刪除的編號:");</p><p> scanf("%d",&k);</p><p> while(k>fn||k<1)</p><p><b> {</b>&
85、lt;/p><p> printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&k);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> if(k==fn) fn--;</p><p><b>
86、 else{</b></p><p> for(m=k-1;m<fn-1;m++)//k后面的航班依次往前移一位 </p><p> flight[m]=flight[m+1];</p><p><b> fn--;</b></p><p><b> }</b></p
87、><p> goto loop4;</p><p><b> }</b></p><p> else goto loop1;//回到主菜單</p><p><b> }</b></p><p><b> case 4:{</b></p>
88、<p> printf("\t\t請選擇交通工具(1.火車 2.飛機(jī)):");</p><p> scanf("%d",&j);</p><p> while(j!=1&&j!=2)</p><p><b> {</b></p><p>
89、; printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&j);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> printf("\t\t請選擇決策方案(1.最短時間 2.最少花費(fèi)):");</p><p
90、> scanf("%d",&k);</p><p> while(k!=1&&k!=2)</p><p> {printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&k);</p><p> }
91、 //避免按錯而導(dǎo)致程序錯誤</p><p> printf("\t現(xiàn)有城市:\n");</p><p> for(i=0;i<cn;i++)</p><p> printf("\t\t%d.%s\n",i+1,city[i]);</p><p> printf("\n&qu
92、ot;);</p><p> printf("\t\t出發(fā)地編號:");</p><p> scanf("%d",&m);</p><p> while(m>cn||m<1) //cn為現(xiàn)有城市數(shù)目</p><p><b> {</b></p>
93、;<p> printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf("%d",&m);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> printf("\t\t目的地編號:");</p><p>
94、scanf("%d",&n);</p><p> while(n>cn||n<1) //cn為現(xiàn)有城市數(shù)目</p><p><b> {</b></p><p> printf("\t\t輸入有誤,請重新輸入:");</p><p> scanf(&q
95、uot;%d",&n);</p><p> } //避免按錯而導(dǎo)致程序錯誤</p><p> printf("\n");</p><p> if(j==1&&k==1)short_path(train,city[m-1],city[n-1],city,6,5,0);</p><p&
96、gt; if(j==1&&k==2) short_path(train,city[m-1],city[n-1],city,6,5,1);</p><p> if(j==2&&k==1) short_path(flight,city[m-1],city[n-1],city,6,5,0);</p><p> if(j==2&&k==2) s
97、hort_path(flight,city[m-1],city[n-1],city,6,5,1);</p><p> goto loop1;//回到主菜單</p><p><b> }</b></p><p> case 5: return;//退出系統(tǒng)</p><p><b> }</b>
98、</p><p><b> }</b></p><p> void short_path(struct Tra* timetable,char* start,char* dest,char city[][20],int tn,int cn,int choice)//最優(yōu)路線</p><p> {//start表示出發(fā)地,dest表示目的地
99、,tn表示表示航班或車次的總次數(shù),cn表示城市的總數(shù)</p><p> //choice=0表示求最短時間路線,choice=1表示求最少花費(fèi)路線</p><p> int i,j,k,st,et;</p><p> float min,t;</p><p> char pcity[10][20];</p><p&
100、gt; float edge[15][15],dist[15];</p><p> int path[15],s[15];</p><p> for(i=0;i<cn;i++)</p><p> for(j=0;j<cn;j++)</p><p><b> { </b></p>&
101、lt;p> edge[i][j]=max;</p><p><b> } </b></p><p> for(i=0;i<tn;i++)/*dijkstra算法*/</p><p><b> {</b></p><p> j=search(city,timetable[i]
102、.start,cn);</p><p> k=search(city,timetable[i].destination,cn);</p><p> if(choice==0)</p><p><b> {/*最短時間*/</b></p><p> t=timetable[i].time;</p>&
103、lt;p> if(t<edge[j][k]) edge[j][k]=t;</p><p><b> }</b></p><p><b> else </b></p><p><b> {/*最少花費(fèi)*/</b></p><p> t=timetable[i
104、].price;</p><p> if(t<edge[j][k]) edge[j][k]=t;</p><p><b> }</b></p><p><b> }</b></p><p> st=search(city,start,cn);</p><p>
105、 et=search(city,dest,cn);</p><p> for(i=0;i<cn;i++){</p><p> dist[i]=edge[st][i];</p><p><b> s[i]=0;</b></p><p> if(i!=st&&dist[i]<max) pa
106、th[i]=st;</p><p> else path[i]=-1;</p><p><b> }</b></p><p> s[st]=1; dist[st]=0;</p><p> for(i=0;i<cn-1;i++){</p><p><b> min=max;
107、</b></p><p><b> k=st;</b></p><p> for(j=0;j<cn;j++)</p><p> if(!s[j]&&dist[j]<min)</p><p> {k=j;min=dist[j];}</p><p>&l
108、t;b> s[k]=1;</b></p><p> for(j=0;j<cn;j++)</p><p> if(!s[j]&&edge[k][j]<max&&dist[k]+edge[k][j]<dist[j]){</p><p> dist[j]=dist[k]+edge[k][j]; p
109、ath[j]=k;</p><p><b> }</b></p><p><b> }</b></p><p><b> k=et;</b></p><p><b> i=0;</b></p><p> if(path[k
110、]==-1){</p><p> printf("\t\t對不起,不存在從 %s 到 %s 的路線\n\n",start,dest);</p><p><b> return;</b></p><p><b> }</b></p><p> while(path[k]!=
111、-1)</p><p><b> {</b></p><p> strcpy(pcity[i++],city[k]);</p><p> k=path[k];</p><p><b> }</b></p><p> strcpy(pcity[i++],city[st
112、]);</p><p> printf("\t\t最佳路線為:\n\t\t");</p><p> for(j=i-1;j>=0;j--)</p><p> printf("%s ",pcity[j]);</p><p> printf("\n");</p>
113、;<p> if(choice==0) printf("\t\t所需總時間為:%5.1f小時\n",dist[et]);</p><p> else printf("\t\t所需的總費(fèi)用為:%7.2f元\n",dist[et]);</p><p> printf("\n");</p><p&
114、gt;<b> }</b></p><p><b> 調(diào)試分析</b></p><p> 通過本次課程設(shè)計(jì),我學(xué)到了一種程序設(shè)計(jì)方法,就是結(jié)構(gòu)化程序設(shè)計(jì)方法,在程序設(shè)計(jì)過程中,我嘗試按如下方法進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)(1)自頂向下(2)逐步細(xì)化(3)模塊化設(shè)計(jì)這種設(shè)計(jì)方法的過程是將問題求解由抽象逐步具體化的過程,而且,用這種方法便于驗(yàn)證算法的
115、正確性。</p><p><b> 用戶手冊</b></p><p> 用戶運(yùn)行程序后,會出現(xiàn)如下主界面:</p><p><b> 用戶開始模擬 :</b></p><p> 選擇1,用戶可以修改地圖,包括查看已有城市,增加和刪除城市及返回</p><p> B.
116、選擇2,用戶可以編輯火車時刻表,包括查看以有火車線路,增加和刪除火車線路及返回</p><p> C.選擇3,用戶可以編輯飛機(jī)航班表,包括查看以有飛機(jī)航班,增加和刪除飛機(jī)航班及返回</p><p> D.選擇4,用戶可以根據(jù)交通工具和決策方案選擇出游路線</p><p> E.選擇5,用戶可以退出程序</p><p><b>
117、 測試數(shù)據(jù)及測試結(jié)果</b></p><p> 正確輸入并開始模擬運(yùn)行:</p><p><b> 增加城市武漢</b></p><p> 增加火車線路:T7北京到武漢,11小時,150元</p><p> 增加飛機(jī)航班:F7 北京到武漢,2小時1000元</p><p>&
118、lt;b> 選擇出游路線:</b></p><p> 從北京到深圳坐火車最省錢模式</p><p> 從北京到深圳坐火車最少時間模式</p><p> 從深圳到北京坐飛機(jī)最省錢模式</p><p> 從深圳到北京坐飛機(jī)最少時間模式</p><p><b> 源程序清單</b
119、></p><p> # include<stdio.h></p><p> #include<string.h></p><p> #include<float.h></p><p> const float max=FLT_MAX;</p><p> struc
120、t Tra//火車或飛機(jī)的存儲結(jié)構(gòu)</p><p> { </p><p> char cc[20]; //用"車次"的前兩個字母表示火車或飛機(jī)航班的代碼</p><p> char start[20]; //出發(fā)點(diǎn)</p><p> char destin
121、ation[20]; //目的地</p><p> float time; //路途時間</p><p> float price; //價(jià)錢</p><p><b> };</b></p><p> int search(char citytable[][20],char* ci
122、ty,int cn) //在城市數(shù)中查找某個城市</p><p> { </p><p><b> int i;</b></p><p> for(i=0;i<cn;i++)</p><p><
123、b> {</b></p><p> if(strcmp(citytable[i],city)==0)</p><p><b> return i;</b></p><p><b> }</b></p><p> return -1;</p><p>
124、;<b> }</b></p><p> void short_path(struct Tra* timetable,char* start,char* dest,char city[][20],int tn,int cn,int choice)//最優(yōu)路線</p><p> {//start表示出發(fā)地,dest表示目的地,tn表示表示航班或車次的總次數(shù),cn表
125、示城市的總數(shù)</p><p> //choice=0表示求最短時間路線,choice=1表示求最少花費(fèi)路線</p><p> int i,j,k,st,et;</p><p> float min,t;</p><p> char pcity[10][20];</p><p> float edge[15][
126、15],dist[15];</p><p> int path[15],s[15];</p><p> for(i=0;i<cn;i++)</p><p> for(j=0;j<cn;j++)</p><p><b> { </b></p><p> edge[i][j]
127、=max;</p><p><b> } </b></p><p> for(i=0;i<tn;i++)/*dijkstra算法*/</p><p><b> {</b></p><p> j=search(city,timetable[i].start,cn);</p>
128、;<p> k=search(city,timetable[i].destination,cn);</p><p> if(choice==0)</p><p><b> {/*最短時間*/</b></p><p> t=timetable[i].time;</p><p> if(t<ed
129、ge[j][k]) edge[j][k]=t;</p><p><b> }</b></p><p><b> else </b></p><p><b> {/*最少花費(fèi)*/</b></p><p> t=timetable[i].price;</p>
130、<p> if(t<edge[j][k]) edge[j][k]=t;</p><p><b> }</b></p><p><b> }</b></p><p> st=search(city,start,cn);</p><p> et=search(city,dest
131、,cn);</p><p> for(i=0;i<cn;i++){</p><p> dist[i]=edge[st][i];</p><p><b> s[i]=0;</b></p><p> if(i!=st&&dist[i]<max) path[i]=st;</p>
132、<p> else path[i]=-1;</p><p><b> }</b></p><p> s[st]=1; dist[st]=0;</p><p> for(i=0;i<cn-1;i++){</p><p><b> min=max;</b></p>
133、<p><b> k=st;</b></p><p> for(j=0;j<cn;j++)</p><p> if(!s[j]&&dist[j]<min)</p><p> {k=j;min=dist[j];}</p><p><b> s[k]=1;<
134、/b></p><p> for(j=0;j<cn;j++)</p><p> if(!s[j]&&edge[k][j]<max&&dist[k]+edge[k][j]<dist[j]){</p><p> dist[j]=dist[k]+edge[k][j]; path[j]=k;</p>
135、<p><b> }</b></p><p><b> }</b></p><p><b> k=et;</b></p><p><b> i=0;</b></p><p> if(path[k]==-1){</p>&
136、lt;p> printf("\t\t對不起,不存在從 %s 到 %s 的路線\n\n",start,dest);</p><p><b> return;</b></p><p><b> }</b></p><p> while(path[k]!=-1)</p><p
137、><b> {</b></p><p> strcpy(pcity[i++],city[k]);</p><p> k=path[k];</p><p><b> }</b></p><p> strcpy(pcity[i++],city[st]);</p><p
138、> printf("\t\t最佳路線為:\n\t\t");</p><p> for(j=i-1;j>=0;j--)</p><p> printf("%s ",pcity[j]);</p><p> printf("\n");</p><p> if(cho
139、ice==0) printf("\t\t所需總時間為:%5.1f小時\n",dist[et]);</p><p> else printf("\t\t所需的總費(fèi)用為:%7.2f元\n",dist[et]);</p><p> printf("\n");</p><p><b> }</
140、b></p><p> void main ()</p><p><b> { </b></p><p> int i,j,k,m,n,cn=5,tn=6,fn=6;</p><p> printf("\t\t******************************************
141、******\n");</p><p> printf("\t\t******** 歡迎使用全國交通咨詢模擬 ********\n");</p><p> printf("\t\t******** 黃建釗 ********\n");</p><p>
142、printf("\t\t******** 191113 ********\n");</p><p> printf("\t\t******** 20111000611 ********\n");</p><p> printf("\t\t*******
143、* 計(jì)算機(jī)學(xué)院 ********\n");</p><p> printf("\t\t******** 指導(dǎo)老師:朱曉蓮 ********\n");</p><p> printf("\t\t********************************************
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-----全國交通咨詢系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---成績分析與全國交通咨詢模擬
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說明書(全國交通咨詢模擬系統(tǒng))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說明書(全國交通咨詢模擬系統(tǒng))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--電梯模擬
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)約瑟夫環(huán)模擬課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---銀行模擬系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(銀行模擬系統(tǒng))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--電梯模擬
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---校園交通導(dǎo)游系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
評論
0/150
提交評論