C语言 数据结构课设 航空订票系统

目录

实现功能

部分功能测试截图

 代码展示


实现功能

        1.订票

        2.退票

        3.查询航班信息

        4.修改航班信息

        5.录入航班信息

        6.打印订票信息

部分功能测试截图

                                                               功能选择界面

C语言 数据结构课设 航空订票系统

查询航班功能测试

C语言 数据结构课设 航空订票系统

C语言 数据结构课设 航空订票系统 

                                       C语言 数据结构课设 航空订票系统

 

订票功能测试

 C语言 数据结构课设 航空订票系统

                                                                打印订票信息

C语言 数据结构课设 航空订票系统

 代码展示

#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;
}

上一篇:【BSP视频教程】STM32H7视频教程第4期:从启动到运行过程全解析,电源域,复位,时钟,软硬件启动流程到堆栈,map和htm文件分析(2022-01-26)


下一篇:7-1 最大子列和问题