2021-01-04

#include<stdio.h>  //标准输入、输出头文件
#include<string.h>    //包含字符串函数处理头文件
#include<stdlib.h>     //包含动态存储与释放函数头文件
#define N 100 
 struct air         //定义结构体数组
{
 int num;
 char start[20];
 char over[20];
 char time1[20];
 char time2[20];
 int price;
 int count;
}s[N];
int i;
int m=0;
FILE *fp,*fp1,*fp2;//定义文件指针
#define PRINT "%-d%14s%12s%10s%10s%12d%12d\n",s[i].num,s[i].start,s[i].over,s[i].time1,s[i].time2,s[i].price,s[i].count    //定义输出格式
void input();    //输入航班信息
void print();    //输出航班信息
void save();     //保存航班信息 
void read();     //读取航班信息
void search();   //查找航班信息
void shanchu();  //删除航班信息
void dingpiao(); //订票信息
void tuipiao();  //退票信息
void xiugai();   //修改信息
void subdingpiao();//订票中用来查找相应航班信息
void main(){
   char  j[1];
   printf("                         ---您好,欢迎进入航空订票系统!---  \n"); 
   printf("================================================================================\n");

   do{
      printf("           --------           1.输入航班信息             -------- \n\n"
               "           --------           2.浏览航班信息              -------- \n\n"
      "           --------           3.修改航班信息              -------- \n\n"
      "           --------           4.查找航班信息              -------- \n\n"
      "           --------           5.删除航班信息              -------- \n\n"
      "           --------           6.订票信息                  -------- \n\n" 
         "           --------           7.退票信息                  -------- \n\n"
         "           --------           0.退出                      -------- \n\n");
       printf("================================================================================\n");

       printf("请在0-7中选择以回车键结束:\n");
       scanf("%s",j);
       switch(j[0]){
                 case '1': input();//调用输入模块
                      break;
                 case '2':print();//调用打印模块
                      break;
                 case '3':xiugai();//调用修改模块
                      break;
                 case '4':search();//调用查找模块
                      break;
                 case '5':shanchu();  //调用删除模块
                      break;
                 case '6':dingpiao();//调用订票模块
                      break;
                 case '7':tuipiao();//调用退票模块
                      break; 
                 case '0':;
                      break;
				 
       }
   }while(j[0]!='0');     //判断结束
    printf("谢谢使用,再见!\n");
}//主函数结束
void save()//保存模块程序
{   
    
    if((fp=fopen("航班信息.dat","wb"))==0)//打开文件并判断是否出错  
    {
       printf("创建文件失败!\n\n");//打印出错提示
        getchar();
        return;
    }
    if((fp1=fopen("航班总数.dat","wb"))==0)//打开文件并判断是否出错  
    {
       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;//定义文件指针
     if((fp=fopen("航班信息.dat","rb"))==0)//打开文件,并判断是否出错
     {
         printf("出错,请检查文件是否存在,按任意键返回住菜单");//打印出错提示
         getchar();
     }
     if((fp1=fopen("航班总数.dat","rb"))==0)//打开文件并判断是否出错  
     {
        printf("创建文件失败!\n\n");//打印出错提示
        getchar();
        return;
     }
     fscanf(fp1,"%d",&m);
     fclose(fp1);//关闭文件
     for(i=0;i<m;i++) {
        fread(&s[i],sizeof(air),1,fp);//从文件中读取信息
     }
     fclose(fp);//关闭文件
}
void print()//打印模块
{
     char w[20];
	 int bz=1;
     read();//调用读取文件函数
     printf("航班号  起始城市    终点城市   起飞时间    降落时间     票价       机票数\n");
     for(i=0;i<m;i++)
     {
       printf(PRINT);//打印信息
	   bz=0;
     }
	 if(bz!=0)
	    printf("没有信息!\n");
     printf("请按任意键以回车键结束返回上层菜单:\n");
     scanf("%s",w);
}
  void input()//输入模块程序
{    
	 int n=0;
     char y[20];
     printf("请依次输入航班信息:\n\n");      //打印提示信息
     printf("--------------------------------------------------------------------------\n");
     for(i=0;i<N;i++){
        printf("请输入航班号:\n");  
          scanf("%d",&s[i].num);     //读取航班号
        printf("请输入起始城市:\n");
          scanf("%s",s[i].start);//读取起始城市
        printf("请输入终点城市:\n");
          scanf("%s",s[i].over);//读取终点城市
        printf("请输入起飞时间:\n");
          scanf("%s",s[i].time1);//读取起飞时间
		printf("请输入降落时间:\n");
          scanf("%s",s[i].time2);//读取降落时间
		printf("请输入票价:\n");
		  scanf("%d",&s[i].price);//读取价格
        printf("请输入机票数:\n");
          scanf("%d",&s[i].count);//读取机票数
        n++;
  
        printf("第%d个信息已经输完是否继续?按任意键继续,按no结束",n);
        scanf("%s",y);
        if(strcmp(y,"no")==0){
		   if((fp=fopen("航班信息.dat","ab"))==0)//打开文件并判断是否出错  
		   {
				printf("创建文件失败!\n\n");//打印出错提示
				getchar();
				return;
		    }
		   if((fp1=fopen("航班总数.dat","w+b"))==0)//打开文件并判断是否出错  
		   {
				printf("创建文件失败!\n\n");//打印出错提示
				getchar();
				return;
			}
			for(i=0;i<n;i++)
				if(fwrite(&s[i],sizeof(struct air),1,fp)==0)//向文件写入数据,并判断是否出错
			    	printf("向文件输入数据失败!\n\n");
			fscanf(fp1,"%d",&m);
			if(fscanf(fp1,"%d",&m)==0)
			  m=0;
			m=m+n;
			fprintf(fp1,"%d",m);
			fclose(fp1);//关闭文件
			fclose(fp);//关闭文件
  
           print();//输出输入的航班信息
           break;
        }
     }


} 
void search()//查询模块
{
     char name1[20]	, name2[20];
     char ii[10];
     int no,bz=1,bz1=1;
	 int n;
     do{
        printf("请选择查找方式:\n\n");//打印查询方式菜单
        printf("1.按航班号查找\n\n"
              "2.按起降城市查找\n\n"
			  "0.退出\n\n"
             );
       printf("请在0-2中选择:\n");
       scanf("%d",&n);//读取查找方式 
       read();//调用读取函数
	   if(n==0)
	      break;
       switch(n){
        case 1:
           printf("请输入航班号:\n");
           scanf("%d",&no);//航班号
           for(i=0;i<m;i++){
             if(s[i].num==no){
                printf("航班号  起始城市    终点城市   起飞时间    降落时间     票价       机票数\n");
                printf(PRINT);//打印信息
				bz=0;
				break;
               
             } 
           }
           break; 
           
          
        case 2:
			printf("请输入起始城市的名称:\n");
			scanf("%s",name1);//读取起始城市
            printf("请输入终点城市的名称:\n");
            scanf("%s",name2);//读取终点城市
			printf("航班号  起始城市    终点城市   起飞时间    降落时间     票价       机票数\n");
            for(i=0;i<m;i++){
               if(strcmp(s[i].start,name1)==0&&strcmp(s[i].over,name2)==0){ 
                // printf("\n查找航班信息成功!\n");
                 printf(PRINT);//打印信息
				 bz=0;

                //break;
               }
			 }
             break;
		default:  bz1=0;

        }
        if(bz==0)
		   printf("查找信息成功:\n"
                "是否继续查找?请键入yes或任意键以回车键结束\n");
		
		else
		  if(bz1==0)
		     printf("输入的不是无效号码!\n"
                "是否继续查找?请键入yes或任意键以回车键结束\n");
		   else
		     printf("没有你想要的航班号\n"
		           "是否继续查找?请键入yes或任意键以回车键结束\n");
		bz=1;
		bz1=1;//用来下一次查找;
        scanf("%s",ii);
     }while(strcmp(ii,"yes")==0);//判断结束
}
void shanchu()//删除模块
{
     char name1[20];
     char name2[20];
     char ii[10];
     int no,n,bz=1; 
	 int a=1;
	 //a=m;//当a=m是表示没有删除数;
	 
     do{
        printf("请选择删除以方式回车键结束:\n\n");//打印删除方式菜单
        printf("1.按航班号删除\n\n"
                "2.按起降城市删除\n\n"
                "0.返回\n\n");
        printf("请在0-2中选择以回车键结束:\n");
        scanf("%d",&n);//读取删除方式
        if(n==0)
           break;    //跳出循环
        switch(n){
          case 1:
               printf("请输入航班号:\n");
               scanf("%d",&no);//读取航班号
               read();//调用读取函数
               
               for(i=0;i<m;i++)
                  if(s[i].num==no){
                      for(;i<m-1;i++) 
                        s[i]=s[i+1];//将最所有i后面的信息往前移 
                      m--;
					 a=0;
                  }
               
               break;//跳出循环
          case 2:
               printf("请输入起始城市:\n");
               scanf("%s",name1);//读取起始城市
               printf("请输入终点城市名称:\n");
               scanf("%s",name2);//读取终点城市
               read();//调用读取函数
			   int a;
			   
               for(i=0;i<m;i++){
                    if(strcmp(s[i].start,name1)==0&&strcmp(s[i].over,name2)==0)//判断输入信息是否存在
                    {  
                       for(;i<m-1;i++)     
                          s[i]=s[i+1];
                       m--;
					   a=0;
                    }
               }
               break;//跳出循环
		  default:bz=0;
        }
		 if(a==0)
                 printf("删除成功!\n");
          else 
		    if(bz==0)//当输入无效数字后,还没有进入swtich循环中,所以此时a==m
			   printf("你输入的无效数字!\n");
			else
			   printf("没有这个信息!\n"); 
          printf("是否继续\n");     
          printf("请键入yes或任意键以回车键结束\n");
         scanf("%s",ii);       //读取是否继续信息
         save(); //调用读取函数
		 a=1;
		 bz=1;//以便下一次删除
   }while(strcmp(ii,"yes")==0);  //判断结束
}
 
void subdingpiao(){
   read();
   int j;
   int k=1;
   printf("航班号  起始城市    终点城市   起飞时间    降落时间     票价       机票数\n");
   for(j=0;j<m;j++)
     if(s[i].over==s[j].over&&s[i].start==s[j].start){
	    //printf("给你提供以下参考航班,与你的出发地与目的地相同\n");
		
		printf(PRINT);
		k=0;
	 }
   if(k!=0)
     printf("找不到相应的航班");
    
}
void dingpiao()//订票模块
{
     int n,number;
     char a[10];
	 int bz=1;
      do
      {      read();
             printf("请输入你要订票的航班!\n");
			 scanf("%d",&number);
			 for(i=0;i<m;i++)
			    if(s[i].num==number){
				   printf("航班号  起始城市    终点城市   起飞时间    降落时间     票价       机票数\n");
				   printf(PRINT);
			     
			       printf("请输入您要订的机票数以回车键结束:\n");
				   scanf("%d",&n);//读取所订机票数
				   if(n<0)
			       {
						printf("请输入有效的机票数!\n");//判断机票数是否出错
               
			        }
			       if(s[i].count!=0&&s[i].count>=n)//判断是否出错
				   {
						s[i].count=s[i].count-n;
						save();//调用保存函数
						printf("订票成功!\n\n");
               
               
					}
				   if(s[i].count<n||s[i].count==0)//判断是否出错
				   {
						printf("你的票数太大!以下是给你提供的其他航班。\n");

						subdingpiao();
				    }
		          bz=0;
				  printf("是否继续? 请输入yes或任意键以回车键结束:\n");//判断是否继续订票
				  scanf("%s",a);
				 
				 
				 }
		     if(bz==1){
					printf("未能找到你要的航班\n");
				    printf("是否继续? 请输入yes或任意键以回车键结束:\n");//判断是否继续订票
					scanf("%s",a);
		}
		bz=1;
       }while(!strcmp(a,"yes"));//判断结束
 
}



void tuipiao()//退票模块
{
     int n,number,bz=1;
     char a[10];
     do
     {
         read();
         printf("请输入你要退票的航班!\n");
		 scanf("%d",&number);
			 for(i=0;i<m;i++)
			    if(s[i].num==number){
				   printf("航班号  起始城市    终点城市   起飞时间    降落时间     票价       机票数\n");
				   printf(PRINT);
			     
                   printf("请输入您要退的机票数目:\n");
                   scanf("%d",&n);//输入所退票数
				   if(n<0) //判断票数是否有效
						printf("请输入有效的机票数!\n");
				   else{
						s[i].count=s[i].count+n;
						save(); //调用保存模块
						printf("退票成功!\n\n");
				   }
				   bz=0;
                  printf("是否继续? 请键入yes或任意键以回车键结束:\n");//判断是否继续退票
                  scanf("%s",a);
				}
			if(bz==1){
				   printf("没有查到你要退票的航班");
				   printf("是否继续? 请键入yes或任意键以回车键结束:\n");//判断是否继续退票
                  scanf("%s",a);
			}
	  bz=1;
     }while(!strcmp(a,"yes"));//判断并跳出循环
     //getchar();
}
void xiugai()   //修改模块
{
  struct xiu    //定义结构体 
  {
         int no;
         char name1[20];
         char name2[20];
         char time1[20];
		 char time2[20];
		 int price;
         int count;
   }x[1];
    char j[10];
    int n,bz=1;
    read();//调用读取模块
    do
    {
      printf( "请在0-1中选择\n\n" 
              "1,按航班号修改:\n\n"
            "0,退出: \n\n");
      printf("请选择并以回车键结束:\n");
      scanf("%d",&n);//读取修改方式
      if(n==0)
           break; 
      switch(n){
        case 1:printf("请输入航班号:\n");
               scanf("%d",&x[0].no);//读取航班号
                       for(i=0;i<m;i++)   
                         if(s[i].num==x[0].no)//判断输出条件
                         {  
                            printf("航班号  起始城市    终点城市   起飞时间    降落时间     票价       机票数\n");
                            printf(PRINT);
                            x[0].no=0;            //将结构体中的号为零
                            printf("请输入新的航班号:\n");
                              scanf("%d",&x[0].no);
                              s[i].num=x[0].no;//替换航班号
                            printf("请输入新的起点城市:\n");
                              scanf("%s",x[0].name1);
                              strcpy(s[i].start,x[0].name1);//替换其始站
                            printf("请输入新的终点城市:\n");
                              scanf("%s",x[0].name2);
                              strcpy(s[i].over,x[0].name2);//替换终点站
                            printf("请输入起飞时间:\n");
                              scanf("%s",x[0].time1);
                              strcpy(s[i].time1,x[0].time1);//替换时间
							printf("请输入降落时间:\n");
                              scanf("%s",x[0].time2);
                              strcpy(s[i].time2,x[0].time2);//替换时间
							printf("请输入票价:\n");
							scanf("%d",&x[0].price);
							s[i].price=x[0].price;//替换价格
                            printf("请输入机票数:\n");
                            scanf("%d",&x[0].count);
                            s[i].count=x[0].count;//替换机票数
                            save();//调用保存模块
							bz=0;
                            printf("是否继续?请键入yes或任意键以回车键结束:\n");
                            scanf("%s",j);
						 }
                       if(bz==1){
							printf("未能找到你要的航班\n");
							printf("是否继续? 请输入yes或任意键以回车键结束:\n");//判断是否继续订票
							scanf("%s",j);
					   }
					   bz=1;
                       break;
		 default: printf("请输入有效数字!\n");
                  printf("是否继续?请键入yes或任意键以回车键结束:\n");   
				  scanf("%s",j);   
      }

  }while(strcmp(j,"yes")==0);  //判断结束
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值