Skip to content

Instantly share code, notes, and snippets.

@tsk-arh
Last active February 10, 2024 14:23
Show Gist options
  • Save tsk-arh/9c3f9f0984db6a5c821eea090113cacd to your computer and use it in GitHub Desktop.
Save tsk-arh/9c3f9f0984db6a5c821eea090113cacd to your computer and use it in GitHub Desktop.
ЗАДАНИЕ Автосервис
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