powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Найти второе наибольшее значение
17 сообщений из 17, страница 1 из 1
Найти второе наибольшее значение
    #34980819
sonique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,
помогите, пожалуйста, найти втрое наибольшее значение в listbox.

Private Function vtoroe (List1 As ListBox) As Integer
Dim max1 As Integer, max2 As Integer, J As Integer, i As Integer
max1 = 0
max2 = 0

For i = 0 To List1.ListCount - 1
J = List1.List(i)
If J >= max1 Then
max2 = max1
max1 = J
ElseIf J >= max2 Then
max2 = J
End If
Next i
vtoroe = max2
End Function

Если пишу так, то в случае если в listbox есть 2 одинаковых наибольших значения, то его и выдает.
То есть, например, 45 45 33 22 11 . Выдает 45??? Как сделать чтобы было 33????

Большое спасибо заранее за помощь.
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34981162
Belkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замени больше или равно (>=) на болше (>)
-----------
Андрей.
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34982234
sonique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не работает((((
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34982413
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Function vtoroe(a() As Integer) As Integer
    Dim max1 As Integer, max2 As Integer, J As Integer, i As Integer
    max1 =  0 
    max2 =  0 

    For i =  0  To List1.ListCount -  1 
        J = List1.List(i)
        If J > max1 Then
            max2 = max1
            max1 = J
        End If
    Next i
    vtoroe = max2
End Function


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34983154
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если лист бокс сортирован (Sorted = True), то так:

Код: plaintext
1.
2.
Private Function GetSecondMax() As Integer
    GetSecondMax = List1.List(List1.ListCount -  2 )
End Function
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34983558
sonique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если нет???
что то все равно не получается(
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34983660
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если нет, то тогда пользуйтесь кодом от HandKot. Чем он плох?
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34983662
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там только аргумент не нужен. Уберите.
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34983711
sonique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может я что то не так делаю, но у меня этот код не работает((((
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34983968
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробовали трассировать, почему не работает?

что выдает при вашем наборе?


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34984910
sonique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает , на половину)
Когда лист: 1,2, 3, 4, 5, , то находит.
а когда 5, 4,3, 2, 1 , то выдает 0.
((((((((((((((
что такое трассировать, к сожалению, не знаю(
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34984931
Belkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поменяй строку
For i = 0 To List1.ListCount - 1
на
For i = LBound(List1) To UBound(List1
-----------
Андрей.
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34985605
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
разобрался
вот код, порверяйте
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private Function vtoroe(List1 As ListBox) As Integer
    Dim max1 As Integer, max2 As Integer, J As Integer, i As Integer
    
    max1 =  0 
    max2 =  0 

    For i =  0  To List1.ListCount -  1 
        J = List1.List(i)
        If J > max1 Then
            max2 = max1
            max1 = J
        End If
        If J > max2 And J < max1 Then max2 = J
    Next i
    
    vtoroe = max2
End Function
I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34986132
sonique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо огромное)))) Все работает))))


когда-нибудь, я тоже научусь))))
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34986138
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормально, только я бы не стал называть аргумент функции именем конкретного лист бокса, а иначе его вообще можно не передавать как аргумент (List1 - имя контроля по умолчанию, что ввергает в раздумья).
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34986456
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вообще обойтись без циклов, поставив невидимый сортированный лист бох и поддерживая его синхронно с видимым несортированным. Потом - то, что я уже показывал. Не знаю, насколько это красиво.
...
Рейтинг: 0 / 0
Найти второе наибольшее значение
    #34995265
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вариант "без циклов". Подсоедините АДО. Тут есть цикл, но исключительно для загрузки записи и листа случайными данными. Само нахождение второго максимума - безцикловое. В форме:

Код: plaintext
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.
Option Explicit

Private mrsListData As ADODB.Recordset

Public Sub MakeDataList(ByVal pintNbrOfItems As Integer)
    Dim intListIndex As Integer
    Dim intListItem As Integer
    
    Set mrsListData = New ADODB.Recordset
    
    With List1
        .Clear
         .Height =  4400 
    End With
    
    Randomize
    
    With mrsListData
    
        With .Fields
            .Append "ListIndex", adSmallInt
            .Append "Item", adSmallInt
        End With
        
        .Open
        
        For intListIndex =  0  To pintNbrOfItems
            intListItem = Int(( 10000  * Rnd) +  1 )
            List1.AddItem CStr(intListItem), intListIndex
            .AddNew Array("ListIndex", "Item"), Array(intListIndex, CStr(intListItem))
        Next intListIndex
    
    End With
    
End Sub

Private Sub Form_Load()
    MakeDataList  30 
End Sub

Private Sub Command1_Click()
    List1.ListIndex = HighlightSecondMaximum
End Sub

Public Function HighlightSecondMaximum() As Integer
    
    With mrsListData
        .Sort = "Item desc"
        
        If .RecordCount >  1  Then
            .MoveNext
        End If
        
        HighlightSecondMaximum = .Collect( 0 )
        
    End With
    
End Function

Нажмите на кнопку, и высветится второй максимум. Решение подсказано программистом SBerthold.

Успехов.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Найти второе наибольшее значение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]