Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для Mr_Cipa
1 / 1 / 0
Регистрация: 13.06.2015
Сообщений: 65

Какие коллекции использовать для решения задач с задачами движения транспорта по маршруту

03.10.2020, 21:03. Показов 1274. Ответов 2

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Стоит вот такая задачка. Подскажите пожалуйста, какой коллекцией для хранения маршрута воспользоваться в данной ситуации?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.10.2020, 21:03
Ответы с готовыми решениями:

Подскажите, какие методы используются для решения данных задач?
подскажите какие методы используются для решения данных задач

Подскажите, какие формулы использовать для решения данной задачи?
Срок службы прибора представляет собой случайную величину, имеющую нормальное распределение, с гарантией на 15 лет и с.к.о., равным 3...

Подскажите какие финансовые функции использовать для решения задачи
По сертификату, погашаемому выплатой в 250 тыс. руб. через три года, проценты начисляются раз в полугодие. Определите цену продажи, если...

2
99 / 81 / 93
Регистрация: 03.12.2013
Сообщений: 217
04.10.2020, 01:08
Лучший ответ Сообщение было отмечено Mr_Cipa как решение

Решение

Mr_Cipa, Выбор коллекции всегда зависит от вашей конкретной реализации. Я думаю, что для этой задачи достаточно и List при правильной разбивке на классы.
Вот вам рабочий пример реализации:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace Test
{
    public class Test
    {
        public static string Route = "Gomel - Rechica - Svetlogorsk - Zhlobin - Bobruisk ";
 
        public static void Main(string[] args)
        {
            var bus = new Bus(2, Route, new BusType { BusTypeName = "Man", OneCityPrice = 100 });
            Console.WriteLine(bus.FreePlacesText());
 
            bus.BuyTicket("Gomel", "Svetlogorsk");
            Console.WriteLine(bus.FreePlacesText());
 
            bus.BuyTicket("Gomel", "Zhlobin");
            Console.WriteLine(bus.FreePlacesText());
 
            bus.BuyTicket("Gomel", "Rechica");
            Console.WriteLine(bus.FreePlacesText());
 
            bus.BuyTicket("Svetlogorsk", "Bobruisk");
            Console.WriteLine(bus.FreePlacesText());
        }
    }
 
    public class Bus
    {
        // Max places, can be readonly if needed (max places for one bus is always the same after initialization)
        public int MaxSittingPlaces { get; set; }
        // Info about every city 
        public List<RouteCity> CitiesToRide { get; set; } = new List<RouteCity>();
        public BusType BusType { get; set; }
        // Note: we envolve that price to every city is the same;
        // you can change it to km if needed
        public int PriceToOneCity
        {
            get
            {
                if(BusType == null)
                {
                    Console.WriteLine("There are no buses in this route.");
                    return 0;
                }
 
                return BusType.OneCityPrice;
            }
        }
 
        public Bus(int maxSittingPlaces, List<RouteCity> citiesToRide, BusType busType)
        {
            MaxSittingPlaces = maxSittingPlaces;
            CitiesToRide = citiesToRide;
            BusType = busType;
        }
 
        // There could be better way to write route
        public Bus(int maxSittingPlaces, string route, BusType busType)
        {
            MaxSittingPlaces = maxSittingPlaces;
            BusType = busType;
 
            var routeCities = route.Trim().Split("-")?.Select(r => r.Trim())?.ToList();
            foreach (var city in routeCities)
                CitiesToRide.Add(new RouteCity { CityName = city, FreePlaces = MaxSittingPlaces });
        }
 
        public bool BuyTicket(string from, string to)
        {
            // create local(for this function) copy of the cities
            var cities = new List<RouteCity>(CitiesToRide);
 
            for(int i = 0; i < cities.Count; i++)
            {
                // When we found city from where we want to start going
                if( cities[i].CityName.ToLower() == from.ToLower() )
                {
                    // Remove free place in every city in user route
                    // (city where user is going too stayed with the same free places, cause user ends his ride here
                    while (i < cities.Count && !(cities[i].CityName.ToLower() == to.ToLower()))
                    {
                        // If there is no free places in one of the cities from route - don't allow to buy the ticket
                        if( !(cities[i].FreePlacesExit()))
                        {
                            Console.WriteLine($"There is no free places from the {from} station.");
                            return false;
                        }
 
                        cities[i].FreePlaces--;
                        i++;
                    }
                }
            }
 
            CitiesToRide = cities;
            Console.WriteLine($"Ticket is bought.");
 
            return true;
        }
 
        // Could be used StringBuilder for better performance
        public string FreePlacesText()
        {
            var text = "";
 
            for(int i = 0; i < CitiesToRide.Count - 1; i++)
            {
                for(int j = i + 1; j < CitiesToRide.Count; j++)
                {
                    var from = CitiesToRide[i].CityName;
                    var to = CitiesToRide[j].CityName;
 
                    text += $"{from} - {to} : {RouteFreePlaces(from, to)} places\n";
                }
            }
 
            return text;
        }
 
        // Not used but could be good to check if city exists in bus route
        private bool CityOnRouteCheck(string cityName)
        {
            var getCity = CitiesToRide?.Select(c => c.CityName)?.Where(c => c.Trim().ToLower() == cityName.Trim().ToLower())?.FirstOrDefault();
            return !(string.IsNullOrEmpty(getCity));
        }
 
        //Returns free places for sitting in the user route(from - to) part of bus full route
        // logic is that we get min value of the free paces on route where you will go
        // If in any of the cities will be 0 free places - it means that there is 0 free classes on this route
        private int RouteFreePlaces(string from, string to)
        {
            var freePlaces = MaxSittingPlaces;
 
            for (int i = 0; i < CitiesToRide.Count; i++)
            {
                if(CitiesToRide[i].CityName.ToLower() == from.ToLower())
                {
                    while (i < CitiesToRide.Count && !(CitiesToRide[i].CityName.ToLower() == to.ToLower()))
                    {
                        if (freePlaces > CitiesToRide[i].FreePlaces)
                            freePlaces = CitiesToRide[i].FreePlaces;
 
                        i++;
                    }
                }
            }
 
            return freePlaces;
        }
 
        // To get free places on some city from the bus route
        public int BusFreePlaces(string cityWhereIsBus)
        {
            return CitiesToRide?.Where(c => c.CityName.Trim().ToLower() == cityWhereIsBus.Trim().ToLower())?.FirstOrDefault().FreePlaces ?? 0;
        }
 
        // Price is count of the cities that user is driven and price of road from one city to another
        public int RoadPrice(string from, string to)
        {
            var citiesOnRoute = 0;
 
            for (int i = 0; i < CitiesToRide.Count; i++)
            {
                if (CitiesToRide[i].CityName.ToLower() == from.ToLower())
                {
                    while (i < CitiesToRide.Count && !(CitiesToRide[i].CityName.ToLower() == to.ToLower()))
                    {
                        citiesOnRoute++;
                        i++;
                    }
                }
            }
 
            return citiesOnRoute * PriceToOneCity;
        }
    }
 
    // Here can be some custom value like "BusComfort" to make some percent coefficient to make some busses 
    // more expensive automatically
    public class BusType
    {
        public int OneCityPrice { get; set; }
        public string BusTypeName { get; set; }
    }
 
    // Class for every city has information about number of places that i available here
    public class RouteCity
    {
        public string CityName { get; set; }
        public int FreePlaces { get; set; }
 
        public bool FreePlacesExit()
        {
            return (FreePlaces > 0) ? true : false;
        }
    }
}
Код работает, запускаеться, вроде правильно, но набросал на скорую руку и дорабатывать можно еще там много.

