Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Basic / VBA


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Гаряка Асмик
Статус: Специалист
Рейтинг: 4201
∙ повысить рейтинг »
Vasiliy83
Статус: Бакалавр
Рейтинг: 1722
∙ повысить рейтинг »
Megaloman
Статус: Профессионал
Рейтинг: 1404
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Basic/VBA

Номер выпуска:1035
Дата выхода:12.06.2010, 20:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:215 / 85
Вопросов / ответов:1 / 1

Вопрос № 178982: Уважаемые эксперты, помогите решить две задачи на матрицы, я похожие уже решал, но в с++, не знаю как в VBA: 1) Размер матрицы 16*20, диапазон -16 +20 Сгенерировать таблицу случайных целых чисел указанного диапазона, обнулить минимальное значен...



Вопрос № 178982:

Уважаемые эксперты, помогите решить две задачи на матрицы, я похожие уже решал, но в с++, не знаю как в VBA:
1) Размер матрицы 16*20, диапазон -16 +20
Сгенерировать таблицу случайных целых чисел указанного диапазона, обнулить минимальное значение в каждом столбце матрицы.
2) Разработать метод по удалению максимального элемента из массива a[n] и формированию массива a[n-1]. Протестировать его на примере одномерного массива случайных целых чисел указанного диапазона и размера

Отправлен: 07.06.2010, 17:31
Вопрос задал: Фоменко Роман Федорович, Посетитель
Всего ответов: 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 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное