69,377
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 10
#define MEMBER 4
#define SEATS 12
#define EMPTY 0
#define TAKEN 1
struct planestats
{
int num;
int status;
char fname[LEN];
char lname[LEN];
};
void list_assign(struct planestats pl[SEATS]);
int main()
{
struct planestats plane[MEMBER][SEATS]; //MEMBER代表航班,SEATS代表每个航班的座位
char choice;
int i,j;
int member,result;
FILE *fp;
size_t size = sizeof(struct planestats);
if((fp = fopen("air.txt","rb")) == NULL)
for(i=0; i<MEMBER; i++)
for(j=0; j<SEATS; j++)
{
plane[i][j].status = EMPTY;
plane[i][j].num = j+1;
}
else
{
for(i=0; i<MEMBER; i++)
fread(plane,size*4,SEATS,fp);
fclose(fp);
}
while((member = getmain()) != 5) //选择航班
{
result = getnum(member);
while((choice = getmenu()) != 'f')
{
switch(choice)
{
case 'a':
printf("航班: %d\n",result);
printf("空座位数: %d\n",count(plane[member-1]));
break;
case 'b':
printf("航班: %d\n",result);
show_empties(plane[member-1]);
break;
case 'c':
printf("航班: %d\n",result);
list_assign(plane[member-1]); /*问题*/
break;
case 'd':
printf("航班: %d\n",result);
assign_seat(plane[member-1]);
break;
case 'e':
printf("航班: %d\n",result);
delete_seat(plane[member-1]);
break;
}
}
}
if((fp = fopen("air.txt","wb")) == NULL)
{
printf("文件打不开\n");
exit(1);
}
else
{
fwrite(plane,size*4,SEATS,fp);
fclose(fp);
}
return 0;
}
void list_assign(struct planestats pl[SEATS]) //座位按名排序(lname)
{
if(count(pl) == SEATS)
printf("没有订座\n");
else
{
int i;
struct planestats *ps[SEATS];
ps = pl;
/*这有错,说 cannot convert from 'struct planestats []' to 'struct planestats *[12]'
这道题首先从main函数选择航班,确定数组起始地址,也就是哪个航班,然后传到函数里,
list_assign(plane[member-1]); 相当于这个航班的所有座位值传过来,我在函数形参里用
struct planestats pl[SEATS]接收,然后又定义了一个指针数组struct planestats *ps[SEATS],
用ps = pl去引用传来的值,我的想法是用指针引用去比较,用指针排序,如果用数组比较,会改变原来的数据,
但报错信息是类型不匹配,不知哪错了
*/
int top,search;
struct planestats *temp;
for(top=0; top<SEATS-1; top++)
for(search=top+1; search<SEATS; search++)
if(strcmp(ps[top]->lname,ps[search]->lname)>0)
{
temp = ps[top];
ps[top] = ps[search];
ps[search] = temp;
}
printf("订座信息:\n");
for(i=0; i<SEATS; i++)
if(ps[i]->status == TAKEN)
printf("%d %s %s\n",ps[i]->num,ps[i]->fname,ps[i]->lname);
}
}