Last active
February 10, 2024 14:23
-
-
Save tsk-arh/9c3f9f0984db6a5c821eea090113cacd to your computer and use it in GitHub Desktop.
ЗАДАНИЕ Автосервис
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
namespace ConsoleApp11 | |
{ | |
internal class Program | |
{ | |
static void Main(string[] args) | |
{ | |
Service service = new Service(); | |
service.Work(); | |
} | |
} | |
class Service | |
{ | |
private int _wallet; | |
private int _fineForMisstake = 2000; | |
private int _minimumClients = 5; | |
private int _maximumClients = 10; | |
private Queue<ClientCar> _clients; | |
private Stock _stock; | |
public Service() | |
{ | |
_stock = new Stock(); | |
_clients = new Queue<ClientCar>(); | |
AddClients(); | |
} | |
public void Work() | |
{ | |
const char MenuServeNextClient = '1'; | |
const char CommandVievStock = '2'; | |
const char CommandExit = '3'; | |
bool isRuning = true; | |
string menu = $"Выберите желаемое действие:" + | |
$"\n{MenuServeNextClient} Принять решение по клиенту" + | |
$"\n{CommandVievStock} Посмотреть все детали на складе" + | |
$"\n{CommandExit} Завершить работу"; | |
while (_clients.Count > 0 && isRuning) | |
{ | |
Console.Clear(); | |
WriteInfoStatistic(); | |
Console.WriteLine(menu); | |
switch (Console.ReadKey(true).KeyChar) | |
{ | |
case MenuServeNextClient: | |
VievRepairMenu(); | |
break; | |
case CommandVievStock: | |
_stock.ShowFixDetail(); | |
break; | |
case CommandExit: | |
isRuning = false; | |
break; | |
} | |
if (isRuning && _clients.Count > 0) | |
{ | |
Console.WriteLine($"Нажмите любую клавишу для продолжения"); | |
Console.ReadKey(true); | |
} | |
else if (isRuning && _clients.Count == 0) | |
{ | |
Console.WriteLine($"\nКлиентов на сегодня больше нет, нажмите любую клавишу для завершения программы"); | |
Console.ReadKey(true); | |
} | |
} | |
} | |
private void WriteInfoStatistic() | |
{ | |
string frame = new string('-', 45); | |
int fixPrice = _clients.Peek().Detail.Price + _clients.Peek().Detail.PriceWork; | |
Console.WriteLine(frame + $"\nВаш баланс на сегодня {_wallet}\n" + frame); | |
Console.WriteLine($"Клиентов в очереди: {_clients.Count}" + | |
$"\nВашего решения ожидает клиент, поломка <{_clients.Peek().Detail.Name}> " + | |
$"Стоимость ремонта: {fixPrice} \n{frame}"); | |
} | |
private void VievRepairMenu() | |
{ | |
const char CommandChoiseFixDetail = '1'; | |
const char CommandFixDenial = '2'; | |
Console.Clear(); | |
Console.WriteLine($"Выберите желаемое действие:" + | |
$"\n{CommandChoiseFixDetail} Выбрать деталь со склада для ремонта" + | |
$"\n{CommandFixDenial} Отказать в обслуживании" + | |
$"\nЛюбая клавиша - вернуться в основное меню"); | |
switch (Console.ReadKey(true).KeyChar) | |
{ | |
case CommandChoiseFixDetail: | |
FixCar(); | |
break; | |
case CommandFixDenial: | |
DenialClient(); | |
break; | |
} | |
} | |
private void FixCar() | |
{ | |
bool isChosenDetailInStock = _stock.TryGetFixDetail(out ServiceDetail detail); | |
if (isChosenDetailInStock && detail.Index == _clients.Peek().Detail.Index) | |
{ | |
_clients.Dequeue().Fix(detail); | |
_wallet += detail.PriceWork + detail.Price; | |
Console.WriteLine($"Поломка успешно исправлена клиент уезжает довольный, а вы заработали {detail.PriceWork}"); | |
} | |
else if (isChosenDetailInStock) | |
{ | |
_clients.Dequeue(); | |
_wallet -= _fineForMisstake + detail.Price; | |
Console.WriteLine($"Вы заменили клиенту не ту деталь, и теряете деньги на стоимости самой детали {detail.Price} " + | |
$"\nи получаете штраф за неоказание клиенту услуги в размере {_fineForMisstake}" + | |
$"\nклиент не желает иметь с вашими специалистами ничего общего и укатывает машину в сервис конкурентов из гаража напротив"); | |
} | |
} | |
private void DenialClient() | |
{ | |
_clients.Dequeue(); | |
_wallet -= _fineForMisstake; | |
Console.WriteLine($"Вы отказываете клиенту в услуге ремоонта и выплачиваете штраф в размере {_fineForMisstake}"); | |
} | |
private void AddClients() | |
{ | |
for (int i = 0; i < UserUtils.GenerateRandomNumber(_minimumClients, _maximumClients); i++) | |
{ | |
_clients.Enqueue(new ClientCar(_stock.FindBrokenDetail())); | |
} | |
} | |
} | |
class ClientCar | |
{ | |
private List<ServiceDetail> _foundParts; | |
public ClientCar(List<ServiceDetail> details) | |
{ | |
_foundParts = new List<ServiceDetail>(); | |
InspectionFirst(details); | |
} | |
public ServiceDetail Detail { get; private set; } | |
public void Fix(ServiceDetail detail) => | |
Detail = detail; | |
private void InspectionFirst(List<ServiceDetail> details) | |
{ | |
int randomBrokenDetailIndex = UserUtils.GenerateRandomIndex(details.Count); | |
for (int i = 0; i< details.Count; i++) | |
{ | |
if( i == randomBrokenDetailIndex) | |
{ | |
Detail = new ServiceDetail(details[i].Index, details[i].Name, details[i].Price, details[i].PriceWork, true); | |
_foundParts.Add(Detail); | |
} | |
else | |
{ | |
_foundParts.Add(new ServiceDetail(details[i].Index, details[i].Name, 0, 0, false)); | |
} | |
} | |
} | |
} | |
class ServiceDetail | |
{ | |
private static int s_index = 1; | |
public ServiceDetail(string name, int price, int priceWork) | |
{ | |
Price = price; | |
PriceWork = priceWork; | |
Name = name; | |
Index = s_index++; | |
IsBroken = false; | |
} | |
public ServiceDetail(int index, string name, int price, int priceWork, bool isBroken) | |
{ | |
Price = price; | |
PriceWork = priceWork; | |
Name = name; | |
Index = index; | |
IsBroken = isBroken; | |
} | |
public bool IsBroken { get; private set; } | |
public int Index { get; private set; } | |
public int Price { get; private set; } | |
public int PriceWork { get; private set; } | |
public string Name { get; private set; } | |
} | |
class Stock | |
{ | |
private List<ServiceDetail> _detailsTypes; | |
private Dictionary<int, int> _detailsCount; | |
public Stock() | |
{ | |
_detailsTypes = new List<ServiceDetail>(); | |
AddDetailsTypes(); | |
_detailsCount = new Dictionary<int, int>(); | |
AddDetailsCount(); | |
} | |
public List<ServiceDetail> FindBrokenDetail() | |
{ | |
return new List<ServiceDetail>(_detailsTypes); | |
} | |
public void ShowFixDetail() | |
{ | |
for (int i = 0; i < _detailsTypes.Count; i++) | |
{ | |
Console.WriteLine($"Номер: {i + 1}. Деталь: {_detailsTypes[i].Name}; Цена детали: {_detailsTypes[i].Price}; " + | |
$"Цена работы: {_detailsTypes[i].PriceWork}; Количество на складе: {_detailsCount[_detailsTypes[i].Index]}"); | |
} | |
} | |
public bool TryGetFixDetail(out ServiceDetail detail) | |
{ | |
ShowFixDetail(); | |
Console.WriteLine($"Введите номер выбранной детали, для установки её клиенту"); | |
if (int.TryParse(Console.ReadLine(), out int result) && result > 0 && result <= _detailsTypes.Count && _detailsCount[_detailsTypes[result - 1].Index] > 0) | |
{ | |
int typeListIndex = result - 1; | |
SpendOneDetail(typeListIndex); | |
Console.WriteLine($"Для установки клиенту выбрана деталь: {_detailsTypes[typeListIndex].Name}"); | |
detail = _detailsTypes[typeListIndex]; | |
return true; | |
} | |
Console.WriteLine("Деталь с таким номером не найдена на складе"); | |
detail = null; | |
return false; | |
} | |
private void AddDetailsTypes() | |
{ | |
_detailsTypes.AddRange(new ServiceDetail[] { | |
new ServiceDetail("Лобовое стекло", 20000, 10000), | |
new ServiceDetail("Двигатель", 50000, 30000), | |
new ServiceDetail("Трансмиссия", 40000, 20000), | |
new ServiceDetail("Колесо", 20000, 10000), | |
new ServiceDetail("Карбюратор", 30000, 15000), | |
}); | |
} | |
private void SpendOneDetail(int typeListIndex) | |
{ | |
int detailIndex = _detailsTypes[typeListIndex].Index; | |
int detailCount = _detailsCount[detailIndex] - 1; | |
_detailsCount.Remove(detailIndex); | |
_detailsCount.Add(detailIndex, detailCount); | |
} | |
private void AddDetailsCount() | |
{ | |
int countMaximum = 3; | |
foreach (ServiceDetail detail in _detailsTypes) | |
{ | |
_detailsCount.Add(detail.Index, UserUtils.GenerateRandomNumber(countMaximum)); | |
} | |
} | |
} | |
static class UserUtils | |
{ | |
private static Random s_random = new Random(); | |
public static int GenerateRandomNumber(int min, int max) => | |
s_random.Next(min, max + 1); | |
public static int GenerateRandomNumber(int max) => | |
s_random.Next(max + 1); | |
public static int GenerateRandomIndex(int max) => | |
s_random.Next(max); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment