Anchoret, да qsort, но тут одна оговорочка. В Си массив n-размерный в памяти расположен как линия, поэтому вообще каждый n-мерный масив можно рассматривать как одномерный массив. не знаю, так ли в вба, поэтому вначале пытался по-простому ( обычным обменом пузырьковым ), ну и к тому же в вба я не получу доступ как памяти, так как там нет указателей. Выглядит сортировка как-то так
Вы не так поняли, я попросту в программе выгрузил с обычного файла неупорядоченный массив и перезаписал новый в упорядоченный, а там скопировал обратно в эксель.
Цитата
Ігор Гончаренко написал: Word мне говорит что в процедуре 421 символ, делим на 1.5 мин получаем скорость набора = 4.7 символа в сек.!я преклоняюсь перед талантом!
Вы, видимо, решили меня потроллить или унизить. 1.5 минуты это, конечно, не так, но не больше 5 минут мне понадобилось на то, чтобы реализовать функцию. Когда ты кодишь, время летит быстро.
В общем, написал на VBA. Моя главная ошибка - я неправильно понял, как хранятся данные в массиве. То есть я писал размерность 4, 10. А это у меня 5 и 11. В си или си++ это было бы 4 и 10 В общем, спасибо всем за помощь
Код
Sub Сортировка()
Dim mass(4, 9) As Variant
Const nLine As Byte = 4
Const nColumn As Byte = 9
' массив из 5 строки и 10 столбцов
For i = 0 To nLine
For j = 0 To nColumn
mass(i, j) = Cells(4 + i, 2 + j).Value
Next j
Next i
'сортировка
Dim iter_ As Byte
iter_ = nLine * 4
While iter_ > 0
For i = 0 To nLine
Dim iter As Byte
iter = nLine
While iter > 0
For j = 0 To nColumn - 1
If mass(i, j) > mass(i, j + 1) Then
Dim temp As Variant
temp = mass(i, j)
mass(i, j) = mass(i, j + 1)
mass(i, j + 1) = temp
End If
Next j
iter = iter - 1
Wend
Dim k As Byte
k = i
If k < 4 Then
If mass(k, nColumn) > mass(k + 1, 0) Then
Dim temp_1 As Variant
temp_1 = mass(k, nColumn)
mass(k, nColumn) = mass(k + 1, 0)
mass(k + 1, 0) = temp_1
End If
End If
Next i
iter_ = iter_ - 1
Wend
'вывод массива
For i = 0 To nLine
For j = 0 To nColumn
Worksheets("4.10").Cells(13 + i, 1 + j) = mass(i, j)
Next j
Next i
End Sub
Deuce97 написал: без обид, но я на Си это сделал за 1,5 минуты.
Я прогаю на Си, на VBA и немного на Java. И скажу, что суть одна. Всё это ООП, все похоже. P.S. Если сетуешь на "плохой" язык программирования, то проблема в существе между клавиатурой и стулом, но не в языке.
Цитата
Anchoret написал: Deuce97 , на Си вроде есть встроеная сортировка?
Да, она есть, но истинных изобретателей велосипедов таких, как Deuce97, обычным заурядным людям не остановить.
З.Ы. зачем в коде Си вы постоянно для каждой базовой итерации инициализируете заново переменные? Почему бы не заменить на просто присвоение значений?
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
ProFessor,СИ не ООП. К тому же в вба привычного мне си-образного я мало нашёл. Тот же массив mass( 4,9) на самом деле из 5 строк и 10 столбцов - МОЯ ГЛАВНАЯ ОШИБКА. В си это бы был массив из 4 строк и 9 столбцов, благо хоть с нуля начинается. Я не говорю, что язык плохой, просто непривычно сразу.
P.S.Первый комментарий ваш по поводу пустого условия. Я хотел найти альтернативу continue, однако не нашёл. Но код тот такое себе. Может, вы альтернативу знаете? к break exit for для цикла со счётчиком.
Цитата
ProFessor написал: З.Ы. зачем в коде Си вы постоянно для каждой базовой итерации инициализируете заново переменные? Почему бы не заменить на просто присвоение значений?
хоть это и офф. топ уже, но всё же: В настоящее время количество прикладных языков программирования (список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. Наиболее распространённые в промышленности языки (С++, Delphi, C#, Java и др.) воплощают объектную модель Симулы. Примерами языков, опирающихся на модель Смолтока, являются Objective-C, Python, Ruby. P.S.
Цитата
Deuce97 написал: Тот же массив mass( 4,9) на самом деле из 5 строк и 10 столбцов - МОЯ ГЛАВНАЯ ОШИБКА
Нет, главная ошибка это писать недокод на VBA и называть себя программистом, при этом обосновывая свои неудачи тупостью языка программирования.
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
Коллеги, не комментировал, но все же вставлю пару слов. ProFessor, в вашем примере нет Си Deuce97, если у вас не получилось сразу это не значит язык плох. Про ООП: Си считается больше процедурным языком, хотя там есть структуры, и ООП напилить можно. В С++ добавили классы и прочие плюхи, классика ООП. Далее самое главное в программе не ее реализация (язык), а голова и руки (присутствует, прямые). Вообщем расширяйте свой кругозор, программируемое на разных языках или на одном... По задаче, можно пойти и таким путем: сложить все в один массив, отсортировать и выложить обратно заполняя в нужном порядке.