Написать автомат, который покажет сколько литров воды в ёмкости после каждого воздействия - C#

Узнай цену своей работы

Формулировка задачи:

Не очень понимаю в автоматах требуется помощь. Задача звучит так: есть некая емкость и 2е трубы с вентелями, которые открывают или закрывают трубы. Через одну трубу вода втекает, через другую вытекает. Есть состояния у вентелей открыт/закрыт/открывается/закрывается. В открытом состоянии трубы пропускают 6 литров воды, в открывающемся/закрывающемся - 3 литра. Также есть 5 воздействий: 1. Открыть первую трубу. 2. Закрыть первую трубу. 3. Открыть вторую трубу. 4. Закрыть вторую трубу. 5. Ничего не делать. Требуется написать автомат, который покажет сколько литров воды в ёмкости после каждого воздействия. Начинаем с состояния обе трубы закрыты.

Решение задачи: «Написать автомат, который покажет сколько литров воды в ёмкости после каждого воздействия»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Text;
 
namespace ConsoleApplication176
{
    class Program
    {
        static void Main(string[] args)
        {
            //создаем емкость
            var tank = new Tank();
            //добавляем две трубы
            tank.Pipes.Add(new Pipe() { Name = "Труба 1", Direction = PipeDirection.Incoming });
            tank.Pipes.Add(new Pipe() { Name = "Труба 2", Direction = PipeDirection.Outcouming });
            //
            var cmd = "";
            do
            {
                //обновялем состояние емкости
                tank.Update();
                //выводим состояние емкости
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(tank);
                Console.ResetColor();
                //обновляем состояние труб
                tank.UpdatePipes();
                //подсказка
                Console.WriteLine("1 Открыть первую трубу\r\n2 Закрыть первую трубу\r\n3 Открыть вторую трубу\r\n4 Закрыть вторую трубу\r\n5 Ничего не делать\r\n9 Выход");
                //читаем управляющее воздействие
                cmd = Console.ReadLine();
                switch (cmd)
                {
                    case "1": tank.Pipes[0].SetState(PipeState.Opened); break;
                    case "2": tank.Pipes[0].SetState(PipeState.Closed); break;
                    case "3": tank.Pipes[1].SetState(PipeState.Opened); break;
                    case "4": tank.Pipes[1].SetState(PipeState.Closed); break;
                }
            } while (cmd != "9");
        }
    }
 
    class Tank
    {
        public string Name { get; set; }
        public float Capacity { get; set; }
        public float CurrentVolume { get; set; }
        public List<Pipe> Pipes { get; private set; }
 
        public Tank()
        {
            Name = "Емкость";
            Pipes = new List<Pipe>();
            Capacity = 100;
        }
 
        public void Update()
        {
            foreach(var pipe in Pipes)
                CurrentVolume += pipe.Bandwidth*(int)pipe.Direction;
 
            if (CurrentVolume > Capacity)
                CurrentVolume = Capacity;
 
            if (CurrentVolume < 0)
                CurrentVolume = 0;
        }
 
        public void UpdatePipes()
        {
            foreach (var pipe in Pipes)
                pipe.GoToNextState();
        }
 
        public override string ToString()
        {
            var sb = new StringBuilder();
            foreach(var pipe in Pipes)
                sb.AppendFormat("{0}: {1}\r\n", pipe.Name, pipe.State);
            
            return string.Format("Текущий объем жидкости в {0}: {1:G}\r\n{2}", Name, CurrentVolume, sb);
        }
    }
 
    class Pipe
    {
        public string Name { get; set; }
        public PipeState State { get; private set;}
        public Dictionary<PipeState, float> Bandwidthes { get; private set; }
 
        public float Bandwidth{ get{ return Bandwidthes[State];} }
        public PipeDirection Direction { get; set;}
 
        public Pipe()
        {
            Bandwidthes = new Dictionary<PipeState,float>();
            Bandwidthes[PipeState.Closed] = 0;
            Bandwidthes[PipeState.Opened] = 6;
            Bandwidthes[PipeState.Opening] = Bandwidthes[PipeState.Closing] = 3;
            Direction = PipeDirection.Incoming;
        }
 
        public void SetState(PipeState newState)
        {
            switch(newState)
            {
                case PipeState.Opened: 
                    if(State != PipeState.Opened) State = PipeState.Opening;
                    break;
 
                case PipeState.Closed: 
                    if(State != PipeState.Closed) State = PipeState.Closing;
                    break;
 
                default:
                    State = newState;
                    break;
            }
        }
 
        public void GoToNextState()
        {
            switch(State)
            {
                case PipeState.Opening: State = PipeState.Opened; break;
                case PipeState.Closing: State = PipeState.Closed; break;
            }
        }
    }
 
    enum PipeState
    {
        Closed = 0,
        Opening = 1,
        Closing = 2,
        Opened = 3
    }
 
    enum PipeDirection : int
    {
        Incoming = 1,
        Outcouming = -1
    }
}

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


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

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

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