任务: 航空客运定票的业务活动包括:查询航线、客票预定和办理退票等。试设计一 个航空客运定票系统,以使上述业务可以借助计算机来完成。
功能要求:
1) 录入:可以录入航班情况
2) 查询:可以查询某个航线的情况(如输入航班号,查询起降时间,起飞抵达城 市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞 机航班情况;
3) 订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果 该航班已经无票,可以提供相关可选择航班;
4) 退票: 可退票,退票后修改相关数据文件;
5) 客户资料:有姓名,证件号,订票数量及航班情况,订单要有编号;
6) 修改航班信息:当航班信息改变可以修改航班数据文件。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct CNode {
char name[20];//姓名
int num;//订票数
char ID[20];//身份证
char day[20];
int dengji;//舱等级
CNode* next;
} CNode, * CList;//乘客节点
typedef struct hangban {
char hbID[20];//航班编号
char qidian[20];//起点站名
char zhongdian[20];//终点站名
char time1[20];//起飞时间
char time12[20];//起飞时间
char time2[20];//到达时间
char time22[20];//到达时间
int price;//价格
int account;//折扣率
int maxnum;//总票数
int less;//总余票量
hangban* next;
CList cusLinkList;//乘员名单域,指向乘员名单链表的头指针
} hangban, hangbanNode, * Phangban;//航班节点
int menu();// 菜单界面函数
void initFlight(); //初始化航班链表
int initCusLinkList(CList& cusLinkList);//初始化订票乘客链表
void dingpiaoFace();// 订票界面
void dingpiao();// 订票函数
CList addlink(CList& head, int need, char name[], char id[]);
//将订票成功的乘客节点加入到已订票链表
void sousuoflight(hangban* pflight);//由起点终点搜索航班
void find(hangban* pflight);//根据自己输入的航班标号查询是否存在并返回节点
void pricusInfo();//输出已经订票的函数
void fightinfo(hangban* p);//输出对应节点信息
hangban* find(); // 输入编号返回对应信息
void tuipiaoFace(); //退票界面
void printfall(hangban* pflight);//打印全部航班信息
void tuipiao();// 退票
void sousuoFace();// 搜索界面
void elseswitch(hangban* pflight);
void charushanchuFace(); //插入和删除
int zengjiaFlight();//增加航班
int shanchuFlight();// 删除航班
int Create(Phangban flight1);//将航班信息插入到链表中
int duibiFlight(hangban* flight, char flightCodeID[]);
// 对比插入航班标号,防止标号重复
hangban* pFlight;//全局节点变量
hangban* p;
//初始输入的航班信息
hangban flight1[5] = {
{"MU5103","上海虹桥","北京","7","00","9","20",1063,94,20,2},
{"CA1590","上海虹桥","北京","8","55","11","15",864,75,20,0},
{"FM9307","上海虹桥","广州","10","30","12","50",608,48,20,5},
{"HO1241","上海浦东","青岛","19","50","21","20",418,56,20,11},
{"3U8964","上海浦东","成都","15","45","19","05",922,57,20,1},
};
void initFlight()// 初始化航班链表
{
pFlight = (hangban*)malloc(sizeof(hangban));
if (pFlight == NULL) exit(0);
pFlight->next = NULL;
}
int Create(Phangban flight1)// 将已有航班信息插入链表
{
hangban* p = pFlight, * q;
for (int i = 0; i < 5; i++) {
q = (hangban*)malloc(sizeof(hangban));
if (q == NULL)
return 0;
strcpy(q->hbID, flight1[i].hbID);
strcpy(q->qidian, flight1[i].qidian);//利用链表把每个信息录入
strcpy(q->zhongdian, flight1[i].zhongdian);
strcpy(q->time1, flight1[i].time1);
strcpy(q->time12, flight1[i].time12);
strcpy(q->time2, flight1[i].time2);
strcpy(q->time22, flight1[i].time22);
q->price= flight1[i].price;
q->account=flight1[i].account;
q->maxnum = flight1[i].maxnum;
q->less = flight1[i].less;
initCusLinkList(q->cusLinkList); //初始化已经订票乘客链表
q->next = p->next;
p->next = q;
}
return 1;
}
int initCusLinkList(CList& cusLinkList)//初始化已订票乘客指针链表
{
CList q = cusLinkList;
cusLinkList = (CNode*)malloc(sizeof(CNode));
cusLinkList->next = NULL;
return 0;
}
//第一个
void printfall(hangban* pflight)//打印全部航班信息
{
hangban* p;
p = pflight->next;
printf("航班编号 起点 终点 起飞时间 到达时间 价格 折扣率 总票数 总余票数 \n");
while (p != NULL)
{
printf("%6s %4s %2s %2s:%2s %2s:%2s %6d %5d %3d %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
p = p->next;
}
printf("\n\n");
}
//第二个
void sousuoFace() //搜索界面
{
int a2;
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" 搜索航班\n");
printf("***********************************************************\n");
printf(" 1.根据起飞抵达城市搜索航班 \n");
printf(" 2.根据航班号搜索航班 \n");
printf(" 3.返回上一级 \n");
printf("***********************************************************\n");
printf(" 请输入您的选择:");
scanf("%d", &a2);
switch (a2)
{
case 1:
sousuoflight(pFlight);//输入起点和终点搜索航班
system("PAUSE");
sousuoFace();
break;
case 2:
find(pFlight);//输入航班号搜索航班
system("PAUSE");
sousuoFace();
break;
case 3:
menu();
break;
default:
sousuoFace();
}
}
void sousuoflight(hangban* pflight) //有起点和终点搜索对应航班
{
hangban* p;
p = pflight->next;
char qidian[10];
char zhongdian[10];
int flag = 0;
printf("请输入起点站名:");
scanf("%s", qidian);
printf("请输入终点站名:");
scanf("%s", zhongdian);
printf("航班编号 起点 终点 起飞时间 到达时间 价格 折扣率 总票数 总余票数 \n");
while (p != NULL)
{
if ((strcmp(qidian, p->qidian) == 0) && (strcmp(zhongdian, p->zhongdian) == 0))
// 对比输入的起点和终点,推荐航班
{
flag = 1;
printf("%6s %4s %2s %2s:%2s %2s:%2s %6d %5d %3d %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
}
p = p->next;
}
printf("\n\n");
if (flag == 0)
printf("不存在该航班! \n");
}
void find(hangban* pflight)//根据自己输入的航班标号查询是否存在并返回节点
{
hangban* p;
p = pflight->next;
char number[10];
int i = 0;
printf("请输入航班编号: ");
scanf("%s", number);
printf("航班编号 起点 终点 起飞时间 到达时间 价格 折扣率 总票数 总余票数 \n");
while (p != NULL)
{
if ((strcmp(number, p->hbID) == 0))
// 对比输入的起点和终点,推荐航班
{
i = 1;
printf("%6s %4s %2s %2s:%2s %2s:%2s %6d %5d %3d %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
}
p = p->next;
}
printf("\n\n");
if (i == 0)
printf("不存在该航班! \n");
}
//第三个
void dingpiaoFace() //订票界面
{
int a3;
printf("\n");
printf("\n");
printf(" 订票\n");
printf("***********************************************************\n");
printf(" 1.订票 \n");
printf(" 2.由起点和终点搜索航班 \n");
printf(" 3.搜索所有航班 \n");
printf(" 4.通过航班编号查询客户 \n");
printf(" 5.返回上一级 \n");
printf("***********************************************************\n");
printf(" 请输入你要办理的业务:");
scanf("%d", &a3);
switch (a3)
{
case 1://订票
dingpiao();
system("PAUSE");
dingpiaoFace();
break;
case 2://输入起点和终点查询
sousuoflight(pFlight);
system("PAUSE");
dingpiaoFace();
break;
case 3:
printfall(pFlight);
system("PAUSE");
dingpiaoFace();
break;
case 4: //查到客户的姓名和订票量
pricusInfo();
system("PAUSE");
dingpiaoFace();
break;
case 5:
menu();
break;
default:
dingpiaoFace();
}
}
hangban* find()//根据自己输入的航班号查询是否存在并返回节点
{
char number[10];
int i = 0;
printf("请输入航班编号: ");
scanf("%s", number);
hangban* p = pFlight->next; //头结点的下一个节点开始遍历
while (p != NULL)
{
if (!strcmp(number, p->hbID))
return p;
p = p->next;
}
return NULL;
}
void pricusInfo()//输出订购该航班乘客的姓名,票数,等级
{
CList p;
hangban* info;
info = find();//由输入的航班编号查询航班是否存在,并将节点复制给info
if (info == NULL)
{
printf("没有这个航班\n");
return;
}
//头结点的下一个节点开始遍历
p = info->cusLinkList->next;
if (p != NULL)
{
printf("客户姓名 订票数额 \n");
while (p)
{
printf("%s\t\t%d\n", p->name,1);
p = p->next;
}
}
else
printf("该航班没有客户信息!!\n");
}
void dingpiao() // 订票函数
{
struct hangban* info;
int need, grade;
int num;//剩余的p数目
char name[20];
char id[20];
info = find();//输入想订的航班,看是否还有空位置,并返回复制节点
if (info == NULL)
{
printf("不存在该航班!\n");
dingpiaoFace();
}
printf("请输入您想要定得票数:");
scanf("%d", &need);
if (need <= 0)
{
scanf("%d", &need);
}
num = info->less;
if (need <= num) //订票数小于剩余数
{
if (need == 1)
{
printf("请输入您的姓名:");
scanf("%s", name);
printf("请输入您的身份证号码:");
scanf("%s", id);
CList head = info->cusLinkList;
addlink(head, need, name, id);//订票成功,插入成员名单链表
printf("姓名 证件号 订票数 航班号 座位号\n");
printf("%s %s %d %s %d\n", name,id,need, info, info->maxnum - info->less + 1);
info->less--;
printf("\n订票成功!\n");
}
else if (need > 1)
{
int i;
for (i =0; i <need; i++)
{
printf("请输入您的姓名:");
scanf("%s", name);
printf("请输入您的身份证号码:");
scanf("%s", id);
CList head = info->cusLinkList;
addlink(head, need, name, id);//订票成功,插入成员名单链表
printf("姓名 证件号 订票数 航班号 座位号\n");
printf("%s %s %d %s %d\n", name, id, 1, info, info->maxnum - info->less+1 );
info->less--;
}
printf("\n订票成功!\n");
}
}
else
{
char r;
printf("票不足,以下为该航班乘客信息\n");
info->less = 0;
fightinfo(info);//输出该航班的订票信息
printf("是否查看其他航班信息?Y/N\n");
scanf("%s", &r);
if (r == 'Y' || r == 'y') //改变计划,重新选择航班
{
elseswitch(pFlight);
}
else if (r == 'N' || r == 'n')
{
dingpiaoFace();
}
}
}
//name, id, need, info, info->maxnum - info->less + 1
CList addlink(CList& head, int need, char name[], char id[])
//插入到已经订票客户链表
{
CList new1;//创建一个新节点
new1 = (CNode*)malloc(sizeof(CNode));
if (new1 == NULL)
{
printf("\n内存不足\n");
return NULL;
}
strcpy(new1->name, name);
strcpy(new1->ID, id);
new1->num = need;
new1->next = head->next;//头插入法加入成员名单域
head->next = new1;
return head;
}
void fightinfo(hangban* p)//输出p节点的航班信息
{
printf("航班编号 起点 终点 起飞时间 到达时间 价格 折扣率 总票数 总余票数 \n");
printf("%6s %4s %2s %2s:%2s %2s:%2s %6d %5d %3d %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
printf("\n\n");
}
void elseswitch(hangban* pflight)//打印全部航班信息
{
char a;
hangban* p;
p = pflight->next;
printf("航班编号 起点 终点 起飞时间 到达时间 价格 折扣率 总票数 总余票数 \n");
while (p != NULL)
{
printf("%6s %4s %2s %2s:%2s %2s:%2s %6d %5d %3d %4d\n", p->hbID, p->qidian, p->zhongdian, p->time1, p->time12, p->time2, p->time22, p->price, p->account, p->maxnum, p->less);
p = p->next;
}
printf("\n\n");
printf("是否返回订票界面?");
scanf("%s", &a);
if (a == 'Y' || a == 'y') //改变计划,重新选择航班
{
dingpiaoFace();
}
}
//第四个
void tuipiaoFace()//退票模块界面
{
int a3;
printf("\n");
printf("\n");
printf(" 退票\n");
printf("***********************************************************\n");
printf(" 1.办理退票 \n");
printf(" 2.返回上一级 \n");
printf("***********************************************************\n");
printf(" 请输入你要办理的业务:");
scanf("%d", &a3);
switch (a3)
{
case 1:
tuipiao();
system("PAUSE");
tuipiaoFace();
break;
case 2:
menu();
break;
default:
tuipiaoFace();
}
}
void tuipiao() //退票功能
{
struct hangban* info;
CNode* p1, * p2, * head;//p1为遍历指针,p2指向p1的前驱
char name[20];//客户姓名
char id[20];//客户身份证
info = find();//复制节点信息给info,find函数根据航班编号返回该航班节点的指针
while (info == NULL)
{
printf("没有这个航班, 请重新输入\n");
tuipiao();
}
head = info->cusLinkList;//head为该航班的的乘员名单域的头指针
p1 = head->next; //带头结点的指针,head->next 开始遍历
printf("请输入你的姓名: ");
scanf("%s", name);
printf("请输入你的身份证号码: ");
scanf("%s", id);
p2 = head;//根据客户姓名搜索客户是否订票
while (p1 != NULL)
{//对比姓名和身份证
if ((strcmp(name, p1->name) == 0) && (strcmp(id, p1->ID) == 0)) break;
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL)
{
printf("对不起,你没有订过票或姓名和身份证不对应\n");
return;
}
else
{//退票成功
//从乘客名单域中移除该节点
p2->next = p1->next;
//加回该航班的剩余票
info->less ++;
printf("%s 成功退票!\n", p1->name);
free(p1);
}
}
void charushanchuFace()//插入删除节点函数
{
int a2;
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf(" 插入与删除\n");
printf("***********************************************************\n");
printf(" 1.增加航班 \n");
printf(" 2.删除航班 \n");
printf(" 3.返回上一级 \n");
printf("***********************************************************\n");
printf(" 请输入你要办理的业务:");
scanf("%d", &a2);
switch (a2)
{
case 1:
zengjiaFlight();//增加航班节点函数
charushanchuFace();
break;
case 2:
if (1 == shanchuFlight())//删除航班节点函数
{
printf("删除成功\n");
}
else
{
printf("没有这个航班,删除失败!\n");
};
charushanchuFace();
case 3:
menu();
break;
default:
charushanchuFace();
}
}
int zengjiaFlight()//增加航班函数
{
hangbanNode* q;//定义q为新增加的航班结点的指针的形参
hangban* p = pFlight;
int y = 1;
while (y != 0)
{
q = (hangbanNode*)malloc(sizeof(hangbanNode));
if (q == NULL)
return 0;
printf("\t\t请依次输入以下内容\n");
printf("\t\t请输入航班编号\n");
scanf("%s", q->hbID);
int t = duibiFlight(pFlight, q->hbID);//判断添加的航班编号是否已经存在
if (t == 0)
{
printf("该航班编号已经存在,请重新输入航班编号\n");
continue;
}
char hbID[20];//航班编号
char qidian[20];//起点站名
char zhongdian[20];//终点站名
char time1[20];//起飞时间
char time12[20];//起飞时间
char time2[20];//到达时间
char time22[20];//到达时间
char price[20];//价格
char account[20];//折扣率
int maxnum;//总票数
int less;//总余票量
printf("\t\t请输入起点站名\n");
scanf("%s", q->qidian);
printf("\t\t请输入终点站名\n");
scanf("%s", q->zhongdian);
printf("\t\t请输入起飞时间\n");
scanf("%s", &q->time1);
printf(":");
scanf("%s", &q->time12);
printf("\t\t请输入到达时间\n");
scanf("%s", &q->time2);
printf(":");
scanf("%s", &q->time22);
printf("\t\t请输入j价格\n");
scanf("%d", &q->price);
printf("\t\t请输入折扣率\n");
scanf("%d", &q->account);
printf("\t\t请输入乘客定额\n");
scanf("%d", &q->maxnum);
q->less = q->maxnum;
initCusLinkList(q->cusLinkList);//初始化
q->next = p->next;
p->next = q;
printf("\t\t是否继续录入航班信息(任意数字继续,0表示停止)。\n");
printf("\t\t请输入:");
scanf("%d", &y);
}
return 0;
}
int shanchuFlight()// 删除航班函数
{
char ID[20];
printf("请输入航班ID\n");
scanf("%s", ID);
Phangban pre = pFlight;
Phangban p = pre->next;
while (p != NULL) {
if (!strcmp(ID, p->hbID)) {
pre->next = p->next;
free(p);
return 1;
}
pre = p;
p = p->next;
}
return 0;
}
int duibiFlight(hangban* flight, char ID[])
//对比航班的编号,防止增加航班时,出现重复
{
hangban* p = flight;
while (p != NULL)
{
if (!strcmp(ID, p->hbID))
{
return 0;//航班ID重复
}
p = p->next;
}
//ID不重复
return 1;
}
int main()
{
initFlight();//初始化航班链表
Create(flight1);//将航标信息插入链表
menu(); //菜单
return 0;
}
int menu()//菜单界面函数
{
int i;
do {
{
system("color 9e");//用 system(“color 0A”); 其中color后面的0是背景色代号,A是前景色代号
printf("\n");
printf("\n");
printf(" 航空订票系统\n");
printf("***********************************************************\n");
printf(" 1. 查询航班 \n");
printf(" 2. 搜索航班 \n");
printf(" 3. 订票 \n");
printf(" 4. 退票 \n");
printf(" 5. 录入与删除 \n");
printf("***********************************************************\n");
printf(" 输入需要办理的业务:");
scanf("%d", &i);
}
switch (i)
{
case 1:
printfall(pFlight);//打印全部航班信息
system("PAUSE");//system(“PAUSE”)可以实现冻结屏幕,便于观察程序的执行结果;
menu();
break;
case 2:
sousuoFace();// 搜索界面
system("PAUSE");
menu();
break;
case 3:
dingpiaoFace();//订票界面
system("PAUSE");
menu();
break;
case 4:
tuipiaoFace();//退票界面
system("PAUSE");
menu();
break;
case 5:
charushanchuFace();//插入和删除新节点
system("PAUSE");
menu();
break;
default:
menu();//返回主菜单
}
} while (0);
return 0;
}
以上代码如有问题,欢迎评论或者私我解决