精华内容
下载资源
问答
  • C语言航空订票系统课程设计

    万次阅读 多人点赞 2018-11-13 10:50:41
    目录 1.设计目的: 2总体设计和功能: 3.菜单设计 4.各功能代码详解(闲话少扯):...前言:最经做了一个课程设计,设计的内容就是航空订票系统,又认真复习了一遍c语言的知识,感觉这个设计对于初学者来说,C...

     

    目录

    1.设计目的:

    2总体设计和功能:

    3.菜单设计

    4.各功能代码详解(闲话少扯):

    4.1.C语言文件的操作:

    4.2.读取航班信息:

    C语言知识回顾 

    4.3.打印航班信息

    5.根据要求查找航班(航班号、起点站、终点站)

    6.订票功能(链表操作)


    前言:最经做了一个课程设计,设计的内容就是航空订票系统,又认真复习了一遍c语言的知识,感觉这个设计对于初学者来说,C的能力和逻辑能力会有一个提升,为了更好的总结自己学习的成果,故写下此篇博客记录一下该课程设计的重点知识,以便以后回顾。


    1.设计目的:

    1.  数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(C语言),自行实现一个较为完整的应用系统的设计与开发

    2.  通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用 。

    3.  学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。

      航空订票系统:

    (1)熟练掌握链表存储结构及其建立过程和常用操作;

    (2)熟练掌握队列的建立过程和常用操作;

    (3)学会自己调试程序的方法并掌握一定的技巧。

    2总体设计和功能:

    通过此系统可以实现如下功能:

    1. 读取磁盘的航班信息和客户订票信息(通过C语言的FILE功能)。
    2. 显示航线信息:可以显示在磁盘读入的航班信息。
    3. 显示客户信息:可以查询的客户信息包括,在磁盘文件读入的客户信息和通过 系统订票的客户信息。
    4. 查询各航线信息:可以通过三种方式去查询一个航线的信息,第一:通过航班 号,第二:通过起点查询;第三:通过终点站查询航班信息。
    5. 订票功能:用户可以在系统进行订票,订票需要输入客户的、航班号、身份证 号码、客户姓名、仓位等级进行预定。
    6. 退票功能:退票功能,需要客户提供需要退票的航班号进行查询,然后输入客 户姓名,系统查询到此客户信息退票成功,否则失败。

     


    3.菜单设计

    3.1主菜单代码如下:

    int main()
    {
    	int sel;
    	readinfo(&L);
    	readinfo_book(&B);
    	InitOrder();
    	while (1)
    	{
    		printf("\n\n\n\n");
    		printf("\t欢迎进入航班订票系统\n");
    		printf("*****************************\n");
    		printf("*       航空订票客运系统    *\n");
    		printf("*      1.显示各航线信息     *\n");
    		printf("*      2.查询各航线信息     *\n");
    		printf("*      3.订          票     *\n");
    		printf("*      4.退          票     *\n");
    		printf("*      0.退  出  系  统     *\n");
    		printf("*****************************\n");
    		printf("请 选 择(0-4):\n");
    		scanf("%d", &sel);
    		switch (sel)
    		{
    		case 1:meau1(); break;//选择菜单1
    		case 2:meau2(); break;//选择菜单2
    		case 3:orderTicket(); break;//订票
    		case 4:refund_ticket(); break;//退票
    		case 0:return;//退出程序
    		default:printf("输入错误\n"); break;
    		}
    	}

     界面如下:

    主程序是整个系统的入口,首先初始化L和B的结构体变量,打印提示信息,然后让用户输入一个数值,从.0-4,输入数值1进入菜单1(meau1()):

    meau1()程序如下:

    void meau1(void)
    {
    	int subsel;
    	while (1)
    	{
    		printf("============================\n");
    		printf("=  显示各航线信息的子菜单  =\n");
    		printf("============================\n");
    		printf("*      1.显示所有航线     *\n");
    		printf("*      2.显示订单客户     *\n");
    		printf("*      3.返回主菜单       *\n");
    		printf("============================\n");
    		printf("请 选 择(1-3):\n");
    		scanf("%d", &subsel);
    		switch (subsel)
    		{
    		case 1:printAllofAirMsg(); break;
    		case 2:printOrderCustomByAirNum1(); break;
    		case 3:return;
    		default:printf("输入错误\n"); break;
    		}
    	}
    }

    界面如下:

    meau2() 程序如下:

    void meau2(void)
    {
    	int subsel;
    	while (1)
    	{
    		printf("============================\n");
    		printf("=     航线信息查询子菜单   =\n");
    		printf("============================\n");
    		printf("*      1.按航班号查询       *\n");
    		printf("*      2.按起点站查询       *\n");
    		printf("*      3.按终点站查询       *\n");
    		printf("*      4.返回主菜单         *\n");
    		printf("============================\n");
    		printf("请 选 择(1-4):\n");
    		scanf("%d", &subsel);
    		switch (subsel)
    		{
    		case 1:searchbyAirno(); break;
    		case 2:searchbystartPlace(); break;
    		case 3:searchbyEndPlace(); break;
    		case 4: return;
    		default:printf("输入错误\n"); break;
    		}
    	}
    }

    界面如下: 

    还有一些菜单都是都是比较简单的知识,直接看源代码即可。 


     

    4.各功能代码详解(闲话少扯):

    4.1.C语言文件的操作:

    在这个系统中,需要读取两个文件,一个是航班信息文件,一个是订票客户信息文件,后缀都是(.txt),内容如下:

    航班信息.txt

    航班号	起点	终点	飞行日	起飞时间	到达时间	机型	价格	乘员定额	余票量
    CA1544	合肥	北京	1.3.5	10:55	12:40	A733	960	      100	 90 
    MU5341	上海	广州	每日	14:20	16:15	M90	    1280	  150	150 
    CZ3869	重庆	深圳	2.4.6	08:55	10:35	733	    1010	  100	100 
    MU3682	桂林	南京	2.3.4	20:50	22:15	M90	    1380	  150	120 
    HU1836	上海	北京	每日	09:40	11:20	738	    1250	  120	120 
    CZ3528	成都	厦门	1.3.5	15:10	16:50	CRJ	    1060	  130	130 
    MU4594	昆明	西安	2.4.6	10:15	11:40	328	    1160	  140	140 
    SC7425	青岛	海口	1.3.6	19:20	21:20	DH4	    1630	  190	190 
    CA1234	洛阳	上海	1.3.5	08:00	10:00	DH4	    1050	  300	300 
    CA4321	shai	洛阳	2.4.6	16:00	18:00	DH4	    1100	  300	300 
    

    订票信息.txt

    航班号	姓名	身份证	订票数量
    CA1544	丁方	410221    4
    CA1544	邢风	410222    4
    CA1544	刘向	410223    2
    MU5341	wan 	415225    2
    MU5341	严寒	412003    12
    MU3682	吴伟	412009    2
    MU3682	刘敏	400281    1

    在系统运行时,首先会从电脑本地磁盘读取上面两个文件的信息到两个不同的结构体里面,然后就可以通过读取结构体的内容获取到这个航班信息和订票客户的信息了(注意结构体的成员变量应该是和我们所需要读取文件的内容是一致的,就是说要读取多少的内容,就需要为这个结构体变量开辟多少的静态内存):

    航班信息结构体如下:

    //航班信息结构体定义,每个航班号都会有不同的乘客名单,所以每个航班都应该有一个链表
    typedef struct airinfo
    {
    	char Airno[8];//航班号
    	char start[6];//出发地
    	char end[6];//目的地
    	char sche[6];//飞行日
    	char time1[8];//出发时间
    	char time2[8];//到达时间
    	char mode[5];//机型
    	int  price;//票价
    	int  fixed;//  乘客定额
    	int  remained;//余票
    	PBookList order;/*指向乘员名单链表的头指针,通过这个指针就可以找到所有乘客的名单了*/
    }AirInfo,*PAirInfo;

    客户订单结构体:

    //航订票客户列表体结构体定义
    typedef struct Book
    {
    	char Airnum[8];//航班号
    	char name[20];//客户姓名 
    	char didentify[6];//身份证号 
    	int  order_amount;//订票数量
    	int grade;
    	struct Book *Pnext;//指向下一个用户的首地址
    }*PBookList, BookList;

    接下来再定义两个结构体,去定义航班信息和客户的总体信息,以及统计航班数和客户订单数量:

    //航班信息总体结构体定义
    typedef struct
    {
    	AirInfo s[MAX]; //航班信息数组
    	int acount;  //记录当前航班信息数
    }SSList;
    //订单客户总体信息
    typedef struct
    {
    	BookList book[BOOKMAX];
    	int book_acount;
    }SbookList;
    
    
    #define MAX  20
    #define BOOKMAX  100
    

    4.2.读取航班信息:

    下贴上程序,然后再进行分析:

    //读取文本信息,并赋值给结构体变量,传入的参数是SSList结构体变量的指针
    void readinfo(SSList *L)
    {
    	FILE *fp;//定义文件指针
    	if ((fp = fopen("航班信息.txt", "r")) == NULL)
    	{
    		printf("航班文件不存在 \n");
    		exit(1);
    	}
    	else
    	{
    		int i = 0; char tep[500];
    		L->acount = 0;     //航班次数初始化
    		while (!feof(fp))
    		{
    			fgets(tep, 500, fp);//读取第一行说明:航班号  起点  终点 略..;
    			//读取正确的信息;
    			if (10 != fscanf(fp, "%s %s %s %s %s %s %s %d %d %d", L->s[i].Airno, L->s[i].start, L->s[i].end, L->s[i].sche, L->s[i].time1, L->s[i].time2,
    				L->s[i].mode, &L->s[i].price, &L->s[i].fixed, &L->s[i].remained))
    			{
    				printf("读取文件出错\n");
    				//关闭文件流指针,退出;
    				fclose(fp);
    				exit(1);
    			}
    			i++;
    			L->acount++;
    		}
    	}
    	fclose(fp);
    }

    程序分析:

    提示:文件读取的详细解释:带我查看

    注意:这里打开的文件使用的相对路径。 

    如果fopen返回了打开文件的首地址,打开成功,进行航班信息的读取工作。


    • fcanf函数的讲解

    格式化输入函数fscanf

     调用:fscanf(fpt,格式控制,地址列表);

     功能:以ASCII码值的方式从fpt关联的文件中读取数据,按格式控制字符串中指定的数据格式转换后送到由输入地址列表中相应项指定的内存单元。函数返回值为正确处理的数据项个数。

    例子:

    如果文件的内容为 ”6,6.6“,则可以使用如下语句读取:

    //m和a是已经定义的int类型和double类型的变量

    fcanf(fp,"%d,%lf",&m,&a);   //注意此处是地址列表
     

    fscanf(fp, "%s %s %s %s %s %s %s %d %d %d",
                    L->s[i].Airno, L->s[i].start, L->s[i].end, L->s[i].sche,
                    L->s[i].time1,L->s[i].time2,L->s[i].mode, &L->s[i].price, 
                    &L->s[i].fixed, &L->s[i].remained))

    解释:fscanf函数的第一个参数是打开文件的指针变量,第二个参数格式控制,第三个参数就是读取的地址列表。

    我们需要读入的数据以空格隔开,共有十个数据,所以上面橙色字体的格式控制有10个,我们需要读入的是结构体里面,定义了一个结构体变量L来存放它。

    为什么是这种形式赋值:L->s[i].Airno

    回忆一下:我们传入这个函数的形参是SSList *类型的

    这里为了去统计航班信息数,使用了一个结构体的嵌套:如下:

    如果在函数void readinfo(SSList *L),中需要去改变第i个航班的Airno的成员变量的值,如何做?


    C语言知识回顾 

    此处就涉及到了C语言指针一些语法的问题了,先复习一下指针的知识吧,例如我定义了一下的两个变量

    int a=5;   //定义了一个整形变量a
    int * b; //定义了一个变量b,这个变量是整形的指针变量,用于存放整形数据的地址
    b = &a;  //把a的地址 赋予给b这个指针变量

    上面的语句相当于做了什么事呢?用一个简图表示如下:

    那么在C语言中有规定,此时:*b  和  的值是相等的。

    注意:*b的含义是:以b内容(1000h)为地址的变量的值(那就是变量a的值咯)。


    继续深入,结合结构体:

    现在定义一个如下的结构体:

    typedef struct student
    {
        int age;  //结构体成员变量
        int num;
    }stu;
    
    stu stu1;  //定义了一个结构体变量stu1,此时已经在内存开辟了一块静态空间给结构体变量stu1,因为没有
               //进行赋值,所以里面的是垃圾值

    如果此时我们想在主函数调用一个函数去改变这个stu1结构体变量的信息,如何做?

    提示:如果我们想通过函数调用的方法去改变一个函数的值,那必须传递指针才能做到,因为当你在主函数中调用一个函数,那么此时就会分一块新的空间给这个函数,即使我们改变了调用函数的值,但是函数执行结束,就会自动释放内存,也无法把我们想要的结果传递回来。所以在主函数通过调用函数的方式改变一个变量或者结构体变量,必须传递指针(当然还有返回值,但是返回值只能返回一个数据)。

    因此定义一个函数为:void change_stu_msg(stu * student)

    那么在这个函数中应该怎样写,可以考虑一下,这个函数的形参是stu * 类型的,表示的是接受stu结构体变量的地址,那么想要改变stu1这个结构体变量的内容,传递进来的应该是 : stu1的地址(&stu1)。

    通过上面知道,此时 student = &stu1,也就是student这个结构体指针变量存放了stu1的地址。

    那么,*student 就等价于 stu1 ,此时想要改变stu1结构体变量的值,函数就可以如下这样写:

    void change_stu_msg(stu * student)
    {
        (*student).age=10;
        (*student).num=20;
        
    }

    那么当我们在main主函数中调用这个函数:change_stu_msg(&stu1);

    执行结果:这个结构体变量的成员,age=10,num=20;不再是一个垃圾值了。

    那么箭头  -> 和这个有什么关系? 这点其实就是语法的规定而已

    在C语言中规定:

    还是拿上面的函数举例,为了方便书写,可以把 :(*student).    等价成为    ->    

    那么 void change_stu_msg(stu * student) 也可以这样子写:

    void change_stu_msg(stu * student)
    {
        student->age=10;
        student->num=20;
        
    }

    这下应该对上面的赋值语句有所了解了吧。


    复习完C语言的知识,回到刚刚那么问题:

    如果在函数void readinfo(SSList *L),中需要去改变第i个航班的Airno的成员变量的值,如何做?

    这个函数的形参不就是接受一个 SSList 结构体变量的指针嘛,那先定义一个结构体变量咯:SSList L;

    提示:其实这个L变量就是用来存放我们的数据的,只是现在是一些垃圾值,void readinfo(SSList *L) 这个函数就是对这个变量 L 进行初始化滴。

    那在主函数中调用的话,必须把L的指针传递进去,即为:readinfo(&L);

    此时就会有这样的一个关系: L = &L;     //注意此时这两个L不是一样的,一个是实参,一个是形参。形参的L可以随便改

    这样看起来怪怪的,把形参的L修改成 List 把,这样容易看一点 ,即为:void readinfo(SSList *List) 

    此时有这样一个关系: List = &L;    那么 *List = L 。

    而L结构体有两个成员变量,如下:

    改变第一个成员变量的值使用:(*List).s[MAX] 

    可以看到s[MAX] 是一个数组,他是一个怎样的数组呢?AirInfo类型的数组,而Airinfo是一个结构体,那s[MAX] 就是一个结构体数组(定义MAX为20),AirInfo结构体有什么内容?

    从内存角度来说其实就是开辟了类似如下的一大块静态内存:

    那么想改变第2个航班的信息,就必须定位到 s[1]这个结构体咯,即为:(*List).s[1]

    想改变这个结构体变量  s[1]的成员变量  Airno[8],如何做?  即为:(*List).s[1].Airno ="Hello"  

    在C语言复习那部分,知道  (*List).  可以等价于  List->

    这样子就可以回答上面提出的问题了:

    如果在函数void readinfo(SSList *List),中需要去改变第i个航班的Airno的成员变量的值,如何做?

    在函数中可以这样写:List->s[ i ].Airno ="Hello"


     

    从本地磁盘读取用户信息,因为其逻辑和读取航班信息是一样的,只贴出程序:

    //读取订单客户的文件,传入的参数是BookList结构体变量的指针。
    //读取到订单客户的信息应给是存储在一个数组里面。例如:book[BOOKMAX];
    void readinfo_book(SbookList * book)
    {
    	FILE *fp;//定义文件指针
    	if ((fp = fopen("订票信息.txt", "r")) == NULL)  //以只读的方式打开
    	{
    		printf("订票信息.txt文件不存在 \n");
    		exit(1);
    	}
    	else
    	{
    		int i = 0; char title[500];  //读
    		B.book_acount = 0;
    		while (!feof(fp))  //C提供了一个测试文件状态的函数feof(pf),当文件未结束时feof函数的值为0,
    			               //否则为非0值。使用函数feof来判断文件是否结束既可用于文本文件,还可用于二进制文件
    		{
    			fgets(title, 500, fp);//读取第一行说明:航班号  起点    终点 略去;
    			//读取正确的信息,格式化读取信息,把fp所指向的文件读取到结构体里面去
    			if (4 != fscanf(fp, "%s %s %s %d", B.book[i].Airnum, B.book[i].name, B.book[i].didentify, &B.book[i].order_amount))
    			{
    				printf("读取文件出错\n");
    				//关闭文件流指针,退出;
    				fclose(fp);
    				exit(1);
    			}
    			i++;
    			B.book_acount++;
    		}
    	}
    	fclose(fp);
    }

    有了这两个结构体和结构体成员变量,还有文件读取函数,就可以把这些航班信息和客户信息读取到我们所定义的结构体里面,我们结构体就是存储。也就是存储到如下的结构体里面

    4.3.打印航班信息

    通过在主函数调用读取航班信息和读取订票用户信息,然后把文本数据读取到L和B的结构体变量:

    通过上面的函数在结构体变量已经进行了赋值,也就是说我们的航班信息和客户订票信息已经储存于内存了。


    接下来就可以通过调用相应的结构体去读取信息啦:

    • 打印航班信息:

    代码如下,此处把结构体成员变量L的内容打印出来:

    void printAllofAirMsg(void)
    {
    	int i = 0;
    	for (i = 0; i < L.acount; i++)  //L.account是统计航班个数的,打印所有航班
    	{
    		printf("航班号 起点 终点 飞行日 起飞时间 到达时间 机型 价格 乘员定额 余票量\n");
    		printf("%s %s %s %s %s %s %s %d %d %d\r\n", L.s[i].Airno, L.s[i].start, L.s[i].end, L.s[i].sche, L.s[i].time1, L.s[i].time2, L.s[i].mode, L.s[i].price, L.s[i].fixed, L.s[i].remained);
    
    
    	}
    }

    已上的程序完成了一些简单的文件操作,需要掌握的知识是:

    1.文件的操作

    2.结构体的定义

    3.结构体变量的赋值

    4.打印结构体变量的内容 


    5.根据要求查找航班(航班号、起点站、终点站)

    此处只讲解一下按航班号查询航班信息,其他两个查询方式几乎和第一个一样。

    先贴出代码如下:

    /*根据客户提出的航班号输出航线信息*/
    void searchbyAirno()
    {
    	PAirInfo info, a;
    	char Airnum01[10];
    	int i = 0, sel;
    	info = L.s;
    	a = L.s;
    	printf("===============================\n");
    	printf("== 为您列出航班号供您选择:   =\n");
    	for (int j = 0; j < L.acount; j++)
    	{
    		printf("%d           %s\n", j, a[j].Airno);
    
    	}
    	printf("===============================\n");
    	printf("请输入要选择航班的序号:");
    	scanf("%d", &sel);
    	//根据用户的选择,给Airnumber变量赋值不同的航班号
    	if (sel >= L.acount) {
    		printf("输入错误\n");
    		return;
    	}
    	else  //输入的序列号有效
    	{
    		strcpy(Airnum01, info[sel].Airno);
    	}
    
    	while (i < MAXSIZE)
    	{
    		if (!strcmp(Airnum01, a[i].Airno)) break;
    		i++;
    	}
    	if (i >= MAXSIZE)
    	{
    		printf("\n\n");
    		printf("对不起,该航线未找到!\n");
    		printf("\n\n");
    	}
    
    	else
    	{
    		printf("================================================================================\n");
    		//printf("航班号 起点 终点 飞行日 起飞时间 到达时间 机型 价格 乘员定额 余票量\n");
    		printOneofAirMsg(i);
    	}
    }

    在界面上显示效果如下:

    接下来读取航班序号,来判断你选择的航班信息:

    打印航班信息:

    void printOneofAirMsg(int i)
    {
    	
    		printf("航班号 起点 终点 飞行日 起飞时间 到达时间 机型 价格 乘员定额 余票量\n");
    		printf("%s %s %s %s %s %s %s %d %d %d\r\n", L.s[i].Airno, L.s[i].start, L.s[i].end, L.s[i].sche, L.s[i].time1, L.s[i].time2, L.s[i].mode, L.s[i].price, L.s[i].fixed, L.s[i].remained);
    
    }

    效果如下:


    6.订票功能(链表操作)

    其实这一部分最终要的就是链表的操作,无非就是链表的创建,链表的增加,链表的删除等问题。

    所以首先需要熟悉的是链表

     


    最近比较忙,先贴上代码吧。

    代码链接:https://download.csdn.net/download/qq_36243942/10785641

     

     

     

     

     

     

    展开全文
  • 航空订票系统所用到的一切,包括文档。。。。。。。。。航空订票系统航空订票系统航空订票系统航空订票系统航空订票系统航空订票系统
  • 飞机订票系统设计_课程设计报告.doc
  • 这是一些有关C语言的文章,其中不乏有关的论文,另外大家知道C和汇编语言是通常是在一起,总之有喜 欢linux,c,汇编语言,嵌入式的朋友下载下来看一下吧,如果你是我所说的以上爱好者的话,小弟绝对不 ...
  • 航空订票系统课程设计 很详细,包含源代码
  • 数据结构航空订票系统课程设计报告.doc
  • 数据结构航空订票系统课程设计汇本报告.doc
  • JavaEE航空订票系统课程设计论文jsp实验报告.pdf
  • 包含源代码(可直接在eclipse中运行),完整的课程设计报告,以及测试用例)
  • 设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。 【基本要求】 (1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行周日(星期几)、乘员定额、余票量、已订票的客户名单(包括姓名、订票量、...
  • 连接sql server或者mysql的课程设计,求求大神了,急需</p>
  • 使用Vc6.0编译的飞机定票系统C语言代码文件,是曾经的期末大作业
  • 数据结构课程设计之飞机订票系统。巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。 (1)通过本课程的学习,能熟练掌握几种基本数据结构...
  • C++课程设计航空客运订票系统工程文件 基于C++程序设计基础,实现了多级用户管理。乘客用户可以查询航班,根据旅客提出的终点站名输出信息;根据提供的航班号进行购票,可选择购票数,若有余票,则为用户办理订票...
  • 【数据结构课程设计航空订票系统(含源代码)含三个课程设计,一个源代码。三人共同完成 VC6.0可运行
  • 计算机学院 面向对象程序设计课程设计报告 计算机学院 面向对象程序设计课程设计报告 xx 学号 xx 学号 xx xx 面向对象程序设计 面向对象程序设计 课程设计报告 课程设计报告 题目 xx 题目 xx 专业 xx 专业 xx 班级 x...
  • 一、 课程设计目的………………………………………………………….3 二、 课程设计内容……………………………………………………………….3 三、 需求分析……………………………………………………………………..3...
  • 信息系统分析与设计(总体设计、详细设计、数据库设计
  • 数据结构课程设计-航空订票系统

    千次阅读 2018-12-17 23:10:53
    这是我这学期的课程设计的内容。借此机会学习了c语言的文件操作的内容。 C语言的文件处理 1. FILE * fopen(const char * path, const char * mode); 返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果...

    这是我这学期的课程设计的内容。借此机会学习了c语言的文件操作的内容。
    有需要的可以去我的资源下载,也可以查看下一篇博客,里面是源码,但是写成博客太麻烦,就不写了。

    C语言的文件处理

    1. FILE * fopen(const char * path, const char * mode);

    返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码
    存储到error中。
    mode的类型
    r 以只读方式打开文件,该文件必须存在。
    r+ 以读/写方式打开文件,该文件必须存在。
    rb+ 以读/写方式打开一个二进制文件,只允许读/写数据。
    rt+ 以读/写方式打开一个文本文件,允许读和写。
    w 打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件。
    w+ 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)。
    a+ 以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)。
    wb 以只写方式打开或新建一个二进制文件,只允许写数据。
    wb+ 以读/写方式打开或建立一个二进制文件,允许读和写。
    wt+ 以读/写方式打开或建立一个文本文件,允许读写。
    at+ 以读/写方式打开一个文本文件,允许读或在文本末追加数据。
    ab+ 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

    2. access函数

    头文件:unistd.h
    功能:确认文件或文件的访问权限。即,检查某个文件的存取方式。如果存取方式有效,则
    函数返回0否则返回-1
    用法:int access(const char *filepath, int mode);或者int_access(const charpath, int mode);

    参数说明:

    filepath
    文件或者文件夹的路径,当前目录直接使用文件呢或文件夹名
    备注:当该参数为文件的时候,access函数能使用mode参数所有的值,当该参数为文件夹的时候,access函数值能判断文件夹是否存在。

    mode
    要判断的模式
    在头文件unsited.h的预定义如下:
    #define R_OK 4 /只判断是否有读权限/
    #deifine W_OK 2 /只判断是否有写权限/
    #define X_OK 1 /判断是否有执行权限/
    #define F_OK 0 /判断是否存在/

    3. feof()是C语言标准库函数

    其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
    (即,文件结束:返回非0值,文件未结束,返回0值),文件结束符只能被clearerr()清除。

    4. fread()函数

    函数原型 size_t fread ( void* buffer, size_t size, size_t count, FILE *stream) ;

    参数:
    buffer 用于接收数据的内存地址
    size 要读的每个数据项的字节数,单位是字节
    count 要读count个数据项,每个数据项size个字节
    stream 输入流

    5. fwrite()函数

    函数原型 size_t fwrite(const void* buffer, size_t size, size_t count, FILE *stream);
    返回值:返回实际写入的数据块数目

    参数:
    buffer 是一个指针,对fwrite来说,是要获取数据的地址
    size 是写入内容的单字节数
    count 要进行写入size字节的数据项的个数
    stream 目标文件指针

    6. fseek()函数

    函数原型:int fseek(FILE * stream, long offset, int fromwhere);函数设置文件指针stream的位置。
    如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset取值大于等于210241024*1024,即long的正数范围2G),则不改变stream指向的位置,函数返回一个非0值。

    fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。

    完整内容已经上传到资源中
    该课程设计的是参照了网上下载的360多行的代码,但是它的功能不齐全,业务逻辑也很差。
    经修改,丰富了功能,梳理了业务逻辑。
    功能模块图:
    在这里插入图片描述
    业务逻辑图:在这里插入图片描述
    用户订票流程图:
    在这里插入图片描述

    展开全文
  • 这个是我们自己做的关于数据库的课程设计,飞机订票系统,还有源代码会在后面加上的
  • 航空订票系统 项目实践完整源码前言一、功能演示二、代码总结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 编写程序模拟航空订票系统,要求实现以下功能: ① 允许增、删、改航班信息...

    航空订票系统 项目实践完整源码


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    编写程序模拟航空订票系统,要求实现以下功能:
    ① 允许增、删、改航班信息,包括“航班号 / 机型 / 起降城市 / 起降时间 / 座位数 / 票价等”(所有航班信息存储在本地文本文件中,格式自定义)。
    ②允许以“航班号 / 起降城市” 等条件模糊查询航班信息。
    ③订票:无票时应能提供相关可选择的航班以继续操作(订票数据存储在本地文本文件中,格式自定义)。
    ④退票:退票后应修改相关数据文件。


    一、功能演示

    主界面
    用户登入
    用户界面
    管理员登入管理员界面
    修改航班信息界面
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    二、代码

    代码如下:

    #include <iostream>
    #include <fstream>
    #include <stdio.h>
    #include <cstring>
    
    using namespace std;
    
    struct client
    {//客户
    	char name[20];			//姓名
    	int ordering_number;	//订票量
    	int grade;				//舱位等级
    	client* next;
    };
    
    
    class airline
    { //航班信息
    private:
    	char air_num[10];			//航班号
    	char plane_num[10];			//机型
    	char start_station[20];		//始发站
    	char end_station[20];		//终点站
    	char dayup[7];				//出发时间
    	char daydown[7];			//到达时间
    	int people_quota;			//乘员定额
    	double price;				//票价
    	int more_ticket;			//余票量
    	char passenger_list[50];	//乘客名单
    	char waiting_list[50];		//等候替补的客户名单
    	static int number;			//航班总数
    
    public:
    	//打印航班信息
    	void print()
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*  " << air_num << "\t  " << plane_num << "\t " << start_station << "\t     "
    			<< end_station << "\t   " << dayup << "\t   " << daydown << "\t    " << people_quota
    			<< "\t         " << price << "\t    " << more_ticket << "\t   *\n";
    		cout << "*                                                                                                                  *\n";
    
    	}
    
    	friend client* get_passenger(airline);			 //读取某航班乘客信息
    	friend client* get_wait(airline);				 //读取某航班等候替补名单
    	friend airline* get_airline();                   //读取文件中的航班信息
    
    	friend void put_passenger(airline, client*);	 //输出乘客信息到文件
    	friend void put_wait(airline, client*);			 //输出等候替补名单
    	friend void put_airline(airline*);				 //输出修改后的航班信息
    
    	friend void search();							 //查询操作(用户操作)
    	friend void booking();							 //订票操作(用户操作)
    	friend void refund();							 //退票操作(用户操作)
    
    	friend void print_airline();					 //打印所有航班信息(管理员操作)
    	friend void client_list();						 //乘客链表名单(管理员操作)
    	friend void add_airline();						 //添加航班    (管理员操作)
    	friend int change_airline();					 //修改航班信息(管理员操作)
    
    								 /*八个航班修改操作*/
    	friend void modify_air_num();					 //修改航班号(管理员操作)
    	friend void modify_upstation();					 //修改起飞城市(管理员操作)
    	friend void modify_downstation();				 //修改降落城市(管理员操作)
    	friend void modify_plane_num();					 //修改机型(管理员操作)
    
    	friend void modify_time();						 //修改起降时间(管理员操作)
    	friend void re_price();							 //修改某航班的票价(管理员操作)
    	friend void modify_more_ticket();				 //修改某航班余票量(管理员操作)
    	friend void del_airline();						 //删除某航班(管理员操作)
    
    };
    
    int airline::number = 0;
    char Name[20] = "";            //用于用户登录的姓名
    airline* L;					   //全局变量,航线指针
    
    //增加乘客
    void app_client(client* c, client* q)
    {
    	client* p = c;
    	while (p->next) p = p->next;
    	p->next = q;
    	q->next = NULL;
    }
    
    //登录
    int login()
    {
    	int f;
    	char password[20]; const char* p = "0000";const char* q = "1111";					//密码管理
    	cout << "\t**********************************************************\n";
    	cout << "\t* @       @    @@@@   @    @@@   @@@    @@@@@      @@@@  *\n";
    	cout << "\t* @   @   @   @ @@@@  @   @     @   @  @  @  @    @ @@@@ *\n";
    	cout << "\t*  @  @  @    @       @   @     @   @  @  @  @    @      *\n";
    	cout << "\t*   @@ @@      @@@@   @@@  @@@   @@@   @  @  @     @@@@  *\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*           @@@@@@   @    @     @@@@@    @@@@@           *\n";
    	cout << "\t*              @     @    @     @        @               *\n";
    	cout << "\t*              @     @    @     @@@@@    @@@@@           *\n";
    	cout << "\t*          @   @     @    @     @        @               *\n";
    	cout << "\t*           @@@       @@@@      @        @@@@@           *\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*                  Air reservation ststem                *\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t***************************登录***************************\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*             1.乘客登录         2.管理员登录            *\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*           请选择用户身份:";
    	fflush(stdin);		//刷新输入流缓冲区
    	while (cin >> f)
    	{
    
    		if (f == 1)
    		{
    			cout << "\t*                                                        *\n";
    			cout << "\t*                     姓名:";
    			cin >> Name;
    			cout << "\t*                                                        *\n";
    			cout << "\t*   输入账户密码(提示4个1):";
    			fflush(stdin);
    			while (cin >> password)
    			{
    				if (!strcmp(password, q))
    				{
    					cout << "\t*                                                        *\n";
    					cout << "\t*                      登录成功!!                      *\n";
    					cout << "\t*                                                        *\n";
    					cout << "\t*                                                        *\n";
    					cout << "\t**********************************************************\n\n\t";
    					return 1;
    				}
    				else
    				{
    					cout << "\t*                                                        *\n";
    					cout << "\t*             密码错误!! 请重新输入!                   *\n";
    					cout << "\t*                                                        *\n";
    					cout << "\t*   输入账户密码(提示4个1):";
    				}
    			}
    
    		}
    		else if (f == 2)
    		{
    			cout << "\t*                                                        *\n";
    			cout << "\t*        输入管理员密码(提示4个0):";
    			fflush(stdin);
    			while (cin >> password)
    			{
    				if (!strcmp(password, p))
    				{
    
    					cout << "\t*                                                        *\n";
    					cout << "\t*                      登录成功!!                      *\n";
    					cout << "\t*                                                        *\n";
    					cout << "\t*                                                        *\n";
    					cout << "\t**********************************************************\n\n\t";
    					return 2;
    				}
    				else
    				{
    					cout << "\t*                                                        *\n";
    					cout << "\t*             密码错误!! 请重新输入!                   *\n";
    					cout << "\t*                                                        *\n";
    					cout << "\t* 输入管理员密码(提示4个0):";
    
    
    				}
    			}
    		}
    		else
    		{
    			cout << "\t*                                                        *\n";
    			cout << "\t*           输入错误!! 请重新输入 !!                   *\n";
    			cout << "\t*                                                        *\n";
    			cout << "\t*           请选择用户身份:";
    		}
    	}
    }
    
    //乘客用户界面
    int form1()
    {
    	int s;
    	cout << "\t*************************用户界面*************************\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*   1.查询航班\t   2.退票       3.订票     0.退出登录    *\n";
    	cout << "\t*                                                        *\n";
    	cout << "\t*                  选择操作:";
    	fflush(stdin);
    	while (cin >> s)
    	{
    		if (s >= 0 && s <= 3)
    		{
    			cout << "\t*                                                        *\n";
    			cout << "\t*                                                        *\n";
    			cout << "\t**********************************************************\n";
    			return s;
    		}
    		else
    		{
    			cout << "\t*                                                        *\n";
    			cout << "\t*            输入错误!!!                               *\n";
    			cout << "\t*                                                        *\n";
    			cout << "\t*            请重新选择操作:";
    		}
    	}
    }
    
    //管理员界面
    int form2()
    {
    	int s;
    	cout << "\t*******************************管理员界面*********************************\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*  1.航班信息    2.乘客名单   3.添加航班   4.修改航班信息    0.退出登录  *\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*                      选择操作:";
    
    	fflush(stdin);
    	while (cin >> s)
    	{
    		if (s >= 0 && s <= 4)
    		{
    			cout << "\t*                                                                        *\n";
    			cout << "\t**************************************************************************\n\t";
    			return s;
    		}
    		else
    		{
    			cout << "\t*                                                                        *\n";
    			cout << "\t*                      输入错误!!!                                     *\n";
    			cout << "\t*                                                                        *\n";
    			cout << "\t*                      请重新选择操作:";
    		}
    	}
    }
    
    //读取文件中的航班信息
    airline* get_airline()
    {
    	fstream f;int i = 0;
    	airline* line = new airline[100];
    
    	f.open("航班信息.txt", ios::in);
    	while (f >> line[i].air_num >> line[i].plane_num >> line[i].start_station >> line[i].end_station >>
    		line[i].dayup >> line[i].daydown >> line[i].people_quota >> line[i].price >> line[i].more_ticket >>
    		line[i].passenger_list >> line[i].waiting_list)
    		i++;
    	line->number = i;
    	f.close();
    	return line;
    }
    
    //输出修改后的航班信息
    void put_airline(airline* L)
    {
    	fstream f;int i;
    	f.open("航班信息.txt", ios::out);
    
    	for (i = 0;i < L->number;i++) f << L[i].air_num << " " << L[i].plane_num << " " << L[i].start_station << " " <<
    		L[i].end_station << " " << L[i].dayup << " " << L[i].daydown << " " << L[i].people_quota << " " << L[i].price
    		<< " " << L[i].more_ticket << " " << L[i].passenger_list << " " << L[i].waiting_list << '\n';
    
    	f.close();
    }
    
    //读取某航班乘客信息
    client* get_passenger(airline L)
    {
    	fstream f;int i = 0;
    	client* c = new client, * p = new client, * q = c;
    	f.open(L.passenger_list, ios::in);
    	while (f >> p->name >> p->ordering_number >> p->grade)
    	{
    		q->next = p;
    		p = new client;
    		q = q->next;
    	}
    	q->next = NULL;
    	f.close();
    	return c;
    }
    
    //输出乘客信息到文件
    void put_passenger(airline l, client* c)
    {
    	fstream f;
    	client* p = c->next;
    	f.open(l.passenger_list, ios::out | ios::trunc);
    	while (p)
    	{
    		f << p->name << " " << p->ordering_number << " " << p->grade << '\n';
    		p = p->next;
    	}
    	f.close();
    }
    
    
    //输出等候替补名单
    void put_wait(airline l, client* c)
    {
    	fstream f;
    	client* p = c->next;
    	f.open(l.waiting_list, ios::out | ios::trunc);
    	while (p)
    	{
    		f << p->name << " " << p->ordering_number << " " << p->grade << '\n';
    		p = p->next;
    	}
    	f.close();
    }
    
    //读取某航班等候替补名单
    client* get_wait(airline l)
    {
    	fstream f;int i = 0;
    	client* c = new client, * p = new client, * q = c;
    	f.open(l.waiting_list, ios::in);
    	while (f >> p->name >> p->ordering_number >> p->grade)
    	{
    		q->next = p;
    		p = new client;
    		q = q->next;
    	}
    	q->next = NULL;
    	f.close();
    	return c;
    }
    
    //查询操作			(用户操作)1
    void search()
    {
    	char s[20];
    	int i = 0, j = 0;
    	cout << "*******************************************************查询*********************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                              模糊搜索(航班号 / 起降城市):";
    
    	cin >> s;
    	cout << "*                                                                                                                  *\n";
    	cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    		"\t票价" << "\t  余票量" << "   *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	for (i = 0;i < L->number;i++)
    	{
    		while (i < L->number && strcmp(s, L[i].end_station) && strcmp(s, L[i].start_station) && strcmp(s, L[i].air_num)) i++;
    		if (i < L->number)
    		{
    			L[i].print();
    			j = 1;
    		}
    	}
    	if (j == 0)
    	{
    		system("cls");
    		cout << "*******************************************************查询*********************************************************\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //退票操作			(用户操作)2
    void refund()
    {
    	char s[20];
    	int i = 0, n;
    	cout << "*******************************************************退票*********************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                     航班号:";
    	cin >> s;
    	cout << "*                                                                                                                  *\n";
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;			//按航班号匹配
    	if (i < L->number)
    	{//找到此航班
    		client* c1 = get_passenger(L[i]), * c2 = get_wait(L[i]), * p = c1, * q, * r;
    		//获得次航班的乘客和候补乘客链表
    
    		while (p->next && strcmp(Name, p->next->name)) p = p->next;     //姓名查找
    		if (p->next)
    		{//找到该用户姓名
    
    			cout << "*                                        您在" << L[i].air_num << "航班(终点站:"
    				<< L[i].end_station << ")订了" << p->next->ordering_number << "张票                                        *\n";
    			cout << "*                                                                                                                  *\n";
    			cout << "*                                             请输入退票数量:";
    			do
    			{//输入退票数
    				cin >> n;
    				if (n > 0 && n <= p->next->ordering_number) break;
    				else
    				{
    					cout << "*                                                                                                                  *\n";
    					cout << "*                                            输入错误!!请重新输入!!                                               *\n";
    					cout << "*                                                                                                                  *\n";
    					cout << "*                                                 请重新输入:";
    				}
    			} while (1);
    
    			if (n == p->next->ordering_number)
    			{//全部退票
    				r = p->next;
    				q = r->next;
    				p->next = q;
    				delete r;
    				cout << "*                                                                                                                  *\n";
    				cout << "*                                                    退票完成!                                                    *\n";
    				cout << "*                                                                                                                  *\n";
    
    			}
    			else if (n < p->next->ordering_number)
    			{//退部分票
    				p->next->ordering_number -= n;
    				cout << "*                                                                                                                  *\n";
    				cout << "*                                                    退票完成!                                                    *\n";
    				cout << "*                                                                                                                  *\n";
    
    			}
    
    			L[i].more_ticket += n;   //余票增加
    			int f = 1;
    			while (L[i].more_ticket && f)
    			{//有余票且未访问完所有候补乘客
    				p = c2;
    				while (p->next && L[i].more_ticket < p->next->ordering_number) p = p->next;
    				if (p->next)
    				{//找到需求票数满足的
    					L[i].more_ticket -= p->next->ordering_number;
    					r = p->next;
    					q = r->next;
    					p->next = q;
    					app_client(c1, r);
    				}
    				else f = 0;  //访问完								
    			}
    			put_passenger(L[i], c1);   //刷新乘客名单
    			put_wait(L[i], c2);		   //刷新候选名单
    		}
    		else
    		{
    			cout << "*                                                                                                                  *\n";
    			cout << "*                              退票错误!! 您没有在此航班订票!                                                    *\n";
    			cout << "*                                                                                                                  *\n";
    		}
    	}
    	else
    	{
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	/*cout << "\n 退票操作完成!\n";*/
    	cout << "********************************************************************************************************************\n\n";
    	put_airline(L);
    }
    
    //订票操作			(用户操作)3
    void booking()
    {
    
    	char s[20], a[20];
    	int i = 0, j = 0, n, x, g;
    	cout << "*******************************************************订票*********************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                        (航班号/起降城市):";
    
    air_:
    	cin >> s;
    	cout << "*                                                                                                                  *\n";
    	for (i = 0;i < L->number;i++)
    	{
    		while (i < L->number && strcmp(s, L[i].end_station) && strcmp(s, L[i].start_station) && strcmp(s, L[i].air_num)) i++;
    		if (i < L->number)
    		{
    
    			j = 1;
    			/*L[i].print();*/
    		}
    
    	}
    	if (j == 1)
    	{
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    
    		for (i = 0;i < L->number;i++)
    		{
    			while (i < L->number && strcmp(s, L[i].end_station) && strcmp(s, L[i].start_station) && strcmp(s, L[i].air_num)) i++;
    			if (i < L->number) L[i].print();
    		}
    	}
    	if (j == 1)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                 请输入您所需要订购的航班号:";
    	air_num:
    		cin >> a;
    		for (i = 0;i < L->number;i++)
    		{
    			while (i < L->number && strcmp(a, L[i].air_num)) i++;
    			if (i < L->number)
    			{
    				cout << endl;
    				for (i = 0;i < L->number;i++)
    				{
    					while (i < L->number && strcmp(a, L[i].air_num)) i++;
    					if (i < L->number)
    					{
    						L[i].print();
    						client* c1 = get_passenger(L[i]);
    						client* c2 = get_wait(L[i]);
    					g:
    						cout << "*                                                                                                                  *\n";
    						cout << "*               舱位等级(1:头等舱 ,2:普通舱,3:经济舱):";cin >> g;
    						cout << "*                                                                                                                  *\n";
    						if (0 < g && g <= 3) cout << "*                                                   购买票数:";
    						else
    						{
    							cout << "*                                                                                                                  *\n";
    							cout << "*                                        输入错误!!请重新输入舱位等级!                                            *\n";
    							goto g;
    						}
    						do
    						{
    							cin >> n;
    							if (n > 0 && n <= L[i].people_quota) break;
    							else
    								cout << "*                                                                                                                  *\n";
    							cout << "*   购票失败!!不能超过票数限制(" << "0" << "-" << L[i].people_quota << "),重新输入:";
    						} while (1);
    
    						if (L[i].more_ticket)
    						{/*有余票*/
    							if (n <= L[i].more_ticket && L[i].more_ticket > 0)
    							{
    								client* p = new client;
    								strcpy_s(p->name, Name);
    								p->ordering_number = n;
    								L[i].more_ticket -= n;
    								p->grade = g;
    								app_client(c1, p);									/*!!!注意!!!*/
    								cout << "*                                                                                                                  *\n";
    								cout << "*                                                    购票完成!                                                    *\n";
    								cout << "*                                                                                                                  *\n";
    								cout << "********************************************************************************************************************\n\n";
    							}
    							else if (n > L[i].more_ticket && L[i].more_ticket > 0)
    							{//余票小于购买数
    								int x;
    								client* p1 = new client, * p2 = new client;
    
    								//询问用户
    								cout << "*                                                                                                                  *\n";
    								cout << "*\t\t                      (1:只买" << L[i].more_ticket << "张  2:买" << L[i].more_ticket << "张,"
    									<< n - L[i].more_ticket << "张等候  3:不买)" << "                                    *\n";
    								cout << "*                                                                                                                  *\n";
    								cout << "*                                                    余票不足" << n << "张                                                   *\n";
    								cout << "*                                                                                                                  *\n";
    								cout << "*                                         选择是否继续购买?:";
    								cin >> x;
    								if (x >= 1 && x <= 3)
    								{
    									switch (x)
    									{
    									case 1:
    										strcpy_s(p1->name, Name);
    										p1->ordering_number = L[i].more_ticket;
    										L[i].more_ticket = 0;
    										p1->grade = g;
    										app_client(c1, p1);
    										cout << "*                                                                                                                  *\n";
    										cout << "*                                                    购票完成!                                                    *\n";
    										cout << "*                                                                                                                  *\n";
    										cout << "********************************************************************************************************************\n\n";
    										break;
    									case 2:
    										strcpy_s(p1->name, Name);
    										p1->ordering_number = L[i].more_ticket;
    										p1->grade = g;
    										app_client(c1, p1);
    
    										strcpy_s(p2->name, Name);
    										p2->ordering_number = n - L[i].more_ticket;
    										L[i].more_ticket = 0;
    										p2->grade = g;
    										app_client(c2, p2);
    										cout << "*                                                                                                                  *\n";
    										cout << "*                                                    购票完成!                                                    *\n";
    										cout << "*                                                                                                                  *\n";
    										cout << "********************************************************************************************************************\n\n";
    										break;
    									case 3:
    										cout << "*                                                                                                                  *\n";
    										cout << "********************************************************************************************************************\n\n";
    										break;
    									}
    								}
    								else
    								{
    									cout << "*                                              输入错误!返回上一页!                                              *\n";
    									cout << "*                                                                                                                  *\n";
    									cout << "********************************************************************************************************************\n\n";
    								}
    
    							}
    
    						}
    						else
    						{//无余票
    							cout << "*                                                                                                                  *\n";
    							cout << "*                   无余票! 是否排队等候票?(1:是 0:否);";cin >> x;
    							if (x)
    							{//进入等候名单
    								client* p = new client;
    								strcpy_s(p->name, Name);
    								p->ordering_number = n;
    								p->grade = g;
    								app_client(c2, p);
    								cout << "*                                                                                                                  *\n";
    								cout << "*                                         购票操作完成! 正在排队等候票!                                          *\n";
    								cout << "*                                                                                                                  *\n";
    								cout << "*                                                                                                                  *\n";
    								cout << "********************************************************************************************************************\n\n";
    
    							}
    							else
    							{
    								cout << "*                                                                                                                  *\n";
    								cout << "********************************************************************************************************************\n\n";
    							}
    
    						}
    
    						put_passenger(L[i], c1);    //刷新乘客名单
    						put_wait(L[i], c2);
    					}
    					put_airline(L);
    				}
    			}
    			else
    			{
    				cout << "*                                 航班号输入错误!请重新输入:";
    				goto air_num;
    			}
    		}
    
    
    	}
    	if (j == 0)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                               暂无相关航班信息!                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "********************************************************************************************************************\n\n";
    	}
    
    
    
    }
    
    //打印所有航班信息	(管理员操作)1
    void print_airline()
    {
    	L = get_airline();
    	int i = 0;
    	cout << "*****************************************************航班信息*******************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    		"\t票价" << "\t  余票量" << "   *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	for (int i = 0;i < L->number;i++)
    		L[i].print();
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //查看某航班乘客名单(管理员操作)2
    void client_list()
    {
    	int i = 0;char s[20], * g = "";
    	cout << "\t********************************乘客名单**********************************\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*                        航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		client c;
    		fstream f;
    		f.open(L[i].passenger_list, ios::in);
    		cout << "\t*                                                                        *\n";
    		cout << "\t*                            已购票乘客名单                              *\n";
    		cout << "\t*                                                                        *\n";
    		while (f >> c.name >> c.ordering_number >> c.grade)
    		{
    			switch (c.grade)
    			{
    			case 1:g = "头等舱";break;
    			case 2:g = "普通舱";break;
    			case 3:g = "经济舱";
    			}
    			cout << "\t*                                                                        *\n";
    			cout << "\t*\t姓名:" << c.name << "\t    舱位等级:" << g << "    \t购票数:" << c.ordering_number << "       *\n";
    		}
    		f.close();
    		f.open(L[i].waiting_list, ios::in);
    		cout << "\t*                                                                        *\n";
    		cout << "\t*                           候补订票乘客名单                             *\n";
    		cout << "\t*                                                                        *\n";
    		while (f >> c.name >> c.ordering_number >> c.grade)
    		{
    			switch (c.grade)
    			{
    			case 1:g = "头等舱";break;
    			case 2:g = "普通舱";break;
    			case 3:g = "经济舱";
    			}
    			cout << "\t*                                                                        *\n";
    			cout << "\t*\t姓名:" << c.name << "\t    舱位等级:" << g << "    \t预订票数:" << c.ordering_number << "      *\n";
    
    		}
    		f.close();
    	}
    	else
    	{
    		cout << "\t*                                                                        *\n";
    		cout << "\t*                            无此航班信息!                               *\n";
    		cout << "\t*                                                                        *\n";
    	}
    	cout << "\t*                                                                        *\n";
    	cout << "\t**************************************************************************\n\n\t";
    
    }
    
    //添加航班			(管理员操作)3
    void add_airline()
    {
    	int i = 0;
    	airline air1;
    	cout << "*****************************************************添加航班*******************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    air1_air_num:
    	cin >> air1.air_num;
    	while (i < L->number && strcmp(air1.air_num, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                              已存在此航班号                                                      *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                           请重新输入航班号:";
    		goto air1_air_num;
    	}
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                 请输入机型:";cin >> air1.plane_num;
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                             请输入起飞城市:";cin >> air1.start_station;
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                             请输入降落城市:";cin >> air1.end_station;
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                             请输入出发时间:";cin >> air1.dayup;
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                             请输入到达时间:";cin >> air1.daydown;
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                             请输入乘员定额:";
    air1_people_quota:
    	cin >> air1.people_quota;
    	if (air1.people_quota <= 0)
    	{
    		cout << "\n   乘员定额输入错误\t  请重新输入乘员定额:";
    		goto air1_people_quota;
    	}
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                 请输入票价:";
    air1_price:
    	cin >> air1.price;
    	if (air1.price <= 0)
    	{
    		cout << "\n   票价输入错误\t  请重新输入票价:";
    		goto air1_price;
    	}
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入余票数:";
    air1_more_ticket:
    	cin >> air1.more_ticket;
    	if (air1.more_ticket <= 0)
    	{
    		cout << "\n   余票数输入错误\t  请重新输入余票数:";
    		goto air1_more_ticket;
    	}
    	cout << "*                                                                                                                  *\n";
    	cout << "*                          输入(建立乘员名单文档名_eg:007a):";cin >> air1.passenger_list;
    	cout << "*                                                                                                                  *\n";
    	cout << "*                              输入(等候名单文档名_eg:007b):";cin >> air1.waiting_list;
    	cout << "*                                                                                                                  *\n";
    	ofstream outfile("航班信息.txt", ios::app);
    	outfile << air1.air_num << " " << air1.plane_num << " " << air1.start_station << " " << air1.end_station << " "
    		<< air1.dayup << " " << air1.daydown << " " << air1.people_quota << " " << air1.price << " " << air1.more_ticket << " "
    		<< air1.passenger_list << " " << air1.waiting_list << "\n";
    	outfile.close();
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                  添加航班完成!                                                   *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //修改航班信息		(管理员操作)4
    int change_airline()
    {
    	int s;
    	cout << "\t****************************修改航班信息界面******************************\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*  1.修改航班号   2.修改机型   3.修改航班起飞城市   4.修改航班降落城市   *\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*  5.修改起降时间   6.修改机票价格    7.修改剩余座位   8.删除航班信息    *\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*  0.返回上级菜单                                                        *\n";
    	cout << "\t*                                                                        *\n";
    	cout << "\t*                      选择操作:";
    	fflush(stdin);
    	while (cin >> s)
    	{
    		if (s >= 0 && s <= 8)
    		{
    			cout << "\t*                                                                        *\n";
    			cout << "\t**************************************************************************\n\n\t";
    			return s;
    		}
    		else
    		{
    			cout << "\t*                                                                        *\n";
    			cout << "\t*                      输入错误!!!                                     *\n";
    			cout << "\t*                                                                        *\n";
    			cout << "\t*                      请重新选择操作:";
    		}
    	}
    }
    
    //修改航班号		(管理员操作1)
    void modify_air_num()
    {
    	int i = 0;char s[10];char* p = new char[10];
    	cout << "****************************************************修改航班号******************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    
    		L[i].print();
    		cout << "*                                                   新航班号:";
    		cin >> p;
    
    		strcpy_s(L[i].air_num, p);	//将p中字符串复制到L[i].air_num
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 修改航班号完成!                                                 *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    
    }
    
    //修改机型			(管理员操作2)
    void modify_plane_num()
    {
    	int i = 0;char s[10];char* p = new char[10];
    	cout << "*****************************************************修改机型*******************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    
    		L[i].print();
    		cout << "*                                                     新机型:";
    		cin >> p;
    
    		strcpy_s(L[i].plane_num, p);	//将p中字符串复制到L[i].plane_num
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                  修改机型完成!                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //修改起飞城市		(管理员操作3)
    void modify_upstation()
    {
    	int i = 0;char s[10];char* p = new char[10];
    	cout << "***************************************************修改起飞城市*****************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    
    		L[i].print();
    		cout << "*                                                 新起飞城市:";
    		cin >> p;
    
    		strcpy_s(L[i].start_station, p);	//将p中字符串复制到L[i].start_station
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                修改起飞城市完成!                                                *\n";
    		cout << "*                                                                                                                  *\n";
    
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //修改降落城市		(管理员操作4)
    void modify_downstation()
    {
    	int i = 0;char s[10];char* p = new char[10];
    	cout << "***************************************************修改降落城市*****************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    
    		L[i].print();
    		cout << "*                                                 新降落城市:";
    		cin >> p;
    
    		strcpy_s(L[i].end_station, p);	//将p中字符串复制到L[i].end_station
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                修改降落城市完成!                                                *\n";
    		cout << "*                                                                                                                  *\n";
    
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //修改起降时间		(管理员操作5)
    void modify_time()
    {
    	int i = 0;char s[10];char* p = new char[10];char* q = new char[10];
    	cout << "***************************************************修改起降时间*****************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    
    		L[i].print();
    		cout << "*                                                 新出发时间:";
    		cin >> p;
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 新到达时间:";
    		cin >> q;
    
    		strcpy_s(L[i].dayup, p);	//将p中字符串复制到L[i].dayup
    
    		strcpy_s(L[i].daydown, q);	//将q中字符串复制到L[i].daydown
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                修改起降时间完成!                                                *\n";
    		cout << "*                                                                                                                  *\n";
    
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //修改某航班票价	(管理员操作6)
    void re_price()
    {
    	int i = 0, p;char s[20];
    	cout << "****************************************************修改票价间******************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    		L[i].print();
    		cout << "*                                                     新票价:";
    		cin >> p;
    		L[i].price = p;
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                  修改票价完成!                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //修改某航班余票量	(管理员操作7)
    void modify_more_ticket()
    {
    	int i = 0, p;char s[20];
    	cout << "***************************************************修改余票数量*****************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    		L[i].print();
    		cout << "*                                                 新的余票数:";
    		cin >> p;
    		L[i].more_ticket = p;
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 修改余票数完成!                                                 *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    }
    
    //删除某航班		(管理员操作8)
    void del_airline()
    {
    	int i = 0, j = 0;char s[20];char p[50] = "\0";
    	cout << "*****************************************************删除航班*******************************************************\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                                                                                                  *\n";
    	cout << "*                                               请输入航班号:";
    	cin >> s;
    	while (i < L->number && strcmp(s, L[i].air_num)) i++;
    	if (i < L->number)
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "* 航班号" << "    机型" << "\t始发站" << "\t    终点站" << "\t 出发时间" << "\t 到达时间" << "\t 乘员定额" <<
    			"\t票价" << "\t  余票量" << "   *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    		L[i].print();
    
    		for (i;i < L->number;i++)
    		{
    			L[i] = L[i + 1];
    
    		}
    		L->number -= 1;
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                  删除航班完成!                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	else
    	{
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                 无此航班信息!                                                    *\n";
    		cout << "*                                                                                                                  *\n";
    		cout << "*                                                                                                                  *\n";
    	}
    	put_airline(L);
    	cout << "********************************************************************************************************************\n\n";
    }
    

    总结

    完整源码请进入GitHub查看。

    展开全文
  • 数据结构课程设计之飞机订票系统 数据结构 课程设计 订票系统 你值得拥有!!
  • C语言课程设计-航空订票系统

    千次阅读 多人点赞 2018-12-17 23:19:40
    内容:模拟航空订票系统,包含对文件的处理。 2018-12-12: 一个bug,在没有航班信息表的情况下,添加航班信息之后,输出的航班信息为空。 已改正,原因是,航班信息是存储在临时数组里面的,数组的信息在管理员...
    /*
    码农:成蹉跎
    内容:模拟航空订票系统,包含对文件的处理。
    2018-12-12:
    	一个bug,在没有航班信息表的情况下,添加航班信息之后,输出的航班信息为空。
    		已改正,原因是,航班信息是存储在临时数组里面的,数组的信息在管理员登录的时候添加了依次,但是在管理员
    	添加完信息后并没有更新。航班信息,只是在管理员登录成功,用户登录和管理员添加航班信息时候,才会到文件中去
    	读数据。
    		优化航班信息在文件中的修改,只有用户确定修改一个元组信息的时候,才会把一个完整的新的元组写入文件中。
    2018-12-14:
    	新发现一个bug,当没有人退票的时候,显示所有订票信息的时候会出现一个空值。应该是排序算法写错了。
    		已改正,错误原因:进行排序的时候,总的订票人数(index)比实际大1,标记第一个有效订票位置(firstValid)位
    	置正好,混乱了
    
    	业务不合理部分:
    		在修改航班信息的时候应该给顾客提示信息,需要在顾客结构体中添加一个提示信息属性
    	属性已经添加。
    
    	在修改航班信息的时候,对相关的顾客提供提示信息。
    		当管理员修改的是飞机号和时间的话,只需要给出提示信息就好了,但是管理员直接修改了航班的出发地和目的地的话,那
    	该航线的所有顾客的飞机票就要作废了。这样的话,在顾客查看自己的机票的时候第一次查看机票,机票是存在的,但是会
    	告诉顾客此机票已经作废,已经退款,再次查询的话就应该是不存在了。
    	以实现。
    
    	仍需增加的功能:删除航班信息。
    		已经实现,当航班被删除后修改顾客的信息的提示(tips),同时删除航班信息表中的信息
    2018-12-16:
    	设置清屏内容,使显示更加简洁,清晰
    */
    
    #include<stdio.h>			//标准输入、输出头文件
    #include<string.h>			//包含字符串函数处理头文件
    #include<unistd.h>			//access 函数的头文件
    #include <stdlib.h>			//清屏
    #define MaxAirlines 1000	//允许输入的最多的航班数量
    #define MaxClients	10000	//允许最多的用户
    #define PRINT "%d\t\t%d\t\t%s\t\t%s\t\t星期%d\t\t%d\t\t%d\n", array_Airline[index_airline].airlineNum, array_Airline[index_airline].airplaneNum, array_Airline[index_airline].departure, array_Airline[index_airline].destionation, array_Airline[index_airline].time, array_Airline[index_airline].totalTickets, remain(array_Airline[index_airline].remainTickets)		//宏定义输出格式
    #define PRINTCLIENT "%d\t\t%d\t\t%s\t\t%s\t\t星期%d\t\t%s\t\t%d\t\t%s\n", array_Airline[index_airline].airlineNum, array_Airline[index_airline].airplaneNum, array_Airline[index_airline].departure, array_Airline[index_airline].destionation, array_Airline[index_airline].time, client.name, client.seatNum, client.tips
    
    struct Airline {			//航班结构体
    	int airlineNum;			//航班号
    	int airplaneNum;		//飞机号
    	char departure[10];		//出发地点
    	char destionation[10];	//目的地
    	int time;				//飞行时间(星期几)
    	int totalTickets;		//总票数
    	int remainTickets[1024];//剩余票数
    } array_Airline[MaxAirlines];	
    
    struct Client{				//用户的结构体
    	char name[10];			//用户名
    	int airlineNum;			//航班号
    	int seatNum;			//座位号
    	char tips[50];			//提示信息
    } client;
    
    int totalAirlines;			//统计总航班数量
    int index_airline;			//查询航班使用的下标
    char manager[] = {"root"};
    char password[] = {"root"};
    Client clients[MaxClients];	
    
    void userLoginForm();		//登录确定身份页面
    void managerLogin();		//管理员身份确认
    void managerForm();			//管理员页面
    void userForm();			//用户页面
    void showAirlineForm();		//显示航班信息页面
    void addAirlineForm();		//增加航班信息页面
    void updateAirlineForm();	//更新航班信息页面
    void deleteAirlineForm();	//删除航班信息页面
    void showUserInfoForm();	//显示所有用户信息页面
    void clientShowAirlineForm();//显示航班信息
    void selectClientInfo();	//显示用户信息页面
    void bookingTicketsForm();	//订票页面
    void deleteClientForm();	//退票页面
    
    void printAirlineInfo();	//显示航班信息,开始时候,包含读取文件
    void readInfoToArray();		//将航班信息从文件中读取到数组中
    void addAirline();			//添加航班信息
    void outputAirlineInfo();	//仅仅将数组中的信息输出
    void outputSingalAirlineInfo(int index); //输出单独一条航班信息
    void updateAirlineInfo();	//修改航线信息
    int searchAirline(int id);			//查询航班信息在数组中的位置,使用二分法查找
    void printUpdateAirlineOptions();//显示可以修改的航班信息
    void changeAirlineInfo(int index);//修改航班数组和文件信息,逐条信息修改
    void changeAirlineTickets(int index);//修改航班信息中的剩余票数
    void changeClientTickets(int index, int choose, int airline);//修改航班信息中的剩余票数
    void deleteAirline();		//删除航班信息
    void bookingTickets();		//用户订票
    int remain (int *tickets);	//查询剩余票数
    int selectSeat(int index);	//选择一张空作为给客户
    void addUser();				//在用户信息表中添加用户信息
    void outputClientInfo();	//输出所有用户的信息
    int getAllClientInfo(bool show);	//显示所有的顾客信息
    void cancelTickets();		//取消机票
    bool searchClient(char name[10], bool displayInvalid); //在用户信息中查找用户信息到client结构体中,顺序查找
    bool deleteClient(int airlineId, int seatId);		//删除客户机票
    void setSeatNumZero(int airline, int seatId, int index); //设置对应的信息为0
    void sortAirlineAsTimeUseBubble();	//按照时间顺序使用冒泡排序法对航班信息进行排序
    void sortAirlineAsairlineNumUseInsert();	//按照航班号使用插入排序对航班信息进行排序
    
    int main () {
    
    	userLoginForm();
    	
    	//printAirlineInfo();
    	//outputAirlineInfo();
    	//sortAirlineAsTimeUseBubble();
    	//addAirline();
    	//outputAirlineInfo();
    	//sortAirlineAsairlineNumUseInsert();
    	//outputAirlineInfo();
    	//updateAirlineInfo();
    	//bookingTickets();
    	//outputClientInfo();
    	//getAllClientInfo(true);
    	//getAllClientInfo(false);
    	//cancelTickets();
    	
    	return 0;
    }
    
    
    void userLoginForm(){
    	printf("\n\n					  欢迎使用航空订票系统\n\n");
    	printf("================================================================================================================\n");
    	printf("				1.管理员登录               2.用户登录\n");
    	printf("				3.退出\n");
    	printf("================================================================================================================\n");
    	printf("请选择登录方式:");
    	int choose;
    	scanf("%d", &choose);
    	switch (choose){
    	case 1:
    		managerLogin();
    		break;
    	case 2:
    		printAirlineInfo();
    		system("cls");
    		userForm();
    		break;
    	default:
    		printf("无效选择,正在跳转到初始页面...\n");
    		sleep(1);
    		system("cls");
    		userLoginForm();
    		break;
    	}
    }
    
    void managerLogin() {
    	char name[10];
    	char pass[10];
    	printf("输入管理员登录名:");
    	scanf("%s", name);
    	printf("输入管理员密码:");
    	scanf("%s", pass);
    	if (strcmp(name, manager) || (strcmp(pass, password))){
    		printf("\n####用户名或密码错误####\n");
    		sleep(1);
    		system("cls");//清屏
    		userLoginForm();
    	} else {
    		system("cls");//清屏
    		printAirlineInfo();
    		managerForm();
    	}
    }
    
    void managerForm() {
    	printf("						管理员页面\n\n");
    	printf("================================================================================================================\n");
    	printf("				1.查看航班信息               2.增加航班信息\n");
    	printf("				3.修改航班信息               4.查看客户信息\n");
    	printf("				5.删除航班信息               6.退出\n");
    	printf("================================================================================================================\n");
    	printf("请选择功能:");
    	int choose;
    	scanf("%d", &choose);
    	switch (choose){
    	case 1:
    		showAirlineForm();
    		break;
    	case 2:
    		addAirlineForm();
    		break;
    	case 3:
    		updateAirlineForm();
    		break;
    	case 4:
    		showUserInfoForm();
    		break;
    	case 5:
    		deleteAirlineForm();
    	case 6:
    		getchar();
    		system("cls");
    		userLoginForm();
    		break;
    	default:
    		printf("输入选项无效,即将跳转到管理员主页面...\n");
    		sleep(1);
    		system("cls");
    		managerForm();
    	}
    }
    
    void showAirlineForm(){
    	printf("================================================================================================================\n");
    	printf("				1.航班号顺序				 2.时间顺序\n");
    	printf("				3.返回\n");
    	printf("================================================================================================================\n");
    	printf("请选择功能:");
    	int order;
    	scanf("%d", &order);
    	switch (order){
    	case 1:
    		sortAirlineAsairlineNumUseInsert();
    		break;
    	case 2:
    		sortAirlineAsTimeUseBubble();		
    		break;
    	case 3:
    		managerForm();
    		break;
    	default:
    		printf("输入选项无效,即将跳转到管理员主页面...\n");
    		sleep(1);
    		system("cls");
    		managerForm();
    	}
    	printf("\n\n");
    	outputAirlineInfo();
    	printf("\n\n");
    
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	managerForm();
    }
    
    void addAirlineForm() {
    	printf("\n\n");	
    	addAirline();
    	printAirlineInfo();//添加航班信息之后,需要更新航班信息的数组
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	managerForm();
    	printf("\n\n");
    }
    
    void updateAirlineForm() {
    	sortAirlineAsairlineNumUseInsert();
    	printf("\n\n");
    	outputAirlineInfo();
    	updateAirlineInfo();
    	printAirlineInfo();
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	managerForm();
    	printf("\n\n");
    }
    
    void deleteAirlineForm(){
    	sortAirlineAsairlineNumUseInsert();
    	printf("\n\n");
    	outputAirlineInfo();
    	deleteAirline();
    	printAirlineInfo();
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	managerForm();
    	printf("\n\n");
    }
    
    void showUserInfoForm() {
    	printf("\n\n");
    	printf("================================================================================================================\n");
    	//outputClientInfo();
    	getAllClientInfo(true);
    	printf("================================================================================================================\n");
    	printf("\n\n");
    
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	managerForm();
    	
    }
    
    void userForm() {
    	int choose;
    	printf("						顾客页面\n\n");
    	printf("================================================================================================================\n");
    	printf("				1.查看航班信息               2.查看已定机票\n");
    	printf("				3.订票                       4.退票\n");
    	printf("				5.退出\n");
    	printf("================================================================================================================\n");
    	printf("请选择功能:");
    	scanf("%d", &choose);
    	switch (choose){
    	case 1:
    		clientShowAirlineForm();
    		break;
    	case 2:
    		selectClientInfo();
    		break;
    	case 3:
    		bookingTicketsForm();
    		break;
    	case 4:
    		deleteClientForm();
    		break;
    	case 5:
    		getchar();
    		system("cls");
    		userLoginForm();
    		break;
    	default:
    		printf("输入选项无效,即将跳转顾客登录界面...\n");
    		sleep(1);
    		system("cls");
    		userForm();
    	}
    
    }
    
    void clientShowAirlineForm() {
    	printf("================================================================================================================\n");
    	printf("				1.航班号顺序				 2.时间顺序\n");
    	printf("				3.返回\n");
    	printf("================================================================================================================\n");
    	printf("请选择功能:");
    	int order;
    	scanf("%d", &order);
    	switch (order){
    	case 1:
    		sortAirlineAsairlineNumUseInsert();
    		break;
    	case 2:
    		sortAirlineAsTimeUseBubble();		
    		break;
    	default:
    		printf("输入选项无效,即将跳转顾客登录界面...\n");
    		sleep(1);
    		system("cls");
    		userForm();
    	}
    	printf("\n\n");
    	
    	outputAirlineInfo();
    	printf("\n\n");
    
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	userForm();
    }
    
    void selectClientInfo() {
    	printf("\n\n");
    	char name[10];
    	printf("输入用户名:");
    	scanf("%s", &name);
    	printf("订票信息如下:\n");
    	searchClient(name, false);
    	printf("\n\n");
    
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	userForm();
    }
    
    void bookingTicketsForm() {
    	printf("\n\n");
    	outputAirlineInfo();
    	bookingTickets();
    	printf("\n\n");
    
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	userForm();
    	
    }
    
    void deleteClientForm() {
    	printf("\n\n");
    	cancelTickets();
    	printf("\n\n");
    
    	getchar();
    	printf("按任意键继续...");
    	getchar();
    	system("cls");
    	userForm();
    }
    
    /
    void printAirlineInfo(){
    	FILE *read = fopen("airline.dat", "r");
    	if (read == NULL){
    		printf("航班信息为空\n");
    	} else {
    		readInfoToArray();			//读取文件内容到数组中
    		/*
    		printf("航班号\t\t飞机号\t\t出发地\t\t目的地\t\t起飞时间\t机票总数\t剩余票数\n");		//信息标题
    		for (index_airline = 0; index_airline < totalAirlines; index_airline++){
    			printf(PRINT);
    		}
    		*/
    	}
    	fclose(read);
    }
    
    void outputAirlineInfo(){
    	printf("航班号\t\t飞机号\t\t出发地\t\t目的地\t\t起飞时间\t机票总数\t剩余票数\n");		//信息标题
    	for (index_airline = 0; index_airline < totalAirlines; index_airline++){
    		printf(PRINT);
    	}
    }
    void outputSingalAirlineInfo(int index){
    	printf("航班号\t\t飞机号\t\t出发地\t\t目的地\t\t起飞时间\t机票总数\t剩余票数\n");
    	index_airline = index;
    	printf(PRINT);
    }
    
    void readInfoToArray() {
    	FILE *readToArray = fopen("airline.dat", "r");
    
    	totalAirlines = 0;
    	while (!feof(readToArray)){
    		fread(&array_Airline[totalAirlines],sizeof(struct Airline),1,readToArray);		//逐块读取数据
    		totalAirlines++;
    	}
    	fclose(readToArray);
    //printf("%d", totalAirlines);
    	totalAirlines--;//为什么会多一
    }
    
    void addAirline(){
    	int week;		//航班出行时间,周一到周天,用1到7表示
    	FILE *writeInfo = fopen("airline.dat", "ab+");
    	char end[10];
    	do{
    		printf("请依次输入您要增加的航班信息(以回车键结束):  \n");
    		printf("================================================================================================================\n");
    		printf("航班号: ");  
    		array_Airline[totalAirlines].airlineNum = totalAirlines;
    		printf("%d\n",array_Airline[totalAirlines].airlineNum);
    		printf("请输入飞机号: ");
    		scanf("%d",&array_Airline[totalAirlines].airplaneNum);		
    		printf("请输入出发地点: ");
    		scanf("%s",&array_Airline[totalAirlines].departure);		
    		printf("请输入目的地: ");
    		scanf("%s",&array_Airline[totalAirlines].destionation);		
    		printf("请输入出发时间(1-7): ");
    		scanf("%d",&week);
    		while (week < 1 || week > 7){
    			printf("输入正确时间,周一到周天用 1 到 7 表示:");
    			scanf("%d",&week);
    		}
    		array_Airline[totalAirlines].time= week;
    		printf("机票总数: ");
    		scanf("%d",&array_Airline[totalAirlines].totalTickets);
    		//剩余票数为机票总数
    		for (int i = 0; i < array_Airline[totalAirlines].totalTickets; i++){
    //printf("%d", i);
    			array_Airline[totalAirlines].remainTickets[i] = 0;
    		}
    		//写入文件
    		fwrite(&array_Airline[totalAirlines], sizeof(struct Airline), 1, writeInfo);
    		totalAirlines++;
    		printf("添加完毕,是否继续添加?请键入y或n以回车键结束:");
    		scanf("%s",end);
    	}
    	while (!strcmp(end,"y"));
    	fclose(writeInfo);
    }
    
    void updateAirlineInfo(){
    	char chooseChangeAirline[2];
    	bool changeClient = false;
    	int id;
    	do{
    		printf("\n输入需要修改的航班的航班号:");
    		scanf("%d", &id);
    		sortAirlineAsairlineNumUseInsert();
    		int index = searchAirline(id);
    		if (index == -1){
    			printf("输入的航班不存在");
    		} else{
    			//航班信息只要修改,顾客信息表中的提示信息就要修改,所以有必要将用户的信息添加到临时数组中
    			int week;	//表示修改的新的时间,周一到周天用1到7表示
    			char choose[2];	//选择是否继续修改该条航班信息
    			do{
    				changeClient = false;
    				outputSingalAirlineInfo(index);
    				//不仅仅要修改数组的内容还要修改文件中内容
    				printf("\n");
    				printUpdateAirlineOptions();
    				printf("选择需要修改的选项:");
    				int option;
    				scanf("%d", &option);
    				if (option > 5){
    					printf("选项无效");
    					break;
    				}
    				switch (option){
    				case 1:
    					printf("输入新的飞机号:");
    					scanf("%d", &array_Airline[index].airplaneNum);
    					break;
    				case 2:
    					changeClient = true;
    					printf("输入新的出发地:");
    					scanf("%s", &array_Airline[index].departure);
    					break;
    				case 3:
    					changeClient = true;
    					printf("输入新的目的地:");
    					scanf("%s", &array_Airline[index].destionation);
    					break;
    				case 4:
    					printf("输入新的时间:");
    					scanf("%d",&week);
    					while (week < 1 || week > 7){
    						printf("输入正确时间,周一到周天用 1 到 7 表示:");
    						scanf("%d",&week);
    					}
    					array_Airline[index].time = week;
    					break;
    				case 5:
    					break;
    				default:
    					printf("输入选项无效\n");
    					sleep(1);
    					break;
    				}	
    				outputSingalAirlineInfo(index);
    				printf("是否继续修改该条航线信息(y/n):");
    				scanf("%s", choose);
    			}
    			while (!strcmp(choose,"y"));
    			changeAirlineInfo(index);
    		}
    		if (changeClient){
    			changeClientTickets(0, 3, id);
    			printf("相关用户提示信息已经修改\n");
    		} 
    		else {
    			changeClientTickets(0, 2, id);
    			printf("相关用户提示信息已经修改\n");
    		}
    		printf("是否需要修改其他航线(y/n):");
    		scanf("%s", chooseChangeAirline);
    		//调用修改用户信息的方法
    	}
    	while (!strcmp(chooseChangeAirline,"y"));
    }
    
    int searchAirline(int id){
    	//先将航班信息按照航班号进行排序再查找
    	//二分法查找
    	int low = 0, high = totalAirlines, mid;
    	while (low <= high){
    		mid = (low + high) / 2;
    		if (id == array_Airline[mid].airlineNum){
    			return mid;
    		} else if (id < array_Airline[mid].airlineNum){
    			high = mid - 1;
    		} else {
    			low = mid + 1;
    		}
    	}
    
    	return -1; //没有查到
    }
    
    void changeAirlineInfo(int index){
    	FILE *change = fopen("airline.dat", "rb+");
    	fseek(change, sizeof(struct Airline) * index, 0);
    	fwrite(&array_Airline[index], sizeof(struct Airline), 1, change); //修改文件内容
    	fclose(change);
    }
    void printUpdateAirlineOptions(){
    	printf("				修改航班信息页面\n\n");
    	printf("================================================================================================================\n");
    	printf("             1.飞机号				2.出发地\n");
    	printf("             3.目的地				4.时间\n");
    	printf("             5.退出\n");
    	printf("================================================================================================================\n");
    }
    
    void deleteAirline() {
    	printf("选择需要删除的航班的航班号:");
    	int airline;
    	scanf("%d", &airline);
    	if (searchAirline(airline) == -1){
    		printf("输入的航班号无效");
    	}
    	else {
    		char choose[2];
    		printf("确认要删除此航班信息吗?(y/n):");
    		scanf("%s", &choose);
    		if (!strcmp(choose, "y")){
    			index_airline = airline;
    			int total = array_Airline[airline].totalTickets - remain(array_Airline[airline].remainTickets);
    			printf("将会有 %d 名顾客收到影响,请再次确认(y/n): ", total);
    			scanf("%s", &choose);
    			if (!strcmp(choose, "y")){
    				//将相关的顾客的信息全改成无效
    				changeClientTickets(0, 3, airline);
    				//重新写航班信息文件
    				FILE * reWrite = fopen("airline.dat", "w");
    				for (int i = 0; i < totalAirlines; i++){
    					if (array_Airline[i].airlineNum != airline){
    						fwrite(&array_Airline[i], sizeof(struct Airline), 1, reWrite);
    					}
    				}
    				fclose(reWrite);
    				totalAirlines--;
    				
    				printAirlineInfo();
    			} 
    			else {
    				printf("删除航班命令已经取消\n");
    			}
    		}
    		else {
    			printf("删除航班命令已经取消\n");
    		}
    	}
    }
    
    void bookingTickets() {
    	readInfoToArray();
    	char choose[2];
    	printf("输入用户名:");
    	scanf("%s", &client.name);
    	printf("输入航班号:");
    	scanf("%d", &index_airline);
    	if (searchAirline(index_airline) != -1){
    		client.airlineNum = index_airline;
    		strcpy( client.tips, "有效");//给字符数组赋值。。。。。尴尬
    		//查询该航班剩余票数
    		outputSingalAirlineInfo(index_airline);
    		if (remain(array_Airline[index_airline].remainTickets) > 0){
    			printf("请仔细查看航班信息再确认(y/n):");
    			scanf("%s", choose);
    
    			if (!strcmp(choose, "y")){
    				//保证座位号不为0
    				client.seatNum = selectSeat(index_airline);
    				printf("谢谢您选择本次航班:\n");
    				printf("航班号\t\t飞机号\t\t出发地\t\t目的地\t\t起飞时间\t用户名\t\t用户座位号\t提示\n");
    				//修改航班信息表和客户信息表
    				changeAirlineTickets(index_airline);
    				printf(PRINTCLIENT);
    				//添加用户信息表
    				addUser();
    			}  else {
    				printf("本次订票已取消");
    			}
    		} else {
    			printf("该航班已经没有剩余的票,此次购票自动取消");
    		}
    		
    	} else {
    		printf("该航班不存在,此次购票自动取消");
    	}
    }
    
    int remain (int *tickets){
    	int num = 0;
    	for (int i = 0; i < array_Airline[index_airline].totalTickets; i++){
    		if (tickets[i] == 0){
    			num++;
    		}
    	}
    
    	return num;
    }
    
    void changeAirlineTickets(int index){
    	FILE *change = fopen("airline.dat", "rb+");
    	fseek(change, sizeof(struct Airline) * index, 0);
    	fwrite(&array_Airline[index], sizeof(struct Airline), 1, change); 
    	fclose(change);
    }
    
    int selectSeat(int index){
    	for (int i = 0; i < array_Airline[index].totalTickets; i++){
    		if (array_Airline[index].remainTickets[i] == 0){
    			array_Airline[index].remainTickets[i] = 1;
    			return i + 1;
    		}
    	}
    
    	return -1;
    }
    
    void addUser(){
    	FILE * userFile = fopen("customer.dat", "ab+");
    	fwrite(&client, sizeof(client), 1, userFile);
    	fclose(userFile);
    }
    
    void outputClientInfo() {
    	FILE *readCustomer = fopen("customer.dat", "r");
    	if (readCustomer == NULL){
    		printf("用户信息为空\n");
    	} else {
    		printf("航班号\t\t飞机号\t\t出发地\t\t目的地\t\t起飞时间\t用户名\t用户座位号\n");		//信息标题
    		fread(&client,sizeof(struct Client),1,readCustomer);		//逐块读取数据
    //printf("%s\n", client.name);
    		index_airline = client.airlineNum;
    		while (!feof(readCustomer)){
    			printf(PRINTCLIENT);
    			fread(&client,sizeof(struct Client),1,readCustomer);		//逐块读取数据
    			index_airline = client.airlineNum;
    		}
    	}
    	fclose(readCustomer);
    }
    int getAllClientInfo(bool show) {
    	//把所有的用户信息读到数组中,根据机票是否有效和航班号进行排序
    	//依次读取用户信息,当读到无效的机票,就让他和第一个有效的机票位置交换
    	int firstValid = 1;	//记录第一个有效机票的位置,也是无效机票的张数
    	int index = 1;	//下表从1开始存储,0位作为交换的中转站
    	FILE *readCustomer = fopen("customer.dat", "r");
    	if (readCustomer == NULL){
    		printf("用户信息为空\n");
    	} else {
    		if (show){
    			fread(&clients[index],sizeof(struct Client),1,readCustomer);		//逐块读取数据
    			//读到的第一个如果无效不用交换,但是要把标记第一个有效位的数值
    			if (clients[index].seatNum == -1 || clients[index].seatNum == 0){
    				firstValid++;
    			}
    			index++;
    	//printf("%d, %d", firstValid, index);	
    			while (!feof(readCustomer)){
    				fread(&clients[index],sizeof(struct Client),1,readCustomer);		//逐块读取数据
    			
    				if (clients[index].seatNum == -1 || (
    					clients[index].seatNum == 0 && strlen(clients[index].name) > 1)){
    	//printf("%d\t\t%s\t%d\n", clients[index].airlineNum, clients[index].name, clients[index].seatNum);
    	//printf("%d\t\t%s\t%d\n", clients[firstValid].airlineNum, clients[firstValid].name, clients[firstValid].seatNum);
    					if (index > firstValid){
    						clients[0] = clients[firstValid];
    						clients[firstValid] = clients[index];
    						clients[index] = clients[0];
    					}
    					firstValid++;
    				}
    				
    				index++;
    			}
    			index -= 1;
    	//printf("%d, %d", firstValid, index);
    			//将读到的信息进行排序,无效的订票信息和有效的订票信息分开来排序,都使用冒泡
    			bool change;
    			if (firstValid != 1){
    				for (int i = 1; i < firstValid; i++){
    					change = false;
    					for (int j = 1; j < firstValid - i; j++){
    						if (clients[j].airlineNum > clients[j + 1].airlineNum){
    							clients[0] = clients[j];
    							clients[j] = clients[j + 1];
    							clients[j + 1] = clients[0];
    							change = true;
    						}
    					}
    					if (!change){
    						break;
    					}
    				}
    			}
    			
    			for (int i = firstValid; i < index; i++){
    				change = false;
    				for (int j = firstValid; j < index - i; j++){
    					if (clients[j].airlineNum > clients[j + 1].airlineNum){
    						clients[0] = clients[j];
    						clients[j] = clients[j + 1];
    						clients[j + 1] = clients[0];
    						change = true;
    					}
    				}
    				if (!change){
    					break;
    				}
    			}
    
    			printf("航班号\t\t用户名\t\t座位号\t\t提示\n");
    			for (int i = 1; i < index ; i++){
    				printf("%d\t\t%s\t\t%d\t\t%s\n", clients[i].airlineNum, clients[i].name, clients[i].seatNum, clients[i].tips);
    			}
    			fclose(readCustomer);
    			return 0;
    		}
    		else {
    			int clientIndex = 0;
    			while (!feof(readCustomer)){
    				fread(&clients[clientIndex],sizeof(struct Client),1,readCustomer);		//逐块读取数据
    				clientIndex++;
    			}
    			fclose(readCustomer);
    			clientIndex--;
    
    			//printf("航班号\t\t用户名\t\t座位号\t\t提示\n");
    			//for (int i = 0; i < clientIndex ; i++){
    			//	printf("%d\t\t%s\t\t%d\t\t%s\n", clients[i].airlineNum, clients[i].name, clients[i].seatNum, clients[i].tips);
    			//}
    			
    			return clientIndex;
    		}
    	}
    }
    
    void cancelTickets() {
    	char name[10];
    	int airlineId;
    	int seatId;
    
    	readInfoToArray();
    
    	printf("输入用户名:");
    	scanf("%s", &name);
    	if (!searchClient(name, false)){
    		printf(" %s %s\n", name, "没有订票信息");
    	} else { //根据航班号和座位号确定座位号
    		printf("输入航班号,座位号,以确定需要取消的机票:\n");
    		printf("航班号:");
    		scanf("%d", &airlineId);
    		printf("座位号:");
    		scanf("%d", &seatId);
    		if (deleteClient(airlineId, seatId)){
    			printf("已经成功删除\n");
    		} else {
    			printf("输入信息不匹配,取消机票失败\n");
    		}
    	}
    }
    
    bool searchClient(char name[10], bool displayInvalid){
    	bool had = false;
    	int index = 0;
    	FILE *readCustomer = fopen("customer.dat", "r");
    	if (readCustomer == NULL){
    		printf("查询信息为空\n");
    		return false;
    	}
    	//注意这里的读法,详情参照https://blog.csdn.net/bingqing07/article/details/5785080/
    	printf("航班号\t\t飞机号\t\t出发地\t\t目的地\t\t起飞时间\t用户名\t\t座位号\t\t提示\n");		//信息标题
    	fread(&client,sizeof(struct Client),1,readCustomer);		//逐块读取数据
    	index_airline = client.airlineNum;
    	while (!feof(readCustomer)){
    		if (!strcmp(name, client.name)){
    			if (displayInvalid){
    				printf(PRINTCLIENT);
    				had = true;
    			} else{
    				if (client.seatNum != -1){
    					printf(PRINTCLIENT);
    					had = true;
    				} 
    				if (client.seatNum == 0){//修改顾客的座位号为-1,并更新用户表中信息
    					client.seatNum = -1;
    					changeClientTickets(index, 1, 0);
    				}
    			}
    		}
    		fread(&client,sizeof(struct Client),1,readCustomer);		//逐块读取数据
    		index_airline = client.airlineNum;
    		index++;
    	}
    	fclose(readCustomer);
    	if (!had){
    		printf("查询信息为空\n");
    	}
    	return had;
    }
    
    bool deleteClient(int airlineId, int seatId) {
    	bool change = false;
    	int index = 0;	//记录修改用户信息表的时候需要跳转几个用户结构体
    	FILE *readCustomer = fopen("customer.dat", "r");
    	fread(&client,sizeof(struct Client),1,readCustomer);		//逐块读取数据
    	index_airline = client.airlineNum;
    	while (!feof(readCustomer)){
    		if ((client.airlineNum == airlineId) && (client.seatNum == seatId)){
    			//修改用户信息表中座位号为-1
    			client.seatNum = -1;
    			strcpy(client.tips, "退票");
    			//修改航班表中的remainTickets对应的位置为0
    			//此时需要修改的用户已经读取到client中了
    			setSeatNumZero(airlineId, seatId, index);
    
    			change = true;
    		}
    
    		fread(&client,sizeof(struct Client),1,readCustomer);		//逐块读取数据
    		index_airline = client.airlineNum;
    		index++;
    	}
    	fclose(readCustomer);
    	
    	return change;
    }
    
    void setSeatNumZero(int airline, int seatId, int index){
    	array_Airline[airline].remainTickets[seatId - 1] = 0;
    	changeAirlineTickets(airline);
    	changeClientTickets(index, 1, 0);
    }
    
    void changeClientTickets(int index, int choose, int airline) {
    	FILE *change = fopen("customer.dat", "rb+");
    	if (choose == 1){
    		fseek(change, sizeof(struct Client) * index, 0);
    //printf("%s, %d", client.name, client.seatNum);
    		fwrite(&client, sizeof(struct Client), 1, change); 
    		fclose(change);
    	}
    	else {
    		char tips[50];
    		if (choose == 2){//需要修改用户的提示信息为,航班信息已修改,请注意飞机号和起飞时间
    			strcpy(tips, "航班信息已修改,请注意出行安排");
    			int total = getAllClientInfo(false);
    			for (int i = 0; i < total; i++){
    				//有-1的判断:当管理员将航班取消的时候,为-1的信息改成0也没意义了,反倒给顾客混乱信息
    				if (clients[i].airlineNum == airline && clients[i].seatNum != -1) {
    					strcpy(clients[i].tips, tips);
    					fseek(change, sizeof(struct Client) * i, 0);
    					fwrite(&clients[i], sizeof(struct Client), 1, change); 
    				}
    			}
    			fclose(change);
    		}
    		else if (choose == 3){//需要修改用户的航班信息为:抱歉,航线已修改,此机票作废,已经退款
    			strcpy(tips, "抱歉,航线已修改,此机票作废,已经退款");
    			int total = getAllClientInfo(false);
    			for (int i = 0; i < total; i++){
    				if (clients[i].airlineNum == airline && clients[i].seatNum != -1) {
    					strcpy(clients[i].tips, tips);
    					clients[i].seatNum = 0;
    					fseek(change, sizeof(struct Client) * i, 0);
    					fwrite(&clients[i], sizeof(struct Client), 1, change); 
    				}
    			}
    			fclose(change);
    		}
    		
    	}
    }
    
    void sortAirlineAsTimeUseBubble() {
    	for (int i = totalAirlines; i >= 0; i--){
    		array_Airline[i] = array_Airline[i - 1];
    	}
    
    	bool change = true;
    	for (int i = 1; i <= totalAirlines; i++){
    		change = false;
    		for (int j = 1; j <= totalAirlines - i; j++){
    			if (array_Airline[j].time > array_Airline[j + 1].time){
    				array_Airline[0] = array_Airline[j];
    				array_Airline[j] = array_Airline[j + 1];
    				array_Airline[j + 1]= array_Airline[0];
    				change = true;
    			}
    		}
    		if (!change){
    			break;
    		}
    	}
    	//将数组中存储的数据复原为从0开始
    	for (int i = 0; i < totalAirlines; i++){
    		array_Airline[i] = array_Airline[i + 1];
    	}
    }
    
    void sortAirlineAsairlineNumUseInsert() {
    	//使用array_Airline[0]作为监视哨,需要将数组整体后移一位
    	for (int i = totalAirlines; i >= 0; i--){
    		array_Airline[i] = array_Airline[i - 1];
    	}
    	int j;
    	for (int i = 2; i <= totalAirlines; i++){
    		array_Airline[0] = array_Airline[i];
    		j = i - 1;
    		while (array_Airline[0].airlineNum < array_Airline[j].airlineNum){
    			array_Airline[j + 1] = array_Airline[j];
    			j = j - 1;
    		}
    		array_Airline[j + 1] = array_Airline[0];
    	}
    	//将数组中存储的数据复原为从0开始
    	for (int i = 0; i < totalAirlines; i++){
    		array_Airline[i] = array_Airline[i + 1];
    	}
    }
    
    展开全文
  • 这是配套的航空订票系统课程设计文档,源代码也已上传。
  • 风从水上走过留下粼粼波纹骆驼从沙漠上走过留下深深的脚印 哨鸽从天空飞过留下...朋友我们从人生的四季走过将给人生留下些什么 上海电力学院 数据结构C++M程设计 题 目: 航空客运订票系统 学生姓名范晓宁 学 号 2010328
  • C++课程设计航空客运订票系统

    万次阅读 多人点赞 2019-04-07 22:33:16
    航空客运订票系统   选题背景 ①背景: 现在人们更多的使用飞机作为出行交通工具,因此机票票务市场也在快速发展。国内外航空事业在飞速发展,各航空公司对票务管理的要求也在不断的提高,对航空的信息管理...
  • 代码放在java目录下,然后将hk.sql导入MySQL,主程序为“daima\num_02\JavaPrj_2\bin\com\hk\server\ServerMainClass.class”。基于Hibernate框架的应用,需要导入Hibernate开发包。
  • 软件按工程的全过程的实现,代码不包含,但是文档的其他的部分的应用到了大四的软件工程专业的知识,虽然不够准确但是值得我么的借鉴,希望对你们了可以有参考价值。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 656
精华内容 262
关键字:

航空订票系统课程设计