Страница: 1 |
Вопрос: матрица: программирование | Добавлено: 24.12.06 11:51 |
Автор вопроса: ![]() |
есть задание:
Вычислить сумму и число положительных элементов квадратной матрицы, находящихся над главной диагональю (выделены в примере). вот пример матрицы: 1 4 6 4 3 7 8 2 7 8 5 1 2 6 3 2 тупо осуществить действия могу, но как это делать в цикле? хотябы идею подскажите. спасибо. программирую в Excel. |
Ответы | Всего ответов: 8 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 185 |
Web-сайт: Профиль | Цитата | #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 Автор ответа: ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 185 |
Web-сайт: Профиль | Цитата | #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 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 185 |
Web-сайт: Профиль | Цитата | #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 Автор ответа: ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() Вопросов: 0 Ответов: 185 |
Web-сайт: Профиль | Цитата | #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 Автор ответа: ![]() ![]() Вопросов: 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 |
|