C语言-C primer 6th第十四章第十题:简陋的航班系统

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <ctype.h>
  5 #include <math.h>
  6 typedef struct{//类型定义another变量为该结构原型
  7   char number;
  8   int ed;
  9   char fn[20];
 10   char ln[20];
 11 }another;
 12 typedef struct{
 13   int airplane;
 14   another cust[12];
 15 }worker;
 16 int EmptySeats(worker *,int );//显示空座位数,接受int类型变量来判断是否打印
 17 char * ListOfEmptySeats(worker*,int);//空座位列表,返回一个空座位号列表
 18 void AlphabetSeats(worker*);//显示已定座位信息
 19 void Signment(worker*);//预定座位
 20 void Delete(worker*);//删除座位
 21 int check(char *,char);//检查座位号是否属于空座位?返回座位已被预订:返回空座位数组大小
 22 void showmenu(worker*);//显示二级菜单
 23 void main(void){
 24   worker airplanes[4];//四次航班
 25   for(int a=0;a<4;a++)
 26     for(int b=0;b<12;b++){//航班信息初始化
 27       airplanes[a].cust[b].number=(char)(b+65);//座位号A~l
 28       airplanes[a].cust[b].ed=0;//是否被预定
 29     }
 30   worker *ptr[4];//worker结构类型指针
 31   ptr[0]=&airplanes[0];//获取对应的航班信息
 32   ptr[1]=&airplanes[1];
 33   ptr[2]=&airplanes[2];
 34   ptr[3]=&airplanes[3];
 35   char c;
 36   airplanes[0].airplane=102;//航班号
 37   airplanes[1].airplane=311;
 38   airplanes[2].airplane=444;
 39   airplanes[3].airplane=519;
 40   do{
 41     printf("请选择你要乘坐的航班\nA:102\nB:311\nC:444\nD:519\nQ:退出");
 42     setbuf(stdin, NULL);//清空缓冲区
 43     c=getchar();
 44     setbuf(stdin, NULL);//清空缓冲区
 45     switch (toupper(c)) {//弹出对应菜单
 46       case 'A':showmenu(ptr[0]);break;
 47       case 'B':showmenu(ptr[1]);break;
 48       case 'C':showmenu(ptr[2]);break;
 49       case 'D':showmenu(ptr[3]);break;
 50     }
 51   }while(tolower(c)!='q');
 52 }
 53 int EmptySeats(worker *p,int x){//返回空座位数
 54   int a,b;
 55   for(a=0,b=0;b<12;b++){
 56     if(p->cust[b].ed==0)
 57     a++;
 58   }
 59   if(x)
 60   printf("共有%d个空座位\n",a);
 61   return a;
 62 }
 63 char * ListOfEmptySeats(worker *p,int x){//返回空座位名单
 64   int a,b;
 65   char *ptr=(char *)malloc((x+1)*sizeof(char));//分配空座位数组的大小
 66   for(a=0,b=0;a<12;a++){
 67     if(p->cust[a].ed==0)
 68     {
 69       printf("%c ",p->cust[a].number);
 70       ptr[b]=p->cust[a].number;
 71       b++;
 72     }
 73   }
 74   ptr[b]='\0';
 75   return ptr;//返回空座位列表
 76 }
 77 void Signment(worker *p){//预定座位
 78   char ch;
 79   int sigal;
 80   printf("请输入你想预定的座位号\n");
 81   ch=getchar();
 82   sigal=check(ListOfEmptySeats(p,EmptySeats(p,0)),toupper(ch));//如果座位为空返回座位下标
 83   if(sigal<13)
 84   {
 85     printf("预定成功!\n");
 86     p->cust[sigal].ed=1;
 87   }
 88   else
 89   {
 90   printf("很抱歉,该座位已被预订.\n");
 91   return;
 92   }
 93   printf("请输入您的姓:\n");
 94   scanf("%s",p->cust[sigal].fn);
 95   printf("请输入您的名:\n");
 96   scanf("%s",p->cust[sigal].ln);
 97 }
 98 void Delete(worker *p){
 99   printf("请输入您想删除的座位\n");
100   char ch=getchar();
101   if((check(ListOfEmptySeats(p,EmptySeats(p,0)),ch))==13)//如果座位已被预定
102   {
103     p->cust[((int)ch)-65].ed=0;
104     printf("删除成功!\n");
105   }
106   else
107   printf("该座位已是空座位!\n");
108 }
109 int check(char *ptr,char a){//检查座位是否被预定
110   int x=0;
111   while(*ptr)
112   if(*ptr++!=a)
113   x++;
114   else
115   return x;//返回被预定的座位下标
116   return 13;
117 }
118 void AlphabetSeats(worker*p){
119   for(int a=0;a<12;a++)
120     if(p->cust[a].ed==1)
121       printf("%c号座位已被%s%s预定\n",p->cust[a].number,p->cust[a].fn,p->cust[a].ln);
122 }
123 void showmenu(worker *ptr){
124   char c;
125   do{
126     printf("键入以下按钮选择功能:\na:显示空座位数\nb:显示空座位列表\nc:显示已被预订座位信息\nd:分配座位\ne:删除座位\nf:退出当前菜单\n");
127     setbuf(stdin, NULL);
128     c=getchar();
129     setbuf(stdin, NULL);
130     switch(tolower(c)){
131       case 'a':EmptySeats(ptr,1);break;
132       case 'b':ListOfEmptySeats(ptr,EmptySeats(ptr,0));break;
133       case 'c':AlphabetSeats(ptr);break;
134       case 'd':Signment(ptr);break;
135       case 'e':Delete(ptr);break;
136       case 'f':return;
137       default:break;
138     }
139   }while(tolower(c)!='f');
140 }

目前已知的问题是不知为何,fn="姓",ln="名",不知为何打印“名字”的时候只打印一个字,找了半天没发现有何不妥,希望有知道的告诉我这是为什么

posted @ 2020-04-30 14:19  四字又名  阅读(174)  评论(0)    收藏  举报