2 u012987259 u012987259 于 2014.01.01 16:50 提问

c语言 火车票管理系统 求解答

运行后不能添加,删除,修改,查询班次到文件 可是文件是已经建好有数据的,查询时只显示一条然后就非正常退出了,我怀疑是最后链表做的有问题函数read()可是就是找不到哪错了,希望有哪位朋友可以解答一下,
#include
#include
#include
#include
#include
#include
typedef struct Tickets
{
char num;
char time[8];
char starts[8];
char ends[8];
char gotime[8];
int full;
int sold;
float price;
struct Tickets *next;
}Ticket,*train;
train head,tickets;
struct Information
{
char assis_acc[10];
char assis_pas[6];
}inf;
char flag;
char *invent="火车票管理系统vision:copy2013by7815组\n";

void Delay(int time);
void load();
void admin_field();
void route_manage();
void Add();
void Delete();
void Modify();
void Check();
void Count_sale();
void save();
void Assistor_Fild();
void protect();
void M_information();
void sale();
void station();
void Number();
void book();
void t_return();
void printone(train p);
char * systemtime();
void gotoxy(int x,int y);
void renew();
train read();
/*****************主函数*********************/
int main(void)
{

head=(train)malloc(sizeof(Ticket));
head=read();
load();

/****************函数:延时********************/
void Delay(int time)
{
int i,j,k;
for(i=time;i;i--)
for(j=1000;j;j--)
for(k=100;k;k--);
}
/****************函数:登陆********************/
void load()
{

char ch,admin_acc[6]="admin",admin_pas[6]="12345";
char acc[6],pas[6];FILE *fp;
gotoxy(20,10);
printf("账户:");
gotoxy(20,11);
printf("密码:\n");
gotoxy(25,20);
puts(invent);
gotoxy(25,10);
scanf("%s",acc);

/**********账户判断************************/
if(!strcmp(acc,admin_acc))
flag='A';
else
{
if((fp=fopen("information","rb"))==NULL)
{printf("文件打开出错");exit(0);}
fread(&inf,sizeof(struct Information),1,fp);
if(!strcmp(inf.assis_acc,acc))flag='S';
else
{
printf("账户不存在!");Delay(8000);system("cls");
load();
}
fclose(fp);
}
/****************密码判断*****************/
ch=getch();
if(ch==9)
{
gotoxy(25,11);
scanf("%s",pas);
}
switch(flag)
{
case 'A':{
while(strcmp(pas,admin_pas)>0||strcmp(pas,admin_pas) {printf("密码错误,请重新登陆!!\n");Delay(8000);system("cls");load();}
system("cls");admin_field();break;
}
case 'S':{
if((fp=fopen("information","rb"))==NULL)
{printf("文件打开出错");exit(0);}
fread(&inf,sizeof(struct Information),1,fp);
while(strcmp(pas,inf.assis_pas)>0||strcmp(pas,inf.assis_pas) {printf("密码错误,请重新登陆!!");Delay(8000);system("cls");load();}
fclose(fp);
system("cls");Assistor_Fild();break;
}
}
}
/****************函数:管理员菜单********************/
void admin_field()
{
char ch;
gotoxy(14,2);
puts("========================================");
gotoxy(20,3);puts("1->班次管理\n");
gotoxy(20,4);puts("2->浏览班次\n");
gotoxy(20,5);puts("3->销售统计\n");
gotoxy(20,6);puts("0->返 回\n");
gotoxy(14,7);
puts("========================================");
gotoxy(25,20);
puts(invent);
gotoxy(14,8);
printf("请选择功能:");getchar();
ch=getchar();
switch(ch)
{
case '1':system("cls");route_manage();break;//进入班次管理
case '2':system("cls");Check();break;//进入浏览班次
case '3':system("cls");Count_sale();break;//进入销售统计
case '0':system("cls");load();break;//进入登陆页面
}
}
/****************函数:班次管理主界面********************/
void route_manage()
{
char choice;
gotoxy(14,2);puts("===================================");
gotoxy(20,3);puts("1->添加班次\n");
gotoxy(20,4);puts("2->删除班次\n");
gotoxy(20,5);puts("3->修改班次\n");
gotoxy(20,6);puts("4->查询班次\n");
gotoxy(20,7);puts("5->保 存\n");
gotoxy(20,8);puts("0->返 回\n");
gotoxy(14,9);puts("===================================");
gotoxy(25,20);puts(invent);gotoxy(14,10);printf("请选择功能:");
choice=getchar();
switch(choice)
{
case '1':system("cls");Add();break;//进入添加班次
case '2':system("cls");Delete();break;//进入删除班次
case '3':system("cls");Modify();break;//进入修改班次
case '4':system("cls");Check();break;//进入查询班次
case '5':system("cls");save();break;//保存修改内容
case '0':system("cls");admin_field();break;//退回到管理员主页面
default:system("cls");route_manage();break;
}
}
/****************函数:班次管理:添加班次********************/
void Add()
{
train q;char ch='y';FILE fp;
fopen("train_information","ab");
while(ch=='y')
{
q=(train)malloc(sizeof(Ticket));
printf("请输入车次:");getchar();
scanf("%c",&q->num);
printf("请输入发车时间(00:00):");
scanf("%s",q->time);
printf("请输入始发站:");
scanf("%s",q->starts);
printf("请输入终点站:");
scanf("%s",q->ends);
printf("请输入全程时间(00:00):");
scanf("%s",q->gotime);
printf("请输入满载量:");
scanf("%d",&q->full);
printf("请初始化售票数为零:");
scanf("%d",&q->sold);
printf("请输入票价:");
scanf("%f",&q->price);
q->next=NULL;
fp=fopen("train_information","ab");
fwrite(q,sizeof(struct Tickets),1,fp);
printf("添加成功!");
free(q);
printf("按任意键返回班次管理页面...");
getchar();
ch=getchar();
}
system("cls");route_manage();
}
/
***************函数:班次管理:删除班次********************/
void Delete()
{
int num;train p,q;
p=head;q=NULL;
printf("请输入要删除的车次:");getchar();
scanf("%c",&num);
while(p!=NULL)
{
if(p->num==num)
{
p->next=q->next;free(q);
printf("删除成功");break;
}
else q=p;p=p->next;
}
printf("删除成功,任意键返回班次管理页面...");getchar();
getchar();system("cls");route_manage();
}
/****************函数:班次管理:修改班次********************/
void Modify()
{
char num;train q;
q=head;
printf("请输入要修改的车次号:");
scanf("%c",&num);
while(q!=NULL)
if(q->num==num)
{
printone(q);
printf("请输入新发车时间(00:00):");
scanf("%s",&q->time);
printf("请输入新始发站:");
scanf("%s",q->starts);
printf("请输入新终点站:");
scanf("%s",q->ends);
printf("请输入新全程时间(00:00):");
scanf("%s",q->gotime);
printf("请输入新满载量:");
scanf("%d",&q->full);
printf("请重置售票数:");
scanf("%d",&q->sold);
printf("请输入新票价:");
scanf("%f",&q->price);
printf("修改成功");
}
else printf("输入班次不存在");
printf("按任意键返回班次管理页面...");
getchar();system("cls");route_manage();
}
/****************函数:班次管理:查询班次********************/
void Check()
{
char ch;train tr=head;
FILE fp;char *tim;
printf("班次 发车时间 起点站 终点站 行车时间 额定载量 已售票数 票价\n");
if((fp=fopen("train_information","rb"))==NULL)
{printf("系统暂无添加车次,请等待查询!");Delay(10000);system("cls");admin_field();}
while(tr!=NULL)
{
fread(tr,sizeof(Ticket),1,fp);
printf("%c\t",tr->num);
tim=systemtime();
if(strcmp(tim,tr->time)>0)
printf("%s\t","已发车");
else printf("%s\t",tr->time);
printf("%s\t%s\t%s\t %4d\t %4d\t\t%4.2f\n",tr->starts,tr->ends,tr->gotime,tr->full,tr->sold,tr->price);
tr=tr->next;
}
fclose(fp);
puts("\t\t1->站点查询");
puts("\t\t2->车号查询");getchar();
ch=getchar();
switch(ch)
{
case '1':station();break;
case '2':Number();break;
}
printf("按任意键返回班次管理页面...");getchar();
getchar();system("cls");admin_field();
}
/
***************函数:统计售票销售额*********问题***********/
void Count_sale()
{
train tr;
FILE fp;double Price=0;
if((fp=fopen("train_information","rb+"))==NULL)
{printf("文件打开错误!");Delay(9000);system("cls");admin_field();}
for(tr=head->next;tr!=NULL;tr=tr->next)
{
Price+=tr->sold*tr->price;
}
fclose(fp);
printf("总销售额为:%4.2f\n",Price);
printf("按任意键返回班次管理页面...");getchar();
getchar();system("cls");admin_field();
}
/
***************函数:保存修改后信息********************/
void save()
{
FILE fp;train tr;
tr=head;
if((fp=fopen("train_information","wb"))==NULL)
{printf("程序出错,系统将自动跳转至登陆界面!");Delay(9000);system("cls");load();}
while(tr!=NULL)
{
fwrite(tr,sizeof(Ticket),1,fp);
tr=tr->next;
}
fclose(fp);
printf("保存成功,按任意键返回...");
switch(flag)
{
case 'A':getchar();route_manage();break;
case 'S':getchar();Assistor_Fild();break;
}
}
/
***************函数:售票员主页面********************/
void Assistor_Fild()
{
char choice;
gotoxy(14,2);
puts("========================================");
gotoxy(20,3);puts("1->信息维护\n");
gotoxy(20,4);puts("2->售 票\n");
gotoxy(20,5);puts("3->退 票\n");
gotoxy(20,6);puts("0->返 回\n");
gotoxy(14,7);
puts("========================================");
gotoxy(25,20);
puts(invent);
gotoxy(14,8);
printf("请选择功能:");getchar();
choice=getchar();
switch(choice)
{
case '1':system("cls");protect();break;//进入信息维护
case '2':system("cls");sale();break;//进入售 票
case '3':system("cls");t_return();break;//进入退 票
case '0':system("cls");load();break;//退回到登陆页面
}
}
/***************函数:信息维护**************/
void protect()
{
char choice;FILE fp;
gotoxy(14,2);
puts("===========================================");
puts("\t\t1->修改信息\t0->返回");
gotoxy(14,4);
puts("===========================================");
/
**************显示账户信息**************/
if((fp=fopen("information","rb"))==NULL)
{printf("文件打开出错,系统将自动跳转至售票员主页");Delay(8000);Assistor_Fild();}
fread(&inf,sizeof(struct Information),1,fp);
{printf("您的账号:");printf("%s",inf.assis_acc);
printf("\t\t您的密码:");printf("%s",inf.assis_pas);}
fclose(fp);
gotoxy(25,20);puts(invent);
/*****************************************/
gotoxy(14,6);
printf("请继续您的操作:");getchar();
choice=getchar();
switch(choice)
{
case '1':system("cls");M_information();break;//进入修改信息
case '0':system("cls");Assistor_Fild();break;//退回到售票员页面
}
}
/**************函数:修改账户信息*******************/
void M_information()
{
char ch,sav;
FILE * fp;
gotoxy(20,7);
printf("账号为1至9位数字或字母");
gotoxy(20,10);
printf("请输入新账号:");
gotoxy(20,11);
printf("请输入新密码:");
gotoxy(34,10);
scanf("%s",inf.assis_acc);
if(strlen(inf.assis_acc)>9)
{gotoxy(46,10);printf("账户超过额定长度,请重试");system("cls");M_information();}
ch=getch();
if(ch==9)
{
gotoxy(34,11);
scanf("%s",inf.assis_pas);
}
printf("保存密码?(y->是,n->否):");getchar();
sav=getchar();
if(sav=='n'||sav=='N')
{ system("cls");protect();}
if((fp=fopen("train_information","wb"))==NULL)
{printf("文件打开出错");exit(0);}
fwrite(&inf,sizeof(struct Information),1,fp);printf("保存成功");
}
/**************函数:售票**********************/
void sale()
{
char choice;
gotoxy(14,2);
puts("========================================");
Check();
gotoxy(20,3);puts("1->站点查询\n");
gotoxy(20,4);puts("2->车号查询\n");
gotoxy(20,5);puts("3->直接购票\n");
gotoxy(20,6);puts("0->返 回\n");
gotoxy(14,7);
puts("========================================");
printf("请选择业务:");getchar();
choice=getchar();
switch(choice)
{
case '1':station();book();break;
case '2':Number();book();break;
case '3':book();break;
case '0':system("cls");Assistor_Fild();break;
}
}
/***************函数:按站点查询购票********************/
void station()
{
train tr;
char start[8],END[8];
printf("输入起点:");
scanf("%s",start);
printf("\t\t\t输入终点");
scanf("%s",END);
for(tr=head->next;tr!=NULL;tr=tr->next)
{
if(!strcmp(tr->starts,start)&&!strcmp(tr->ends,END))
printf("%c\t%s\t%s\t%s\t%s\t\t%4d\t\t%4d\t\t%4.2f\n",tr->num,tr->time,tr->starts,tr->ends,tr->gotime,tr->full,tr->sold,tr->price);
}
}
/***************函数:按班次号查询购票********************/
void Number()
{
train tr;char num;
printf("输入班次号:");getchar();
scanf("%c",&num);
for(tr=head->next;tr!=NULL;tr=tr->next)
{
if(tr->num==num)
printf("%c\t%s\t%s\t%s\t%s\t%4d\t%4d\t%4.2f\n",tr->num,tr->time,tr->starts,tr->ends,tr->gotime,tr->full,tr->sold,tr->price);
break;
}
}
/****************函数:购票********************/
void book()
{
char num;char boo,*Time;train tr;
Time=systemtime();
printf("请输入所要订购的车次号:");
scanf("%c",&num);
for(tr=head->next;tr!=NULL;tr=tr->next)
{
if(tr->num==num)
{
if(tr->full==tr->sold)
{
printf("该车次票已售完,请转乘其他车次,自动跳转中....");
Delay(8000);system("cls");sale();
}
else if(strcmp(Time,tr->time)>0)
{
printf("该车次已发车,请转乘其他车次,自动跳转中....");
Delay(8000);system("cls");sale();
}
tr->sold++;
}
}
printf("订票成功!自动跳转中....");
Delay(7000);system("cls");renew();
}
/****************函数:退票********************/
void t_return()
{
char num;char Time;train tr;
Check();Time=systemtime();
printf("请输入所要退订的车次号:");
scanf("%c",&num);
for(tr=head->next;tr!=NULL;tr=tr->next)
{
if(tr->num==num)
{
if(tr->sold==0)
{
printf("此车次尚未售出车票,请确认后再进行退票业务,自动跳转中....");
system("cls");Assistor_Fild();
}
else if(strcmp(Time,tr->time)>0)
{
printf("该班车已发出,不能办理退票业务");
printf("按任意键返回售票员主页...");getchar();
system("cls");Assistor_Fild();
}
tr->sold--;//以rb+方式打开,采用fread函数能把tr->sold储存吗?
****************
}
}
printf("退票成功!自动跳转中....");
Delay(8000);system("cls");renew();
}
/*****************函数:自动更新*************************/
void renew()
{
train tr;char tim;
printf("班次 发车时间 起点站 终点站 行车时间 额定载量 已售票数 票价\n");
for(tr=head->next;tr!=NULL;tr=tr->next)
{
printf("%c\t",tr->num);
tim=systemtime();
if(!strcmp(tim,tr->time))printf("%s\t","已发车");
else printf("%s\t",tr->time);
printf("%s\t%s\t%s\t%4d\t%4d\t%4.2f\n",tr->starts,tr->ends,tr->gotime,tr->full,tr->sold,tr->price);
}
save();
printf("按任意键返回售票员主页...");getchar();
system("cls");Assistor_Fild();
}
/
***************函数:显示一条班次信息********************/
void printone(train p)
{
printf("%d车次信息如下:",p->num);
printf("=======================================================================\n");
printf("班次 发车时间 起点站 终点站 行车时间 额定载量 已售票数 票价\n");
printf("%c\t%s\t%s\t%s\t%s\t%4d\t%4d\t%4.2f\n",p->num,p->starts,p->ends,p->gotime,p->full,p->sold,p->price);
}
/****************函数:获取系统时间*******************/
char*systemtime()
{
static char tim[8];
time_t timep;
struct tm p;
time(&timep);
p = gmtime(&timep);
if((p->tm_hour+8)>24) p->tm_hour=p->tm_hour-16;
else p->tm_hour=p->tm_hour+8;
tim[0]=(p->tm_hour)/10+'0';
tim[1]=(p->tm_hour)%10+'0';
tim[2]=':';
tim[3]=p->tm_min/10+'0';
tim[4]=p->tm_min%10+'0';
tim[5]=':';
tim[6]=p->tm_sec/10+'0';
tim[7]=p->tm_sec%10+'0';
return tim;
}
/
**********************读取***************************/
train read()
{
FILE fp;train head1=NULL,p,q;
if((fp=fopen("rain_information","rb"))==NULL)
{
printf("文件打开出错,已无法挽救,系统即将关闭");return head1;
}
p=(train)malloc(sizeof(Ticket));
if(fread(p,sizeof(Ticket),1,fp)!=1)return head1;
head1=p;//否则就将文件的首地址给链表头
while(!feof(fp))//检测fp所指是否到达文件结尾;不是返回0;是返回其他非0值
{
q=p;
p=(train)malloc(sizeof(Ticket));
fread(p,sizeof(Ticket),1,fp);
q->next=p;
}
q->next=NULL;//链表尾
free(p);fclose(fp);
return head1;
}
/
***************光标位置函数*************************/
void gotoxy(int x,int y)
{
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE hConsoleOut;
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);
csbiInfo.dwCursorPosition.X = x;
csbiInfo.dwCursorPosition.Y = y;
SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);
}

Csdn user default icon
上传中...
上传图片
插入图片