Advertisement
SPavelA

OOPTask13CarService

Oct 27th, 2024 (edited)
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.61 KB | Gaming | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace OOPTask13AutoService
  5. {
  6.     internal class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             CarService carService = new CarService();
  11.  
  12.             carService.Work();
  13.         }
  14.     }
  15.  
  16.     public class CarService
  17.     {
  18.         private const int WorkPrice = 5000;
  19.         private const int PenaltyRejectionBeforeRepairStarts = 3000;
  20.         private const int PenaltyRejectionAfterRepairStarts = 1000;
  21.  
  22.         private Queue<Car> _cars = new Queue<Car>();
  23.         private Storage _storage = new Storage();
  24.         private int _money = 0;
  25.  
  26.         public CarService()
  27.         {
  28.             CreateCars();
  29.         }
  30.  
  31.         public void Work()
  32.         {
  33.             const string CommandRepairNextCar = "1";
  34.             const string CommandShowStorage = "2";
  35.             const string CommandExit = "3";
  36.  
  37.             bool isWorking = true;
  38.             string userInput;
  39.  
  40.             while (isWorking)
  41.             {
  42.                 Console.WriteLine($"У сервиса в кассе {_money} рублей и в очереди на ремонт {_cars.Count} машин\n");
  43.                 Console.WriteLine($"{CommandRepairNextCar} - ремонтировать следующую машину");
  44.                 Console.WriteLine($"{CommandShowStorage} - смотреть склад компонентов");
  45.                 Console.WriteLine($"{CommandExit} - выход");
  46.                 Console.Write("\nВведите команду:");
  47.                 userInput = Console.ReadLine();
  48.  
  49.                 switch (userInput)
  50.                 {
  51.                     case CommandRepairNextCar:
  52.                         RepairNextCar();
  53.                         break;
  54.  
  55.                     case CommandShowStorage:
  56.                         _storage.ShowInfo();
  57.                         break;
  58.  
  59.                     case CommandExit:
  60.                         isWorking = false;
  61.                         break;
  62.  
  63.                     default:
  64.                         Console.WriteLine("\nНеизвестнеая команда");
  65.                         break;
  66.                 }
  67.  
  68.                 Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
  69.                 Console.ReadKey();
  70.                 Console.Clear();
  71.             }
  72.  
  73.             Console.WriteLine("\nДо свидания!");
  74.         }
  75.  
  76.         private void RepairNextCar()
  77.         {
  78.             if (_cars.Count == 0)
  79.             {
  80.                 Console.WriteLine("\nАвтомобили в очереди закончились");
  81.                
  82.                 return;
  83.             }
  84.  
  85.             Car car = _cars.Dequeue();
  86.             bool wasRepair = false;
  87.             int notAviableComponentsCount = 0;
  88.  
  89.             for (int i = 0; i < car.ComponentsCount; i ++)
  90.             {
  91.                 Component component = car.GetComponent(i);
  92.  
  93.                 if (component.IsBroken)
  94.                 {
  95.                     Component newComponent;
  96.  
  97.                     if (_storage.TryGetComponent(component.Name, out newComponent))
  98.                     {
  99.                         int repairCost = newComponent.Price + newComponent.WorkTime * WorkPrice;
  100.  
  101.                         car.RewriteComponent(newComponent, i);
  102.                         Console.Write($"\nПроизведен ремонт за {repairCost} рублей: ");
  103.                         _money += repairCost;
  104.                         wasRepair = true;
  105.                     }
  106.                     else
  107.                     {
  108.                         Console.Write($"\nНа складе нет детали: ");
  109.                         notAviableComponentsCount++;
  110.                     }
  111.  
  112.                     component.ShowInfo();
  113.                 }
  114.             }
  115.  
  116.             ProcessAfterRepair(wasRepair, notAviableComponentsCount);
  117.         }
  118.  
  119.         private void ProcessAfterRepair(bool wasRepair, int notAviableComponentsCount)
  120.         {
  121.             if (wasRepair == false)
  122.             {
  123.                 Console.WriteLine($"\nК сожалению на складе нет ниодной из поломанных деталей\n" +
  124.                     $"Cервис платит клиенту штраф: {PenaltyRejectionBeforeRepairStarts} рублей\n" +
  125.                     $"Клиент уезжает в другой сервис\n");
  126.                 _money -= PenaltyRejectionBeforeRepairStarts;
  127.             }
  128.             else if (notAviableComponentsCount > 0)
  129.             {
  130.                 int penaltyForRejection = PenaltyRejectionAfterRepairStarts * notAviableComponentsCount;
  131.  
  132.                 Console.WriteLine($"\nК сожалению на складе не было {notAviableComponentsCount} деталей\n" +
  133.                     $"Cервис платит клиенту штраф: {penaltyForRejection} рублей\n" +
  134.                     $"Клиент уезжает в другой сервис\n");
  135.                 _money -= penaltyForRejection;
  136.             }
  137.             else
  138.             {
  139.                 Console.WriteLine("\nВсе отремонтировано!\n" +
  140.                     "Клиент остался недоволен только стоимостью )\n");
  141.             }
  142.         }
  143.  
  144.  
  145.         private void CreateCars()
  146.         {
  147.             const int MinimumBrokenComponentsCount = 1;
  148.             const int MaximumBrokenComponentsCount = 7;
  149.             const int MinimumCarsCount = 10;
  150.             const int MaximumCarsCount = 30;
  151.  
  152.             int carsCount = UserUtils.GenerateRandomNumber(MinimumCarsCount, MaximumCarsCount);
  153.  
  154.             for (int i = 0; i < carsCount; i++)
  155.             {
  156.                 int brokenComponentsCount = UserUtils.GenerateRandomNumber(MinimumBrokenComponentsCount, MaximumBrokenComponentsCount);
  157.                 Car car = new Car(_storage.GetAllComponentsForCar(), brokenComponentsCount);
  158.  
  159.                 _cars.Enqueue(car);
  160.             }
  161.         }
  162.     }
  163.  
  164.     public class Storage
  165.     {
  166.         private Dictionary<string, Shelf> _shelfes  = new Dictionary<string, Shelf>();
  167.        
  168.         public Storage()
  169.         {
  170.             CreateComponents();
  171.         }
  172.  
  173.         private void CreateComponents()
  174.         {
  175.             const int MinimumComponentCount = 1;
  176.             const int MaximumComponentCount = 10;
  177.             const int MinimumComponentPrice = 20000;
  178.             const int MaximumComponentPrice = 200000;
  179.             const int MinimumWorkTime = 1;
  180.             const int MaximumWorkTime = 15;
  181.  
  182.             string[] names =
  183.                 {
  184.                 "рычаг",
  185.                 "тормозной диск",
  186.                 "колесо",
  187.                 "двигатель",
  188.                 "руль",
  189.                 "радиатор",
  190.                 "генератор",
  191.                 "ремень ГРМ",
  192.                 "аккумулятор",
  193.                 "лобовое стекло",
  194.                 "стартер",
  195.                 "амортизаторы",
  196.                 "прокладка между сиденьем и рулем"
  197.                 };
  198.  
  199.             foreach(string name in names)
  200.             {
  201.                 _shelfes.Add(name, new Shelf(name,
  202.                     UserUtils.GenerateRandomNumber(MinimumComponentPrice, MaximumComponentPrice),
  203.                     UserUtils.GenerateRandomNumber(MinimumWorkTime, MaximumWorkTime),
  204.                     UserUtils.GenerateRandomNumber(MinimumComponentCount, MaximumComponentCount)
  205.                     ));
  206.             }
  207.         }
  208.  
  209.         public List<Component> GetAllComponentsForCar()
  210.         {
  211.             List<Component> components = new List<Component>();
  212.  
  213.             foreach(Shelf shelf in _shelfes.Values)
  214.             {
  215.                 components.Add(shelf.GetComponentClone());
  216.             }
  217.  
  218.             return components;
  219.         }
  220.  
  221.         public void ShowInfo()
  222.         {
  223.             Console.WriteLine("На складе деталей:\n");
  224.  
  225.             foreach (String name in _shelfes.Keys)
  226.             {
  227.                 Console.WriteLine($"{name} - {_shelfes[name].Count} штук");
  228.             }
  229.         }
  230.  
  231.         public bool TryGetComponent(string name, out Component component)
  232.         {
  233.             if (_shelfes.ContainsKey(name))
  234.             {
  235.                 if(_shelfes[name].Count > 0)
  236.                 {
  237.                     component = _shelfes[name].TakeOneComponent();
  238.                    
  239.                     return true;
  240.                 }
  241.             }
  242.  
  243.             component = null;
  244.  
  245.             return false;
  246.         }
  247.  
  248.  
  249.     }
  250.  
  251.     public class Shelf
  252.     {
  253.         private Component _component;
  254.  
  255.         public Shelf(string name, int price, int workTime, int count)
  256.         {
  257.             _component = new Component(name, price, workTime);
  258.             Count = count;
  259.         }
  260.  
  261.         public int Count { get; private set; }
  262.        
  263.         public Component TakeOneComponent()
  264.         {
  265.             Count--;
  266.             return _component.Clone();
  267.         }
  268.  
  269.         public Component GetComponentClone()
  270.         {
  271.             return _component.Clone();
  272.         }
  273.     }
  274.  
  275.     public class Component
  276.     {
  277.         public Component(string name, int price, int workTime)
  278.         {
  279.             Name = name;
  280.             Price = price;
  281.             WorkTime = workTime;
  282.             IsBroken = false;
  283.         }
  284.  
  285.         public string Name { get; private set; }
  286.         public int Price { get; private set; }
  287.         public int WorkTime { get; private set; }
  288.         public bool IsBroken {  get; private set; }
  289.  
  290.         public void ShowInfo()
  291.         {
  292.             Console.WriteLine($"{Name}, цена детали: {Price}, время ремонта: {WorkTime} часа");
  293.         }
  294.  
  295.         public void MarkAsBroken()
  296.         {
  297.             IsBroken = true;
  298.         }
  299.  
  300.         public Component Clone()
  301.         {
  302.             return new Component(Name, Price, WorkTime);
  303.         }
  304.     }
  305.  
  306.     public class Car
  307.     {
  308.         private List<Component> _components = new List<Component>();
  309.  
  310.         public Car(List<Component> components, int brokenComponentsCount)
  311.         {
  312.             _components = components;
  313.             MarkComponentsAsBroken(brokenComponentsCount);
  314.         }
  315.  
  316.         private void MarkComponentsAsBroken( int brokenComponentsCount)
  317.         {
  318.             int markedComponentsCount = 0;
  319.  
  320.             while (markedComponentsCount < brokenComponentsCount)
  321.             {
  322.                 Component component = GetRandomComponent();
  323.  
  324.                 if (component.IsBroken == false)
  325.                 {
  326.                     component.MarkAsBroken();
  327.                     markedComponentsCount++;
  328.                 }
  329.             }
  330.         }
  331.  
  332.         public int ComponentsCount => _components.Count;
  333.  
  334.         public Component GetRandomComponent()
  335.         {
  336.             return _components[UserUtils.GenerateRandomNumber(0, _components.Count)];
  337.         }
  338.  
  339.         public Component GetComponent(int index)
  340.         {
  341.             return _components[index];
  342.         }
  343.  
  344.         public void RewriteComponent(Component component, int index)
  345.         {
  346.             _components[index] = component;
  347.         }
  348.     }
  349.  
  350.     public class UserUtils
  351.     {
  352.         private const int MinimumPercent = 0;
  353.         private const int MaximumPercent = 100;
  354.        
  355.         private static Random s_random = new Random();
  356.  
  357.         public static int GenerateRandomNumber(int minimumNumber, int maximumNumber)
  358.         {
  359.             return s_random.Next(minimumNumber, maximumNumber);
  360.         }
  361.     }
  362. }
  363.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement