第一篇:飛機(jī)訂票系統(tǒng)課程設(shè)計(jì)
《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告
飛機(jī)航班訂票系統(tǒng)概要設(shè)計(jì)
根據(jù)需求分析中的描述,知道需要三個(gè)struct結(jié)構(gòu)體類(lèi)型和一個(gè)class的類(lèi)
struct person //定義旅客信息結(jié)構(gòu)體類(lèi)型 { char name[50];//旅客姓名
char sex[20];//旅客性別
char id[20];//旅客身份證號(hào) char from[50];//旅客出發(fā)地
char to[50];//旅客目的地
int year;//旅客出發(fā)年
int month;//月 int day;//日
};struct fly //定義航班信息結(jié)構(gòu)體類(lèi)型 struct piao //定義訂單信息結(jié)構(gòu)體類(lèi)型 這兩個(gè)結(jié)構(gòu)體類(lèi)型和之前第一個(gè)相似。
class plane //定義一個(gè)類(lèi)--plane { public: //public表示是共有屬性,里面的東西變?yōu)楣灿械摹?duì)象外的用戶(hù)可以調(diào)用對(duì)象內(nèi)的類(lèi)型
char menu();//定義 各種成員函數(shù)
void set();//**********************旅客信息添加修改刪除函數(shù)聲明
void AddPer();//旅客 增加信息
void chp();//旅客 修改信息
void dep();//旅客 刪除信息 //**********************航班信息添加修改刪除函數(shù)聲明
《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告
void addf();//航班 增加信息 void chf();//航班 修改信息
void def();//航班 刪除信息 //**********************訂單信息添加修改刪除函數(shù)聲明
void addt();//訂單中 增加信息 void cht();//訂單中 修改信息
void det();//訂單中 刪除信息
//**********************按條件顯示訂單信息函數(shù)聲明
void showno();//按航班班次顯示訂單信息
void showplace();//按出發(fā)地、目的地顯示訂單信息
void showname();//按旅客姓名顯示訂單信息
void save();//保存信息 void exit();//退出界面
private:
person a[100];//定義一個(gè)用戶(hù)的數(shù)組
fly b[100];//定義一個(gè)航班的數(shù)組
piao c[100];//定義一個(gè)訂單的數(shù)組
int t;
//旅客個(gè)數(shù) int s;
//航班個(gè)數(shù)
int r;//訂單個(gè)數(shù) };三個(gè)struct結(jié)構(gòu)體類(lèi)型中用于存放數(shù)據(jù),在private中定義出a[]、b[]、c[]三個(gè)數(shù)組用來(lái)存放數(shù)據(jù)。并在public中聲明出將要調(diào)用的函數(shù)。public表示是共有屬性,將里面的東西變?yōu)楣灿械?。?duì)象外的用戶(hù)也可以調(diào)用對(duì)象內(nèi)的類(lèi)型。
然后在main函數(shù)中寫(xiě)入一個(gè)switch函數(shù)用來(lái)滿(mǎn)足用戶(hù)的選擇,依照用戶(hù)的選擇來(lái)實(shí)現(xiàn)case中的函數(shù)。case中函數(shù)來(lái)實(shí)現(xiàn)用戶(hù)的需求:例如增加、修改、刪除一個(gè)旅客資料等等。
《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告
2. 詳細(xì)設(shè)計(jì)
//***********************plane創(chuàng)建一個(gè)類(lèi)m將鍵盤(pán)輸入的數(shù)據(jù)輸入進(jìn)m類(lèi)中 plane m;
//**************************從文件流之中講數(shù)據(jù)讀取************ void plane::set()
{
fstream file(“person.txt”,ios::in);//定義一個(gè)文件流,以輸入的方式打開(kāi)文件
int i=0;if(file.is_open())
//判斷文件是否打開(kāi)
{
while(!file.eof())
//判斷文件是否是最末尾端(如果不是則運(yùn)行下列代碼)
{
file>>m.a[i].name;//將名字寫(xiě)入到結(jié)構(gòu)體類(lèi)型person中
file>>m.a[i].sex;
file>>m.a[i].id;
file>>m.a[i].from;
file>>m.a[i].to;
file>>m.a[i].year>>m.a[i].month>>m.a[i].day;
if(!file.eof())//判斷文件是否是最末尾端
i++;
//不是的話i+1
}
m.t=i;
file.close();} fstream file2(“fly.txt”,ios::in);
//file2 3類(lèi)似 fstream file3(“piao.txt”,ios::in);//***************************講變量名中的數(shù)據(jù)輸入到文件流之中 void plane::save(){
//*******************************將數(shù)據(jù)輸入到person文件中
fstream file(“person.txt”,ios::out | ios::trunc);/*out以輸出方式打開(kāi)一個(gè)文件
trunc打開(kāi)一個(gè)文件要是存在則刪除其中全部數(shù)據(jù) 若不存在則建立新文件*/
if(file.is_open())//講變量名之中的數(shù)據(jù)輸入到file中
{
for(int i=0;i file< file< file< 《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告 file< file< file< file< file< file.close(); } fstream file2(“fly.txt”,ios::out | ios::trunc); //file2 3類(lèi)似 fstream file3(“piao.txt”,ios::out | ios::trunc); //******************************定義一個(gè)menu char plane::menu() { int k; cout<<“*************************飛 機(jī) 航 班 訂 票 系 統(tǒng)**********************”< cout<<“ 1.增加一個(gè)旅客信息 ”< cout<<“ 2.修改一個(gè)旅客信息 ”< cout<<“ 3.刪除一個(gè)旅客信息 ”< cout<<“ 4.增加一個(gè)航班信息 ”< cout<<“ 5.修改一個(gè)航班信息 ”< cout<<“ 6.刪除一個(gè)航班信息 ”< cout<<“ 7.增加一個(gè)訂單信息 ”< cout<<“ 8.修改一個(gè)訂單信息 ”< cout<<“ 9.刪除一個(gè)訂單信息 ”< cout<<“ 10.按班次顯示訂單資料 ”< cout<<“ 11.按航班線路顯示訂單資料 ”< cout<<“ 12.按旅客姓名顯示訂單資料 ”< cout<<“請(qǐng)輸入您要選擇的功能序號(hào):”; cin>>k; return k; //將用戶(hù)選擇的K值返回到主函數(shù)中賦值給R以此選擇case } //*****************************添加旅客信息—從鍵盤(pán)中將數(shù)據(jù)輸入到一個(gè)變量名之中 void plane::AddPer() { char choice;//choice用來(lái)判斷y/n for(int i=m.t;i<100;i++) { //**************添加旅客信息 cout<<“添加旅客信息--姓名:”; cin>>m.a[i].name; cout<<“添加旅客信息--性別:”; cin>>m.a[i].sex; cout<<“添加旅客信息--身份證:”; cin>>m.a[i].id; cout<<“添加旅客信息--出發(fā)地:”; cin>>m.a[i].from; cout<<“添加旅客信息--目的地:”; cin>>m.a[i].to; cout<<“添加旅客信息--出發(fā)年:”; cin>>m.a[i].year; 《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告 cout<<“添加旅客信息--出發(fā)月:”; cin>>m.a[i].month; cout<<“添加旅客信息--出發(fā)日:”; cin>>m.a[i].day; m.t++; cout<<“一位旅客新信息輸入完成,還要繼續(xù)添加新的旅客信息么(y/n)?”; while(1) { cin>>choice; if(choice=='y'||choice=='n') //邏輯或 如果是y或者n則跳出while函數(shù) break; else cout<<“輸入錯(cuò)誤!請(qǐng)重新輸入!”< if(choice=='n')//如果是n的話跳出for循環(huán) break; } save(); //保存旅客信息 } //************************改變旅客信息 void plane::chp(){ char J[100];//定義一個(gè)數(shù)組J用于修改旅客身份證號(hào)(利用id號(hào)來(lái)進(jìn)行修改) cout<<“請(qǐng)輸入要修改的旅客身份證號(hào):”; cin>>J; for(int i=0;i if(strcmp(m.a[i].id,J)==0) //將已有的旅客id號(hào)和剛輸入的id號(hào)進(jìn)行比較 break; if(i==m.t) { cout<<“輸入錯(cuò)誤,沒(méi)有此航班!”< return; } //********************輸出修改內(nèi)容 進(jìn)行修改 cout<<“請(qǐng)輸入旅客的姓名:”; cin>>m.a[i].name; cout<<“請(qǐng)輸入旅客的性別:”; cin>>m.a[i].sex; cout<<“請(qǐng)輸入旅客的身份證號(hào):”; cin>>m.a[i].id; cout<<“請(qǐng)輸入旅客的出發(fā)地:”; cin>>m.a[i].from; cout<<“請(qǐng)輸入旅客的目的地:”; cin>>m.a[i].to; cout<<“請(qǐng)輸入旅客的出發(fā)年:”; cin>>m.a[i].year; cout<<“請(qǐng)輸入旅客的出發(fā)月:”; cin>>m.a[i].month; cout<<“請(qǐng)輸入旅客的出發(fā)日:”; cin>>m.a[i].day; save(); cout<<“修改成功!”< } //**************************刪除旅客信息 void plane::dep() 《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告 { char R[100]; cout<<“請(qǐng)輸入要?jiǎng)h除的旅客身份證:”;cin>>R; for(int i=0;i if(strcmp(m.a[i].id,R)==0) break; if(i==m.t) { cout<<“刪除錯(cuò)誤,沒(méi)有您要?jiǎng)h除的游客!”< return; } m.a[i]=m.a[m.t-1]; //將后面數(shù)組賦值到了找到的要?jiǎng)h除的數(shù)組就將那個(gè)要?jiǎng)h除的數(shù)組給刪除了 m.t--; save(); cout<<“刪除成功!”< 之后的幾個(gè)函數(shù)都相類(lèi)似。 //****************************添加航班信息 void plane::addf()//*****************************修改航班信息 void plane::chf()//*************************刪除航班信息 void plane::def()//***********************添加航班訂票信息 void plane::addt()//******************************修改訂票信息 void plane::cht()//*********************刪除訂單信息 void plane::det()//****************************按航班起飛降落城市來(lái)查詢(xún)訂單信息 void plane::showplace() { char H[100]; char E[100]; cout<<“請(qǐng)輸入要查詢(xún)的訂單航班出發(fā)地:”; cin>>H; cout<<“請(qǐng)輸入要查詢(xún)的訂單航班目的地:”; cin>>E; for(int i=0;i //將輸入的出發(fā)和降落城市和已存在的城市想比較來(lái)找到這筆訂單 if(strcmp(m.c[i].chufadi,H)==0 && strcmp(m.c[i].mudidi,E)==0) break; if(i==m.r) { 《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告 cout<<“沒(méi)有此訂單!輸入錯(cuò)誤!”< return; } cout<<“查詢(xún)結(jié)果如下:”< for(i=0;i if(strcmp(m.c[i].chufadi,H)==0 && strcmp(m.c[i].mudidi,E)==0) { cout<<“旅客姓名:”< cout<<“旅客性別:”< cout<<“旅客身份證:”< cout<<“航班班次:”< cout<<“出發(fā)地:”< cout<<“目的地:”< cout<<“出發(fā)日期-年:”< cout<<“出發(fā)日期-月:”< cout<<“出發(fā)日期-日:”< } } //*****************************按訂單姓名來(lái)查詢(xún)訂單信息 void plane::showname()//****************************按航班班次來(lái)查詢(xún)訂單信息 void plane::showno()//***************************主函數(shù)使用switch函數(shù)來(lái)選擇各個(gè)功能 int main(){ plane p; //plane定義一個(gè)p的類(lèi) p.set(); /*面向?qū)ο蟮乃枷?以對(duì)象為載體下一個(gè)對(duì)象要干什么 執(zhí)行過(guò)程應(yīng)該封裝起來(lái) 而不是像面向過(guò)程一樣講過(guò)程代碼一步一步寫(xiě)出來(lái)*/ while(1){ int R; R=p.menu();//在menu函數(shù)中選擇case然后賦值到R中然后選擇是第幾個(gè)case switch(R) { case 1:p.AddPer(); break; case 2:p.chp(); break; case 3:p.dep(); break; case 4:p.addf(); break; case 5:p.chf(); break; case 6:p.def(); break; case 7:p.addt(); break; case 8:p.cht(); break; 《銀行帳戶(hù)管理系統(tǒng)》設(shè)計(jì)報(bào)告 case 9:p.det(); break; case 10:p.showno(); break; case 11:p.showplace(); break; case 12:p.showname(); break; default:cout<<“輸入錯(cuò)誤,請(qǐng)重新輸入!”< } } return 0;} 飛機(jī)訂票系統(tǒng) 1.需求分析 描述要求編程解決的問(wèn)題。以無(wú)歧義的陳述說(shuō)明程序設(shè)計(jì)的任務(wù),強(qiáng)調(diào)的是程序要做什么?明確規(guī)定: (a)輸入的形式和輸入值的范圍; (b)輸出的形式; (c)程序所能達(dá)到的功能; (d)測(cè)試數(shù)據(jù):包括正確的輸入及其輸出結(jié)果和含有錯(cuò)誤的輸入及其輸出結(jié)果。 2.概要設(shè)計(jì) 給出程序要達(dá)到的具體的要求。描述解決相應(yīng)問(wèn)題算法的設(shè)計(jì)思想。描述所設(shè)計(jì)程序的各個(gè)模塊(即函數(shù))功能。說(shuō)明本程序中用到的所有抽象數(shù)據(jù)類(lèi)型的定義、主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系。 3.詳細(xì)設(shè)計(jì) 實(shí)現(xiàn)概要設(shè)計(jì)中定義的所有數(shù)據(jù)類(lèi)型,對(duì)每個(gè)操作只需要寫(xiě)出流程或偽碼算法;對(duì)主程序和其他模塊也都需要寫(xiě)出流程或偽碼算法(偽碼算法達(dá)到的詳細(xì)程度建議為:按照偽碼算法可以在計(jì)算機(jī)鍵盤(pán)直接輸入高級(jí)程序設(shè)計(jì)語(yǔ)言程序);畫(huà)出函數(shù)的調(diào)用關(guān)系圖。給出所使用的基本抽象數(shù)據(jù)類(lèi)型,所定義的具體問(wèn)題的數(shù)據(jù)類(lèi)型,以及新定義的抽象數(shù)據(jù)類(lèi)型。設(shè)計(jì)出良好的輸入輸出界面(清晰易懂)。 4.調(diào)試分析 內(nèi)容包括: (a)調(diào)試過(guò)程中遇到的問(wèn)題是如何解決的以及對(duì)設(shè)計(jì)與實(shí)現(xiàn)的回顧討論和分析; (b)算法的時(shí)空分析(包括基本操作和其他算法的時(shí)間復(fù)雜度和空間復(fù)雜度的分析)和改進(jìn)設(shè)想; (c)經(jīng)驗(yàn)和體會(huì)等。 5.用戶(hù)使用說(shuō)明 說(shuō)明如何使用你編寫(xiě)的程序,詳細(xì)列出每一步的操作步驟。 6.測(cè)試結(jié)果 設(shè)計(jì)測(cè)試數(shù)據(jù),或具體給出測(cè)試數(shù)據(jù)。要求測(cè)試數(shù)據(jù)能全面地測(cè)試所設(shè)計(jì)程序的功能。列出你的測(cè)試結(jié)果,包括輸入和輸出。這里的測(cè)試數(shù)據(jù)應(yīng)該完整和嚴(yán)格,最好多于需求分析中所列。 7.測(cè)試情況:給出程序的測(cè)試情況,并分析運(yùn)行結(jié)果 附錄(非必須,按照需要添加) 帶注釋的源程序??梢灾涣谐龀绦蛭募那鍐?。 需求分析 任務(wù):通過(guò)此系統(tǒng)可以實(shí)現(xiàn)如下功能: 錄入: 可以錄入航班情況(數(shù)據(jù)可以存儲(chǔ)在一個(gè)數(shù)據(jù)文件中,數(shù)據(jù)結(jié)構(gòu)、具體數(shù)據(jù)自定) 查詢(xún): 可以查詢(xún)某個(gè)航線的情況(如,輸入航班號(hào),查詢(xún)起降時(shí)間,起飛抵達(dá)城市,航班票價(jià),票價(jià)折扣,確定航班是否滿(mǎn)倉(cāng)); 可以輸入起飛抵達(dá)城市,查詢(xún)飛機(jī)航班情況; 訂票:(訂票情況可以存在一個(gè)數(shù)據(jù)文件中,結(jié)構(gòu)自己設(shè)定)可以訂票,如果該航班已經(jīng)無(wú)票,可以提供相關(guān)可選擇航班; 退票: 可退票,退票后修改相關(guān)數(shù)據(jù)文件; 客戶(hù)資料有姓名,證件號(hào),訂票數(shù)量及航班情況,訂單要有編號(hào)。 概要設(shè)計(jì) 詳細(xì)設(shè)計(jì) 詳列函數(shù) void list(){ struct airline *info; int i=0; info=start; printf(“起點(diǎn)城市t終點(diǎn)城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”); while(i { display(info); info++; i++; } printf(“nn”);} 查詢(xún)函數(shù) void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“請(qǐng)輸入要起飛城市的名稱(chēng):”); scanf(“%s”,qiname); printf(“請(qǐng)輸入要抵達(dá)城市的名稱(chēng):”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“沒(méi)有這條航線!n”); } else { printf(“起飛城市t降落城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“請(qǐng)輸入航班號(hào):”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“沒(méi)有這條航線!n”); return NULL;} 訂票函數(shù) void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“請(qǐng)輸入您的起飛城市:”); scanf(“%s”,qiname); printf(“請(qǐng)輸入您的降落城市:”); scanf(“%s”,jiangname); printf(“請(qǐng)輸入您需要的票數(shù):”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); printf(“請(qǐng)輸入您的身份證號(hào):”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息為:n”); display(info); for(i=0;i { printf(“%s的座位號(hào)是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“訂票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } 退票函數(shù) void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您沒(méi)有訂過(guò)票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} 存儲(chǔ)結(jié)構(gòu) typedef struct passenger { char name[10]; int tickets; char id[30]; struct passenger *next;} linklist;typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo;調(diào)試分析 查看航線信息 查詢(xún)航線 ① 輸入起飛城市 ② 輸入抵達(dá)城市 ③ 輸出航班信息 辦理訂票業(yè)務(wù) ① 查詢(xún)符合的航班 ② 查詢(xún)余票量 ③ 輸出航班信息 辦理退票業(yè)務(wù) 源代碼 #include char name[10]; int tickets; char id[30]; struct passenger *next;} linklist; typedef struct airline { char qi_name[10]; char jiang_name[10]; char air_num[10]; char qi_time[10]; char jiang_time[10]; int ticket_all; int ticket_left; linklist *order;} lineinfo; struct airline *start; void display(struct airline *info){ printf(“%st %10st %10st %10st %10st %5dt %5dn”,info->qi_name,info->jiang_name,info->air_num,info->qi_time,info->jiang_time,info->ticket_all,info->ticket_left);} void list(){ struct airline *info; int i=0; info=start; printf(“起點(diǎn)城市t終點(diǎn)城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”); while(i { display(info); info++; i++; } printf(“nn”);} void search(){ struct airline *info,*find(); char qiname[10]; char jiangname[10]; int i=0; info=start; printf(“請(qǐng)輸入要起飛城市的名稱(chēng):”); scanf(“%s”,qiname); printf(“請(qǐng)輸入要抵達(dá)城市的名稱(chēng):”); scanf(“%s”,jiangname); while(i { if(!strcmp(jiangname,info->jiang_name)) { break; } info++; i++; } if(i>=MAXSIZE) { printf(“沒(méi)有這條航線!n”); } else { printf(“起飛城市t降落城市t航班號(hào)t起飛時(shí)間t降落時(shí)間t總票數(shù)t余票數(shù)n”); display(info); } } struct airline *find(){ struct airline *info; char number[10]; int i=0; info=start; printf(“請(qǐng)輸入航班號(hào):”); scanf(“%s”,number); while(i { if(!strcmp(number,info->air_num)) { return info; } info++; i++; } printf(“沒(méi)有這條航線!n”); return NULL;} linklist *insertlink(linklist *head,int amount,char name[],char id[]){ linklist *p1,*new1; p1=head; new1=(linklist*)malloc(sizeof(linklist)); strcpy(new1->name,name); new1->tickets=amount; new1->next=NULL; strcpy(new1->id,id); if(head==NULL) { head=new1; new1->next=NULL; } else { while(p1->next!=NULL) p1=p1->next; p1->next=new1; } return head;} void order(){ struct airline *info; char qiname[10]; char jiangname[10]; int amount; char name[10]; char id[30]; info=start; printf(“請(qǐng)輸入您的起飛城市:”); scanf(“%s”,qiname); printf(“請(qǐng)輸入您的降落城市:”); scanf(“%s”,jiangname); printf(“請(qǐng)輸入您需要的票數(shù):”); scanf(“%d”,&amount); int i=1; while(i<5) { if(!strcmp(info->qi_name,qiname)&&!strcmp(info->jiang_name,jiangname)) { if(amount<=info->ticket_left) { int i; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); printf(“請(qǐng)輸入您的身份證號(hào):”); scanf(“%s”,id); info->order=insertlink(info->order,amount,name,id); printf(“您的航班信息為:n”); display(info); for(i=0;i { printf(“%s的座位號(hào)是:%dn”,name,info->ticket_all-info->ticket_left+i+1); } info->ticket_left-=amount; printf(“訂票成功!n”); break; } else { info++; i++; } } else { info++; i++; } } } void returnticket(){ struct airline *info; linklist *p1,*p2,*head; char name[10]; if(!(info=find())) { return; } head=info->order; p1=head; printf(“請(qǐng)輸入您的姓名:”); scanf(“%s”,name); while(p1!=NULL) { if(!strcmp(name,p1->name)) { break; } p2=p1; p1=p1->next; } if(p1==NULL) { printf(“您沒(méi)有訂過(guò)票!n”); return; } else { if(p1==head) { head=p1->next; } else { p2->next=p1->next; } info->ticket_left+=p1->tickets; printf(“%s退票成功!n”,p1->name); free(p1); } info->order=head;} int menu_select(){ int c; char s[20]; printf(“ 訂票系統(tǒng)n”); printf(“-------------n”); printf(“ 1.查看航線信息 printf(” 2.查詢(xún)航線 printf(“ 3.辦理訂票業(yè)務(wù) printf(” 4.辦理退票業(yè)務(wù) printf(“ 5.退出系統(tǒng) printf(”-------------n“); do { printf(”請(qǐng)選擇(1-5):“); scanf(”%s“,s); c=atoi(s); } while(c<1||c>6); return c; n”);n“);n”);n“); n”); } int main(){ struct airline air[MAXSIZE]= { {“harbin”,“beijing”,“1”,“12:00”,“14:00”,30,30},{“harbin”,“shanghai”,“2”,“10:00”,“13:00”,20,20},{“harbin”,“beijing”,“3”,“13:30”,“10:00”,50,50},{“harbin”,“guangzhou”,“4”,“17:00”,“21:00”,50,50},{“harbin”,“dalian”,“5”,“14:00”,“17:00”,40,40} }; start=air; while(1) { system(“cls”); switch(menu_select()) { case 1: list(); break; case 2: search(); break; case 3: order(); break; case 4: returnticket(); break; case 5: exit(0); } getch(); } } 經(jīng)驗(yàn)體會(huì) 1、通過(guò)設(shè)計(jì)飛機(jī)訂票系統(tǒng),加深了對(duì)鏈表的運(yùn)用和理解。 2、通過(guò)多組測(cè)試數(shù)據(jù),發(fā)現(xiàn)了程序的問(wèn)題,并做了調(diào)整、3、通過(guò)設(shè)計(jì)選擇菜單,對(duì)選擇結(jié)構(gòu)有更深刻的了解。 飛機(jī)訂票系統(tǒng) 1.概述(設(shè)計(jì)題目與可行性分析) 1.1設(shè)計(jì)題目:飛機(jī)訂票系統(tǒng) 1.2可行性分析 飛機(jī)訂票系統(tǒng)是為機(jī)場(chǎng)工作人員和客戶(hù)提供訂票退票等與機(jī)票相關(guān)內(nèi)容的管理系統(tǒng),方便機(jī)場(chǎng)工作人員對(duì)機(jī)票的管理,以提高機(jī)場(chǎng)工作人員對(duì)機(jī)票管理工作的效率。當(dāng)前飛機(jī)訂票問(wèn)題:手工訂票所產(chǎn)生的客座率低。而我們的目標(biāo)是:建立一個(gè)飛機(jī)訂票系統(tǒng)數(shù)據(jù)庫(kù)。 1.2.1研究現(xiàn)有系統(tǒng),畫(huà)現(xiàn)有系統(tǒng)的流程圖 了解當(dāng)前系統(tǒng)能夠完成的功能及組成 航班管理:票據(jù)管理 售票點(diǎn):直接面向用戶(hù) 航班管理 票據(jù)管理 票庫(kù) 訂票庫(kù) 訂票管理 出售管理 打印機(jī)票 售票點(diǎn)1 售票點(diǎn)n 現(xiàn)有系統(tǒng):票據(jù)都分布在各個(gè)售票點(diǎn) 1.2.2導(dǎo)出新系統(tǒng)的高層邏輯結(jié)構(gòu) 數(shù)據(jù)流圖的基本符號(hào): 數(shù)據(jù)源/終點(diǎn)(人機(jī)界面): 加工處理: 文件名 文件: 數(shù)據(jù)流名 數(shù)據(jù)流: 票價(jià)信息 機(jī)票 查訂票號(hào) 訂票處理 客戶(hù)信息 出票處理 訂票記錄 顧客 訂票信息 訂票號(hào) 庫(kù)存信息 票價(jià)信息 票價(jià)管理 航班管理 航班信息 操作員 航班信息 保存 新系統(tǒng)的數(shù)據(jù)流圖: 說(shuō)明:流向文件的數(shù)據(jù)流的名可以省略 1.2.3可行性分析報(bào)告 隨著Internet的迅速發(fā)展和用戶(hù)數(shù)量的急劇增加,互聯(lián)網(wǎng)對(duì)于企業(yè)和事業(yè)單位的運(yùn)營(yíng)和發(fā)展日益重要,網(wǎng)上交易也逐漸被人們認(rèn)可,并成為未來(lái)交易的發(fā)展方向。在這種情況下,很多原有的C/S模式的系統(tǒng)也逐步向B/S模式靠攏,飛機(jī)訂票系統(tǒng)也不例外。 飛機(jī)訂票系統(tǒng)是飛機(jī)旅游服務(wù)信息系統(tǒng)的一個(gè)重要組成部分。為旅客提供優(yōu)質(zhì)便捷的服務(wù),為了提高飛機(jī)客運(yùn)的售票效率,豐富飛機(jī)客運(yùn)的營(yíng)銷(xiāo)手段,飛機(jī)售票總站的下屬代售點(diǎn)可以通過(guò)公用的互聯(lián)網(wǎng)資源,建立數(shù)據(jù)庫(kù),實(shí)現(xiàn)網(wǎng)上的售票,查詢(xún)及管理工作。 2.系統(tǒng)目標(biāo)和設(shè)計(jì)原則 2.1系統(tǒng)目標(biāo): 建立一個(gè)飛機(jī)訂票系統(tǒng)數(shù)據(jù)庫(kù)。 2.1.1系統(tǒng)簡(jiǎn)介: 本系統(tǒng)是專(zhuān)為乘坐飛機(jī)的旅客準(zhǔn)備的,旅客只需把自己的信息(姓名.性別.工作單位.身份證號(hào).旅行時(shí)間.旅行目的地)預(yù)先交給旅行社,旅行社就可以將信息輸入本系統(tǒng),系統(tǒng)就可以為旅客安排航班,打印出取票通知和帳單。旅客只要在飛機(jī)起飛的前一天憑取票通知單和帳單交款取單,系統(tǒng)校對(duì)無(wú)誤即印出機(jī)票給旅客。 2.2設(shè)計(jì)原則 2.2.1根據(jù)實(shí)際情況考慮三種可行性 技術(shù)可行性、經(jīng)濟(jì)可行性、操作可行性 2.2.2提出侯選方案、提出各種各樣的實(shí)現(xiàn)方案 主機(jī)(純主機(jī)型、C/S型)、開(kāi)發(fā)環(huán)境、網(wǎng)絡(luò)方案、對(duì)提出的每個(gè)方案進(jìn)行成本估計(jì) 硬件、軟件費(fèi)用投資(根據(jù)各公司的報(bào)價(jià))開(kāi)發(fā)成本估計(jì)(任務(wù)估算法) 運(yùn)行費(fèi)用、投資回收期 純收入:通過(guò)本系統(tǒng)的運(yùn)行、投資回收后的收入 3、描述推薦理由:分別從技術(shù)、經(jīng)濟(jì)、用戶(hù)、投資方的不同角度考慮 3.支撐環(huán)境規(guī)劃 3.1整體系統(tǒng)運(yùn)作圖 3.2運(yùn)行環(huán)境 服務(wù)器:硬件配置:CPU Intel P4 1.2G以上 內(nèi)存256 硬盤(pán) 80G以上 軟件配置:Windows 2000/2003 SERVER SQL SERVER 2000 4.系統(tǒng)功能結(jié)構(gòu) 1、錄入:可以錄入航班情況(數(shù)據(jù)可以存儲(chǔ)在一個(gè)數(shù)據(jù)文件中,數(shù)據(jù)結(jié)構(gòu)、具體數(shù)據(jù)自定) 2、查詢(xún):可以查詢(xún)某個(gè)航線的情況(如,輸入航班號(hào),查詢(xún)起降時(shí)間,起飛抵達(dá)城市,航班票價(jià),票價(jià)折扣,確定航班是否滿(mǎn)倉(cāng));可以輸入起飛抵達(dá)城市,查詢(xún)飛機(jī)航班情況; 3、訂票:(訂票情況可以存在一個(gè)數(shù)據(jù)文件中,結(jié)構(gòu)自己設(shè)定)可以訂票,如果該航班已經(jīng)無(wú)票,可以提供相關(guān)可選擇航班; 4、退票:可退票,退票后修改相關(guān)數(shù)據(jù)文件; 客戶(hù)資料有姓名,證件號(hào),訂票數(shù)量及航班情況,訂單要有編號(hào)。 5、修改航班信息:當(dāng)航班信息改變可以修改航班數(shù)據(jù)文件。 5.數(shù)據(jù)庫(kù)設(shè)計(jì) 5.1概念結(jié)構(gòu)設(shè)計(jì) E-R圖如下: 5.2邏輯結(jié)構(gòu)設(shè)計(jì) 1.航空公司表:AIRLINE 2.客戶(hù)表CUSTOMER 3、飛機(jī)表PLANE 4.航線表LINE 5.航班表FLIGHT 6.訂票表BOOKTICKET 5.3實(shí)現(xiàn)設(shè)計(jì) 實(shí)現(xiàn)以下操作: 1、注冊(cè)航空公司: 2、增加飛機(jī): 3、增加航線: 4、增加航班: 5、增加客戶(hù): 6、建立一個(gè)訂票的存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程名為Book_Ticket,請(qǐng)完成以下存儲(chǔ)過(guò)程,實(shí)現(xiàn)訂票的操作: a)指定要訂的航班號(hào)(HID)及客戶(hù)的編號(hào)(KID); b)先查看客戶(hù)是否為特殊客戶(hù),如果不是,票價(jià)不打折扣; c)否則如果客戶(hù)航程超過(guò)5萬(wàn)公里,票價(jià)7折,超過(guò)15萬(wàn)公里,票價(jià)打5折; d)查看客戶(hù)訂票以后,所有乘客的票數(shù)是否超過(guò)總的座位數(shù),如果超過(guò),回滾訂票操作; e)要求在操作過(guò)程中使用到事務(wù)技術(shù)。 CREATE PROCEDURE Book_ticket @HID VARCHAR(20) @HID VARCHAR(20) AS DECLARE @TRANS_NAME VARCHAR(20)select @TRANS_NAME=’ ’ BEGIN TRANSACTION DECLARE @Bookid int,@seats int,@IsSpec char(1)/*定義訂票里程DIST、折扣率discount、總的訂票里程distance、票價(jià)PRICE(實(shí)型)*/ select @Isspec=Isspec,@distance=Points FROM Customer where select @discount=1 IF @ BEGIN END /*選擇出票價(jià)*/ SELECT @PRICE=PRICE FROM FLIGHT WHERE /*加入客戶(hù)訂票信息*/ /*將客戶(hù)新訂票里程的信息累計(jì)到用戶(hù)信息里面*/ UPDATE SET WHERE /*查看客戶(hù)訂票后,是否超過(guò)可容納的座位數(shù)目,如果超過(guò),取消所有操作*/ SELECT booked=count(*)FROM WHERE FID= /*查看額定座位容量*/ SELECT @seats=seatsnum FROM WHERE IF @BOOKED>@SEATS ELSE COMMIT TRANSACTION GO 7.運(yùn)行這個(gè)訂票操作的存儲(chǔ)過(guò)程(自己設(shè)定客戶(hù)及航班) book_ticket , 8.事務(wù)運(yùn)行成功后,再顯示各表的數(shù)據(jù),按表分別寫(xiě)出來(lái)。 6.總體實(shí)施計(jì)劃 6.1可行性研究: 研究現(xiàn)有系統(tǒng),畫(huà)現(xiàn)有系統(tǒng)的流程圖,編寫(xiě)可行性分析報(bào)告 6.2進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì): 概念結(jié)構(gòu)設(shè)計(jì),邏輯結(jié)構(gòu)設(shè)計(jì),實(shí)現(xiàn)設(shè)計(jì) 6.3概要設(shè)計(jì): 從數(shù)據(jù)流圖導(dǎo)出初始結(jié)構(gòu)圖,設(shè)計(jì)優(yōu)化 6.4詳細(xì)設(shè)計(jì): 結(jié)構(gòu)化的程序設(shè)計(jì),采用流程圖的形式 6.5保密設(shè)計(jì) 1.每個(gè)用戶(hù)需要注冊(cè)才能進(jìn)入航空訂票信息系統(tǒng),并進(jìn)行網(wǎng)上訂票的。用戶(hù)必須 用自己真實(shí)的身份進(jìn)行注冊(cè)。 2.系統(tǒng)要另外在備一份數(shù)據(jù)庫(kù),防止系統(tǒng)出現(xiàn)錯(cuò)誤而使數(shù)據(jù)信息丟失的可能性。 3.系統(tǒng)要安裝防火墻,防止黑客入侵破壞系統(tǒng)。還有就是安裝殺毒軟件,防止 病毒入侵而導(dǎo)致系統(tǒng)癱瘓。 6.6維護(hù)設(shè)計(jì) 系統(tǒng)設(shè)置提供管理員操作頁(yè)面: 1.提供管理員密碼,方便維護(hù)操作.2.固定時(shí)間對(duì)系統(tǒng)進(jìn)行維護(hù)和檢測(cè).3.若系統(tǒng)出現(xiàn)癱瘓時(shí),可出動(dòng)備用系統(tǒng)維持運(yùn)轉(zhuǎn).4.定期對(duì)系統(tǒng)進(jìn)行更新整頓清空.7.總結(jié) 這次數(shù)據(jù)庫(kù)課程設(shè)計(jì)的“飛機(jī)訂票系統(tǒng)”,通過(guò)近一周的上機(jī)操作,充分應(yīng)用了所學(xué)的數(shù)據(jù)庫(kù)的知識(shí),并去圖書(shū)館查閱了一些書(shū)集和上網(wǎng)搜索一部分相當(dāng)資料,粗略設(shè)計(jì)出該系統(tǒng)??傮w上來(lái)說(shuō),這次課程設(shè)計(jì)還是比較成功的,充分運(yùn)用了所學(xué)的軟件工程設(shè)計(jì)、數(shù)據(jù)庫(kù)的設(shè)計(jì),設(shè)計(jì)出E-R圖、流程圖、數(shù)據(jù)庫(kù)基本表,從整體規(guī)劃出了系統(tǒng)的運(yùn)行環(huán)境和系統(tǒng)實(shí)現(xiàn)的功能。 當(dāng)然,由于學(xué)藝不精,在課程設(shè)計(jì)的過(guò)程也碰到的一些問(wèn)題。其中,畫(huà)E-R圖時(shí),各實(shí)體中的關(guān)系的確定,由于對(duì)系統(tǒng)還不夠了解而找不到一個(gè)準(zhǔn)確的詞來(lái)形容;總體規(guī)劃時(shí),材料太多,不易整理;相關(guān)數(shù)據(jù)庫(kù)技術(shù)方面沒(méi)有多注意,這次課程設(shè)計(jì)的重點(diǎn)只在對(duì)整個(gè)系統(tǒng)的總體思路設(shè)計(jì)。 其實(shí)這些通過(guò)最近的課程設(shè)計(jì)覺(jué)得最重要一點(diǎn)就是:我們一定要自己動(dòng)手,這樣才能真正的學(xué)到東西。書(shū)本知識(shí)固然重要,但我們更要學(xué)會(huì)將書(shū)本知識(shí)應(yīng)用到實(shí)際的工作中。實(shí)踐中才會(huì)發(fā)現(xiàn)錯(cuò)誤,也才能改進(jìn),才能達(dá)到學(xué)習(xí)的最終目的。 最后感謝在這次課程設(shè)計(jì)中幫助過(guò)我的老師,同學(xué)!8.參考文獻(xiàn) 物流信息系統(tǒng) 趙剛 四川大學(xué)人民出版社 2002/9 物流信息管理 尹濤 東北財(cái)經(jīng)大學(xué)出版社 2005/1 數(shù)據(jù)庫(kù)系統(tǒng)概論 王珊 薩師煊 高等教育出版社 2006/5 數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用-Access2000篇 郭力平人民郵電出版社 2002/8 軟件設(shè)計(jì)師教程 陳平禇華 清華大學(xué)出版社 2006/6 文章引用自: #include //包含access函數(shù)的頭文件 #define N 9999 //定義最多的航班數(shù) #define PRINT “%dtt%stt%stt星期%stt%dn ”,s[i].num,s[i].start,s[i].over,s[i].time,s[i].count //宏定義輸出格式 struct air //定義結(jié)構(gòu)體數(shù)組 { int num; //定義航班號(hào) char start[20];//航班起始站 char over[20];//終點(diǎn)站 char time[10];//飛行時(shí)間 int count; //機(jī)票數(shù)量 }s[N]; int i,m=0; //定義全局變量 char ii[10]; void add();//函數(shù)聲明增加航班信息函數(shù) void print(); //顯示航班信息 void search();//查找航班信息 void dingpiao();//訂票業(yè)務(wù) void tuipiao();//退票 void read();//讀取文件 void save();//保存文件 void output();//輸出格式 void paixu();//航班排序 void chushihua();//系統(tǒng)初始化 void build();//建立數(shù)據(jù)文件 void paixu1();//按航班號(hào)從小到大排序 void paixu2();//從大到小 void main()//主函數(shù) { int j; chushihua();//系統(tǒng)初始化判斷是否存在原始數(shù)據(jù)文件 printf(“ 歡迎使用飛機(jī)訂票系統(tǒng)n”);//打印出系統(tǒng)主界面 do { printf(“================================== ”); printf(“1.增加航班信息n” “t2.瀏覽航班信息n” “tt3.查找航班信息(按航班號(hào))tt╮(╯_╰)╭n” “ttt4.航班排序(按航班號(hào))n” “tttt5.訂票業(yè)務(wù)n” “to(︶︿︶)ottt6.退票業(yè)務(wù)n” “tttttt0.退出n”);printf(“================================== ”); printf(“請(qǐng)?jiān)?-6中選擇以回車(chē)鍵結(jié)束: ”);scanf(“%d”,&j);switch(j){ case 1: add();//調(diào)用增加航班函數(shù) break; case 2:print();//調(diào)用顯示模塊 break; case 3:search();//調(diào)用查找模塊 break; case 4:paixu();//調(diào)用排序函數(shù) break; case 5:dingpiao();//調(diào)用訂票模塊 break; case 6:tuipiao();//調(diào)用退票模塊 break; case 0: //退出系統(tǒng) save(); printf(“謝謝使用,再見(jiàn)!”); break;} }while(j!=0);//判斷是否調(diào)用其他函數(shù) } void chushihua()//定義系統(tǒng)初始化函數(shù) { if(access(“hangban.dat”,0)){ build();} else read();} void build()//定義建立數(shù)據(jù)文件函數(shù) { FILE *fp;//定義文件指針 if((fp=fopen(“hangban.dat”,“wb”))==NULL)//打開(kāi)文件并判定是否出錯(cuò) { printf(“創(chuàng)建文件失敗!”);//打印出錯(cuò)提示 getchar(); return;} printf(“請(qǐng)依次輸入航班信息(以回車(chē)鍵結(jié)束):n”); //打印提示信息 printf(“------------n”);for(i=0;i printf(“請(qǐng)輸入航班號(hào): ”); scanf(“%d”,&s[i].num);//輸入航班號(hào) printf(“請(qǐng)輸入起始站: ”); scanf(“%s”,s[i].start);//輸入起始站 printf(“請(qǐng)輸入終點(diǎn)站: ”); scanf(“%s”,s[i].over);//輸入終點(diǎn)站 printf(“請(qǐng)輸入時(shí)間(星期幾): ”); scanf(“%s”,s[i].time);//輸入時(shí)間 printf(“請(qǐng)輸入機(jī)票數(shù): ”); scanf(“%d”,&s[i].count);//輸入機(jī)票數(shù) fwrite(&s[i],sizeof(struct air),1,fp); m++; printf(“添加完畢,是否繼續(xù)添加?請(qǐng)鍵入y或n以回車(chē)鍵結(jié)束:”); scanf(“%s”,ii); if(strcmp(ii,“y”)!=0) //判斷是否繼續(xù)添加航班信息 { fclose(fp); //關(guān)閉文件 return; } } } void read() //定義讀取文件函數(shù) { FILE *fp;if((fp=fopen(“hangban.dat”,“r”))==NULL){ printf(“創(chuàng)建文件失敗!”); getchar(); return;} i=0;while(!feof(fp)){ fread(&s[i],sizeof(struct air),1,fp);//逐塊讀取數(shù)據(jù) i++; m++;//計(jì)算存在航班數(shù) } m--;fclose(fp);} void save()//定義保存函數(shù) { FILE *fp;if((fp=fopen(“hangban.dat”,“wb”))==NULL) { printf(“創(chuàng)建文件失敗!”); getchar(); return;} for(i=0;i //逐塊保存數(shù)據(jù) fwrite(&s[i],sizeof(struct air),1,fp);fclose(fp);} void add()//定義增加航班信息函數(shù) { do{ printf(“請(qǐng)依次輸入您要增加的航班信息(以回車(chē)鍵結(jié)束): n”); //打印提示信息 printf(“------------n”); printf(“請(qǐng)輸入航班號(hào): ”); scanf(“%d”,&s[m].num);//讀取航班號(hào) printf(“請(qǐng)輸入起始站: ”); scanf(“%s”,s[m].start);//讀取起始站 printf(“請(qǐng)輸入終點(diǎn)站: ”); scanf(“%s”,s[m].over);//讀取終點(diǎn)站 printf(“請(qǐng)輸入時(shí)間: ”); scanf(“%s”,s[m].time);//讀取時(shí)間 printf(“請(qǐng)輸入機(jī)票數(shù): ”); scanf(“%d”,&s[m].count);//讀取機(jī)票數(shù) m++; printf(“添加完畢,是否繼續(xù)添加?請(qǐng)鍵入y或n以回車(chē)鍵結(jié)束:”); scanf(“%s”,ii);}while(!strcmp(ii,“y”));//判斷是否繼續(xù)添加 } void output()//定義輸出格式函數(shù) { printf(“航班號(hào)tt起始站tt終點(diǎn)站tt時(shí)間tt機(jī)票數(shù)n”);//信息標(biāo)題 for(i=0;i printf(PRINT);//打印出信息 } void print()//定義顯示航班信息函數(shù) { printf(“n目前我們有如下航班:n”);output(); //調(diào)用輸出格式函數(shù) printf(“n請(qǐng)按回車(chē)鍵返回上層菜單 ”);getchar();getchar();} void search()//定義查詢(xún)函數(shù) { int n; do { printf(“n請(qǐng)輸入航班號(hào): ”); scanf(“%d”,&n);//輸入查詢(xún)的航班號(hào) for(i=0;i { if(s[i].num==n)//按航班號(hào)判定輸出條件 { printf(“n您所查找的航班信息為:n ”); printf(“航班號(hào)tt起始站tt終點(diǎn)站tt時(shí)間tt機(jī)票數(shù) nn”); printf(PRINT);//顯示信息 printf(“n查詢(xún)完畢,按回車(chē)鍵繼續(xù)”); getchar(); getchar(); return; } } printf(“n對(duì)不起,沒(méi)有您需要的信息!n ”);printf(“是否重新查找?請(qǐng)鍵入y或n以回車(chē)鍵結(jié)束 ”);scanf(“%s”,ii);}while(!strcmp(ii,“y”));//判定是否重新查找 } void dingpiao()//定義訂票業(yè)務(wù)函數(shù) { int n;char a[10]=“y”;do { search();//調(diào)用查詢(xún)模塊 if(!strcmp(ii,“n”)) { printf(“對(duì)不起!沒(méi)有找到您所需要的航班,所以不能訂票。n”);//未查找到所需航班 printf(“n請(qǐng)按回車(chē)鍵返回上層菜單 ”); getchar(); getchar(); strcpy(ii,“n”); break; } do { printf(“請(qǐng)輸入您要訂的機(jī)票數(shù)(以回車(chē)鍵結(jié)束): ”); scanf(“%d”,&n);//輸入所訂機(jī)票數(shù) if(n<=0) //判定機(jī)票數(shù)是否出錯(cuò) { printf(“輸入錯(cuò)誤!至少需訂1張機(jī)票。n”); } else if(s[i].count==0)//判定機(jī)票是否售完 { printf(“對(duì)不起,你所選擇的航班的機(jī)票已售完!n”); break; } else if(s[i].count!=0&&s[i].count>=n)//判定機(jī)票數(shù)是否大于等于訂票數(shù) { s[i].count=s[i].count-n; printf(“訂票成功!”); break; } else if(s[i].count { printf(“對(duì)不起,你所選擇的航班只剩 %d張機(jī)票n”, s[i].count); printf(“是否需要重新輸入機(jī)票數(shù)?請(qǐng)輸入y或n以回車(chē)鍵結(jié)束: ”);//判定是否重新輸入訂票數(shù) scanf(“%s”,a); } }while(!strcmp(a,“y”)); printf(“是否需要訂其他航班的機(jī)票?請(qǐng)輸入y或n以回車(chē)鍵結(jié)束: ”); scanf(“%s”,a);}while(!strcmp(a,“y”));//判定是否繼續(xù)訂票 } void tuipiao()//定義退票函數(shù) { int n;char a[10];do { search();//調(diào)用查詢(xún)函數(shù) if(!strcmp(ii,“n”)) { printf(“對(duì)不起!沒(méi)有找到您所需要的航班,所以不能退票。n”); printf(“n請(qǐng)按回車(chē)鍵返回上層菜單 ”); getchar(); getchar(); strcpy(ii,“n”); break; } printf(“請(qǐng)輸入您要退的機(jī)票數(shù)目: ”); scanf(“%d”,&n);//輸入所退票數(shù) if(n<=0) //判定票數(shù)是否有效 printf(“輸入錯(cuò)誤!至少需退1張機(jī)票。”); else { s[i].count=s[i].count+n; printf(“退票成功!”); } printf(“是否繼續(xù)? 請(qǐng)鍵入y或n以回車(chē)鍵結(jié)束: ”);//判定是否繼續(xù)退票 scanf(“%s”,a);}while(!strcmp(a,“y”));//判定并跳出循環(huán) } void paixu()//定義排序函數(shù) { int n; printf(“n******************************************************************************** ”); printf(“1.按航班號(hào)從小到大排序n” “t2.按航班號(hào)從大到小排序n”);printf(“******************************************************************************** ”); printf(“請(qǐng)?jiān)?-2中選擇以回車(chē)鍵結(jié)束: ”);scanf(“%d”,&n);//輸入排序方式 switch(n){ case 1:paixu1();//調(diào)用從小到大排序函數(shù) break; case 2:paixu2();//調(diào)用從大到小排序函數(shù) break;} printf(“排序后的航班信息為:n”);output(); //顯示排序后航班信息 printf(“n請(qǐng)按回車(chē)鍵返回上層菜單 ”); getchar(); getchar();} void paixu1()//定義從小到大排序函數(shù) { int k,j;struct air t;for(i=0;i { k=i; for(j=i+1;j if(s[k].num>s[j].num) k=j; if(i!=k) { t=s[k]; s[k]=s[i]; s[i]=t; } } } void paixu2()//定義從大到小排序函數(shù) { } int k,j;struct air t;for(i=0;i if(s[k].num k=j;if(i!=k){ t=s[k]; s[k]=s[i]; s[i]=t;} } 軟件工程專(zhuān)業(yè)14級(jí) 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)報(bào)告 設(shè)計(jì)題目: 飛機(jī)訂票系統(tǒng) 班 級(jí): 軟 件14 姓 名: 指導(dǎo)教師: 2015年 11月20日 目錄 一、設(shè)計(jì)任務(wù)與要求........................................................1 1.1 總體目標(biāo)與任務(wù)要求................................................1 1.2 題目選擇與目的意義................................................1 1.3 所選題目的主要工作................................................1 二、需求分析..............................................................2 2.1 用戶(hù)需求分析......................................................2 2.2 功能需求分析......................................................2 2.3 系統(tǒng)需求分析......................................................2 三、概要設(shè)計(jì)..............................................................3 3.1 各模塊的算法設(shè)計(jì)說(shuō)明..............................................3 3.2 存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)說(shuō)明..................................................8 四、詳細(xì)設(shè)計(jì).............................................................10 五、源代碼...............................................................11 六、運(yùn)行結(jié)果分析.........................................................21 七、收獲與體會(huì)...........................................................28 八、主要參考資料.........................................................28 一、設(shè)計(jì)任務(wù)與要求 1.1 總體目標(biāo)與任務(wù)要求 制作一個(gè)訂票系統(tǒng),通過(guò)此系統(tǒng)可以實(shí)現(xiàn)如下功能: 1)錄入 可以錄入航班情況(數(shù)據(jù)可以存儲(chǔ)在一個(gè)數(shù)據(jù)文件中,數(shù)據(jù)結(jié)構(gòu)、具體數(shù)據(jù)自定)。2)查詢(xún) 可以查詢(xún)某個(gè)航線的情況(如,輸入航班號(hào),查詢(xún)起降時(shí)間,起飛抵達(dá)城市,航班票價(jià),票價(jià)折扣,確定航班是否滿(mǎn)倉(cāng))可以輸入起飛抵達(dá)城市,查詢(xún)飛機(jī)航班情況。3)訂票 可以訂票,如果該航班已經(jīng)無(wú)票,可以提供相關(guān)可選擇的航班(訂票情況可以存在一個(gè)數(shù)據(jù)文件中,結(jié)構(gòu)自己設(shè)定)。4)退票 可退票,退票后修改相關(guān)數(shù)據(jù)文件;客戶(hù)資料有姓名,證件號(hào),訂票數(shù)量及航班情況,訂單要有編號(hào)。5)修改航班信息 當(dāng)航班信息改變可以修改航班數(shù)據(jù)文件。 根據(jù)以上功能說(shuō)明,設(shè)計(jì)航班信息,訂票信息的存儲(chǔ)結(jié)構(gòu),設(shè)計(jì)程序完成功能。 1.2 題目選擇與目的意義 選擇這個(gè)題目的原因是,訂票系統(tǒng)在現(xiàn)實(shí)生活中應(yīng)用很廣泛,通過(guò)這個(gè)系統(tǒng)可以使訂票、退票等變得簡(jiǎn)便。與傳統(tǒng)的人工用紙、筆來(lái)記錄辦理訂票、退票等相比,使用這個(gè)系統(tǒng)也會(huì)增加工作效率。這個(gè)題目做出來(lái)的系統(tǒng)還是比較實(shí)用的,所以我選擇了訂票系統(tǒng)這個(gè)題目。 完成此系統(tǒng),需要綜合運(yùn)用數(shù)據(jù)結(jié)構(gòu)課程中學(xué)到的幾種典型數(shù)據(jù)結(jié)構(gòu),以及程序設(shè)計(jì)語(yǔ)言(C語(yǔ)言),自行實(shí)現(xiàn)一個(gè)較為完整的應(yīng)用系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)。通過(guò)課程設(shè)計(jì),自己通過(guò)系統(tǒng)分析、系統(tǒng)設(shè)計(jì)、編程調(diào)試,寫(xiě)實(shí)驗(yàn)報(bào)告等環(huán)節(jié),進(jìn)一步掌握應(yīng)用系統(tǒng)設(shè)計(jì)的方法和步驟,靈活運(yùn)用并深刻理解典型數(shù)據(jù)結(jié)構(gòu)在軟件開(kāi)發(fā)中的應(yīng)用。學(xué)會(huì)將知識(shí)應(yīng)用于實(shí)際的方法,提高分析和解決問(wèn)題的能力,增加綜合能力。1.3 所選題目的主要工作 這個(gè)題目的主要工作是使訂票系統(tǒng)可以錄入航班情況,查詢(xún)某個(gè)航線的情況、辦理訂票、辦理退票、修改航班信息、查詢(xún)訂票信息等。 第 1 頁(yè) 二、需求分析 2.1 用戶(hù)需求分析 用戶(hù)使用此程序所要完成的工作主要為:查詢(xún)所有航線信息、查看已訂票客戶(hù)信息、查詢(xún)航線、辦理訂票業(yè)務(wù)、辦理退票業(yè)務(wù)。通過(guò)此系統(tǒng)可以方便的進(jìn)行上述工作。 每條航線所涉及的信息有:終點(diǎn)站名、航班號(hào)、飛行時(shí)間、票價(jià)、乘員定額、余票量。 已訂票的客戶(hù)名單信息包括姓名、訂票量、艙位等級(jí)(1,2或3)。等候替補(bǔ)的客戶(hù)名單信息包括姓名、所需票量。 查詢(xún)航線功能可以根據(jù)旅客提出的終點(diǎn)站名輸出航班號(hào)、飛行時(shí)間、票價(jià)、乘員定額、余票量。 訂票業(yè)務(wù)功能根據(jù)客戶(hù)提出的要求(航班號(hào)、訂票數(shù)額)查詢(xún)?cè)摵桨嗥鳖~情況,若尚有余票,則為客戶(hù)辦理訂票手續(xù),輸出座位號(hào);若已滿(mǎn)員或余票額少于定票額,則需重新詢(xún)問(wèn)客戶(hù)要求。若需要,可登記排隊(duì)候補(bǔ)購(gòu)票。 退票業(yè)務(wù)功能根據(jù)客戶(hù)提供的情況(航班號(hào)、姓名)為客戶(hù)辦理退票手續(xù),然后查詢(xún)?cè)摵桨嗍欠裼腥伺抨?duì)候補(bǔ),首先詢(xún)問(wèn)排在第一的客戶(hù),若所退票額能滿(mǎn)足他的要求,則為他辦理訂票手續(xù),否則依次詢(xún)問(wèn)其他排隊(duì)候補(bǔ)的客戶(hù)。2.2 功能需求分析 功能需求分析模塊圖如圖2.1所示。 圖2.1 功能模塊圖 2.3 系統(tǒng)需求分析 第 2 頁(yè) 開(kāi)發(fā)環(huán)境: Windows 7系統(tǒng) 使用軟件:編寫(xiě)實(shí)驗(yàn)報(bào)告:Microsoft Office Word 制 作 程 序:Microsoft Visual C++ 6.0 三、概要設(shè)計(jì) 3.1 各模塊的算法設(shè)計(jì)說(shuō)明 1.瀏覽航線信息功能,調(diào)用display函數(shù)進(jìn)行輸出。如圖3.1所示。航線信息流程圖: 圖3.1 瀏覽航線信息流程圖: 其中display函數(shù)的流程圖如圖3.2 display函數(shù)流程圖: 瀏覽第 3 頁(yè) 圖3.2 display函數(shù)流程圖 2.瀏覽已訂票客戶(hù)信息功能,按順序輸出客戶(hù)信息鏈表中的信息。流程圖如圖3.3 瀏覽已訂票客戶(hù)信息功能流程圖: 圖3.3 瀏覽已訂票客戶(hù)信息功能流程圖 3.查詢(xún)航線功能,根據(jù)客戶(hù)提出的終點(diǎn)站名輸出航線信息。流程圖如圖3.4 查詢(xún)航線流程圖: 第 4 頁(yè) 圖3.4 查詢(xún)航線流程圖 4.辦理訂票業(yè)務(wù)功能,根據(jù)客戶(hù)提出的航線信息等進(jìn)行訂票。流程圖如圖3.5 辦理訂票業(yè)務(wù)功能流程圖: 第 5 頁(yè) 圖3.5 辦理訂票業(yè)務(wù)功能流程圖 5.辦理退票業(yè)務(wù)功能,根據(jù)客戶(hù)提出的航線信息等進(jìn)行退票。流程圖如圖3.6 辦理退票業(yè)務(wù)功能流程圖: 第 6 頁(yè) 圖3.6 辦理退票業(yè)務(wù)功能流程圖 6.主函數(shù)流程圖如圖3.7 主函數(shù)流程圖: 第 7 頁(yè) 圖3.7 主函數(shù)流程圖 3.2 存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)說(shuō)明 typedef struct wat_ros /*單鏈隊(duì)列存儲(chǔ)等候替補(bǔ)的客戶(hù)信息*/ { char name[10]; /*姓名*/ int req_amt; /*訂票量*/ struct wat_ros *next; }qnode,*qptr; 第 8 頁(yè) typedef struct pqueue /*等候替補(bǔ)的客戶(hù)名單*/ { qptr front; qptr rear; }linkqueue;上述單鏈隊(duì)列用來(lái)存儲(chǔ)排隊(duì)等候的客戶(hù)名單,這樣可以通過(guò)隊(duì)先進(jìn)先出的特點(diǎn)來(lái)進(jìn)行操作。先排隊(duì)的客戶(hù)可以先訂票成功。 typedef struct ord_ros /*乘員名單*/ { char name[10]; /*客戶(hù)姓名*/ int ord_amt;int grade; /*訂票量*/ /*艙位等級(jí)*/ struct ord_ros *next;}linklist;上述單鏈表用來(lái)存儲(chǔ)乘員的信息,包括姓名、訂票量、艙位等級(jí)。struct airline /*航線信息*/ { char ter_name[10]; /*抵達(dá)城市*/ char air_num[10]; /*航班號(hào)*/ char time[10]; /*飛機(jī)時(shí)間*/ char pri[7]; /*票價(jià)*/ int tkt_amt; /*乘員定額*/ int tkt_sur; /*余票量*/ linklist *order; /*乘員名單域,指向乘員名單鏈表的頭指針*/ linkqueue wait; /*等候替補(bǔ)的客戶(hù)名單域,分別指向排隊(duì)等候名單隊(duì)頭隊(duì)尾的指針*/ }lineinfo;這個(gè)結(jié)構(gòu)體存儲(chǔ)了航線信息,包括抵達(dá)城市、航班號(hào)、飛行時(shí)間、票價(jià)、乘員定額、余票量等。 #define MAXSIZE 5 /*定義航線數(shù)量,可修改*/ struct airline air[MAXSIZE]= /*初始化航線信息*/ { {“beijing”,“1”,“1200”,“860”,30,30}, {“shanghai”,“2”,“1000”,“770”,20,20}, {“l(fā)ondon”,“3”,“1330”,“960”,10,10},第 9 頁(yè) };{“harbin”,“4”,“1700”,“760”,50,50}, {“dalian”,“5”,“1400”,“550”,40,40} 通過(guò)修改全局變量MAXSIZE的數(shù)值即可更改航線數(shù)。在struct airline air[MAXSIZE]中可以修改、增加、刪除航線信息。航線信息內(nèi)容依次為抵達(dá)城市、航班號(hào)、飛行時(shí)間、票價(jià)、乘員定額、余票量(飛行時(shí)間1200即12:00)。 四、詳細(xì)設(shè)計(jì) 1.查看航線信息 編寫(xiě)void list()函數(shù)來(lái)查看全部航線信息。其中調(diào)用了void display(struct airline *info)函數(shù),該函數(shù)的功能是打印每條航線的基本信息。這樣即可按順序打印出struct airline鏈表中存儲(chǔ)的全部航線信息。2.查看已訂票客戶(hù)信息 編寫(xiě)void prtlink()函數(shù)來(lái)查看已訂票客戶(hù)信息。這個(gè)函數(shù)中需要輸入要查詢(xún)的航線,通過(guò)find()函數(shù)來(lái)尋找這個(gè)航線然后輸出該航線乘員域的乘員信息。3.查詢(xún)航線 編寫(xiě)void search()函數(shù)來(lái)實(shí)現(xiàn)查詢(xún)航線的功能。用戶(hù)輸入抵達(dá)城市名,該函數(shù)會(huì)在航線信息鏈表中進(jìn)行查詢(xún)。如果有該城市,則會(huì)輸出此航線的信息。4.辦理訂票業(yè)務(wù) 編寫(xiě)void order()函數(shù)來(lái)實(shí)現(xiàn)訂票功能。首先提示用戶(hù)輸入航班號(hào),然后調(diào)用find()函數(shù)來(lái)查找此航班,如果該航班存在,則會(huì)提示用戶(hù)輸入信息并調(diào)用linklist *insertlink(linklist *head,int amount,char name[],int grade)在訂票乘員名單域中添加客戶(hù)信息。如果余票不足,則會(huì)提示用戶(hù)進(jìn)行排隊(duì),如果排隊(duì),則會(huì)調(diào)用提示用戶(hù)輸入信息并調(diào)用linkqueue appendqueue(linkqueue q,char name[],int amount)在排隊(duì)等候乘員名單域中添加客戶(hù)信息。5.辦理退票業(yè)務(wù) 編寫(xiě)void return_tkt()函數(shù)來(lái)實(shí)現(xiàn)退票功能。首先提示用戶(hù)輸入航班號(hào),然后調(diào)用find()函數(shù)來(lái)查找此航班,如果該航班存在,則會(huì)提示用戶(hù)輸入信息,信息正確則會(huì)提示退票成功。此時(shí)將乘員信息中的該乘員信息刪除,然后檢查替補(bǔ)乘員鏈表中的信息,如果其訂票量可以得到滿(mǎn)足,則會(huì)將其插入到訂票客戶(hù)名單鏈表中,提示他訂票成功。6.退出系統(tǒng) 主函數(shù)中無(wú)限循環(huán)輸出菜單for(;;),用戶(hù)在菜單頁(yè)面下輸入6回車(chē)即exit(0),即可退出系統(tǒng)。 第 10 頁(yè) 五、源代碼 #include #define MAXSIZE 5 /*定義航線數(shù)量,可修改*/ typedef struct wat_ros /*單鏈隊(duì)列存儲(chǔ)等候替補(bǔ)的客戶(hù)信息*/ { char name[10]; /*姓名*/ int req_amt; /*訂票量*/ struct wat_ros *next; }qnode,*qptr;typedef struct pqueue /*等候替補(bǔ)的客戶(hù)名單*/ { qptr front; /*等候替補(bǔ)客戶(hù)名單域的隊(duì)頭指針*/ qptr rear; /*等候替補(bǔ)客戶(hù)名單域的隊(duì)尾指針*/ }linkqueue; typedef struct ord_ros /*乘員名單*/ { char name[10]; /*客戶(hù)姓名*/ int ord_amt; /*訂票量*/ int grade; /*艙位等級(jí)*/ struct ord_ros *next;}linklist; struct airline { char ter_name[10]; /*抵達(dá)城市*/ char air_num[10]; /*航班號(hào)*/ char time[10]; /*飛機(jī)時(shí)間*/ char pri[7]; /*票價(jià)*/ 第 11 頁(yè) int tkt_amt; /*乘員定額*/ int tkt_sur; /*余票量*/ linklist *order; /*乘員名單域,指向乘員名單鏈表的頭指針*/ linkqueue wait; /*等候替補(bǔ)的客戶(hù)名單域,分別指向排隊(duì)等候名單隊(duì)頭隊(duì)尾的指針*/ }lineinfo;struct airline *start; void display(struct airline *info) /*打印每條航線的基本信息*/ { } void list() /*打印全部航線信息*/ { } void search() /*根據(jù)客戶(hù)提出的終點(diǎn)站名輸出航線信息*/ { printf(“%8st%3st%stt%4st%3dt%10dn”,info->ter_name,info->air_num,info->time,info->pri,info->tkt_amt,info->tkt_sur);struct airline *info;int i=0;info=start;printf(“終點(diǎn)站名t航班號(hào)t飛行時(shí)間t票價(jià)t乘員定額t余票量n”);while(i } printf(“nn”);display(info); /*調(diào)用display函數(shù)來(lái)輸出*/ info++;i++;struct airline *info,*find();char name[10]; /*要抵達(dá)的城市名稱(chēng)*/ int i=0;info=start; 第 12 頁(yè) printf(“請(qǐng)輸入要抵達(dá)城市的名稱(chēng):”);scanf(“%s”,name);while(i { break; } info++; i++;} if(i>=MAXSIZE) /*沒(méi)有匹配的航線*/ { printf(“對(duì)不起,沒(méi)有這條航線!n”);} else { printf(“終點(diǎn)站名t航班號(hào)t飛行時(shí)間t票價(jià)t乘員定額t余票量n”); display(info); /*調(diào)用display函數(shù)輸出航線信息*/ } } struct airline *find() / *根據(jù)系統(tǒng)提出的航班號(hào)查詢(xún)并以指針形式返回*/ { struct airline *info;char number[10]; /*查詢(xún)的航班號(hào)*/ int i=0;info=start;printf(“請(qǐng)輸入航班號(hào):”);scanf(“%s”,number);while(i { if(!strcmp(number,info->air_num)) /*有匹配航班*/ { return info; } 第 13 頁(yè) } info++;i++;} /*無(wú)匹配航班*/ printf(“對(duì)不起,沒(méi)有這條航線!n”);return NULL;void prtlink() /*打印訂票乘員名單域的客戶(hù)名單信息*/ { } linklist *insertlink(linklist *head,int amount,char name[],int grade) /*增加訂票乘員名單域的客戶(hù)信息*/ { linklist *p;struct airline *info;info=find();p=info->order;if(p!=NULL) /*按順序輸出客戶(hù)信息鏈表*/ { printf(“客戶(hù)姓名 訂票數(shù)額 艙位等級(jí)n”);while(p) { } printf(“%stt%dt%dn”,p->name,p->ord_amt,p->grade);p=p->next; } else /*沒(méi)有人訂這個(gè)航班*/ printf(“該航線沒(méi)有客戶(hù)信息!n”);linklist *p1,*new1;p1=head;new1=(linklist*)malloc(sizeof(linklist));if(!new1) /*存儲(chǔ)空間不足*/ { } 第 14 頁(yè) printf(“nOut of memory!n”);return NULL; } strcpy(new1->name,name);new1->ord_amt=amount;new1->grade=grade;new1->next=NULL;if(head==NULL) /*若原訂票客戶(hù)信息為空*/ { } else { } new1->next=p1;return head; head=new1;head=new1;new1->next=NULL;linkqueue appendqueue(linkqueue q,char name[],int amount) /*增加排隊(duì)等候的客戶(hù)名單域*/ { qptr new1;new1=(qptr)malloc(sizeof(qnode));strcpy(new1->name,name);new1->req_amt=amount;new1->next=NULL;if(q.front==NULL) /*若原排隊(duì)等候客戶(hù)名單域?yàn)榭?/ { } else { } q.rear=new1;return q; 第 15 頁(yè) q.front=new1;q.rear->next=new1; } void order() /*辦理訂票業(yè)務(wù)*/ { struct airline *info;int amount,grade; /*訂票數(shù)量,艙位等級(jí)*/ char name[10]; /*要訂的航班號(hào)*/ info=start;if(!(info=find())) /*根據(jù)客戶(hù)提供的航班號(hào)進(jìn)行查詢(xún),如為空,退出該模塊*/ { } printf(“請(qǐng)輸入您需要的票數(shù):”);scanf(“%d”,&amount);if(amount>info->tkt_amt) /*若客戶(hù)訂票額超過(guò)乘員定票總額,退出*/ { } if(amount<=info->tkt_sur) /*若客戶(hù)訂票額末超過(guò)余票量,訂票成功并{ int i;printf(“請(qǐng)輸入您的姓名:”);scanf(“%s”,name);printf(“請(qǐng)輸入您需要的艙位等級(jí)(1,2或):”);scanf(“%d”,&grade);info->order=insertlink(info->order,amount,name,grade); /*在訂票乘員名單域for(i=0;i /*依次輸出該訂票客戶(hù)的座位號(hào)*/ { } info->tkt_sur-=amount; /*該航線的余票量應(yīng)減掉該客戶(hù)的訂票量*/ printf(“n祝您乘坐愉快!n”); 第 16 頁(yè) return;printf(“n對(duì)不起,您輸入票數(shù)已經(jīng)超過(guò)乘員定額!”);return;等記信息*/ 中添加客戶(hù)信息*/ printf(“%s的座位號(hào)是:%dn”,name,info->tkt_amt-info->tkt_sur+i+1); } } else /*若滿(mǎn)員或余票額少于訂票額,詢(xún)問(wèn)客戶(hù)是否需要進(jìn)行排隊(duì)等候*/ { } char r;printf(“n沒(méi)有這么多票了,您需要排隊(duì)等候嗎?(Y/N)”);r=getch();printf(“%c”,r);if(r=='Y'||r=='y'){ } else { } printf(“n歡迎您再次訂購(gòu)!n”);printf(“n請(qǐng)輸入您的姓名:”);scanf(“%s”,name);info->wait=appendqueue(info->wait,name,amount);/*在排隊(duì)等候乘員名單域printf(“n注冊(cè)排隊(duì)成功!n”);中添加客戶(hù)信息*/ void return_tkt() /*退票模塊*/ { struct airline *info;qnode *t,*back,*f,*r;int grade;linklist *p1,*p2,*head;char cusname[10];if(!(info=find())) /*調(diào)用查詢(xún)函數(shù),根據(jù)客戶(hù)提供的航線進(jìn)行搜索*/ { } head=info->order;p1=head; 第 17 頁(yè) return; printf(“請(qǐng)輸入你的姓名:”);scanf(“%s”,cusname);while(p1!=NULL) /*根據(jù)客戶(hù)提供的姓名到訂票客戶(hù)名單域進(jìn)行查詢(xún)*/ { } if(p1==NULL) /*若未找到,退出本模塊*/ { } else /*若信息查詢(xún)成功,刪除訂票客戶(hù)名單域中的信息*/ { } info->order=head; /*重新將航線名單域指向訂票單鏈表的頭指針*/ f=(info->wait).front; /*f指向排隊(duì)等候名單隊(duì)列的頭結(jié)點(diǎn)*/ r=(info->wait).rear; /*r指向排隊(duì)等候名單隊(duì)列的尾結(jié)點(diǎn)*/ t=f; /*t為當(dāng)前滿(mǎn)點(diǎn)條件的排隊(duì)候補(bǔ)名單域*/ 第 18 頁(yè) if(!strcmp(cusname,p1->name)){ } p2=p1;p1=p1->next;break;printf(“對(duì)不起,您沒(méi)有訂過(guò)票!n”);return;if(p1==head){ } { } grade=p1->grade;printf(“%s退票成功!n”,p1->name);p2->next=p1->next;head=p1->next; else info->tkt_sur+=p1->ord_amt; free(p1); while(t){ if(info->tkt_sur>=info->wait.front->req_amt) /*若滿(mǎn)足條件者為頭結(jié)點(diǎn)*/ { } back=t;t=t->next;if((info->tkt_sur)>=(t->req_amt)&&t!=NULL)/*若滿(mǎn)足條件者不為頭結(jié)點(diǎn)*/ { } if(f==r){ 第 19 頁(yè) int i;info->wait.front=t->next;printf(“%s訂票成功!n”,t->name);for(i=0;i /*輸出座位號(hào)*/ 戶(hù)名單鏈表中*/ int i;back->next=t->next;printf(“%s訂票成功!n”,t->name);for(i=0;i /*輸出座位號(hào)*/ { } info->tkt_sur-=t->req_amt;info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到訂票客free(t);break;printf(“<%s>'s seat number is:%dn”,t->name,(info->tkt_sur)-i);戶(hù)名單鏈表中*/ break; } } } int menu_select() /*菜單界面*/ { int c;char s[20];printf(“t訂票系統(tǒng)n”);printf(“~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“1.查看航線信息n”);printf(“2.查看已訂票客戶(hù)信息n”);printf(“3.查詢(xún)航線n”);printf(“4.辦理訂票業(yè)務(wù)n”);printf(“5.辦理退票業(yè)務(wù)n”);printf(“6.退出系統(tǒng)n”);printf(“~~~~~~~~~~~~~~~~~~~~~~~~~n”);do { printf(“請(qǐng)選擇(1-6):”); scanf(“%s”,s);c=atoi(s);}while(c<1||c>6);return c;} void main(){ struct airline air[MAXSIZE]= /*初始化航線信息*/ { {“beijing”,“1”,“1200”,“860”,30,30},{“shanghai”,“2”,“1000”,“770”,20,20},{“l(fā)ondon”,“3”,“1330”,“960”,10,10}, {“harbin”,“4”,“1700”,“760”,50,50},第 20 頁(yè) {“dalian”,“5”,“1400”,“550”,40,40} };start=air; for(;;) /*無(wú)限循環(huán)(除非用戶(hù)選擇.退出)*/ { system(“cls”); /*清空屏幕*/ switch(menu_select()) { case 1:list(); /*打印全部航線信息*/ break; case 2:prtlink(); /*瀏覽已訂票客戶(hù)信息*/ break; case 3:search(); /*查詢(xún)航線*/ break; case 4:order(); /*訂票*/ break; case 5:return_tkt(); /*退票*/ break; case 6:printf(“n感謝您的使用,再見(jiàn)!n”);/*退出系統(tǒng)*/ exit(0); /*正常退出程序*/ } printf(“n任意鍵繼續(xù)...n”); getch(); /*任意鍵繼續(xù)*/ } } 六、運(yùn)行結(jié)果分析 1.菜單:進(jìn)入系統(tǒng)后,會(huì)出現(xiàn)如下菜單,如圖6.1 菜單: 第 21 頁(yè) 圖6.1 菜單 用戶(hù)根據(jù)自己需求選擇輸入數(shù)字(1-6)即可進(jìn)入相應(yīng)功能。 2.查看航線信息:在菜單頁(yè)面下輸入數(shù)字1,回車(chē),即可瀏覽全部航線信息。如圖6.2 查看航線信息: 圖6.2 查看航線信息 3.查看已訂票客戶(hù)信息:在菜單頁(yè)面下輸入數(shù)字2,回車(chē),然后輸入航班號(hào)即可查看。如圖6.3 查看航線信息: 圖6.3 查看航線信息 該航線有客戶(hù)預(yù)定則顯示客戶(hù)預(yù)定的信息。如圖6.3 查看客戶(hù)預(yù)定信息: 第 22 頁(yè) 6.3 查看客戶(hù)預(yù)定信息 如果該航線沒(méi)有客戶(hù)預(yù)定,則會(huì)提示該航線沒(méi)有客戶(hù)信息。如圖6.4 無(wú)人預(yù)定航線: 圖6.4 無(wú)人預(yù)定航線 4.查詢(xún)航線:在菜單頁(yè)面下輸入數(shù)字3,回車(chē),即可進(jìn)入查詢(xún)航線功能。如圖6.5 查詢(xún)航線頁(yè)面: 圖6.5 查詢(xún)航線頁(yè)面 根據(jù)提示輸入要抵達(dá)城市的名稱(chēng)即可查詢(xún)。如果有該航線,則會(huì)顯示該航線的信息。如圖6.6 航線信息: 第 23 頁(yè) 圖6.6 航線信息 如果沒(méi)有該航線,則會(huì)顯示對(duì)不起,沒(méi)有這條航線。如圖6.7 無(wú)此航線: 圖6.7 無(wú)此航線 5.辦理訂票業(yè)務(wù):在菜單頁(yè)面下輸入數(shù)字4,回車(chē),即可進(jìn)入辦理訂票業(yè)務(wù)功能。如圖6.8 訂票頁(yè)面: 圖6.8 訂票頁(yè)面 用戶(hù)根據(jù)提示依次輸入航班號(hào)、票數(shù)、姓名、艙位等級(jí)即可。如圖6.9 訂票信息: 第 24 頁(yè) 圖6.9 訂票信息 如果訂票成功,則會(huì)顯示座位號(hào),并提示祝您乘坐愉快。如圖6.10 訂票成功: 圖6.10 訂票成功 如果在輸入訂票信息時(shí),輸入的票數(shù)大于額定乘員數(shù),則會(huì)訂票失敗并提示。 第 25 頁(yè) 圖6.11 訂票失敗 如果在輸入訂票信息時(shí),輸入的票數(shù)小于額定乘員數(shù),大于余票數(shù),則會(huì)提示沒(méi)有這么多票了,詢(xún)問(wèn)是否進(jìn)行排隊(duì)等候。如圖6.12 詢(xún)問(wèn)是否排隊(duì)等候: 圖6.12 詢(xún)問(wèn)是否排隊(duì)等候 如果輸入N,代表不排隊(duì),則會(huì)提示歡迎下次訂購(gòu)。如果輸入Y,代表進(jìn)行排隊(duì)等候。這是會(huì)提示用戶(hù)輸入姓名進(jìn)行排隊(duì)。如圖6.13 排隊(duì)等候: 圖6.13 排隊(duì)等候 6.辦理退票業(yè)務(wù):在菜單頁(yè)面下輸入數(shù)字5,回車(chē),即可進(jìn)入辦理退票業(yè)務(wù)功能。如圖6.14 辦理退票業(yè)務(wù)頁(yè)面: 第 26 頁(yè) 圖6.14 辦理退票業(yè)務(wù)頁(yè)面 根據(jù)提示輸入航線號(hào)和姓名即可進(jìn)行退票。如果此時(shí)這條航線有人排隊(duì)等候,余票數(shù)可以滿(mǎn)足其需求,其訂票即可成功。如圖6.15 排隊(duì)等候訂票成功: 圖6.15 排隊(duì)等候訂票成功 第 27 頁(yè) 7.退出系統(tǒng):在菜單頁(yè)面下輸入數(shù)字6,回車(chē),即可退出系統(tǒng)。如圖6.16 退出系統(tǒng): 圖6.16 退出系統(tǒng) 七、收獲與體會(huì) 在編寫(xiě)的時(shí)候只使用了相對(duì)較為簡(jiǎn)單的基礎(chǔ)語(yǔ)言,代替了相對(duì)較為復(fù)雜的語(yǔ)言,降低了運(yùn)行效率。測(cè)試輸入的數(shù)據(jù)也有一定的局限性,但是基本可以滿(mǎn)足訂票系統(tǒng)的需求。 這個(gè)程序有許多地方可以改進(jìn),例如: ① 數(shù)據(jù)全部存儲(chǔ)在內(nèi)存中,可以考慮繼續(xù)編寫(xiě)將數(shù)據(jù)保存在文件中,這樣不會(huì)丟失。 ② 航線信息只能通過(guò)修改代碼來(lái)修改,可以編寫(xiě)一個(gè)函數(shù)來(lái)修改航線信息并將其保存在文件中。 ③ 使用的語(yǔ)言較基礎(chǔ),運(yùn)行效率較低,可以考慮寫(xiě)一些較為復(fù)雜但運(yùn)行效率高的語(yǔ)言。 ④ 界面不夠美觀,菜單也只是局限在左上角,可以修改。 八、參考文獻(xiàn) [1] 嚴(yán)蔚敏,吳偉民,數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)[M].清華大學(xué)出版社,1997.[2] 夏濤.C語(yǔ)言程序設(shè)計(jì),北京郵電大學(xué)出版社,2007.[3] 譚浩強(qiáng).C程序設(shè)計(jì)(第三版)[M].清華大學(xué)出版社,2006.[4] 百度.百度知道.百度文庫(kù) 第 28 頁(yè)第二篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 飛機(jī)訂票系統(tǒng)
第三篇:數(shù)據(jù)庫(kù)課程設(shè)計(jì)+飛機(jī)訂票系統(tǒng)
第四篇:C語(yǔ)言課程設(shè)計(jì)——飛機(jī)訂票系統(tǒng)源代碼
第五篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)c語(yǔ)言版《飛機(jī)訂票系統(tǒng)》