C語言實現飛機票務系統
阿新 • • 發佈:2020-01-07
飛機票務系統設計要求:有登入系統介面、賬號、密碼;建立航班資訊功能;檢視從鄭州到某終點站飛機票資訊功能;飛機票購買功能;新增購票人資訊功能;顯示購票人資訊功能;退定飛機票功能;
程式中的音樂可以改為自己指定的,用時把我用的音樂那行程式碼註釋掉即可。
程式碼如下:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<Windows.h> #include<conio.h>//主要是一些使用者通過按鍵盤產生的對應操作,比如getch()函式 #include<time.h> //時間庫 #include<mmsystem.h>//windows中與多媒體有關的大多數介面 #pragma comment(lib,"winmm.lib")//預處理,支援對windows 多媒體的程式設計. //#include<graphics.h>//圖形庫 #define N 15 //航班最多15,N為全域性變數 typedef struct traininfor { char qishi[30]; //起始站 char zhongdian[30]; //終點站 char trainnumber[10]; //航班號 float price; //飛機票單人價格 int piaonumber; //每次航班的生成票數 char time[30]; //飛機出發時間 }hang; struct ticket { char buyer[20]; //購票人姓名 char ID[20]; //購票人身份證號 int buynumber; //購買飛機票的張數 float money;//使用者購買票總錢數 hang buy; //使用者買的飛機票資訊 struct ticket *next;//指標節點 }; int d=0;//統計有多少次航班 struct ticket *yonghu;//使用者購票資訊頭結點 hang plane[N]; //航班資訊結構體陣列 int menu();//列印主選單函式 void DengLu();//登入票務系統函式 void JianFile();//建立檔案航班資訊函式 void OpenFile();//讀取檔案資訊函式 void check(); //檢視從鄭州到某終點站飛機票資訊函式 void buy(); //飛機票購買函式 void add();//新增購票人資訊 int TicketMenu();//使用者購票選單 void XianShi();//顯示購票人資訊 void tui(); //退定飛機票函式 void exit(); // 退出程式 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// int main() { DengLu();// 登入票務系統函式 JianFile();//建立檔案航班資訊 //OpenFile();//開啟檔案讀取航班資訊 while(1) {//每次操作完自動返回主選單作用 switch(menu()) {//menu()函式為輸入選項 case 1://選項為1時 OpenFile();//開啟檔案讀取航班資訊 printf("已成功匯入航班資訊\n\n\n"); break; case 2: //選項為2時 check();// 檢視從鄭州到某終點站飛機票資訊函式 break; case 3://選項為3時 buy();//飛機票購買函式 break; case 4://選項為4時 tui();//退票函式 break; case 5://選項為5時 system("cls");//清屏 printf("感謝您的使用,祝您的旅途愉快\n"); Sleep(5000);//延遲15秒 exit(1);// break; } } return 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //登入票務系統 void DengLu() { //getch()=從鍵盤輸入一個字元且不顯示 getche()=從鍵盤輸入一個字元並顯示 printf("歡迎來到票務系統,請先註冊票務系統賬號(賬號為10位,密碼為6位):\n"); printf("溫馨提示:若登入密碼輸入有誤超過三次,電腦會自動關機:\n\n"); char ch;//重鍵盤上輸入一個字元 char password[10];//passsword陣列表示初始密碼 char input[10];//input陣列表示待輸入的密碼 char Szhanghao[20];// zhanghao陣列表示申請的賬號 char Dzhanghao[20];// zhanghao陣列表示登入的賬號 int i=0,j;//控制輸入次數 int number,find,count; printf("申請賬號:\n"); fflush(stdin);//清空輸入流 while(1) { ch=getche();//從鍵盤輸入一個字元,儲存到ch變數 //加過濾,只要數字,其他的不做任何處理 if(ch>='0' && ch<='9') //if( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z') ) { printf("\a");//轉義字元\a=bell Szhanghao[i++]=ch;//把申請的賬號儲存到陣列中 if(10==i)//寫條件語句時,把常量放前面 { Szhanghao[i]='\0'; break;//賬號為十位時停止輸入 } } } //1提示輸入密碼 printf("\n設定卡的密碼:\n"); //2輸入密碼 i=0; while(1) { ch=getch();//從鍵盤輸入一個字元,儲存到ch變數 //加過濾,只要數字,其他的不做任何處理 if(ch>='0' && ch<='9') //if( (ch>='a' && ch<='z') || (ch>='A' && ch<='Z') ) { printf("*\a");//轉義字元\a=bell password[i++]=ch;//把初始密碼儲存到陣列中 if(6==i)//寫條件語句時,把常量放前面 { password[i]='\0'; break;//初始密碼為六位時停止輸入 } } } Sleep(2000); system("cls"); printf("溫馨提示:若登入密碼輸入有誤超過三次,電腦會自動關機:\n\n"); printf("請登入您的賬號:\n"); while(1) { gets(Dzhanghao); if(strcmp(Dzhanghao,Szhanghao)!=0) printf("您輸入的賬號有誤,請重新輸入:\n"); else break; } number=0;//輸入密碼的次數 count =3;//有3次機會 while(count--) {//迴圈三次 find=0;j=0;//find初始化為0,表示輸入密碼正確 memset(input,sizeof(input));//初始化輸入密碼陣列 printf("請輸入賬號密碼:\n"); for(i=0;i<6;i++) {//輸入六位密碼 ch=getch();//從鍵盤輸入一個字元,儲存到ch變數中 if(ch>='0' && ch<='9') {//密碼為數字時加入陣列 printf("*\a"); input[j++]=ch; } } input[j]='\0';//陣列以\0結束 for(i=0;i<=5;i++) {//密碼是否輸入正確 if(input[i]!=password[i]) {//輸入密碼與初始密碼不匹配 find=1; break; } } if(find==0) {//輸入密碼正確 printf("\n輸入正確,即將進入票務系統主頁"); PlaySound("20100814_5c610cfa0dec6116aa701YT6vHJzW9Zw.wav",NULL,SND_FILENAME | SND_SYNC); //音樂播放 printf("\n"); //Sleep(3000);//延時3秒 system("cls");//清屏 break; } else {//輸入密碼次數加一 number++; printf("\n輸入密碼錯誤,"); } } if(3==number) {//當輸入錯誤次數到達3次時 printf("\n輸入三次密碼錯誤,不能再輸入,電腦將在10秒後自動關機\n"); system("shutdown -s -t 10");//電腦即將關機 } return ; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// void JianFile() { FILE *fp;//定義檔案指標 if((fp=fopen("txt.in","w"))==NULL) {//建立檔案失敗 printf("建立失敗!\n"); exit(0); } //向檔案中輸入航班資訊 fprintf(fp,"鄭州 南陽 T1230 110.50 200 2018年11月6日12點15分\n"); fprintf(fp,"鄭州 信陽 T1231 120.50 200 2018年11月6日13點15分\n"); fprintf(fp,"鄭州 商丘 T1232 100.00 200 2018年11月6日14點15分\n"); fprintf(fp,"鄭州 開封 T1234 115.50 200 2018年11月6日15點15分\n"); fprintf(fp,"鄭州 洛陽 T1235 95.00 200 2018年11月6日16點15分\n"); fprintf(fp,"鄭州 三門峽 T1236 97.30 200 2018年11月6日17點15分\n"); fprintf(fp,"鄭州 鶴壁 T1237 130.50 200 2018年11月6日18點15分\n"); fprintf(fp,"鄭州 周口 T1238 117.00 200 2018年11月6日19點15分\n"); fprintf(fp,"鄭州 駐馬店 T1239 135.00 200 2018年11月6日20點15分"); fclose(fp); return ; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //檔案讀取航班資訊 void OpenFile() { FILE *fp; //定義檔案指標 d=0;//表示讀取到當前檔案位置 if((fp=fopen("txt.in","r"))==NULL) {//開啟檔案 printf("檔案開啟失敗!\n"); return ; } while(!feof(fp)) {//讀取到檔案為空 //printf("請設定第%d個站的地點、車次、價格、還剩票數、到站時間、已被購買票數:\n",d); fscanf(fp,"%s%s%s%f%d%s",plane[d].qishi,plane[d].zhongdian,plane[d].trainnumber,&plane[d].price,&plane[d].piaonumber,plane[d].time); d++; } fclose(fp);//關閉檔案 return ; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// int menu() { char s[10];//輸入字串選項 int n;//整型選項 //選單框架 printf("--------------------票務系統目錄--------------------\n\n"); printf("1,匯入航班資訊\n"); printf("2,查詢飛機票\n"); printf("3,購買飛機票\n"); printf("4,退訂飛機票\n"); printf("5,退出程式\n"); printf("注意:飛機從本站能到達的地方有南陽、信陽、商丘\n"); printf("開封、洛陽、三門峽、鶴壁、周口、駐馬店\n"); printf("如果您想了解更多資訊請輸入選項序號\n \n"); printf("本程式製作者:2017級物聯網工程一班 胡斌\n"); printf("請輸入選項:"); while(1) {//死迴圈狀態 fflush(stdin);//清空輸入流 gets(s);//得到一串字串 n=atoi(s);//字串轉化為整數 if(n<1||n>5)//判斷輸入的選項是否正確 printf("輸入錯誤,請重新輸入:\n"); else//符合條件,結束迴圈 break; } //返回選項值 return n; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 檢視從鄭州到某終點站飛機票資訊函式 void check() { int i,j;//迴圈變數 int find=1,flag=0,count=0;//標誌變數 char qi[30];//起始站 char mudi[30];//終點站 printf("請輸入起始地(提示:起始地為鄭州): \n"); scanf("%s",qi);//輸入起始地 printf("請輸入目的地: \n"); scanf("%s",mudi);//輸入目的地 while(1) {//死迴圈狀態 if(0==strcmp(qi,"鄭州")) {//起始地為鄭州時 flag=1;//標誌變數為1,表示起始地沒有出錯 for(j=0;j<d;j++) {//迴圈d次航班資訊 if(0==strcmp(plane[j].zhongdian,mudi)) {//輸入的終點站與航班資訊終點站一致 count=1;//標誌變數為1 printf("航班號: ");//輸出航班號 printf("%s\n",plane[j].trainnumber); printf("起始地: ") ;//輸出起始地 printf("%s\n",plane[j].qishi); printf("目的地: ");//輸出目的地 printf("%s\n",plane[j].zhongdian); printf("此次航班單人票價: ");//輸出票價 printf("%.2f\n",plane[j].price); printf("此次航班時間:");//輸出航班時間 printf("%s\n",plane[j].time); printf("此次航班飛機票數量: ");//輸出票數 printf("%d\n\n\n\n",plane[j].piaonumber); return ; } } } else { flag=1;//起始地輸入錯誤 printf("輸入有誤,返回選單!\n\n\n"); return ; } if(0==count&&flag==1) {//起始地並且目的地輸入錯誤 printf("sorry 您查詢的結果無資訊!\n\n\n"); return ; } } return ; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //對購物車進行操作 void buy() { while(1) {//成死迴圈狀態 switch(TicketMenu()) {//ShopCartMenu()為輸入選項 case 1://選項1 顯示使用者購票列表資訊 XianShi(); break; case 2: //選項2 新增使用者購票資訊 add(); break; case 3: //選項3 退出 printf("即將退出子程式\n"); Sleep(2000);//延時兩秒 return ; } } return ; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //列印購物車選單 int TicketMenu() { int n;//輸入選項 char s[5];//輸入字串 //購票子程式選單框架 printf("\n\n請選擇操作:\n"); printf("--------------------------------------------\n"); printf("1. 顯示當前購票列表\n"); printf("2. 新增購票人資訊\n"); printf("3. 退出\n"); printf("--------------------------------------------\n"); printf("請選擇對應數字1~3\n"); while(1) {//成死迴圈狀態 fflush(stdin);//清空輸入流 gets(s);//輸入一串字串 n=atoi(s);//字串轉化為整數 if(n<1||n>3)//判斷輸入的選項是否正確 printf("輸入錯誤,請重新輸入:\n"); else//輸入正確,結束迴圈 break; } return n;//返回輸入選項 } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //顯示使用者購票資訊 void XianShi() { FILE *fp;//定義檔案指標 struct ticket *p;//定義一個新節點 p=yonghu;//把整個購票資訊賦給p if((fp=fopen("goupiao.txt","r"))==NULL) {//判斷是否打開了檔案 printf("開啟檔案失敗\n"); printf("暫時還沒有使用者購票資訊\n\n"); return ; } //printf("\n姓名 身份證 起始站 目的站 購買票數\n"); while(p!=NULL) {//輸出購票人資訊 //fscanf(fp,"%s%s%s%s%d",p->buyer,p->ID,p->buy.qishi,p->buy.zhongdian,&p->buynumber); printf("姓名: "); printf("%s\n",p->buyer); printf("身份證號: "); printf("%s\n",p->ID); printf("起始地: ") ; printf("%s\n",p->buy.qishi); printf("目的地: "); printf("%s\n",p->buy.zhongdian); printf("購買票數: "); printf("%d\n",p->buynumber); printf("此次航班總錢數: "); printf("%.2f\n",p->money); printf("此次航班時間:"); printf("%s\n\n\n\n",p->buy.time); //printf("姓名 身份證 起始地 目的地 購買票數 票的價格 出發時間\n"); //printf("%-11s%-20s%-10s%-10s%-7d%-7.2f%-20s\n",p->buy.price,p->buy.time);//輸出購票人資訊 p=p->next;//指向下一個節點 } fclose(fp);//關閉檔案 return ; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //新增使用者購票資訊 void add() { FILE *fp1,*fp;//定義兩個檔案指標 struct ticket *p,*p1;//定義兩個節點 int i,j;//定義控制迴圈變數 int count,flag;//定義標誌變數 int buynumber1;//使用者購買的票數 char choice1[10];//選擇變數 char choice2[10];//選擇變數 char mingzi[20];//使用者姓名 char shenfen[20];//使用者身份證號 char qi[30];//起始站 char mudi[30];//終點站 do{//開始進入迴圈 printf("請輸入您的姓名:\n"); scanf("%s",mingzi); printf("請輸入您的身份證號:\n"); scanf("%s",shenfen); printf("請輸入起始地(提示:起始地為鄭州): \n"); scanf("%s",qi); printf("請輸入目的地: \n"); scanf("%s",mudi); count=0;flag=0;//標誌變數初始化 while(1) {//成死迴圈狀態 if(0==strcmp(qi,"鄭州")) {//起始站為鄭州 flag=1;//標誌為1 for(j=0;j<d;j++) {//迴圈d次航班資訊 // printf("%s %s %.2f %d %s %d",pointtr->station[j],pointtr->trainnumber[j],pointtr->price[j],pointtr->piaonumber[j],pointtr->time[j],pointtr->buynumber[j]); if(0==strcmp(plane[j].zhongdian,mudi)) {//目的地一致時 count=1;//標誌為1 //輸出航班資訊 printf("航班號: "); printf("%s\n",plane[j].trainnumber); printf("起始地: ") ; printf("%s\n",plane[j].qishi); printf("目的地: "); printf("%s\n",plane[j].zhongdian); printf("此次航班單人票價: "); printf("%.2f\n",plane[j].price); printf("此次航班時間:"); printf("%s\n",plane[j].time); printf("此次航班飛機票數量: "); printf("%d\n",plane[j].piaonumber); break;//結束迴圈 } } break ;//結束迴圈 } else { flag=1; printf("輸入有誤:\n\n\n"); fflush(stdin);//清空輸入流 break; //結束迴圈 } if(0==count&&flag==0) {//輸入條件不符合 printf("sorry 您查詢的結果無資訊!\n\n\n"); return ; } } if(1==count) {//找到使用者所需航班資訊 printf("您確定購買此飛機票嗎?(1.是 2.否)\n"); scanf("%s",choice1);//輸入選項 if(0==strcmp(choice1,"1")) {//選項為1時 printf("請輸入您要購買的張數:\n"); scanf("%d",&buynumber1);//輸入購買票數 if(buynumber1<0) {//不符合客觀情況 printf("輸入有誤,請重新輸入!\n\n\n"); break; } if(plane[j].piaonumber-buynumber1>=0) {//輸入正確 plane[j].piaonumber=plane[j].piaonumber-buynumber1;//計算剩餘飛機票 p=new ticket;//生成新節點 if(p==NULL) {//分配記憶體失敗 printf("記憶體申請失敗!\n\n\n"); exit(1); } p->buynumber=buynumber1;//使用者所購票數 strcpy(p->buyer,mingzi);//使用者姓名 strcpy(p->ID,shenfen);//使用者身份證號 p->buy=plane[j];//航班資訊 p->next=NULL;//指向下一個節點為空 p1=yonghu;//把使用者資訊賦給p1 if(yonghu==NULL)//頭結點為空 yonghu=p;//把節點賦值給頭結點 else { while(p1->next!=NULL) p1=p1->next;//把連結串列迴圈到尾部 p->next=p1->next; p1->next=p;//把新節點p掛在連結串列尾部 } } else { printf("飛機票已售完或不足,不能購買!\n\n\n"); break; } } else if(0==strcmp(choice1,"2")) {//輸入選項為2時 printf("放棄購買,返回!\n\n\n"); break; } else {//輸入選項有誤 printf("輸入錯誤,返回!\n\n\n"); break; } } else//沒有找到使用者所需航班 printf("輸入有誤"); printf("是否繼續購票?(1.是,2.否)\n"); fflush(stdin);//清空輸入流 scanf("%s",choice2);//輸入選項 }while(strcmp(choice2,"1")==0);//當選項為1時 if((fp1=fopen("goupiao.txt","w"))==NULL) {//判斷檔案是否建立失敗 printf("建立檔案失敗。\n"); return ; } p=yonghu;//把使用者資訊賦給p while(p!=NULL) {//一直迴圈到連結串列為空 p->money=p->buy.price*p->buynumber;//計算票價總錢數 fprintf(fp1,"%s %s %s %s %d %.2f %s\n",p->buynumber,p->money,p->buy.time); p=p->next;//指向下一個節點 } fclose(fp1);//關閉檔案 return ; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //退訂飛機票 void tui() { FILE *fp,*fp1;//定義兩個檔案指標 char s[20];//身份證號 char s1[20];//目的地 char choice[10];//選擇項 int buynumber2;//退訂的票數 int i,j;//控制迴圈變數 int find=0;//標誌變數 struct ticket *p;//定義新節點 printf("您確定要退票嗎?1.是 2.否\n"); scanf("%s",choice);//輸入選項 if(0==strcmp(choice,"1")) {//選項為1時 printf("請輸入身份證號:\n"); scanf("%s",s);//輸入身份證號 printf("請輸入目的地:\n"); scanf("%s",s1);//輸入目的地 if((fp=fopen("goupiao.txt","r"))==NULL) {//開啟檔案 printf("開啟檔案失敗\n"); return ; } p=yonghu;//把使用者資訊賦給p while(p!=NULL) {//迴圈到連結串列為空時 //fscanf(fp,"%s%s%s%s%f%d%s",&p->buynumber,p->buy.time); if(0==strcmp(s,p->ID)&&(0==strcmp(s1,p->buy.zhongdian))) {//找到對應的使用者 find=1;//標誌變數為1 printf("請輸入退票張數:\n"); scanf("%d",&buynumber2);//輸入退訂票數 if(buynumber2<0) {//不符合客觀情況 printf("輸入有誤,返回選單!\n"); return ; } if(p->buynumber>=buynumber2) {//輸入票數符合條件 fclose(fp);//關閉yonghu檔案 if((fp=fopen("goupiao.txt","w"))==NULL) {//判斷檔案是否建立失敗 printf("建立檔案失敗\n"); return ; } if((fp1=fopen("txt.in","w"))==NULL) {//判斷檔案是否建立失敗 printf("建立檔案失敗。\n"); return ; } printf("退票成功,返回選單!\n\n\n"); for(i=0;i<d;i++) {//迴圈d次航班資訊 if(0==strcmp(plane[i].zhongdian,p->buy.zhongdian)) {//找到對應終點站,計算剩餘票數 plane[i].piaonumber+=buynumber2; } fprintf(fp1,"%s %s %s %f %d %s\n",plane[i].qishi,plane[i].zhongdian,plane[i].trainnumber,plane[i].price,plane[i].piaonumber,plane[i].time); } p->buynumber-=buynumber2;//使用者所購票數 p->money=p->buynumber*p->buy.price;//購票的總價錢 p=yonghu;//把使用者資訊賦給p while(p!=NULL) {//迴圈連結串列為空時 fprintf(fp,"%s %s %s %s %.2f %d %s\n",p->buy.time); p=p->next;//指向下一個節點 } fclose(fp);//關閉檔案 fclose(fp1);//關閉檔案 return ; } else { printf("輸入錯誤,返回選單!\n\n\n"); return ; } } p=p->next;//指向下一個節點 } if(0==find) {//輸入有誤 printf("查詢不到資訊,返回選單\n\n\n"); return ; } } else if(0==strcmp(choice,"2")) {//輸入選項為2時 printf("放棄退票,返回選單!\n\n\n"); return ; } else {//輸入有誤 printf("輸入錯誤,返回選單!\n\n\n"); return ; } return ; }
更多學習資料請關注專題《管理系統開發》。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。