一个红绿灯路口南北走向的车流量是东西,走向车流量的两倍,其中,南北走向为四个赤道,一个左转车道,两个直行,一个右转车道,红绿灯控制左转指示灯,执行指示灯,右转指示灯,东西走向的车道是两车道内道,为左转和直行外道为右转和直行,交通灯只有执行红绿灯控制,不单独区分左转和右转指示灯。请合理设置交通灯的转换规则和各种信号灯的灯的时长,用C语言编写一个程序来模拟信号灯的控制。
时间: 2023-08-10 18:05:56 浏览: 78
这是一个经典的交通信号灯控制问题,可以采用有限状态机来实现。下面是一个可能的程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NS_GREEN 10 // 南北直行绿灯时长(秒)
#define EW_GREEN 20 // 东西直行绿灯时长(秒)
#define LEFT_GREEN 5 // 左转绿灯时长(秒)
#define YELLOW 3 // 黄灯时长(秒)
#define RED 5 // 红灯时长(秒)
enum state { NS_GO, EW_GO, NS_TURN, EW_TURN };
int main() {
srand(time(NULL)); // 初始化随机数生成器
int ns_cars = 0, ew_cars = 0; // 南北、东西车道的车辆数
int ns_green = NS_GREEN, ew_green = EW_GREEN; // 南北、东西直行绿灯时长
int left_green = LEFT_GREEN; // 左转绿灯时长
enum state cur_state = NS_GO; // 当前状态,默认为南北直行绿灯
while (1) {
// 更新车辆数
ns_cars += rand() % 5; // 南北车道每秒钟随机增加 0-4 辆车
ew_cars += rand() % 3; // 东西车道每秒钟随机增加 0-2 辆车
if (ns_cars > 20) ns_cars = 20; // 南北车道最多只能容纳 20 辆车
if (ew_cars > 10) ew_cars = 10; // 东西车道最多只能容纳 10 辆车
// 打印当前状态和车辆数
printf("Current state: ");
switch (cur_state) {
case NS_GO:
printf("NS_GO\n");
break;
case EW_GO:
printf("EW_GO\n");
break;
case NS_TURN:
printf("NS_TURN\n");
break;
case EW_TURN:
printf("EW_TURN\n");
break;
}
printf("NS cars: %d, EW cars: %d\n", ns_cars, ew_cars);
// 根据当前状态控制信号灯
switch (cur_state) {
case NS_GO:
printf("NS green for %d seconds\n", ns_green);
ns_green--;
if (ns_green == 0) {
cur_state = NS_TURN;
left_green = LEFT_GREEN;
}
break;
case EW_GO:
printf("EW green for %d seconds\n", ew_green);
ew_green--;
if (ew_green == 0) {
cur_state = EW_TURN;
left_green = LEFT_GREEN;
}
break;
case NS_TURN:
printf("NS left green for %d seconds\n", left_green);
left_green--;
if (left_green == 0) {
printf("NS yellow for %d seconds\n", YELLOW);
cur_state = EW_GO;
ew_green = EW_GREEN;
}
break;
case EW_TURN:
printf("EW left green for %d seconds\n", left_green);
left_green--;
if (left_green == 0) {
printf("EW yellow for %d seconds\n", YELLOW);
cur_state = NS_GO;
ns_green = NS_GREEN;
}
break;
}
// 等待 1 秒钟
printf("\n");
sleep(1);
}
return 0;
}
```
在这个程序中,我们使用了一个 `enum` 类型来表示有限状态机的不同状态。程序的主循环中,我们不断更新车辆数,并根据当前状态控制信号灯。当南北或东西直行绿灯时间到时,我们切换到左转绿灯状态;当左转绿灯时间到时,我们切换到黄灯状态;当黄灯时间到时,我们切换到另一条车道的直行绿灯状态。
需要注意的是,这个程序只是一个简化版的交通信号灯控制器,实际上现代的交通信号灯控制器还需要考虑更多的因素,比如行人信号、紧急车辆优先等等。
阅读全文