/*(1)简易十字路口智能红绿灯系统
南北方向和东西方向的车辆交替运行,每个方向绿灯亮30秒,
两个方向可以根据车流量的大小自动调节通行时间。车流量大,通行时间增加30秒,车流量小,通行时间仍是30秒。
(2)在路灯转为红灯时,要求黄灯先亮3秒钟,才能变换运行车道。
*/
#include
#include
#include
#include
#include
using namespace std;
//绿灯30秒,黄灯3秒,红灯30秒。
//车流量大时增加30秒。
//多一秒避免界面在跳灯的时刻同时显示两个灯亮
int green[2]={31,61};
int yellow=4;
int red[3]={34,64};
//方案1
//当前东西车道车流量较大,通行时间增加30秒
void way1(int a,int b)
{
//变量初始化
//东西车道:绿灯green1,黄灯yellow1,红灯red1
//南北车道:绿灯green2,黄灯yellow2,红灯red2
int green1=green[a],green2=0;
int yellow1=0,yellow2=0;
int red1=0,red2=red[a];
printf("当前东西车道车流量较大,执行方案1,通行时间增加30秒\n");
printf("\n\n系统将在5秒后开始演示:");
for(int i=5;i>0;i--)
{
printf("%d ",i);
Sleep(1000);
}
//Sleep(5000);//页面信息停留5秒后清屏
system("cls");//清屏
while(1)
{
for(int i=97;i>0;i--)//方案1演示一次最多97秒 63+3+30+1(初始化耗时1秒)
{
if(i==97)//丰富页面显示,可删除
{
printf(">>>>>> 初始化完毕! <<<<<<\n");
}
printf("****** 开始演示 ******\n");
printf("当前演示倒计时:%d秒\n\n",i);
printf("当前东西车道车流量较大,执行方案1,通行时间增加30秒\n");
printf("\n------ 东西车道 ------\n");
//绿跳黄,黄跳红,红跳绿
if(green1>0) //东西车道绿灯还有时间
{
if(green1==green[a]) //东西车道绿灯还有31秒或61秒(初始化的1秒在这里)
{
green1--; //东西车道绿灯设置成30秒或60秒
}
else //东西车道绿灯还有时间,输出绿灯时间并-1s
{
printf(">>>>>> 绿灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",green1);
green1--;
}
if(green1==0) //东西车道绿灯时间为0,黄灯初始化
{
yellow1=yellow;
}
}
if(yellow1>0) //东西车道黄灯还有时间
{
if(yellow1==4) //东西车道黄灯还有4秒
{
yellow1--; //东西车道黄灯设置成3秒
}
else //东西车道黄灯还有时间,输出黄灯时间并-1s
{
printf(">>>>>> 黄灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",yellow1);
yellow1--;
}
if(yellow1==0) //东西车道黄灯时间为0,红灯初始化
{
red1=red[b];
}
}
if(red1>0) //东西车道红灯还有时间
{
if(red1==red[b]) //东西车道红灯还有34秒或64秒
{
red1--; //东西车道红灯设置成33秒或63秒
}
else //东西车道红灯还有时间,输出红灯时间并-1s
{
printf(">>>>>> 红灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",red1);
red1--;
}
if(red1==0) //东西车道红灯时间为0,绿灯初始化
{
green1=green[a];
}
}
printf("\n------ 南北车道 ------\n");//南北车道的交通灯
//红跳绿,绿跳黄,黄跳红
if(red2>0)
{
if(red2==red[a])
{
red2--;
}
else
{
printf(">>>>>> 红灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",red2);
red2--;
}
if(red2==0)
{
green2=green[b];
}
}
if(green2>0)
{
if(green2==green[b])
{
green2--;
}
else
{
printf(">>>>>> 绿灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",green2);
green2--;
}
if(green2==0)
{
yellow2=yellow;
}
}
if(yellow2>0)
{
if(yellow2==4)
{
yellow2--;
}
else
{
printf(">>>>>> 黄灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",yellow2);
yellow2--;
}
if(yellow2==0)
{
red2=red[a];
}
}
Sleep(1000);//在Windows系统中作用是休眠一秒
system("cls");//在小黑框中运行作用是清屏
}
//页面交互
printf("****** 演示完毕! ******\n\n");
printf("若想重新演示请按C,若想返回上一级设置车道车辆数请按R。\n");
getchar();//接收最后一个回车
char c;
scanf("%c",&c);
if(c=='c'||c=='C')
{
printf("\n");
continue;
}
else if(c=='r'||c=='R')
{
printf("\n\n");
break;
}
}
}
//方案2
//当前南北车道车流量较大,通行时间增加30秒
void way2(int a,int b)
{
//东西车道:绿灯green1,黄灯yellow1,红灯red1
//南北车道:绿灯green2,黄灯yellow2,红灯red2
int green1=green[b],green2=0;
int yellow1=0,yellow2=0;
int red1=0,red2=red[b];
printf("当前南北车道车流量较大,执行方案2,通行时间增加30秒\n");
printf("\n\n系统将在5秒后开始演示:");
for(int i=5;i>0;i--)
{
printf("%d ",i);
Sleep(1000);
}
//Sleep(5000);
system("cls");
while(1)
{
for(int i=97;i>0;i--)//演示一次最多97秒
{
if(i==97)
{
printf(">>>>>> 初始化完毕! <<<<<<\n");
}
printf("****** 开始演示 ******\n");
printf("当前演示倒计时:%d秒\n\n",i);
printf("当前南北车道车流量较大,执行方案2,通行时间增加30秒\n");
printf("\n------ 东西车道 ------\n");
//绿跳黄,黄跳红,红跳绿
if(green1>0) //东西车道绿灯还有时间
{
if(green1==green[b]) //东西车道绿灯还有31秒或61秒
{
green1--; //东西车道绿灯设置成30秒或60秒
}
else //东西车道绿灯还有时间,输出绿灯时间并-1s
{
printf(">>>>>> 绿灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",green1);
green1--;
}
if(green1==0) //东西车道绿灯时间为0,黄灯初始化
{
yellow1=yellow;
}
}
if(yellow1>0) //东西车道黄灯还有时间
{
if(yellow1==4) //东西车道黄灯还有4秒
{
yellow1--; //东西车道黄灯设置成3秒
}
else //东西车道黄灯还有时间,输出黄灯时间并-1s
{
printf(">>>>>> 黄灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",yellow1);
yellow1--;
}
if(yellow1==0) //东西车道黄灯时间为0,红灯初始化
{
red1=red[a];
}
}
if(red1>0) //东西车道红灯还有时间
{
if(red1==red[a]) //东西车道红灯还有34秒或64秒
{
red1--; //东西车道红灯设置成33秒或63秒
}
else //东西车道红灯还有时间,输出红灯时间并-1s
{
printf(">>>>>> 红灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",red1);
red1--;
}
if(red1==0) //东西车道红灯时间为0,绿灯初始化
{
green1=green[b];
}
}
printf("\n------ 南北车道 ------\n");//南北车道的交通灯
//红跳绿,绿跳黄,黄跳红
if(red2>0)
{
if(red2==red[b])
{
red2--;
}
else
{
printf(">>>>>> 红灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",red2);
red2--;
}
if(red2==0)
{
green2=green[a];
}
}
if(green2>0)
{
if(green2==green[a])
{
green2--;
}
else
{
printf(">>>>>> 绿灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",green2);
green2--;
}
if(green2==0)
{
yellow2=yellow;
}
}
if(yellow2>0)
{
if(yellow2==4)
{
yellow2--;
}
else
{
printf(">>>>>> 黄灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",yellow2);
yellow2--;
}
if(yellow2==0)
{
red2=red[b];
}
}
Sleep(1000);//在Windows系统中作用是休眠一秒
system("cls");//在小黑框中运行作用是清屏
}
//页面交互
printf("****** 演示完毕! ******\n\n");
printf("若想重新演示请按C,若想返回上一级设置车道车辆数请按R。\n");
getchar();//接收最后一个回车
char c;
scanf("%c",&c);
if(c=='c'||c=='C')
{
printf("\n");
continue;
}
else if(c=='r'||c=='R')
{
printf("\n\n");
break;
}
}
}
//车流量小,通行时间仍然是30秒
void way3(int b)//way2(0),执行方案2
{
int green1=green[b],green2=0;
int yellow1=0,yellow2=0;
int red1=0,red2=red[b];
printf("当前车流量正常,执行方案3,路口通行时间为30秒\n");
printf("\n\n系统将在5秒后开始演示:");
for(int i=5;i>0;i--)
{
printf("%d ",i);
Sleep(1000);
}
//Sleep(5000);
system("cls");
while(1)
{
for(int i=67;i>0;i--)//演示一次最多67秒 30+3+33+1(初始化耗时1秒)
{
if(i==67)
{
printf(">>>>>>初始化完毕!<<<<<<\n");
}
printf("****** 开始演示 ******\n");
printf("当前演示倒计时:%d秒\n\n",i);
printf("当前车流量正常,执行方案3,路口通行时间为30秒\n");
printf("\n------ 东西车道 ------\n");
if(green1>0)
{
if(green1==green[b])
{
green1--;
}
else
{
printf(">>>>>> 绿灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",green1);
green1--;
}
if(green1==0)
{
yellow1=yellow;
}
}
if(yellow1>0)
{
if(yellow1==4)
{
yellow1--;
}
else
{
printf(">>>>>> 黄灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",yellow1);
yellow1--;
}
if(yellow1==0)
{
red1=red[b];
}
}
if(red1>0)
{
if(red1==red[b])
{
red1--;
}
else
{
printf(">>>>>> 红灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",red1);
red1--;
}
if(red1==0)
{
green1=green[b];
}
}
printf("\n------ 南北车道 ------\n");
if(red2>0)
{
if(red2==red[b])
{
red2--;
}
else
{
printf(">>>>>> 红灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",red2);
red2--;
}
if(red2==0)
{
green2=green[b];
}
}
if(green2>0)
{
if(green2==green[b])
{
green2--;
}
else
{
printf(">>>>>> 绿灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",green2);
green2--;
}
if(green2==0)
{
yellow2=yellow;
}
}
if(yellow2>0)
{
if(yellow2==4)
{
yellow2--;
}
else
{
printf(">>>>>> 黄灯 <<<<<<\n");
printf(">>>>>> %02d秒 <<<<<<\n\n",yellow2);
yellow2--;
}
if(yellow2==0)
{
red2=red[b];
}
}
Sleep(1000);//在Windows系统中作用是休眠一秒
system("cls");//在小黑框中运行作用是清屏
}
//页面交互
printf("****** 演示完毕! ******\n\n");
printf("若想重新演示请按C,若想返回上一级设置车道车辆数请按R。\n");
getchar();//接收最后一个回车
char c;
scanf("%c",&c);
if(c=='c'||c=='C')
{
printf("\n");
continue;
}
else if(c=='r'||c=='R')
{
printf("\n\n");
break;
}
}
}
int main()
{
int car1,car2,car3,car4;
printf("\n****** 欢迎使用智能红绿灯系统 ******\n\n");
while(1)
{
printf("请设置东车道车辆数:");
scanf("%d",&car1);//东车道车辆数
printf("请设置西车道车辆数:");
scanf("%d",&car2);//西车道车辆数
printf("请设置北车道车辆数:");
scanf("%d",&car3);//北车道车辆数
printf("请设置南车道车辆数:");
scanf("%d",&car4);//南车道车辆数
printf("****** 当前各车道车辆数设置完毕! ******\n");
printf("\n\n****** 开始演示 ******\n");
//根据车辆数来选择交通灯计时函数
if((car1+car2)-(car3+car4)>10)//东西车辆比南北车辆多10辆以上
{
//printf("东西车辆比南北车辆多10辆以上,执行方案1\n");
way1(1,0);
}
else if((car3+car4)-(car1+car2)>10)//东西车辆比南北车辆多10辆以下
{
//printf("南北车辆比东西车辆多10辆以上,执行方案2\n");
way2(0,1);
}
else东西车辆不比南北车辆多
{
//printf("车流量较少执行方案3\n");
way3(0);
}
getchar();//接收最后一个回车
printf("若想重新设置车辆数请按Y,若退出请按N:");
char d;
scanf("%c",&d);
if(d=='y'||d=='Y')
{
printf("\n****** 欢迎使用智能红绿灯系统 ******\n\n");
continue;
}
else if(d=='n'||d=='N')
{
printf("\n\n系统将在5秒后退出:");
for(int i=5;i>0;i--)
{
printf("%d ",i);
Sleep(1000);
}
printf("\n系统已退出,欢迎下次使用!\n");
break;
}
}
return 0;
}