票务预订业务
票务预订业务是指学生订票(等同于买票),采用实名制。预订信息包括日期、时间、学号、姓名、班级。每人每场只能预订1张票。将信息存入文件“book.dat”中。文件“book.dat”中包括所有场次活动的预定情况。
有学生预订票时,先输入他提出的日期及时间,查询票务信息(文件“number.dat”)。若有余票,则为学生办理订票手续。此时输入他的学号、姓名,按所要求的日期、时间分配给他具有相应排、号的座位,然后将该学生的预订信息添加到文件“book.dat”中,并修改文件“number.dat”中该场活动的预订量和剩余量。若无余票,则输出“无余票”信息,可以重新预订。
若学生订票成功,则应出具票据。根据学生具体预订情况,生成相应票据。每张票据内容见“4)票据生成”。
以上是写该函数的要求,请问我的代码有什么问题呢?
struct billData
{
int year;//年
int month;//月
int day;//日
int week;//星期
int hour;//时
int minute;//分
int pai;//排
int hao;//号
char type[10];//类型
float price;//票价
int bianhao;//编号
int sum;//总量
int reserve;//预定量
int surplus;//剩余量
int num;//学号
char name[10];//姓名
int classn;//班级
};
void reservation()//票务预订业务
{//年,月,日,时,分,学号,姓名,班级
//先从number里面通过日期和时间查询,有余票办理,输入学号姓名班级,按日期时间分配排,号,再将预订信息添加到book里面
FILE *fptr,*fptr1;//分别指向number和 book
struct billData bill={2021,1,1,1,0,0,1,1,"",0.0,1,0,0,0,0,"",0};
int nian,yue,ri,shi,fen;
int i;
int flag=0;
int panduan=0;
int judge=0;
int xuanze=0;
int sheng;//保存买票之后实际的剩余量
int yu;//保存买票之后实际的的预定量
int xuehao,banji;
char xingming[10];
printf("请输入您要预订的日期(年,月,日):");
scanf("%d%d%d",&nian,&yue,&ri);
printf("请输入您要预订的时间(时,分):");
scanf("%d%d",&shi,&fen);
if((fptr=fopen("number.dat","rb+"))==NULL)
{
printf("不能打开文件\n");
exit(0);
}
if((fptr1=fopen("book.dat","ab+"))==NULL)
{
printf("不能打开文件\n");
exit(0);
}
//先在number里进行查找
while ((fread(&bill,sizeof(struct billData),1,fptr))!=0)
{
if(nian==bill.year && yue==bill.month && ri==bill.day && shi==bill.hour && fen==bill.minute && bill.surplus!=0)//是要查找的信息
{
printf("您预订的时间有余票!");
printf("相关票务信息如下:\n");
if(flag==0)//第一次的数据需要输出标题
{
printf("%s%16s%8s%10s%7s%8s%7s\n","日期","星期","时间","总量","预定量","剩余量","票价");
}
printf("%d年%02d月%02d日 %d %02d时%02d分 %d %d %d %.2f\n",bill.year,bill.month,bill.day,bill.week,bill.hour,bill.minute,bill.sum,bill.reserve,bill.surplus,bill.price);
flag=1;
//panduan=0;//此账号信息能保存
}
}
if(flag==0)
{
printf("无余票!\n");
}
//fclose(fptr);
//查着了,输入学号姓名班级,存入book
//预订信息包括日期、时间、学号、姓名、班级。
while(1)
{
printf("请输入您的具体信息(学号,姓名,班级):\n");
scanf("%d%s%d",&xuehao,xingming,&banji);
rewind(fptr1);
panduan=0;
while((fread(&bill,sizeof(struct billData),1,fptr1))!=0)
{
if(xuehao==0)
{
printf("输入学号不能为零\n");
panduan=1; //说明此账号不能保存
break;
}
if(xuehao==bill.num)
{
printf("输入学号不能重复\n");
panduan=1; //说明此账号不能保存
break;
}
}
if(panduan==0) //说明此账号可以保存
{
bill.num=xuehao;//通过赋值往book里面存入信息
strcpy(bill.name,xingming);
bill.classn=banji;
bill.year=nian;
bill.month=yue;
bill.day=ri;
bill.hour=shi;
bill.minute=fen;
fseek(fptr1,0,SEEK_END);
fwrite(&bill,sizeof(struct billData),1,fptr1);
printf("保存信息成功\n");
printf("%s%16s%8s%10s%7s%8s%7s%6s%6s%6s%6s\n","日期","时间","学号","姓名","班级");
printf("%d年%02d月%02d日 %d时%02d分 %d %s %d\n",bill.year,bill.month,bill.day,bill.hour,bill.minute,bill.num,bill.name,bill.classn);
continue;
}
printf("是否输入继续录入信息:是:1;否:非1;请选择:");
scanf("%d",&xuanze);
if(xuanze!=1)
{
break;
}
}
i=0;
while ((fread(&bill,sizeof(struct billData),1,fptr))!=0)//修改number
{
if(nian==bill.year && yue==bill.month && ri==bill.day && shi==bill.hour && fen==bill.minute)
{
bill.surplus--;
bill.reserve++;
bill.bianhao++;
bill.hao++;
if(bill.hao==11)
{
bill.pai++;
bill.hao=1;
}
fseek(fptr,i*sizeof(struct billData),SEEK_SET);
fwrite(&bill,sizeof(struct billData),1,fptr);
judge=1;
break;
}
i++;
}
if(judge==0)
{
printf("修改信息失败!\n");
}
fclose(fptr);
fclose(fptr1);
}
代码是运行有问题?
拿文件作为程序运行过程中的存储,会导致大量的磁盘I/O,效率很低,应该在内存中记录一份数据,开始的时候从文件读入,过程中只需要修改内存数据,结束的时候再将内存写入文件就行了