user-0 提问: 一编程练习已经写出，请C达人看看如何优化更好。

回复:
user: user-1
content: 楼主真的是高二学生的话：  高中生还是集中精力准备上大学吧。  希望你不要犯类似 “早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！”  这种低级错误。

user: user-2
content: 看了一下，应该没什么速度问题，谈不上什么优化，就风格谈谈 1. human arr[12] 初始化在后面readfile中，前面就没必要了 2. ch=getchar();后面有很多处理，用switch吧，if太多了，最好用函数名来区别，就不需要看注释了 3. 魔法数字12，就是数组的长度，想其它方法避免，万一数组长度改为20，不要一条条去检查。

user: user-3
content: 引用 14 楼 onlysee8 的回复:你那C选项，是脱裤子放屁。每个功能块完成，都自动显示菜单了，还需要这个干嘛。show里面的排版都不会弄我也不用再学下去了。不过赵大师把括号弄整齐了，运行的确快了很多  [quote=引用 12 楼 fly_dragon_fly 的回复:] 看了一下，应该没什么速度问题，谈不上什么优化，就风格谈谈 1. human arr[12] 初始化在后面readfile中，前面就没必要了 2. ch=getchar();后面有很多处理，用switch吧，if太多了，最好用函数名来区别，就不需要看注释了 3. 魔法数字12，就是数组的长度，想其它方法避免，万一数组长度改为20，不要一条条去检查。  这位兄台说得中肯，昨晚我已经发现readfile的问题，而且把所有功能块修改为子函数形式。并把数组扩为二维， 在实际中某个类型的飞机，在公司里会有很多架，或者需要执行多个航班的情况。 改进为全动态分配内存，可以保存和分配无限多个航班与座位。在1000×1000的数组中测试运行稳定良好。 改进了几次容错机制，本人对这种习题都是按实际工程去考虑。当然是在自己学到的东西中尽力做到。 关于魔法12，用define一个常量就可，这只是习题。[/quote]  define 不是好的办法。  引用 2 楼 onlysee8 的回复:[quote=引用 1 楼 sholber 的回复:] 无可奉告。ffffff  哈，你自己也不懂[/quote] 这不是问问题的语气。

user: user-0
content: 引用 12 楼 fly_dragon_fly 的回复:看了一下，应该没什么速度问题，谈不上什么优化，就风格谈谈 1. human arr[12] 初始化在后面readfile中，前面就没必要了 2. ch=getchar();后面有很多处理，用switch吧，if太多了，最好用函数名来区别，就不需要看注释了 3. 魔法数字12，就是数组的长度，想其它方法避免，万一数组长度改为20，不要一条条去检查。  另外关于switch，我也看了些国外的C教学文章，如果是函数指针方式调用推荐，如果是函数体用if。不知道恰当与否！

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:楼主真的是高二学生的话：  高中生还是集中精力准备上大学吧。  希望你不要犯类似 “早知道吃完第七个包子就饱了，我为什么还要吃前六个包子呢？！”  这种低级错误。  上大学是必须滴，这只是爱好。我看了半年才看了10来章。

user: user-0
content: 你那C选项，是脱裤子放屁。每个功能块完成，都自动显示菜单了，还需要这个干嘛。show里面的排版都不会弄我也不用再学下去了。不过赵大师把括号弄整齐了，运行的确快了很多 引用 12 楼 fly_dragon_fly 的回复:看了一下，应该没什么速度问题，谈不上什么优化，就风格谈谈 1. human arr[12] 初始化在后面readfile中，前面就没必要了 2. ch=getchar();后面有很多处理，用switch吧，if太多了，最好用函数名来区别，就不需要看注释了 3. 魔法数字12，就是数组的长度，想其它方法避免，万一数组长度改为20，不要一条条去检查。  这位兄台说得中肯，昨晚我已经发现readfile的问题，而且把所有功能块修改为子函数形式。并把数组扩为二维， 在实际中某个类型的飞机，在公司里会有很多架，或者需要执行多个航班的情况。 改进为全动态分配内存，可以保存和分配无限多个航班与座位。在1000×1000的数组中测试运行稳定良好。 改进了几次容错机制，本人对这种习题都是按实际工程去考虑。当然是在自己学到的东西中尽力做到。 关于魔法12，用define一个常量就可，这只是习题。

user: user-1
content: 我的语气传染自2楼。

