?? quanguojiaotong.txt.txt
字號:
一、設(shè)計內(nèi)容與設(shè)計要求
1.設(shè)計內(nèi)容:
出于不同目的的旅客對交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的時間盡可能短,出門旅游的游客則期望旅費盡可能省,而老年旅客則要求中轉(zhuǎn)次數(shù)最少。編制一個全國城市間的交通咨詢程序,為旅客提供兩種或三種最優(yōu)決策的交通咨詢。系統(tǒng)可實現(xiàn)城市信息的管理以及兩種交通工具火車和飛機信息的管理,并提供最少中轉(zhuǎn)次數(shù)、最少時間和最少路費的交通路線咨詢。
設(shè)計思路:首先用一種存儲結(jié)構(gòu)表示旅途工具、出發(fā)點、終點、旅途時間和價格。對于要求選擇中轉(zhuǎn)次數(shù)最少的路徑,可對圖進行廣度搜索得到。對于尋找最少時間和最少路費的路徑,實際上就是圖最短路徑問題??刹捎肈ijkstra算法。
2.設(shè)計要求:
課程設(shè)計報告正文內(nèi)容
需求分析:課題的主要功能;
總體設(shè)計:課題的功能模塊的劃分(要求畫出模塊圖);
程序流程圖:主要功能的實現(xiàn)(至少要有一個主要模塊的流程圖);
程序調(diào)試及體會;
參考書目;
附錄(所有程序的原代碼,要求對程序?qū)懗霰匾淖⑨專?
書寫格式
a.要求用A4紙打印成冊
b.正文格式:一級標題用3號黑體,二級標題用四號宋體加粗,正文用小四號宋體;行距為22。
c.正文的內(nèi)容:正文總字數(shù)要求在5000字以上(不含程序原代碼)。
d.封面格式如下頁。
考核方式
指導老師負責驗收程序的運行結(jié)果,并結(jié)合學生的工作態(tài)度、實際動手能力、創(chuàng)新精神和設(shè)計報告等進行綜合考評,并按優(yōu)秀、良好、中等、及格和不及格五個等級給出每位同學的課程設(shè)計成績。具體考核標準包含以下幾個部分:
a.平時出勤 (占10%)
b.系統(tǒng)需求分析、功能設(shè)計、數(shù)據(jù)結(jié)構(gòu)設(shè)計及程序總體結(jié)構(gòu)合理與否(占10%)
c.程序能否完整、準確地運行,個人能否獨立、熟練地調(diào)試程序(占40%)
d.設(shè)計報告(占30%)
注意:不得抄襲他人的報告(或給他人抄襲),一旦發(fā)現(xiàn),成績?yōu)榱惴帧? e.獨立完成情況(占10%)。
課程驗收要求
a.運行所設(shè)計的系統(tǒng)。
b.回答有關(guān)問題。
c.提交課程設(shè)計報告。
d.提交軟盤(源程序、設(shè)計報告文檔)。
e.依內(nèi)容的創(chuàng)新程度,完善程序情況及對程序講解情況打分。
二、進度安排
班級: 信息科學0501、0502、0503
主講教師:郭鵬
輔導教師:周鐵山、曹燚
時間安排:
第 18 周
星期一 分析問題,給出數(shù)學模型,選擇數(shù)據(jù)結(jié)構(gòu)
星期二 設(shè)計算法,給出算法描述
星期三~星期五 編輯、編譯、調(diào)試源程序
星期六 撰寫課程設(shè)計報告
目 錄
需求分析············································· 1
總體設(shè)計(功能模塊圖)·································3
程序流程圖··········································· 4
程序調(diào)試············································· 7
體會················································· 8
源程序清單············································9
參考書目·············································24
評分表················································25
需求分析
一)題目分析:
1.通過對題目的分析知,是要讓我們能夠通過利用所學的數(shù)據(jù)結(jié)構(gòu)的基本知識和技能來解決程序設(shè)計問,因此在搞程序設(shè)計之前先好好的把書復習一遍,弄清楚各個知識之間的聯(lián)系。
2.由題目的分析知全國交通咨詢管理系統(tǒng)是有對城市信息的增加、刪除、修改、保存、查詢、有錯時提示出錯信息等功能,最后對數(shù)據(jù)進行保存并退出操作系統(tǒng)。由此可知需要將函數(shù)模塊化,將它做為一個獨立的函數(shù)體去實現(xiàn)它的功能。它可以分為四大功能模塊,每個模塊需要去各個擊破。其中可能用到C語言的指針與鏈表,因此,要先去復習一下C語言課本。
3.根據(jù)這些功能和基本要求,可充分運用我們所學的數(shù)據(jù)結(jié)構(gòu)的基本知識和技能去逐步的解決。其中將函數(shù)進行模塊化。在數(shù)據(jù)結(jié)構(gòu)中,通過隊列,棧,圖的聲明來實現(xiàn)系統(tǒng)的各種功能的存儲各城市之間乘火車的消耗價格,時間,乘飛機的價格,時間,以及中轉(zhuǎn)站最少。利用指針和結(jié)點來實現(xiàn)城市與城市之間各種操作,而這些知識點都是我們學習數(shù)據(jù)結(jié)構(gòu)必須掌握和學會運用的。
4.完成程序功能的設(shè)置后,應(yīng)對程序進行調(diào)試,以便在調(diào)試中能及時地找出錯誤并加以更正,這樣能使程序功能進一步的完善和正確。這就要求我們在編程和調(diào)試過程中養(yǎng)成認真分析和善于發(fā)現(xiàn)問題并及時解決的習慣,不懂的及時問老師或者其他同學。
二)實現(xiàn)方法:
1.圖的實現(xiàn)和聲明
(1)根據(jù)題目要求,聲明了一個圖形的數(shù)據(jù)結(jié)構(gòu)用來存儲任意幾個城市之間的各種信息,其中是把它們的TTime; TPrice; FTime; FPrice;的各種信息用鄰接矩陣存儲起來的。同時運用構(gòu)造函數(shù),利用特定的值來構(gòu)造對象。
(2)struct City圖的結(jié)構(gòu),CreateCity建立鄰接圖,AddCity增加,DelCity刪除,EditCity修改,ShortestPath最小路徑,ShortestPath_DIJ求源點v0到各點的最短路徑 1火車時間最小,2火車金錢最小,3飛機時間最小,4飛機金錢最小,來實現(xiàn)的。
2.程序功能的實現(xiàn)
(1)全國交通咨詢信息錄入和增加的實現(xiàn)
主要是對城市基本信息的輸入,包括(乘火車的價格,乘火車的時間,乘飛機的價格,乘飛機的時間,中轉(zhuǎn)站次數(shù)最少)在程序中只要用AddCity (輸入函數(shù))和ShortestPath(C);來實現(xiàn)。
(2)全國交通咨詢信息顯示的實現(xiàn)
主要為用戶ShortestPath(C);函數(shù)顯示城市之間的基本信息,包括上面錄入的信息和增加的內(nèi)容。
(3)全國交通咨詢信息載入文件的實現(xiàn)
在程序中用LoadCity(C);break()函數(shù)來載入文件。
(4)全國交通咨詢信息刪除的實現(xiàn)
在程序中用DelCity(C)函數(shù)來實現(xiàn)對有錯的信息進行刪除。
(5)全國交通咨詢信息修改的實現(xiàn)
在程序中用EditCity(C)(修改函數(shù))來實現(xiàn),而且可通過按編號或城市名來修改,當找不到要修改的內(nèi)容時提示用戶可能輸入有誤,重新在輸一遍。
(6)全國交通咨詢信息的重來
CreateCity(C);break重來,實現(xiàn)對錯誤的從新輸入。
(7)全國交通咨詢信息的保存
在程序中用SaveCity(C)保存函數(shù)來實現(xiàn),并提示用戶數(shù)據(jù)已保存。
(8)全國交通咨詢信息的增加
ShowCityDat(C);break, case 2:AddCity(C);break 增加
功能模塊圖
該課題可以分為如下幾個模塊:控制選擇功能項的main函數(shù)、建立鄰接圖的CreateCity(City *C)函數(shù)、增加城市的AddCity(City *C)函數(shù)、刪除城市的DelCity(City *C)函數(shù)、修改資料的EditCity(City *C)函數(shù)、求最小路徑的ShortestPath(City *C)函數(shù)、求其他最值的ShortestPath_DIJ(City *C,int v0,int k)函數(shù)、載入文件資料的LoadCity(City *C)函數(shù)、保存資料的SaveCity(City *C)函數(shù)、顯示城市之間關(guān)系數(shù)據(jù)的ShowCityName(City *C,int k)函數(shù)。
功能模塊圖如下:
程序流程圖
輸入int m;
輸入1()輸入城市
輸入2()輸入飛機
輸入3()輸入火車
輸入4()刪除飛機
輸入5()刪除火車
輸入6()顯示飛機
輸入7()顯示火車
輸入8()變換飛機
輸入9()保存數(shù)據(jù)
輸入10()顯示城市
輸入11()顯示最短時間
輸入12()更換飛機
輸入13()錄入數(shù)據(jù)
e!=0
是
否
結(jié)束
2)add_city添加函數(shù)流程圖:
c_num++
輸入city[c_num]
結(jié)束
3)delete_train刪除函數(shù)流程圖:
聲明int j
for(j=i;j<=t_num;j++)
train[i+1]=>train[i];
t_num--
結(jié)束
4)show_train顯示函數(shù)流程圖:
聲明int i
輸出id-start-end-time、price
for(i=0;i<t_num+1;i++)
輸出train[i].id-train[i].start-
-train[i].end-train[i].time train[i].price);
結(jié)束
程序調(diào)試
心得體會
一周課程設(shè)計很快就結(jié)束了,回顧自己所做的課程設(shè)計真是困難重重有喜亦有憂。從接觸計算機語言開始我雖然很喜歡這門課程但是我并沒有真正的做過稍微大點課題的課程設(shè)計,大多數(shù)做的是一些寫算法的題目僅此而已。因此,我在專業(yè)里所選的方向也就是計算科學中的算法設(shè)計。這一次課程設(shè)計讓我意識到我的知識是很零亂,多么的不連貫不系統(tǒng)化,我自感到在C語言以及數(shù)據(jù)結(jié)構(gòu)方面的知識是那么的不扎實。同時也讓我意識到學習計算機語言是沒有什么捷徑可走的,靠的是平時的多練習,多上機操作才可能有好的效果。
在拿到這個題目的時候我仔細的分析了一番,覺得自己只能寫一寫匡架性的東西出來而根本不知道如何去實現(xiàn)每一個函數(shù)。會用一點隊列的知識(比如通過隊列的先進先出的特點來存儲各種乘火車方式和乘飛機方式的時間,價格,中轉(zhuǎn)站最少的最優(yōu)值),也會根據(jù)要求在模塊定義所需要的函數(shù),但是不知道如何去實現(xiàn),可能是由于C語言中的函數(shù)、指針及鏈表沒學到多少。所以,現(xiàn)在知道要用什么但是就是用不出。我從別人的作品中看出了我的不足,也感慨自己平時寫的太少了。我真的需要多多的練習。哪怕是一天寫一個也行。
在答辨的時候老師問我二個問題,一個是程序演示后通過SaveCity(C)來保存,老師要我把具體位置找出來,這個還容易找的。第二個問題是我定義的靜態(tài)隊列給來干什么用的,我回答到是給來存儲各個城市之間交通來往的最優(yōu)值包括最便宜價格,最短時間,中轉(zhuǎn)站最少。只能是看完別人的程序才恍然大悟,哦,原來是這樣實現(xiàn)這個函數(shù)的啊。我還在一邊自責我就怎么沒想到呢。當然那里面也有我自己的成分,就是那排名函數(shù)用的是冒泡排序法。還有類的基本框架也是。我想這樣的機會是不多的,以后我一定要自己寫,不會就看書或是問老師。要靠自己的努力去完成自己的任務(wù),才不愧為一個學生。
這次數(shù)據(jù)結(jié)構(gòu)設(shè)計給我的感想與啟示。在整個程序的結(jié)構(gòu)上的把握是一個很難的問題,在剛開始拿到課題的時候?qū)φ麄€的程序具體應(yīng)該怎樣去劃分結(jié)構(gòu),以及怎樣去抽象各個對象的屬性等方面都感覺有點生疏,四大模塊分別實現(xiàn)各種功能,真的在這么短的時間內(nèi)很難去完成實現(xiàn)的。所以我感到在平時的練習中我們應(yīng)該多做一些例如:如何去具體的抽象出一個客觀事物的屬性,以及該事物所須完成的具體功能等等的操作練習。通過這次課程設(shè)計我發(fā)現(xiàn)了自己所存在的問題,不是課本知識沒掌握好而是用的太少以至用不出來的結(jié)局。下學期還有數(shù)據(jù)庫要學,我想也一定有課程設(shè)計,所以,在這個暑假我計劃從圖書館先借書來看。到時在家里沒事的時候就寫一寫數(shù)據(jù)庫方面的程序。以后學習的路還很長,希望通過這次課程設(shè)計能夠給我?guī)淼乃伎加兄谖乙院蟮膶W習。
源程序清單
//交通管理系統(tǒng)
//Powered by YJ
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define true 1
#define false 0
#define INFINITY 2000
#define MAX_VERTEX_NUM 30
int change = 0;
typedef int Status;
typedef int ElemType;
typedef struct QNode{ //隊列結(jié)構(gòu):節(jié)點存儲結(jié)構(gòu)
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{ // 隊列
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q){// 初始化隊列
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front) return ERROR;
Q->front->next = NULL;
return OK;
}
Status EnQueue(LinkQueue *Q,ElemType e){// 入隊
QueuePtr p = NULL;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p) return ERROR;
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return OK;
}
Status DeQueue(LinkQueue *Q,ElemType *e){ // 出隊
QueuePtr p = NULL;
if(Q->front == Q->rear) return ERROR;
p = Q->front->next;
e = p->data;
Q->front->next = p->next;
if(Q->rear == p) Q->rear = Q->front; // 注意當出隊后為空隊的情況
free(p);
return OK;
}
Status EmptyQueue(LinkQueue *Q){// 判斷是否為空隊列
return Q->front == Q->rear?true:false;
}
Status CopyQueue(LinkQueue *Q1,LinkQueue *Q2){// 復制隊列(copy Q1 to Q2)
int e;
QueuePtr p;
while(!EmptyQueue(Q2)) DeQueue(Q2,e); // clean Q2
p = Q1->front->next;// copy one by one
while(p){
e = p->data;
p = p->next;
EnQueue(Q2,e);
}
return OK;
}
typedef struct AdJ{// 圖的結(jié)構(gòu):鄰接矩陣
int TTime;
int TPrice;
int FTime;
int FPrice;
}ADJ;
typedef struct City{// 圖的結(jié)構(gòu)
char name[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//城市名稱
ADJ arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//鄰接矩陣
int CityNum;//城市數(shù)
}City;
Status CreateCity(City *C){// 建立鄰接圖
int i,j;
printf("please input city num:");
scanf("%d",&C->CityNum);
for(i = 0;i < C->CityNum; i++){
printf("input NO.%d city name: ",i+1);
scanf("%s",&C->name[i]);
}
for(i = 0; i < C->CityNum; i++)
for(j = 0; j < C->CityNum; j++){
C->arcs[i][j].TTime = INFINITY;
C->arcs[i][j].TPrice = INFINITY;
C->arcs[i][j].FTime = INFINITY;
C->arcs[i][j].FPrice = INFINITY;
}
for(i = 0; i < C->CityNum; i++)
for(j = i+1;j < C->CityNum; j++){
printf("input TTime,TPrice,FTime,FPrice[%s -> %s]: ",C->name[i],C->name[j]);
scanf("%d%d%d%d",&C->arcs[i][j].TTime,&C->arcs[i][j].TPrice,&C->arcs[i][j].FTime,&C->arcs[i][j].FPrice);
if(C->arcs[i][j].TTime == 0){
C->arcs[i][j].TTime = INFINITY;
C->arcs[i][j].TPrice = INFINITY;
C->arcs[i][j].FTime = INFINITY;
C->arcs[i][j].FPrice = INFINITY;
}
C->arcs[j][i] = C->arcs[i][j];
}
return ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -