Вопрос № 179049: Здравствуйте, уважаемые эксперты. Помогите с задачей на VBA. Две строки матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках. Найти все пары непохожих строк в заданной матрице....
Вопрос № 179049:
Здравствуйте, уважаемые эксперты. Помогите с задачей на VBA. Две строки матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках. Найти все пары непохожих строк в заданной матрице.
Отвечает Andrew Kovalchuk, Студент :
Здравствуйте, Микушов Сергей. Приведенный в приложении код демонстрирует один из возможных вариантов решения.
Приложение:
----- Временная неудача лучше временной удачи
Ответ отправил: Andrew Kovalchuk, Студент
Ответ отправлен: 12.06.2010, 02:05
Номер ответа: 262074
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 262074
на номер 1151 (Россия) |
Еще номера »
Отвечает Megaloman, Профессионал :
Здравствуйте, Микушов Сергей. Приведенный ниже код демонстрирует еще один из возможных вариантов решения. Отладку делал в VBA как макрос Excel. Постарался написать подробные комментарии для пояснения хода решения 179049.xls (32.5 кб)
Код:
Sub Different() Const N As Integer = 10 ' Число строк в матрице Const M As Integer = 5 ' Число столбцов в матрице Const lowerbound As Integer = 0 ' Минимально возможный элемент в матрице Const upperbound As Integer = 2 ' Максимально возможный элемент в матрице
ReDim A(N - 1, M - 1) As Integer ' Исследуемый массив (матр
ица) N*M элементов ReDim Atmp(M - 1) As Integer ' Вспомогательный массив для сортировки строки ReDim S(N - 1) As String ' Множество чисел каждой строки в символьном виде (с разделителем пробел)
' -------------------------------------- Для вывода в Excel ------------ Range("A:IV").ClearContents ' Чистим текущий лист таблицы Excel
For i = 0 To N - 1 '
Заполняем матрицу случайными числами For j = 0 To M - 1 A(i, j) = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
' -------------------------------------- Для вывода в Excel ------------ Range("A1").Offset(i, 5 + j) = A(i, j) ' Выводим сгенерированную матрицу на текущий лист таблицы Excel
Next Next
For k = 0 To N - 1
' Сортируем каждую строку, например, по возрастанию
S(k) = "" For j = 0 To M - 1 ' Переписываю строку матрицы во вспомогательный массив Atmp(j) = A(k, j) Next
For i = 0 To M - 1 ' Сортирую его например, по возрастанию
ii = i For j = i To M - 1 If Atmp(ii) > Atmp(j) Then ii = j Next
AA = Atmp(ii) Atmp(ii) = Atmp(i) Atmp(i) = AA
If i = 0 Then S(k) = CStr(Atmp(i)) ' Формирую множество уникальных чисел каждой строки в символьном массиве Else If AB <> AA Then S(k) = S(k) + " " + CStr(Atmp(i)) ' Формирую множество уникальных чисел каждой строки в символьном массиве End If AB = AA
Next Next
Rezult = "" For i = 0 To N - 1 ' Для каждой строки ищем все непохожие строки (если множество чисел строки, записанных в элементы строкового массива не совпадает)
' -------------------------------------- Для вывода в Excel множества уникальных чисел в строке Range("A1").Offset(i, 2) = S(i)
SS = "" For j = 0 To N - 1 If S(i) <> S(j) Then SS = SS + " " + CStr(j + 1) Next
SS = Trim(SS) If SS <> "" Then SS = "Для строки " + CStr(i + 1) + " непохожие " + SS Rezult = Rezult + SS + vbCrLf
' -------------------------------------- Для вывода в Excel ------------
Range("A1").Offset(i, 3) = SS
End If Next
If Rezult <> &q
uot;" Then MsgBox Rezult Else MsgBox "В матрице все строки похожие" End If
End Sub
----- Нет времени на медленные танцы
Ответ отправил: Megaloman, Профессионал
Ответ отправлен: 12.06.2010, 21:13
Номер ответа: 262080
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 262080
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.