版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計論文</b></p><p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</b></p><p><b> 目 錄</b></p><p> 第1章 航空訂票系統(tǒng)- 1 -</p><p> 1.1 課程設(shè)計目的- 1 -</p>
2、<p> 1.2航空訂票問題- 2 -</p><p> 1.3概要設(shè)計- 2 -</p><p> 1.4詳細(xì)設(shè)計及運(yùn)行結(jié)果- 4 -</p><p> 1.5調(diào)試情況,設(shè)計技巧及體會- 12 -</p><p> 第2章 八皇后問題- 13 -</p><p> 2.1 面對的
3、問題- 13 -</p><p> 2.2需求分析- 13 -</p><p> 2.2.1 涉及到的知識- 13 -</p><p> 2.2.2軟硬件的需求- 13 -</p><p> 2.2.3 功能需求- 14 -</p><p> 2.4 詳細(xì)設(shè)計和實(shí)現(xiàn)- 14 -</p>
4、<p> 2.4.1 算法描述- 14 -</p><p> 2.4.2 算法流程圖- 15 -</p><p> 2.5 程序調(diào)試- 16 -</p><p> 2.6運(yùn)行與測試- 17 -</p><p> 總 結(jié)- 18 -</p><p> 參考文獻(xiàn)- 19 -&l
5、t;/p><p> 附錄:源代碼- 20 -</p><p> 第1章 航空訂票系統(tǒng)</p><p> 1.1 課程設(shè)計目的</p><p> 1. 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計是綜合運(yùn)用數(shù)據(jù)結(jié)構(gòu)課程中學(xué)到的幾種典型數(shù)據(jù)結(jié)構(gòu),以及程序設(shè)計語言(C語言),自行實(shí)現(xiàn)一個較為完整的應(yīng)用系統(tǒng)的設(shè)計與開發(fā)</p><p> 2.
6、 通過課程設(shè)計,自己通過系統(tǒng)分析、系統(tǒng)設(shè)計、編程調(diào)試,寫實(shí)驗報告等環(huán)節(jié),進(jìn)一步掌握應(yīng)用系統(tǒng)設(shè)計的方法和步驟,靈活運(yùn)用并深刻理解典型數(shù)據(jù)結(jié)構(gòu)在軟件開發(fā)中的應(yīng)用 。</p><p> 3. 學(xué)會將知識應(yīng)用于實(shí)際的方法,提高分析和解決問題的能力,增加綜合能力。</p><p><b> 航空空訂票系統(tǒng):</b></p><p> ?。?)熟練掌
7、握鏈表存儲結(jié)構(gòu)及其建立過程和常用操作;</p><p> ?。?)熟練掌握隊列的建立過程和常用操作;</p><p> ?。?)學(xué)會自己調(diào)試程序的方法并掌握一定的技巧。</p><p><b> 1.2航空訂票問題</b></p><p> 航空客運(yùn)訂票的業(yè)務(wù)活動包括:查詢航線、客票預(yù)訂和辦理退票等。設(shè)計一個航空客運(yùn)
8、訂票系統(tǒng),以使上述業(yè)務(wù)可以借助計算機(jī)來完成。</p><p> 1. 每條航線所涉及的信息有:終點(diǎn)站名、航班號、飛機(jī)號、飛行日(星期幾)、乘員定額、余票量、已訂票的客戶名單(包括姓名、訂票量、艙位等級1,2或3)以及等候替補(bǔ)的客戶名單(包括姓名、所需票量); </p><p> 2. 全部數(shù)據(jù)可以只放在內(nèi)存中; </p><p> 3. 系統(tǒng)能實(shí)現(xiàn)的操
9、作和功能如下: </p><p><b> 1.查詢航線 </b></p><p> 根據(jù)旅客提出的終點(diǎn)站名輸出下列信息:航班號、飛機(jī)號、星期幾飛行,最近一天航班的日期和余票額; </p><p> 2.承辦訂票業(yè)務(wù) </p><p> 根據(jù)客戶提出的要求(航班號、訂票數(shù)額)查詢該航班票額情況,若尚有
10、余票,則為客戶辦理訂票手續(xù), </p><p> 輸出座位號;若已滿員或余票額少于定票額,則需重新詢問客戶要求。若需要,可登記排隊候補(bǔ); </p><p><b> 3. 退票業(yè)務(wù) </b></p><p> 根據(jù)客戶提供的情況(日期、航班),為客戶辦理退票手續(xù),然后查詢該航班是否有人排隊候補(bǔ),首先詢問排在第一的客戶,若所退票額能
11、滿足他的要求,則為他辦理訂票手續(xù),否則依次詢問其他排隊候補(bǔ)的客戶。 </p><p><b> 1.3概要設(shè)計</b></p><p> 1.系統(tǒng)結(jié)構(gòu)圖(功能模塊圖)</p><p> 圖1-1系統(tǒng)結(jié)構(gòu)圖(功能模塊圖)</p><p><b> 2.功能模塊說明</b></p>
12、;<p> ?。?)顯示已初始化的全部航線信息</p><p> ?。?)瀏覽已訂票客戶信息</p><p> ?。?)根據(jù)客戶提出的終點(diǎn)站名,調(diào)用find()函數(shù)尋找航線信息,調(diào)用list()函數(shù)輸出航線信息</p><p> ?。?)辦理訂票業(yè)務(wù):根據(jù)客戶提供的航班號進(jìn)行查詢航線信息,若客戶訂票額超過乘員定票總額,退出,若客戶訂票額末超過余票量,訂
13、票成功并登記信息,在訂票乘員名單域中添加客戶信息;如果暫時沒有票,詢問客戶是否要排隊等侯,如果是,則在等候隊列增加該客戶的訂票信息。</p><p> (5)辦理退票業(yè)務(wù):調(diào)用查詢函數(shù),根據(jù)客戶提供的航線進(jìn)行搜索根據(jù)客戶提供的姓名到訂票客戶名單域進(jìn)行查詢。退票成功后,重新將航線名單域指向訂票單鏈表的頭指針。根據(jù)隊列中從出的客戶信息判斷是否滿足要求,如果滿足,則將該客戶的信息插入到乘客信息鏈表中。</p&g
14、t;<p><b> ?。?)退出本系統(tǒng)</b></p><p> 1.4算法的主要思路</p><p> 1.首先對界面的設(shè)計,可以對操作的人員來說簡單上手。對系統(tǒng)的應(yīng)用都能進(jìn)行相應(yīng)的操作。</p><p> ?。?)設(shè)置管理員的功能。</p><p> ?。?)設(shè)置客戶的功能</p>
15、<p> ?。?)管理員的主要操作界面</p><p> ?。?)客戶的主要操作界面</p><p><b> ?。?)結(jié)束</b></p><p> 2.類dingpiao用來顯示客戶訂票的事件;</p><p><b> 基本思路如下:</b></p><p&g
16、t; ?。?) 客戶提交自己的詳細(xì)信息。</p><p> ?。?) 管理員處理相應(yīng)的內(nèi)容并給票給客戶。</p><p><b> ?。?) 訂票結(jié)束</b></p><p> 3.類tuipiao將處客戶的退票的信息,釋放存儲空間,基本思路如下:</p><p> ?。?) 客戶提交自己的詳細(xì)信息。</p>
17、;<p> (2) 管理員把客戶的票取出,</p><p> 1.4詳細(xì)設(shè)計及運(yùn)行結(jié)果</p><p> ?。?)顯示已初始化的全部航線信息</p><p> 圖1-2已初始化的全部航線信息</p><p> ?。?)瀏覽已訂票客戶信息</p><p> 圖1-3瀏覽已訂票客戶信息</p&
18、gt;<p><b> ?。?)查詢航線</b></p><p><b> 圖1-4查詢航線</b></p><p><b> (4)辦理訂票業(yè)務(wù)</b></p><p> 圖1-5辦理訂票業(yè)務(wù)</p><p><b> ?。?)辦理退票業(yè)務(wù)<
19、;/b></p><p> 圖1-6辦理退票業(yè)務(wù)</p><p> ?。?)排序:sort_tkt()</p><p><b> 程序運(yùn)行實(shí)例如下:</b></p><p><b> 1 主界面的進(jìn)入</b></p><p> 圖1-6主界面的進(jìn)入</p&
20、gt;<p> 2 管理員的相應(yīng)功能</p><p> 圖1-7管理員的相應(yīng)功能</p><p><b> 3 用戶的相應(yīng)功能</b></p><p> 1-8圖用戶的相應(yīng)功能</p><p> 4 管理員錄入訂票信息</p><p> 圖1-9管理員錄入訂票信息<
21、/p><p><b> 5 用戶訂票跟退票</b></p><p> 圖1-10用戶訂票跟退票</p><p> 1.5調(diào)試情況,設(shè)計技巧及體會</p><p><b> 1.總體過程</b></p><p> 編譯和調(diào)試工具:選擇Visual C++6.0,該工具穩(wěn)定
22、,其中有一個強(qiáng)大的調(diào)試工具,但我不是熟悉。還需要進(jìn)一步的練習(xí)。</p><p> 2.在一周半的時間里,不斷地對程序及各模塊進(jìn)行修改、編譯、調(diào)試、運(yùn)行,其間遇到很多問題:</p><p> ?。?)因本人能力有限,在編寫的時候只使用了相對較為簡單的基礎(chǔ)語言 ,代替了相對較為復(fù)雜的語言,降低了運(yùn)行效率。</p><p> ?。?)程序在起初設(shè)計的時候,經(jīng)常出現(xiàn)溢出錯
23、誤,而且不只一處。為了修正這些溢出錯誤,耗費(fèi)了大量的時間,修正解釋之后再看源程序,才發(fā)現(xiàn)原來只是因為開始的函數(shù)定義的數(shù)據(jù)類型出現(xiàn)了問題,對函數(shù)的定義不清楚,字符的不正確定義造成了后期大量的糾錯工作, </p><p> (3)由于忘記了一些c語言的規(guī)范使得在調(diào)試過程中一些錯誤沒有發(fā)現(xiàn)。例如,調(diào)用函數(shù)時,數(shù)組只需要傳遞數(shù)組名即可;字符‘0’和整形的0是不同的文明不可以直接對其畫等號。</p><
24、;p> ?。?)測試用例具有一定的廣泛性。運(yùn)行程序時輸入了多種不同字符信息,經(jīng)過多次修改結(jié)果達(dá)到了預(yù)期效果。說明程序具有一定的可靠性和穩(wěn)定性。</p><p> 3.通過調(diào)試我自己認(rèn)為,在哈夫曼編碼譯碼系統(tǒng)中用出棧入棧進(jìn)行哈夫曼譯碼編碼譯碼要簡單于使用數(shù)組,而使用結(jié)構(gòu)體數(shù)組來存儲待編譯的字符,編碼譯碼時通過結(jié)構(gòu)體數(shù)組來實(shí)現(xiàn)要優(yōu)于使用鏈表。</p><p><b> 4.
25、調(diào)試體會</b></p><p> 經(jīng)過這次實(shí)習(xí),我對調(diào)試掌握的更加熟練了,改變了過去只調(diào)試不知道如何對照程序語言修改程序的壞習(xí)慣,對調(diào)試也有了新的認(rèn)識,意識到了程序語言的規(guī)范性以及我們在編程時要有嚴(yán)謹(jǐn)?shù)膽B(tài)度,同時在寫程序時如果加一定量的注釋,既增加了程序的可讀性,也可以使自己在讀程序時更容易。 </p><p> 第2章 八皇后問題</p><p&
26、gt; 2.1 面對的問題 </p><p> 八皇后問題要求在一個8*8的棋盤上放上8個皇后,使得每一個皇后既攻擊不到另外七個皇后,也不被另外七個皇后所攻擊.按照國際象棋的規(guī)則,一個皇后可以攻擊與之處在同一行或同一列或同一斜線上的其他任何棋子.因此,八皇后問題等于要求八個皇后中的任意兩個不能被放在同一行或同一列或同一斜線上。 </p><p> 而本課程設(shè)計本人的目的也是通過用c+
27、+語言平臺將一個8*8的棋盤上放上8個皇后,使得每一個皇后既攻擊不到另外七個皇后,也不被另外七個皇后所攻擊的92種結(jié)構(gòu)予以實(shí)現(xiàn).使用遞歸方法最終將其問題變得一目了然,更加易懂。</p><p> 關(guān)鍵詞: 八皇后 ; c++ ; 遞歸法 </p><p> 1.解決沖突問題: </p><p> 這個問題包括了行,列,兩條對角線; </p>
28、;<p> 列:規(guī)定每一列放一個皇后,不會造成列上的沖突; </p><p> 行:當(dāng)?shù)贗行被某個皇后占領(lǐng)后,則同一行上的所有空格都不能再放皇后,要把以I為下標(biāo)的標(biāo)記置為被占領(lǐng)狀態(tài);</p><p> 2. 使用數(shù)據(jù)結(jié)構(gòu)的知識,用遞歸法解決問題。</p><p><b> 2.2需求分析</b></p>&l
29、t;p> 2.2.1 涉及到的知識</p><p> 本次課程設(shè)計中,用到的主要知識有:遞歸法的運(yùn)用,for語句的靈活運(yùn)用,數(shù)據(jù)結(jié)構(gòu)中樹知識的靈活運(yùn)用、棧及數(shù)組的掌握。</p><p> 2.2.2軟硬件的需求</p><p> 1.系統(tǒng)要求:win98以上操作系統(tǒng); </p><p> 2.語言平臺:tc++或vc++6.0
30、;</p><p> 2.2.3 功能需求</p><p> 當(dāng)運(yùn)行程序時,在屏幕上顯示每一種方法八個皇后的相對位置,要用比較直觀 的界面顯示。2.3概要設(shè)計</p><p> 本課件學(xué)生是用循環(huán)遞歸循環(huán)來實(shí)現(xiàn)的,分別一一測試了每一種擺法,并把它擁有的92種變化表現(xiàn)出來。在這個程序中,我的主要思路以及思想是這樣的: </p><p>
31、 1.解決沖突問題: </p><p> 這個問題包括了行,列,兩條對角線; </p><p> 列:規(guī)定每一列放一個皇后,不會造成列上的沖突; </p><p> 行:當(dāng)?shù)贗行被某個皇后占領(lǐng)后,則同一行上的所有空格都不能再放皇后,要把以I為下標(biāo)的標(biāo)記置為被占領(lǐng)狀態(tài); </p><p> 對角線:對角線有兩個方向。在這我把這兩條對角線
32、稱為:主對角線和從對角線。在同一對角線上的所有點(diǎn)(設(shè)下標(biāo)為(i,j)),要么(i+j)是常數(shù),要么(i-j)是常數(shù)。因此,當(dāng)?shù)贗個皇后占領(lǐng)了第J列后,要同時把以(i+j)、(i-j)為下標(biāo)的標(biāo)記置為被占領(lǐng)狀態(tài)。 </p><p> 2.?dāng)?shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn) </p><p> 而對于數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),學(xué)生則是著重于: </p><p> 數(shù)組a[I]:a [I]表示第
33、I個皇后放置的列;I的范圍:1..8; </p><p> 對角線數(shù)組:b[j](主對角線),c[j](從對角線),根據(jù)程序的運(yùn)行,去決定主從對角線是否放入皇后。</p><p> 2.4 詳細(xì)設(shè)計和實(shí)現(xiàn)</p><p> 2.4.1 算法描述</p><p><b> 1. 數(shù)據(jù)初始化。</b></p&g
34、t;<p> 2. 從n列開始擺放第n個皇后(因為這樣便可以符合每一豎列一個皇后的要求),先測試當(dāng)前位置(n,m)是否等于0(未被占領(lǐng))。如果是,擺放第n個皇后,并宣布占領(lǐng)(記得姚橫列豎列斜列一起設(shè)置),接著進(jìn)行遞歸;如果不是,測試下一個位置(n,m+1),但是如果當(dāng)n<=8,m=8時,發(fā)現(xiàn)此時已無法擺放時,便要進(jìn)行回溯。從問題的某一種可能出發(fā),搜索從這種情況能出發(fā),繼續(xù)搜索,這種不斷“回溯”的尋找解的方法,稱為“
35、回溯法”。</p><p> 3.使用數(shù)組實(shí)現(xiàn)回溯法的思想。</p><p> 4.當(dāng)n>8時,便打印出結(jié)果。</p><p> 5.輸出函數(shù)我使用printf輸出,運(yùn)行形式為:第m種方法為:* * * * * * * * </p><p> 2.4.2 算法流程圖</p><p><b>
36、圖2-1初始化</b></p><p><b> 圖2-2結(jié)果</b></p><p><b> 2.5 程序調(diào)試</b></p><p> 調(diào)試過程、步驟及遇到的問題</p><p> 在完整程序調(diào)試時遇到幾個小問題,后經(jīng)細(xì)心改正后才把調(diào)試工作做完。</p>&l
37、t;p> 例如:當(dāng)用printf輸出時,出現(xiàn)了一些錯誤,幾經(jīng)調(diào)試后,發(fā)現(xiàn)原來是缺少了stdio.h這樣一個頭文件,添加了頭文件后, 還出現(xiàn)了一些問題,邏輯錯誤導(dǎo)致程序死循環(huán)或不循環(huán)或循環(huán)一小部分,但是編譯時卻沒有錯誤,就是沒有正確的輸出答案,一開始我也不知道是怎么回事,通過和同學(xué)的交流,發(fā)現(xiàn)是邏輯錯誤,經(jīng)過改正后,程序終于可以運(yùn)行了.</p><p><b> 2.6運(yùn)行與測試</b&g
38、t;</p><p><b> 運(yùn)行演示</b></p><p><b> 圖2-3運(yùn)行結(jié)果1</b></p><p> 圖2-4 運(yùn)行結(jié)果2</p><p><b> 總 結(jié)</b></p><p> 通過了19周這個星期的程序設(shè)計,
39、我從中得到了許多的經(jīng)驗以及軟件設(shè)計的一些新的思路;從這2個問題設(shè)計以及分析中,本人從中理解到了數(shù)據(jù)結(jié)構(gòu)對于計算機(jī)軟件設(shè)計的重要性,它的使用,可以改變一個軟件的運(yùn)行周期,也可以將軟件的思路從繁化簡,并且都能夠通過數(shù)據(jù)結(jié)構(gòu)的相關(guān)引導(dǎo),將本身以前編程思想進(jìn)行擴(kuò)充,發(fā)展;這也是在這次課程設(shè)計中我所掌握得到的。 </p><p> 但由于我的基本知識還不是那么扎實(shí),也缺乏對軟件設(shè)計的經(jīng)驗,在這過程中也出現(xiàn)了一些問題,如,
40、八皇后在變成初期由于沒真正體會到數(shù)據(jù)結(jié)構(gòu)中“樹”在里面的運(yùn)用,將程序往大一時c語言的方向發(fā)展,不自覺的采用了非遞歸的算法,結(jié)果大大增加了程序的復(fù)雜程度。并且也讓整個程序的時間復(fù)雜度變得更大;在后來學(xué)生對數(shù)據(jù)結(jié)構(gòu)的第六章進(jìn)行了比較深入的研讀,才發(fā)現(xiàn)了數(shù)據(jù)結(jié)構(gòu)樹的實(shí)際運(yùn)用的空間是相當(dāng)?shù)拇?,并且,通過了重溫樹的回溯,以及二叉樹的遍歷,最終將程序進(jìn)行了一次較大的改造。并且通過思考,再將以前的數(shù)組知識加以運(yùn)用才最終解決了這個問題,整個程序的算法的
41、可看性也有了相當(dāng)?shù)母倪M(jìn)。 </p><p> 課程設(shè)計隨著時間的推移,也即將結(jié)束了,但這個學(xué)期數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)還是具有相當(dāng)大的意義,它從一個程度上改變了我們的編程思想,如何將一個程序快速而又準(zhǔn)備的進(jìn)行編寫,進(jìn)行編譯,都成為了我們思考的重點(diǎn),也通過這一個學(xué)期的學(xué)習(xí),我們將數(shù)據(jù)結(jié)構(gòu)的思想帶入到了我們以后的編程學(xué)習(xí)中去。在這個階段,我也明白了,好的思想,不能提留于字面上的認(rèn)知,還需要的是平時多練多寫一些相關(guān)的程序,并且
42、通過修改,加入新的算法去嘗試改變自己的一些編程思想。保持更新算法的速度,這才是關(guān)鍵。 </p><p> 課程設(shè)計已經(jīng)接近尾聲了,但它給我的不只是程序設(shè)計上的滿足,更重要的是對自己編程思想的一次更新,以及對算法的一個全新的認(rèn)識!</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 蘇仕華,數(shù)據(jù)結(jié)構(gòu)課程設(shè)計.-北京:機(jī)械
43、工業(yè)出版社,2005.5</p><p> [2] 于永彥,趙建洋.課程設(shè)計指導(dǎo)書.淮安:江蘇淮陰工學(xué)院 計算機(jī)工程系,2006</p><p> [3] 劉振安,劉燕君,孫忱. C++語言課程設(shè)計.北京:高等教育出版社,2003</p><p> [4] 陳志泊, 張海燕, 王春玲. Visual C++程序設(shè)計. 中國鐵道出版社 ,2005</
44、p><p> [5] 呂鳳哲,C++語言程序設(shè)計(第二版).北京:電子工業(yè)出版社,2005</p><p> [6] 殷人昆,陶永雷等.數(shù)據(jù)結(jié)構(gòu)(用面向?qū)ο蠓椒ㄅcC++ ).北京:清華大學(xué)出版社,1999</p><p> [7] 嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu).北京:清華大學(xué)出版社,1997</p><p> [8] 李春葆.數(shù)據(jù)結(jié)構(gòu)
45、—考研指導(dǎo).北京:清華大學(xué)出版社,2002</p><p> [9] 陳慧南.?dāng)?shù)據(jù)結(jié)構(gòu)—C++語言描述.北京:人民郵電出版社,2005.03</p><p><b> 附錄:源代碼</b></p><p> 4.1/*航空票務(wù)管理系統(tǒng)源代碼*/</p><p> #include <stdio.h>
46、</p><p> #include <stdlib.h></p><p> #include <string.h></p><p> #define MAXSIZE 3 /*定義航線量的最大值*/</p><p> typedef struct wat_ros</p><p> {
47、 char name[10];/*姓名*/</p><p> int req_amt;/*訂票量*/</p><p> struct wat_ros *next;</p><p> }qnode,*qptr;</p><p> typedef struct pqueue</p><p> { qptr fr
48、ont;/*等候替補(bǔ)客戶名單域的頭指針*/</p><p> qptr rear;/*等候替補(bǔ)客戶名單域的屬指針*/</p><p> }linkqueue;</p><p> typedef struct ord_ros</p><p> { char name[10];/*客戶姓名*/</p><p>
49、 int ord_amt;/*訂票量*/</p><p> int grade;/*艙位等級*/</p><p> struct ord_ros *next;</p><p> }linklist;</p><p> struct airline</p><p> { char ter_name[10];
50、/*終點(diǎn)站名 */</p><p> char air_num[10];/*航班號*/</p><p> char plane_num[10];/*飛機(jī)號*/</p><p> char day[7];/*飛行周日(星期幾)*/</p><p> int tkt_amt;/*乘員定額*/</p><p> i
51、nt tkt_sur;/*余票量*/</p><p> linklist *order;/*乘員名單域,指向乘員名單鏈表的頭指針*/</p><p> linkqueue wait;/*等候替補(bǔ)的客戶名單域,分別指向排隊等候名單隊頭隊尾的指針*/</p><p> }lineinfo;</p><p> struct airline
52、*start;</p><p> void display(struct airline *info)</p><p> /*打印每條航線的基本信息*/</p><p> {printf("%8s\t%3s\t%s\t%4s\t\t%3d\t%10d\n",info->ter_name,info->air_num,info-&g
53、t;plane_num,info->day,info->tkt_amt,info->tkt_sur);</p><p><b> }</b></p><p> void list()/*打印全部航線信息*/</p><p> { struct airline *info;</p><p><
54、;b> int i=0;</b></p><p> info=start;</p><p> printf("終點(diǎn)站名\t航班號\t飛機(jī)號\t飛行周日\t乘員定額\t余票量\n");</p><p> while(i<MAXSIZE){</p><p> display(info);<
55、;/p><p><b> info++;</b></p><p><b> i++;</b></p><p><b> }</b></p><p> printf("\n\n");</p><p><b> }<
56、/b></p><p> void search()</p><p> /*根據(jù)客戶提出的終點(diǎn)站名輸出航線信息*/</p><p> { struct airline *info,*find();</p><p> char name[10];</p><p><b> int i=0;&l
57、t;/b></p><p> info=start;</p><p> printf("請輸入終點(diǎn)站名:");</p><p> scanf("%s",name);</p><p> while(i<MAXSIZE) {</p><p> if(!strcm
58、p(name,info->ter_name)) break;</p><p><b> info++;</b></p><p><b> i++;</b></p><p><b> }</b></p><p> if(i>=MAXSIZE)</p>
59、;<p> printf("對不起,該航線未找到!\n");</p><p><b> else{</b></p><p> printf("終點(diǎn)站名\t航班號\t飛機(jī)號\t飛行周日\t乘員定額\t余票量\n");</p><p> display(info);</p>
60、<p><b> }</b></p><p><b> }</b></p><p> struct airline *find()</p><p> /*根據(jù)系統(tǒng)提出的航班號查詢并以指針形式返回*/</p><p> { struct airline *info;</p
61、><p> char number[10];</p><p><b> int i=0;</b></p><p> info=start;</p><p> printf("請輸入航班號:");</p><p> scanf("%s",number);
62、</p><p> while(i<MAXSIZE) {</p><p> if(!strcmp(number,info->air_num)) return info;</p><p><b> info++;</b></p><p><b> i++;</b></p>
63、;<p><b> }</b></p><p> printf("對不起,該航線末找到!\n");</p><p> return NULL;</p><p><b> }</b></p><p> void prtlink()</p>&l
64、t;p> /*打印訂票乘員名單域的客戶名單信息*/</p><p> { linklist *p;</p><p> struct airline *info;</p><p> info=find();</p><p> p=info->order;</p><p> if(p!=NULL)
65、{</p><p> printf("客戶姓名 訂票數(shù)額 艙位等級\n");</p><p><b> while(p){</b></p><p> printf("%s\t\t%d\t%d\n",p->name,p->ord_amt,p->grade);</p>
66、;<p> p=p->next;</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p> printf("該航線沒有客戶信息!!\n");<
67、/p><p><b> }</b></p><p> linklist *insertlink(linklist *head,int amount,char name[],int grade)</p><p> /*增加訂票乘員名單域的客戶信息*/</p><p> { linklist *p1,*new;<
68、/p><p><b> p1=head;</b></p><p> new=(linklist *)malloc(sizeof(linklist));</p><p> if(!new) {printf("\nOut of memory!!\n");return NULL;}</p><p> s
69、trcpy(new->name,name);</p><p> new->ord_amt=amount;</p><p> new->grade=grade;</p><p> new->next=NULL;</p><p> if(head==NULL)/*若原無訂票客戶信息*/</p><
70、;p> {head=new;new->next=NULL;}</p><p><b> else</b></p><p><b> head=new;</b></p><p> new->next=p1;</p><p> return head;</p>
71、<p><b> }</b></p><p> linkqueue appendqueue(linkqueue q,char name[],int amount)</p><p> /*增加排隊等候的客戶名單域*/</p><p> { qptr new;</p><p> new=(qptr)mal
72、loc(sizeof(qnode));</p><p> strcpy(new->name,name);</p><p> new->req_amt=amount;</p><p> new->next=NULL;</p><p> if(q.front==NULL)/*若原排隊等候客戶名單域為空*/</p&g
73、t;<p> q.front=new;</p><p><b> else</b></p><p> q.rear->next=new;</p><p> q.rear=new;</p><p><b> return q;</b></p><p&g
74、t;<b> }</b></p><p> void order()</p><p> /*辦理訂票業(yè)務(wù)*/</p><p> { struct airline *info;</p><p> int amount,grade;</p><p> char name[10];<
75、/p><p> info=start;</p><p> if(!(info=find())) return;/*根據(jù)客戶提供的航班號進(jìn)行查詢,如為空,退出該模塊*/</p><p> printf("請輸入你訂票所需要的數(shù)量:");</p><p> scanf("%d",&amount)
76、;</p><p> if(amount>info->tkt_amt)/*若客戶訂票額超過乘員定票總額,退出*/</p><p> { printf("\n對不起,您輸入的票的數(shù)量已經(jīng)超過乘員定額!");</p><p><b> return;</b></p><p><b
77、> }</b></p><p> if(amount<=info->tkt_sur)/*若客戶訂票額末超過余票量,訂票成功并等記信息*/</p><p><b> {</b></p><p><b> int i;</b></p><p> printf(&q
78、uot;請輸入您的姓名(訂票客戶):");</p><p> scanf("%s",name);</p><p> printf("請輸入%s票的艙位等級:",name);</p><p> scanf("%d",&grade);</p><p> info
79、->order=insertlink(info->order,amount,name,grade);/*在訂票乘員名單域中添加客戶信息*/</p><p> for(i=0;i<amount;i++)/*依次輸出該訂票客戶的座位號*/</p><p> printf("%s的座位號是:%d\n",name,info->tkt_amt-info
80、->tkt_sur+i+1);</p><p> info->tkt_sur-=amount;/*該航線的余票量應(yīng)減掉該客戶的訂票量*/</p><p> printf("\n祝您乘坐愉快!\n");</p><p><b> }</b></p><p> else /
81、*若滿員或余票額少于訂票額,詢問客戶是否需要進(jìn)行排隊等候*/</p><p> { char r;</p><p> printf("\n已經(jīng)沒有更多的票,您需要排隊等候嗎?(Y/N)");</p><p> r=getch();</p><p> printf("%c",r);</p&
82、gt;<p> if(r=='Y'||r=='y')</p><p> { printf("\n請輸入您的姓名(排隊訂票客戶):");</p><p> scanf("%s",name);</p><p> info->wait=appendqueue(info-&
83、gt;wait,name,amount);/*在排隊等候乘員名單域中添加客戶信息*/</p><p> printf("\n注冊成功!\n");</p><p><b> }</b></p><p> else printf("\n歡迎您下次再次訂購!\n");</p><p&g
84、t;<b> }</b></p><p><b> }</b></p><p> void return_tkt()</p><p><b> /*退票模塊*/</b></p><p> { struct airline *info;</p><
85、p> qnode *t,*back,*f,*r;</p><p> int grade;</p><p> linklist *p1,*p2,*head;</p><p> char cusname[10];</p><p> if(!(info=find())) return;/*調(diào)用查詢函數(shù),根據(jù)客戶提供的航線進(jìn)行搜索*/
86、</p><p> head=info->order;</p><p><b> p1=head;</b></p><p> printf("請輸入你的姓名(退票客戶):");</p><p> scanf("%s",cusname);</p><
87、p> while(p1!=NULL) {/*根據(jù)客戶提供的姓名到訂票客戶名單域進(jìn)行查詢*/</p><p> if(!strcmp(cusname,p1->name)) break;</p><p> p2=p1;p1=p1->next;</p><p><b> }</b></p><p>
88、 if(p1==NULL){ printf("對不起,你沒有訂過票!\n");return;}/*若未找到,退出本模塊*/</p><p> else{/*若信息查詢成功,刪除訂票客戶名單域中的信息*/</p><p> if(p1==head) head=p1->next;</p><p> else p2->next=p1-
89、>next;</p><p> info->tkt_sur+=p1->ord_amt;</p><p> grade=p1->grade;</p><p> printf("%s成功退票!\n",p1->name);</p><p><b> free(p1);</b&
90、gt;</p><p><b> }</b></p><p> info->order=head;/*重新將航線名單域指向訂票單鏈表的頭指針 */</p><p> f=(info->wait).front;/*f指向排隊等候名單隊列的頭結(jié)點(diǎn)*/</p><p> r=(info->wait).
91、rear;/*r指向排隊等候名單隊列的尾結(jié)點(diǎn)*/</p><p> t=f;/*t為當(dāng)前滿點(diǎn)條件的排隊候補(bǔ)名單域*/</p><p><b> while(t)</b></p><p><b> {</b></p><p> if(info->tkt_sur>=info->
92、wait.front->req_amt){/*若滿足條件者為頭結(jié)點(diǎn)*/</p><p><b> int i;</b></p><p> info->wait.front=t->next;</p><p> printf("%s訂票成功!\n",t->name);</p><
93、p> for(i=0;i<t->req_amt;i++)/*輸出座位號*/</p><p> printf("%s的座位號是:%d\n",t->name,(info->tkt_sur)-i);</p><p> info->tkt_sur-=t->req_amt;</p><p> info-&g
94、t;order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到訂票客戶名單鏈表中*/</p><p><b> free(t);</b></p><p><b> break;</b></p><p><b> }</b&
95、gt;</p><p> back=t;t=t->next;</p><p> if((info->tkt_sur)>=(t->req_amt)&&t!=NULL)/*若滿足條件者不為頭結(jié)點(diǎn)*/</p><p><b> { int i;</b></p><p> bac
96、k->next=t->next;</p><p> printf("%s訂票成功!\n",t->name);</p><p> for(i=0;i<t->req_amt;i++)/*輸出座位號*/</p><p> printf("<%s>'s seat number is:%d\
97、n",t->name,(info->tkt_sur)-i);</p><p> info->tkt_sur-=t->req_amt;</p><p> info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到訂票客戶名單鏈表中*/</p>
98、<p> free(t);break;</p><p><b> }</b></p><p> if(f==r) break;</p><p><b> }</b></p><p><b> }</b></p><p> int m
99、enu_select()</p><p><b> /*菜單界面*/</b></p><p><b> { int c;</b></p><p> char s[20];</p><p> printf("\n\t\t航空客運(yùn)訂票系統(tǒng)\n");</p>&
100、lt;p> printf("******************************************\n");</p><p> printf("1.瀏覽航線信息:\n");</p><p> printf("2.瀏覽已訂票客戶信息:\n");</p><p> printf(&q
101、uot;3.查詢航線\n");</p><p> printf("4.辦理訂票業(yè)務(wù):\n");</p><p> printf("5.辦理退票業(yè)務(wù):\n");</p><p> printf("6.退出系統(tǒng)\n");</p><p> printf("**
102、*****************************************\n");</p><p><b> do{</b></p><p> printf("請選擇:");</p><p> scanf("%s",s);</p><p> c=atoi
103、(s);</p><p> }while(c<0||c>7);</p><p><b> return c;</b></p><p><b> }</b></p><p><b> main()</b></p><p> { st
104、ruct airline air[MAXSIZE]={{"beijing","1","B8571","SUN",3,3},</p><p> {"shanghai","2","S1002","MON",2,2},</p><p>
105、 {"london","3","L1003","FRI",1,1}};/*初始化航線信息*/</p><p> /* clrscr();*/</p><p> start=air;</p><p><b> for(;;){</b></p>
106、<p> switch(menu_select()){</p><p> case 1:list();break;</p><p> case 2:prtlink();break;</p><p> case 3:search();break;</p><p> case 4:order();break;</p>
107、;<p> case 5:return_tkt();break;</p><p> case 6:printf("\n歡迎使用本系統(tǒng),再見!\n");exit(0);</p><p><b> }</b></p><p> printf("\nPress any key to continue
108、!\n");</p><p><b> getch();</b></p><p><b> }</b></p><p> 4.2八皇后代碼編寫及詳細(xì)注釋</p><p> #include <conio.h></p><p> #include
109、 <math.h></p><p> #include <stdlib.h></p><p> #include <stdio.h></p><p> #include <iostream.h></p><p> #define QUEENS 8</p><p>
110、 int iCount = 0; //!記錄解的序號的全局變量。</p><p> int Site[QUEENS]; //!記錄皇后在各行上的放置位置的全局?jǐn)?shù)組。</p><p> void Queen(int n); //!遞歸求解的函數(shù)。</p><p> void Output();//!輸出一個解。</p><p>
111、 int IsValid(int n); </p><p> //!判斷第n個皇后放上去之后,是否有〉沖突。</p><p> void main() /*----------------------------Main:主函數(shù)。----------------------------*/</p><p> { system("title
112、 葉青--遞歸算法八皇后問題 ");</p><p> cout<<" "<<"八皇后的解法:"<<endl;</p><p> cout<<" "<<"---------------------
113、----------------"<<endl; </p><p> Queen(0); //!從第0行開始遞歸試探。 </p><p> getch();//!按任意鍵返回。</p><p><b> }</b></p><p> void Queen(int n) /*--
114、---------------Queen:遞歸放置第n個皇后,程序的核心!----------------*/</p><p> { int i; </p><p> if(n == QUEENS) //!參數(shù)n從0開始,等于8時便試出了一個解,將它輸出并回溯。 </p><p> { Output(); return
115、; } </p><p> for(i = 1 ; i <= QUEENS ; i++) //!n還沒到8,在第n行的各個行上依次試探。 </p><p> { Site[n] = i; //!在該行的第i行上放置皇后。 </p><p> if(IsValid(n)) //!如果放置沒有沖突,就開始下一行
116、的試探。 </p><p> Queen(n + 1); }}</p><p> int IsValid(int n) /*------IsValid:判斷第n個皇后放上去之后,是否合法,即是否無沖突。------*/</p><p> { int i; </p><p> for(i = 0 ; i
117、 < n ; i++) //!將第n個皇后的位置依次于前面n-1個皇后的位置比較。 </p><p> { if(Site[i] == Site[n]) //!兩個皇后在同一列上,返回0。 </p><p> return 0; </p><p> if(abs(Site[i] - Site[n]) == (n
118、- i)) //!兩個皇后在同一對角線上,返回0。 </p><p> return 0; } </p><p> return 1; //!沒有沖突,返回1。</p><p><b> }</b></p><p> void Output()/*------------Output:輸出
119、一個解,即一種沒有沖突的放置方案。------------*/</p><p><b> { </b></p><p><b> int i; </b></p><p> printf("No.%-5d" , ++iCount); //!輸出序號。 </p><p&
120、gt; for(i = 0 ; i < QUEENS ; i++)//!依次輸出各個行上的皇后的位置,即所在的列數(shù)。 </p><p> printf("%d " , Site[i]); </p><p> printf("\n");</p><p><b> } </b>&
溫馨提示
- 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è)計---航空訂票系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---航空訂票系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-航空訂票系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---航空訂票系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)航空訂票系統(tǒng)課程設(shè)計報告
- 航空客運(yùn)訂票系統(tǒng)課程設(shè)計(數(shù)據(jù)結(jié)構(gòu))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--航空客運(yùn)訂票系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---航空客運(yùn)訂票系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)航空航班課程設(shè)計--航空客運(yùn)訂票系統(tǒng)
- 航空客運(yùn)訂票系統(tǒng)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計源代碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---飛機(jī)訂票系統(tǒng)設(shè)計與實(shí)現(xiàn)
- 航空訂票系統(tǒng)數(shù)據(jù)庫課程設(shè)計
- 數(shù)據(jù)庫課程設(shè)計-- 航空訂票管理系統(tǒng)
- 航空訂票管理系統(tǒng)課程設(shè)計
- 課程設(shè)計報告-航空訂票系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計c語言版飛機(jī) 訂票 系統(tǒng)資料
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----huffman編碼
- 課程設(shè)計---航空客運(yùn)訂票系統(tǒng)
- 航空客運(yùn)訂票系統(tǒng)課程設(shè)計
- java課程設(shè)計-航空訂票管理系統(tǒng)設(shè)計
評論
0/150
提交評論