Но, как я и говорил, вариантов реализации может быть много. Например, вместо создания класса RouteCity можно просто использовать какой-то KeyValuePair <string, int> (string - название города, int - количество мест) или Dictionary <TKey, TValue> и тогда стучаться к значению свободных мест прямо по названию города.
А так, если правильно разделите все необходимые элементы на классы - то вам, думаю, должно вполне хватить и List реализации.
1
 Аватар для Mr_Cipa
1 / 1 / 0
Регистрация: 13.06.2015
Сообщений: 65
09.10.2020, 08:24  [ТС]
Sacred6661, спасибо. Я пока не знаком с паттернами и хотел уточнить. Пользовались ли вы каким нибудь паттерном при разработке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2020, 08:24
Помогаю со студенческими работами здесь

Какие методы можно использовать для решения данной математической модели?
Какие методы можно использовать для решения данной математической модели?И как правильно это сделать? (Приложен файл)

Какой цикл (For, While или Repeat) лучше использовать для решения задач с последовательностями?
Какой цикл For, While или Repeat лучше использовать для решения задач с последовательностями.

Какие коллекции когда лучше использовать?
Доброго времени суток. Подскажите, пожалуйста, в каких случаях что нужно использовать и в чем между ними разница. p.s. Я понимаю, что...

Какие типы использовать при каких кодировках и для каких задач?
Здравствуйте. Я изучаю C++ не первый месяц, однако до сих пор не разобрался в типах и каждый раз открываю что то новое для себя, через...

Составить график движения автобуса по маршруту
Добрый день! Прошу пожалуйста помогите решить задачу я не селен в экселе. Автобус курсирует по ул. Советская, время движения от одной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru