Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Найти второе наибольшее значение / 17 сообщений из 17, страница 1 из 1
02.12.2007, 21:41
    #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
03.12.2007, 09:07
    #34981162
Belkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
Замени больше или равно (>=) на болше (>)
-----------
Андрей.
...
Рейтинг: 0 / 0
03.12.2007, 14:05
    #34982234
sonique
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
не работает((((
...
Рейтинг: 0 / 0
03.12.2007, 14:49
    #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
03.12.2007, 17:52
    #34983154
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
Если лист бокс сортирован (Sorted = True), то так:

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

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


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
04.12.2007, 13:29
    #34984910
sonique
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
Работает , на половину)
Когда лист: 1,2, 3, 4, 5, , то находит.
а когда 5, 4,3, 2, 1 , то выдает 0.
((((((((((((((
что такое трассировать, к сожалению, не знаю(
...
Рейтинг: 0 / 0
04.12.2007, 13:34
    #34984931
Belkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
Поменяй строку
For i = 0 To List1.ListCount - 1
на
For i = LBound(List1) To UBound(List1
-----------
Андрей.
...
Рейтинг: 0 / 0
04.12.2007, 16:11
    #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
04.12.2007, 18:37
    #34986132
sonique
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
Спасибо огромное)))) Все работает))))


когда-нибудь, я тоже научусь))))
...
Рейтинг: 0 / 0
04.12.2007, 18:39
    #34986138
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
Нормально, только я бы не стал называть аргумент функции именем конкретного лист бокса, а иначе его вообще можно не передавать как аргумент (List1 - имя контроля по умолчанию, что ввергает в раздумья).
...
Рейтинг: 0 / 0
04.12.2007, 21:16
    #34986456
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти второе наибольшее значение
Можно вообще обойтись без циклов, поставив невидимый сортированный лист бох и поддерживая его синхронно с видимым несортированным. Потом - то, что я уже показывал. Не знаю, насколько это красиво.
...
Рейтинг: 0 / 0
07.12.2007, 19:06
    #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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Найти второе наибольшее значение / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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