vovanhik_24

#50

Apr 4th, 2025 (edited)
615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.11 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace CarService
  6. {
  7.     public class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             AutoService service = new AutoService();
  12.             service.Run();
  13.         }
  14.     }
  15.  
  16.     public class Detail
  17.     {
  18.         public Detail(string name, decimal price, bool isBroken)
  19.         {
  20.             Name = name;
  21.             Price = price;
  22.             IsBroken = isBroken;
  23.         }
  24.  
  25.         public string Name { get; private set; }
  26.         public decimal Price { get; private set; }
  27.         public bool IsBroken { get; private set; }
  28.     }
  29.  
  30.     public class DetailCreator
  31.     {
  32.         private readonly Dictionary<string, Detail> _details;
  33.  
  34.         public DetailCreator()
  35.         {
  36.             _details = new Dictionary<string, Detail>
  37.             {
  38.                 { "Двигатель", new Detail("Двигатель", 5000, false) },
  39.                 { "Тормоза", new Detail("Тормоза", 1200, false) },
  40.                 { "Фара", new Detail("Фара", 800, false) },
  41.                 { "Аккумулятор", new Detail("Аккумулятор", 2500, false) }
  42.             };
  43.         }
  44.  
  45.         public Detail CreateDetail(string name, bool isBroken = false)
  46.         {
  47.             if (_details.TryGetValue(name, out Detail detail))
  48.             {
  49.                 return new Detail(detail.Name, detail.Price, isBroken);
  50.             }
  51.             else
  52.             {
  53.                 return null;
  54.             }
  55.         }
  56.     }
  57.  
  58.     public class DetailStorage
  59.     {
  60.         public DetailStorage(Detail detail, int amount = 1)
  61.         {
  62.             Detail = detail;
  63.             Amount = amount;
  64.         }
  65.  
  66.         public Detail Detail { get; private set; }
  67.         public int Amount { get; private set; }
  68.  
  69.         public int RemoveAmount(int amount)
  70.         {
  71.             return Amount -= amount;
  72.         }
  73.     }
  74.  
  75.     public class Warehouse
  76.     {
  77.         private readonly List<DetailStorage> _partsInStock;
  78.  
  79.         public Warehouse(DetailCreator detailCreator)
  80.         {
  81.             _partsInStock = new List<DetailStorage>
  82.             {
  83.                 new DetailStorage(detailCreator.CreateDetail("Двигатель"), UserUtils.GenerateRandom(10)),
  84.                 new DetailStorage(detailCreator.CreateDetail("Тормоза"), UserUtils.GenerateRandom(10)),
  85.                 new DetailStorage(detailCreator.CreateDetail("Фара"), UserUtils.GenerateRandom(10)),
  86.                 new DetailStorage(detailCreator.CreateDetail("Аккумулятор"), UserUtils.GenerateRandom(10))
  87.             };
  88.         }
  89.  
  90.         public bool HasPart(string partName)
  91.         {
  92.             return _partsInStock.Any(p => p.Detail.Name == partName && p.Amount > 0);
  93.         }
  94.  
  95.         public Detail TakePart(string partName)
  96.         {
  97.             DetailStorage storage = _partsInStock.FirstOrDefault(p => p.Detail.Name == partName && p.Amount > 0);
  98.  
  99.             if (storage != null)
  100.             {
  101.                 storage.RemoveAmount(1);
  102.                 return new Detail(storage.Detail.Name, storage.Detail.Price, false);
  103.             }
  104.  
  105.             return null;
  106.         }
  107.  
  108.         public List<DetailStorage> GetAllParts()
  109.         {
  110.             return _partsInStock;
  111.         }
  112.     }
  113.  
  114.     public class Car
  115.     {
  116.         private readonly List<Detail> _details;
  117.  
  118.         public Car(string model, List<Detail> details)
  119.         {
  120.             Model = model;
  121.             _details = details;
  122.         }
  123.  
  124.         public string Model { get; private set; }
  125.  
  126.         public List<Detail> GetBrokenParts()
  127.         {
  128.             return _details.Where(detail => detail.IsBroken).ToList();
  129.         }
  130.  
  131.         public bool IsFullyRepaired()
  132.         {
  133.             return _details.All(d => d.IsBroken == false);
  134.         }
  135.  
  136.         public bool ReplacePart(Detail newPart)
  137.         {
  138.             for (int i = 0; i < _details.Count; i++)
  139.             {
  140.                 if (_details[i].Name == newPart.Name && _details[i].IsBroken)
  141.                 {
  142.                     _details[i] = newPart;
  143.                     return true;
  144.                 }
  145.             }
  146.  
  147.             return false;
  148.         }
  149.     }
  150.  
  151.     public class CarCreator
  152.     {
  153.         private readonly List<Car> _cars;
  154.  
  155.         public CarCreator(DetailCreator detailCreator)
  156.         {
  157.             _cars = new List<Car>
  158.             {
  159.                 CreateCar("Toyota", new List<string> { "Двигатель", "Фара" }, detailCreator),
  160.                 CreateCar("Honda", new List<string> { "Аккумулятор" }, detailCreator)
  161.             };
  162.         }
  163.  
  164.         public List<Car> GetCars()
  165.         {
  166.             return _cars.ToList();
  167.         }
  168.  
  169.         private Car CreateCar(string model, List<string> brokenParts, DetailCreator detailCreator)
  170.         {
  171.             List<Detail> allDetails = new List<Detail>
  172.             {
  173.                 detailCreator.CreateDetail("Двигатель", brokenParts.Contains("Двигатель")),
  174.                 detailCreator.CreateDetail("Тормоза", brokenParts.Contains("Тормоза")),
  175.                 detailCreator.CreateDetail("Фара", brokenParts.Contains("Фара")),
  176.                 detailCreator.CreateDetail("Аккумулятор", brokenParts.Contains("Аккумулятор")),
  177.             };
  178.  
  179.             return new Car(model, allDetails);
  180.         }
  181.     }
  182.  
  183.     public class AutoService
  184.     {
  185.         private const decimal RepairFee = 1000;
  186.         private const decimal CancelBeforeRepairFee = 2000;
  187.         private const decimal CancelDuringRepairFeePerPart = 600;
  188.  
  189.         private readonly CarCreator _carCreator;
  190.         private readonly Warehouse _storage;
  191.         private readonly DetailCreator _detailCreator;
  192.         private readonly Queue<Car> _cars;
  193.         private readonly HashSet<Car> _startedRepairs;
  194.  
  195.         private decimal _balance;
  196.  
  197.         public AutoService()
  198.         {
  199.             _detailCreator = new DetailCreator();
  200.             _carCreator = new CarCreator(_detailCreator);
  201.             _storage = new Warehouse(_detailCreator);
  202.             _cars = new Queue<Car>(_carCreator.GetCars());
  203.             _startedRepairs = new HashSet<Car>();
  204.             _balance = UserUtils.GenerateRandom(10000);
  205.         }
  206.  
  207.         public void Run()
  208.         {
  209.             const string CommandToRepair = "1";
  210.             const string CommandToCancelRepair = "2";
  211.             const string CommandToExit = "3";
  212.  
  213.             bool isWorking = true;
  214.  
  215.             while (isWorking && _cars.Count > 0 && _balance > 0)
  216.             {
  217.                 Console.Clear();
  218.                 ShowServiceStatus();
  219.  
  220.                 Car currentCar = _cars.Peek();
  221.  
  222.                 Console.WriteLine($"\nТекущая машина: {currentCar.Model}");
  223.                 ShowBrokenParts(currentCar);
  224.  
  225.                 Console.WriteLine("\nВыберите действие:");
  226.                 Console.WriteLine($"{CommandToRepair} - Отремонтировать деталь");
  227.                 Console.WriteLine($"{CommandToCancelRepair} - Отказаться от ремонта");
  228.                 Console.WriteLine($"{CommandToExit} - Выйти");
  229.                 Console.Write("Введите номер команды: ");
  230.                 string input = Console.ReadLine();
  231.  
  232.                 switch (input)
  233.                 {
  234.                     case CommandToRepair:
  235.                         RepairPart(currentCar, InputPartName());
  236.                         break;
  237.  
  238.                     case CommandToCancelRepair:
  239.                         CancelRepair(currentCar);
  240.                         break;
  241.  
  242.                     case CommandToExit:
  243.                         isWorking = false;
  244.                         break;
  245.  
  246.                     default:
  247.                         Console.WriteLine("Некорректный ввод");
  248.                         break;
  249.                 }
  250.  
  251.                 Pause();
  252.             }
  253.  
  254.             Console.WriteLine("\nРабота сервиса завершена.");
  255.             Console.WriteLine($"Итоговый баланс: {_balance}");
  256.         }
  257.  
  258.         private void RepairPart(Car car, string partName)
  259.         {
  260.             _startedRepairs.Add(car);
  261.  
  262.             List<Detail> brokenParts = car.GetBrokenParts();
  263.             Detail targetPart = brokenParts.FirstOrDefault(p => p.Name.Equals(partName, StringComparison.OrdinalIgnoreCase));
  264.  
  265.             if (targetPart == null)
  266.             {
  267.                 Console.WriteLine("Такая деталь не сломана или отсутствует.");
  268.                 return;
  269.             }
  270.  
  271.             if (_storage.HasPart(partName) == false)
  272.             {
  273.                 Console.WriteLine($"Нет детали '{partName}' на складые.");
  274.                 return;
  275.             }
  276.  
  277.             Detail replacedPart = _storage.TakePart(partName);
  278.  
  279.             if (car.ReplacePart(replacedPart))
  280.             {
  281.                 decimal income = replacedPart.Price + RepairFee;
  282.                 _balance += income;
  283.  
  284.                 Console.WriteLine($"Деталь '{partName}' заменена. Доход: {income}");
  285.  
  286.                 if (car.IsFullyRepaired())
  287.                 {
  288.                     Console.WriteLine($"Машина {car.Model} полностью отремонтирована и удалена из очереди.");
  289.                     _cars.Dequeue();
  290.                     _startedRepairs.Remove(car);
  291.                 }
  292.             }
  293.         }
  294.  
  295.         private void CancelRepair(Car car)
  296.         {
  297.             decimal penalty;
  298.  
  299.             if (_startedRepairs.Contains(car))
  300.             {
  301.                 int brokenPartsCount = car.GetBrokenParts().Count;
  302.                 penalty = brokenPartsCount * CancelDuringRepairFeePerPart;
  303.                 Console.WriteLine($"Отказ от ремонта во время работы. Штраф: {penalty}");
  304.             }
  305.             else
  306.             {
  307.                 penalty = CancelBeforeRepairFee;
  308.                 Console.WriteLine($"Отказ от ремонта до начала. Штраф: {penalty}");
  309.             }
  310.  
  311.             _balance -= penalty;
  312.             _cars.Dequeue();
  313.             _startedRepairs.Remove(car);
  314.         }
  315.  
  316.         private void ShowBrokenParts(Car car)
  317.         {
  318.             List<Detail> brokenParts = car.GetBrokenParts();
  319.  
  320.             if (brokenParts.Count == 0)
  321.             {
  322.                 Console.WriteLine("Все детали исправны.");
  323.             }
  324.             else
  325.             {
  326.                 Console.WriteLine("Сломанные детали:");
  327.  
  328.                 foreach (Detail part in brokenParts)
  329.                 {
  330.                     Console.WriteLine($"- {part.Name} (Цена: {part.Price})");
  331.                 }
  332.             }
  333.         }
  334.  
  335.         private void ShowServiceStatus()
  336.         {
  337.             Console.WriteLine($"Баланс: {_balance}");
  338.             Console.WriteLine("\nОчередь машин:");
  339.  
  340.             foreach (Car car in _cars)
  341.             {
  342.                 Console.WriteLine($"- {car.Model} (Сломано: {car.GetBrokenParts().Count})");
  343.             }
  344.  
  345.             Console.WriteLine("\nСклад деталей:");
  346.  
  347.             foreach (DetailStorage item in _storage.GetAllParts())
  348.             {
  349.                 Console.WriteLine($"- {item.Detail.Name}: {item.Amount} шт. (Цена: {item.Detail.Price})");
  350.             }
  351.         }
  352.  
  353.         private void Pause()
  354.         {
  355.             Console.WriteLine("\nНажмите любую клавишу для продолжения...");
  356.             Console.ReadKey();
  357.         }
  358.  
  359.         private string InputPartName()
  360.         {
  361.             Console.Write("Введите название детали для ремонта: ");
  362.             string partName = Console.ReadLine();
  363.            
  364.             return partName;
  365.         }
  366.     }
  367.  
  368.     class UserUtils
  369.     {
  370.         private static Random s_random = new Random();
  371.  
  372.         public static int GenerateRandom(int maxValue)
  373.         {
  374.             return s_random.Next(0, maxValue + 1);
  375.         }
  376.     }
  377. }
Advertisement
Add Comment
Please, Sign In to add comment