1. 程式人生 > 程式設計 >C語言實現飛機票務系統

C語言實現飛機票務系統

飛機票務系統設計要求:有登入系統介面、賬號、密碼;建立航班資訊功能;檢視從鄭州到某終點站飛機票資訊功能;飛機票購買功能;新增購票人資訊功能;顯示購票人資訊功能;退定飛機票功能;

程式中的音樂可以改為自己指定的,用時把我用的音樂那行程式碼註釋掉即可。

程式碼如下:

#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 ;
}

更多學習資料請關注專題《管理系統開發》。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。