机票管理系统

 **还挺长的(对本菜鸡来说T_T)

#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <ctime>
#include <windows.h>
#include <conio.h> // getch()的头文件
using namespace std;
#define N 20// 最多班次(可以按需修改)

typedef struct node
{
	char num[10];
	char year[6];
	char mon[3];
	char day[3];
	char hour[3];
	char min[3];
	char from[10];
	char to[10];
	float hours;
	int max;
	int now;
} CLASS;
int class_num = 0;
CLASS records[N];

void NewMessage();
void ShowTable1();
void ShowTable2(int i);
void Display();
void add();
void save();
void load();
void search();
void quit();
void Ticketorder();
void Ticketdelete();
int menu_select();
int overtime(int);
void find(char s1[], char s2[]);
int findBynum(char s1[]);
void get(int);
bool judge(int x);
int sum(int x1,int x2,int x3,int d1);
int overdate(int i);
int overdate2(int i);
char *menu[] = {"***********欢迎使用机票管理系统**********",
				"**             1. 录入班次             **",
				"**             2. 显示所有班次         **",
				"**             3. 查询班次             **",
				"**             4. 增加班次             **",
				"**             5. 购票                 **",
				"**             6. 退票                 **",
				"**             7. 退出                 **"
				};

// 菜单
int menu_select()
{ 
	char s[5];
	int c, i;
	system("cls");		// 清屏
	system("color 06"); // 改变字体颜色
	for (i = 0; i < 8; i++)
	{
		printf("%s\n", menu[i]);
	}
	i = 0;
	do
	{
		printf("请选择(1-7):");
		scanf("%s", s);
		c = atoi(s); // 转为整数
	} while (c < 0 || c > 7);
	return c;
}
// 录入航班信息
void NewMessage()
{ 
	int i = 0, h;
	char s[5];
	FILE *fp;
	system("cls");
	system("color 02");
	if ((fp = fopen("机票管理系统0.dat", "rb")) != NULL)
	{// rb:只读不写。读方式打开一个二进制文件,不允许写数据,文件必须存在
		printf("机票信息已存在,录入将覆盖已有信息!");
		printf("是否继续(Y/N)");
		scanf("%s", s);
		if (s[0] != 'Y' && s[0] != 'y')
			i = 1;
	}
	if (i == 0)
	{
		system("cls");
		printf("请输入要录入班次总数:");
		scanf("%d", &class_num);
		system("cls");
		for (i = 0; i < class_num; i++)
		{
			system("cls");
			printf("请输入第%d个班次信息:\n", i + 1);
			h = -1;
			for (; h != i;)
			{
				printf("请输入班次:");
				scanf("%s", records[i].num);
				for (h = 0; h < i; h++)
				{
					if (strcmp(records[h].num, records[i].num) == 0)
					{
						printf("输入错误!该班次已存在!");
						break;
					}
				}
			}
			get(i);
		}
		save();
	}
}
// 展示班次
void Display()
{ 
	int i, j;
	system("cls");
	system("color 07");
	load();
	ShowTable1();
	for (i = 0, j = 0; i < class_num; i++, j += 2)
	{
		if (overtime(i))
			printf("|%10s|%s_%02s_%02s %2s:%2s|%10s|%10s|%8.1f|%8d|%8d|\n", 
					records[i].num, records[i].year, records[i].mon,
					records[i].day, records[i].hour, records[i].min,
				    records[i].from, records[i].to, records[i].hours, 
					records[i].max, records[i].now);
		else
			printf("|%10s|     已发出     |%10s|%10s|%8.1f|%8d|%8d|\n", records[i].num,
				   records[i].from, records[i].to, records[i].hours, records[i].max, records[i].now);
	}
	ShowTable2(j);
	printf("\n按任意键继续....");
	getch(); // 作用:等待按下任意键,再继续执行下面的语句(8太理解。。)
}
// 表头
void ShowTable1()
{
	int i = 2;
	system("cls");
	printf("**********************************MESSAGE*************************************\n");
	printf("|----------|----------------|----------|----------|--------|--------|--------|\n");
	printf("|   班次   |    起飞时间    |  起点站  |  终点站  |飞行时间|额定载量| 已订票 |\n");
}
// 表尾(为了美观,其实不重要)
void ShowTable2(int i)
{ 
	printf("|----------|----------------|----------|----------|--------|--------|--------|\n");
}
// 查询----一级函数
void search()
{ 
	int i;
	char s1[10] = {'\0'}, s2[10] = {'\0'};
	system("cls");
	system("color 03");
	printf("1. 按班次查询");
	printf("2. 按终点站查询");
	printf("3. 退出");
	printf("请选择(1-3):");
	scanf("%d", &i);
	load();
	switch (i)
	{
		case 1:
			printf("请输入要查询的班次:");
			scanf("%s", s1);
			find(s1, s2);
			break;
		case 2:
			printf("请输入要查询终点站:");
			scanf("%s", s2);
			find(s1, s2);
			break;
		case 3:
			break;
		default:
			printf("输入错误!");
			break;
	}
	printf("按任意键继续....");
	getch();
}
// 查询----二级函数
void find(char s1[], char s2[])
{ 
	int i, h = 0, m;
	ShowTable1();
	if (s2[0] == '\0')
	{
		m = 1;
	}
	else
	{
		m = 0;
	}
	for (i = 0; i < class_num; i++)
	{
		if (strcmp(s1, records[i].num) == 0 || strcmp(s2, records[i].to) == 0)
		{
			printf("|%10s|%s_%02s_%02s %2s:%2s|%10s|%10s|%8.1f|%8d|%8d|\n", 
					records[i].num, records[i].year, records[i].mon, 
					records[i].day, records[i].hour, records[i].min,
				    records[i].from, records[i].to, records[i].hours, 
					records[i].max, records[i].now);
			h += 2;
			if (m == 1)
			{
				break;
			}
		}
	}
	if (h == 0)
	{
		printf("要查找的班次不存在!");
	}
}
// 增加班次-----一级函数
void add()
{ 
	int i;
	load();
	system("cls");
	printf("1. 增加班次");
	printf("2. 返回");
	printf("请选择(1-2)");
	scanf("%d", &i);
	if (i == 1)
	{
		system("cls");
		printf("1. 请输入要增加的班次:");
		scanf("%s", records[class_num].num);
		for (i = 0; i < class_num; i++)
		{
			if (strcmp(records[class_num].num, records[i].num) == 0)
			{
				printf("该班次已经存在!");
				getch();
				break;
			}
			
		}
		if (i == class_num)
		{
			get(i);
			class_num++;
			save();
		}
	}
}
// 增加班次-----二级函数
void get(int i)
{ 
	for (;;)
	{
		printf("请输入起飞时间(年 月 日 时 分)");
		scanf("%s%s%s%s%s", records[i].year,records[i].mon,records[i].day,records[i].hour, records[i].min);
		if ((atoi(records[i].mon) <= 12 && atoi(records[i].mon) >= 1) &&
			(atoi(records[i].hour) < 24 && atoi(records[i].hour) >= 0) && 
			(atoi(records[i].min) < 60 && atoi(records[i].min) >= 0))
		{
			break;
		}
		else
		{
			printf("输入错误!");
			getch();
		}
	}
	printf("请输入起点站:");
	scanf("%s", records[i].from);
	printf("请输入终点站:");
	scanf("%s", records[i].to);
	printf("请输入飞行时间:");
	scanf("%f", &records[i].hours);
	printf("请输入额定载量:");
	scanf("%d", &records[i].max);
	for (;;)
	{
		printf("请输入已订票人数:");
		scanf("%d", &records[i].now);
		if (records[i].now <= records[i].max)
		{
				break;
		}
		else
		{
			printf("输入错误!");
			getch();
		}
	}
}
// 购买机票模块
void Ticketorder()
{ 
	int i;
	char num[10];
	system("cls");
	system("color 03");
	printf("1. 购票");
	printf("2. 返回");
	printf("请选择(1-2):");
	scanf("%d", &i);
	if (i == 1)
	{
		load();
		search();
		printf("请输入要订票的班次(若无请输入0):");
		scanf("%s", num);
		for (i = 0; i < class_num; i++)
		{
			if (strcmp(num, records[i].num) == 0)
			{
				if (records[i].max > records[i].now && overdate2(i) <= 10 && overdate2(i) >= 0 && overtime(i) == 1)
				{
					records[i].now++;
					printf("通向%s班次为%s的票订票成功!\n", records[i].to, records[i].num);
					save();
					getch();
					break;
				}
				else
				{
					printf("抱歉,该班次机票目前无法购买!\n");
					getch();
				}
			}
		}
	}
}
// 退订机票模块
void Ticketdelete()
{ 
	int i;
	char num[10];
	system("color 03");
	system("cls");
	printf("1. 退票");
	printf("2. 返回");
	printf("请选择(1-2):");
	scanf("%d", &i);
	if (i == 1)
	{
		system("cls");
		load();
		printf("请输入要退票的班次:");
		scanf("%s", num);
		i = findBynum(num);
		if (strcmp(num, records[i].num) == 0)
		{
			if (overtime(i) == 1 && overdate2(i) <= 10 && overdate2(i) >= 0)
			{
				printf("确定(Y/N)?");
				scanf("%s", num);
				if (num[0] == 'y' || num[0] == 'Y')
				{
					records[i].now--;
					printf("退票成功!\n");
					save();
					getch();
				}
			}
			else
			{
				printf("抱歉,该班次机票目前无法退票!\n");
				getch();
			}
		}
		if (i == class_num)
		{
			printf("输入错误!");
			getch();
		}
	}
}
// 查询(退票专用)
int findBynum(char s1[])
{ 
	int i, h = 0;
	ShowTable1();
	for (i = 0; i < class_num; i++)
	{
		if (strcmp(s1, records[i].num) == 0)
		{
			printf("|----------|----------------|----------|----------|--------|--------|--------|\n");
			printf("|%10s|%s_%02s_%02s %2s:%2s|%10s|%10s|%8.1f|%8d|%8d|\n", 
					records[i].num, records[i].year, records[i].mon, 
					records[i].day, records[i].hour, records[i].min,
				    records[i].from, records[i].to, records[i].hours, 
					records[i].max, records[i].now);
			h += 2;
			break;
		}
	}
	ShowTable2(h);
	return i;
}
// 信息的保存
void save()
{ 
	FILE *fp1, *fp2;
	if ((fp1 = fopen("机票管理系统.dat", "wb")) == NULL)
	{// wb:只写打开或新建一个二进制文件;只允许写数据
		printf("文件打开错误!");
		exit(0);
	}
	if ((fp2 = fopen("机票管理系统0.dat", "wb")) == NULL)
	{
		printf("文件打开错误!");
		exit(0);
	}
	fwrite(&class_num, sizeof(int), 1, fp2);
	fwrite(records, sizeof(CLASS), class_num, fp1);
	fclose(fp1);
	fclose(fp2);
}
// 打开文件的函数
void load()
{ 
	FILE *fp1, *fp2;// fp1中是CLASS结构体的信息,fp2是class_num(总的班次数)
	if ((fp1 = fopen("机票管理系统.dat", "rb")) == NULL)
	{
		system("cls");
		printf("文件打开错误!");
		getch();
		exit(0);
	}
	if ((fp2 = fopen("机票管理系统0.dat", "rb")) == NULL)
	{
		system("cls");
		printf("文件打开错误!");
		getch();
		exit(0);
	}
	fread(&class_num, sizeof(int), 1, fp2);
	fread(records, sizeof(CLASS), class_num, fp1);
	fclose(fp1);
	fclose(fp2);
}
// 退出系统
void quit() 
{
	char s[5];
	system("color 03");
	printf("确认退出?(Y/N)");
	scanf("%s", s);
	if (s[0] == 'y' || s[0] == 'Y')
	{                              
		exit(0);
	}
}

// 判断日期前的准备
bool judge(int x) {
    if((x%4==0&&x%100!=0)||x%400==0) return true;
    else return false;
}
int sum(int x1,int x2,int x3,int d1) {
    switch(x2-1) {
        case 11:d1+=30;
        case 10:d1+=31;
        case  9:d1+=30;
        case  8:d1+=31;
        case  7:d1+=31;
        case  6:d1+=30;
        case  5:d1+=31;
        case  4:d1+=30;
        case  3:d1+=31;
        case  2:d1+=28;
        case  1:d1+=31;
        case  0:d1+=x3;
    }
    if(judge(x1)) {
        if(x2>=3) d1+=1;
    }
    return d1;
}
// 判断日期(十天之前or之后)  返回相差的天数
int overdate(int i)
{
	int d1 = 0, d2 = 0;
	int x1 =  atoi(records[i].year);
	int x2 =  atoi(records[i].mon);
	int x3 =  atoi(records[i].day);

	struct tm *local;
	time_t t;
	t = time(NULL);
	local = localtime(&t);// 得到当前系统日期
	int y1 = local->tm_year+1900;
	int y2 = local->tm_mon+1;
	int y3 = local->tm_mday;

	d1=sum(x1,x2,x3,d1);
    d2=sum(y1,y2,y3,d2);
    if(x1<y1) {
        int ans=d2;
        if(judge(x1)) ans+=366-d1;
        else ans+=365-d1;
        for(int i=x1+1;i<y1;i++) {
            if(judge(i)) ans+=366;
            else ans+=365;
        }
        return ans;
    }
    else if(x1==y1) {
		int ans = abs(d1-d2);
        return ans;
    }
    else {
        swap(x1,y1);
        swap(d1,d2);
        int ans=d2;
        if(judge(x1)) ans+=366-d1;
        else ans+=365-d1;
        for(int i=x1+1;i<y1;i++) {
            if(judge(i)) ans+=366;
            else ans+=365;
        }
        return ans;// 返回的是相差天数
    }
}
// 根据相差天数的正负判断日期先后
int overdate2(int i){
	int d1 = 0, d2 = 0;
	int x1 =  atoi(records[i].year);
	int x2 =  atoi(records[i].mon);
	int x3 =  atoi(records[i].day);

	struct tm *local;
	time_t t;
	t = time(NULL);
	local = localtime(&t);// 得到当前系统日期
	int y1 = local->tm_year+1900;
	int y2 = local->tm_mon+1;
	int y3 = local->tm_mday;

	bool f = 0;
    if(x1>y1||(x1==y1&&x2>y2)||(x1==y1&&x2==y2&&x3>y3)){
        f = 1;// 为正
    }
	int days = 0;
	if(f == 1){
		days = overdate(i);
	}
	else {
		days = overdate(i)-2*overdate(i);
	}
	return days;// 返回负值代表起飞日期在当前系统日期之前!
}
// 判断飞机是否发出
int overtime(int i)
{ 
	struct tm *local;
	time_t t;
	t = time(NULL);
	local = localtime(&t);// 得到当前系统时间
	
	if(overdate2(i) >= 1)
	{// 飞机未发出
		return 1;
	}
	else if (overdate(i) == 0 && (local->tm_hour < atoi(records[i].hour) || 
		local->tm_hour == atoi(records[i].hour) && local->tm_min < atoi(records[i].min)))
	{// 飞机未发出
		return 1;
	}
	else
	{// 飞机发出
		return 0;
	}
}
// 主函数模块
int main()
{
	system("cls");
	for (;;)
	{
		switch (menu_select())
		{
			case 1:
				NewMessage();
				break;
			case 2:
				Display();
				break;
			case 3:
				search();
				break;
			case 4:
				add();
				break;
			case 5:
				Ticketorder();
				break;
			case 6:
				Ticketdelete();
				break;
			case 7:
				quit();
				break;
		}
	}
	return 0;
}

**忘记放上来了,,感jio这个题目算里面简单的了,很幸运~

小记:老师真是火眼金睛!比我都知道我写的是什么(她估计也是看这些看得够够的了hhh)

        她提出的问题:如果一开始输入错误该怎么办?

        应当提示出来并让其重新输入。但我妹有考虑到这一点,这里是如果输错了(或输入不合规范),程序就不会往下执行了,这不够人性化。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机票管理系统是一个用C语言编写的大型软件项目,旨在提供一个方便快捷、高效准确的机票销售和管理平台。该系统包括以下功能: 1. 机票信息管理:可以对机票的基本信息进行录入、修改和删除,包括航班号、航空公司、起飞地点、目的地、起飞时间、票价等。 2. 机票查询和预订:用户可以通过系统查询航班信息,包括起飞地点、目的地、起飞时间等,并根据需求预订机票。 3. 机票售票:系统提供用户购买机票的功能,用户可以选择航班、座位等,系统会自动计算票价并生成订单。 4. 机票退票:用户可以通过系统办理机票退票手续,并根据退票规定进行退款。 5. 售票记录统计:系统可以根据不同的条件(如时间段、航空公司、目的地等)统计售票记录,方便管理人员进行业务分析和报表生成。 6. 操作员管理系统可提供操作员管理功能,包括添加新操作员、修改操作员信息、删除操作员等,确保系统的安全性和权限分配。 7. 数据备份与恢复:系统可以对数据进行定期备份,以免丢失重要数据,同时还能根据需要进行数据恢复。 8. 系统设置:系统设置功能可以更改系统参数,如航班查询规则、退票规定、座位布局等。 机票管理系统通过C语言编写,具有高效性和可移植性,能够在不同的操作系统平台上运行。使用该系统可以有效提升机票销售和管理的效率,提供更好的用户体验,同时也方便了管理人员进行业务分析和决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值