中北大学数据结构课程设计说明书一、设计目的假定民航机场共有n个航班,每个航班有一航班号,确定的航线(起始站、终点站)、确定的飞行时间(星期几)和一定的成员定额,设计一民航订票系统,使之能提供下列服务:1:航班信息录入功能(航班信息用文件保存)2:航班信息浏览功能3:查询航班(至少一种查询方式):a:按航班号查询 b:按起点站查询 c:按终点站查询 d:按飞行时间查询提示:(1)需求分析:航班信息用文件保存;航班信息浏览功能需要提供显示操作;要查询航线需要提供查找功能,可提供按上述四种方式查询;另外要提供键盘式选择菜单以实现功能选择。
(2)建立航班结构体,结构体成员包括航班号、起始站、终点站、飞行时间(星期几)、预售票总数、已售票数。
2.设计内容和要求要求:假定民航机场共有n个航班,每个航班有一航班号,确定的航线(起始站、终点站)、确定的飞行时间(星期几)和一定的成员定额,设计一民航订票系统,使之能提供下列服务:1:航班信息录入功能(航班信息用文件保存)2:航班信息浏览功能3:查询航班(至少一种查询方式):a:按航班号查询 b:按起点站查询 c:按终点站查询 d:按飞行时间查询3. 本设计所采用的数据结构根据题目要求和提示,首先是建立航班结构体,结构体名称为flight_type,由于航班的数目不止一个,所以要将变量名定义成数组,为flight[N],然后定义结构体成员: char flight_num[20]; /*航班号*/char start_add[20]; /*起始站*/char end_add[20]; /*终点站*/int week_day; /*飞行时间*/int All_amount; /*预售票数*/int Free_amount; /*已售票数*/下面是各个函数的数据结构:第一个是input函数。
由于要设置密码保护,所以定义一个字符数组并初始化, 内容由用户自己设定,作为密码;再预设一个长度为20个字符的字符数组,供用户录入密码。
经判断,密码正确程序才继续运行;否则提示用户继续还是退出。
定义三个整型变量,一个用来控制循环,,第二个的作用是当用户输入的星期超出范围时控制内嵌do—while循环让用户重新输入,第三个用来供用户输入选择继续运行程序还是退出。
第二个是save函数,首先定义一个整型变量控制循环,然后定义文件指针(FILE *fp),最后创建文件message保存录入的航班信息即可。
第三个是scan函数,定义两个整型变量,一个用来控制输出循环,第二个的作用是在完成此项功能后供用户选择接下来要做什么时输入。
由于要浏览文件message中的信息,所以要定义文件指针*fp。
最后是打开文件,把文件里包含的所有信息显示到屏幕上面。
下一个是search函数,由于用户要选择查询方式,所以要设计一个菜单供用户选择。
定义三个整型变量,第一个是供用户选择查询方式时输入,第二个是当用户输入的数字超出范围时控制一个do—while循环让用户重新输入,第三个的作用是在完成此项功能后供用户选择接下来要做什么时输入。
下面四个函数(flight_search函数(即按航班号查询函数)、start函数(即按起始站查询函数)、end函数(即按终点站查询函数)、time函数(即按飞行时间查询函数))的数据结构基本相同。
定义两个整型变量,一个用来控制输出循环,另一个的作用是完成此项功能后供用户选择接下来要做什么时输入。
还要定义两个数组,一个是长度为20的字符数组,供用户查询信息的时候输入航班号;另外一个数组的作用是在浏览航班信息时将其赋值。
如果信息库中有用户所需要的航班信息,则在读文件时,读到与用户所需要的信息不相符的时候就将此数组的那一个元素赋值为0。
如果是客户所需要的信息,则不赋值。
这样,读完信息以后,将此数组中所有元素的值相加,如果为0,则说明信息库中没有用户所需要的信息,就输出“对不起,无此航班!”。
所以还要多定义一个整型变量,以便将数组中元素的和赋给它。
所以共定义了三个整型变量。
另外还要定义文件指针*fp,然后打开文件,如果文件里面有用户需要的信息,则将其显示到屏幕上面;如果没有则显示无此信息,然后让用户选择接下来要做什么。
其中的time函数有两点不同,第一个就是当用户输入的星期超出范围时,要让用户重新输入,所以需要多定义一个整型变量,控制一个do—while循环让用户重新输入。
第二个就是time函数里面不需要定义数组,因为它的输入是星期几,所以只需要再多定义一个整型变量。
下面一个是menu函数,menu函数的作用就是为显示一个菜单供用户选择自己需要的功能,所以定义两个整型变量,一个是供用户输入选择功能,另一个是在用户输入的数字超出范围时控制一个do—while循环让用户重新输入。
最后一个是main函数。
这个函数比较简单,直接调用menu函数即可,所以不需要定义任何数据类型。
这就是整个程序的数据结构设计。
4.功能模块详细设计4.1 详细设计思想实际上,在上面设计算法和数据结构时模块设计就包括在里面了。
整个程序大体上分为以下几个模块。
第一个是信息录入模块。
此模块包含了两个函数,一个是input函数,供用户录入信息;第二个是save函数,用来保存用户录入的信息。
第二个是信息浏览模块。
此模块比较简单,只有一个scan函数。
第三个是信息查询模块。
此模块包含了五个函数:search函数、flight_search函数、start函数、end函数和time函数. search函数提供选择菜单供用户选择查询方式,后面四个函数分别提供了四种不同的信息查询方式。
第四个模块是设计菜单模块。
这个模块也只有一个函数,即menu函数。
第五个模块是程序中不可缺少的,即main函数。
这个模块最简单,是直接调用menu 函数。
4.2 核心代码#include"stdio.h"如有帮助,欢迎下载支持#include "string.h"#define N 4void save();void search();void input();void scan();void flight_search();void start();void end();void time();int menu();struct flight_type /*建立航班结构体*/ {char flight_num[20]; /*航班号*/char start_add[20]; /*起始站*/char end_add[20]; /*终点站*/int week_day; /*飞行时间*/int All_amount; /*预售票数*/int Free_amount; /*已售票数*/}flight[N];void input() /*录入航班信息函数*/{int a,j,w;char b[10];char u[10]={"liuyf"};printf("请输入密码:");scanf("%s",b);if(strcmp(b,u)==0){for(j=0;j<N;j++){printf("请输入航班号:");scanf("%s",flight[j].flight_num);printf("请输入起始站(如:beijing):");scanf("%s",flight[j].start_add);printf("请输入终点站(如:wuhan):");scanf("%s",flight[j].end_add);printf("请输入飞行时间(1~~7):");do{scanf("%d",&flight[j].week_day);if(flight[j].week_day<1||flight[j].week_day>7){w=1;p rintf("\n对不起!您输入的飞行时间超出范围,请重新输入!\n\n"); p rintf("注意范围(1~~7之间):");}else w=0;}while(w == 1);printf("请输入预售票数:");scanf("%d",&flight[j].All_amount);printf("请输入已售票数:");scanf("%d",&flight[j].Free_amount);save(); /*调用保存航班信息函数*/ printf("\n\n信息已录入并保存!\n\n\n现在您想做什么?\n1:退出\n2:返回主菜单\n");printf("\n请输入:");scanf("%d",&a);if(a==1)exit(0);else menu(); /*调用选择菜单函数*/ }else printf("\n对不起,您无权使用此功能!\n\n\n");printf("现在您想做什么?\n\n1:退出\n\n2:返回主菜单\n\n");printf("请输入:");scanf("%d",&a);if(a==1){printf("\n谢谢使用!\n");exit(0);}else menu(); /*调用选择菜单函数*/ }void save() /*保存航班信息函数*/{FILE *fp;int i;if((fp=fopen("message","wb"))==NULL){printf("无法打开文件!\n");return;for(i=0;i<N;i++)if(fwrite(&flight[i],sizeof(struct flight_type),1,fp)!=1)printf("文件打开出错!\n");fclose(fp);}void scan() /*浏览航班信息函数*/ {int a,c;FILE *fp;if((fp=fopen("message","rb"))==NULL){printf("无法打开文件!\n");menu();}printf("\n航班号起始站终点站飞行时间预售票数已售票数\n\n");for(c=0;c<N;c++){fread(&flight[c],sizeof(struct flight_type),1,fp);printf("\n");printf("%-5s %-8s %-8s %-d %-3d %-3d\n\n",flight[c].fli ght_num,flight[c].start_add,flight[c].end_add,flight[c].week_day,flight[c].All_ amount,flight[c].Free_amount); 注意:原程序中此处是一行}fclose(fp);printf("\n\n信息库中所有航班信息已输出!\n\n\n现在您想做什么?\n\n 1:退出\n\n 2:返回主菜单\n\n");printf("\n请输入:");scanf("%d",&a);if(a==1){printf("\n谢谢使用!\n");exit(0);}else menu();}void search() /*查询航班信息函数*/ {int d,w;printf(" *****************************查询方式****************************** \n");注意:原程序中此处是一行 printf(" 1:按航班号查询\n");printf(" 2:按起始站查询\n");printf(" 3:按终点站查询\n");printf(" 4:按飞行时间查询\n\n");printf("******************************************************************* \n");注意:原程序中此处是一行printf("\n请选择(1~~4):");do{scanf("%d",&d);if(d<1||d>4){w=1;printf("\n对不起!您的输入超出范围,请重新输入!\n");p rintf("\n注意范围(1~~4):");}else w=0;}while(w == 1);switch(d){case 1:flight_search();break; /*调用按航班号查询函数*/case 2:start(); break; /*调用按起始站查询函数*/case 3:end(); break; /*调用按终点站查询函数*/case 4:time();break; /*调用按飞行时间查询函数*/ }}void flight_search() /*按航班号查询航班信息函数*/ {FILE *fp;int a,f,A[N],m=0;char e[20];printf("请输入您要查询的航班号(如CA1826):");scanf("%s",e);if((fp=fopen("message","rb"))==NULL){printf("无法打开文件!\n");menu();}for(f=0;f<N;f++){fread(&flight[f],sizeof(struct flight_type),1,fp);if(strcmp(flight[f].flight_num,e)!=0)A[f]=0;else A[f]=1;}for(f=0;f<N;f++)m+=A[f];if(m==0)printf("\n\n对不起!无此航班!\n");else{printf("\n航班号起始站终点站飞行时间预售票数已售票数\n\n");for(f=0;f<N;f++){fread(&flight[f],sizeof(struct flight_type),1,fp);if(strcmp(flight[f].flight_num,e)==0)printf("%-5s %-8s %-8s %-d %-3d %-3d\n\n",flight[f].fli ght_num,flight[f].start_add,flight[f].end_add,flight[f].week_day,flight[f].All_ amount,flight[f].Free_amount); 注意:原程序中此处是一行}}fclose(fp);printf("\n\n现在您想做什么?\n\n 1:退出\n\n 2:返回查询菜单\n\n 3:返回主菜单\n\n");printf("请输入:");scanf("%d",&a);if(a==1){printf("\n谢谢使用!\n");exit(0);}if(a==2)search();else menu();}void start() /*按起点站查询航班信息函数*/ {int a,h,B[N],x=0;char g[8];FILE *fp;printf("请输入起始城市(城市的全拼):");scanf("%s",g);if((fp=fopen("message","rb"))==NULL){printf("无法打开文件!\n");menu();}for(h=0;h<N;h++){fread(&flight[h],sizeof(struct flight_type),1,fp);if(strcmp(flight[h].start_add,g)!=0)B[h]=0;else B[h]=1;}for(h=0;h<N;h++)x+=B[h];if(x==0)printf("\n\n对不起!无此航班!\n");else{printf("\n航班号起始站终点站飞行时间预售票数已售票数\n\n");for(h=0;h<N;h++){fread(&flight[h],sizeof(struct flight_type),1,fp);if(strcmp(flight[h].start_add,g)==0)printf("%-5s %-8s %-8s %-d %-3d %-3d\n\n",flight[h].fli ght_num,flight[h].start_add,flight[h].end_add,flight[h].week_day,flight[h].All_ amount,flight[h].Free_amount); 注意:原程序中此处是一行}}fclose(fp);printf("\n\n现在您想做什么?\n\n 1:退出\n\n 2:返回查询菜单\n\n 3:返回主菜单\n\n");printf("请输入:");scanf("%d",&a);if(a==1){printf("\n谢谢使用!\n");exit(0);}if(a==2)search();else menu();}void end() /*按终点站查询航班信息函数*/ {int a,n,C[N],y=0;char m[8];FILE *fp;printf("请输入终点城市(城市的全拼):");scanf("%s",m);if((fp=fopen("message","rb"))==NULL){printf("无法打开文件!\n");menu();}for(n=0;n<N;n++){fread(&flight[n],sizeof(struct flight_type),1,fp);if(strcmp(flight[n].end_add,m)!=0)C[n]=0;else C[n]=1;}for(n=0;n<N;n++)y+=C[n];if(y==0)printf("\n\n对不起!无此航班!\n");else{printf("\n航班号起始站终点站飞行时间预售票数已售票数\n\n");for(n=0;n<N;n++){fread(&flight[n],sizeof(struct flight_type),1,fp);if(strcmp(flight[n].end_add,m)==0)printf("%-5s %-8s %-8s %-d %-3d %-3d\n\n",flight[n].fli ght_num,flight[n].start_add,flight[n].end_add,flight[n].week_day,flight[n].All_ amount,flight[n].Free_amount); 注意:原程序中此处是一行}}fclose(fp);printf("\n\n现在您想做什么?\n\n 1:退出\n\n 2:返回查询菜单\n\n 3:返回主菜单\n\n");printf("请输入:");scanf("%d",&a);if(a==1){printf("\n谢谢使用!\n");exit(0);}if(a==2)search();else menu();}void time() /*按飞行时间查询航班信息函数*/ {int s,t,w,a,D[N],z=0;FILE *fp;printf("请输入日期(星期几)(1~~7之间)!\n");printf("星期");do{scanf("%d",&s);if(s<1||s>7){w=1;printf("\n对不起!您输入的飞行时间超出范围,请重新输入!\n");printf("\n注意范围(1~~7之间):");}else w=0;}while(w==1);if((fp=fopen("message","rb"))==NULL){printf("无法打开文件!\n");menu();}for(t=0;t<N;t++){fread(&flight[t],sizeof(struct flight_type),1,fp);if(s!=flight[t].week_day)D[t]=0;else D[t]=1;}for(t=0;t<N;t++)z+=D[t];if(z==0)printf("\n\n对不起!无此航班!\n");else{printf("\n航班号起始站终点站飞行时间预售票数已售票数\n\n");for(t=0;t<N;t++){fread(&flight[t],sizeof(struct flight_type),1,fp);if(s==flight[t].week_day)printf("%-5s %-8s %-8s %-d %-3d %-3d\n\n",flight[t].fli ght_num,flight[t].start_add,flight[t].end_add,flight[t].week_day,flight[t].All_ amount,flight[t].Free_amount); 注意:原程序中此处是一行}}fclose(fp);printf("\n\n现在您想做什么?\n\n 1:退出\n\n 2:返回查询菜单\n\n 3:返回主菜单\n\n");printf("请输入:");scanf("%d",&a);if(a==1){printf("\n谢谢使用!\n");exit(0);}if(a==2)search();else menu();}int menu() /*键盘式选择菜单*/{int k,w;do{printf("\n\n");printf("*******************************MENU******************************** \n"); 注意:原程序中此处是一行!printf(" 1.录入航班信息!\n");printf(" 2.浏览航班信息!\n");printf(" 3.查询航班信息!\n");printf(" 4.退出!\n\n");printf("******************************************************************* \n");注意:原程序中此处是一行printf("请选择(1~4):");scanf("%d", &k);if(k<1||k>4){w=1;printf("\n对不起!您的输入超出范围,请重新输入!\n");p rintf("\n注意范围(1~~4):");}else w=0;}while(w==1);switch(k){c ase 1:input();break; /*调用录入函数*/c ase 2:scan(); break; /*调用浏览函数*/c ase 3:search(); break; /*调用查询函数*/c ase 4:exit(0); /*退出*/}return 0;}main() /*主函数*/{menu(); /*调用选择菜单函数*/}六:结果分析设计时我预先设定只录入四个航班信息。