看到网上月薪7K的面试题之红绿灯,自己写了一个,VS2010 ...

来源:百度文库 编辑:超级军网 时间:2024/04/27 23:45:24
/*
使用log4net组件,需在引用里添加该组件,在解决方案的Properties目标框架里选择.NET framework4,然后保存并退出
要想使用日志,需要在项目中添加应用程序配置文件---> App.config
在App.config里如何使用log4net组件初始化语句请在网上找
*/
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading;
using System.IO;

[assembly: log4net.Config.DOMConfigurator(Watch = true)]


namespace TraLight
{
    class VehicleMode//车辆模板类
    {
        public static List<string> VehicleT = new List<string>();
    }

    class LogWrite//日志类,使用log4net组件
    {
        public static log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    }

    class VehicleRun//车辆运行主类
    {
        public static void VRun()
        {
            while (true)
            {
                string VName1 = "";//东西向的车
                string VName2 = "";//南北向的车
                if (Program.VehRunT_NS.Count != 0)
                {
                    VName2 += Program.VehRunT_NS[0];
                    //Console.WriteLine("南北向: "+VName2+" 准备");
                }
                if (Program.VehRunT_WE.Count != 0)
                {
                    VName1 += Program.VehRunT_WE[0];
                    //Console.WriteLine("东西向: "+VName1 + " 准备");
                }




                if (Program.LightStateGreen == "WE")//东西向绿灯亮了
                {
                    if (VName1 == "W2E" || VName1 == "E2W" || VName1 == "E2S" || VName1 == "W2N" || VName1 == "E2N" || VName1 == "W2S")
                    {
                        //string state = Program.LightStateGreen;//处理东西向直行和左转
                        string state = "东西向绿灯亮: ";
                        state += VName1;
                        Console.WriteLine(state + " 驶过");
                        if (VName1 == "E2S" || VName1 == "W2N")
                        {
                            state += " 东西向左转";
                        }
                        LogWrite.myLogger.Info(state);
                        Program.VehRunT_WE.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (VName2 == "N2W" || VName2 == "S2E")//处理南北向右转
                    {
                        //string state = Program.LightStateGreen;
                        string state = "东西向绿灯亮: ";
                        state += VName2;
                        Console.WriteLine(state + " 驶过");
                        LogWrite.myLogger.Info(state + " 南北向右转");
                        Program.VehRunT_NS.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (Program.VehRunT_WE.Count == 0)//东西向没车了,要加
                    {
                        VehAdd.V_WE_Add();
                    }
                }





                if (Program.LightStateGreen == "NS")//南北向绿灯亮了
                {
                    if (VName2 == "N2S" || VName2 == "S2N" || VName2 == "S2W" || VName2 == "N2E" || VName2 == "N2W" || VName2 == "S2E")
                    {
                        //string state = Program.LightStateGreen; //处理南北向直行和左转
                        string state = "南北向绿灯亮: ";
                        state += VName2;
                        Console.WriteLine(state + " 驶过");
                        if (VName2 == "S2W" || VName2 == "N2E")
                        {
                            state += " 南北向左转";
                        }
                        LogWrite.myLogger.Info(state);
                        Program.VehRunT_NS.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (VName1 == "E2N" || VName1 == "W2S")//处理东西向右转
                    {
                        //string state = Program.LightStateGreen;
                        string state = "南北向绿灯亮: ";
                        state += VName1;
                        Console.WriteLine(state + " 驶过");
                        LogWrite.myLogger.Info(state + " 东西向右转");
                        Program.VehRunT_WE.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (Program.VehRunT_NS.Count == 0)//南北向没车了,要加
                    {
                        VehAdd.V_NS_Add();
                    }
                }
            }
        }
    }




    class Light//信号灯控制类
    {
        private DateTime dt = DateTime.Now;
        private int start;
        private int end;
        private int dur;

        public Light()
        {
            start = dt.Second;
            end = dt.Second;
            dur = 0;
        }

        public void LightRun(object obj)
        {
            while (true)
            {
                dt = DateTime.Now;
                end = dt.Second;
                //59秒时end被置为59多次,start被置为0多次,所以如果判断条件为dur>=0的话,在1秒内会多次出现end=59,start=0的判定,所以判断条件为dur==1时可靠性较高
                //dur = end - start;
                //dur=1标明东西向和南北向的红绿灯1秒切换一次,如果想改变,可以在if语句里修改dur==?;

                if (dur == 1 && Program.LightStateGreen == "NS")//另一种方法是:   if((dur>=1&&Program.LightStateGreen=="NS")&&end!=59)
                {
                    Program.LightStateGreen = "";
                    Program.LightStateGreen += "WE";
                    //start = dt.Second;
                    dur = 0;
                    Console.WriteLine("东西向绿灯亮");
                }
                if (dur == 1 && Program.LightStateGreen == "WE")
                {
                    Program.LightStateGreen = "";
                    Program.LightStateGreen += "NS";
                    //start = dt.Second;
                    dur = 0;
                    Console.WriteLine("南北向绿灯亮");
                }
                if ((end - start) == 1)
                {
                    dur++;
                    start = dt.Second;
                }
                if (start == 59)
                {
                    //Console.WriteLine("start= "+start.ToString());
                    start = 0;
                }
            }
        }
    }







    class VehAdd//向队列中添加车辆类
    {
        public static void V_WE_Add()//添加东西向车辆
        {
            while (Program.VehRunT_WE.Count == 0)
            {
                if (Program.VehRunT_WE.Count == 0)
                {
                    int iii = 0;
                    for (int i = 0; i <= 99; i++)
                    {
                        //Random ran = new Random();
                        //int RandKey = ran.Next(0, 12);
                        string VName = VehicleMode.VehicleT[iii];
                        if (VName == "W2E" || VName == "E2W" || VName == "E2S" || VName == "W2N" || VName == "E2N" || VName == "W2S")
                        {
                            Program.VehRunT_WE.Add(VehicleMode.VehicleT[iii]);//添加东西向车辆
                        }
                        iii++;
                        if (iii == 12)
                        {
                            iii = 0;
                        }
                    }
                }
            }
        }


        public static void V_NS_Add()//添加南北向车辆
        {
            while (Program.VehRunT_NS.Count == 0)
            {
                if (Program.VehRunT_NS.Count == 0)
                {
                    int a = 0;
                    for (int aaa = 0; aaa <= 99; aaa++)
                    {
                        //Random ran = new Random();
                        //int RandKey = ran.Next(0, 12);
                        string VName = VehicleMode.VehicleT[a];
                        if (VName == "N2S" || VName == "S2N" || VName == "S2W" || VName == "N2E" || VName == "N2W" || VName == "S2E")
                        {
                            Program.VehRunT_NS.Add(VehicleMode.VehicleT[a]);//添加南北向车辆
                        }
                        a++;
                        if (a == 12)
                        {
                            a = 0;
                        }
                    }
                }
            }
        }
    }


    class Program
    {
        public static string LightStateGreen="WE";
        public static List<string> VehRunT_WE = new List<string>();//东西向的车
        public static List<string> VehRunT_NS = new List<string>();//南北向的车

        public static string Total = "";//写日志
        //public static Mutex myMutex = new Mutex();

        static void Main(string[] args)
        {
            VehicleMode.VehicleT.Add("N2S");//南北向直行
            VehicleMode.VehicleT.Add("S2N");//南北向直行
            VehicleMode.VehicleT.Add("W2E");//东西向直行
            VehicleMode.VehicleT.Add("E2W");//东西向直行

            VehicleMode.VehicleT.Add("E2N");//东西向右转
            VehicleMode.VehicleT.Add("N2W");//南北向右转
            VehicleMode.VehicleT.Add("W2S");//东西向右转
            VehicleMode.VehicleT.Add("S2E");//南北向右转

            VehicleMode.VehicleT.Add("E2S");//东西向左转
            VehicleMode.VehicleT.Add("W2N");//东西向左转
            VehicleMode.VehicleT.Add("S2W");//南北向左转
            VehicleMode.VehicleT.Add("N2E");//南北向左转


            Light myLight = new Light();
            Thread LightTransfer = new Thread(myLight.LightRun);
            LightTransfer.Start("start");//信号灯开始工作

            VehAdd.V_WE_Add();//添加车辆
            VehAdd.V_NS_Add();//添加车辆

            VehicleRun.VRun();//车辆开始运行
        }
    }
}/*
使用log4net组件,需在引用里添加该组件,在解决方案的Properties目标框架里选择.NET framework4,然后保存并退出
要想使用日志,需要在项目中添加应用程序配置文件---> App.config
在App.config里如何使用log4net组件初始化语句请在网上找
*/
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading;
using System.IO;

[assembly: log4net.Config.DOMConfigurator(Watch = true)]


namespace TraLight
{
    class VehicleMode//车辆模板类
    {
        public static List<string> VehicleT = new List<string>();
    }

    class LogWrite//日志类,使用log4net组件
    {
        public static log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    }

    class VehicleRun//车辆运行主类
    {
        public static void VRun()
        {
            while (true)
            {
                string VName1 = "";//东西向的车
                string VName2 = "";//南北向的车
                if (Program.VehRunT_NS.Count != 0)
                {
                    VName2 += Program.VehRunT_NS[0];
                    //Console.WriteLine("南北向: "+VName2+" 准备");
                }
                if (Program.VehRunT_WE.Count != 0)
                {
                    VName1 += Program.VehRunT_WE[0];
                    //Console.WriteLine("东西向: "+VName1 + " 准备");
                }




                if (Program.LightStateGreen == "WE")//东西向绿灯亮了
                {
                    if (VName1 == "W2E" || VName1 == "E2W" || VName1 == "E2S" || VName1 == "W2N" || VName1 == "E2N" || VName1 == "W2S")
                    {
                        //string state = Program.LightStateGreen;//处理东西向直行和左转
                        string state = "东西向绿灯亮: ";
                        state += VName1;
                        Console.WriteLine(state + " 驶过");
                        if (VName1 == "E2S" || VName1 == "W2N")
                        {
                            state += " 东西向左转";
                        }
                        LogWrite.myLogger.Info(state);
                        Program.VehRunT_WE.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (VName2 == "N2W" || VName2 == "S2E")//处理南北向右转
                    {
                        //string state = Program.LightStateGreen;
                        string state = "东西向绿灯亮: ";
                        state += VName2;
                        Console.WriteLine(state + " 驶过");
                        LogWrite.myLogger.Info(state + " 南北向右转");
                        Program.VehRunT_NS.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (Program.VehRunT_WE.Count == 0)//东西向没车了,要加
                    {
                        VehAdd.V_WE_Add();
                    }
                }





                if (Program.LightStateGreen == "NS")//南北向绿灯亮了
                {
                    if (VName2 == "N2S" || VName2 == "S2N" || VName2 == "S2W" || VName2 == "N2E" || VName2 == "N2W" || VName2 == "S2E")
                    {
                        //string state = Program.LightStateGreen; //处理南北向直行和左转
                        string state = "南北向绿灯亮: ";
                        state += VName2;
                        Console.WriteLine(state + " 驶过");
                        if (VName2 == "S2W" || VName2 == "N2E")
                        {
                            state += " 南北向左转";
                        }
                        LogWrite.myLogger.Info(state);
                        Program.VehRunT_NS.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (VName1 == "E2N" || VName1 == "W2S")//处理东西向右转
                    {
                        //string state = Program.LightStateGreen;
                        string state = "南北向绿灯亮: ";
                        state += VName1;
                        Console.WriteLine(state + " 驶过");
                        LogWrite.myLogger.Info(state + " 东西向右转");
                        Program.VehRunT_WE.RemoveAt(0);
                        Thread.Sleep(350);
                    }
                    if (Program.VehRunT_NS.Count == 0)//南北向没车了,要加
                    {
                        VehAdd.V_NS_Add();
                    }
                }
            }
        }
    }




    class Light//信号灯控制类
    {
        private DateTime dt = DateTime.Now;
        private int start;
        private int end;
        private int dur;

        public Light()
        {
            start = dt.Second;
            end = dt.Second;
            dur = 0;
        }

        public void LightRun(object obj)
        {
            while (true)
            {
                dt = DateTime.Now;
                end = dt.Second;
                //59秒时end被置为59多次,start被置为0多次,所以如果判断条件为dur>=0的话,在1秒内会多次出现end=59,start=0的判定,所以判断条件为dur==1时可靠性较高
                //dur = end - start;
                //dur=1标明东西向和南北向的红绿灯1秒切换一次,如果想改变,可以在if语句里修改dur==?;

                if (dur == 1 && Program.LightStateGreen == "NS")//另一种方法是:   if((dur>=1&&Program.LightStateGreen=="NS")&&end!=59)
                {
                    Program.LightStateGreen = "";
                    Program.LightStateGreen += "WE";
                    //start = dt.Second;
                    dur = 0;
                    Console.WriteLine("东西向绿灯亮");
                }
                if (dur == 1 && Program.LightStateGreen == "WE")
                {
                    Program.LightStateGreen = "";
                    Program.LightStateGreen += "NS";
                    //start = dt.Second;
                    dur = 0;
                    Console.WriteLine("南北向绿灯亮");
                }
                if ((end - start) == 1)
                {
                    dur++;
                    start = dt.Second;
                }
                if (start == 59)
                {
                    //Console.WriteLine("start= "+start.ToString());
                    start = 0;
                }
            }
        }
    }







    class VehAdd//向队列中添加车辆类
    {
        public static void V_WE_Add()//添加东西向车辆
        {
            while (Program.VehRunT_WE.Count == 0)
            {
                if (Program.VehRunT_WE.Count == 0)
                {
                    int iii = 0;
                    for (int i = 0; i <= 99; i++)
                    {
                        //Random ran = new Random();
                        //int RandKey = ran.Next(0, 12);
                        string VName = VehicleMode.VehicleT[iii];
                        if (VName == "W2E" || VName == "E2W" || VName == "E2S" || VName == "W2N" || VName == "E2N" || VName == "W2S")
                        {
                            Program.VehRunT_WE.Add(VehicleMode.VehicleT[iii]);//添加东西向车辆
                        }
                        iii++;
                        if (iii == 12)
                        {
                            iii = 0;
                        }
                    }
                }
            }
        }


        public static void V_NS_Add()//添加南北向车辆
        {
            while (Program.VehRunT_NS.Count == 0)
            {
                if (Program.VehRunT_NS.Count == 0)
                {
                    int a = 0;
                    for (int aaa = 0; aaa <= 99; aaa++)
                    {
                        //Random ran = new Random();
                        //int RandKey = ran.Next(0, 12);
                        string VName = VehicleMode.VehicleT[a];
                        if (VName == "N2S" || VName == "S2N" || VName == "S2W" || VName == "N2E" || VName == "N2W" || VName == "S2E")
                        {
                            Program.VehRunT_NS.Add(VehicleMode.VehicleT[a]);//添加南北向车辆
                        }
                        a++;
                        if (a == 12)
                        {
                            a = 0;
                        }
                    }
                }
            }
        }
    }


    class Program
    {
        public static string LightStateGreen="WE";
        public static List<string> VehRunT_WE = new List<string>();//东西向的车
        public static List<string> VehRunT_NS = new List<string>();//南北向的车

        public static string Total = "";//写日志
        //public static Mutex myMutex = new Mutex();

        static void Main(string[] args)
        {
            VehicleMode.VehicleT.Add("N2S");//南北向直行
            VehicleMode.VehicleT.Add("S2N");//南北向直行
            VehicleMode.VehicleT.Add("W2E");//东西向直行
            VehicleMode.VehicleT.Add("E2W");//东西向直行

            VehicleMode.VehicleT.Add("E2N");//东西向右转
            VehicleMode.VehicleT.Add("N2W");//南北向右转
            VehicleMode.VehicleT.Add("W2S");//东西向右转
            VehicleMode.VehicleT.Add("S2E");//南北向右转

            VehicleMode.VehicleT.Add("E2S");//东西向左转
            VehicleMode.VehicleT.Add("W2N");//东西向左转
            VehicleMode.VehicleT.Add("S2W");//南北向左转
            VehicleMode.VehicleT.Add("N2E");//南北向左转


            Light myLight = new Light();
            Thread LightTransfer = new Thread(myLight.LightRun);
            LightTransfer.Start("start");//信号灯开始工作

            VehAdd.V_WE_Add();//添加车辆
            VehAdd.V_NS_Add();//添加车辆

            VehicleRun.VRun();//车辆开始运行
        }
    }
}

这个为什么不发在CSDN之类的地方
leekkeek 发表于 2015-4-9 13:56
这个为什么不发在CSDN之类的地方
我这边注册完时不时登不上去
代码超过20行,不看
华府小厮 发表于 2015-4-9 14:11
代码超过20行,不看
原来都是不同的类文件里的,超大没法分文件保存
题目先写出来吧。然后让大家看啥?写得对不对?代码是否符合规范?寻求改进意见?
konming 发表于 2015-4-9 15:07
题目先写出来吧。然后让大家看啥?写得对不对?代码是否符合规范?寻求改进意见?
寻求改进意见,好像信号灯那里转换的不是特别可靠
和谐电3D 发表于 2015-4-9 15:30
寻求改进意见,好像信号灯那里转换的不是特别可靠
题目和要求呢?
和谐电3D 发表于 2015-4-9 15:30
寻求改进意见,好像信号灯那里转换的不是特别可靠
这个其实就是一点典型的有限状态自动机,你先把算法比划清楚了,剩下的码字就容易多了。
你要大家看算法是不是有问题,写虚代码就是了。
一帮子人整天上班看代码,轻松一会刷刷论坛还要看代码,我一看超过一屏就没兴趣了。