Написать автомат, который покажет сколько литров воды в ёмкости после каждого воздействия - 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 } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д