Вопрос № 178982: Уважаемые эксперты, помогите решить две задачи на матрицы, я похожие уже решал, но в с++, не знаю как в VBA: 1) Размер матрицы 16*20, диапазон -16 +20 Сгенерировать таблицу случайных целых чисел указанного диапазона, обнулить минимальное значен...
Вопрос № 178982:
Уважаемые эксперты, помогите решить две задачи на матрицы, я похожие уже решал, но в с++, не знаю как в VBA: 1) Размер матрицы 16*20, диапазон -16 +20 Сгенерировать таблицу случайных целых чисел указанного диапазона, обнулить минимальное значение в каждом столбце матрицы. 2) Разработать метод по удалению максимального элемента из массива a[n] и формированию массива a[n-1]. Протестировать его на примере одномерного массива случайных целых чисел указанного диапазона и размера
Отвечает Megaloman, Профессионал :
Здравствуйте, Фоменко Роман Федорович. Вот решение. 178982.xls (32.5 кб) Замечания по решению: 1. Вы не указали, что делать, если минимальный элемент встречается неоднократно Я решил занулять все такие элементы (подпрограмма Matr)
Вторую задачу я решил сделать двумя способами - когда удаляю все элементы = максимальному (DelElem) и удаляю только первый элемент = максимальному (DelElem1)
2. Вы не указали способ вывода результатов Я
вывел в листе таблицы Excel
Код:
Sub Matr() Const N As Integer = 16 ' Число строк в матрице Const M As Integer = 20 ' Число столбцов в матри
це Const lowerbound As Integer = -16 ' Минимум значения элемента в матрице Const upperbound As Integer = 20 ' Максимум значения элемента в матрице
Randomize
ReDim Mass(N - 1, M - 1) As Integer
For i = 0 To N - 1 ' Заполняем массив случайными числами в указанном диапазоне For j = 0 To M - 1 Mass(i, j) = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
Next Next
Range("A1:IV65000").ClearContents ' Вывод в задании не оговорен, вывожу результаты на текущий лист таблицы Range("A1").Select
Call OutMass(Mass, N, M, 0, 3)
For j = 0 To M - 1 ' Ищем значение минимального элемента в столбце EMin = Mass(0, j)
For i = 0 To N - 1 If EMin > Mass(i, j) Then EMin = Mass(i,
j) Next
For i = 0 To N - 1 ' Зануляю элементы = минимальный If EMin = Mass(i, j) Then Mass(i, j) = 0 Next
Next
Call OutMass(Mass, N, M, N + 2, 3)
End Sub
' Удаляем в массиве все элементы = максимальному Sub DelElem() Const N As Integer = 16 ' Число ЭЛЕМЕНТОВ в массиве Const lowerbound As Integer = -16 '
Минимум значения элемента в матрице Const upperbound As Integer = 20 ' Максимум значения элемента в матрице
Randomize
ReDim A(N - 1) As Integer
For i = 0 To N - 1 ' Заполняем массив случайными числами в указанном диапазоне A(i) = Int((upperbound - lowerbound + 1) * Rnd + lowerbound) Next
Range("A1:IV65000").ClearContents
39; Вывод в задании не оговорен, вывожу результаты на текущий лист таблицы Range("A1").Select
Call OutMass1(A, N, 0, 3)
' Ищем значение максимального элемента
EMax = A(0) For i = 0 To N - 1 If EMax < A(i) Then EMax = A(i) Next
' Подсчитываем количество элементов = EMax
NMax = 0 For i = 0 To N - 1 If EMax = A(i) Then NMax = NMax + 1 Next
' Переписываем исходный массив в промежуточный с пропуском элементов = EMax
ReDim Atmp(N - 1 - NMax) As Integer
j = 0 For i = 0 To N - 1 If EMax <> A(i) Then Atmp(i - j) = A(i) Else j = j + 1 End If Next
' Переписываем промежуточный массив в исходный, переопределив его размерность
ReDim A(N - 1 - NMax) As Inte
ger For i = 0 To N - 1 - NMax A(i) = Atmp(i) Next
ReDim Atmp(0) As Integer
Call
OutMass1(A, N - NMax, 0, 4)
End Sub
' Удаляем в массиве первый максимальный элемент Sub DelElem1() Const N As Integer = 16 ' Число ЭЛЕМЕНТОВ в массиве Const lowerbound As Integer = -16 ' Минимум значения элемента в матрице Const upperbound As Integer = 20 ' Максимум значения элемента в матрице
Randomize
ReDim A(N - 1) As Integer
For i = 0 To N - 1
' Заполняем массив случайными числами в указанном диапазоне A(i) = Int((upperbound - lowerbound + 1) * Rnd + lowerbound) Next
Range("A1:IV65000").ClearContents ' Вывод в задании не оговорен, вывожу результаты на текущий лист таблицы Range("A1").Select
Call OutMass1(A, N, 0, 3)
' Ищем значение максимального элемента
EMax = A(0) For
i = 0 To N - 1 If EMax < A(i) Then EMax = A(i) Next
' Переписываем исходный массив в промежуточный с пропуском первого максимального элемента
ReDim Atmp(N - 1 - 1) As Integer
j = 0 For i = 0 To N - 1 If (EMax = A(i)) And (j = 0) Then j = 1 Else Atmp(i - j) = A(i) End If Next
' Переписываем промежуточный массив в исходный, переопределив
его размерность
ReDim A(N - 1 - 1) As Integer For i = 0 To N - 1 - 1 A(i) = Atmp(i) Next
ReDim Atmp(0) As Integer
Call OutMass1(A, N - 1, 0, 4)
End Sub
' Вывод матрицы в таблицу Sub OutMass(MM, N, M, D1, D2) ' Вывод в задании не оговорен, вывожу на текущий лист таблицы
For i = 0 To N - 1 For j = 0 To M - 1 Ra
nge("A1").Offset(i + D1, j + D2) = MM(i, j) Next Next
End Sub
' Вывод вектора в таблицу Sub OutMass1(MM, N, D1, D2) ' Вывод в задании не оговорен, вывожу на текущий лист таблицы
For i = 0 To N - 1 Range("A1").Offset(i + D1, j + D2) = MM(i) Next
End Sub
----- Нет времени на медленные танцы
Ответ отправил: Megaloman, Профессионал
Ответ отправлен: 07.06.2010, 19:59
Номер ответа: 261966
Оценка ответа: 5 Комментарий к оценке: Отличный, очень умный ответ!
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 261966
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.