課程設計一:火車售票系統(tǒng)_第1頁
課程設計一:火車售票系統(tǒng)_第2頁
課程設計一:火車售票系統(tǒng)_第3頁
課程設計一:火車售票系統(tǒng)_第4頁
課程設計一:火車售票系統(tǒng)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數(shù)據(jù)結構與算法課程實驗報告課程設計一:火車售票系統(tǒng)設計及實現(xiàn)姓名:cll 班級: 學號:一、實驗內容: 火車售票系統(tǒng)在現(xiàn)實中的應用已經(jīng)非常普遍,目前通常使用可視化的方法實現(xiàn),例如采用C/S模式下的程序設計或者采用B/S模式下的程序設計,通常都具有較為友好的界面和較為完善的功能。火車售票系統(tǒng)的實現(xiàn)過程中,主要涉及到數(shù)據(jù)格式的設計,也就是數(shù)據(jù)結構的設計。通常在采用數(shù)據(jù)庫的情況下,可以運用數(shù)據(jù)庫的設計來實現(xiàn)。在沒有采用數(shù)據(jù)庫情況下需要,單獨設計相應數(shù)據(jù)結構和算法。二、實驗目的: 按給定需求,通過查找相關資料,完成火車售票系統(tǒng)設計及實現(xiàn),在設計過程中充分運用數(shù)據(jù)結構與算法課程中所學知識,從而熟練地掌握和應用線性表、單鏈表等重要數(shù)據(jù)結構和常用算法。提前熟悉軟件需求分析,軟件測試等環(huán)節(jié),運用相應程序設計語言實現(xiàn)該系統(tǒng),從而進一步提高程序設計能力。三、問題描述(1)此系統(tǒng)可以實現(xiàn)售票、退票、車票剩余情況查詢等功能。(2)每張車票包含車次、座位信息。在售票、退票、查詢剩余票等環(huán)節(jié)中,都必須顯示出車票的信息,即車次、座位情況。(3)退票時,必須是車站售出的車票才能退,否則視為無效票,不能退票。(4)演示程序以用戶和計算機的對話方式進行,即在計算機終端上顯示“提示信息”之后,由用戶在鍵盤上輸入程序中規(guī)定的運算命令;相應的輸入數(shù)據(jù)(濾去輸入中的非法字符)和運算結果顯示在后。(5)由訂票系統(tǒng)的主要功能使程序的命令包括:1)查詢;2)訂票;3)退票 4)退出訂票系統(tǒng)四、問題的實現(xiàn)4.1所用的數(shù)據(jù)結構(包括所用數(shù)據(jù)結構的抽象數(shù)據(jù)類型定義和說明)typedef struct LNode/數(shù)據(jù)域char name10;/訂票姓名int dnum;/訂票數(shù)量char dj50;/證件編號int zhekou; /1代表折扣對象float pay;/付費struct LNode *next;/指針域int zuohao200;LNode,*LinkList;/構造單鏈表(已訂票) typedef struct Ticketschar *endname;/終點站名char *hnum;/車次名int fnum;/票價float discut;/折扣int day;/日期int wholenum;/總票額 int lastnum;/余票量 int tuipiao100; /退票處理,記錄退票的座位號 int tpcs;/記錄目前退票次數(shù)int mcps;/記錄賣出去的票數(shù)(包括退票)LinkList la;/已訂票鏈表Tickets;/構造結構類型(火車票) typedef structstruct Tickets *elem;/存儲空間的基址int length;int listsize;/當前分配的存儲容量(以sizeof(Tickets)為單位)SqList;/構造順序表4.2主要實現(xiàn)思路1、火車站的火車票采用順序表表示。每趟火車出售的票用鏈表表示。2、查詢:輸入終點站信息,輸出該趟火車的票價,日期,余票數(shù)等信息; 訂票:輸入終點站信息,確認有該趟車之后,輸入該趟車的基本信息,之后輸入購票數(shù),系統(tǒng)查詢是否有余票,確認之后,輸入個人基本信息;系統(tǒng)查詢是否有退票,若有退票則,先售出退票。插入新的結點。退票:輸入終點站的信息,輸入個人信息,1、若退出所有票,則刪除該結點,若,只退部分票,則更改該結點的購票信息。退出:退出系統(tǒng);【程序演示】輸入2 訂票,購買到溫州的火車票十張,姓名:a;證件號:a;退票:輸入3退票,輸入終點站溫州,姓名:a;證件號:a;退票之后,繼續(xù)訂票3張【實現(xiàn)代碼】int InitList_L(LinkList *h)/初始化帶頭結點的單鏈表 *h = (LinkList)malloc(sizeof(LNode);/生成頭結點if(!h)printf(初始化鏈表錯誤!n);return 0; (*h) - next = NULL;return 1;int Create_Sq(SqList *L)/初始化并創(chuàng)建順序表 L-elem=(Tickets *)malloc(ListInitSize*sizeof(Tickets);if(!L-elem) printf(存儲分配失敗!);/ 存儲分配失敗 return 0; L-length=5;/賦值 L-listsize=ListInitSize;int j;for(j = 0; j length; j+) L-elemj.mcps=0;/初始化,記錄買出去的票 L-elemj.tpcs=0;/記錄退票數(shù) int i;for(i = 0;i length; i+) InitList_L(&L-elemi.la); L-elem0.endname=北京; /終點站名 L-elem0.hnum=G2378;/車次名 L-elem0.day=1;/日期 L-elem0.fnum=346;/票價 L-elem0.discut=0.5; L-elem0.wholenum=L-elem0.lastnum=10; L-elem1.endname=溫州; L-elem1.hnum=K351; L-elem1.day=2; L-elem1.fnum=254; L-elem1.discut=0.5; L-elem1.wholenum=L-elem1.lastnum=10; L-elem2.endname=合肥; L-elem2.hnum=G782B; L-elem2.day=3; L-elem2.fnum=224; L-elem2.discut=0.5; L-elem2.wholenum=L-elem2.lastnum=10; L-elem3.endname=武漢; L-elem3.hnum=D2903; L-elem3.day=4; L-elem3.fnum=200; L-elem3.discut=0.5; L-elem3.wholenum=L-elem3.lastnum=10; L-elem4.endname=廈門; L-elem4.hnum=T112; L-elem4.day=5; L-elem4.fnum=450; L-elem4.discut=0.5; L-elem4.wholenum=L-elem4.lastnum=10; return 1;/創(chuàng)建順序表void Demand(SqList L) int n1; do char endstop100; printf(*查票窗口*n); printf(請輸入終點站名:n);do gets(endstop); while(!endstop0);int i; for(i=0;i%sn,endstop); printf(tt車次:%sn,L.elemi.hnum); printf(tt日期:%d日n,L.elemi.day); printf(tt票價:%dn,L.elemi.fnum); printf(tt折扣價(學生/軍人等5折):%fn,L.elemi.fnum*L.elemi.discut); printf(tt總票量:%dn,L.elemi.wholenum); printf(tt余票量:%dn,L.elemi.lastnum); break; if(i=L.length-1) printf(沒有找到%s的車票!n,endstop); printf(1.返回主菜單;2.繼續(xù)n); scanf(%d,&n1); while(n1=2);void GetTicket(SqList *L)/訂票 int n2=2,zhekou;/n2=1,繼續(xù)訂票;n2=2,返回主菜單;n2=0,確定,即訂票成功 int num; /訂票數(shù) float money; /存儲應付的總票額 char endstop100; /記錄終點站名 char name100; char ID100; /記錄證件號 do printf(*訂票窗口*n); printf(終點站名:); do gets(endstop); while(!endstop0);int i = 0;for(i=0;ilength;i+) if(strcmp(L-elemi.endname,endstop)=0) /有該趟火車 printf(tt杭州-%sn,endstop); printf(tt車次:%sn,L-elemi.hnum); printf(tt日期:%d日n,L-elemi.day); printf(tt票價:%dn,L-elemi.fnum); printf(tt折扣價(學生/軍人等5折):%fn,L-elemi.fnum*L-elemi.discut); printf(tt總票量:%dn,L-elemi.wholenum); printf(tt余票量:%dn,L-elemi.lastnum); printf(請輸入訂票數(shù):); scanf(%d,&num); if(L-elemi.lastnum = 0) printf(對不起,到%s的車票已賣完!n,endstop); printf(nt1.繼續(xù)訂票;2.返回主菜單;n); scanf(%d,&n2); else if(num L-elemi.lastnum) printf(對不起,到%s的車票只剩%d張。n,endstop); printf(n1.繼續(xù)訂票;2.返回主菜單;n); scanf(%d,&n2); else printf(購票請輸入個人信息:n); printf(姓名:);dogets(name);while(!name0); printf(是折扣對象嗎?若是,請輸入相關證件號,不是請輸入身份證號(1.是;0.不是)n); scanf(%d,&zhekou); while(zhekou != 1 & zhekou != 0) printf(不合法輸入,請重輸!n); scanf(%d,&zhekou);printf(證件號碼:);/fflush(stdin); dogets(ID);while(!ID0); /輸出訂票信息,待客戶確認 printf(t請核對您的訂票信息:n); printf(t姓名:%sn,name); printf(t證件號碼:%sn,ID); printf(t杭州-%s:n,endstop); printf(t車次:%sn,L-elemi.hnum); printf(t日期:12月%d日,L-elemi.day); /輸出票價(兩種情況) if(zhekou=1) printf(折扣價(學生/軍人等5折):%fn,L-elemi.fnum*L-elemi.discut); money=L-elemi.fnum*L-elemi.discut*num;/money用于暫時存儲應付的總票額 else printf(票價:%dn,L-elemi.fnum); money = L-elemi.fnum*num; printf(訂票數(shù):%dn,num); printf(座位號: ); /如果有退票,優(yōu)先賣退票 int k=0; /k用于記錄買到的票是退票的數(shù)目 int data100; /臨時記錄座位號,用于后面的保存 int j;/只用于for循環(huán)的參數(shù),不保存數(shù)據(jù); for(j=L-elemi.tpcs-1 ; j=0 ; j-)/只需要num 張就夠了,L.elemi.jishu1為退票總數(shù) printf(%dt,L-elemi.tuipiaoj); /退票的座位號 tuipioaj k+; /買到退票數(shù)目+1 if(k=num)break; /說明買的全部都是退票 /退票數(shù)目不夠買票數(shù)目 if(k num)for(j=0;jelemi.mcps += 1; /賣出去票的數(shù)目+1(包括退票) 此時賣出的票數(shù)即為座位號 dataj=L-elemi.mcps; printf(%dt,L-elemi.mcps); printf(n總票額:%fn,money); printf(n 0.確認;1.取消;2.返回主菜單n); scanf(%d,&n2); if(n2=0) printf(訂票成功!n); L-elemi.lastnum-=num; /更新余票的數(shù)目 /在鏈表中插入新結點 LinkList p,s; /已訂票鏈表的指針類型 p = L-elemi.la;/第i趟車的已訂票列表 (頭結點) s = (LinkList)malloc(sizeof(LNode) ; /新的結點 if(!s) printf(內存分配失?。?;else s-next=p-next;/在頭部插入 p-next=s; s-dnum=num; /訂票數(shù)量 s-pay=money; /票價 s-zhekou=zhekou; /折扣信息 strcpy(s-name,name); /姓名 strcpy(s-dj,ID); /證件號 /將座位號記入客戶信息 int flag=0; for(j=L-elemi.tpcs-1 ; j=0 ; j-)/只需要num 張就夠了,L.elemi.jishu1為可買退票的張數(shù) s-zuohaoflag=L-elemi.tuipiaoj; flag+; k+; /買到退票數(shù)目+1 if(k=num)break; /說明買的全部都是退票 /退票數(shù)目不夠買票數(shù)目 if(k num)for(j=0;jzuohaoflag=dataj;flag+; break; if(i=L-length-1) printf(沒有到%s的車票!n,endstop); n2=2; while(n2=1);void ReturnTicket(SqList *L) int n3=2,k; /n3=1,繼續(xù)退票;n3=2,返回主菜單;n3=0,確定,即退票成功,k記錄要退的票的數(shù)目 LinkList p; char name100; char ID100; char endstop100; do printf(*退票窗口*n); printf(終點站:); do gets(endstop); while(!endstop0); int i; for(i=0;ilength-1;i+) if(strcmp(L-elemi.endname,endstop)=0) printf(姓名:); do gets(name);while(!name0); printf(證件號:); do gets(ID);while(!ID0); p = L-elemi.la; if(!p-next) printf(沒有客戶!); else p = p-next; while(!(strcmp(p-name,name)=0 & strcmp(p-dj,ID)=0) & p-next) p=p-next; if(strcmp(p-name,name)=0 & strcmp(p-dj,ID)=0) printf(您的車票信息如下:n); printf(t姓名:%sn,p-name);printf(t證件號碼:%sn,p-dj); printf(t杭州-%sn,L-elemi.endname);printf(t車次:%sn,L-elemi.hnum);printf(t日期:12月%d日n,L-elemi.day); if(p-zhekou=0)/非折扣對象 printf(t票價:%dn,L-elemi.fnum); else/折扣對象 printf(t折扣價:%fn,L-elemi.fnum*L-elemi.discut); printf(t訂票數(shù):%dn,p-dnum); printf(t座位號為:); int flag; for(flag = 0;flagdnum;flag+) printf(%dt,p-zuohaoflag);printf(總票額:%fn,p-pay);printf(退幾張?n);scanf(%d,&k);/k用來記錄退票的張數(shù) if(k p-dnum) printf(您只有%d票,請重新確認!n,p-dnum); printf(1.重新確定;2.返回主菜單n); scanf(%d,n3); else printf(0.確認;1.取消;2.返回主菜單n); scanf(%d,&n3); if(n3=0) printf(退票成功!n); int i1 = L-elemi.tpcs; L-elemi.tpcs+=k;/更新退票數(shù) for(flag=p-dnum;flagp-dnum-k;flag-,i1+) L-elemi.tuipiaoi1 = p-zuohaoflag-1; L-elemi.lastnum+=k;/更新余票 if(k=p-dnum) /票全部退完的情況,刪除鏈表中的結點 LinkList q = L-elemi.la; while(q-next!=p) q = q-next; q-next = p-next; free(p); /釋放資源 n3=2; /返回主菜單 else if(p-pay = p-dnum*L-elemi.fnum) /判斷是否是折扣票 p-pay-=L-elemi.fnum*k;else p-pay-=L-elemi.fnum*k*L-elemi.discut; p-dnum-=k; printf(你還有%d張票,p-dnum); n3=2; /if(n3=0) /

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論