/*1、用户和管理员及航班信息请以英文字母或数字输入*//*2、管理员账户为:boss,密码为:123。
保存在txt文件中,需要修改请于程序中修改*//*3、部分文件读写为二进制读写,所以打开文件时会看到乱码*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include<conio.h>#define N 1000void zhujiemian();//主界面函数void verify();//用户及管理员登录选择void loginmanager();//管理员登录void loginuser();//用户登录void loginflightm();//管理员登录机票系统void loginflightu();//用户登录机票系统void creatfile();//创建用户信息模块void saveuser();//用户信息保存模块程序void input(); //输入航班信息void print(); //输出航班信息void save(); //保存航班信息void read(); //读取航班信息void paixu(); // 对所有航班按航班号排序void search(); //查找航班信息void dingpiao(); //订票信息struct users //管理员/用户信息结构体,管理员可以修改航班信息{char Name[20]; //管理员/用户姓名char sexual[10];//用户性别char ps[8]; // 用户密码int age; //用户年龄long Number; //用户身份证号码int power; //power为1是管理员登录,为0是用户登录}user[N],up,mg;//up为键盘输入用户信息,user[N]为文件保存的用户信息,mg为管理员结构体int n;//所有用户个数,初始化为0struct air //航班信息结构体{int num; //航班号char start[20]; //出发地char over[20]; //目的地char time[10]; //时间int count; //票数int prize; //票价}s[N],fnew;int i;int m=0; //所有航班个数#define PRINT "%-d%12s%12s%10s%12d%10d\n",s[i].num,s[i].start,s[i].over,s[i].time,s[i].count,s[i].prize //定义输出格式void main()//主函数{zhujiemian();}void zhujiemian()//主界面函数{int j;printf("#===================================================#\n");printf("# 欢迎进入机票管理系统#\n");printf("# 1、登录系统#\n");printf("# 2、新用户注册#\n");printf("# 0、退出#\n");printf("#===================================================#\n");printf("请在1-2中选择以回车键结束:\n\n");scanf("%d",&j);switch(j){case 1:verify();//进入机票系统break;case 2:creatfile();//进入用户注册系统break;case 0:;break;}}void verify()//验证用户及管理员信息模块{system("cls");printf("#===================================================#\n");printf("# 1、管理员登录#\n");printf("# 2、用户登录#\n");printf("# 0、返回主界面#\n");printf("#===================================================#\n");scanf("%d",&j);switch(j){case 1:loginmanager();//进入管理员登录界面break;case 2:loginuser();//进入用户登录界面break;case 0:system("cls");zhujiemian(); //进入主界面break;}}/********管理员登录确定函数**********/void loginmanager(){FILE * fp=NULL;//定义文件指针char DataFile[20]="manager.txt";//存储管理员信息的文件名int i=0,j=1;char relogin; //是否重新登录int success=0; //登录成功的标志printf("\n---管理员登录---\n");fp=fopen(DataFile,"r");if(fp==NULL)//如果当前文件不存在,初始化根用户名为boss,密码为123,权限为管理员{printf("首次使用该系统!\n");printf("管理员账户为:boss 密码为:123\n");fp=fopen(DataFile,"a");//以追加方式打开文件user[0].Number=0;strcpy(user[0].Name,"boss");strcpy(user[0].sexual,"male");user[0].age=22;user[0].power=1;strcpy(user[0].ps,"123");fwrite(&user[0],sizeof(user),1,fp);fclose(fp);elsefclose(fp);again:printf("请输入管理员姓名:");scanf("%s",);//输入用户名[19]='\0';printf("请输入管理员密码:");fflush(stdin);for(i=0;i<7;i++)//输入密码,以*在屏幕显示{up.ps[i]=getch();up.ps[i+1]='\0';//字符要以'\0'结尾if(up.ps[i]=='\b'){i--;up.ps[i]='\0';//清除前一个字符i--;//接收前一个字符printf("\b ");printf("\b");continue;}if(up.ps[i]=='\r'){up.ps[i]='\0';break;}printf("*");}fp=fopen(DataFile,"rt");if(fp==NULL) // 打开文件失败时提示{printf("\n打开%s 失败!按任意键结束程序\n",DataFile);perror("Open file fail");getchar();return;}if((fp=fopen("manager.txt","r"))==NULL)//打开文件,并判断是否出错{printf("\n出错,请检查文件是否存在,按任意键返回主菜单\n");//打印出错提示getchar();}fread(&mg,sizeof(struct users),1,fp);//从文件中读取信息fclose(fp);//关闭文件if(strcmp(,)==0&&strcmp(mg.ps,up.ps)==0){success=1;}if(success==1) //登录成功{printf("\n登录成功,按任意键进入机票调整系统!\n");getchar();loginflightm();}else//未登录成功{fflush(stdin);//清除输入缓冲区中的字符printf("\n用户名或密码错误!重新输入请按y,退出请按n:\n");relogin=getchar();if(relogin=='y'||relogin=='Y'){getchar();goto again;}else{verify();exit(0);}}}/********用户登录函数**********/void loginuser(){FILE *fp=NULL,*fp1;//定义文件指针char DataFile[20]="yonghu.txt";//存储管理员信息的文件名int i=0,j=0;char relogin; //是否重新登录int success=0; //登录成功的标志printf("\n---用户登录---\n");fp=fopen(DataFile,"r");//读取文件中数据if((fp1=fopen("howmanyusers.txt","a"))==NULL)//读写方式打开文件,若文件不存在,则n=0{//printf("创建文件失败!\n\n");//打印出错提示n=0;//getchar();//continue;}else{fp1=fopen("howmanyusers.txt","r");fscanf(fp1, "%d",&n);//读取fp1中的用户个数}fclose(fp1);if((fp=fopen("yonghu.txt","r"))==NULL)//打开文件,并判断是否出错{fp1=fopen("howmanyusers.txt","w+");//以写方式打开fprintf(fp1,"%d",0);//打开用户文件失败,则输入用户个数0到fp1fclose(fp1);printf("\n目前没有用户信息,请按ENTER键返回主菜单先进行注册!\n");getchar();getchar();system("cls");zhujiemian();}for(i=0;i<n;i++){fread(&user[i],sizeof(struct users),1,fp);//从文件中读取信息}fclose(fp);//关闭文件//输入数据与文件中用户比对again:printf("请输入用户姓名:");scanf("%s",);//输入用户名[19]='\0';printf("请输入用户密码:");fflush(stdin);for(i=0;i<7;i++)//输入密码,以*在屏幕显示{up.ps[i]=getch();up.ps[i+1]='\0';//字符要以'\0'结尾if(up.ps[i]=='\b'){i--;up.ps[i]='\0';//清除前一个字符i--;//接收前一个字符printf("\b ");printf("\b");continue;}if(up.ps[i]=='\r'){up.ps[i]='\0';break;}printf("*");}for(i=0;i<n;i++) //对比用户名和密码,进行登录{if(strcmp(user[i].Name,)==0&&strcmp(user[i].ps,up.ps)==0){success=1;break;}}if(success==1) //登录成功{printf("\n登录成功,按任意键进入机票调整系统!\n");getchar();loginflightu();}else //未登录成功{fflush(stdin);//清除输入缓冲区中的字符printf("\n用户名或密码错误!重新输入请按y,退出请按n:\n");relogin=getchar();if(relogin=='y'||relogin=='Y'){getchar();goto again;}else{verify();exit(0);}}}void saveuser(struct users[])//用户信息保存模块程序{FILE *fp,*fp1;//定义文件指针if((fp=fopen("yonghu.txt","a"))==NULL)//打开文件并判断是否出错{printf("创建文件失败!\n\n");//打印出错提示getchar();return;}if((fp1=fopen("howmanyusers.txt","w+"))==NULL)//打开文件并判断是否出错{printf("创建文件失败!\n\n");//打印出错提示getchar();return;}for(i=0;i<n;i++){if(fwrite(&user[i],sizeof(struct users),1,fp)==0)//向文件写入数据,并判断是否出错{printf("向文件输入数据失败!\n\n");}}fprintf(fp1,"%d",n);//输入用户个数到fp1fclose(fp);//关闭文件fclose(fp1);//关闭文件}void creatfile()//增加用户信息模块{FILE *fp=NULL,*p=NULL,*fp1;char DataFile[20]="yonghu.txt";//存储用户信息的文件名//int a[100];int i=0,k=1,count=0;fp=fopen(DataFile,"r");system("cls");//清屏if(fp==NULL)//如果当前文件不存在,提示打开文件失败{fp1=fopen("howmanyusers.txt","w+");//以写方式打开fprintf(fp1,"%d",0);//打开用户文件失败,则输入用户个数0到fp1fclose(fp1);printf("\n不存在%s,正在创建!\n",DataFile);fp=fopen(DataFile,"a");creatfile();}if((fp1=fopen("howmanyusers.txt","a"))==NULL)//读写方式打开文件,若文件不存在,则n=0{n=0;}else{fp1=fopen("howmanyusers.txt","r");fscanf(fp1, "%d",&n);//读取fp1中的用户个数}fclose(fp1);for(i=0;i<n;i++){fread(&user[i],sizeof(struct users),1,fp);//从文件中读取信息}fclose(fp);//关闭文件//如果成功打开文件,则提示输入用户相关信息printf("请输入用户信息\n");fflush(stdin);while(k){//printf("\n输入身份证号码注意身份证号码不能为0!\n");printf("请输入身份证号码:");scanf("%ld",&up.Number);i=0;//再次初始化i为0//判断身份证号是否存在while(i<n){if(user[i].Number==up.Number){printf("该身份证号码已被使用过!\n请重新输入身份证号:");scanf("%ld",&up.Number);i=0;//continue;}elsei++;}//经循环对比后,i的值仍和n相等,将新注册的信息加入数组末位user[i].Number=up.Number;printf("姓名:");scanf("%s",&user[i].Name);user[i].Name[19]='\0';printf("性别:");scanf("%s",&user[i].sexual);printf("用户密码:");scanf("%s",&user[i].ps);printf("年龄:");scanf("%d",&user[i].age);n++;//用户数目增加printf("是否继续注册?是:选1,否:选0;");scanf("%d",&k);}saveuser(user);//保存用户信息fclose(fp);//在屏幕上显示文件内容system("cls");printf("数据已经成功保存到%s中\n",DataFile);getchar();printf("按任意键返回主界面!\n");getchar();system("cls");zhujiemian();//返回主界面}void loginflightm()//管理员登录机票系统{int j;do{system("cls");printf(" ★----------------您好,欢迎进入自动化飞机订票系统!---★\n");printf("===================================================================== ===========\n");printf(" **-------- -------☆1.输入航班信息☆-------- -------------------**\n\n" " **-------- ----☆2. 浏览航班信息☆----- ------------------**\n\n" " **-------- ☆ 3. 查找航班信息-☆-------- ------------**\n\n" " **-------- ---☆ 4.对航班按航班票价排序---☆-----------------------**\n\n" " **-------- ------☆ 5. 订票信息-☆-------- -----------------**\n\n" " **-------- ----------☆0.退出-☆-------- ---------------------**\n\n" " **-------- ---------------☆☆-------- -------------------------**\n\n" " **-------- -----------------☆-------- --------------------------**\n\n" " **-------- ---------------☆☆-------- --------------------------**\n\n");printf("===================================================================== ===========\n");printf("请在0-5中选择以回车键结束:\n\n");scanf("%d",&j);switch(j){case 1:input();//调用输入模块break;case 2:system("cls");print();//调用打印模块break;case 3:search();//调用查找模块break;case 4:paixu();//调用排序模块break;case 5:dingpiao();//调用订票模块break;case 0:;break;}}while(j!=0); //判断结束printf("按任意键返回主界面\n");system("cls");zhujiemian();}//登录函数结束void loginflightu()//用户登录机票系统{int j;do{system("cls");printf(" ★----------------您好,欢迎进入自动化飞机订票系统!---★\n");printf("===================================================================== ===========\n");printf(" **-------- ----☆ 1. 浏览航班信息☆----- ------------------**\n\n" " **-------- ☆ 2. 查找航班信息-☆-------- ------------**\n\n" " **-------- ---☆ 3.对航班按航班票价排序---☆-----------------------**\n\n" " **-------- ------☆ 4. 订票信息-☆-------- -----------------**\n\n" " **-------- ----------☆0.退出-☆-------- ---------------------**\n\n" " **-------- ---------------☆☆-------- -------------------------**\n\n" " **-------- -----------------☆-------- --------------------------**\n\n" " **-------- ---------------☆☆-------- --------------------------**\n\n");printf("===================================================================== ===========\n");printf("请在0-5中选择以回车键结束:\n\n");scanf("%d",&j);switch(j){case 1:system("cls");print();//调用打印模块break;case 2:search();//调用查找模块break;case 3:paixu();//调用排序模块break;case 4:dingpiao();//调用订票模块break;case 0:;break;}}while(j!=0); //判断结束printf("按任意键返回主界面\n");system("cls");zhujiemian();}//登录函数结束void input()//输入航班信息模块,管理员操作{int i=0,k=1;read();printf("请依次输入航班信息(航班号,起始站,终点站,起飞时间,机票数,票价):\n\n");//打印提示信息printf("--------------------------------------------------------------------------\n");//fflush(stdin);while(k){printf("请输入航班号:\n");scanf("%d",&fnew.num); //读取航班号i=0;//再次初始化i为0//判断航班是否已经存在while(i<m){if(s[i].num==fnew.num){printf("该航班已经存在!\n请重新输入:");scanf("%d",&fnew.num);i=0;//continue;}elsei++;}//经循环对比后,i的值仍和n相等,将新注册的信息加入数组末位s[i].num=fnew.num;printf("请输入起始站:\n");scanf("%s",s[i].start);//读取起始站printf("请输入终点站:\n");scanf("%s",s[i].over);//读取终点站printf("请输入时间:\n");scanf("%s",s[i].time);//读取时间printf("请输入余票数(机票数为0结束输入):\n",m);scanf("%d",&s[i].count);//读取机票数printf("请输入机票票价:\n",m);scanf("%d",&s[i].prize);//读取机票票价m++; //所有航班信息个数// printf("第%d个信息已经输完是否继续?按1-9任意数字继续,按0结束",m);//scanf("%d",&y);printf("是否继续添加航班?是:选1,否:选0;");scanf("%d",&k);if(k==0){save();//将结构体信息存盘system("cls");print();//输出输入的航班信息break;}}}void save()//航班信息保存模块程序{FILE *fp,*fp1;//定义文件指针if((fp=fopen("flight.txt","wb"))==NULL)//打开文件并判断是否出错{printf("创建文件失败!\n\n");//打印出错提示getchar();return;}if((fp1=fopen("howmanyflights.txt","wb"))==NULL)//打开文件并判断是否出错{printf("创建文件失败!\n\n");//打印出错提示getchar();return;}for(i=0;i<m;i++)if(fwrite(&s[i],sizeof(struct air),1,fp)==0)//向文件写入数据,并判断是否出错printf("向文件输入数据失败!\n\n");fprintf(fp1,"%d",m);fclose(fp);//关闭文件fclose(fp1);//关闭文件}void read()//从文件读取航班信息模块{FILE *fp,*fp1;//定义文件指针fp=fopen("flight.txt","r");//system("cls");//清屏if(fp==NULL)//如果当前文件不存在,提示打开文件失败{fp1=fopen("howmanyflights.txt","w+");//以写方式打开fprintf(fp1,"%d",0);//打开用户文件失败,则输入用户个数0到fp1fclose(fp1);printf("\n不存在flight.txt,正在创建!\n");fp=fopen("flight.txt","a");printf("创建完成!\n");system("cls");read();//perror("Open file fail");//getch();}if((fp1=fopen("howmanyflights.txt","rb"))==NULL)//读写方式打开文件,若文件不存在,则m=0{//printf("创建文件失败!\n\n");//打印出错提示m=0;}else{fp1=fopen("howmanyflights.txt","r");fscanf(fp1, "%d",&m);//读取fp1中的用户个数}fclose(fp1);for(i=0;i<m;i++){fread(&s[i],sizeof(struct air),1,fp);//从文件中读取信息}fclose(fp);//关闭文件}void print()//屏幕打印航班信息模块{read();//调用读取文件函数if(m==0)printf("\n\n目前没有航班信息!\n");else{printf("航班信息如下:\n");printf("航班号起始站终点站时间余票数票价\n");for(i=0;i<m;i++){printf(PRINT);//打印信息}}printf("\n请按任意键回车键结束返回主菜单");getchar();getchar();}void paixu()//对所有航班按航班价格排序{int j;struct pai{int no;char name1[20];char name2[20];char time[20];int count;int prize;}p[1];//临时定义结构体,作为排序时的第三变量read();//调用读取信息函数for(j=0;j<(m-1);j++){for(i=0;i<(m-(1+j));i++){if(s[i].prize>s[i+1].prize) //按价格升序排列,p[0]为中间变量{p[0].no=s[i].num;//替换航班号strcpy(p[0].name1,s[i].start);//替换其始站strcpy(p[0].name2,s[i].over);//替换终点站strcpy(p[0].time,s[i].time);//替换时间p[0].count=s[i].count;//替换机票数p[0].prize=s[i].prize;//替换票价s[i]=s[i+1];s[i+1].num=p[0].no;//替换航班号strcpy(s[i+1].start,p[0].name1);//替换其始站strcpy(s[i+1].over,p[0].name2);//替换终点站strcpy(s[i+1].time,p[0].time);//替换时间s[i+1].count=p[0].count;//替换机票数s[i+1].prize=p[0].prize;}}}save();//调用保存函数system("cls");printf("排序后,");print();}void search()//按航班号查询模块{char ii[10];int no,k;read();//调用读取函数do{system("cls");k=0;//每次查找都初始化k为0printf("请输入你要找的航班号:");//打印查询方式菜单scanf("%d",&no);//航班号for(i=0;i<m;i++){if(s[i].num==no)//按航班号判断输出条件{k=1;system("cls");printf("\n查找航班信息成功!\n");printf("航班号起始站终点站时间余票数票价\n");printf(PRINT);//打印信息break;}}no=0;//将航班号重新赋值为0if(k==0){printf("没有您需要的信息\n");}printf("\n是否继续查找?请键入yes或no以回车键结束\n");scanf("%s",ii);}while(strcmp(ii,"yes")==0);//判断结束}void dingpiao()//订票模块{int n;char a[10];search();//调用查询模块do{printf("请输入您要订的机票数以回车键结束:\n");scanf("%d",&n);//读取所订机票数if(n<0){printf("请输入有效的机票数!\n");//判断机票数是否出错break;}if(s[i].count!=0&&s[i].count>=n)//判断是否出错{s[i].count=s[i].count-n;save();//调用保存函数printf("订票成功!\n\n");break;}if(s[i].count<n)//判断是否出错{printf("余票不足,请输入有效的机票数!\n");getchar();}printf("是否继续订票?请输入yes或no以回车键结束:\n");//判断是否继续订票scanf("%s",a);}while(!strcmp(a,"yes"));//判断结束getchar();printf("按ENTER键返回用户主界面。