4.模拟交通智能灯系统
设计一个智能信号灯系统,在十字路口控制东西南北四个方向交通信号,当然是红灯停绿灯行了,
一般情况是四个方向每次绿灯亮30秒,只不过在绿灯熄灭后亮3秒黄灯再转红灯。
现要求系统能够根据各个方向路口来的车流情况动态分配信号灯在来车多的方向绿灯可以綖长30秒时间,
为此在各个路口设有车流信号统计器,可以向系统动态发送车流信息。
设计一个智能信号灯系统,在十字路口控制东西南北四个方向交通信号,当然是红灯停绿灯行了,
一般情况是四个方向每次绿灯亮30秒,只不过在绿灯熄灭后亮3秒黄灯再转红灯。
现要求系统能够根据各个方向路口来的车流情况动态分配信号灯在来车多的方向绿灯可以綖长30秒时间,
为此在各个路口设有车流信号统计器,可以向系统动态发送车流信息。
//前言:老师,我是上一次打电话问您能不能跟换题目的那一个学生。在这里想先向老师道个歉,因为自己能力实在有限,之前对于c++这一块也没有什么基础,这学期虽然学了,但是觉得自己现在的能力还是没有办法单独地完成我自己的这个课程设计。自己在网上找了许多资料,也问了许多师兄,但是最后还是无果而终。这一份课程设计很大一部分都是借鉴自己班上的同学的,他的课程设计写得很好,所以我就照着他的思路,写了这个课程设计。但是,在写这个课程设计的时候,我也努力地尽自己所能一步一步地去理解他的课程设计里面的内容和思路,并且写下来。下面请允许我为老师介绍我自己对这份课程设计的理解.//
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
int cars1,cars2,cars3,cars4; //定义四个路口的车流
struct light //用struct定义结构体类型,定义了向左,向前,向右三个方向
{
int front;
int left;
int right;
}green1,green2,green3,green4; //设置了四个方向的绿灯
int yellow=3,red=30; //定义了红灯为30秒,黄灯为三秒
while(1)
{
//---------------------路口1------------------------//
cout<<"输入路口1车流量"<<endl; //输入路口1的车流量
cin>>cars1; //
if(cars1<25){ //当车流量小于25的时候,在绿灯亮,三个方向分别显示着:
green1.front=30; //向前方向的灯显示为30秒
green1.right=20; //向右方向的灯显示为20秒
green1.left=20;} //向左方向的灯显示为20秒
if(cars1>=25){ //当车流量大于等于25秒的时候,在绿灯亮,三个方向分别显示着:
green1.front=30+(cars1-25); //向前方向的灯显示着:在前面30秒的基础上加上此时车流量减25的差
green1.right=20+(cars1-25); //向右方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差
green1.left=20+(cars1-25);} //向左方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差
do
{
cout<<" green to front ----------------- "<<green1.front<<endl; //当绿灯亮着的情况下进入这一个循环,并且在每次进入循环的过程中时间将呈现递减状态。
green1.front--;
if(yellow>=0){ //这个呈现在之前的运算中都将会是直接跳过这一个if(green1.right>=0),因为还没有出现黄灯。等到向前方向的绿灯减少为0时,即黄灯出现的时候,就会进入yellow下面的那个循环。
if(green1.right>=0){ //再进行判断,如果绿灯大于等于0时,则会显示“green to right”“green to left”,并呈现递减的状态
cout<<" green to right-------------- "<<green1.right<<endl;
green1.right--;
cout<<" green to left---------------- "<<green1.left;
green1.left--;}
else{ //如果没有符合上面的判断,则会显示出“yellow to right”“yellow to left”,并呈现出递减的状态。
cout<<" yellow to right ---------"<<yellow<<endl
<<" yellow to left ----------"<<yellow;
yellow--;}}
Sleep(200); //在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls");
}while (green1.front>=0); //当第一个路口的绿灯向前方向的灯大于0的时候,再次进入循环。
for(yellow=3;yellow>=0;yellow--) //设定yellow 为3秒,并且判断的条件是yellow>=0,执行下面的语句并判断下面的条件之后就进行递减。
{
cout<<" yellow to front------------- "<<yellow<<endl;
Sleep(200); //在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls");} //这里的system("cls")起到的是一个调用函数,清屏的作用。清除前面的数据及内容。
//-------------------------路口2----------------------------------------//
yellow=3;
cout<<"输入路口2车流量"<<endl; //输入路口2的车流量
cin>>cars2;
if(cars2<25){ //当车流量小于25的时候,在绿灯亮,三个方向分别显示着:
green2.front=30; //向前方向的灯显示为30秒
green2.right=20; //向右方向的灯显示为20秒
green2.left=20;} //向左方向的灯显示为20秒
if(cars2>=25){ //当车流量大于等于25秒的时候,在绿灯亮,三个方向分别显示着:
green2.front=30+(cars2-25); //向前方向的灯显示着:在前面30秒的基础上加上此时车流量减25的差的时间值
green2.right=20+(cars2-25); //向右方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差的时间值
green2.left=20+(cars2-25); //向左方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差的时间值
do
{
cout<<" green to front -----------------"<<green2.front<<endl; //当绿灯亮着的情况下进入这一个循环,并且在每次进入循环的过程中时间将呈现递减状态。
green2.front--;
if(yellow>=0){
if(green2.right>=0){ //这个呈现在之前的运算中都将会是直接跳过这一个if(green1.right>=0),因为还没有出现黄灯。等到向前方向的绿灯减少为0时,即黄灯出现的时候,就会进入yellow下面的那个循环。if再进行判断,如果绿灯大于等于0时,则会显示“green to right”“green to left”,并呈现递减的状态
cout<<" green to right ---------------"<<green2.right<<endl;
green2.right--;
cout<<" green to left ---------------"<<green2.left;
green2.left--;}
else{ //如果没有符合上面的判断,则会显示出“yellow to right”“yellow to left”,并呈现出递减的状态。
cout<<" yellow to right ---------------"<<yellow<<endl
<<" yellow to left ---------------"<<yellow;
yellow--;}}
Sleep(200); //在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls"); //这里的system("cls")起到的是一个调用函数,清屏的作用。清除前面的数据及内容。
}while (green2.front>=0);
for(yellow=3;yellow>=0;yellow--){
cout<<" yellow to front ------------------"<<yellow<<endl;
Sleep(200); //在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls");} //这里的system("cls")起到的是一个调用函数,清屏的作用。清除前面的数据及内容。
//-------------------------------路口3--------------------------------//
yellow=3;
cout<<"输入路口3车流量"<<endl; //输入路口3的车流量
cin>>cars3; //当车流量小于25的时候,在绿灯亮,三个方向分别显示着:
if(cars3<25){
green3.front=30; //向前方向的灯显示为30秒
green3.right=20; //向右方向的灯显示为20秒
green3.left=20;} //向左方向的灯显示为20秒
if(cars3>=25){ //当车流量大于等于25秒的时候,在绿灯亮,三个方向分别显示着:
green3.front=30+(cars3-25); //向前方向的灯显示着:在前面30秒的基础上加上此时车流量减25的差的时间值
green3.right=20+(cars3-25); //向右方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差的时间值
green3.left=20+(cars3-25);} //向左方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差的时间值
do
{
cout<<" green to front ------------"<<green3.front<<endl;
green3.front--; //当绿灯亮着的情况下进入这一个循环,并且在每次进入循环的过程中呈现递减状态。
if(yellow>=0){ //这个呈现在之前的运算中都将会是直接跳过这一个if(green1.right>=0),因为还没有出现黄灯。等到向前方向的绿灯减少为0时,即黄灯出现的时候,就会进入yellow下面的那个循环。if再进行判断,如果绿灯大于等于0时,则会显示“green to right”“green to left”,并呈现递减的状态
if(green3.right>=0){
cout<<" green to right ------------------ "<<green3.right<<endl;
green3.right--;
cout<<" green to left ------------------ "<<green3.left<<endl;
green3.left--;}
else { //如果没有符合上面的判断,则会显示出“yellow to right”“yellow to left”,并呈现出递减的状态。
cout<<" yellow to right ------------------ "<<yellow<<endl
<<" yellow to left ------------------ "<<yellow;
yellow--;}}
Sleep(200); /在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls"); //这里的system("cls")起到的是一个调用函数,清屏的作用。清除前面的数据及内容。
}while (green3.front>=0);
for(yellow=3;yellow>=0;yellow--){
cout<<" yellow to front----------------- "<<yellow<<endl;
Sleep(200); //在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls");} //这里的system("cls")起到的是一个调用函数,清屏的作用。清除前面的数据及内容。
//-----------------------------------路口4-----------------------------------//
yellow=3;
cout<<"输入路口4车流量"<<endl; //输入路口4的车流量
cin>>cars4;
if(cars4<25){ //当车流量小于25的时候,在绿灯亮,三个方向分别显示着:
green4.front=30; //向前方向的灯显示为30秒
green4.right=20; //向右方向的灯显示为20秒
green4.left=20;} //向左方向的灯显示为20秒
if(cars4>=25){ //当车流量大于等于25秒的时候,在绿灯亮,三个方向分别显示着:
green4.front=30+(cars4-25); //向前方向的灯显示着:在前面30秒的基础上加上此时车流量减25的差的时间值
green4.right=20+(cars4-25); //向右方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差的时间值
green4.left=20+(cars4-25);} //向左方向的灯显示着:在前面20秒的基础上加上此时车流量减25的差的时间值
do //当绿灯亮着的情况下进入这一个循环,并且在每次进入循环的过程中呈现递减状态。
{
cout<<" green to front --------------------------------- "<<green4.front<<endl;
green4.front--;
if(yellow>=0){ //这个呈现在之前的运算中都将会是直接跳过这一个if(green1.right>=0),因为还没有出现黄灯。等到向前方向的绿灯减少为0时,即黄灯出现的时候,就会进入yellow下面的那个循环。if再进行判断,如果绿灯大于等于0时,则会显示“green to right”“green to left”,并呈现递减的状态
if(green4.right>=0){
cout<<" green to right ------------------------------ "<<green4.right<<endl;
green4.right--;
cout<<" green to left --------------------------------- "<<green4.left;
green4.left--;}
else { //如果没有符合上面的判断,则会显示出“yellow to right”“yellow to left”,并呈现出递减的状态。
cout<<" yellow to right ---------------------------------"<<yellow<<endl
<<" yellow to left ---------------------------------"<<yellow;
yellow--;}}
Sleep(200); //在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls"); //这里的system("cls")起到的是一个调用函数,清屏的作用。清除前面的数据及内容。
}while (green4.front>=0);
for(yellow=3;yellow>=0;yellow--){
cout<<" yellow to front --------------------------------- "<<yellow<<endl;
Sleep(200); //在VC中,Sleep()里面的单位,是以毫秒为单位的。所以这里的Sleep(200),应该是滞留0.2秒时间的意思。
system("cls");} //这里的system("cls")起到的是一个调用函数,清屏的作用。清除前面的数据及内容。
}}
return 0;
}
//在运行了解中这个程序存在的问题:
1、直接把左边的灯和右边的灯的运行时间和运行方式给等同化了,即向左方向的灯是怎么运行的,向右方向的灯就是怎么运行的。这一点个人觉得有待改进。
2、在编辑中其实可以再加上红灯的运行过程和红灯的运行状态的。
3、如果可以编写一个运行界面那就再好不过了。
4、出题的题目存在一定的歧义,如“现要求系统能够根据各个方向路口来的车流情况动态分配信号灯在来车多的方向绿灯可以綖长30秒时间”
这个30秒指的是延长绿灯显示的30秒时间呢,还是延长了30秒的时间,这一点存在着歧义。
//以上是我对整个程序运行的了解,有什么不足之处还请老师多多指点。另外我自己本身也会借着暑假假期的时间,好好地继续深造学习C++,争取把自己的技术再提升一个水平。
谢谢老师从程序的最上端看至程序的最下端。老师您辛苦了!//