系统基本信息
二月下旬,一个新的原创《飞机订票管理系统》出炉,花费大概三天左右,适合掌握链表、指针的读者们参考学习。本程序运用到结构体的复杂结构,如有不懂之处,欢迎在评论区提问。同样地程序如果有不足的地方,欢迎指出!⛅
函数、变量命名规则:小驼峰
常量命名规则:大驼峰
链表基本介绍:创建含有头结点的链表(数据域为空),添加结点利用的是头插法
难度指数:⭐⭐⭐⭐
理解指数:⭐⭐⭐
进阶指数:⭐⭐⭐⭐
主要知识点:链表、指针、字符串相关函数、文件操作
基本功能
管理员角色:
1、录入航班信息
2、修改航班信息
3、删除航班(航班没有旅客可删除)
4、查询航班信息(根据航班号)
5、航班信息排序 (根据航班号)
旅客:
1、注册旅客信息
2、订票(可先查询航班信息,再订票)
3、退票(退票后,修改航班相应数据)
4、查询(个人信息及其预定的航班)
另外,程序还添加了文件存储功能(手动存储),可以存储航班信息和用户列表信息。
下次进入程序,可以查看上次保存的航班和用户信息。
程序注意事项
1、管理员账号密码默认为"admin":"123456" ,使用常量定义,可自行修改
2、旅客信息需要自行注册,每次登录时都有三次试错机会,用完机会将返回上一级界面
3、旅客注册信息时,用户名不可重复
4、录入航班信息时,航班号不可重复
5、不可预定同一航班
6、保存信息到文件时,程序会自动创建txt文件,不需要自己创建。
程序运行截图
主界面:
管理员界面:
旅客界面:
主体代码
结构体、常量定义:
#define ManagerAccount "admin" //默认管理员账号
#define ManagerPassword "123456" //默认管理员密码
//起降时间结构体
struct StartAndEndTime{
int start_hour;
int start_minute;
int end_hour;
int end_minute;
};
//旅客信息结构体
typedef struct PASSENGER{
//用户名
char userName[20];
//密码
char password[30];
//身份证
char passcard[30];
//姓名
char realName[30];
//账户余额
double money;
//预定航班列表
struct AIRPLANCE *airplanceList;
//指针域
struct PASSENGER *next;
}Passenger;
//航班信息结构体
typedef struct AIRPLANCE{
//航班号
int flightNumber;
//起飞城市
char startCity[25];
//降落城市
char endCity[25];
//起降时间
struct StartAndEndTime time;
//票价
int price;
//折扣
double discount;
//总票量
int ticketQuantity;
//剩余票量
int remainQuantity;
//航班乘客人数
int personNumber;
//航班乘客信息,最多容纳40位乘客
struct PASSENGER Passenger[40];
//指针域
struct AIRPLANCE *next;
}Airplance;
main函数:
int main(){
//分别创建航班和旅客链表的头结点
Airplance* airplanceHead = (Airplance *) malloc(sizeof(Airplance));
airplanceHead->next = NULL;
Passenger* passengerHead = (Passenger *) malloc(sizeof(Passenger));
passengerHead->next = NULL;
//读取文件信息
read_file(airplanceHead,passengerHead);
int choose;
while(1){
//进入主菜单
choose = indexMenu();
switch(choose){
case 1:
system("cls");
managerInteface(choose,airplanceHead);
break;
case 2:
system("cls");
passengerInteface(choose,airplanceHead,passengerHead);
break;
case 3:
system("cls");
registerInfo(passengerHead);
break;
case 4:
save_byFile(airplanceHead,passengerHead);
break;
case 0:
emptyLinkedList(airplanceHead,passengerHead);
printf("欢迎下次使用!\n");
exit(0);
}
}
}
录入航班信息函数:
/*
录入航班信息 (管理员)
*/
void insertAirplance(Airplance* airplanceHead){
char choose = 'Y';
while(choose == 'Y' || choose == 'y'){
Airplance *newAirplance = (Airplance *) malloc(sizeof(Airplance));
printf("航班号:");
while(1){
fflush(stdin);
scanf("%d",&newAirplance->flightNumber);
if(judgementAirplance(newAirplance->flightNumber,airplanceHead)){
printf("航班号已经存在,请重新输入:");
}else{
break;
}
}
printf("起飞城市:");
fflush(stdin);
gets(newAirplance->startCity);
printf("抵达城市:");
fflush(stdin);
gets(newAirplance->endCity);
printf("起飞时间(小时: 0-24)");
fflush(stdin);
scanf("%d",&newAirplance->time.start_hour);
printf("起飞时间(分钟: 0-60)");
fflush(stdin);
scanf("%d",&newAirplance->time.start_minute);
printf("抵达时间(小时: 0-24)");
fflush(stdin);
scanf("%d",&newAirplance->time.end_hour);
printf("抵达时间(分钟: 0-60)");
fflush(stdin);
scanf("%d",&newAirplance->time.end_minute);
printf("航班票价:");
fflush(stdin);
scanf("%d",&newAirplance->price);
printf("票价折扣(0~1):");
while(1){
fflush(stdin);
scanf("%lf",&newAirplance->discount);
if(newAirplance->discount < 0 || newAirplance->discount > 1){
printf("折扣输入的数值在0~1之间,重新输入:");
}else{
break;
}
}
printf("总票量:");
fflush(stdin);
scanf("%d",&newAirplance->ticketQuantity);
//设置乘客人数为0
newAirplance->personNumber = 0;
//设置机票剩余量
newAirplance->remainQuantity = newAirplance->ticketQuantity - newAirplance->personNumber;
newAirplance->next = airplanceHead->next;
airplanceHead->next = newAirplance;
printf("录入成功!是否继续录入?(Y/N): ");
fflush(stdin);
scanf("%c",&choose);
}
}
查看所有航班信息:
/*
查询所有航班信息 (管理员)
*/
void findAllAirplance(Airplance* airplanceHead){
Airplance* p = airplanceHead->next;
if(p == NULL){
printf("当前航班信息为空,请添加......\n");
}else{
printf("\n\n******************** 所有航班信息 ********************\n");
while(p){
printf("\n----------------------------------------------------------\n");
printf("航班号:%d\n",p->flightNumber);
printf("起飞城市:%s\n",p->startCity);
printf("抵达城市:%s\n",p->endCity);
printf("起飞抵达时间:%d:%d - %d:%d\n",p->time.start_hour,p->time.start_minute,p->time.end_hour,p->time.end_minute);
printf("航班票价:%d\n",p->price);
printf("票价折扣:%lf\n",p->discount);
printf("总票量:%d\n",p->ticketQuantity);
printf("剩余票量:%d\n",p->remainQuantity);
printf("\n----------------------------------------------------------\n");
p = p->next;
}
}
system("pause");
}
当然了,大家也看到了标题写了版本是v1.0.0。本人还在改进程序准备写一个新的版本v1.0.1,遇到了一下问题暂时无法解决。在新的版本中,运用到订单结构体(代码如下),但是因为发生了三个结构体互相嵌套,编译无法通过,还在寻找解决办法!如有兴趣,可以一起联系我,一起讨论去实现,在新的博客上给大家发布新的版本!
//订单状态
struct Order{
//预定航班
struct AIRPLANCE airplanceList;
//付款金额
double payMoney;
//下单时间
char orderTime[20];
//订单状态
char orderStatus[10];
};
收尾
考虑到本系统的代码量庞大(1000行代码以上),故将版本为v1.0.0的代码集中放在公众号,方便读者获取更多优质源码,公众号回复,"C语言" 即可获取源码链接。
温馨提醒:公众号名片在文章末尾
新的版本v1.0.1还在编写中,一旦完成,会出新的博客跟大家分享。
代码改变世界,技术实现自由,期待你的关注😜