【问题标题】:Trying to chronologically print events that occur尝试按时间顺序打印发生的事件
【发布时间】:2015-01-02 02:14:38
【问题描述】:

我正在尝试构建一个包含三个主要事件的交通模拟器:

  1. 光线变化
  2. 一辆车进入十字路口
  3. 一辆车离开路口

程序应根据用户输入输出事件组合...但由于某种原因,它无法正常工作。输出会重复输出一个事件(例如arriveeast),或者只输出两个事件,而不是像这样根据用户输入组合几个事件;

arriveeast
arriveeast
arrivenorth
lighteast

等等……

我想知道是否有人会这么好心地指出我忽略了什么?我对此比较陌生,而且我很难找到能从中汲取灵感的人。我认为循环失败了,但我看不到如何/在哪里,也没有收到错误消息...

using System;
using System.Collections;

namespace sim
{
    public static class Simulation
    {
        public static void Main()
        {
            double average; // average of all trials
            double interArrivalEast, interArrivalNorth; // Arrival times between cars coming from East and North
            double onTimeEast, onTimeNorth, onTimeBoth; // Green light on times for East and North lights as well as both lights
            double lastLeaveEast, lastLeaveNorth; // Last time a car left from the East and North
            double totalTime; // Total time for all events to occur
            double sum = 0;
            double u; // Uniformly distributed random variable
            int numEvents; // Total number of events possible
            Event temp = new Event("", 0);
            Random rand1; // Random seed
            PriorityQueue<Event> events; // Priority queue of events
            Queue east, north; // Queue of cars approaching from the East and North
            bool eastLight, northLight;
            east = new Queue();
            north = new Queue();
            rand1 = new Random();
            Console.Write("Please enter the inter-arrival time for cars approaching from the East: ");
            interArrivalEast = -(Convert.ToDouble(Console.ReadLine()) * Math.Log(u = rand1.NextDouble()));
            Console.Write("Please enter the inter-arrival time for cars approaching from the North: ");
            interArrivalNorth = -(Convert.ToDouble(Console.ReadLine()) * Math.Log(u));
            Console.Write("Please enter the green light on time for cars approaching from the East: ");
            onTimeEast = Convert.ToDouble(Console.ReadLine());
            Console.Write("Please enter the green light on time for cars approaching from the North: ");
            onTimeNorth = Convert.ToDouble(Console.ReadLine());
            onTimeBoth = onTimeEast + onTimeNorth;
            numEvents = Convert.ToInt32((interArrivalEast * 50 / onTimeEast) + (interArrivalNorth * 50 / onTimeNorth) + (onTimeEast * 50 / 3) + (onTimeNorth * 50 / 3) + 100);
            events = new PriorityQueue<Event>(numEvents);
            totalTime = ((50 * onTimeEast) + (50 * onTimeNorth));

            for (double i = 0; i < totalTime; i += interArrivalEast)
            {
                events.Add(new Event("arriveeast", i));
            }
            for (double j = 0; j < totalTime; j += interArrivalNorth)
            {
                events.Add(new Event("arrivenorth", j));
            }
            for (double k = 0; k < totalTime; k += onTimeBoth)
            {
                events.Add(new Event("lighteast", k));
                for (double l = k; l < k + onTimeBoth; l += 3)
                    events.Add(new Event("leaveeast", l));
            }
            for (double m = onTimeEast; m < totalTime; m += onTimeBoth)
            {
                events.Add(new Event("lightnorth", m));
                for (double n = m; n < m + onTimeBoth; n += 3)
                    events.Add(new Event("leavenorth", n));
            }
            for (int o = 0; o < 1000; o++)
            {
                while (!events.Empty())
                {
                    temp = events.Front();
                    switch (temp.EType)
                    {

                        case "arriveeast":
                            east.Enqueue(temp.Time);
                            break;
                        case "arrivenorth":
                            north.Enqueue(temp.Time);
                            break;
                        case "leaveeast":
                            east.Dequeue();
                            break;
                        case "leavenorth":
                            north.Dequeue();
                            break;
                        case "lighteast":
                            eastLight = true;
                            northLight = false;
                            break;
                        case "lightnorth":
                            northLight = true;
                            eastLight = false;
                            break;
                    }
                    Console.WriteLine("{0} {1}", Convert.ToString(o), temp.EType);
                    events.Remove();
                }
                sum += temp.Time;
            }
            average = sum / 1000;
            Console.WriteLine(Convert.ToString(average));
            Console.ReadKey();

【问题讨论】:

  • Too.. much.. code...请将代码缩小到损坏的部分并准确描述什么“不起作用”。
  • 哎呀。对不起,试图缩小它。害怕没有提供足够的信息。
  • 我可以理解这一点,但我通常不想阅读整个程序来找到一个函数中的错误:)。
  • 缩小规模是好的,但仍然需要一个完整的、可调试的代码示例。见stackoverflow.com/help/mcve
  • 进一步缩小范围的方法是不要试图保留你的程序打算做的事情——用存根替换不是问题的部分(例如:用常量替换用户输入)所以你有一个更短的程序,但仍然证明了问题,即使它对任何事情都没有用。这样做也可以帮助您自己理解问题。

标签: c# events simulator


【解决方案1】:

我很确定您的问题可以缩小到:

首先你添加你所有的arriveeast's

for (double i = 0; i < totalTime; i += interArrivalEast)
{
      events.Add(new Event("arriveeast", i));
}

然后你添加norths...

然后在你的循环中按顺序写出来:

temp = events.Front();
//switch
Console.WriteLine("{0} {1}", Convert.ToString(o), temp.EType);

您的Console.WriteLine 似乎并不关心switch 语句中发生的情况,它只是在它们进入时将它们写出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 2022-01-22
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多