该程序实现航班信息的管理和顾客订票功能,分管理员和顾客两种角色。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
/*************************************************************************/
/* 登陆分管理员和用户 */
/* 管理员功能: */
/* 1.管理航班信息(如增加、删除、修改航班信息) */
/* 2.查看订票信息(如查看所有航班的售票情况、查询某次航班信息)*/
/* 用户功能: */
/* 1.查看所有航班信息(根据航班号、出发地、目的地等) */
/* 2.订票 */
/* 3.退票 */
/*************************************************************************/
//机票实际上应够由航班号、日期来共同确定其唯一性,这里为了简便,不再做具体处理
//定义日期结构体
struct Date
{
int year;
int month;
int day;
};
//定义时间
struct StTime
{
int hour;
int mint;
int sec;
};
//定义购票信息结构体
struct StTickInfo
{
char id[16]; //订单号(根据时间生成,或者随机生成,这里这个这个字段可以没有,实际系统中肯定是要有的)
Date date; //订票日期
char hangban[16];//航班号,通过航班号,可以查询航班信息
char guest[20]; //订票人名
char guId[20]; //订票人身份证号
char phone[12]; //订票人电话
};
//航班信息
struct StHangbanInfo
{
char hangban[16];//航班号
char name[16]; //航空公司名称
char src[16]; //出发地
char dst[16]; //目的地
Date date; //航班日期
StTime tm; //起飞时间
int nmbZw; //座位数量
int nmbUse; //已售票数
int price; //票价
};
//定义全局变量,管理航班和订票信息
struct StHangbanInfo g_allHb[100]; //保存当前所有航班信息
int g_nmbHb=0; //实际航班数量
struct StTickInfo g_allTicks[200]; //保存当前所有的订单信息
int g_nmbTicks=0; //当前系统中实际购票数量
//根据航班号查询航班信息
struct StHangbanInfo searchById(char* id)
{
int i;
struct StHangbanInfo stnull;
memset(&stnull.hangban,0,16);
for (i=0;i<g_nmbHb;i++)
{
if(strcmp(g_allHb[i].hangban,id)==0)
return g_allHb[i];
}
printf("未找到航班信息\n");
return stnull;
}
//根据时间生成订单编号
void getId(char buf[])
{
time_t t;
struct tm * lt;
time (&t);//获取时间戳
lt = localtime (&t);//转为时间结构
//sprintf不安全,可以更换为sprintf_s
sprintf(buf,"%d%02d/%02d%02d%02d%02d",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
}
//获取当前时间
struct Date getCurrentDate()
{
Date oo;
time_t t;
struct tm * lt;
time (&t);//获取时间戳
lt = localtime (&t);//转为时间结构
//sprintf不安全,可以更换为sprintf_s
//sprintf(buf,"%d%02d/%02d%02d%02d%02d",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
oo.year = lt->tm_year+1900;
oo.month = lt->tm_mon;
oo.day = lt->tm_mday;
return oo;
}
//显示航班信息标题
void showHbTitle()
{
printf("航班号 航空公司 起始地 目的地 起飞日期及时间 价格 座位数 剩余票数\n");
}
//显示单条航班信息
void showSingleHbInfo(struct StHangbanInfo st)
{
printf("%s %s %s %s %d-%02d-%02d %02d:%02d %d %d %d\n",st.hangban,st.name,st.src,st.dst,
st.date.year,st.date.month,st.date.day,st.tm.hour,st.tm.mint,st.price,st.nmbZw,st.nmbZw-st.nmbUse);
}
//查询航班-管理员和用户通用
void search()
{
int opt,i;
char ch;
char id[16]={0};
char start[16]={0},end[16]={0};
struct StHangbanInfo hb;
int nmb=0;
system("cls");
if(g_nmbHb==0)
{
printf("目前暂无航班信息,请先添加航班\n");
system("pause");
return;
}
while (1)
{
system("cls");
printf("1.根据航班号查询\n");
printf("2.根据出发地、目的地查询\n");
while(1)
{
scanf("%d",&opt);
if(opt ==1 || opt ==2) break;
}
fflush(stdin); //清空输入缓存
switch(opt)
{
case 1:
printf("请输入航班号:");
scanf("%s",id);
hb = searchById(id);
if(strlen(hb.hangban) > 0)
{
showHbTitle();
showSingleHbInfo(hb);
}
break;
case 2:
printf("请输入起始地、目的地:");
scanf("%s %s",start,end);
showHbTitle();
for (i=0;i<g_nmbHb;i++)
{
if(strcmp(g_allHb[i].src,start)==0 && strcmp(g_allHb[i].dst,end)==0)
showSingleHbInfo(g_allHb[i]);
}
break;
}
printf("是否继续查询(Y/N)?");
fflush(stdin);
ch = getchar();
if(ch=='N' || ch=='n')
break;
}
}
//----------------管理员功能------------------//
//新增航班
void addHangban()
{
struct StHangbanInfo st;
system("cls");
fflush(stdin);
printf("请输入航班号:");
scanf("%s",st.hangban);
printf("请输入航班公司名称:");
scanf("%s",st.name);
printf("请输入起始地:");
scanf("%s",st.src);
printf("请输入目的地:");
scanf("%s",st.dst);
printf("请输入起飞日期(YYYY-M-D):");
scanf("%d-%d-%d",&st.date.year,&st.date.month,&st.date.day);
printf("请输入起飞时间(H:M):");
scanf("%d:%d",&st.tm.hour,&st.tm.mint);
printf("请输入票价:"); //这里不再区分头等舱和经济舱
scanf("%d",&st.price);
printf("请输入座位数量:");
scanf("%d",&st.nmbZw);
st.nmbUse = 0;
g_allHb[g_nmbHb++] = st; //保存数据
printf("添加航班成功\n");
system("pause");
}
//从订单信息中删除某航班的所有订票信息
void delSpecHb(char* id)
{
int i,j;
for (i=0;i<g_nmbTicks;i++)
{
if(strcmp(g_allTicks[i].hangban,id)==0)
{
for(j=i;j<g_nmbTicks-1;j++)
{
g_allTicks[j] = g_allTicks[j-1];
}
g_nmbTicks--;
i--; //i回退一下,for循环i++后,仍指向该删除元素的位置,并开始判断
}
}
}
//删除航班(航班也需要从订票信息中删除)
void delHb()
{
int i;
char id[16]={0};
fflush(stdin);
system("cls");
printf("请输入要删除的航班号:");
scanf("%s",id);
for (i=0;i<g_nmbHb;i++)
{
if (strcmp(id,g_allHb[i].hangban)==0)
{
//从订票信息中删除该航班的所有订票信息(退费、短信通知等功能这里就不写了)
delSpecHb(g_allHb[i].hangban);
printf("删除成功\n");
g_nmbHb--;
system("pause");
return ;
}
}
printf("未找到该航班号\n");
system("pause");
}
//管理员功能入口
void deal_manager()
{
int opt;
while(1)
{
system("cls");
printf("1.查询航班\n");
printf("2.添加航班\n");
printf("3.删除航班\n");
printf("4.退出\n");
printf("请选择:");
scanf("%d",&opt);
switch(opt)
{
case 1:
search();
break;
case 2:
addHangban();
break;
case 3:
delHb();
break;
case 4:
return;
}
}
}
//----------------客户功能------------------//
//购票
void gouPiao()
{
struct StTickInfo tk;
int i,flag=0;
system("cls");
fflush(stdin);
printf("请输入航班号:");
while(1)
{
scanf("%s",tk.hangban);
//这里最好对航班进行处理,比如查看航班是否存在,票是否已经售完
for (i=0;i<g_nmbHb;i++)
{
if (strcmp(g_allHb[i].hangban,tk.hangban)==0 )
{
if( g_allHb[i].nmbZw-g_allHb[i].nmbUse == 0)
flag = 1;
break;
}
}
if(i==g_nmbHb)
{
printf("未找到该航班,请重新输入航班号:");
}else
{
if(flag==1)
printf("该航班机票已售罄,请选择其他航班:\n");
else
{
g_allHb[i].nmbUse+=1; //将该航班的已售票数+1
break;
}
}
}
printf("请输入订票人姓名");
scanf("%s",tk.guest);
printf("请输入订票人身份证号:");
scanf("%s",tk.guId);
printf("请输入订票人手机号:");
scanf("%s",tk.phone);
//生成订单号
getId(tk.id);
//填充购票时间
tk.date = getCurrentDate();
//保存
g_allTicks[g_nmbTicks++] = tk;
printf("购票成功\n");
system("pause");
}
//退票(通过身份证退票,限定一人只能买一张票)
void tuiPiao()
{
char buf[16];
int i,j;
fflush(stdin);
printf("请输入退票人的身份证号:");
scanf("%s",buf);
for (i=0;i<g_nmbTicks;i++)
{
if(strcmp(g_allTicks[i].guId,buf)==0)
{
//修改该航班的已售票数
for (j=0;j<g_nmbHb;j++)
{
if(strcmp(g_allHb[j].hangban,g_allTicks[i].hangban)==0)
{
g_allHb[j].nmbUse-=1;
break;
}
}
//删除该订票信息
for (j=i;j<g_nmbTicks-1;j++)
{
g_allTicks[j] = g_allTicks[j+1];
}
g_nmbTicks--;
printf("退票成功\n");
break;
}
}
if(i==g_nmbTicks)
printf("没有此人的购票信息\n");
system("pause");
}
//客户功能入口
void deal_customer()
{
int opt;
while(1)
{
system("cls");
printf("1.查询航班\n");
printf("2.购票\n");
printf("3.退票\n");
printf("4.退出\n");
printf("请选择:");
scanf("%d",&opt);
switch(opt)
{
case 1:
search();
break;
case 2:
gouPiao();
break;
case 3:
tuiPiao();
break;
case 4:
return;
}
}
}
int main(void)
{
int opt;
while(1)
{
system("cls");
printf("----------订票管理系统-----------------|\n");
printf("| 1.管理员登陆 |\n");
printf("| 2.客户登陆 |\n");
printf("| 9.退出系统 |\n");
printf("---------------------------------------|\n");
printf("请选择:");
scanf("%d",&opt);
switch(opt)
{
case 1:
deal_manager();
break;
case 2:
deal_customer();
break;
case 9:
return 0;
}
}
return 0;
}