Skip to content

Instantly share code, notes, and snippets.

@Stas2056
Created April 24, 2025 17:14
Show Gist options
  • Save Stas2056/aa5283e6cba536e5c8b4719e2b8a9216 to your computer and use it in GitHub Desktop.
Save Stas2056/aa5283e6cba536e5c8b4719e2b8a9216 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
namespace HomeWorkPassengerTrainConfigurator
{
internal class Program
{
static void Main(string[] args)
{
Dispatcher dispatcher = new Dispatcher();
DispatcherView view = new DispatcherView(dispatcher);
view.Work();
}
}
class DispatcherView
{
private Dispatcher _dispatcher;
public DispatcherView(Dispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public void Work()
{
const string CommandCreateTrain = "1";
const string CommandExit = "2";
bool isOpen = true;
while (isOpen)
{
_dispatcher.ShowInfo();
Console.Write($"Menu:\nCreate train: {CommandCreateTrain}\nExit: {CommandExit}\nCommand:");
string UserInput = Console.ReadLine();
switch (UserInput)
{
case CommandCreateTrain:
_dispatcher.AddNewTrain();
break;
case CommandExit:
isOpen = CloseTheProgram();
break;
}
Console.Clear();
}
}
private bool CloseTheProgram()
{
Console.Write("The program is closed.");
Console.ReadKey();
return false;
}
}
class Dispatcher
{
private int _idOfLastTrain;
private List<Train> _trains = new List<Train>();
private Random _random = new Random();
public Dispatcher()
{
AddNewTrain();
}
public void AddNewTrain()
{
Direction direction = GenerateDirection();
int ticketsSold = SellTickets();
_idOfLastTrain++;
_trains.Add(CreateNewTrain(direction, ticketsSold));
}
public void ShowInfo()
{
Console.SetCursorPosition(0, 5);
foreach (var train in _trains)
{
train.ShowInfo();
}
Console.SetCursorPosition(0, 0);
}
private Direction GenerateDirection()
{
List<string> cities = new List<string> { "Minsk", "Brest", "Vitebsk", "Grodno", "Gomel", "Mogilev", "Bobruisk", "Baranovichi", "Borisov",
"Pinsk", "Orsha", "Mozyr", "Soligorsk", "Novopolotsk", "Lida", "Molodechno", "Polotsk", "Zhlobin",
"Svetlogorsk", "Rechitsa", "Slutsk", "Kobrin", "Volkovysk", "Kalinkovichi", "Smorgon", "Rogachev",
"Osipovichi", "Bereza", "Nesvizh", "Stolin" };
string cityDepart = cities[_random.Next(cities.Count)];
cities.Remove(cityDepart);
string cityArrives = cities[_random.Next(cities.Count)];
Direction direction = new Direction(cityDepart, cityArrives);
return direction;
}
private int SellTickets()
{
int minTickets = 30;
int maxTickets = 1000;
int ticketsCount = _random.Next(minTickets, maxTickets + 1);
return ticketsCount;
}
private Train CreateNewTrain(Direction direction, int ticketsSold)
{
int seatsInWagon = 54;
int filledWagons = ticketsSold / seatsInWagon;
int seatsOccupiedInLastWagon = ticketsSold % seatsInWagon;
List<Wagon> wagons = new List<Wagon>();
for (int i = 0; i < filledWagons; i++)
{
wagons.Add(new Wagon(seatsInWagon, seatsInWagon));
}
if (seatsOccupiedInLastWagon != 0)
wagons.Add(new Wagon(seatsInWagon, seatsOccupiedInLastWagon));
Train train = new Train(_idOfLastTrain, direction, wagons, ticketsSold);
return train;
}
}
class Direction
{
public Direction(string cityDepart, string cityArrives)
{
CityDepart = cityDepart;
CityArrives = cityArrives;
}
public string CityDepart { get; private set; }
public string CityArrives { get; private set; }
}
class Train
{
private Direction _direction;
private List<Wagon> _wagons = new List<Wagon>();
public Train(int id, Direction direction, List<Wagon> wagons, int ticketsSold)
{
Id = id;
_direction = direction;
_wagons = wagons;
TotalSeats = _wagons.Count * _wagons[0].Seats;
TicketsSold = ticketsSold;
FreeSeats = TotalSeats - TicketsSold;
}
public int Id { get; private set; }
public int TotalSeats { get; private set; }
public int FreeSeats { get; private set; }
public int TicketsSold { get; private set; }
public void ShowInfo()
{
Console.WriteLine($"Train: {Id}, {_direction.CityArrives} - {_direction.CityDepart}, tickets sold {TicketsSold}, " +
$"total seats: {TotalSeats}, free seats {FreeSeats}, wagons count {_wagons.Count}.");
}
}
class Wagon
{
public Wagon(int seats, int seatsOccupied)
{
Seats = seats;
FreeSeats = Seats - seatsOccupied;
}
public int Seats { get; private set; }
public int FreeSeats { get; private set; }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment