应该如何设计呢
参考代码如下:
如有帮助,请采纳一下,谢谢。
#include <iostream>
#include <list>
#include <string>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
struct StTickInfo
{
char id[16]; //订单号
Date date; //订票日期
char name[16]; //航空公司名称
char hangban[16];//航班号
char src[16]; //出发地
char dst[16]; //目的地
int price;
char guest[20]; //订票人名
char guId[20]; //订票人身份证号
};
//添加订单
void add(list<StTickInfo> &info)
{
StTickInfo st;
cout << "订 单 号:";
cin >> st.id;
cout << "订 票 日 期 :";
cin >> st.date.year >> st.date.month >> st.date.day;
cout << "航空公司名称:";
cin >> st.name;
cout << "航 班 号:";
cin >> st.hangban;
cout << "出 发 地:";
cin >> st.src;
cout << "目 的 地:";
cin >> st.dst;
cout << "价 格:";
cin >> st.price;
cout << "订票人姓名 :";
cin >> st.guest;
cout << "订票人身份证:";
cin >> st.guId;
info.push_back(st);
}
//删除订单(根据姓名或者身份证号删除,假设一个人只有一张票)
void dele(list<StTickInfo> &info)
{
string p;
cout << "请输入需要删除的订单信息(订票人姓名或者身份证号):";
cin >> p;
list<StTickInfo>::iterator it= info.begin();
for (; it != info.end();it++)
{
if(strcmp(it->guest,p.c_str()) == 0 || strcmp(it->guId,p.c_str()) == 0)
{
info.erase(it);
break;
}
}
}
//查找订单
void find(list<StTickInfo> &info)
{
string p="";
bool b = false;
cout << "请输入航班或航空公司名称或订票人姓名或订票人身份证号查找" << endl;
cin >> p;
list<StTickInfo>::iterator it= info.begin();
for (; it != info.end();it++)
{
//根据航班、航空公司名称、订票人姓名、订票人身份证号查找
if (strcmp(it->hangban,p.c_str()) == 0 || strcmp(it->name,p.c_str())==0 || strcmp(it->guest,p.c_str())==0 || strcmp(it->guId,p.c_str())==0)
{
b = true;
cout << "订 单 号:" << it->id << endl;
cout << "订 票 日 期 :" << it->date.year << "-" << it->date.month <<"-" << it->date.day << endl;
cout << "航空公司名称:" << it->name << endl;
cout << "航 班 号:" << it->hangban << endl;
cout << "出 发 地:" << it->src << endl;
cout << "目 的 地:" << it->dst << endl;
cout << "价 格:" << it->price << endl;
cout << "订票人姓名 :" << it->guest << endl;
cout << "订票人身份证:" << it->guId << endl;
}
}
cout <<endl;
if (!b)
cout << "未查找到结果"<< endl;
}
//按日期和航班号显示订票人
void Show(list<StTickInfo> &info)
{
Date dd;
string p;
bool b = false;
cout << "请输入航班号和日期:" ;
cin >> p >> dd.year >> dd.month >> dd.day;
list<StTickInfo>::iterator it= info.begin();
for (; it != info.end();it++)
{
if (strcmp(it->hangban,p.c_str()) == 0 && it->date.year == dd.year && it->date.month == dd.month && it->date.day == dd.day)
{
b = true;
cout << "订票人:" << it->guest << " " << it->guId << endl;
}
}
cout <<endl;
if (!b)
cout << "未查找到结果"<< endl;
}
int main(void)
{
int opt;
list<StTickInfo> info;
bool isWork = true;
while(isWork)
{
cout << "----------订票管理系统-----------------|"<< endl;
cout << "| 1.添加订单 |"<< endl;
cout << "| 2.删除订单 |"<< endl;
cout << "| 3.查找订单 |"<< endl;
cout << "| 4.按日期和航班号输出订票人 |"<< endl;
cout << "| 9.退出系统 |"<< endl;
cout << "----------请输入您的操作---------------|"<< endl;
cin >> opt;
switch(opt)
{
case 1:
add(info);
break;
case 2:
dele(info);
break;
case 3:
find(info);
break;
case 4:
Show(info);
break;
case 9:
isWork = false;
break;
}
}
return 0;
}
思路:
1.定义订票信息的数据结构数组;
2.用print方法输出主菜单;
3.每个菜单对应一个实现方法。
/*C语言实现简单的航班管理系统(单个文件)*/
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include<assert.h>
#define PERSON_MAXNUM 100
#define PERSONNOTICKET_MAX 10
#define MAX_SIZE 10
int _size = 0;
int _person_size = 0;
int _personnoticket_size = 0;
//定义航班信息结构体
typedef struct plane
{
char ID[10];
char Start_Place[10];
char End_Place[10];
float price;
int Buy_num;
int Max_num;
char time[20];
}Plane;
//定义乘客信息结构体
typedef struct Person
{
int AirPlane_Num;
char person_name[20];
}Person;
void home(Plane* p,Person* person, Person* person_noticket);//初始页面
void InitAirPlane(Plane** p);//初始化航班信息内存
void InputAirPlane(Plane* p);//输入航班信息
void CheckAirPlane(Plane* p);//查看航班信息
void DelAirPlane(Plane* p);//删除航班信息
void CheckAirPlaneOrder(Plane* p,Person* person);//查看航班订单
void PrintPerson(Plane* p, Person* person, int i);//打印航班乘客
void InitPerson(Person** person);//初始化乘客信息内存
void BookAirPlane(Plane* p, Person* person,Person* person_noticket);//预定航班
int CheckPerson(Plane* p, Person* person);//查看乘客订单信息
void ChangeAirPlane(Plane* p, Person* person);//改签
void ReturnTicket(Plane* p, Person* person);//退票
void PrintPerson(Plane* p, Person* person, int i);
void CheckPersonNoTicket(Plane* p, Person* person_noticket);//查看候补名单
///////////////////////////////////////
void home(Plane* p, Person* person, Person* person_noticket)
{
int a, i, j;
printf("\n*****************************欢迎进入飞机票务系统*****************************\n");
printf("\n*************您好,现在要确认您的身份!票务人员请按 1 ,旅客请按 0 ***********\n");
printf("请选择:");
scanf("%d", &a);
//航班管理人员操作
if (a == 1)
do{
printf("\n****************** 1.输入航班信息 *******************\n");
printf("\n****************** 2.删除航班信息 *******************\n");
printf("\n****************** 3.浏览航班信息 *******************\n");
printf("\n****************** 4.浏览目前已订票信息 *************\n");
printf("\n****************** 5.查看候补名单 *******************\n");
printf("\n****************** 0.退出 ********************\n");
printf("请选择:");
scanf("%d", &i);
switch (i)
{
case 0: break;
case 1:InputAirPlane(p);break;
case 2:DelAirPlane(p);break;
case 3:CheckAirPlane(p);break;
case 4:CheckAirPlaneOrder(p, person); break;
case 5:CheckPersonNoTicket(p, person_noticket); break;
default:
printf("输入错误!\n");
break;
}
} while (i != 0);
//乘客操作
if (a == 0)
do{
printf("\n*********************** 1.订票 **********************\n");
printf("\n*********************** 2.改签 **********************\n");
printf("\n*********************** 3.退票 **********************\n");
printf("\n*********************** 4.浏览航班信息 **************\n");
printf("\n*********************** 5.查询个人订票信息 **********\n");
printf("\n*********************** 0.退出 **********************\n");
printf("请选择:");
scanf("%d", &j);
switch (j)
{
case 0:break;
case 1:BookAirPlane(p, person,person_noticket);break;
case 2:ChangeAirPlane(p, person);break;
case 3:ReturnTicket(p, person);break;
case 4:CheckAirPlane(p);break;
case 5:CheckPerson(p, person); break;
}
} while (j != 0);
}
//初始化
void InitAirPlane(Plane** p)
{
assert(p);
//申请空间
*p = (Plane*)malloc(sizeof(Plane)*MAX_SIZE);
if (NULL == *p)
{
printf("开辟空间失败!\n");
return;
}
(*p)->Buy_num = 0;
}
//输入航班信息
void InputAirPlane(Plane* p)
{
if (_size <= MAX_SIZE)
{
printf("航班编号:%d\n", _size);
printf("输入航班ID:");
scanf("%s", (p+_size)->ID);
printf("输入始发地:");
scanf("%s", (p + _size)->Start_Place);
printf("输入目的地:");
scanf("%s", (p + _size)->End_Place);
printf("输入航班起飞时间:");
scanf("%s", (p + _size)->time);
printf("输入价格:");
scanf("%f", &(p + _size)->price);
printf("输入航班可乘坐最大人数:");
scanf("%d", &(p + _size)->Max_num);
do
{
printf("目前卖出机票数量:");
scanf("%d", &(p + _size)->Buy_num);
if ((p + _size)->Buy_num > (p + _size)->Max_num)
{
printf("输入已卖出机票数量错误!\n");
printf("请重新输入!\n\n");
}
} while ((p + _size)->Buy_num > (p + _size)->Max_num);
_size++;
printf("添加航班信息完成!\n\n");
}
else
{
printf("内存已满!\n");
return;
}
}
//浏览航班信息
void CheckAirPlane(Plane* p)
{
int i = 0;
printf("目前在售的航班信息:\n\n");
for (i = 0; i < _size; i++)
{
printf("航班编号:%d\n", i);
printf("ID:%s\n", (p+i)->ID);
printf("始发地:%s\n", (p + i)->Start_Place);
printf("目的地:%s\n", (p + i)->End_Place);
printf("起飞时间:%s\n", (p + i)->time);
printf("机票价格:%2f\n", (p + i)->price);
printf("剩余机票:%d\n", ((p + i)->Max_num - (p + i)->Buy_num) );
printf("\n");
}
}
//删除航班信息
void DelAirPlane(Plane* p)
{
int j = 0;
int i = -1;
assert(p);
printf("请输入要删除的航班编号:");
scanf("%d", &i);
for (j = i; j < _size; j++)
{
strcpy((p + j)->ID, (p + j + 1)->ID);
strcpy((p + j)->Start_Place, (p + j + 1)->Start_Place);
strcpy((p + j)->End_Place, (p + j)->End_Place);
strcpy((p + j)->time, (p + j + 1)->time);
(p + j)->price = (p + j + 1)->price;
(p + j)->Max_num = (p + j + 1)->Max_num;
(p + j)->Buy_num = (p + j + 1)->Buy_num;
}
_size--;
}
//初始化订票信息
void InitPerson(Person** person)
{
assert(person);
*person = (Person*)malloc(sizeof(Person)*PERSON_MAXNUM);
if (NULL == *person)
{
printf("开辟空间失败!\n");
return;
}
}
//订票
void BookAirPlane(Plane* p, Person* person, Person* person_noticket)
{
int i = -1;
CheckAirPlane(p);
printf("请选择你要预定的航班编号:");
scanf("%d", &i);
if ((p + i)->Max_num == (p + i)->Buy_num)
{
printf("对不起,该航班机票已售完!\n");
printf("请输入您的姓名(我们将把您添加进候补名单):");
scanf("%s", (person_noticket+_personnoticket_size)->person_name);
(person_noticket + _personnoticket_size)->AirPlane_Num = i;
_personnoticket_size++;
printf("添加候补名单成功!\n\n");
return;
}
else
{
if (_person_size > PERSON_MAXNUM)
{
printf("存储容量不足!\n");
return;
}
printf("请输入姓名:");
scanf("%s", (person + _person_size)->person_name);
(person + _person_size)->AirPlane_Num = i;
_person_size++;
(p + i)->Buy_num++;
printf("预定成功!\n");
}
}
//查看个人订票信息
int CheckPerson(Plane* p, Person* person)
{
int flag = 0;
int i = 0;
char _name[20] = { 0 };
printf("请输入您的姓名:");
scanf("%s", &_name);
printf("您的个人订票信息:\n\n");
for (i = 0; i < _person_size; i++)
{
if (0 == strcmp(_name, (person + i)->person_name))
{
flag = 1;
printf("订单编号:%d\n", i);
printf("姓名:%s\n", (person + i)->person_name);
printf("航班编号:%d\n", (person + i)->AirPlane_Num);
printf("航班ID:%s\n", (p + (person + i)->AirPlane_Num)->ID);
printf("始发地:%s\n", (p + (person + i)->AirPlane_Num)->Start_Place);
printf("目的地:%s\n", (p + (person + i)->AirPlane_Num)->End_Place);
printf("起飞时间:%s\n", (p + (person + i)->AirPlane_Num)->time);
printf("机票价格:%f\n", (p + (person + i)->AirPlane_Num)->price);
printf("\n");
}
}
if (0 == flag)
{
printf("未找到该乘客订票信息!\n");
return 0;
}
return 1;
}
//改签
void ChangeAirPlane(Plane* p, Person* person)
{
int i = -1;
int j = -1;
if (0 == CheckPerson(p, person))
{
return;
}
printf("请输入要改签的订单编号:");
printf("\n");
scanf("%d", &i);
(p + i)->Buy_num--;
CheckAirPlane(p);
do
{
printf("请输入要改签的航班编号:");
scanf("%d", &j);
if ((p + j)->Buy_num >= (p + j)->Max_num)
{
printf("该次航班已满员,请重新选择!\n");
}
} while ((p + j)->Buy_num >= (p + j)->Max_num);
(person + i)->AirPlane_Num = j;
(p + j)->Buy_num++;
printf("改签成功!\n\n");
}
//删除订单
void ReturnTicket(Plane* p, Person* person)
{
int i = -1;
int j = 0;
CheckPerson(p, person);
printf("请输入要删除的订单编号:");
scanf("%d", &i);
for (j = i; j < _person_size; j++)
{
(person + j)->AirPlane_Num = (person + j + 1)->AirPlane_Num;
strcpy((person + j)->person_name, (person + j + 1)->person_name);
}
printf("退票成功!\n");
}
//查看目前订票信息
void CheckAirPlaneOrder(Plane* p, Person* person)
{
int i = -1;
for (i = 0; i < _size; i++)
{
printf("航班编号:%d\n", i);
printf("ID:%s\n", (p + i)->ID);
printf("始发地:%s\n", (p + i)->Start_Place);
printf("目的地:%s\n", (p + i)->End_Place);
printf("起飞时间:%s\n", (p + i)->time);
printf("机票价格:%2f\n", (p + i)->price);
printf("剩余机票:%d\n", ((p + i)->Max_num - (p + i)->Buy_num));
printf("买票人信息:"); PrintPerson(p,person, i);
}
}
void PrintPerson(Plane* p, Person* person,int i)
{
int ticket_num = 0;
int j = 0;
for (j = 0; j < _person_size; j++)
{
if ((person + j)->AirPlane_Num == i)
{
printf("%s ,", (person + j)->person_name);
ticket_num++;
}
}
printf("\n\n");
}
//候补名单初始化
void InitPersonNoTicket(Person** person_noticket)
{
assert(person_noticket);
*person_noticket = (Person*)malloc(sizeof(Person)*PERSONNOTICKET_MAX);
if (NULL == *person_noticket)
{
printf("开辟空间失败!\n");
return;
}
}
//查看候补名单
void CheckPersonNoTicket(Plane* p, Person* person_noticket)
{
int i = 0;
printf("候补名单:\n\n");
if (0 == _personnoticket_size)
{
printf("候补名单为空!\n\n");
return;
}
for (i = 0; i < _personnoticket_size; i++)
{
printf("姓名:%s\n", (person_noticket + i)->person_name);
printf("所需要航班编号:%d\n", (person_noticket + i)->AirPlane_Num);
printf("航班ID:%s\n", (p + ((person_noticket + i)->AirPlane_Num))->ID);
printf("始发地:%s\n", ((p + ((person_noticket + i)->AirPlane_Num))->Start_Place));
printf("目的地:%s\n", (p + ((person_noticket + i)->AirPlane_Num))->End_Place);
}
}
//主函数
int main()
{
Plane* p=NULL;
Person* person=NULL;
Person* person_noticket = NULL;
InitPersonNoTicket(&person_noticket);
InitAirPlane(&p);
InitPerson(&person);
while (1)
{
home(p, person, person_noticket);
}
system("pause");
return 0;
}
你可以参考这个代码,做出一些修改,就能实现你想要的功能啦。
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632