C语言 数据结构课设 航空订票系统
作者:互联网
目录
实现功能
1.订票
2.退票
3.查询航班信息
4.修改航班信息
5.录入航班信息
6.打印订票信息
部分功能测试截图
功能选择界面
查询航班功能测试
订票功能测试
打印订票信息
代码展示
#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++){
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("你没有购买过该航班的票!");
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;
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;
}
标签:head,课设,scanf,订票,C语言,break,printf,next,data 来源: https://blog.csdn.net/qq_49469904/article/details/122181172