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

lcz102 2012-05-21 11:34:17
一、 问题描述:
航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
二、 基本要求:
(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*/
...全文
94 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcz102 2012-05-22
  • 打赏
  • 举报
回复
按你说改了之后还是不是呀!
e3internet 2012-05-22
  • 打赏
  • 举报
回复
修改好了,代码拷贝到你的工程:

#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[32]={0};
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[32]={0}; //所要预定机票的航班号
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((i<AIRLINENUM)&&strcmp(planenum,airline[i].planenum))
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[32]={0};/*所退机票的航班号*/
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((i<AIRLINENUM)&&strcmp(planenum,airline[i].planenum))
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*/
e3internet 2012-05-21
  • 打赏
  • 举报
回复
错误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的时候已经数组越界。

lcz102 2012-05-21
  • 打赏
  • 举报
回复
不要呀!这是我课程设计的作业,但是编译成功,就运行不了!求各位大哥帮帮忙!!
  • 打赏
  • 举报
回复
这么长 懒得看

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