C語言集中上機實驗報告 - 車票管理系統(tǒng)_第1頁
C語言集中上機實驗報告 - 車票管理系統(tǒng)_第2頁
C語言集中上機實驗報告 - 車票管理系統(tǒng)_第3頁
C語言集中上機實驗報告 - 車票管理系統(tǒng)_第4頁
C語言集中上機實驗報告 - 車票管理系統(tǒng)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、C語言集中上機報告車票管理系統(tǒng) 院 系: 計算機學(xué)院 班 級: xxx 姓 名: xxx 合 作 者: 無 指導(dǎo)教師: xxx 2009年 6月 11日目 錄一概述3二總體方案設(shè)計3三詳細(xì)設(shè)計5四程序的調(diào)試與運行結(jié)果說明8五課程設(shè)計總結(jié)10六后記10七附錄11參考文獻(xiàn)20一 概述1. 課程設(shè)計的目的熟練掌握C語言的應(yīng)用及特點; 掌握函數(shù)聲明、定義和使用的方法;熟練掌握C語言中的對文件進(jìn)行操作的基本方法;熟練掌握結(jié)構(gòu)體的使用方法;掌握鏈表的基本操作。2. 課程設(shè)計的要求1.要求利用C語言面向過程的編程思想完成系統(tǒng)設(shè)計;2.突出C語言的函數(shù)特征,以多個函數(shù)實現(xiàn)每一個子功能;3.畫出功能模塊圖;4.

2、進(jìn)行簡單的界面設(shè)計,能夠?qū)崿F(xiàn)友好交互;5.具有清晰的程序流程圖和數(shù)據(jù)結(jié)構(gòu)的詳細(xì)定義;6.源碼格式規(guī)范,要有適當(dāng)?shù)淖⑨專钩绦蛉菀组喿x。3. 課程設(shè)計的主要設(shè)計思想這次設(shè)計的車票管理系統(tǒng),實現(xiàn)了對車票的實時管理,功能包括錄入、增加班次信息(信息用文件保存),瀏覽班次信息,查詢路線以及售票和退票功能。主要使用了鏈表實現(xiàn)了數(shù)據(jù)的保存和修改,同時使用文件相關(guān)函數(shù)對文件進(jìn)行同步。二 總體方案設(shè)計這個程序比較簡單,主要分為菜單,瀏覽/查詢,售票/退票,和增加數(shù)據(jù)四個部分。采用了鏈表作為存儲的方式,并實現(xiàn)了結(jié)構(gòu)體與文件的同步修改,已經(jīng)具備了題目要求的所有功能。這個程序由我個人完成。在編程過程中遇到的關(guān)鍵問題

3、有系統(tǒng)時間的獲取與顯示,從文件中讀取鏈表,處理每天班次的人數(shù)刷新問題,以及如何提高代碼的復(fù)用率等。程序整體框圖如下:啟動程序文件是否存在5增加新班次記錄結(jié)構(gòu)體鏈表文件是否為空否是是修改3查找班次4退出系統(tǒng)數(shù)據(jù)文件banci.dat修改菜單1-5否關(guān)閉文件將文件讀入結(jié)構(gòu)體鏈表更新班次日期等讀取寫入修改1顯示班次讀取調(diào)用2售票 / 退票調(diào)用判斷是否能夠售票/退票(根據(jù)時間,已訂票人數(shù))是修改三 詳細(xì)設(shè)計程序結(jié)構(gòu)以及各函數(shù)的具體功能main.c:void main();程序入口,對文件進(jìn)行打開和初始化后進(jìn)入菜單void menu(struct banci *head,struct banci *nw

4、,FILE *data,unsigned int serial);顯示菜單,從主函數(shù)中得到各種信息,通過switch語句調(diào)用其他功能operate.c:void update(struct banci *ut,FILE *data);更新結(jié)構(gòu)體中的各個數(shù)據(jù),主要對日期進(jìn)行處理,當(dāng)班次更新后重新寫入日期并將已訂票人數(shù)清零void displaybanci(struct banci *head, unsigned short mode);作為整個程序中唯一的數(shù)據(jù)顯示函數(shù),顯示班次信息,有3個顯示模式struct banci * addbanci(struct banci * tail, FILE

5、*data,unsigned serial);增加一條新的班次信息到鏈表末尾,并寫入文件void searchbanci(struct banci * head);查找班次信息,可按班次號查詢或按終點站查詢void piao(struct banci *head,FILE *data);實現(xiàn)售票和退票功能,并自動更新文件operate.h聲明結(jié)構(gòu)體和各個自定義函數(shù)部分函數(shù)的算法分析1. 對文件進(jìn)行打開和初始化。這個功能在主函數(shù)main()中完成。有關(guān)代碼如下,具體功能解釋在程序注釋中。FILE *data;struct banci *head,*nw;head=(struct banci*)m

6、alloc(sizeof(struct banci);if(data=fopen(banci.dat,r+)=NULL)data=fopen(banci.dat,w);printf(nn建立新文件,請至少輸入一條班次記錄n);nw=addbanci(head,data,1);head=nw;else if(fread(head,sizeof(struct banci),1,data)=0)/判斷文件是否為空。fread()返回的是讀取成功的數(shù)據(jù)塊數(shù)目,返回0說明讀取失敗。若文件不為空則實現(xiàn)讀取文件printf(nn數(shù)據(jù)文件是空的,請至少輸入一條班次記錄n);nw=addbanci(head,d

7、ata,1);head=nw;elsenw=head;while(1) /把整個鏈表從文件中讀出來,同時獲取目前的班次總數(shù)serial+;/if(nw-next=NULL) break; /這么判斷結(jié)尾時不可行的,因為nw-next已經(jīng)被賦值不可能為空了nw-next=malloc(sizeof(struct banci);if(fread(nw-next,sizeof(struct banci),1,data)=0)/逐條讀取。若遇到結(jié)尾,結(jié)束讀取nw-next=NULL;break;nw=nw-next;2. update() 函數(shù)。使用這個函數(shù)主要是考慮到系統(tǒng)日期變化后對班次的售票信息進(jìn)

8、行更新。在程序中每進(jìn)入一次菜單就要執(zhí)行一次update()函數(shù)。當(dāng)結(jié)構(gòu)體中存儲的年月日和系統(tǒng)目前的時間都相等是則跳過并不清零已訂票人數(shù),否則對結(jié)構(gòu)體進(jìn)行更新并清零已訂票人數(shù)。主要代碼如下:if(nowtime.wYear = ut-fache.wYear &nowtime.wMonth = ut-fache.wMonth &nowtime.wDay = ut-fache.wDay )fseek(data,sizeof(struct banci),1); /不需要更新,則跳過這個結(jié)構(gòu)體,不寫文件elseut-fache.wYear=nowtime.wYear;ut-fache.wMonth=no

9、wtime.wMonth;ut-fache.wDay=nowtime.wDay;ut-fache.wDayOfWeek=nowtime.wDayOfWeek;ut-yidingpiaorenshu=0;fwrite(ut,sizeof(struct banci),1,data);3. displaybanci() 函數(shù)。通過顯示模式這一變量,實現(xiàn)了代碼的重復(fù)利用。當(dāng)顯示整個鏈表時,循環(huán)顯示所有信息;當(dāng)在查找中僅需要顯示單條記錄時,不再繼續(xù)顯示之后的信息。這是有關(guān)顯示模式的主要代碼:while(head!=NULL) if (mode=1 | mode=3) /顯示全部記錄時,繼續(xù)顯示 head

10、=head-next; if (mode=2) /顯示單條記錄時,不再顯示 break;if(mode=1) getch(); /模式2和3不需要暫停,故有這個判斷4. 關(guān)于班次的序列號。這個程序中班次是固定的,不需要修改或刪除,故班次的序號又系統(tǒng)自動分配,不需要輸入。在程序開始初始化文件時,就獲取了目前的班次總數(shù),若再增加班次,則序列號自動加一。具體實現(xiàn):(菜單menu()中)case 5: serial+;nw=addbanci(nw,data,serial); break;(addbanci()中)newnode-serial=serial;四 程序的調(diào)試與運行結(jié)果說明1. 啟動程序,提

11、示輸入第一條記錄建立文件建立新文件,請至少輸入一條班次記錄這是第 1 個班次輸入發(fā)車時間(小時:分鐘)2. 若文件為空,也提示輸入第一條記錄數(shù)據(jù)文件是空的,請至少輸入一條班次記錄這是第 1 個班次輸入發(fā)車時間(小時:分鐘)3. 輸入記錄后進(jìn)入菜單,使用了簡單的文本菜單界面C題目二十三: 車票管理系統(tǒng)今天是 2009 年 6 月 12 日,目前讀取的時間為 8 時 37 分 1. 瀏覽班次信息 2. 售票 / 退票 3. 查詢班次 4. 退出系統(tǒng) 5. 增加班次4. 瀏覽班次信息瀏覽班次班次 發(fā)車時間 起點站 終點站 行車時間 額定載量 已定票人數(shù) 是否已發(fā)出1 8 : 00 aaa bbb 0

12、.5 40 0 已發(fā)出2 23 : 00 bbb aaa 0.5 40 23 12 : 00 rtf bbb 1.5 40 14 17 : 30 bbb rtf 1.5 40 05 19 : 30 ttt rtf 0.3 40 06. 查詢班次信息,按終點站查詢查詢班次 1. 按班次號查詢 2. 按終點站查詢輸入要查詢的終點站: bbb瀏覽班次班次 發(fā)車時間 起點站 終點站 行車時間 額定載量 已定票人數(shù) 是否已發(fā)出1 8 : 00 aaa bbb 0.5 40 0 已發(fā)出瀏覽班次班次 發(fā)車時間 起點站 終點站 行車時間 額定載量 已定票人數(shù) 是否已發(fā)出3 12 : 00 rtf bbb 1.

13、5 40 17. 售票、退票,以售票為例瀏覽班次班次 發(fā)車時間 起點站 終點站 行車時間 額定載量 已定票人數(shù) 是否已發(fā)出1 8 : 00 aaa bbb 0.5 40 0 已發(fā)出2 23 : 00 bbb aaa 0.5 40 23 12 : 00 rtf bbb 1.5 40 24 17 : 30 bbb rtf 1.5 40 05 19 : 30 ttt rtf 0.3 40 0售票 / 退票 1. 售票 2. 退票輸入要售票的班次號:3第 3 班次完成一次售票8. 增加班次信息這是第 6 個班次輸入發(fā)車時間(小時:分鐘)10:15輸入起點站ytr輸入終點站aaa輸入行車時間(分鐘)60

14、輸入額定載量32五 課程設(shè)計總結(jié)經(jīng)過測試,這個系統(tǒng)已經(jīng)達(dá)到了題目中的全部要求。從功能上講,這個程序還有不完善的地方,如不能修改或刪除班次信息等。另外,由于追求代碼復(fù)用率的原因,在查詢班次時會顯示出多余的信息,有待進(jìn)一步改進(jìn)。這個程序有一個特點就是界面簡明,但從另一方面講也可以說是界面簡陋,如果可能的話,下一個版本將采用圖形界面。在編程過程中也遇到了一些困難,如系統(tǒng)時間的獲取與保存,從文件中讀出整個鏈表等,這些都通過查詢資料和詢問同學(xué)得到了解決。另外在程序測試過程中發(fā)現(xiàn)了發(fā)車后訂票人數(shù)不能歸零的問題,后來通過添加update()函數(shù)得到了解決。六 后記經(jīng)過這次集中上機實習(xí),我充分認(rèn)識到了C語言的

15、用途是非常廣的,功能也非常強大,是學(xué)計算機不可缺少的語言。更重要的是,在這次編程中熟悉了編寫一個比較復(fù)雜程序的流程,以及發(fā)現(xiàn)問題、解決問題的能力,為下一步計算機語言的學(xué)習(xí)做了準(zhǔn)備。之前感覺遙不可及的功能,現(xiàn)在可以實現(xiàn)了,應(yīng)當(dāng)感謝老師和同學(xué)的熱心幫助,這是我得以及時完成這個程序的重要因素。七 附錄main.c#include#include#include#includeoperate.hunsigned int serial=0; /班次序列號,由系統(tǒng)自動生成不能修改void menu(struct banci *head,struct banci *nw,FILE *data,unsigne

16、d int serial);void main()FILE *data;struct banci *head,*nw;/system(mode con cols=80 lines=25);/定義屏幕寬度head=(struct banci*)malloc(sizeof(struct banci);if(data=fopen(banci.dat,r+)=NULL)data=fopen(banci.dat,w);printf(nn建立新文件,請至少輸入一條班次記錄n);nw=addbanci(head,data,1);head=nw;else if(fread(head,sizeof(struct

17、 banci),1,data)=0)/判斷文件是否為空。fread()返回的是讀取成功的數(shù)據(jù)塊數(shù)目,返回0說明讀取失敗。若文件不為空則實現(xiàn)讀取文件printf(nn數(shù)據(jù)文件是空的,請至少輸入一條班次記錄n);nw=addbanci(head,data,1);head=nw;elsenw=head;while(1) /把整個鏈表從文件中讀出來,同時獲取目前的班次總數(shù)serial+;/if(nw-next=NULL) break; /這么判斷結(jié)尾時不可行的,因為nw-next已經(jīng)被賦值不可能為空了nw-next=malloc(sizeof(struct banci);if(fread(nw-nex

18、t,sizeof(struct banci),1,data)=0)/逐條讀取。若遇到結(jié)尾,結(jié)束讀取nw-next=NULL;break;nw=nw-next;menu(head,nw,data,serial);void menu(struct banci *head,struct banci *nw,FILE *data,unsigned int serial)char kinput;while(1)system(cls);printf(C題目二十三: 車票管理系統(tǒng));update(head,data);printf(n 1. 瀏覽班次信息n 2. 售票 / 退票n 3. 查詢班次n 4. 退

19、出系統(tǒng)n 5. 增加班次nn);kinput=getch();switch(kinput)case 1: displaybanci(head,1);break;case 2: piao(head,data);break;case 3: searchbanci(head);break;case 4: fclose(data);exit(0);case 5: serial+;nw=addbanci(nw,data,serial); break;default:;oprate.c#include#include#include#includeoperate.hvoid update(struct b

20、anci *ut,FILE *data) /防止第二天定票人數(shù)不歸零的情況發(fā)生SYSTEMTIME nowtime;GetLocalTime(&nowtime);printf(n今天是 %d 年 %d 月 %d 日,目前讀取的時間為 %d 時 %d 分n,nowtime.wYear,nowtime.wMonth,nowtime.wDay,nowtime.wHour,nowtime.wMinute);rewind(data);for(;ut!=NULL;ut=ut-next)if(nowtime.wYear = ut-fache.wYear &nowtime.wMonth = ut-fache.

21、wMonth &nowtime.wDay = ut-fache.wDay )fseek(data,sizeof(struct banci),1);/不需要更新,則跳過這個結(jié)構(gòu)體,不寫文件elseut-fache.wYear=nowtime.wYear;ut-fache.wMonth=nowtime.wMonth;ut-fache.wDay=nowtime.wDay;ut-fache.wDayOfWeek=nowtime.wDayOfWeek;ut-yidingpiaorenshu=0;fwrite(ut,sizeof(struct banci),1,data);void displaybanc

22、i(struct banci *head, unsigned short mode) /承擔(dān)所有的鏈表顯示,有3個顯示模式SYSTEMTIME nowtime;GetLocalTime(&nowtime);printf(瀏覽班次n);printf(班次 發(fā)車時間 起點站 終點站 行車時間 額定載量 已定票人數(shù) 是否已發(fā)出n);while(head!=NULL)printf(%-4d %2d : %02d %-10s%-10s%-10.1f%-9d%-3d ,head-serial,head-fache.wHour,head-fache.wMinute,head-qidian,head-zhon

23、gdian,(float)head-shijian/60,head-edingzailiang,head-yidingpiaorenshu);if( nowtime.wHourhead-fache.wHour| (head-fache.wHour=nowtime.wHour & nowtime.wMinutehead-fache.wMinute)head-shifouyifachu=1;printf( 已發(fā)出n);head-yidingpiaorenshu=0;elsehead-shifouyifachu=0;printf( n); if (mode=1 | mode=3) /顯示全部記錄時,

24、繼續(xù)顯示 head=head-next; if (mode=2) /顯示單條記錄時,不再顯示 break;if(mode=1) getch(); /模式2和3不需要暫停,故有這個判斷struct banci * addbanci(struct banci * tail, FILE *data,unsigned serial)struct banci *newnode;newnode=(struct banci*)malloc(sizeof(struct banci);GetLocalTime(&newnode-fache); /先調(diào)出系統(tǒng)時間printf(n這是第 %d 個班次n,serial

25、);printf(輸入發(fā)車時間(小時:分鐘)n);scanf(%d:%d,&newnode-fache.wHour,&newnode-fache.wMinute);printf(輸入起點站n);scanf(%s,newnode-qidian);printf(輸入終點站n);scanf(%s,newnode-zhongdian);printf(輸入行車時間(分鐘)n);scanf(%d,&newnode-shijian);printf(輸入額定載量n);scanf(%d,&newnode-edingzailiang);newnode-yidingpiaorenshu=0;/這兩個變量由系統(tǒng)自動指

26、定無需輸入newnode-serial=serial;tail-next=newnode;/連接鏈表newnode-next=NULL;fwrite(newnode,sizeof(struct banci),1,data);/更新文件fflush(data);return newnode;void searchbanci(struct banci * head)char sinput;unsigned sserial;char szhongdian8;unsigned short label=0;printf(查詢班次nn 1. 按班次號查詢n 2. 按終點站查詢n);sinput=getch

27、();switch(sinput)case 1: printf(輸入要查詢的班次: );scanf(%d,&sserial);for(;head!=NULL;head=head-next)if(head-serial=sserial)label=1;displaybanci(head,2);break;case 2: printf(輸入要查詢的終點站: );scanf(%s,szhongdian);for(;head!=NULL;head=head-next)if(strcmp(szhongdian,head-zhongdian)=0)label=1;displaybanci(head,2);

28、break;default:;if(label=0)printf(n沒有找到或無法操作n);getch();void piao(struct banci *node,FILE *data)char pinput;unsigned int pserial;unsigned short label=0;displaybanci(node,3);printf(售票 / 退票);printf(n 1. 售票n 2. 退票n);pinput=getch();switch(pinput)case 1:printf(輸入要售票的班次號:);scanf(%d,&pserial);for(;node!=NULL;node=node-next)if(node-serial=pserial)if(node-shifouyifachu=0 & node-yidingpiaorenshuedingzailiang)node-yidingpiaorenshu+;fseek(data,(pserial-1)*sizeof(struct banci),0);fwrite(node,sizeof(struct banci),1,data);la

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論