Страницы: Пред. 1 2
RSS
Сортировка матрицы VBA
 
Anchoret, да qsort, но тут одна оговорочка. В Си массив n-размерный в памяти расположен как линия, поэтому вообще каждый n-мерный масив можно рассматривать как одномерный массив. не знаю, так ли в вба, поэтому вначале пытался по-простому ( обычным обменом пузырьковым ), ну и к тому же в вба я не получу доступ как памяти, так как там нет указателей.
Выглядит сортировка как-то так
Код
int cmp(const void *arg_1, const void *arg_2) // компаратор

{
   if (*(float*)arg_1 > *(float*)arg_2)
   {
      return 1;


   }
   else
      if (*(float*)arg_1 < *(float*)arg_2)
      {
         return -1;
      }
      else
      {
         return 0;
      }
}

qsort( *mass, 50, sizeof(float), cmp); // вызов
Приходится двумерный указатель преобразовывать к одномерному.
Цитата
Anchoret написал:
И где выгрузка в Excel?)
Вы не так поняли, я попросту в программе выгрузил с обычного файла неупорядоченный массив и перезаписал новый в упорядоченный, а там скопировал обратно в эксель.
Цитата
Ігор Гончаренко написал:
Word мне говорит что в процедуре 421 символ, делим на 1.5 мин получаем скорость набора = 4.7 символа в сек.!я преклоняюсь перед талантом!
Вы, видимо, решили меня потроллить или унизить. 1.5 минуты это, конечно, не так, но не больше 5 минут мне понадобилось на то, чтобы реализовать функцию. Когда ты кодишь, время летит быстро.


В общем, тема закрыта.
Изменено: Deuce97 - 25.04.2018 09:27:12
 
В общем, написал на 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 - 25.04.2018 13:52:33
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
ProFessor,СИ не ООП.
К тому же в вба  привычного мне си-образного я мало нашёл. Тот же массив mass( 4,9) на самом деле из 5 строк и 10 столбцов - МОЯ ГЛАВНАЯ ОШИБКА.
В си это бы был массив из 4 строк и 9 столбцов, благо хоть с нуля начинается.
Я не говорю, что язык плохой, просто непривычно сразу.

P.S.Первый комментарий ваш по поводу пустого условия. Я хотел найти альтернативу continue, однако не нашёл. Но код тот такое себе. Может, вы альтернативу знаете? к break  exit for для цикла со счётчиком.
Цитата
ProFessor написал:
З.Ы. зачем в коде Си вы постоянно для каждой базовой итерации инициализируете заново переменные? Почему бы не заменить на просто присвоение значений?
я так полагаю вы про свап?
 
Цитата
Deuce97 написал:
ProFessor ,СИ не ООП.
хоть это и офф. топ уже, но всё же:
В настоящее время количество прикладных языков программирования (список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. Наиболее распространённые в промышленности языки (С++, Delphi, C#, Java и др.) воплощают объектную модель Симулы. Примерами языков, опирающихся на модель Смолтока, являются Objective-C, Python, Ruby.
P.S.  
Цитата
Deuce97 написал:
Тот же массив mass( 4,9) на самом деле из 5 строк и 10 столбцов - МОЯ ГЛАВНАЯ ОШИБКА
Нет, главная ошибка это писать недокод на VBA и называть себя программистом, при этом обосновывая свои неудачи тупостью языка программирования.
Вся проблема сложных программ, целых томов кодов и состоит в несоблюдении принципа лезвия Оккама: «Не следует множить сущее без необходимости». Вся гениальность в простоте.
 
Коллеги, не комментировал, но все же вставлю пару слов. ProFessor, в вашем примере нет Си :)  Deuce97,  если у вас не получилось сразу это не значит язык плох. Про ООП: Си считается больше процедурным языком, хотя там есть структуры, и ООП напилить можно. В С++ добавили классы и прочие плюхи, классика ООП. Далее самое главное в программе не ее реализация (язык), а голова и руки (присутствует, прямые). Вообщем расширяйте свой кругозор, программируемое на разных языках или на одном... По задаче, можно пойти и таким путем: сложить все в один массив, отсортировать и выложить обратно заполняя в нужном порядке.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit,в плюсах множественное наследование тащит.
Классы да - сильная вещь.  
Страницы: Пред. 1 2
Наверх