南水北调工程东线江苏江阴至山东济宁之间,地势北高南低,沿途需要建立一系列大型抽水泵站进行梯级抽水。通常每两个泵站之间需要一座水库作为中转。低处泵站将水抽到中转水库,再由高处泵站向更高的中转水库抽水。设有泵站A,B和中转水库C,泵站设有一定数量的抽水机,水库有一定容量,当水位高于允许最高水位,禁止低处泵站注水;当水位低于允许最低水位,禁止高处泵站抽水。其中设水库容量为V,泵站抽水速度为a
请用C#语言设计一个仿真程序,要求:
1, 两座泵站在随机时间,以随机时间长度抽水或注水。
2, 水库根据自身容量允许或禁止泵站抽水,以保证自身处于安全水位。
3, 泵站即使在水库允许抽水/注水条件下,依然可以根据自身状态(如高/低处水库水位情况)选择抽水/注水。由于只考虑两个泵站一个水库,此功能可由随机数实现。

解决方案 »

  1.   

    1.用一个Timer时间计时器控件,设定好时间间隔
    2.写一个抽水/注水的方法,里面可以这样设计:写两个模块模拟A和B的抽水/注水动作,再用2个变量定死水库C的最高水位和最低水位,然后用3个变量表示A,B和C的当前水位,通过判断C的水位,再决定AB两个水库水位的增减。
    3.最后,在时间计时器里调用这个方法,也就是说程序会按照你设定的时间间隔去调用2里你写的方法,去调整AB的水位。
      

  2.   


    using System;namespace 抽水
    {
        class Program
        {
            //C水库容量
            static void Main(string[] args)
            {            A aPump = new A(10);
                B bPump = new B(10);
                C cRes = new C();
                cRes.MaxV = 500;
                cRes.MinV = 100;
                cRes.V = 200;
                Random r = new Random();
                while (true)
                {
                    //界面
                    Console.WriteLine("当前C容量为{0} (允许容量为{1}-{2})", cRes.V, cRes.MinV, cRes.MaxV);
                    Console.WriteLine("当前A状态为 {0}", aPump.Open ? "减水" : "关");
                    Console.WriteLine("当前B状态为 {0}", bPump.Open ? "加水" : "关");
                    //A B 状态随机变化
                    aPump.Open = (r.Next(2) == 0);
                    bPump.Open = (r.Next(2) == 0);
                    //检查最低水位 没问题则允许水泵A抽水
                    if (cRes.MinV <= cRes.V - aPump.a)
                    {
                        aPump.SubtractWater(ref cRes.V);
                    }
                    else
                    {
                        Console.WriteLine("最低水位报警 不允许减水");
                    }
                    //检查最高水位 没问题则允许水泵B抽水
                    if (cRes.MaxV >= cRes.V + bPump.a)
                    {
                        bPump.AddWater(ref cRes.V);
                    }
                    else
                    {
                        Console.WriteLine("最高水位报警 不允许加水");
                    }
                    System.Threading.Thread.Sleep(1000);
                    Console.Clear();
                }
            }
        }
        //水库C 
        public class C
        {
            //当前容量为
            public int V;
            //允许容量为
            public int MaxV;
            public int MinV;
        }    //泵
        public class Pump
        {
            //状态 true=打开 false=关闭
            private bool open = false;        public bool Open
            {
                get { return open; }
                set { open = value; }
            }        //抽水速度 设为5 只读
            private int _a;        public int a
            {
                get { return _a; }
                set { _a = value; }
            }
        }
        //泵A
        public class A : Pump
        {
            /// <summary>
            /// 抽走水
            /// </summary>
            /// <param name="v">抽水前水库C的容量</param>
            /// <returns>抽水后水库C的容量</returns>
            public void SubtractWater(ref int v)
            {
                if (this.Open)
                {
                    v -= this.a;  
                }
            }
            /// <summary>
            /// 泵
            /// </summary>
            /// <param name="runoff">流量 抽水速度</param>
            public A(int runoff)
            {
                a = runoff;
            }
        }
        //泵B
        public class B : Pump
        {
            /// <summary>
            /// 抽来水
            /// </summary>
            /// <param name="v">抽水前水库C的容量</param>
            /// <returns>抽水后水库C的容量</returns>
            public void AddWater(ref int v)
            {
                if (this.Open)
                {
                    v += this.a;
                }
            }
            /// <summary>
            /// 泵
            /// </summary>
            /// <param name="runoff">流量 抽水速度</param>
            public B(int runoff)
            {
                a = runoff;
            }
        }
    }
    自己写了一下 不知道LZ是不是这个意思