C语言实现飞机票务系统(简单版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingongzi/article/details/86505885

飞机票务系统设计要求:有登录系统界面、账号、密码;建立航班信息功能;查看从郑州到某终点站飞机票信息功能;飞机票购买功能;添加购票人信息功能;显示购票人信息功能;退定飞机票功能;

程序中的音乐可以改为自己指定的,用时把我用的音乐那行代码注释掉即可。

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>//主要是一些用户通过按键盘产生的对应操作,比如getch()函数 
#include<time.h> //时间库 
#include<mmsystem.h>//windows中与多媒体有关的大多数接口
#pragma comment(lib,"winmm.lib")//预处理,支持对windows 多媒体的编程.
//#include<graphics.h>//图形库

#define N 15 //航班最多15,N为全局变量

typedef struct traininfor 
{
	char qishi[30]; //起始站 
	char zhongdian[30]; //终点站  
	char trainnumber[10]; //航班号 
	float price; //飞机票单人价格 
	int piaonumber; //每次航班的生成票数 
	char time[30]; //飞机出发时间  
}hang;

struct ticket
{
	char buyer[20]; //购票人姓名 
	char ID[20]; //购票人身份证号 
	int  buynumber; //购买飞机票的张数
	float money;//用户购买票总钱数
	hang buy; //用户买的飞机票信息 
	struct ticket *next;//指针节点 
}; 

int d=0;//统计有多少次航班
struct ticket *yonghu;//用户购票信息头结点
hang plane[N]; //航班信息结构体数组 

int menu();//打印主菜单函数 
void DengLu();//登录票务系统函数 
void JianFile();//建立文件航班信息函数
void OpenFile();//读取文件信息函数 
void check(); //查看从郑州到某终点站飞机票信息函数 
void buy(); //飞机票购买函数 
void add();//添加购票人信息 
int TicketMenu();//用户购票菜单 
void XianShi();//显示购票人信息 
void tui(); //退定飞机票函数 
void exit(); // 退出程序  

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
	DengLu();//	登录票务系统函数
	JianFile();//建立文件航班信息 
	//OpenFile();//打开文件读取航班信息 
	
	while(1)
	{//每次操作完自动返回主菜单作用
		switch(menu())
		{//menu()函数为输入选项
			case 1://选项为1时 
					OpenFile();//打开文件读取航班信息
					printf("已成功导入航班信息\n\n\n"); 
					break; 
					
			case 2: //选项为2时 
					check();// 查看从郑州到某终点站飞机票信息函数 
					break;
					
			case 3://选项为3时 
					buy();//飞机票购买函数 
					break;
					
			case 4://选项为4时 
					tui();//退票函数 
					break;
					
			case 5://选项为5时 
					system("cls");//清屏 
					printf("感谢您的使用,祝您的旅途愉快\n");
					Sleep(5000);//延迟15秒 
					exit(1);//
					break;
			
		} 
	}
	return  0;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//登录票务系统
void DengLu() 
{
	//getch()=从键盘输入一个字符且不显示  getche()=从键盘输入一个字符并显示 
	printf("欢迎来到票务系统,请先注册票务系统账号(账号为10位,密码为6位):\n");
	printf("温馨提示:若登录密码输入有误超过三次,电脑会自动关机:\n\n");
	char ch;//重键盘上输入一个字符
	char password[10];//passsword数组表示初始密码
	char input[10];//input数组表示待输入的密码 
	char Szhanghao[20];// zhanghao数组表示申请的账号 
	char Dzhanghao[20];// zhanghao数组表示登录的账号
	int i=0,j;//控制输入次数
	int number,find,count;
	printf("申请账号:\n");
	fflush(stdin);//清空输入流 
	while(1)
	{
		ch=getche();//从键盘输入一个字符,保存到ch变量
		//加过滤,只要数字,其他的不做任何处理
		if(ch>='0' && ch<='9')	//if( (ch>='a' && ch<='z')  || (ch>='A' && ch<='Z') )
		{
			printf("\a");//转义字符\a=bell
			Szhanghao[i++]=ch;//把申请的账号储存到数组中
			 
			if(10==i)//写条件语句时,把常量放前面
			{
				Szhanghao[i]='\0';
				break;//账号为十位时停止输入 
			}	
		}
	}
	//1提示输入密码
	printf("\n设置卡的密码:\n");
	//2输入密码
	i=0;
	while(1)
	{
		ch=getch();//从键盘输入一个字符,保存到ch变量
		//加过滤,只要数字,其他的不做任何处理
		if(ch>='0' && ch<='9')	//if( (ch>='a' && ch<='z')  || (ch>='A' && ch<='Z') )
		{
			printf("*\a");//转义字符\a=bell
			password[i++]=ch;//把初始密码储存到数组中
			 
			if(6==i)//写条件语句时,把常量放前面
			{
				password[i]='\0';
				break;//初始密码为六位时停止输入 
			}
			
		}
	}
	Sleep(2000);
	system("cls");
	printf("温馨提示:若登录密码输入有误超过三次,电脑会自动关机:\n\n");
	printf("请登录您的账号:\n");
	while(1)
	{
		gets(Dzhanghao);
		if(strcmp(Dzhanghao,Szhanghao)!=0)
		printf("您输入的账号有误,请重新输入:\n");
		else
		break;	
	}
	
	number=0;//输入密码的次数 
	count =3;//有3次机会 
	
	while(count--)
	{//循环三次 
		find=0;j=0;//find初始化为0,表示输入密码正确 
		memset(input,0,sizeof(input));//初始化输入密码数组 
		
		
		printf("请输入账号密码:\n");
		for(i=0;i<6;i++)
		{//输入六位密码 
			ch=getch();//从键盘输入一个字符,保存到ch变量中
			if(ch>='0' && ch<='9')
			{//密码为数字时加入数组 
				printf("*\a");
				input[j++]=ch;
			}
		}
		input[j]='\0';//数组以\0结束 
		
		
		for(i=0;i<=5;i++)
		{//密码是否输入正确 
			if(input[i]!=password[i])
			{//输入密码与初始密码不匹配 
				find=1;
				break;
			}
		}
		
	
		if(find==0)
		{//输入密码正确 
			printf("\n输入正确,即将进入票务系统主页");
			PlaySound("20100814_5c610cfa0dec6116aa701YT6vHJzW9Zw.wav", NULL, SND_FILENAME | SND_SYNC); //音乐播放
			printf("\n");
			//Sleep(3000);//延时3秒 
			system("cls");//清屏 
			break;
		}
		else
		{//输入密码次数加一 
			number++;
			printf("\n输入密码错误,");
		}
		
	}
	
	if(3==number)
	{//当输入错误次数到达3次时 
		printf("\n输入三次密码错误,不能再输入,电脑将在10秒后自动关机\n");
		system("shutdown -s -t 10");//电脑即将关机 
	}
	return ;
} 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void JianFile()
{
	FILE *fp;//定义文件指针
	if((fp=fopen("txt.in","w"))==NULL)
	{//创建文件失败
		printf("建立失败!\n");
		exit(0);
	}
	//向文件中输入航班信息
	fprintf(fp,"郑州 南阳 T1230 110.50 200 2018年11月6日12点15分\n");
	fprintf(fp,"郑州 信阳 T1231 120.50 200 2018年11月6日13点15分\n");
	fprintf(fp,"郑州 商丘 T1232 100.00 200 2018年11月6日14点15分\n");
	fprintf(fp,"郑州 开封 T1234 115.50 200 2018年11月6日15点15分\n");
	fprintf(fp,"郑州 洛阳 T1235 95.00 200 2018年11月6日16点15分\n");
	fprintf(fp,"郑州 三门峡 T1236 97.30 200 2018年11月6日17点15分\n");
	fprintf(fp,"郑州 鹤壁 T1237 130.50 200 2018年11月6日18点15分\n");
	fprintf(fp,"郑州 周口 T1238 117.00 200 2018年11月6日19点15分\n");
	fprintf(fp,"郑州 驻马店 T1239 135.00 200 2018年11月6日20点15分");
	fclose(fp);
	return ;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//文件读取航班信息
void OpenFile()
{ 
	FILE *fp; //定义文件指针 
	d=0;//表示读取到当前文件位置
	if((fp=fopen("txt.in","r"))==NULL)
	{//打开文件
		printf("文件打开失败!\n");
		return ;
	}

	while(!feof(fp))
	{//读取到文件为空 
		//printf("请设定第%d个站的地点、车次、价格、还剩票数、到站时间、已被购买票数:\n",d);
		fscanf(fp,"%s%s%s%f%d%s",plane[d].qishi,plane[d].zhongdian,plane[d].trainnumber,&plane[d].price,&plane[d].piaonumber,plane[d].time);
		d++;
	} 
	fclose(fp);//关闭文件 
	return ;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int menu()
{
	char s[10];//输入字符串选项
	int n;//整型选项
	//菜单框架
	printf("--------------------票务系统目录--------------------\n\n");
	printf("1, 导入航班信息\n");
	printf("2, 查询飞机票\n");
	printf("3, 购买飞机票\n");
	printf("4, 退订飞机票\n");
	printf("5, 退出程序\n");
	printf("注意:飞机从本站能到达的地方有南阳、信阳、商丘\n");
	printf("开封、洛阳、三门峡、鹤壁、周口、驻马店\n");
	printf("如果您想了解更多信息请输入选项序号\n \n");
	printf("本程序制作者:2017级物联网工程一班 胡斌\n");
	printf("请输入选项:");

	while(1)
	{//死循环状态
		fflush(stdin);//清空输入流
		gets(s);//得到一串字符串
		n=atoi(s);//字符串转化为整数 
		if(n<1||n>5)//判断输入的选项是否正确
		printf("输入错误,请重新输入:\n");
		else//符合条件,结束循环
		break; 
	}
	//返回选项值
	return n;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 查看从郑州到某终点站飞机票信息函数
void check()
{
	int i,j;//循环变量
	int find=1,flag=0,count=0;//标志变量
	char qi[30];//起始站 
	char mudi[30];//终点站 
	printf("请输入起始地(提示:起始地为郑州): \n");
	scanf("%s",qi);//输入起始地
	printf("请输入目的地: \n");
	scanf("%s",mudi);//输入目的地
	
	while(1)
	{//死循环状态
		if(0==strcmp(qi,"郑州"))
		{//起始地为郑州时
			flag=1;//标志变量为1,表示起始地没有出错
			for(j=0;j<d;j++)
			{//循环d次航班信息
				if(0==strcmp(plane[j].zhongdian,mudi))
				{//输入的终点站与航班信息终点站一致
					count=1;//标志变量为1
					printf("航班号: ");//输出航班号
					printf("%s\n",plane[j].trainnumber);
					printf("起始地:  ") ;//输出起始地
					printf("%s\n",plane[j].qishi);
					printf("目的地: ");//输出目的地
					printf("%s\n",plane[j].zhongdian);
					printf("此次航班单人票价: ");//输出票价
					printf("%.2f\n",plane[j].price);
					printf("此次航班时间:");//输出航班时间
					printf("%s\n",plane[j].time);
					printf("此次航班飞机票数量:  ");//输出票数
					printf("%d\n\n\n\n",plane[j].piaonumber); 
					return ;
				}
			}
		}
		else
		{
			flag=1;//起始地输入错误
			printf("输入有误,返回菜单!\n\n\n");
			return ;
		}
		
		if(0==count&&flag==1)
		{//起始地并且目的地输入错误
			printf("sorry 您查询的结果无信息!\n\n\n");
			return ;
		}
	}
	return ;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//对购物车进行操作
void buy()
{
	while(1)
	{//成死循环状态
		switch(TicketMenu()) 
		{//ShopCartMenu()为输入选项
			case 1://选项1 显示用户购票列表信息
					XianShi();
					break;
			case 2: //选项2 添加用户购票信息 
					add();
					break;
			case 3: //选项3 退出
					printf("即将退出子程序\n"); 
					Sleep(2000);//延时两秒
					return ; 
		}
	}
	return ;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//打印购物车菜单
int TicketMenu()
{
	int n;//输入选项
	char s[5];//输入字符串
	//购票子程序菜单框架
	printf("\n\n请选择操作:\n");
	printf("--------------------------------------------\n");
	printf("1. 显示当前购票列表\n");
	printf("2. 添加购票人信息\n");
	printf("3. 退出\n");
	printf("--------------------------------------------\n");
	printf("请选择对应数字1~3\n");

	while(1)
	{//成死循环状态
		fflush(stdin);//清空输入流
		gets(s);//输入一串字符串
		n=atoi(s);//字符串转化为整数 
		if(n<1||n>3)//判断输入的选项是否正确 
		printf("输入错误,请重新输入:\n");
		else//输入正确,结束循环
		break;
	}
	return n;//返回输入选项
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//显示用户购票信息
void XianShi()
{
	FILE *fp;//定义文件指针
	struct ticket *p;//定义一个新节点
	p=yonghu;//把整个购票信息赋给p

	if((fp=fopen("goupiao.txt","r"))==NULL) 
	{//判断是否打开了文件
		printf("打开文件失败\n");
		printf("暂时还没有用户购票信息\n\n");
		return ;
	}
	//printf("\n姓名       身份证               起始站       目的站         购买票数\n");
	while(p!=NULL) 
	{//输出购票人信息
		//fscanf(fp,"%s%s%s%s%d",p->buyer,p->ID,p->buy.qishi,p->buy.zhongdian,&p->buynumber);
		printf("姓名: ");
		printf("%s\n",p->buyer);
		printf("身份证号: ");
		printf("%s\n",p->ID);
		printf("起始地:  ") ;
		printf("%s\n",p->buy.qishi);
		printf("目的地: ");
		printf("%s\n",p->buy.zhongdian);
		printf("购买票数: ");
		printf("%d\n",p->buynumber);
		printf("此次航班总钱数: ");
		printf("%.2f\n",p->money);
		printf("此次航班时间:");
		printf("%s\n\n\n\n",p->buy.time);
		//printf("姓名      身份证            起始地      目的地      购买票数    票的价格    出发时间\n");
		//printf("%-11s%-20s%-10s%-10s%-7d%-7.2f%-20s\n",p->buyer,p->ID,p->buy.qishi,p->buy.zhongdian,,p->buy.price,p->buy.time);//输出购票人信息
		p=p->next;//指向下一个节点
	}	
	fclose(fp);//关闭文件 
	return ;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//添加用户购票信息
void add()
{
	FILE *fp1,*fp;//定义两个文件指针
	struct ticket *p,*p1;//定义两个节点
	
	int i,j;//定义控制循环变量
	int count,flag;//定义标志变量
	int buynumber1;//用户购买的票数
	char choice1[10];//选择变量
	char choice2[10];//选择变量
	char mingzi[20];//用户姓名
	char shenfen[20];//用户身份证号	
	char qi[30];//起始站 
	char mudi[30];//终点站

	do{//开始进入循环
		printf("请输入您的姓名:\n");
		scanf("%s",mingzi);
		printf("请输入您的身份证号:\n");
		scanf("%s",shenfen);
		printf("请输入起始地(提示:起始地为郑州): \n");
		scanf("%s",qi);
		printf("请输入目的地: \n");
		scanf("%s",mudi);
 		count=0;flag=0;//标志变量初始化
		while(1)
		{//成死循环状态
			if(0==strcmp(qi,"郑州"))
			{//起始站为郑州
				flag=1;//标志为1
				for(j=0;j<d;j++)
				{//循环d次航班信息
				//	printf("%s %s %.2f %d %s %d",pointtr->station[j],pointtr->trainnumber[j],pointtr->price[j],pointtr->piaonumber[j],pointtr->time[j],pointtr->buynumber[j]);
					if(0==strcmp(plane[j].zhongdian,mudi))
					{//目的地一致时
						count=1;//标志为1
						//输出航班信息
						printf("航班号: ");
						printf("%s\n",plane[j].trainnumber);
						printf("起始地:  ") ;
						printf("%s\n",plane[j].qishi);
						printf("目的地: ");
						printf("%s\n",plane[j].zhongdian);
						printf("此次航班单人票价: ");
						printf("%.2f\n",plane[j].price);
						printf("此次航班时间:");
						printf("%s\n",plane[j].time);
						printf("此次航班飞机票数量:  ");
						printf("%d\n",plane[j].piaonumber); 
						break;//结束循环
					}
				}
				break ;//结束循环
			}
			else
			{
				flag=1;
				printf("输入有误:\n\n\n");
				fflush(stdin);//清空输入流 
				break; //结束循环
			}
			
			if(0==count&&flag==0)
			{//输入条件不符合
				printf("sorry 您查询的结果无信息!\n\n\n");
				return ;
			}
		}
		if(1==count)
		{//找到用户所需航班信息
			printf("您确定购买此飞机票吗?(1.是 2.否)\n");
			scanf("%s",choice1);//输入选项
			if(0==strcmp(choice1,"1"))
			{//选项为1时
				printf("请输入您要购买的张数:\n");
				scanf("%d",&buynumber1);//输入购买票数
				if(buynumber1<0)
				{//不符合客观情况
					printf("输入有误,请重新输入!\n\n\n");
					break;
				}
	
				if(plane[j].piaonumber-buynumber1>=0)
				{//输入正确
					plane[j].piaonumber=plane[j].piaonumber-buynumber1;//计算剩余飞机票
					
					p=new ticket;//生成新节点 
					if(p==NULL)
					{//分配内存失败 
						printf("内存申请失败!\n\n\n");
						exit(1);
					}
					p->buynumber=buynumber1;//用户所购票数
					strcpy(p->buyer,mingzi);//用户姓名
					strcpy(p->ID,shenfen);//用户身份证号
				
					p->buy=plane[j];//航班信息
					p->next=NULL;//指向下一个节点为空
					
					p1=yonghu;//把用户信息赋给p1
					if(yonghu==NULL)//头结点为空 
					yonghu=p;//把节点赋值给头结点 
					else
					{
						while(p1->next!=NULL)
						p1=p1->next;//把链表循环到尾部 
						p->next=p1->next; 
						p1->next=p;//把新节点p挂在链表尾部 
					}
				}
				else
				{
					printf("飞机票已售完或不足,不能购买!\n\n\n");
					break;
				}
			}
			else if(0==strcmp(choice1,"2"))
			{//输入选项为2时
				printf("放弃购买, 返回!\n\n\n");
				break;
			}
			else
			{//输入选项有误
				printf("输入错误,返回!\n\n\n");
				break;
			}
		}
		else//没有找到用户所需航班
		printf("输入有误");
		
		printf("是否继续购票?(1.是,2.否)\n");
		fflush(stdin);//清空输入流 
		scanf("%s",choice2);//输入选项 
	}while(strcmp(choice2,"1")==0);//当选项为1时
	
	if((fp1=fopen("goupiao.txt","w"))==NULL)
	{//判断文件是否创建失败
		printf("创建文件失败。\n");
		return ;				
	} 
	p=yonghu;//把用户信息赋给p
	while(p!=NULL)
	{//一直循环到链表为空
		p->money=p->buy.price*p->buynumber;//计算票价总钱数
		fprintf(fp1,"%s %s %s %s %d %.2f %s\n",p->buyer,p->ID,p->buy.qishi,p->buy.zhongdian,p->buynumber,p->money,p->buy.time);
		p=p->next;//指向下一个节点
	}
	fclose(fp1);//关闭文件
	return ;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//退订飞机票
void tui()
{
	FILE *fp,*fp1;//定义两个文件指针
	char s[20];//身份证号
	char s1[20];//目的地 
	char choice[10];//选择项
	int buynumber2;//退订的票数
	int i,j;//控制循环变量
	int find=0;//标志变量
	struct ticket *p;//定义新节点
	printf("您确定要退票吗?1.是 2.否\n");
	scanf("%s",choice);//输入选项
	if(0==strcmp(choice,"1"))
	{//选项为1时
		printf("请输入身份证号:\n");
		scanf("%s",s);//输入身份证号 
		printf("请输入目的地:\n");
		scanf("%s",s1);//输入目的地
		if((fp=fopen("goupiao.txt","r"))==NULL)
		{//打开文件  
			printf("打开文件失败\n");
			return ;	
		}
		p=yonghu;//把用户信息赋给p
		while(p!=NULL)
		{//循环到链表为空时
			//fscanf(fp,"%s%s%s%s%f%d%s",p->buyer,p->ID,p->buy.qishi,p->buy.zhongdian,p->buy.price,&p->buynumber,p->buy.time);
			if(0==strcmp(s,p->ID)&&(0==strcmp(s1,p->buy.zhongdian)))
			{//找到对应的用户
				find=1;//标志变量为1
				printf("请输入退票张数:\n");
				scanf("%d",&buynumber2);//输入退订票数
				if(buynumber2<0)
				{//不符合客观情况
					printf("输入有误, 返回菜单!\n");
					return ;
				} 
				if(p->buynumber>=buynumber2) 
				{//输入票数符合条件
					fclose(fp);//关闭yonghu文件
					if((fp=fopen("goupiao.txt","w"))==NULL)
					{//判断文件是否创建失败
						printf("创建文件失败\n");
						return ;
					}
				
					if((fp1=fopen("txt.in","w"))==NULL)
					{//判断文件是否创建失败
						printf("创建文件失败。\n");
						return ;					
					}
					printf("退票成功,返回菜单!\n\n\n");
					for(i=0;i<d;i++)
					{//循环d次航班信息
						if(0==strcmp(plane[i].zhongdian,p->buy.zhongdian))
						{//找到对应终点站,计算剩余票数
							plane[i].piaonumber+=buynumber2;
						}
						fprintf(fp1,"%s %s %s %f %d %s\n",plane[i].qishi,plane[i].zhongdian,plane[i].trainnumber,plane[i].price,plane[i].piaonumber,plane[i].time);
					}
					p->buynumber-=buynumber2;//用户所购票数
					p->money=p->buynumber*p->buy.price;//购票的总价钱
					
					p=yonghu;//把用户信息赋给p
					while(p!=NULL)
					{//循环链表为空时
						fprintf(fp,"%s %s %s %s %.2f %d %s\n",p->buyer,p->ID,p->buy.qishi,p->buy.zhongdian,p->money,p->buynumber,p->buy.time);
						p=p->next;//指向下一个节点
					}
					
					fclose(fp);//关闭文件
					fclose(fp1);//关闭文件
					
					return ;
				}
				else
				{
					printf("输入错误,返回菜单!\n\n\n"); 
					return ;
				}
			}
			p=p->next;//指向下一个节点
		}
		if(0==find)
		{//输入有误
			printf("查询不到信息,返回菜单\n\n\n");
			return ;
		}
	}
	else if(0==strcmp(choice,"2"))
	{//输入选项为2时
		printf("放弃退票,返回菜单!\n\n\n");
		return ;
	}
	else
	{//输入有误
		printf("输入错误,返回菜单!\n\n\n");
		return ;
	}
	return ;
}

猜你喜欢

转载自blog.csdn.net/bingongzi/article/details/86505885