求大神发一个c语言写的代码 公交路线的查询 具体要求【用户能够方便查询某条公交路线的详细信息。】

   更新日期:2024.05.19
#include<...>
#define CHK_BY_LINE_ID 0
#define CHK_BY_BUS_ID 1
#define CHK_ERROR (-1)
#define MAX_LINE_ID 50
#define MAX_BUS_NUM 10

typedef struct
{
char bus_id[16];//公交车车牌号
unsigned char running_state;//运营状态,是收车了,还是在运营
unsigned short stop_id;//车站ID,表示公交车已经运行到哪个站了
unsigned char is_forward;//1表示从起点往终点开,0表示从终点往起点开
//其他你需要定义的内容,自己想吧
} BUS_INFO;//该结构体表示公交的信息

//公交车信息初始化
void init_bus_info(BUS_INFO **buses,int lines, int bus_numbers);
//打印公交车信息
void show_bus_info(BUS_INFO *buses, int lines);
//通过公交车线路编号,在buses中查询该线路的所有车辆信息
void search_bus_info_by_line_id(BUS_INFO **buses, unsignedshort line_id);
//通过公交车车牌号,在buses中查询该车的信息
void search_bus_info_by_bus_id(BUS_INFO **buses, char *bus_id_ptr);
//检查查询条件,是公交车线路编号,还是公交车车牌号,或无效的查询条件
int check_by_what(const char *key);
//循环函数
void loops(BUS_INFO **bus_info);

int main(int argc, char **argv)
{
//MAX_LINE_ID个线路,每个线路MAX_BUS_NUM辆车
BUS_INFO buses[MAX_LINE_ID][ MAX_BUS_NUM];

init_bus_info(buses, MAX_LINE_ID, MAX_BUS_NUM);//公交车信息初始化
loops(buses);//进程在此出于工作状态
return0; // 程序退出
}

void init_bus_info(BUS_INFO **buses,int line_numbers, int bus_numbers)
{
//初始化函数可以用手动输入信息的形式,也可以用自动的形式,我这里就用自动的方式了
//当然,手动形式初始化,函数的入参应采用另外的形式
int lines, bus;
for (lines=0; lines < line_numbers; ++ lines)
for (bus = 0; bus< bus_numbers; ++bus)
{
sprint(buses[lines][bus]. bus_id, “PRC-%d-%d”, lines, bus );//车牌号
buses[lines][bus]. running_state = 1;//运营中
buses[lines][bus]. stop_id = ((lines <8)& 0x0000FF00)| (bus & 0x000000FF);//位操作,lines为高字节号,bus为低字节号,两者共同构成车站号
buses[lines][bus]. is_forward = 1;
}
return;
}

int check_by_what(const char *key)
{
int i = 0;
int is_num = 1;

while (key[i] != ‘\0’)//未走到字符串尾部
{
if (key[i] >= ‘0’ && key[i] <= ‘9’)
i++;
else
{
is_num = 0;
break;
}
}
if (is_num)//is_num未被置0,说明全是数字
return CHK_BY_LINE_ID;
//车牌号有效性检查
if(0 == strncmp(key, “PRC-”, 4))
return CHK_BY_BUS_ID;
else
returnCHK_ERROR;
}

void show_bus_info(BUS_INFO *buses, int lines)
{
printf(“LINE: %d BUS_ID:%s STATE:%d STOP_ID:%d IS_FORWARD:%d\n”,lines, buses->bus_id, buses->running_state,buses->stop_id, buses->is_forward);
return;
}

void search_bus_info_by_line_id(BUS_INFO **buses, unsignedshort line_id)
{
int index;

if(line_id<= MAX_LINE_ID)//判断,防止数组越界
for (index=0; index< MAX_BUS_NUM; index++)
show_bus_info(&buses[line_id- 1][index], line_id);
else
printf(“Invalid bus line!!!\n”);

return;
}

void search_bus_info_by_bus_id(BUS_INFO **buses, char *bus_id_ptr)
{
int index1,index2;
int is_find = 0;

for (index1=0; index1< MAX_LINE_ID; ++index1 )
{

if(is_find )

break;//找到了,跳出外层循环
for (index2=0;index2 < MAX_BUS_NUM; ++index2 )
if (0 ==strcmp(bus_id_ptr, buses[index1][index2].bus_id ))
{

show_bus_info(&buses[index1][index2], index1);
is_find = 1;//is_find置为1,表示找到了,就不用再找了
// 因为车牌号是唯一的

break;//跳出内层循环
}

}

return;
}

void loops(BUS_INFO **bus_info)
{
char inputs[17];//为什么比车牌号缓冲区要多一个字符,自己想
int check_cond;

while (1)//死循环,学校教学的时候,告诉我们不能用这样的死循环
//今天在我看来,是错误的
//实际应用中,大多数后台进程都是死循环一直在运行
//关键是要在循环过程中,如何避免无谓的耗费cpu资源,如加阻塞函数
{
memset(inputs,0, sizeof(inputs));
printf(“Please input condition to search:”);
fflush(stdout);//上句没有“\n”,用此函数刷新标准输出
fgets(inputs, sizeof(inputs)-2, stdin);//从标准输入读取,是个阻塞函数
//没有输入时,一直停留在这一步,不耗费cpu资源;
inputs[strlen(inputs)-1] = 0;//把末尾换行符(不是我们想要的)替换为字符串的结束符
check_cond = check_by_what(inputs);
if (check_cond == CHK_BY_LINE_ID)
search_bus_info_by_line_id(bus_info,atoi(inputs));// atoi把字符串转化为数字
else if (check_cond == CHK_BY_BUS_ID)
search_bus_info_by_bus_id(bus_info, inputs);
else
printf(“Invalid condition!!!\n”);
}
return;//执行不到这一步,但还是写上,养成良好编程风格
}

先写到这里吧。不知道你是不是学生,为了完成作业,若是,这样可不好哦!

另外,该程序只有简单的查询功能,若想拓展新的功能,如:可实时更新公交车信息,可采用多线程编程,或其他方式。若你是学生的话,慢慢学吧,嘿嘿哟!

哎,刚直看了你的问题,没看到问题下面的要求。
公交车信息的录入,可以在loops函数里增加,要通过判断你从键盘输入了什么内容,比如格式化的命令,如:refresh info bus-id <id> running_state <value>。只是举个例子而已。
另外,也可以采用我上面说的多线程编程,这样更好,但是要主要互斥、加锁的问题。

由于本人是个上班的爷们,要是完成你所要的所有功能,非要写到半夜不可,所以就不给你多弄了,你自己学者弄吧。

相关链接

欢迎反馈与建议,请联系电邮
2024 © 视觉网