user: user-1
content: 58: } else if(ch=='c') {//show alphabetical list of seats 59:             printf("TODO\n"); 60:             show(); 这几行是我加的，楼主看出来了吗？

user: user-0
content: 拿一个半成品出来炫耀？  你也别装什么大尾巴狼，不就是早接触这东西？假以时日谁比谁牛还未必。

user: user-0
content: [quote=引用 4 楼 zhao4zhong1 的回复:] 拿一个半成品出来炫耀？ 赵老师你的话就有点过了，这是C perimer plus中的一个编程练习。 小菜只是个高二学生，买了本书自学，全出于爱好。没系统学过各方面的知识，只是想在论坛，得到各位的指点。 看自己思路的短板在哪。知道你很牛，但也不必言出尖酸刻薄。你不指点没关系，请不要用这种言语来自污清誉。

user: user-1
content: 拿一个半成品出来炫耀？ #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h> struct name {     char fn[30];     char ln[30]; }; struct human {     char ch[20];     bool bol;//false:未售，true:已售     struct name fm; }; void writefile(const struct human pt[],int z); void show(void); void read_file(struct human *ar,int x); int main(void) {     int i,tot,ch;     char temp[20];     struct human arr[12]= {         {.ch= "1-A",.bol=false,{"",""}},         {.ch= "2-B",.bol=false,{"",""}},         {.ch= "3-C",.bol=false,{"",""}},         {.ch= "4-D",.bol=false,{"",""}},         {.ch= "5-E",.bol=false,{"",""}},         {.ch= "6-F",.bol=false,{"",""}},         {.ch= "7-G",.bol=false,{"",""}},         {.ch= "8-H",.bol=false,{"",""}},         {.ch= "9-I",.bol=false,{"",""}},         {.ch="10-J",.bol=false,{"",""}},         {.ch="11-K",.bol=false,{"",""}},         {.ch="12-L",.bol=false,{"",""}},     };      show();     while(1) {         read_file(arr,12);         fflush(stdin);         ch=getchar();         if       (ch=='a') {//统计未售机票数             for(i=0,tot=0;i<12;i++)                 if(arr[i].bol==false)                     tot++;             printf("%d\n",tot);             show();         } else if(ch=='b') {//显示空位列表             for(i=0;i<12;i++)                 if(arr[i].bol==false) {                     printf("%4s ",arr[i].ch);                     if((i+1)%4==0)                         printf("\n");                 } else {                     printf(" *** ");                     if((i+1)%4==0)                         printf("\n");                 }             show();         } else if(ch=='c') {//show alphabetical list of seats             printf("TODO\n");             show();         } else if(ch=='d') {//分配客户预订座位             while(1) {//可以多个预订                 fflush(stdin);                 gets(temp);                 if(temp[0]=='\0') break; //按下回车结束预订步骤！                 for(i=0;i<12;i++) {                     if(strcmp(temp,arr[i].ch)==0) {//遍历成员，定位到某一座号                         if(arr[i].bol==false) {//如果未售出                             arr[i].bol=true;//赋为售出                             gets(arr[i].fm.fn);//输入名                             gets(arr[i].fm.ln);//输入姓                             break;//跳出for,到外层继续等待预订输入                         }                         printf("The seat have  been sale\n");//如果已售出则给出提示后跳出for                         break;                     }                 }             }             writefile(arr,12);//保存到文件中             show();         } else if(ch=='e') {//删除座位             while(1) {//可以删除多个                 fflush(stdin);                 gets(temp);                 if(temp[0]=='\0') break;                 for(i=0;i<12;i++) {                     if(strcmp(temp,arr[i].ch)==0)                         arr[i].bol=false;                 }             }             writefile(arr,12);             show();         } else if(ch=='f') {//结束程序             break;         } else {             printf("wrong choose (a,b,c,d,e,f)is right\n");         }     }     return 0; } void show(void) {     printf(         "To choose a funtion tnter its letter lable:\n"         "  a) show number of empty seats\n"         "  b) show list of empty seats\n"         "  c) show alphabetical list of seats\n"         "  d) assign a customer to a seat assignment\n"         "  e) delet a seat assignment\n"         "  f) quit\n"     );     return; } void read_file(struct human * ar,int x) {     FILE *fp;      int k=0;     if((fp=fopen("jp.txt","a+b"))==NULL) {         printf("cant open file\n");         exit(1);     }     rewind(fp);     while (k<x && fread(ar+k,sizeof(struct human),1,fp)==1) k++;     fclose(fp); } void writefile(const struct human pt[],int z) {     int i;     FILE *fp1;      if((fp1=fopen("jp.txt","w+b"))==NULL) {         printf("cant write file\n");         exit(2);     }     for(i=0;i<z;i++) fwrite(&pt[i],sizeof(struct human),1,fp1);     fclose(fp1); }

user: user-4
content: 不是达人，没啥想法 不过，c那里多个空格

user: user-5
content: struct human arr[12]={{"1-A"},{"2-B"},{"3-C"},\                                     {"4-D"},{"5-E"},{"6-F"},\                                     {"7-G"},{"8-H"},{"9-I"},\                                     {"10-J"},{"11-K"},{"12-L"}};

user: user-6
content: 高二？ 是对还是错....

user: user-1
content: 楼主放下语气问题暂且不说（这个我不爱听），能说说我优化了哪些方面吗？（这个我爱听）。

user: user-0
content: 引用 1 楼 sholber 的回复:无可奉告。ffffff  哈，你自己也不懂

user: user-5
content: 无可奉告。ffffff