飞机订票系统一、课程设计目的(1)了解并掌握算法的设计方法,具备初步的独立分析和设计能力;(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;二、课程设计的内容和要求本程序主要用于机票的管理,甩以提供了以下功能,行班信息输入输出保存、航线查询、订票,退票,和修改航班信息。
创建航班信息:包括航班号、起飞时间、降落时间、起飞抵达城市、航班票价、及票价的折扣,票数等信息.录入的信息应该保存在一个文件里。
浏览航班信息:通过浏览系统,客户可以根据自己时间、金钱等多方面的因素选择适合自己的航班。
修改航班信息:当航班信息改变可以修改航班数据文件。
查询航班信息:可通过航班号查询,可通过飞机终点站查询,也可以按航线查询。
删除航班信息:可通过航班号删除,也可以按航线删除。
添加航班信息:按添加的航班数量依次添加航班信息订票:可以订票,如果该航班已经无票,可以推荐相关航班退票:不满意所订的票时可进行退票三、算法的基本思想1.涉及到的数据结构typedef struct flightnode //定义结构体数组{int num; //航班号char start[20]; //起始城市char over[20]; //终点城市char Stime[10]; //起始时间har Etime[10];int Price;int Discount; //折扣int count; //机票数struct flightnode *next;} NODE;2.基本功能模块主函数模块。
1)函数原形:void main();2)功能:调用initlist(&h) 函数和menu()函数,初始化函数和显示主界面创建航班信息模块1)函数原形:void creat();2)功能:本模块是对程序中的create()函数和save()函数的详细说明——链表的存储结构,对该创建的链表调用save()函数,存储到数据文件中去浏览航班信息模块1) 函数原形:void print();2) 功能:输出航班信息修改航班信息模块1)函数原形:void change()2) 功能:当航班信息改变可以修改航班数据文件20查找航班信息模块1)函数原形:NODE *search():查找航班信息数据2) 功能:由于航班的录入和保存是由链表存储结构进行的,所以此查询就可通过链表对该文件进行查看或者查询,查询我们可根据航班号和航班抵达的城市和航线匹配查询,在查询中将需要查询的航班号 no和文件阅读时指针所指的值num进行比较,而按抵达城市查找则利用函数strcmp(p->next->start,name1)若匹配则输出;删除航班信息模块1)函数原形:void del()2) 功能:选择按什么方式删除,然后按该方式删除添加航班信息模块1)函数原形:void add();2) 功能:按添加的航班数量依次添加航班信息订票信息模块1)函数原形:int book_tickets()2) 功能:先根据search()函数查询要订票的航班,在订票时应先按乘客想要定的航班号或者抵达城市或航线查询,并按乘客欲定的票的数目与查询数目进行比较,若订票的票数小于该航班票数,则输出订票成功,,且在整个定票系统中,所有的定票都用链表进行存储管理退票信息模块1)函数原形:int tuipiao()2) 功能:在退票系统中即对航班票的数据文件进行管理,所以可先按照查询航班票的方法,若查询到的票的信息和乘客此时要求退票的信息相匹配,则在该定票数据文件中删除相应的该票的节点,再修改其航班信息。
3.主要功能模块流程图四、系统测试1.选择1,运行界面如下:2.选择2,运行界面如下:3.选择3,运行界面如下:4.选择4,运行界面如下:5.选择5,运行界面如下:6.选择6,运行界面如下:7.选择7,运行界面如下:8.选择8,运行界面如下:9.选择0,运行界面如下:五.结论本次程序设计主要用到了结构体、调用函数、文件的保存、输入以及输出等功能。
使我对数据结构有了更深一层的认识,特别是对动态链表和文件的运用得到了很大的提高。
在本次实验中程序曾多次编译、运行出错,多亏了王帅老师的指导才将错误找出并改正,通过本次实验,我认识到实践和动手的重要性。
六.源程序及系统文件使用说明程序清单#include<stdio.h> //标准输入、输出头文件#include<string.h> //包含字符串函数处理头文件#include<stdlib.h> //包含动态存储与释放函数头文件typedef struct flightnode //定义结构体数组{int num; //航班号char start[20]; //起始城市char over[20]; //终点城市char Stime[10]; //起始时间char Etime[10];int Price;float Discount; //折扣int count; //机票数struct flightnode *next;} NODE;#define PRINT "%4d %9.6s %9.6s %9.6s %9.6s %9d %.1f %9d \n",p->next->num,p->next->start,p->next->over,p->next->Stime,p->next->Etime,p->n ext->Price,p->next->Discount,p->next->count //定义输出格式void creat(); //创建航班信息文件void print(); //输出航班信息void save(); //保存航班信息int read(); //读取航班信息NODE *search(); //查找航班信息void del(); //删除航班信息int book_tickets(); //订票信息int tuipiao(); //退票信息void change(); //修改信息void menu(); //菜单void initlist(NODE **); //初始化函数void add(); //添加信息函数NODE *h=NULL; //建立全局变量,存链表头指针int m=0; //航班数量void initlist(NODE **h){*h=(NODE *)malloc(sizeof(NODE));(*h)->next=NULL;}void creat() //打印模块程序{FILE *fp;NODE *p=NULL; //定义移动指针int i,flightnum;char y;p=h;if((fp=fopen("air.dat","rb"))!=NULL)//打开文件,并判断是否出错{printf(" 信息文件已经存在,不必创建!按任意键后回车返回\n\n\n");//打印出错提示fclose(fp);fflush(stdin);getchar();return ;}p=h;printf("请输入要输入的航班数量:");fflush(stdin); //清除文件缓冲区scanf("%d",&flightnum); //读取航班数system("cls"); //清屏printf(" 请依次输入航班信息:\n\n"); //打印提示信息printf("--------------------------------------------------------------------------\n");for(i=0;i<flightnum;i++){p->next=(NODE *)malloc(sizeof(NODE));p->next->next=NULL;printf("航班号:");fflush(stdin);scanf("%d",&p->next->num); //读取航班号printf("起始站:");fflush(stdin);scanf("%10s",&p->next->start);//读取起飞城市printf("终点站:");fflush(stdin);scanf("%10s",&p->next->over);//读取抵达城市printf("起始时间:");fflush(stdin);scanf("%10s",&p->next->Stime);//读取起飞时间printf("抵达时间:");fflush(stdin);scanf("%10s",&p->next->Etime);//读取抵达时间printf("航班票价:");fflush(stdin);scanf("%d",&p->next->Price);//读取航班票价printf("票价折扣:");fflush(stdin);scanf("%10f",&p->next->Discount);//读取票价折扣printf("机票数:",m);fflush(stdin);scanf("%d",&p->next->count);//读取机票数printf(" 第%d个信息已经输完\n",i+1);p=p->next;m++;}printf("信息输入完毕,是否存盘:存盘按0,不存盘按其他任意键");fflush(stdin);y=getchar();if(y=='0'){save();//将结构体信息存盘print();//输出输入的航班信息}}void save()//保存模块程序{NODE *p=NULL;//定义移动指针FILE *fp,*fp1;//定义指向文件指针p=h;if((fp=fopen("air.dat","wb"))==NULL)//打开文件并判断是否出错{printf(" 创建文件失败!\n\n\n");//打印出错提示fflush(stdin);getchar();return;}if((fp1=fopen("num.dat","wb"))==NULL)//打开文件并判断是否出错{printf(" 创建文件失败!\n\n\n");//打印出错提示fflush(stdin);getchar();return;}while(p->next!=NULL){if(fwrite(p->next,sizeof(NODE),1,fp)==0)//向文件写入数据,并判断是否出错{printf(" 向文件输入数据失败!\n\n\n");break;}else p=p->next;}fprintf(fp1,"%d",m); //按指定的格式输出到fp1所指定的文件中fclose(fp);//关闭文件fclose(fp1);//关闭文件}int read()//从文件读取信息模块{FILE *fp,*fp1;//定义文件指针NODE *p=NULL;int i;initlist(&h);p=h;if((fp=fopen("air.dat","rb"))==NULL)//打开文件,并判断是否出错{printf("出错,请检查信息文件是否存在,按任意键后回车返回住菜单\n\n\n");//打印出错提示fflush(stdin);getchar();return 0;}if((fp1=fopen("num.dat","rb"))==NULL)//打开文件并判断是否出错{printf(" 创建文件失败!\\n\n\n");//打印出错提示fflush(stdin);getchar();return 0;}fscanf(fp1,"%d",&m); //从fp1所指定的文件中按给定的格式将输入数据送内存中fclose(fp1);//关闭文件printf("\n 总共%d个航班信息\n",m);for(i=0;i<m;i++){p->next=(NODE *)malloc(sizeof(NODE));p->next->next=NULL;fread(p->next,sizeof(NODE),1,fp);//从文件中读取信息p=p->next;}fclose(fp);//关闭文件return 1;}void print()//打印模块{NODE *p=NULL;if(read()==0)return;//调用读取文件函数,并判断是否文件存在。