Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - VBA - Упорядочить матрицу по убыванию модулей элементов

Ответить
Настройки темы
VBA - VBA - Упорядочить матрицу по убыванию модулей элементов

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip 1cyberforum.zip
(18.0 Kb, 2 просмотров)
Столкнулся с проблемой

вобщем нужно отсортировать двумерный массив по убыванию модулей элементов

пока смог сделать только такую сортировку при которой элементы массива заменяются их модулями, а как я понимаю из условия задачи "Упорядочить матрицу по убыванию модулей элементов" нужно оставить все значения как и были , но при этом упорядочить по значениям их модулей.

делал по аналогии с вот этим

Код: Выделить весь код
Dim indM, k, i, arr() As Single
n = 5
ReDim arr(1 To n)
arr(1) = 4
arr(2) = -3
arr(3) = 0
arr(4) = 3
arr(5) = -10
Dim Min As Single
For i = 1 To n - 1
 Min = arr(i)
 k_min = i
  For j = i + 1 To n
  If arr(j) < Min Then
   Min = arr(j)
   k_min = j
  End If
  Next
  arr(k_min) = arr(i)
  arr(i) = Min
Next

ну и пример на матрицах , как я понял условие

ВВОДИМ
3 -4 5
2 6 -9
7 -8 -1

ПОЛУЧАЕМ
-9 -8 7
6 5 -4
3 2 -1


а вот ,что получается в моей проге

9 8 7
6 5 4
3 2 1

у элементов с отрицательным значением теряются минусы,а их нужно оставить.

Код: Выделить весь код
Sub Sort()       
 
ReDim B(1 To m * n)
 
For i = 1 To m                          'преобразуем в одномерный
   For j = 1 To n
     B(j + (i - 1) * n) = A(i, j)
   Next j
Next i
 
For i = 1 To m * n - 1                     'сортирую
 Min = Abs(B(i))
 k_min = i
  For j = i + 1 To m * n
   If Abs(B(j)) > Min Then
    Min = Abs(B(j))
    k_min = j
   End If
  Next
 B(k_min) = Abs(B(i))
 B(i) = Min
Next
 
For i = 1 To m                            'преобразуем в двумерный
   For j = 1 To n
      A(i, j) = B(j + (i - 1) * n)
   Next j
Next i
         
 
 
ListBox3.ColumnCount = n                               'вывод
ListBox3.List = A                               
End Sub

Отправлено: 23:36, 11-12-2011

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата x3 aka a-droo:
For i = 1 To m * n - 1 'сортирую
Min = Abs(B(i))
k_min = i
...
Next
B(k_min) = Abs(B(i))
B(i) = Min
Next »
Я сейчас точно не могу сформулировать. Но в этих присвоениях - ошибка. Внимательно смотри чему у тебя приравнивается абсолютная величина. Т.е. начало правильное - мы работаем с абсолютными величинами, а конец B(i) = Min - неправильный, т.к. Min - уже сам по себе модульный.
Цитата x3 aka a-droo:
Min = Abs(B(j)) »
А! Ну вот он зверь. К минимуму следует приравнять не модуль, а подмодульную величину.
Тогда код изменится примерно так (проверь):
Код: Выделить весь код
For i = 1 To m * n - 1                     'сортирую
 Min = B(i)
 k_min = i
  For j = i + 1 To m * n
   If Abs(B(j)) > Abs(Min) Then
    Min = B(j)
    k_min = j
   End If
  Next
 B(k_min) = Abs(B(i))
 B(i) = Min
Next
Что делает k_min я не понял, и честно сказать саму сортировку пока тоже не понял. На метод пузырька вроде похож, а вроде и нет. ... Ну и ладно, фиг с ним, главное, чтобы работал.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 00:29, 12-12-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg excel21.JPG
(12.0 Kb, 4 просмотров)

поставил ваш вариант
ситуация стала лучше, но не полностью исправилась)
иногда терял минусы , иногда нет))
вот скрин
http://forum.oszone.net/attachment.p...0&d=1323638011

но потом методом тыка решил убрать модуль вот в этой строке

Код: Выделить весь код
B(k_min) = B(i)
в результате вот рабочий кусок

Код: Выделить весь код
For i = 1 To m * n - 1                   
 Min = B(i)
 k_min = i
  For j = i + 1 To m * n
   If Abs(B(j)) > Abs(Min) Then
    Min = B(j)
    k_min = j
   End If
  Next
 B(k_min) = B(i)
 B(i) = Min
Next


Огромное спасибо!)

Отправлено: 01:16, 12-12-2011 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VBA - VBA - Упорядочить матрицу по убыванию модулей элементов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Упорядочить по.... 6unya Microsoft Windows 7 6 19-09-2011 09:45
Прочие - Упорядочить ярлыки ferget Программное обеспечение Windows 20 07-06-2011 07:16
VBS/WSH/JS - [решено] Скрипт: Упорядочить значки > Автоматически AzazeLHAck Скриптовые языки администрирования Windows 3 24-04-2010 15:31
Можно ли заменить матрицу TN с CCFL-подсветкой на матрицу AFFS с LED-подсветкой? elmix Ноутбуки 1 16-03-2010 02:59
Упорядочить значки автоматически Vadim Boev Автоматическая установка Windows 2000/XP/2003 1 01-01-2005 07:58




 
Переход