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

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

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

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

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

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication176
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             //создаем емкость
  12.             var tank = new Tank();
  13.             //добавляем две трубы
  14.             tank.Pipes.Add(new Pipe() { Name = "Труба 1", Direction = PipeDirection.Incoming });
  15.             tank.Pipes.Add(new Pipe() { Name = "Труба 2", Direction = PipeDirection.Outcouming });
  16.             //
  17.             var cmd = "";
  18.             do
  19.             {
  20.                 //обновялем состояние емкости
  21.                 tank.Update();
  22.                 //выводим состояние емкости
  23.                 Console.ForegroundColor = ConsoleColor.Red;
  24.                 Console.WriteLine(tank);
  25.                 Console.ResetColor();
  26.                 //обновляем состояние труб
  27.                 tank.UpdatePipes();
  28.                 //подсказка
  29.                 Console.WriteLine("1 Открыть первую трубу\r\n2 Закрыть первую трубу\r\n3 Открыть вторую трубу\r\n4 Закрыть вторую трубу\r\n5 Ничего не делать\r\n9 Выход");
  30.                 //читаем управляющее воздействие
  31.                 cmd = Console.ReadLine();
  32.                 switch (cmd)
  33.                 {
  34.                     case "1": tank.Pipes[0].SetState(PipeState.Opened); break;
  35.                     case "2": tank.Pipes[0].SetState(PipeState.Closed); break;
  36.                     case "3": tank.Pipes[1].SetState(PipeState.Opened); break;
  37.                     case "4": tank.Pipes[1].SetState(PipeState.Closed); break;
  38.                 }
  39.             } while (cmd != "9");
  40.         }
  41.     }
  42.  
  43.     class Tank
  44.     {
  45.         public string Name { get; set; }
  46.         public float Capacity { get; set; }
  47.         public float CurrentVolume { get; set; }
  48.         public List<Pipe> Pipes { get; private set; }
  49.  
  50.         public Tank()
  51.         {
  52.             Name = "Емкость";
  53.             Pipes = new List<Pipe>();
  54.             Capacity = 100;
  55.         }
  56.  
  57.         public void Update()
  58.         {
  59.             foreach(var pipe in Pipes)
  60.                 CurrentVolume += pipe.Bandwidth*(int)pipe.Direction;
  61.  
  62.             if (CurrentVolume > Capacity)
  63.                 CurrentVolume = Capacity;
  64.  
  65.             if (CurrentVolume < 0)
  66.                 CurrentVolume = 0;
  67.         }
  68.  
  69.         public void UpdatePipes()
  70.         {
  71.             foreach (var pipe in Pipes)
  72.                 pipe.GoToNextState();
  73.         }
  74.  
  75.         public override string ToString()
  76.         {
  77.             var sb = new StringBuilder();
  78.             foreach(var pipe in Pipes)
  79.                 sb.AppendFormat("{0}: {1}\r\n", pipe.Name, pipe.State);
  80.            
  81.             return string.Format("Текущий объем жидкости в {0}: {1:G}\r\n{2}", Name, CurrentVolume, sb);
  82.         }
  83.     }
  84.  
  85.     class Pipe
  86.     {
  87.         public string Name { get; set; }
  88.         public PipeState State { get; private set;}
  89.         public Dictionary<PipeState, float> Bandwidthes { get; private set; }
  90.  
  91.         public float Bandwidth{ get{ return Bandwidthes[State];} }
  92.         public PipeDirection Direction { get; set;}
  93.  
  94.         public Pipe()
  95.         {
  96.             Bandwidthes = new Dictionary<PipeState,float>();
  97.             Bandwidthes[PipeState.Closed] = 0;
  98.             Bandwidthes[PipeState.Opened] = 6;
  99.             Bandwidthes[PipeState.Opening] = Bandwidthes[PipeState.Closing] = 3;
  100.             Direction = PipeDirection.Incoming;
  101.         }
  102.  
  103.         public void SetState(PipeState newState)
  104.         {
  105.             switch(newState)
  106.             {
  107.                 case PipeState.Opened:
  108.                     if(State != PipeState.Opened) State = PipeState.Opening;
  109.                     break;
  110.  
  111.                 case PipeState.Closed:
  112.                     if(State != PipeState.Closed) State = PipeState.Closing;
  113.                     break;
  114.  
  115.                 default:
  116.                     State = newState;
  117.                     break;
  118.             }
  119.         }
  120.  
  121.         public void GoToNextState()
  122.         {
  123.             switch(State)
  124.             {
  125.                 case PipeState.Opening: State = PipeState.Opened; break;
  126.                 case PipeState.Closing: State = PipeState.Closed; break;
  127.             }
  128.         }
  129.     }
  130.  
  131.     enum PipeState
  132.     {
  133.         Closed = 0,
  134.         Opening = 1,
  135.         Closing = 2,
  136.         Opened = 3
  137.     }
  138.  
  139.     enum PipeDirection : int
  140.     {
  141.         Incoming = 1,
  142.         Outcouming = -1
  143.     }
  144. }

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


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

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

11   голосов , оценка 3.909 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы