Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342

Как и на чем реализовать дробление диапазона

16.01.2026, 11:44. Показов 520. Ответов 8

Студворк — интернет-сервис помощи студентам
Задачу не просто сформулировать непротиворечиво. Для реализации, видимо нужно использовать не массивы, а коллекцию.
Приведу конкретный пример задачи:
1. Есть начало и конец чистовой последовательности 1 и 23, в которой присутствуют все целые числа (1,2,3,4,...,21,22,23).
2. Программа обрабатывает цикл внешних условий, срабатывание условия должно разбить исходную последовательность на две, с исключением числа, по которому сработало условие. Например сработало на 7: должно стать две последовательности 1_6 и 8_23.
3. Количество сработавших внешних условий может быть любым. Сами числа внутри диапазонов не нужны для дальнейшей работы программы - нужна возможность получить номер начала и конца диапазона. Если в диапазоне осталось одно число то тут можно либо вообще выбросить такой диапазон, либо это число записывать два раза и как начало и как конец диапазона.
В конечном виде хотелось бы получить такие результаты:
3_6
8_12
15_16
19_23
Если бы условия срабатывали по возрастающей, то наверное можно было через For в переборе чисел, набирать диапазоны в коллекцию.
Но для меня пока составляет сложность внеочередности срабатываний условий, когда например сначала выпадает 14, а после выпадает 7!... Я пытаюсь сообразить как организовать возрастающую очередность появления условий, не совсем уверен что такое получится...
Поэтому, прошу советов, как можно подступиться к такой задаче и какой объект лучше использовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.01.2026, 11:44
Ответы с готовыми решениями:

Разделить исходный список на два списка: список чисел из диапазона [a,b] и список чисел не из заданного диапазона
Создайте приложение, которое разделит исходный список из вещественных чисел на два списка: список...

Получение текущей недели(диапазон Datetime) и текущего месяца(диапазон DateTime)
Есть переменная Datetime в которой хранится сегодняшняя дата, и на основе этой переменной создать...

Как реализовать вывод только ошибки, соответствующей не указанию диапазона Excel?
Добрый день! Реализовал программку для импорта ексельки в датагридвью через указание пути к файлу и...

8
sleep
 Аватар для I can
4931 / 4593 / 840
Регистрация: 13.04.2015
Сообщений: 9,752
16.01.2026, 12:19
Цитата Сообщение от filat18 Посмотреть сообщение
сначала выпадает 14, а после выпадает 7
То есть, это два разных события? А результат должен быть один?

Добавлено через 1 минуту
Как понять то "всё уже случилось", и можно начинать работу?

Добавлено через 39 секунд
Вот в этот момент и нужно сортировать исходные данные и получать результат.
0
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342
16.01.2026, 13:34  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Как понять то "всё уже случилось", и можно начинать работу?

Вот в этот момент и нужно сортировать исходные данные и получать результат.
Сложный вопрос - это надо осмыслить и понять плюсы и минусы.
Пока подумывал о варианте работы в процессе с текущим разбиванием по имеющемуся условию, не дожидаясь окончания поступления условий...
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,732
Записей в блоге: 1
16.01.2026, 13:43
Уточняющий вопрос - исходная числовая последовательность 1...23 сформирована и статичная на момент начала обработки внешних условий?

Добавлено через 1 минуту
Ещё вопрос - можно ли сначала накопить все "условия" и по команде обработать исходную последовательность? Или требуется выдача результатов как реакция на поступление каждого "условия"?
0
sleep
 Аватар для I can
