Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Сортировка матрицы VBA
 
bedvit,в плюсах множественное наследование тащит.
Классы да - сильная вещь.  
Сортировка матрицы VBA
 
ProFessor,СИ не ООП.
К тому же в вба  привычного мне си-образного я мало нашёл. Тот же массив mass( 4,9) на самом деле из 5 строк и 10 столбцов - МОЯ ГЛАВНАЯ ОШИБКА.
В си это бы был массив из 4 строк и 9 столбцов, благо хоть с нуля начинается.
Я не говорю, что язык плохой, просто непривычно сразу.

P.S.Первый комментарий ваш по поводу пустого условия. Я хотел найти альтернативу continue, однако не нашёл. Но код тот такое себе. Может, вы альтернативу знаете? к break  exit for для цикла со счётчиком.
Цитата
ProFessor написал:
З.Ы. зачем в коде Си вы постоянно для каждой базовой итерации инициализируете заново переменные? Почему бы не заменить на просто присвоение значений?
я так полагаю вы про свап?
Сортировка матрицы VBA
 
В общем, написал на 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
Сортировка матрицы 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
 
Код
void SortSpiral(float mass[][10], const int nLine, const int nColumn)
{
   int iter_1 = 5*nLine;
   while (iter_1--)
   {
      for (int k = 0; k < nLine; k++) {

         int iter_2 = nLine;
         while (iter_2--)
         {
            for (int j = 0; j < nColumn - 1; j++)
            {
               if (mass[k][j] > mass[k][j + 1])
               {
                  float temp = mass[k][j];
                  mass[k][j] = mass[k][j + 1];
                  mass[k][j + 1] = temp;
               }
                  
               
            }
         }
         if (k < nLine - 1 && mass[k][nColumn - 1] > mass[k + 1][0])
         {
            float temp = mass[k][nColumn - 1];
            mass[k][nColumn - 1] = mass[k + 1][0];
            mass[k + 1][0] = temp;
         }
      }
   }
   return;
}
Изменено: Deuce97 - 24.04.2018 22:26:46
Сортировка матрицы VBA
 
Anchoret,энтузиазм был вба почекать.  
Сортировка матрицы VBA
 
Anchoret, без обид, но я на Си это сделал за 1,5 минуты. Мне нужно было тупо большое кол-во данных отсортировать и я полдня потратил на это vba, в итоге отсортировал на Си, перезаписал в файл и готово.
Сортировка матрицы VBA
 
ProFessor,спасибо, буду разбираться
Сортировка матрицы VBA
 
Цитата
Ігор Гончаренко написал:
эту матрицу нужно получить в качестве аргумента или собрать из данных?
без понятия, что вы сказали. Я обращаюсь к диапазону по ячейкам, диапазон у меня лично A13:J17 и его постепенно улучшаю, отсортировывая методом пузырька
Изменено: Deuce97 - 24.04.2018 16:50:23
Сортировка матрицы VBA
 
Цитата
Ігор Гончаренко написал:
по чему сортируем (колонки по какой-то строке или строки по какой-то колонке)по какой-то - это по какой конкретно?
Сортируем целиком, не отдельно строки или стоблцы, а ЦЕЛИКОМ. Первая ячейка - левый верхний угол - самый маленький элемент, последняя ячейка - правый нижний угол - самый большой элемент.
Сортировка матрицы VBA
 
ProFessor, пузырёк, да.
Сортировка матрицы VBA
 
Алгоритм такой - сортировать строки, а последний элемент каждой строки сравнивать с первым элементом следующей строки и свапать, если нужно. Первое пустое условие нужно для того, чтобы игнорировать последний элемент. Как сделать возвращение  к началу цикла по типу continue, не знаю.
Сортировка матрицы VBA
 
Ігор Гончаренко, тему я пояснил, да и в самом начале описано ПРОБЛЕМА С СОРТИРОВКОЙ МАТРИЦЫ. Если лень читать, то извините - не мои проблемы. К чему ваш этот ответ, не понимаю.
Сортировка матрицы VBA
 
Цитата
ProFessor написал:
Конечно, неправильно, 4-х уровневый for и в нем 3 уровня IF.
Что тут неправильного?  
Сортировка матрицы VBA
 
Отсортировать по возрастанию матрицу.
Сортировка матрицы VBA
 
В общем, здравствуйте. Возникла проблема с сортировкой матрицы. Хотел написать на VBA, сортирует частично, но почему-то добавляет лишний столбец и там числа по рандому.

Может, где-то что неправильно написал в коде, т к занялся этим сегодня только. В общем, помогите, пожалуйста.
Код
Sub Сортировка_матрицы()
' Сортировка_матрицы Макрос
For i = 13 To 17
For j = 1 To 10

For k = 13 To 17
For l = 1 To 10

If l = 10 And k = 17 Then
' Ничего не делаем
Else

If l = 10 And Cells(k, l).Value > Cells(k + 1, 1).Value Then

Temp = Cells(k, l).Value
Cells(k, l).Value = Cells(k + 1, 1).Value
Cells(k + 1, 1).Value = Temp

Else

If Cells(k, l).Value > Cells(k, l + 1).Value Then

Temp = Cells(k, l).Value
Cells(k, l).Value = Cells(k, l + 1).Value
Cells(k, l + 1).Value = Temp

End If
End If
End If

Next l
Next k

Next j
Next i
End Sub
В общем, посмотрите, пожилуйста, и поправьте, если не сложно. И если есть встроенный способ, то хотелось бы знать, а то есть только сортировка обыкновенного массива.
Алгоритм простой, как два пальца. Вот только что в коде не так, не пойму, ну или я в синтаксисе что-то недопонял. Может, лишнее условие выполняется.
Изменено: Deuce97 - 24.04.2018 16:20:19
Страницы: 1
Наверх