Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: матрица: программирование Добавлено: 24.12.06 11:51  

Автор вопроса:  fark
есть задание:

Вычислить сумму и число положительных элементов квадратной матрицы, находящихся над главной диагональю (выделены в примере).

вот пример матрицы:

1 4 6 4
3 7 8 2
7 8 5 1
2 6 3 2

тупо осуществить действия могу, но как это делать в цикле? хотябы идею подскажите.

спасибо.

программирую в Excel.

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #1
Добавлено: 24.12.06 12:20
Sub SumUpMatrixPositives()
'просуммирует положительные значения матрицы, находящиеся выше главной ее диагонали
    Dim rr As Range, r As Range
    Dim s As Double
    Dim af As WorksheetFunction

'предополагается, что матрица выделена на активном листе в активном листе Excel
    Set af = Application.WorksheetFunction
    Set rr = ActiveWindow.RangeSelection
'на всякий случай исправим выделение, если оно оказалось неквадратным
'- приведем размеры выделения к минимальному из количества строк или столбцов выделенной области
    Set rr = rr.Resize(af.Min(rr.Rows.Count, rr.Columns.Count), af.Min(rr.Rows.Count, rr.Columns.Count))
    rr.Select

'НАЧАЛО решения
'
'начальное значение суммы
    s = 0#
'начало цикла по всем ячейкам выделенной области
    For Each r In rr.Cells
'у элементов выше главной диагонали индекс строки меньше индекса столбца
'если очередной элемент - элемент выше главной диагонали то
        If r.Row < r.Column Then
'если этот элемент больше 0, то добавить в сумму
            If r.Value > 0 Then s = s + r.Value
        End If
'конец цикла
    Next r
'вывод результата суммы
    MsgBox s
End Sub

Ответить

Номер ответа: 2
Автор ответа:
 fark



Вопросов: 5
Ответов: 11
 Профиль | | #2 Добавлено: 24.12.06 12:43
спасибо, камрад!

только скажи пожалуйста как переписать нужные мне числа в массив не суммируя! (мне нужно их потом вывести в столбик)

кстати, начало программы такое:


Sub matrix7()
 
Dim a(20, 20), b(20, 20) As Single
Dim i, j As Integer
Application.ActiveSheet.Cells.Clear
 
 
'ввод матрицы
For i = 1 To 7
For j = 1 To 7
a(i, j) = Rnd(1) * 100
Cells(i, j) = a(i, j) 'вводит значения ячеек
Cells.NumberFormat = "0" 'округляет
Next j
Next i

Ответить

Номер ответа: 3
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #3
Добавлено: 24.12.06 13:14
вот эту часть:

'если этот элемент больше 0, то добавить в сумму
            If r.Value > 0 Then s = s + r.Value
        End If


можно переписать так:

'если этот элемент больше 0, то добавить в сумму и записать в столбик
            If r.Value > 0 Then
                 s = s + r.Value
                 j = j + 1
                 r1.Offset(j - 1,0).Value = r.Value
            End If
        End If


здесь:
r1 - верхняя ячейка столбца, куда должны быть переписаны положительные значения из матрицы выше главной диагонали (можно написать в начале процедуры Set r1 = Cells(1,22) - чтобы вывод выбранных элементов начался с первой строки 22-го столбца активного листа активной книги или сделать что-либо другое нужное);
j = 0 - должно быть установлено до начала цикла - будет счетчиком внесенных элементов в столбик - это и будет значением подсчитанного количества суммированных элементов матрицы по окончанию цикла.

Ответить

Номер ответа: 4
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #4
Добавлено: 24.12.06 13:50
Кстати, если Вы пишите

a(i, j) = Rnd(1) * 100


То все полученные значения матрицы будут положительными всегда, т.к. Rnd возвращает значение между 0 и 1. Если хотите увидеть и отрицательные значения сделайте так:

a(i, j) = Rnd(1) * 200 - 100

 или
a(i, j) = (Rnd(1) - 0.5) * 200


А чтобы соединить Ваше начало с моим кодом напишите после Вашего начала

Set rr = Range(Cells(1,1), Cells(7,7))

далее все должно подойти после слов "НАЧАЛО решения"

PS: Несколько непонятно, почему у Вас в начале объявляются массивы размерностью (20,20), но потом используется их размер толко (7,7).

Ответить

Номер ответа: 5
Автор ответа:
 fark



Вопросов: 5
Ответов: 11
 Профиль | | #5 Добавлено: 24.12.06 14:07
спасибо за подсказку. Как я сам не догадался, что индекс строки меньше индекса столбца?

массив 20х20 так как матрица должна быть 20х20, а я проверяю на маленькой :)

существует только одна проблема - иногда прога показывает общую сумму чисел на единицу больше, иногда правильно. Почему?




вот что получилось:

Sub matrix7()
Dim a(20, 20), b(20, 20) As Single
Dim i, j As Integer
Application.ActiveSheet.Cells.Clear 'очищаем активный лист
 
 
'ввод матрицы
For i = 1 To 3
For j = 1 To 3
a(i, j) = -50 + Rnd(1) * 100 'вводит значения массива
Cells(i, j) = a(i, j) 'вводит значения из массива в ячейки
Cells.NumberFormat = "0" '*округляет
Next j
Next i

'находим количество положительных элементов и их сумму
количПоложительных = 0
общаяСумма = 0
For i = 1 To 3
For j = 1 To 3
    If i = j Then Cells(i, j).Font.Bold = True '*выделяет главную диагональ жирным
    If i < j Then b(i2, j2) = a(i, j) '!!!!!!
    If b(i2, j2) > 0 Then количПоложительных = количПоложительных + 1 'считает количество положительных
    общаяСумма = общаяСумма + b(i2, j2) 'сумма положительных
    b(i2, j2) = 0
Next j
Next i

'выводим общую сумму на лист
Cells(15, 13) = "сумма чисел выше диагонали:"
Cells(15, 14) = общаяСумма

'выводим количество положительных элементов на лист
Cells(14, 13) = "кол-во положительных:"
Cells(14, 14) = количПоложительных
Columns.AutoFit '*делает выравнивание ширины колонок
End Sub

Ответить

Номер ответа: 6
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #6
Добавлено: 24.12.06 14:26
Дело в том, что Вы на самом деле не округляете значения в ячейках, а только форматируете их, обрубая из видимости дробные части их значений:

Cells(i, j) = a(i, j) 'вводит значения из массива в ячейки
Cells.NumberFormat = "0" '*округляет


Чтобы сумма была верной либо действительно округляйте, либо рассматривайте и дробную часть результата (переменная общаяСумма у Вас за отстутвием объявления по умолчанию является Variant, а значит скорее всего содержит Действительное число с дробной частью):

Например, можно сделать округление значений массива на этапе его заполнения:

a(i, j) = Round(-50 + Rnd(1) * 100, 0) 'вводит значения массива

Ответить

Номер ответа: 7
Автор ответа:
 fark



Вопросов: 5
Ответов: 11
 Профиль | | #7 Добавлено: 24.12.06 14:40
округления! точно!
ещё раз спасибо!!!

получившийся код (для истории):

Sub matrix7()
Dim a(3, 3), b(3, 3) As Single
Dim i, j As Integer
Application.ActiveSheet.Cells.Clear 'очищаем активный лист
 
 
'ввод матрицы
For i = 1 To 3
For j = 1 To 3
a(i, j) = Round(-50 + Rnd(1) * 100, 0) 'вводит значения массива и округляет!!
Cells(i, j) = a(i, j) 'вводит значения из массива в ячейки
Next j
Next i

'находим количество положительных элементов и их сумму
количПоложительных = 0
общаяСумма = 0
суммаПоложит = 0
For i = 1 To 3
For j = 1 To 3
    If i = j Then Cells(i, j).Font.Bold = True  '*выделяет главную диагональ жирным
    If i < j Then b(i2, j2) = a(i, j)  '!!!!!!
    If b(i2, j2) > 0 Then количПоложительных = количПоложительных + 1 'считает количество положительных
    общаяСумма = общаяСумма + b(i2, j2) 'сумма всех выше диагонали
    If b(i2, j2) > 0 Then суммаПоложит = суммаПоложит + b(i2, j2) 'считает сумму положительных
    b(i2, j2) = 0
Next j
Next i

'выводим общую сумму на лист
Cells(15, 13) = "сумма чисел выше диагонали:"
Cells(15, 14) = общаяСумма

'выводим количество положительных элементов на лист
Cells(14, 13) = "кол-во положительных:"
Cells(14, 14) = количПоложительных
Cells(16, 13) = "сумма положительных чисел выше диагонали:"
Cells(16, 14) = суммаПоложит
Columns.AutoFit '*делает выравнивание ширины колонок
End Sub

Ответить

Номер ответа: 8
Автор ответа:
 Ася



Вопросов: 0
Ответов: 1
 Профиль | | #8 Добавлено: 10.05.11 17:36
Здравствуйте! помогите пожалуйста!
Вычислить суммы элементов главных диагоналей матриц А(N,N), B(M,M) N<=20, M<=20
Задание на использование в программе функций(программ. в Excel)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам