Консультация № 172209
15.09.2009, 20:45
0.00 руб.
0 3 1
Доброе время суток! Необходима помощь по написанию кода в VBA.

Дана целочисленная квадратная матрица. Определить:
1) сумму элементов в тех строках, которые не содержат отрицательных элементов;
2) минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.

Предусмотреть ввод и вывод данных на лист Excel и через пользовательские формы.

Кому не трудно, помогите! Заранее благодарен!

Обсуждение

Неизвестный
15.09.2009, 23:24
общий
это ответ
Здравствуйте, smayl.
Я не совсем понял, что значит вывод данных на лист Excel. Предлагаю такой макрос для Excel. Нужно ввести числа в ячейки, выделить их и запустить макрос. Результат будет показан в виде сообщения:
Код:
Sub SquareMatrix()
Dim nCurrRowSumm As Long 'Сумма в текущей строке
Dim nTotalRowsSumm As Long 'Сумма во всех строках
Dim oRngWork As Range 'Переменная для диапазона, с которым будем работать
Dim oRow As Range 'Переменная для перебора строк в диапазоне
Dim oCell As Range 'Переменная для перебора ячеек в строке

'Если в выбранном диапазоне меньше четырех ячеек (минимальный размер квадратной матрицы) или количество строк _
не равно количеству столбцов (матрица не квадратная)
If Selection.Cells.Count < 4 Or Selection.Rows.Count <> Selection.Columns.Count Then Exit Sub

Set oRngWork = Selection.Cells(1).Resize(Selection.Rows.Count, Selection.Columns.Count)
For Each oRow In oRngWork.Rows
nCurrRowSumm = 0
For Each oCell In oRow.Cells
If oCell.Value >= 0 Then
nCurrRowSumm = nCurrRowSumm + CInt(oCell.Value)
Else
nCurrRowSumm = 0
Exit For
End If
Next oCell
nTotalRowsSumm = nTotalRowsSumm + nCurrRowSumm
Next oRow

Dim i As Long 'Счетчик строк
Dim j As Long 'Счетчик столбцов над или под диагональю
Dim k As Long 'Счетчик столбцов
Dim nMinDiagSumm As Long 'Минимальная сумма диагоналей
Dim nDiagSum As Long 'Сумма элементов текущей диагонали
'Минимальная сумма элементов диагоналей, параллельных главной и _
расположенных над ней
k = 2
Do While k < oRngWork.Rows.Count
nDiagSum = 0
i = 1
j = k
Do While i < oRngWork.Rows.Count - k + 2
'oRngWork.Cells(i, j).Interior.Color = RGB(0, 255, 0)
nDiagSum = nDiagSum + oRngWork.Cells(i, j).Value
'oRngWork.Cells(i, j).Interior.Color = 16777215
i = i + 1: j = j + 1
Loop
If nDiagSum < nMinDiagSumm And nMinDiagSumm <> 0 Then
nMinDiagSumm = nDiagSum
ElseIf nMinDiagSumm = 0 Then
nMinDiagSumm = nDiagSum
End If
k = k + 1
Loop
'Минимальная сумма элементов диагоналей, параллельных главной и _
расположенных под ней
k = oRngWork.Rows.Count - 1
Do While k > 1
i = oRngWork.Rows.Count
j = k
Do While i > oRngWork.Rows.Count - k
'oRngWork.Cells(i, j).Interior.Color = RGB(0, 255, 0)
nDiagSum = nDiagSum + oRngWork.Cells(i, j).Value
'oRngWork.Cells(i, j).Interior.Color = 16777215
i = i - 1: j = j - 1
Loop
If nDiagSum < nMinDiagSumm And nMinDiagSumm <> 0 Then
nMinDiagSumm = nDiagSum
ElseIf nMinDiagSumm = 0 Then
nMinDiagSumm = nDiagSum
End If
k = k - 1
Loop
MsgBox "Сумма элементов матрицы, в строках которых нет отрицательных элементов равна " & nTotalRowsSumm & vbCr & vbCr & _
"Минимум сумм элементов диагоналей, параллельных главной равен " & nMinDiagSumm, vbInformation + vbOKOnly, "Матрица " & oRngWork.Rows.Count & "x" & oRngWork.Columns.Count & " элементов"
End Sub
5
Спасибо! Сделано очень быстро! Я даже не ожидал такого быстрого ответа!
Неизвестный
19.09.2009, 20:34
общий
Большая часть сделана, спасибо. Правда нужно кое-какие мелочи подправить, но это я сам. Вот только здесь сделана половина, может кто-нибудь выполнить такое же, но только через пользовательские формы.
Неизвестный
19.09.2009, 20:37
общий
Как вы себе это представляете? Опишите, как задавать массив чисел через пользовательскую форму и все можно сделать, тем более, что алгоритм уже есть
Форма ответа