首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

帮忙看看错哪了~(急)编译没错,但是运行不了

2012-05-24 
帮忙看看哪里错了~!(急)编译没错,但是运行不了一、问题描述:航空客运订票的业务活动包括:查询航线、客票预定

帮忙看看哪里错了~!(急)编译没错,但是运行不了
一、问题描述:
航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
二、基本要求:
(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、成员定额、余票量、已订票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量);
(2)作为示意系统,全部数据可以只放在内存中;
(3)系统能实现的操作和功能如下:
①查询航线:根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
②承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需重新询问客户要求。若需要,可登记排队候补;
③承办退票业务:根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为它办理订票手续,否则依次询问其他排队候补的客户。
三、测试数据:
自行指定。
四、实现提示:
两个客户名单可分别由线性表和队列实现。为查找方便,已订票客户的线性表应按客户姓名有序,并且,为插入和删除方便,应以链表作存储结构。由于预约人数无法预计,队列也应以链表作存储结构。整个系统需汇总各条航线的情况登陆在一张线性表上,由于航线基本不变,可采用顺序存储结构,并按航班有序或按终点站名有序,每条航线是这张表上的一个记录,包含上述8个域、其中成员名单域为指向成员名单链表的头指针,等候替补的客户名单域为分别指向队头和队尾的指针。
五、程序源代码:
六、
 #include <stdio.h>
#include <string.h>
#define AIRLINENUM 5 //航线数量
typedef struct Waitertype
{ char name[10]; //等待订票的客户的名字
  int neednum; //该客户所需票数
  struct Waitertype *next;
}Waitertype;
typedef struct
{
  Waitertype *front;
  Waitertype *rear;
}WaitQueue;
typedef struct
{ char *planenum; //航班号
  char *endstation; //终点站名
  char *weekday; //飞行周日
  int seatnum; //飞机乘员定额
  int remainnum; //余票数
  int waiternum; //等待订票的客户数量
  WaitQueue Q; //等待订票的客户队列
}AirlineInfor; //航线信息

//*****************************************************************

void InitAirline(AirlineInfor airline[]) //初始化
{ airline[0].planenum="EA391";
  airline[0].endstation="shanghai";
  airline[0].weekday="Monday";
  airline[0].seatnum=100;
  airline[0].remainnum=5;
  airline[0].waiternum=0;
  airline[0].Q.front=airline[0].Q.rear=(Waitertype*)malloc(sizeof(Waitertype));
  airline[1].planenum="EA392";
  airline[1].endstation="beijing";
  airline[1].weekday="Tuesday";
  airline[1].seatnum=100;
  airline[1].remainnum=3;
  airline[1].waiternum=0;
  airline[1].Q.front=airline[1].Q.rear=(Waitertype*)malloc(sizeof(Waitertype));
  airline[2].planenum="EA393";
  airline[2].endstation="fuzhou";
  airline[2].weekday="Wednesday";
  airline[2].seatnum=100;
  airline[2].remainnum=0;
  airline[2].waiternum=0;
  airline[2].Q.front=airline[2].Q.rear=(Waitertype*)malloc(sizeof(Waitertype));
  airline[3].planenum="EA394";
  airline[3].endstation="shanghai";
  airline[3].weekday="Thursday";
  airline[3].seatnum=100;
  airline[3].remainnum=0;
  airline[3].waiternum=0;
  airline[3].Q.front=airline[3].Q.rear=(Waitertype*)malloc(sizeof(Waitertype));
  airline[4].planenum="EA395";
  airline[4].endstation="tianjin";
  airline[4].weekday="Friday";
  airline[4].seatnum=100;
  airline[4].remainnum=1;
  airline[4].waiternum=0;
  airline[4].Q.front=airline[4].Q.rear=(Waitertype*)malloc(sizeof(Waitertype));
}/*InitAirline*/

//*****************************************************************
void AskAirline(AirlineInfor airline[]) //查询模块
{ int i,cmd,flag=0;
  char *endstation= NULL;
  printf("Please enter where you want to go:");
  scanf("%s",endstation); //输入目的地
  printf("\n");
  printf("You can take these planes:\n"); /*列出余票信息,包含:航班号,飞行周日以及余票量*/
  for(i=0;i<AIRLINENUM;i++)
  if(!strcmp(endstation,airline[i].endstation))


  { flag=1;
  printf("Plane %s,take off on %s and remain %d tickets\n",airline[i].planenum,airline[i].weekday,airline[i].remainnum);
  }
  if (i>=AIRLINENUM)
  { if(flag==0)
printf("Without the ticket you want!\n");
  printf("1-->Continue,2-->End this service:");
  scanf("%d",&cmd);
  printf("\n");
  switch(cmd)
  { case 1:
  AskAirline(airline); //继续查询
  break;
  case 2: 
printf("You have exited this service\n");
  break;
  default:
  printf("You have enter a wrong command!\n");
  break;
  }
  }/*if*/
}/*AskAirline*/
//*****************************************************************
void InQueue(WaitQueue *Q,int neednum) //排队等票
{
  Waitertype *p1,*p2;
  p1=(Waitertype*)malloc(sizeof(Waitertype));
  printf("Please enter your name:");
  scanf("%s",p1->name);
  p1->neednum=neednum;
  p1->next=NULL;
  p2=Q->rear; //以下3行用于插入新的客户排队等票
  p2->next=p1;
  Q->rear=p1;
}
void RegisterAirline(AirlineInfor airline[]) //订票模块
{ char *planenum=NULL; //所要预定机票的航班号
  int neednum; //所需数量
  int i=0,num=0,cmd1,cmd2,cmd3;
  printf("Please enter the NO.:");
  scanf("%s",planenum);
  printf("\n");
  printf("Please enter quantity you need :");
  scanf("%d",&neednum);
  printf("\n");
  while(strcmp(planenum,airline[i].planenum)&&(i<AIRLINENUM))
  i++;
  if(i>=AIRLINENUM) //错误处理
  { printf("Without the ticket you want!\n");
  printf("1-->Continue,2-->End this service:");
  scanf("%d",&cmd1);
  printf("\n");
  switch(cmd1)
  { case 1:
  RegisterAirline(airline);break;
  case 2:
  printf("You have exited this service!\n");
  break;
  default:
  printf("You have enter a wrong command!\n");
  break;
  }
  }/*if*/
  else
  { num=airline[i].remainnum;
loop: if(neednum<=airline[i].remainnum) //订票成功
  {
  airline[i].remainnum=airline[i].remainnum-neednum;
  printf("Successfully registering!\n");
  }
  else
  { if(num==0) //没有余票
  { printf("Without any tickets that you want!\n");
  printf("1-->Wait for tickets,2-->End this service:\n");
  scanf("%d",&cmd2);
  printf("\n");
  switch(cmd2)
  { case 1:
  airline[i].waiternum++;
InQueue(&airline[i].Q,neednum);
  printf("When we have enough tickets,we'll inform you!\n");
  break;
  case 2:
  break;
  default:
  printf("You have enter a wrong command!\n");
  break;
  }/*switch*/
  }/*if*/
  else
  {


  printf("Without enough tickets!\n"); //客户需要机票数量超出余票数量
  printf("1-->Reduce the quality,2-->End this service:");
  scanf("%d",&cmd3);
  printf("\n");
  switch(cmd3)
  { case 1:
  printf("Please reenter the quantity you need :");
  scanf("%d",&neednum);
  printf("\n");
  goto loop;
  case 2:
  break;
  default:
  printf("You have enter a wrong command!\n");
  break;
  }/*switch*/
}/*else*/
  }/*else*/
  }/*else*/
}/*RegisterAirline*/

//*****************************************************************
void SearchQueue(AirlineInfor airline[],int i) /*为退票而多出的票寻找符合条件的等待客户办理订票*/
{
  int remainnum=0,j,num=0;
  WaitQueue Q;
  Waitertype *p1,*p3;
  remainnum=airline[i].remainnum;
  Q=airline[i].Q;
  num=airline[i].waiternum;
  p3=p1=Q.front;
  p1=p1->next;
  for(j=1;j<=num;j++) //为符合条件的等待客户办理订票
  {
  if(p1->neednum<=remainnum)
{ printf("%s get %d tickets\n",p1->name,p1->neednum);
airline[i].remainnum-=p1->neednum;
if(p1==Q.rear)
Q.rear=Q.front; //如果P1刚好也是队尾结点,这使队列为空队列
else
p3->next=p1->next;
  free(p1);
  p1=p3;p1=p1->next;
  } /*释放P1指针所指的结点,并把队头指针的next指向p1的next*/
  else
{
if(p1==Q.rear)
return;
else
{ p3->next=p1->next;
Q.rear->next=p1;p1->next=NULL;
Q.rear=p1;p1=p3;p1=p1->next;
} /*如果p1!=Q.rear,把P1所指的结点插入到队列的队尾,队头指针的next指向P1的next*/
  }
  }
}


void RebackAirline(AirlineInfor airline[])/*退票模块,成功返回1,失败或放弃返回0*/
{ char *planenum=NULL;/*所退机票的航班号*/
  int i=0,j,cmd1,cmd2,backnum;
  printf("Please enter the NO. of the plane:");
  scanf("%s",planenum);
  printf("\n");
  printf("Please enter the quantity you want to reback:");
  scanf("%d",&backnum);/*所退票数*/
  printf("\n");
  while(strcmp(planenum,airline[i].planenum)&&(i<AIRLINENUM))
  i++;
  if(i<AIRLINENUM)/*退票成功*/
  { airline[i].remainnum+=backnum;
  printf("Successfully reback!\n");
  if(airline[i].waiternum)
  SearchQueue(airline,i);/*查询待票客户*/
  }/*if*/
  else
  { printf("You have enter a wrong NO.\n");
  printf("1-->Continue this service,2-->End this service:");
  scanf("%d",&cmd2);
  printf("\n");
  switch(cmd2)
  { case 1:
  RebackAirline(airline);break;
  case 2:
  printf("Unsuccessfully reback!\n");
  break;
  default:
  printf("You have enter a wrong command!\n");
  break;
  }
  }/*else*/
}/*RebackAirline*/

//*****************************************************************

void main()
{ AirlineInfor airline[AIRLINENUM]; //航线数量
  int cmd;
  InitAirline(airline); //初始化
  printf("Welcome to use this system!!!\n");


  do
  { printf("1-->Ask for information,2-->Register tickets,3-->Reback tickets:0-->Exit:");
  scanf("%d",&cmd);
  printf("\n");
  switch(cmd)
  {
  case 0:
  printf("Thanks for use this system!\n");
  break;
  case 1:
  AskAirline(airline);/*查询模块*/
  break;
  case 2:
  RegisterAirline(airline);/*订票模块*/
  break;
  case 3:
  RebackAirline(airline);/*退票模块*/
  break;
  default:
  printf("You have enter a wrong command!\n");
  break;
  }/*switch*/
  }while(cmd);
}/*main*/


[解决办法]
错误1:
AskAirline
RegisterAirline
RebackAirline
函数中获取键盘输入字符的缓冲区,你使用的只是一个空指针没有指向存在的内存空间:
改为:char szBuffer[32]={0}; 
scanf("%s",szBuffer);这时候szBuffer才是你想要获取的键盘输入字符。

错误2:
while(strcmp(planenum,airline[i].planenum)&&(i<AIRLINENUM)) i++;
这句应该改成:
while((i<AIRLINENUM)&&strcmp(planenum,airline[i].planenum)) i++;
检查条件是从左至右,按照你那样写当i=5的时候已经数组越界。

热点排行