На основе коллекций 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>();
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы