Advertisement
VodVas

Автосервис

Dec 19th, 2023 (edited)
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.96 KB | Software | 0 0
  1. using System.Net.Http.Headers;
  2. using System.Security.Cryptography.X509Certificates;
  3.  
  4. namespace Автосервис4
  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.     class CarService
  17.     {
  18.         private int _moneyBalance = 10000;
  19.  
  20.         private Dictionary<string, int> _priceList = new Dictionary<string, int>();
  21.  
  22.         private Queue<Car> _clients = new Queue<Car>();
  23.  
  24.         private Warehouse _warehouse = new Warehouse();
  25.  
  26.         public CarService()
  27.         {
  28.             AssignPriceList();
  29.         }
  30.  
  31.         public void Work()
  32.         {
  33.             bool isRun = true;
  34.  
  35.             Console.WriteLine("Сколько клиентов принять за сегодня?");
  36.  
  37.             int quantityClients;
  38.  
  39.             do
  40.             {
  41.                 Console.WriteLine("Введите положительное число");
  42.  
  43.                 quantityClients = Utility.ReturnInputNumber();
  44.             }
  45.  
  46.             while (quantityClients <= 0);
  47.  
  48.             Console.Clear();
  49.  
  50.             AddClient(quantityClients);
  51.  
  52.             while (isRun)
  53.             {
  54.                 Console.ForegroundColor = ConsoleColor.Green;
  55.                 Console.Write("Приехал автомобиль с поломкой: ");
  56.                 Console.WriteLine(_clients.Peek().Breakdown);
  57.                 Console.ForegroundColor = ConsoleColor.White;
  58.  
  59.                 Console.ForegroundColor = ConsoleColor.Yellow;
  60.                 Console.WriteLine($"\nБаланс мастерской: {_moneyBalance}\n");
  61.                 Console.ForegroundColor = ConsoleColor.White;
  62.  
  63.                 ShowPriceList();
  64.  
  65.                 _warehouse.ShowParts();
  66.  
  67.                 DiagnosticCar();
  68.  
  69.                 _clients.Peek().ReplaceDetail(RepairCar());
  70.  
  71.                 Console.ForegroundColor = ConsoleColor.Green;
  72.                 Console.WriteLine("Нажмите любую клавишу для приема следующего клиента");
  73.                 Console.ForegroundColor = ConsoleColor.White;
  74.  
  75.                 _clients.Dequeue();
  76.  
  77.                 if (_clients.Count == 0)
  78.                 {
  79.                     Console.ForegroundColor = ConsoleColor.DarkYellow;
  80.                     Console.WriteLine("\nКлиентов на сегодня больше нет");
  81.                     Console.ForegroundColor = ConsoleColor.White;
  82.  
  83.                     isRun = false;
  84.                 }
  85.  
  86.                 Console.ReadKey();
  87.                 Console.Clear();
  88.             }
  89.         }
  90.  
  91.         private void AddClient(int quantityClients)
  92.         {
  93.             for (int i = 0; i < quantityClients; i++)
  94.             {
  95.                 _clients.Enqueue(new Car());
  96.             }
  97.         }
  98.  
  99.         private void DiagnosticCar()
  100.         {
  101.             int finalPrice = 0;
  102.  
  103.             CalculateFinalPrice(GetNecessaryPart(finalPrice));
  104.         }
  105.  
  106.         private int GetNecessaryPart(int finalPrice)
  107.         {
  108.             string presentCar = _clients.Peek().Breakdown;
  109.  
  110.             if (_warehouse.GetListBreakdownAndParts().ContainsKey(presentCar))
  111.             {
  112.                 Console.ForegroundColor = ConsoleColor.DarkYellow;
  113.                 Console.Write("\nТребуемая запчасть: ");
  114.                 Console.ForegroundColor = ConsoleColor.White;
  115.  
  116.                 _warehouse.GetListBreakdownAndParts()[presentCar].ShowPrice();
  117.  
  118.             }
  119.  
  120.             return finalPrice += _warehouse.GetListBreakdownAndParts()[presentCar].Price;
  121.         }
  122.  
  123.         private void CalculateFinalPrice(int finalPrice)
  124.         {
  125.             string presentClient = _clients.Peek().Breakdown;
  126.  
  127.             if (_priceList.ContainsKey(presentClient))
  128.             {
  129.                 Console.ForegroundColor = ConsoleColor.DarkYellow;
  130.                 Console.Write("Цена за работу: ");
  131.                 Console.ForegroundColor = ConsoleColor.White;
  132.  
  133.                 Console.WriteLine(_priceList[presentClient]);
  134.  
  135.                 finalPrice += _priceList[presentClient];
  136.             }
  137.  
  138.             Console.ForegroundColor = ConsoleColor.DarkYellow;
  139.             Console.Write($"Итого: ");
  140.             Console.ForegroundColor = ConsoleColor.White;
  141.             Console.Write($"{finalPrice}");
  142.         }
  143.  
  144.         private CarPart RepairCar()
  145.         {
  146.             var car = _clients.Peek();
  147.  
  148.             Console.WriteLine("");
  149.  
  150.             for (int i = 0; i < _warehouse.CarPartsCount; i++)
  151.             {
  152.                 Console.WriteLine($"{i + 1} - {_warehouse.GetCarParts()[i].Title}");
  153.             }
  154.  
  155.             Console.WriteLine($"\nВыбери запчасть:");
  156.  
  157.             int userInput = (Utility.ReturnInputNumber() - 1);
  158.  
  159.             if (userInput < 0 || userInput >= _warehouse.CarPartsCount)
  160.             {
  161.                 Console.ForegroundColor = ConsoleColor.Red;
  162.                 Console.WriteLine("Неверная команда, клиент уехал");
  163.                 Console.ForegroundColor = ConsoleColor.White;
  164.             }
  165.             else
  166.             {
  167.                 CarPart carPart = _warehouse.GetCarPart(userInput);
  168.  
  169.                 ServeCar(carPart.Title, car);
  170.  
  171.                 return carPart;
  172.             }
  173.  
  174.             return null;
  175.         }
  176.  
  177.         private void ServeCar(string selectedPart, Car car)
  178.         {
  179.             int installationPenalty = 600;
  180.  
  181.             double multiplier = 0.5;
  182.  
  183.             if (_warehouse.TryGetPart(selectedPart, out int partPrice, car, out int fineWrongPart, out int replacePrice, multiplier))
  184.             {
  185.                 ApproveRequest(car, partPrice, replacePrice);
  186.             }
  187.             else if (fineWrongPart == installationPenalty)
  188.             {
  189.                 AssignFine(fineWrongPart);
  190.             }
  191.             else
  192.             {
  193.                 RejectRequest();
  194.             }
  195.         }
  196.  
  197.         private void ApproveRequest(Car car, int partPrice, int replacePrice)
  198.         {
  199.             Console.WriteLine("Запчасть в наличии, авто отремонтировали");
  200.             Console.WriteLine($"Баланс мастерской {_moneyBalance} пополнился на {partPrice} (Стоимость запчасти)");
  201.  
  202.             _moneyBalance += partPrice;
  203.  
  204.             Console.WriteLine($"Баланс мастерской {_moneyBalance} пополнился на {replacePrice} (Стоимость ремонта)");
  205.  
  206.             _moneyBalance += replacePrice;
  207.  
  208.             Console.ForegroundColor = ConsoleColor.Yellow;
  209.             Console.WriteLine($"\nБаланс мастерской {_moneyBalance}\n");
  210.             Console.ForegroundColor = ConsoleColor.White;
  211.         }
  212.  
  213.         private void AssignFine(int fineWrongPart)
  214.         {
  215.             _moneyBalance -= fineWrongPart;
  216.  
  217.             Console.ForegroundColor = ConsoleColor.Yellow;
  218.             Console.WriteLine($"Штраф за установку не той запчасти {fineWrongPart} || Баланс мастерской {_moneyBalance}");
  219.             Console.ForegroundColor = ConsoleColor.White;
  220.         }
  221.  
  222.         private void RejectRequest()
  223.         {
  224.             int fine = 500;
  225.  
  226.             Console.WriteLine($"Запчасть отсутствует, клиент не доволен, вам штраф {fine}");
  227.  
  228.             _moneyBalance -= fine;
  229.  
  230.             Console.ForegroundColor = ConsoleColor.Yellow;
  231.             Console.WriteLine($"\nБаланс мастерской {_moneyBalance}\n");
  232.             Console.ForegroundColor = ConsoleColor.White;
  233.         }
  234.  
  235.         private void ShowPriceList()
  236.         {
  237.             Console.ForegroundColor = ConsoleColor.DarkYellow;
  238.             Console.WriteLine("Прайс лист: ");
  239.             Console.ForegroundColor = ConsoleColor.White;
  240.  
  241.             foreach (var price in _priceList)
  242.             {
  243.                 Console.WriteLine($"Поломка: {price.Key} || Цена ремонта: {price.Value}");
  244.             }
  245.         }
  246.  
  247.         private void AssignPriceList()
  248.         {
  249.             DetailCreator detailCreator = new DetailCreator();
  250.  
  251.             for (int i = 0; i < detailCreator.GetDetails().Count; i++)
  252.             {
  253.                 _priceList.Add(detailCreator.GetBreakdown()[i], _warehouse.GetDetailPrices()[i]);
  254.             }
  255.         }
  256.     }
  257.  
  258.     class Warehouse
  259.     {
  260.         private List<CarPart> _carParts = new List<CarPart>();
  261.  
  262.         private Dictionary<string, CarPart> _listBreakdownAndParts = new Dictionary<string, CarPart>();
  263.  
  264.         private DetailCreator _detailsCreator = new DetailCreator();
  265.  
  266.         private List<int> _detailPrices = new List<int>();
  267.  
  268.         public Warehouse()
  269.         {
  270.             FillStorage();
  271.             FillBreakdownList();
  272.             FillPricesList();
  273.         }
  274.  
  275.         public int StarterReplacePrice { get; private set; } = 3000;
  276.         public int SuspensionReplacePrice { get; private set; } = 1500;
  277.         public int SparkPlugsReplacePrice { get; private set; } = 500;
  278.         public int ThermostatReplacePrice { get; private set; } = 2000;
  279.  
  280.         public int CarPartsCount => _carParts.Count;
  281.  
  282.         public CarPart GetCarPart(int index)
  283.         {
  284.             return _carParts[index];
  285.         }
  286.  
  287.         public bool TryGetPart(string selectedPart, out int partPrice, Car car, out int fineWrongPart, out int replacePrice, double multiplier)
  288.         {
  289.             foreach (var breakdown in _listBreakdownAndParts)
  290.             {
  291.                 if (car.Breakdown == breakdown.Key && breakdown.Value.Title == selectedPart)
  292.                 {
  293.                     for (int i = 0; i < _carParts.Count; i++)
  294.                     {
  295.                         if (selectedPart == _carParts[i].Title)
  296.                         {
  297.                             partPrice = _carParts[i].Price;
  298.  
  299.                             Console.WriteLine($"Со склада забрали {_carParts[i].Title} стоимостью {_carParts[i].Price}");
  300.  
  301.                             replacePrice = (int)(_carParts[i].Price * multiplier);
  302.  
  303.                             _carParts.Remove(_carParts[i]);
  304.  
  305.                             fineWrongPart = 0;
  306.  
  307.                             return true;
  308.                         }
  309.                     }
  310.  
  311.                     partPrice = 0;
  312.  
  313.                     replacePrice = 0;
  314.  
  315.                     fineWrongPart = 0;
  316.  
  317.                     return false;
  318.                 }
  319.             }
  320.  
  321.             for (int i = 0; i < _carParts.Count; i++)
  322.             {
  323.                 if (selectedPart == _carParts[i].Title)
  324.                 {
  325.                     _carParts.Remove(_carParts[i]);
  326.  
  327.                     fineWrongPart = 600;
  328.  
  329.                     replacePrice = 0;
  330.  
  331.                     partPrice = 0;
  332.  
  333.                     return false;
  334.                 }
  335.             }
  336.  
  337.             partPrice = 0;
  338.  
  339.             replacePrice = 0;
  340.  
  341.             fineWrongPart = 0;
  342.  
  343.             return false;
  344.         }
  345.  
  346.         public List<CarPart> GetCarParts()
  347.         {
  348.             return new List<CarPart>(_carParts);
  349.         }
  350.  
  351.         public Dictionary<string, CarPart> GetListBreakdownAndParts()
  352.         {
  353.             return new Dictionary<string, CarPart>(_listBreakdownAndParts);
  354.         }
  355.  
  356.         public void ShowParts()
  357.         {
  358.             Console.ForegroundColor = ConsoleColor.DarkYellow;
  359.             Console.WriteLine("\nЗапчасти на складе:");
  360.             Console.ForegroundColor = ConsoleColor.White;
  361.  
  362.             foreach (var part in _carParts)
  363.             {
  364.                 Console.WriteLine($"Запчасть: {part.Title} || Цена: {part.Price}");
  365.             }
  366.         }
  367.  
  368.         public List<int> GetDetailPrices()
  369.         {
  370.             return new List<int>(_detailPrices);
  371.         }
  372.  
  373.         private void FillPricesList()
  374.         {
  375.             _detailPrices.Add(StarterReplacePrice);
  376.             _detailPrices.Add(SuspensionReplacePrice);
  377.             _detailPrices.Add(SparkPlugsReplacePrice);
  378.             _detailPrices.Add(ThermostatReplacePrice);
  379.  
  380.         }
  381.  
  382.         private void FillBreakdownList()
  383.         {
  384.             int breakdownQuantity = 4;
  385.  
  386.             for (int i = 0; i < breakdownQuantity; i++)
  387.             {
  388.                 _listBreakdownAndParts.Add(_detailsCreator.GetBreakdown()[i], _carParts[i]);
  389.             }
  390.         }
  391.  
  392.         private void FillStorage()
  393.         {
  394.             _carParts.AddRange(_detailsCreator.GetDetails());
  395.  
  396.             int carPartsQuantity = 5;
  397.  
  398.             for (int i = 0; i < carPartsQuantity; i++)
  399.             {
  400.                 AddRandomDetail();
  401.             }
  402.         }
  403.  
  404.         private void AddRandomDetail()
  405.         {
  406.             int number = Utility.GenerateRandomNumber(3);
  407.  
  408.             CarPart randomDetail = _detailsCreator.GetDetails()[number];
  409.  
  410.             _carParts.Add(randomDetail);
  411.         }
  412.     }
  413.  
  414.     class Car
  415.     {
  416.         private List<string> _breakdowns = new List<string>();
  417.         private List<CarPart> _details = new List<CarPart>();
  418.  
  419.         private DetailCreator _detailCreator = new DetailCreator();
  420.  
  421.         private CarPart _carPart;
  422.  
  423.         public Car()
  424.         {
  425.             CreateBreakdown();
  426.             FillCarParts();
  427.  
  428.             Breakdown = GetRandomBreakdown();
  429.  
  430.             BrokeDetail();
  431.         }
  432.  
  433.         public string Breakdown { get; private set; }
  434.  
  435.         public string GetRandomBreakdown()
  436.         {
  437.             int number = Utility.GenerateRandomNumber(_breakdowns.Count);
  438.  
  439.             return new List<string>(_breakdowns)[number];
  440.         }
  441.  
  442.         public void ReplaceDetail(CarPart newCarPart)
  443.         {
  444.             _details.Remove(GetBrokenDetail());
  445.  
  446.             _details.Add(newCarPart);
  447.         }
  448.  
  449.         private CarPart GetBrokenDetail()
  450.         {
  451.             foreach (var detail in _details)
  452.             {
  453.                 if (detail.IsBroken == true)
  454.                 {
  455.                     return detail;
  456.                 }
  457.             }
  458.  
  459.             return null;
  460.         }
  461.  
  462.         private void BrokeDetail()
  463.         {
  464.             for (int i = 0; i < _breakdowns.Count; i++)
  465.             {
  466.                 if (Breakdown == _breakdowns[i])
  467.                 {
  468.                     _details[i].SwitchOnTrue();
  469.  
  470.                     break;
  471.                 }
  472.             }
  473.         }
  474.  
  475.         private void FillCarParts()
  476.         {
  477.             _details.AddRange(_detailCreator.GetDetails());
  478.         }
  479.  
  480.         private void CreateBreakdown()
  481.         {
  482.             _breakdowns.AddRange(_detailCreator.GetBreakdown());
  483.         }
  484.     }
  485.  
  486.     class DetailCreator
  487.     {
  488.         private List<CarPart> _details = new List<CarPart>();
  489.         private List<string> _breakdowns = new List<string>();
  490.  
  491.         public DetailCreator()
  492.         {
  493.             FillCarParts();
  494.             FillBreakdownList();
  495.         }
  496.  
  497.         public List<CarPart> GetDetails()
  498.         {
  499.             return new List<CarPart>(_details);
  500.         }
  501.  
  502.         public List<string> GetBreakdown()
  503.         {
  504.             return new List<string>(_breakdowns);
  505.         }
  506.  
  507.         private void FillBreakdownList()
  508.         {
  509.             _breakdowns.Add("Скрежет, когда заводится");
  510.             _breakdowns.Add("Стучит подвеска");
  511.             _breakdowns.Add("Прыгают обороты двигателя");
  512.             _breakdowns.Add("Перегревается двигатель");
  513.         }
  514.  
  515.         private void FillCarParts()
  516.         {
  517.             _details.Add(new CarPart("Стартер", 4000, false));
  518.             _details.Add(new CarPart("Рычаг подвески", 3000, false));
  519.             _details.Add(new CarPart("Свечи", 1000, false));
  520.             _details.Add(new CarPart("Термостат", 2000, false));
  521.         }
  522.     }
  523.  
  524.     class CarPart
  525.     {
  526.         public CarPart(string title, int price, bool isBroken)
  527.         {
  528.             Title = title;
  529.             Price = price;
  530.             IsBroken = isBroken;
  531.         }
  532.  
  533.         public string Title { get; private set; }
  534.  
  535.         public int Price { get; private set; }
  536.  
  537.         public bool IsBroken { get; private set; }
  538.  
  539.         public void SwitchOnTrue()
  540.         {
  541.             IsBroken = true;
  542.         }
  543.  
  544.         public void ShowPrice()
  545.         {
  546.             Console.WriteLine($"Цена - {Price}");
  547.         }
  548.     }
  549.  
  550.     class Utility
  551.     {
  552.         private static Random s_random = new Random();
  553.  
  554.         public static int GenerateRandomNumber(int number)
  555.         {
  556.             return s_random.Next(number);
  557.         }
  558.  
  559.         public static int ReturnInputNumber()
  560.         {
  561.             int number;
  562.  
  563.             while (int.TryParse(Console.ReadLine(), out number) == false)
  564.             {
  565.                 Console.WriteLine("Введено не число, попробуйте еще раз: ");
  566.             }
  567.  
  568.             return number;
  569.         }
  570.     }
  571. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement