powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Косячно работает сортировка
20 сообщений из 20, страница 1 из 1
Косячно работает сортировка
    #36436597
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такой код

Код: 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.
'----------------------------------------------------------------------------------------------------------------------------
' Данная функция сортирует массив по заданному направлению по указанному столбцу, по умолчанию направление по убыванию,
' но если в качестве 3ей переменной указать иное значение (не desc) то массив будет отсортирован по возрастанию
' Для использования функции должен быть объявлен непустой массив, 2ая переменная номер столбца,3я номер опционально направление
' в случае успешного выполнения функция принимает значение TRUE иначе FALSE
'----------------------------------------------------------------------------------------------------------------------------
Public Function SortArrayBubble(ByRef InArr() As Variant, ByVal ColNum As Integer, Optional direct As String = "desc") As Boolean
    SortArrayBubble = False
On Error GoTo endt

If ColNum <= UBound(InArr,  2 ) Then
Dim TempArr() As Variant
ReDim Preserve TempArr( 1 , UBound(InArr,  2 )) As Variant

If direct = "desc" Then
    For I =  2  To UBound(InArr,  1 )
        For J = UBound(InArr,  1 ) To I Step - 1 
        If UCase(InArr(J -  1 , ColNum)) < UCase(InArr(J, ColNum)) Then
            For K =  1  To UBound(InArr,  2 )
                TempArr( 1 , K) = InArr(J -  1 , K)
                InArr(J -  1 , K) = InArr(J, K)
                InArr(J, K) = TempArr( 1 , K)
            Next K
        End If
        
        Next J
    Next I

Else
    For I =  2  To UBound(InArr,  1 )
        For J = UBound(InArr,  1 ) To I Step - 1 
        If InArr(J -  1 , ColNum) > InArr(J, ColNum) Then
            For K =  1  To UBound(InArr,  2 )
                TempArr( 1 , K) = InArr(J -  1 , K)
                InArr(J -  1 , K) = InArr(J, K)
                InArr(J, K) = TempArr( 1 , K)
            Next K
        End If
        
        Next J
    Next I
End If
Erase TempArr
SortArrayBubble = True

End If
endt:

End Function

не сортирует следующий массив данных по столбику 3, причем по столбцу 2 все просто супер

4956 1062067001 0,1068
4956 1320674005 0,1000
4956 1320674014 0,1020
4956 1320674015 0,1013
4956 9039210810 0,1104
4956 1320649016 0,1479
4956 1320650001 0,1414
4956 1063830001 0,0932
4956 1321056008 0,0896
4956 1398800055 0,0839
4956 1398800056 0,0897
4956 1399900007 0,0879
4956 1399900008 0,0913
4956 1399900009 0,0899
4956 2400018483 0,0927
4956 2400018486 0,0954
4956 2400018516 0,0897
4956 3422109011 0,0839
4956 9009073818 0,1097
4956 9009073819 0,0947
4956 9009073821 0,0839

выдает бредовый результат
например запись
4956 1320649016 0,147
которая должна быть в топе, получается на 13-ой позиции
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436604
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл указать
не работает именно сортировка ПО УБЫВАНИЮ.
ПО возрастанию все ок.
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436619
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus,

Эх, еще бы код вызова функции с предзаполнением масива и код его выброса на экран. Посмотрел бы, а самому заполнять лень
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436627
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

cells можно поменять на принт дебаг

Код: 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.
Public Sub SORTING()
Dim InArr( 1  To  21 ,  1  To  3 ) As Variant

For I =  1  To UBound(InArr,  1 )
For J =  1  To UBound(InArr,  2 )
InArr(I, J) = Cells(I, J)
Next J
Next I



fgt = SortArrayBubble(InArr,  3 , "desc")

If ArrayIsEmpty(InArr) = False Then
For I =  1  To UBound(InArr,  1 )
For J =  1  To UBound(InArr,  2 )
Cells(I, J +  5 ) = InArr(I, J)
Next J
Next I
End If

fgt = SortArrayBubble(InArr,  2 , "desc")


If ArrayIsEmpty(InArr) = False Then
For I =  1  To UBound(InArr,  1 )
For J =  1  To UBound(InArr,  2 )
Cells(I, J +  10 ) = InArr(I, J)
Next J

Next I
End If

End Sub
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436637
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

когда

UCASE из этой схемы выкидываю

Код: plaintext
If UCase(InArr(J -  1 , ColNum)) < UCase(InArr(J, ColNum)) Then

сортировка работает
выходит косяк в схеме UCASE со значениями типа DOUBLE
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436659
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше так
а то из топика массив не выбирается
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436662
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanus
выходит косяк в схеме UCASE со значениями типа DOUBLE



Как вы умудряетесь применять текстовую функцию к числу????
И главное - ЗАЧЕМ?
Разумеется, дело в этом.

И, разумеется, в этом случае даже целое число 5 у вас окажется больше, чем 35
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436669
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

косяк...
получается функция которая сортирует не может быть универсальной и на входе надо определять тип данных?
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436680
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
?ucase( 5 )<ucase( 35 )
False

Почему не может? Может. Просто не применяйте UCase для числовых типов.
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436711
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus
> получается функция которая сортирует не может быть универсальной

Ну почему, можно и сделать, только всякая универсальность такого рода это жертвование быстродействием

> и на входе надо определять тип данных?

Так точно

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436713
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте про

Код: plaintext
Option Compare {Binary | Text | Database}

Вам UCase вообще не понадобится
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436729
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

ясно, свой затуп понял

9 будет больше 1 000 000

тогда встречный вопрос
как мне определить тип поля массива типа Variant?

пока надумал вариант типа равности исходного и преобразованного варианта
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436760
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shamanusтогда встречный вопрос
как мне определить тип поля массива типа Variant?
пока надумал вариант типа равности исходного и преобразованного варианта


Не нужно вам это
Option Compare Text
замечательно работает для вашего случая (щас проверил)
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36436864
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shamanus
> тогда встречный вопрос
> как мне определить тип поля массива типа Variant?

Код: plaintext
1.
2.
3.
4.
5.
6.
Sub dfg()
Dim a( 1  To  2 ) As Variant
a( 1 ) =  2 . 45 
a( 2 ) = "dfhs"
Debug.Print VarType(a( 1 ))
Debug.Print VarType(a( 2 ))
End Sub


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36437051
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

О! очень напоминает типы полей рекордсета в Access.
Ясно спасибо!
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36437053
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

А после помещения этого в код что использовать? Ucase или без него?
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36437058
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusShocker.Pro,

А после помещения этого в код что использовать? Ucase или без него?

Без него.

То бишь ВМЕСТО Ucase
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36437063
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShamanusО! очень напоминает типы полей рекордсета в Access.

Очень напоминает типы данных VB (к чему бы это )
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36437077
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

ну началось обсмеивание убогих , я же не это имел ввиду
спасибо
...
Рейтинг: 0 / 0
Косячно работает сортировка
    #36437280
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shamanus
> получается функция которая сортирует не может быть универсальной

Ну почему, можно и сделать, только всякая универсальность такого рода это жертвование быстродействием +1.Игорь Горбонос> и на входе надо определять тип данных?

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


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