?? cpp1.cpp
字號:
/*
程序采用鏈表和順序表的混合設計
功能:可以輸入姓名查詢自己的航班信息
可以訂票,退票
可以增加航班(設置了密碼)
幾個函數功能的描述:
void init(flightmange* fl,char fn[][20],int fnum[],int tic[] ) 初始化航班信息
void printall(flightmange* fl,int *length)顯示所有航班信息
void welcome()顯示主界面
int findflight(flightmange *fl,int n,int *length)查詢是否存在此航班號
void printselect(flightmange *fl,int i,int n)顯示當前航班信息
void booktic(flightmange *fl,int *length)訂票
flightdetail* findname(flightdetail *m,char na[]) 搜索指定用戶名
void returntic(flightmange *fl,int *length)退票
void search(flightmange *fl,int *length)搜索指定用戶的航班信息
void create(flightmange *fl,int *length)在原有的航班基礎上添加新航班
*/
#define N 5
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
#include "ctype.h"
#include "conio.h"
typedef struct flightdetail
{
char customer[10];
int num;
struct flightdetail *next;
}flightdetail;
typedef struct flightmange
{
// char name[20];
char date[20];
char staAddr[20];
char endAddr[20];
int booked;
int ticket;
int flightnum;
char people[5][20];
flightdetail *next;
}flightmange;
void init(flightmange* fl,char staAdd[][20],char endAdd[][20],char date[][20],int fnum[],int tic[] )
{
int i;
flightdetail *fd;
for(i=0;i<N;i++)
{ fd=(flightdetail *)malloc(sizeof(flightdetail));
// strcpy((fl[i]).name,fn[i]);
strcpy((fl[i]).staAddr,staAdd[i]);
strcpy((fl[i]).endAddr,endAdd[i]);
strcpy((fl[i]).date,date[i]);
(fl[i]).booked=0;
(fl[i]).ticket=tic[i];
(fl[i]).flightnum=fnum[i];
(fl[i]).next=fd;
fd->next=NULL;
for(int kk=0;kk<5;kk++)
(fl[i]).people[kk][0]='\0';
}
}
void printall(flightmange* fl,int *length)
{
int i;
printf("\n\t\t\t 所 有 航 班 信 息\n\n");
printf("\t航班號 起點站 終點站 日期 乘員定額 已售票數 剩余票數\n\n");
for(i=0;i<*length;i++)
{
printf("\t%-6d",(fl[i]).flightnum);
printf(" %-7s",(fl[i]).staAddr);
printf(" %-7s",(fl[i]).endAddr);
printf(" %-6s",(fl[i]).date);
printf(" %-8d",(fl[i]).ticket);
printf(" %-8d",(fl[i]).booked);
printf(" %-6d",(fl[i]).ticket-(fl[i]).booked);
printf("\n");
}
printf("\n\n\t按任意鍵返回主菜單\n");
getch();
}
void welcome()
{
printf("\n\n\n\t\t\t* * * * * * * * * *\n");
printf("\t\t\t飛 機 售 退 票 系 統\n");
printf("\t\t\t* * * * * * * * * *\n\n");
printf("\t\t 1. 增 加 航 班(需要密碼)\n");
printf("\t\t 2. 訂 票\n");
printf("\t\t 3. 退 票\n");
printf("\t\t 4. 顯 示 所 有 航 班 信 息\n");
printf("\t\t 5. 顯 示 我 的 航 班 信 息\n");
printf("\t\t 6. 退 出\n");
// printf("\n\nPlease Enter a Num to Select an Item\n\n");
}
int findflight(flightmange *fl,int n,int *length)
{
int i;
for(i=0;i<*length;i++)
if (fl[i].flightnum==n) return i;
return 999;
}
void printselect(flightmange *fl,int i,int n)
{
printf("\n\t\t\t%d 航 線 信 息\n\n",n);
printf(" 航班號 起點站 終點站 日 期 乘員定額 已售票數 剩余票數\n\n");
printf(" %-5d",(fl[i]).flightnum);
printf(" %-5s",(fl[i]).staAddr);
printf(" %-5s",(fl[i]).endAddr);
printf(" %-6s",(fl[i]).date);
printf(" %-8d",(fl[i]).ticket);
printf(" %-8d",(fl[i]).booked);
printf(" %-6d",(fl[i]).ticket-(fl[i]).booked);
printf("\n");
}
void booktic(flightmange *fl,int *length)
{
int i=0,n=0,t=999,nn=0;
char na[10],key;
flightdetail *p,*q;
printf("\n\t\t\t* * * * * * * * * *");
printf("\n\t\t\t 訂 票 系 統 ");
printf("\n\t\t\t* * * * * * * * * *\n\n");
while(1)
{
printf("\t請輸入航班號:");
scanf("%d",&n);
t=findflight(fl,n,length);
if(t==999) {
printf("\n沒有找到您所要的航班號,請重新輸入:");
getch();
// system("cls");
// printf("\n\t\t\t訂 票 系 統\n\n");
continue;
}
printselect(fl,t,n);
printf("\n\t請輸入您的姓名和所需的票數: ");
printf("\n\t姓名:");
scanf("%s",na);
printf("\n\t票數:");
scanf("%d",&nn);
if(nn==0)
{
printf("\n\t出錯:所輸入的票數不正確\n");
getch();
system("cls");
printf("\n\t\t訂 票 系 統\n\n");
continue;
}
if(nn<=(fl[t].ticket-fl[t].booked)&&n>=1)
{
q=fl[t].next->next;
p=(flightdetail *)malloc(sizeof(flightdetail));
strcpy(p->customer,na);
p->num=nn;
p->next=q;
fl[t].next->next=p;
fl[t].booked+=nn;
printf("\n\t%s,恭喜您訂票成功!\n",na);
getch();
return;
}
else
{
printf("\n\tSorry,沒有足夠的機票\n 按<Y> 重新輸入 按<W>候票 按<N>返回\n");
do
{
key=getch();
}while(key!='Y'&&key!='y'&&key!='n'&&key!='N'&&key!='W'&&key!='w');
}
if(key=='Y'||key=='y')
{
system("cls");
printf("\n\t\t\t\t 訂 票 系 統\n\n");
continue;
}
else if(key=='W'||key=='w')//候票
{
for(int kk=0;kk<5&&fl[t].people[kk][0]!='\0';kk++)
;
strcpy(fl[t].people[kk],na);
printf("\n\t%s,已排入候票隊列,請耐心等候!\n",na);
getch();
return;
}
else if(key=='N'||key=='n')
{
return;
}
else {
printf("\n\tsorry,訂票失敗!");
return;
}
}
}
flightdetail* findname(flightdetail *m,char na[])
{
flightdetail *p=m;
m=m->next;
while(m!=NULL)
{
if(strcmp(m->customer,na)==0) return p;
p=m;
m=m->next;
}
return NULL;
}
void returntic(flightmange *fl,int *length)
{
int i=0,n=0,t=999,nn=0;
char na[10],key;
flightdetail *p,*q;
printf("\n\t\t\t* * * * * * * * * *");
printf("\n\t\t\t 退 票 系 統 ");
printf("\n\t\t\t* * * * * * * * * *\n\n");
while(1)
{
printf("\nStep1.請輸入航班號:");
scanf("%d",&n);
t=findflight(fl,n,length);
if(t==999)
{
printf("\n航班號未找到,按<Y>重新輸入 或 按<N>返回");
do
{
key=getch();
}while(key!='Y'&&key!='y'&&key!='n'&&key!='N');
if(key=='n'||key=='N')
{
// printf("\n\tOperation Failed ,Thanks for Using");
getch();
return;
}
else{
system("cls");
printf("\n\t\t\t退 票 系 統\n\n");
continue;
}
}
// printf("\nCorrect Flight Num!\n\n");
printf("Step2.姓名:");
scanf("%s",na);
p=findname(fl[t].next,na);
if(p==NULL)
{
printf("\n沒有找到您的信息!\n 按<Y>重新輸入 按<N>返回");
do
{
key=getch();
}while(key!='Y'&&key!='y'&&key!='n'&&key!='N');
if(key=='n'||key=='N')
{
printf("\n\t退票失敗!\n");
getch();
return;
}
else{
system("cls");
printf("\n\t\t\t退 票 系 統\n\n");
continue;
}
}
printf("\n\t航班號 起始站 終點站 姓 名 所訂票數 ");
printf("\n\t %-5d %-10s %-10s %-10s %-10d",fl[t].flightnum,fl[t].staAddr,fl[t].endAddr,p->next->customer,p->next->num);
printf("\nStep3.需要退的票數:");
scanf("%d",&nn);
q=p->next;
if(nn>q->num||nn<1)
{
printf("\n所輸入的票數不對\n\t按 <Y> 重新輸入 按 <N>返回");
do
{
key=getch();
}while(key!='Y'&&key!='y'&&key!='n'&&key!='N');
if(key=='n'||key=='N')
{
printf("\n\t退票失敗!\n");
getch();
return;
}
else{
system("cls");
printf("\n\t\t\t訂 票 系 統\n");
continue;
}
}
q->num-=nn;
printf("\n%s,您已經成功退了 %d 張票 \n \n\t按任意鍵返回",q->customer,nn);
if(q->num==0)
{
p->next=q->next;
free(q);
}
fl[t].booked-=nn;
getch();
//補票
int Rest=fl[t].ticket-fl[t].booked;
int ticketnum=0;
// char ch;
for(int kk=0;kk<5 && fl[t].people[kk][0]!='\0' && Rest>0;kk++)
{
strcpy(na,fl[t].people[kk]);
printf("\n\t %s 有票了!",na);
printf("請輸入所需的票數(1~%d),按0放棄訂票\n",Rest);
scanf("%d",&ticketnum);
if(ticketnum==0)
continue;
int flag=1;
while(flag)
{
if(ticketnum<=Rest && ticketnum>0)
{
flag=0;
Rest-=ticketnum;
q=fl[t].next->next;
p=(flightdetail *)malloc(sizeof(flightdetail));
strcpy(p->customer,na);
p->num=ticketnum;
p->next=q;
fl[t].next->next=p;
fl[t].booked+=nn;
printf("\n%s,恭喜您訂票成功!\n",na);
getch();
break;
}
else
{
printf("\nsorry:您所輸入的票數不正確,請重新輸入\n");
scanf("%d",&ticketnum);
if(ticketnum==0)
{
flag=0;
break;
}
}
}
}
break;
}
}
void search(flightmange *fl,int *length)
{ int ff=0,i;
char na[10];
flightdetail *p;
printf("Enter Your Name:");
scanf("%s",na);
printf("\n\n\t航班號 起點站 終點站 時間 姓名 票數\n\n");
for(i=0;i<*length;i++)
{
p=fl[i].next->next;
// int zhou=(p==NULL);
while(p)
{
if(strcmp(p->customer,na)==0)
{
printf("\t%-10d",(fl[i]).flightnum);
printf(" %-10s",(fl[i]).staAddr);
printf(" %-10s",(fl[i]).endAddr);
printf(" %-10s",(fl[i]).date);
printf(" %-10s",p->customer);
printf(" %-4d\n",p->num);
ff++;
}
p=p->next;
}
}
if(!ff) printf("\n\t沒有找到您需要的航班");
getch();
}
void create(flightmange *fl,int *length)
{
char sa[20],ea[20],date[20],password[]="123456",pa[7],key;
int m,n,i;
flightdetail *p;
printf("\n\t輸入密碼:");
while(1)
{
for(i=0;i<7;i++)
{
pa[i]=getch();
if(pa[i]=='\r')//回車符
{
pa[i]='\0';
break;
}
printf("*");
}
if(strcmp(password,pa)==0)
{
printf("\n\n\t密碼正確!\n");break;
}
else
{
printf("\n\t密碼錯誤\n\t按<Y>重新輸入 按<N>返回\n");
do
{
key=getch();
}while(key!='Y'&&key!='y'&&key!='n'&&key!='N');
if(key=='n'||key=='N')
{
// printf("\n\t操作失敗");
getch();
return;
}
else{
// system("cls");
printf("\t輸入密碼:");
continue;
}
}
}
//system("cls");
printf("\n\t輸入航班號:");
scanf("%d",&n);
printf("\n\t輸入起點站:");
scanf("%s",sa);
printf("\n\t輸入終點站:");
scanf("%s",ea);
printf("\n\t輸入日期:");
scanf("%s",date);
printf("\n\t輸入票數:");
scanf("%d",&m);
strcpy(fl[*length].staAddr,sa);
strcpy(fl[*length].endAddr,ea);
fl[*length].flightnum=n;
strcpy(fl[*length].date,date);
fl[*length].ticket=m;
fl[*length].booked=0;
p=(flightdetail *)malloc(sizeof(flightdetail));
p->next=NULL;
fl[*length].next=p;
printf("\n");
printselect(fl,*length,n);
printf("\n\t按任意鍵返回\n");
(*length)++;
getch();
}
void main()
{
char sa[N][20]={"杭州","杭州","杭州","上海","杭州"};
char ea[N][20]={"北京","北京","武漢","北京","天津"};
char date[N][20]={"12.31","1.2","1.3","1.5","1.7"};
int fnum[N]={1001,1001,1002,1003,1004},tic[N]={11,42,32,34,12};
char key;
flightmange *fl;
int size=50,length=N;
fl=(flightmange *)malloc(size*sizeof(flightmange));
init(fl,sa,ea,date,fnum,tic) ;
system("cls");
/* printf("\t\t\t* * * * * * * * * *\n");
printf("\n\t\t民航售票系統\n\n\n");
printf("\t\t\t* * * * * * * * * *\n");
printf("\nInfo:This Programe was Compiled With Visual C++,\n And Has Been Tested On TurboC2.0");
getch();
printf("\nInitialize Success!\nNow Press Any Key to Continue");
getch();
system("cls");
*/
welcome();
while((key=getch())!='6')
{
switch(key)
{ case '1' :system("cls");create(fl,&length);system("cls");welcome();break;
case '2' :system("cls");booktic(fl,&length);system("cls");welcome();break;
case '3' :system("cls");returntic(fl,&length);system("cls");welcome();break;
case '4' :system("cls");printall(fl,&length);system("cls");welcome();break;
case '5' :system("cls");search(fl,&length);system("cls");welcome();break;
default :;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -