Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти ближайший элемент в массиве 
:(
    Опции темы
Exception
Дата 7.6.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 18
Всего: 186



Код находит индекс ближайшего к заданному числу элемента массива и возвращает его (индекс).

Код
''' <summary>Находит индекс ближайшего значения к заданному числу среди предложенных.</summary>
''' <returns>Индекс ближайшего значения к <c>num</c> из массива <c>variants</c>.</returns>
''' <param name="num">Заданное число.</param>
''' <param name="variants">Массив возможных значений.</param>
Public Function FindClosest (num As Integer, variants As Integer()) As Integer
    variants.Sort ()
    Dim myIndex As Integer = variants.BinarySearch (num)
    If myIndex >= 0 Then ' точное совпадение
        Return myIndex
    Else
        myIndex = Not (myIndex) ' индекс ближайшего большего элемента
        If myIndex >= variants.Length Then ' выходит за рамки 
            Return variants.Length - 1 ' возвращаем индекс последнего значения
        Else ' где-то между двумя значениями
            Dim lesser As Integer = variants(myIndex - 1) ' предыдущее
            Dim greater As Integer = variants(myIndex) ' последующее
            Return Interaction.IIf (num - lesser < greater - num, myIndex - 1, myIndex) ' ближайшее
    End If
End Function
' ...
Dim values As Integer() = New Integer() {10, 15, 20, 25, 30}
Assert.AreEqual (values(FindClosest (3, values)), 10)
Assert.AreEqual (values(FindClosest (11, values)), 10)
Assert.AreEqual (values(FindClosest (14, values)), 15)
Assert.AreEqual (values(FindClosest (17.5, values)), 20) ' возвращает больший
Assert.AreEqual (values(FindClosest (39, values)), 30)

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.