目录
实现功能
部分功能测试截图
代码展示
实现功能
1.订票
2.退票
3.查询航班信息
4.修改航班信息
5.录入航班信息
6.打印订票信息
部分功能测试截图
功能选择界面
查询航班功能测试
订票功能测试
打印订票信息
代码展示
代码中需要的二个文件内容如下
第一个是代码中的《新建文本文本2.txt》,第二个是《新建文本文档.txt》,,,建立二个txt文件夹,将下面二个内容复制粘贴,注意文件名中的空格。
注注注!!!然后将其放在和代码文件同一个根目录下,或者你也可以自己在代码中修改文件的路径
12:3616:1436908:3013:4269906:5811:3669921:3223:5679911:0019:3689909:3615:5536609:3314:4536612:1214:3019908:0012:30899
123456西安北京 200 369369宝鸡北京 220 148758上海北京 120 789456成都南京 220 484565南京揭阳 120 889834咸阳武汉 300 588685长春沈阳 210 789468九州台湾 100 556266香港黄冈 200
-
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #define T1 p->data.fNumber //宏定义其中常用变量,便于书写 #define T2 p->data.place_go #define T3 p->data.place_to #define T4 p->data.seat_total #define T5 p->data.seat_remainder #define T6 p->data.goTime #define T7 p->data.toTime #define T8 p->data.price #define R1 p->data.name #define R2 p->data.fNumber #define R3 p->data.id #define R4 p->data.number #define R5 p->data.Votes typedef struct //航班结点定义 {char place_go[20]; //始发地char place_to[20]; //目的地int seat_total; //座位总数int seat_remainder; //剩余座位数int fNumber; //航班号char goTime[6]; //起飞时间char toTime[6]; //抵达时间char price[6]; //票价 }plane;typedef struct PNode //航班结构体定义 {plane data;struct PNode *next; }PNode,*PlaneList;typedef struct //乘客结点定义 {char name[14]; //姓名char id[30]; //身份证号码int number; //购票数int Votes; //订单号int fNumber; //航班号 }passenger;typedef struct RNode {passenger data;struct RNode *next; }RNode,*RenList;void input(PNode* head){ //用文件输入航班信息的方法FILE *fp,*fp1;PlaneList p,r;char qq[3];int i,m;r = head;if((fp=fopen("新建文本文档.txt","r"))==NULL){printf("航空基本信息文件打开失败!");}if((fp1=fopen("新建文本文档2.txt","r"))==NULL){printf("航空补充信息文件打开失败!");}for(i=1;i<=9;i++) //自定义了9个航班信息,所以这里循环9次{ p = (PlaneList)malloc(sizeof(PNode));p->next = NULL;fscanf(fp,"%d",&p->data.fNumber);fgets(p->data.place_go,5,fp);fgets(p->data.place_to,5,fp);fscanf(fp,"%d",&m);fgets(p->data.goTime,6,fp1);fgets(p->data.toTime,6,fp1);fgets(p->data.price,4,fp1);p->data.seat_total = m;p->data.seat_remainder = m;r->next = p;r = p;} }void input_1(PNode* head){ //由控制台输入航班信息的方法PlaneList p,t;int m,x;int fn;char go[20],to[20];p = head;while(p->next!=NULL){p=p->next; //将p指向head最后一个航班,方便在其后面链上其他航班信息} //也防止新录入的信息顶掉已有信息printf("请输入需要输入的航班数:");scanf("%d",&x);printf(".......................................开始录入.......................................\n");for(int i=1;i<=x;i++){printf("***********开始输入第%d个航班信息***********\n",i);t = (PlaneList)malloc(sizeof(PNode));t->next=NULL;printf("请输入航班号:");scanf("%d",&fn);in: while(1){PlaneList p;p = head;int tip = 1;while(p->next!=NULL){p=p->next;if(fn==p->data.fNumber){printf("输入错误!该航班已存在!\n");printf("请重新输入航班号:");scanf("%d",&fn);tip = 2;break;}}if(tip==2){goto in;}else{t->data.fNumber = fn;break;}}printf("请输入始发地:");scanf("%s",go);while(1){if(strlen(go)<=8&&strlen(go)>=2){strcpy(t->data.place_go,go);break;}else{printf("请重新输入始发地(1至4个汉字或2至8个英文字符):");scanf("%s",go);}}printf("请输入目的地:");scanf("%s",to);while(1){if(strlen(to)<=8&&strlen(to)>=2){strcpy(t->data.place_to,to);break;}else{printf("请重新输入目的地(1至4个汉字或2至8个英文字符):");scanf("%s",to);}}printf("请输入机票总数:");scanf("%d",&m);t->data.seat_total = m;t->data.seat_remainder = m;printf("请输入飞机起飞时间:");scanf("%s",t->data.goTime);printf("请输入飞机抵达时间:");scanf("%s",t->data.toTime);printf("请输入该航班票价:");scanf("%s",t->data.price);p->next = t;p = t;}printf(".......................................录入完成.......................................\n"); }void inout(PNode* head) //查看所有航班信息的方法 {PlaneList p; p = head;int i=0;printf(".........................咸阳机场欢迎你.........................\n");printf(" 航班号 始发地 目的地 机票总数 剩余票数 出发时间 抵达时间 价格\n");while(p->next!=NULL){p = p->next;printf("%9d %10s %8s %d %d %10s %6s %4s\n",T1,T2,T3,T4,T5,T6,T7,T8);} }void inout_1(RNode* rhead) //查看乘客订单信息的方法 { RenList p; p = rhead;if(p->next==NULL){printf("没有订单信息!\n");}else{printf(".........................咸阳机场欢迎你.........................\n");printf(" 姓名 航班 身份证号码 订单号 票数 \n");}while(p->next!=NULL){p = p->next;printf("%8s %d %18s %8d %d\n",R1,R2,R3,R4,R5);}}void research_1(PNode* head) //通过航班号查看航班信息的方法 {int x,tip;PlaneList p;p = head;tip = 1;printf("请输入要查找的航班号:");scanf("%d",&x);printf("开始查找\n");while(p->next!=NULL){p = p->next;if(p->data.fNumber==x){printf(" 航班号 始发地 目的地 机票总数 剩余票数 出发时间 抵达时间 价格\n");printf("%9d %10s %8s %d %d %10s %6s %4s\n",T1,T2,T3,T4,T5,T6,T7,T8);tip = 2;break;}}if(tip==1){printf("该航班不存在\n");}}void research_2(PNode* head) //通过目的地和始发地查看航班信息的方法 {char str1[20],str2[20];PlaneList p;int tip;tip = 1;p = head;printf("请输入要查找的始发地:");scanf("%s",str1);printf("请输入要查找的目的地:");scanf("%s",str2);printf("开始查找\n");while(p->next!=NULL){p = p->next;if(!strcmp(str1, p->data.place_go)&&!strcmp(str2, p->data.place_to)){printf(" 航班号 始发地 目的地 机票总数 剩余票数 出发时间 抵达时间 价格\n");printf("%9d %10s %8s %d %d %10s %6s %4s\n",T1,T2,T3,T4,T5,T6,T7,T8);tip = 2;break;}}if(tip==1){printf("未找到该航班or该航班不存在\n");} }void revise(PNode* head) //修改航班信息的方法 { //别问我为什么航空客运订票系统还可以修改航班信息,问就是题目要求的PlaneList p;int x,tip;p = head;printf("请输入要修改的航班号:");scanf("%d",&x);printf("开始修改\n");while(p->next!=NULL){p = p->next;if(p->data.fNumber==x){printf("请输入要修改的信息\n");printf("请输入航班号:");scanf("%d",&p->data.fNumber);fflush(stdin);printf("请输入始发地:");scanf("%s",p->data.place_go);printf("请输入目的地:");scanf("%s",p->data.place_to);printf("请输入机票总数:");scanf("%d",&p->data.seat_total);tip = 2;break;}}if(tip==1){printf("未找到该航班or该航班不存在\n");} }void purchase (PNode* head,RNode* rhead) //乘客买票的方法 {PlaneList p;RenList r,h;r = (RenList)malloc(sizeof(RNode));r->next = NULL;int x,t,tip,tip1;p = head;h = rhead;tip = 1;tip1 = 1;char name[14];char id[30];if(h->next!=NULL){ //让h指向rhead表尾,防止新输入信息替换掉已有信息h = h->next; }printf("请输入真实姓名:");scanf("%s",name);while(1){if(strlen(name)<=14&&strlen(name)>=4){strcpy(r->data.name,name); //对信息筛选后赋给新申请的乘客信息结点break; //以下大致相同,不在赘述}else{printf("请重新输入姓名(2-7个汉字):");scanf("%s",name);}}printf("请输入身份证号:");scanf("%s",id);while(1){if(strlen(id)==18){for(int i=1;i<=18;i++){if(id[i]<='0'&&id[i]>='9'){break;}}strcpy(r->data.id,id);break;}else{printf("请输入合法身份证号码:");scanf("%s",id);}}printf("请选择乘坐航班:");scanf("%d",&x);while(1){while(p->next!=NULL){p = p->next;if(p->data.fNumber==x){tip1 = 2;break;}}if( tip1 != 2 ){printf("该航班不存在,请重新输入:");p = head;scanf("%d",&x);}else break;}printf("请输入需要购买的票数;");scanf("%d",&t);while(1){while(p!=NULL){if(p->data.seat_remainder>=t){p->data.seat_remainder-=t; //购票成功则修改剩余机票信息tip = 2;r->data.number = x-123; //依据航班号生成订单号r->data.Votes = t;r->data.fNumber = x;printf("购票成功!\n");}break;}if(tip!=2){printf("还要%d张票\n",p->data.seat_remainder);printf("机票不足,请重新输入:\n");scanf("%d",&t);}else break;}h->next=r; //让h指向新申请并已赋值的乘客结点h = r; //其实就是乘客链表的创建过程,只不过中间掺杂了对输入信息的筛选语句//所以比较分散 }void quash(PNode* head,RNode* rhead) //乘客退票方法 {PlaneList p;RenList r;int x,t,tip;p = head;r = rhead;tip = 1;char name[14];char id[18];qq: for(int i=1;i<=3;i++){if(tip==2)break;printf("请输入身份证号:");scanf("%s",id);while(r->next!=NULL){r=r->next;if(!strcmp(id,r->data.id)){printf("请选择航班:");scanf("%d",&x);if(r->data.fNumber!=x){printf("你没有购买过该航班的票!");printf("您还有%d次机会!!\n!",3-i);break;}else{while(p->next!=NULL){p = p->next; if(p->data.fNumber==x) //找到航班信息,并修改票数{printf("请输入需要退票的票数;");scanf("%d",&t);if(t<=r->data.number){p->data.seat_remainder+=t;r->data.number-=t;tip = 2;printf("退票成功!");break;}else{printf("票数异常!!!\n");printf("您还有%d次机会!!\n!",3-i);}}}}} }}if(tip==1){printf("退票失败\n");} }void print() //优化界面,也便于后期维护 {printf(" ******************************************************************************** \n");printf(" ****************************欢迎进入航空订票系统******************************** \n");printf("\n");printf(" 1 订票 \n");printf("\n");printf(" 2 退票 \n");printf("\n");printf(" 3 查询航班信息 \n");printf("\n");printf(" 4 修改航班信息 \n");printf("\n");printf(" 5 录入航班信息 \n");printf("\n");printf(" 6 打印订票信息 \n");printf("\n");printf(" 7 退出程序 \n");printf("\n");printf(" ******************************************************************************** \n");}void print1() //优化界面,也便于后期维护 {printf(" ******************************************************************************** \n");printf(" ****************************欢迎进入航空订票系统******************************** \n");printf("\n");printf("\n");printf(" 1 查询所有航班 \n");printf("\n");printf(" 2 按航班号查询航班 \n");printf("\n");printf(" 3 按航程查询航班 \n");printf("\n");printf(" 4 返回 \n");printf("\n");printf("\n");printf(" ******************************************************************************** \n"); } int main() {PNode *head; //定义航班链表和乘客链表并进行初始化RNode *rhead;int select;head = (PlaneList)malloc(sizeof(PNode));head->next = NULL;rhead = (RenList)malloc(sizeof(RNode));rhead->next = NULL;input(head); //直接从文件中读取航班信息,这样就可直接测试系统,//不用在输入大量航班才能进行测试 to: while(1){ system("cls");printf("\n");printf("\n");print();printf("请输入要进行的操作:");scanf("%d",&select);switch (select) {case 1:purchase(head,rhead);printf("三秒后程序将返回.......");Sleep(3*1000); //让程序停止运行三秒system("cls"); //清除界面,配合break达到自动返回的目的break;case 2:quash(head,rhead);printf("三秒后程序将返回.......");Sleep(3*1000);system("cls");break;case 3:while(1){system("cls");print1();printf("请选择查询方式:");scanf("%d",&select);switch (select) {case 1:inout(head);printf("五秒后程序将返回.......");Sleep(5*1000);system("cls");break;case 2:research_1(head);printf("五秒后程序将返回.......");Sleep(5*1000);system("cls");break;case 3:research_2(head);printf("五秒后程序将返回.......");Sleep(5*1000);system("cls");break;case 4:goto to;default:printf(" 错误指令 #304 ");break;}}case 4:revise(head);printf("五秒后程序将返回.......");Sleep(5*1000);system("cls");break;case 5:input_1(head);printf("五秒后程序将返回.......");Sleep(5*1000);system("cls");break;case 6:inout_1(rhead);printf("五秒后程序将返回.......");Sleep(5*1000);//system("cls");break;case 7:exit(0);default:printf(" 错误指令 #304 ");break;}}return 0;//复制粘贴后麻烦大家点个免费的赞哦!//复制粘贴后麻烦大家点个免费的赞哦!//复制粘贴后麻烦大家点个免费的赞哦! }