На основе коллекций Queue и List запрограммировать модель эскалатора - C#
Формулировка задачи:
Доброго времени суток, вот нужно сделать программу на С#. хоть С# я и знаю немного, но моего ума не хватает на составление кода. Помогите пожалуйста. Просто нужен код, а там я уже разберусь.
Задание:
На основе коллекций Queue и List<T> запрограммировать модель эскалато-ра. Для эскалатора задается количество ступенек и скорость движения (ступеньки в минуту) Люди случайного веса через случайные промежутки времени входят на эскалатор, доезжают до конца и выходят из него. Некоторые из людей не стоят на ступеньках, а идут с некоторой случайной скоростью (ступеньки в минуту) по направлению движения эскалатора.
Программа должна моделировать вход, движение и выход людей, а также, через равные про-межутки времени определять нагрузку на эскалатор (общий вес людей на ступеньках).
Решение задачи: «На основе коллекций Queue и List запрограммировать модель эскалатора»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
escalator= new Escalator();
new Thread(() => EntryModel(3000, obj,escalator)).Start();
new Thread(() => ExitModel(100, obj, escalator)).Start();
new Thread(() => CheckWeight(500, obj, escalator)).Start();
}
static object obj = new object();
static Escalator escalator;
public static void EntryModel(int MaxSpanMilliseconds, object lockobject, Escalator esc)
{
var r=new Random();
while (true)
{
Thread.Sleep(r.Next(MaxSpanMilliseconds));
lock (lockobject)
esc.AddPerson(GetRandomPersonOnEscalator());
}
}
public static void ExitModel(int millisenonds, object lockobject, Escalator esc)
{
while (true)
{
Thread.Sleep(millisenonds);
lock (lockobject)
esc.RemovePersons();
}
}
public static void CheckWeight(int millisenonds, object lockobject, Escalator esc)
{
while (true)
{
Thread.Sleep(millisenonds);
double load=0;
int count=0;
lock (lockobject)
load = esc.SummaryLoad(out count);
Console.WriteLine("Summary load: {0}\nPersons count: {1}\n",load,count);
}
}
public static PersonOnEscalator GetRandomPersonOnEscalator(double minWeight=10, double maxWeight=150, double maxSpeed=600)
{
var r = new Random();
return new PersonOnEscalator(r.NextDouble()*(maxWeight-minWeight)+minWeight, r.Next(10)>7?r.NextDouble()*maxSpeed:0);
}
public class Person
{
public double Weight { get; set; }
public Person(double weight)
{
Weight = weight;
}
}
public class PersonOnEscalator : Person
{
public double Speed { get; set; }
public DateTime EntryTime { get; private set; }
public DateTime ExitTime { get; private set; }
public PersonOnEscalator(double weight, double speed = 0)
: base(weight)
{
Speed = speed;
}
public void AddedTo(Escalator esc)
{
EntryTime = DateTime.Now;
ExitTime = EntryTime + TimeSpan.FromMinutes((esc.StepCount / (Speed + esc.Speed)));
}
}
public class Escalator
{
public int StepCount { get; set; }
public double Speed { get; set; }
public Queue<PersonOnEscalator> QueuePersons { get; set; }
public List<PersonOnEscalator> ListPersons { get; set; }
public double SummaryLoad(out int count)
{
count=QueuePersons.Count+ListPersons.Count;
return QueuePersons.Sum(x => x.Weight) + ListPersons.Sum(x => x.Weight);
}
public void AddPerson(PersonOnEscalator person)
{
person.AddedTo(this);
Console.WriteLine("Add new person: weight {0}, speed {1}, entry time {2}, exit time {3}", person.Weight, person.Speed, person.EntryTime, person.ExitTime);
if (person.Speed > 0)
ListPersons.Add(person);
else
QueuePersons.Enqueue(person);
}
public void RemovePersons()
{
while (QueuePersons.Count > 0 && QueuePersons.Peek().ExitTime < DateTime.Now)
{
QueuePersons.Dequeue();
Console.WriteLine("Queue person exit");
}
var newList = ListPersons.Where(x => x.ExitTime > DateTime.Now).ToList();
if (newList.Count < ListPersons.Count)
Console.WriteLine("Some list persons exit");
ListPersons = newList;
}
public Escalator(int stepCount = 600, int speed = 600)
{
StepCount = stepCount;
Speed = speed;
QueuePersons = new Queue<PersonOnEscalator>();
ListPersons = new List<PersonOnEscalator>();
}
}
}
}