Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2010, 15:32   #1
StudentofSUSU
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 11
По умолчанию Вычисление определителя матрицы

Здравствуйте, мне нужно создать макрос, вычисляющий определитель матрицы, заданной в ячейках таблицы эксель.
Собственно, вот написанный мной код.
Глобальные переменные, типы, массивы записанные в module1:
Код:
Public Const nn As Variant = 3
Public Type tmatrix
matrix(1 To nn, 1 To nn) As Integer
End Type
Public Type tindex
index(1 To nn) As Boolean
End Type
Public d As Integer
Public i As Integer
Public j As Integer
Public a As tmatrix
Public rowmat As tindex
Public colmat As tindex
Основная процедура:
Код:
Public Sub main()
Dim res As Integer
For i = 1 To nn Step 1
For j = 1 To nn Step 1
a.matrix(i, j) = Cells(i, j)
Next j
Next i
res = det(a)
End Function
Функции для вычисления определителя:
Код:
Public Function det(a As tmatrix) As Integer
Dim i As Integer
For i = 1 To nn Step 1
rowmat.index(i) = True
colmat.index(i) = True
Next i
det = minor(a, rowmat, colmat, nn)
End Function

Public Function findtrue(mas As tindex) As Integer
Dim i As Integer
For i = 1 To nn Step 1
If mas.index(i) = True Then
findtrue = i
Exit For
End If
Next i
findtrue = 0
End Function

Public Function minor(a As tmatrix, rowmat As tindex, colmat As tindex, n As Integer) As Integer
Dim i As Integer
Dim j As Integer
Dim sum As Integer
Dim jo As Integer
Dim aa As Integer
i = findtrue(rowmat)
If n = 1 Then
  j = findtrue(colmat)
  minor = a.matrix(i, j)
Else
rowmat.index(i) = False //Здесь ошибка
n = n - 1
sum = 0
jo = 1
For j = 1 To nn Step 1
If colmat.index(j) = True Then
colmat.index(j) = False
aa = a.matrix(i, j)
If aa <> 0 Then
  sum = sum + jo * aa * minor(a, rowmat, colmat, n)
End If
colmat.index(j) = True
jo = -jo
End If
minor = sum
Next j
End If
End Function
Проблема: при компиляции выдает ошибку "Run-time error 9, Subscript out of range" в строчке, которую я выделил комментарием.
Насколько я понял, эта ошибка связана с тем, что у программы нет доступа к массиву, как это исправить, помогите.

Последний раз редактировалось EducatedFool; 07.01.2010 в 16:18.
StudentofSUSU вне форума Ответить с цитированием
Старый 07.01.2010, 19:20   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте StudentofSUSU.
не вникая в суть Вашей задачи, видна конструктивная ошибка
Код:
Public Function findtrue(mas As tindex) As Integer
Dim i As Integer
For i = 1 To nn 'Step 1
'приращение по умолчанию 1 указывать явно не обязательно
    If mas.index(i) = True Then
        findtrue = i
        Exit For
    End If
Next i
'ошибка явно здесь
findtrue = 0 ' - заданное значение обнуляется ???
End Function
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 07.01.2010, 21:05   #3
StudentofSUSU
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 11
По умолчанию

Евгений, большое спасибо. Все работает.Проблема была в неправильно переведенном коде с Delphi на VBA. Заработался...
StudentofSUSU вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вычисление определителя по схеме Гаусса Ника__ Помощь студентам 1 15.08.2009 16:49
программа для вычисления значения определителя матрицы [рыжий хвост] Помощь студентам 0 10.06.2009 18:27
Вычисление определителя матрицы Ирёнок Помощь студентам 6 21.02.2009 01:10
Вычисление определителя n-го порядка gool Паскаль, Turbo Pascal, PascalABC.NET 1 11.12.2008 10:59
Написать рекурсивную функцию вычисления определителя квадратной матрицы Лёха Паскаль, Turbo Pascal, PascalABC.NET 1 23.03.2008 08:43