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="名",不知为何打印“名字”的时候只打印一个字,找了半天没发现有何不妥,希望有知道的告诉我这是为什么
浙公网安备 33010602011771号