其他分享
首页 > 其他分享> > C语言 数据结构课设 航空订票系统

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