auto_bus/main.c
2022-06-05 20:56:44 +08:00

218 lines
8.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "bus_io.h"
/**
* @brief 程序的主函数
*
* @return int 程序结束的状态0表示成功
*/
int main()
{
/**
* 输入的字符串
*/
char input[30];
/**
* the_bus指针的本体
*/
bus_t main_bus;
/**
* 公交车前进的方向
*/
int direction;
/**
* 完成的请求
*/
bus_query_t *finished_query;
// 读取配置文件
rails = ReadConfigFile();
// 制造公交车
the_bus = &main_bus;
the_bus->distance = 0;
the_bus->rail_node_pos = FindNode(rails, 1);
// 开始时公交车应该是停下的
direction = BUS_STOP;
PrintState();
for(;;)
{
fgets(input, sizeof input, stdin);
int result = ReadInput(input);
if(result == IO_CLOCK)
{
// 时间流动
AddTime();
switch (chosen_strategy)
{
case BUS_FCFS:
// 如果到站,处理请求和
if(JudgeOnStation() == BUS_TRUE)
{
direction = FCFSDirection(); //在开始得判断一次方向
finished_query = FCFSQuery();
if(finished_query != NULL) // 有请求就处理请求
{
// 循环处理所有可以处理的请求,总共消耗一秒
while (finished_query != NULL)
{
DeleteQuery(finished_query);
finished_query = FCFSQuery();
}
// 请求处理完再进行方向的判断
direction = FCFSDirection();
}
else //如果没有请求就继续前进
{
RunBus(direction);
}
}
else
{
RunBus(direction);
}
break;
case BUS_SSTF:
if(JudgeOnStation() == BUS_TRUE)
{
// 在没有目标请求的时候,获取一个目标站点
if(target_query == NULL)
{
target_query = SSTFGetQuery();
direction = SSTFDirection(target_query);
// 处理下一个需要处理的请求就在脚底下的情况
if(target_query != NULL && target_query->node == the_bus->rail_node_pos)
{
while (target_query != NULL && target_query->node == the_bus->rail_node_pos)
{
DeleteQuery(target_query);
target_query = SSTFGetQuery();
direction = SSTFDirection(target_query);
}
}
RunBus(direction);
}
else
{
bus_query_t *btw_query = SSTFBTWQuery(direction);
// 如果到站了
if(target_query->node == the_bus->rail_node_pos)
{
// 如果刚好在站点上就有不少请求,处理一波
// 这里利用了&&运算符的短路特性,如果第一个判断为假,则不进行下一个判断,也就避免了段错误
while (target_query != NULL && target_query->node == the_bus->rail_node_pos)
{
DeleteQuery(target_query);
target_query = SSTFGetQuery();
direction = SSTFDirection(target_query);
}
}
else if(btw_query != NULL)
{
// 如果没有到站就看看能不能顺便服务
while (btw_query != NULL)
{
DeleteQuery(btw_query);
btw_query = SSTFBTWQuery(direction);
}
}
else
{
// 如果啥也不能做就走吧
RunBus(direction);
}
}
}
else
{
// 没到站的话那就走吧
RunBus(direction);
}
break;
case BUS_SCAN:
// 如果没有指定的请求就获得指定的请求
if(JudgeOnStation() == BUS_TRUE)
{
// 在没有目标请求的时候,获取一个目标站点
if(target_query == NULL)
{
target_query = SCANGetQuery(direction);
direction = SCANDirection(target_query, direction);
// 处理下一个需要处理的请求就在脚底下的情况
if(target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos)
{
while (target_query != NULL && direction == BUS_STOP && target_query->node == the_bus->rail_node_pos)
{
DeleteQuery(target_query);
target_query = SCANGetQuery(direction);
direction = SCANDirection(target_query, direction);
}
}
RunBus(direction);
}
else
{
bus_query_t *btw_query = SCANBTWQuery();
// 如果到站了
if(target_query->node == the_bus->rail_node_pos)
{
// 如果刚好在站点上就有不少请求,处理一波
// 这里利用了&&运算符的短路特性,如果第一个判断为假,则不进行下一个判断,也就避免了段错误
while (target_query != NULL && target_query->node == the_bus->rail_node_pos)
{
DeleteQuery(target_query);
target_query = SCANGetQuery(direction);
direction = SCANDirection(target_query, direction);
}
}
else if(btw_query != NULL)
{
// 如果没有到站就看看能不能顺便服务
while (btw_query != NULL)
{
DeleteQuery(btw_query);
btw_query = SCANBTWQuery();
}
}
else
{
// 如果啥也不能做就走吧
RunBus(direction);
}
}
}
else
{
// 没到站的话那就走吧
RunBus(direction);
}
break;
default:
// 这个分支只是为了符合代码规范而存在,理论上不会用到这个分支
break;
}
PrintState();
}
else if(result == IO_END)
{
printf("end\n");
FreeRails(rails);
FreeQueries(queries);
break;
}
else
{
//在读取到创建请求的情况下,不做任何事
}
}
return 0;
}