4931 / 4593 / 840
Регистрация: 13.04.2015
Сообщений: 9,752
16.01.2026, 14:05
Пока "родился" такой вариант
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="n">Начало основного диапазона</param>
    ''' <param name="k">Конец основного диапазона</param>
    ''' <param name="a">Массив значений</param>
    ''' <returns></returns>
    Public Function GetDiaps(n As Integer, k As Integer, a As Integer()) As String()
        Dim r As List(Of String) = New List(Of String)
        Dim l As List(Of Integer) = a.ToList
        Dim min As Integer
        Do
            min = l.Min
            If min = n Then n = min + 1
            If min > n Then
                r.Add(n.ToString & "_" & (min - 1).ToString)
                n = min + 1
            End If
            l.Remove(min)
            If l.Count = 0 Then r.Add(n.ToString & "_" & k.ToString) : Exit Do
        Loop While n < k
        Return r.ToArray
    End Function
Миниатюры
Как и на чем реализовать дробление диапазона  
1
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342
16.01.2026, 14:18  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
Уточняющий вопрос - исходная числовая последовательность 1...23 сформирована и статичная на момент начала обработки внешних условий?
Да, сформирована и статична! - это обязательное и нерушимое условие! Точнее, приходит начало и конец, числа внутри подразумеваются и нужны только для самого деления на диапазоны. На выходе нужно получить коллекцию "увязанных" пар чисел, в которых не произошло разбиения. Начало, почти всегда, будет = 1, не исключать и другие варианты не могу... В исходной паре точно присутствуют все числа - пропусков точно не может быть.
Цитата Сообщение от Uswer Посмотреть сообщение
Ещё вопрос - можно ли сначала накопить все "условия" и по команде обработать исходную последовательность? Или требуется выдача результатов как реакция на поступление каждого "условия"?
Т.е. собрать коллекцию условий, выполнить сортировку, а потом обработать на создание действительных пар, образовывающие диапазоны? Если я правильно понял, то это перефразированная мысль, озвученная I can.

Добавлено через 5 минут
Цитата Сообщение от I can Посмотреть сообщение
Пока "родился" такой вариант
очень похоже на искомое - попробую вписать в мою конструкцию.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18285 / 14208 / 5368
Регистрация: 17.03.2014
Сообщений: 28,888
Записей в блоге: 1
16.01.2026, 23:31
filat18, вот еще вариант немного короче. Получение диапазонов в строках 6..9.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim numbers As List(Of Integer) = Enumerable.Range(1, 23).ToList()
Dim rnd As New Random
For I = 0 To 4
    numbers.RemoveAt(rnd.Next(numbers.Count)) ' Симуляция удаления
 
    Dim ranges As IEnumerable(Of Range) = numbers.Select(Function(n, idx) New With {.N = n, .Idx = idx}).
        GroupBy(Function(x) x.N - x.Idx).
        Select(Function(g) New Range(g.First().N, g.Last().N)).
        Where(Function(r) r.Start <> r.Finish) ' Если в диапазоне только одно число, то пропускаем
    For Each r As Range In ranges
        Console.WriteLine($"{r.Start}..{r.Finish}")
    Next
    Console.WriteLine()
Next
VB.NET
1
2
3
4
5
6
7
8
9
Public Structure Range
    Public ReadOnly Start As Integer
    Public ReadOnly Finish As Integer
    
    Public Sub New(Start As Integer, Finish As Integer)
        Me.Start = Start
        Me.Finish = Finish
    End Sub
End Structure
1
8 / 7 / 4
Регистрация: 03.12.2020
Сообщений: 342
17.01.2026, 09:38  [ТС]
OwenGlendower, тоже посмотрю - попробую. Вот как по мне, код будет по сложнее в плане понимания.
Я бы отметил вариант I can, как решение, но в том коде не обрабатывается случай, когда условие срабатывает на номере конец исходного диапазона. Остановился на такой правке:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Public Function GetDiaps(n As Integer, k As Integer, a As Integer()) As (Integer, Integer)()
        Dim r As List(Of (Integer, Integer)) = New List(Of (Integer, Integer))
        Dim l As List(Of Integer) = a.ToList
        Dim min As Integer
        Do
            min = l.Min
            If min = n Then n = min + 1
            If min > n Then 
                r.Add((n, min - 1))
                n = min + 1
            End If
            l.Remove(min)
            If l.Count = 0 And n <= k Then r.Add((n, k)) : Exit Do ' тут добавил условие
        Loop While n < k        
        Return r.ToArray
    End Function
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18285 / 14208 / 5368
Регистрация: 17.03.2014
Сообщений: 28,888
Записей в блоге: 1
17.01.2026, 10:37
Цитата Сообщение от filat18 Посмотреть сообщение
Вот как по мне, код будет по сложнее в плане понимания.
По моему нет. Сложность там только в строке с группировкой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.01.2026, 10:37
Помогаю со студенческими работами здесь

Реализовать функцию нахождения всех простых чисел в указанном диапазоне
Реализовать функцию нахождения всех простых чисел в указанном диапазоне (ввести с консоли)....

Реализовать программу, которая определяет текущее время и в зависимости от этого диапазона выводит одно из сообщений
Реализовать программу, которая определяет текущее время и в зависимости от этого диапазона выводит...

Реализовать открытый метод, который генерирует Kol_el случайных чисел целого типа из диапазона
В Class1 реализовать открытый метод MyNext, который генерирует Kol_el случай-ных чисел целого типа...

Реализовать функцию нахождения всех простых чисел в диапазоне
Здравствуйте помогите решить пожалуйста. Реализовать функцию нахождения всех простых чисел в...

Реализовать свойство Speed таким образом, чтобы при присвоении значения проверялся выход из диапазона
нужно реализовать свойство Speed таким образом чтобы при присвоении значения превышающего...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru