编程需求:很多高校都有多个校区,校区之间有通勤班车,坐班车需要预先预约。本题目的功能是编写一个简单的班车预约系统。包含如下功能:
①师生可以预约班车;
②师生可以查询已经预约的班车信息。
假设有10趟免费班车,用编号1-10表示,不同的编号表示不同的时间。
#include<stdio.h>
#include<windows.h>
#include<conio.h>
struct bus{
int num;//编号
char time[10];//发车时间
int number;//承载人数
int order;//已预约人数
};
struct person{
int num;//学号或工号
int bus_num;//预约的班车信息
}p[100];
int p_num=0;//乘客人数
struct bus b[10];
//系统菜单
void menu()
{
system("cls");
printf("\n\n");
printf("\t\t**********运动会管理系统*********\n");
printf("\t\t*\t1.预约班车\t\t*\n");
printf("\t\t*\t2.班车信息查询\t\t*\n");
printf("\t\t*\t0.退出\t\t\t*\n");
printf("\t\t*********************************\n");
printf("\n\n");
printf("选择(0-2)\n");
}
//将班车读出
void readBus()
{
FILE *fp;
int i=0;
if((fp=fopen("bus.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
while (!feof(fp))
{
if(fscanf(fp,"%d%s%d%d\n",&b[i].num,b[i].time,&b[i].number,&b[i].order)>=0)i++;
}
fclose(fp);
}
//将班车信息重新写入
void writeBus(){
FILE *fp;
int i=0;
if((fp=fopen("bus.txt","w"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
for(;i<10;i++)
fprintf(fp,"%d %s %d %d\n",b[i].num,b[i].time,b[i].number,b[i].order);
fclose(fp);
}
//预约班车
void order(int n)
{
int i,num,flag=0;
FILE *fp;
if((fp=fopen("person.txt","a+"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
for(i=0;i<p_num;i++)
{
if(p[i].num==n) //当乘客信息中有此用户时说明已经预约了,因此不可再约
{
printf("对不起,你已预约,不可重复预约噢!!\n");
flag=1;
}
}
if(!flag){
printf("欢迎你的预约!!\n");
printf("班车信息如下:\n");
printf("编号 发车时间 可承载人数 已预约人数\n");
for(i=0;i<10;i++)
{
printf("%-10d%-10s%-20d%-5d\n",b[i].num,b[i].time,b[i].number,b[i].order);
}
printf("请输入你要预约的班车编号:");
scanf("%d",&num);
while(num<=0||num>10)//当用户输入的班车编号不合法时
{
printf("班车编号不存在请重新输入!!\n");
printf("请输入你要预约的班车编号:");
scanf("%d",&num);
}
while(b[num-1].order+1>b[num-1].number)//当选择的班车已预约满员时
{
printf("此班车已满坐请重新进行选择!!");
printf("请输入你要预约的班车编号:");
scanf("%d",&num);
}
b[num-1].order+=1;//增加一个人数
writeBus();
printf("恭喜你预约成功!!");
fprintf(fp,"%d %d",n,num);
}
fclose(fp);
}
//查询预约班车的信息
void query(int n)
{
int i,bus_num=0;
printf("欢迎你来查询!!\n");
for(i=0;i<p_num;i++)//遍历乘客信息,拿到当前用户的车辆编号
{
if(p[i].num==n)
{
bus_num=p[i].bus_num;
}
}
if(bus_num==0)
{
printf("系统查询到你暂时并未预约班车哟,请预约后再来查询!!\n");
}
else{
printf("你车辆信息如下:\n");
printf("编号 发车时间 可承载人数 已预约人数\n");
printf("%-10d%-10s%-20d%-5d\n",b[bus_num-1].num,b[bus_num-1].time,b[bus_num-1].number,b[bus_num-1].order);
}
}
//读出乘客信息文件中的内容
void readPerson()
{
FILE *fp;//打开乘客信息文件
int i=0;
if((fp=fopen("person.txt","r"))==NULL)
{
printf("文件打开失败\n");
exit(0);
}
while (!feof(fp))
{
fscanf(fp,"%d %d",&p[i].num,&p[i].bus_num);
i++;
p_num++;
}
}
int main()
{
printf("你已进入系统,请输入你的学号/工号:");
int num;
scanf("%d",&num);
menu();//显示菜单
int in;
scanf("%d",&in);
readPerson();
readBus();
while(in)
{
switch(in)
{
case 1:
order(num);
break;
case 2:
query(num);
break;
default :break;
}
getch();
menu();
scanf("%d",&in);
}
}