Матрицы

koka278

New Member
12.12.2010
3
0
#1
Здравствуйте помогите пожалуйста исправить ошибки и дописать 3 функции, для программы работы с квадратными матрицами : транспонирование, нахождение определителя, умножение 2х матриц и сложение 2х матриц
вот программа с функцией нахождения определителя
Код:
Dim i As Integer, j As Integer, k As Integer, N As Integer
Dim Result As String
Dim Matrix() As Double, Matrix2() As Double, Matrix3() As Double


'Вычисление определителя. приведение к треугольному виду
Function Determinant() As Double
Dim maxl As Integer
Dim maxe As Double, d As Double, del As Double, det As Double
det = 1
For k = 0 To N - 2
maxe = Matrix(k, k)
maxl = k
For i = k + 1 To N - 1
If Abs(Matrix(i, k)) > Abs(maxe) Then'выбор максимального элемента столбца
maxl = i
maxe = Abs(Matrix(i, k))
End If
Next i
If maxl <> k Then 'если индекс строки максимального элемента столбца не равен индексу 
det = det * (-1)
For j = 0 To N - 1
d = Matrix(k, j) 'то переставляем строку так, чтобы максимальный элемент стоял на диагонали
Matrix(k, j) = Matrix(maxl, j)
Matrix(maxl, j) = d
Next j
End If

If Matrix(k, k) <> 0 Then'вычитание строк
For i = k + 1 To N - 1
del = Matrix(i, k) / Matrix(k, k)
For j = 0 To N - 1
Matrix(i, j) = Matrix(i, j) - del * Matrix(k, j)
Next j
Next i
Else
Exit Function
End If
Next k
For i = 0 To N - 1
det = det * Matrix(i, i)
Next i
Determinant = det

End Function

'считывание матрицы из таблицы
Private Sub ChtMtr()
For i = 0 To N - 1
For j = 0 To N - 1
On Error GoTo ErrDbl
Matrix(i, j) = CDbl(FGMatrix.TextMatrix(i + 1, j + 1))
Next j
Next i
Exit Sub
For i = 0 To N - 1
For j = 0 To N - 1
On Error GoTo ErrDbl
Matrix2(i, j) = CDbl(FGMatrix2.TextMatrix(i + 1, j + 1))
Next j
Next i
Exit Sub
For i = 0 To N - 1
For j = 0 To N - 1
On Error GoTo ErrDbl
Matrix2(i, j) = CDbl(FGMatrix2.TextMatrix(i + 1, j + 1))
Next j
Next i
Exit Sub
ErrDbl:
If Err.Number = 13 Then
MsgBox (("Неверный ввод."), ), vbExclamation, "Ошибка"

Exit Sub
End If
End Sub


Private Sub Razmer_Change()
If CInt(Razmer.Text) < 1 Then N = 1: Razmer.Text = CStr(N): TabCreate
End Sub

'создание таблицы.Ввод только цифр в текстовое поле "Razmer" и создание таблицы принажатии ENTER
Private Sub Razmer_KeyPress(KeyAscii As Integer)
If KeyAscii > 47 And KeyAscii < 59 Or KeyAscii = 8 Or KeyAscii = 13 Then 'рарешается вводить значения клавишь от 48 до 58,т.е. 0-9 а также использование клавиш ENTER(13) и Backspase(8)
If KeyAscii = 13 Then
On Error GoTo ErrNotNum 'обработка ошибки
If CInt(Razmer.Text) > 0 And CInt(Razmer.Text) < 101 Then 'размер матрицы от 1 до 100
N = CInt(Razmer.Text)
TabCreate
Else
MsgBox ("Введите значение от 1 до 100"), , vbCritical, "Ошибка"
End If
End If
Else
KeyAscii = 0
End If
Exit Sub
ErrNotNum:
If Err.Number = 13 And Razmer.Text <> "" Then MsgBox ("Должны быть только цифры"), vbCritical, "Ошибка" '13-ошибка не соответсвия типа
End Sub
'создание новой таблицы. Нажатие кнопки "Создать"
Private Sub Sozdat_Click()
On Error GoTo ErrNotNum 'обработка ошибки
If CInt(Razmer.Text) > 0 And CInt(Razmer.Text) < 101 Then 'размер матрицы от 1 до 100
N = CInt(Razmer.Text)
TabCreate
Else
MsgBox ("Введите значение от 1 до 100"), vbCritical, "Ошибка"
End If
ErrNotNum:
If Err.Number = 13 Then MsgBox ("Должны быть только цифры"), vbCritical, "Ошибка" '13-ошибка не соответсвия типа
End Sub
Private Sub Form_Load()
' bExit = False
' bReshenie = True
N = 1
TabCreate

End Sub
'измениение размеров и положений элементов при измениении размеров основного окна
Private Sub Matrix_Resize()
If Matrix.Height - 1800 > 0 Then
FlexGridMatrix.Height = Matrix.Height - 1800
FGMatrix.Height = Matrix.Height - 2600
FGMatrix2.Height = Matrix.Height - 2600
FGMatrix3.Height = Matrix.Height - 2600
End If
If Matrix.Width - 300 > 0 Then
FlexGridMatrix.Width = Matrix.Width - 300
FGMatrix.Width = Matrix.Width - 500
FGMatrix2.Width = Matrix.Width - 500
FGMatrix3.Width = Matrix.Width - 500
End If
End Sub
'процедура создания таблицы
Private Sub TabCreate()
Dim Ntab As Integer
Ntab = N + 1
With FGMatrix
.Rows = Ntab
.Cols = Ntab
For i = 1 To N
.Col = 0
.Row = i
.CellAlignment = 4
.TextMatrix(i, 0) = CStr(i)
Next i
For i = 1 To Ntab - 1
.Row = 0
.Col = i
.ColWidth(i) = 500
.CellAlignment = 4
.TextMatrix(0, i) = CStr(i)
Next i
.RowHeight(0) = 300
.ColWidth(0) = 300
End With
With FGMatrix2
.Rows = Ntab
.Cols = Ntab
For i = 1 To N
.Col = 0
.Row = i
.CellAlignment = 4
.TextMatrix(i, 0) = CStr(i)
Next i
For i = 1 To Ntab - 1
.Row = 0
.Col = i
.ColWidth(i) = 500
.CellAlignment = 4
.TextMatrix(0, i) = CStr(i)
Next i
.RowHeight(0) = 300
.ColWidth(0) = 300
End With
With FGMatrix3
.Rows = Ntab
.Cols = Ntab
For i = 1 To N
.Col = 0
.Row = i
.CellAlignment = 4
.TextMatrix(i, 0) = CStr(i)
Next i
For i = 1 To Ntab - 1
.Row = 0
.Col = i
.ColWidth(i) = 500
.CellAlignment = 4
.TextMatrix(0, i) = CStr(i)
Next i
.RowHeight(0) = 300
.ColWidth(0) = 300
End With

End Sub
'ввод данных в ячейку
Private Sub FGMatrix_KeyPress(KeyAscii As Integer)
If FGMatrix.Col <> N + 1 Then
If KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii = 45 Or KeyAscii = 46 Or KeyAscii = 44 Then
If KeyAscii = 46 Then KeyAscii = 44
FGMatrix.Text = FGMatrix.Text + Chr(KeyAscii)
ElseIf KeyAscii = 8 And Len(FGMatrix.Text) > 0 Then
FGMatrix.Text = Mid(FGMatrix.Text, 1, Len(FGMatrix.Text) - 1)
ElseIf KeyAscii = 13 And FGMatrix.Row = N Then
FGMatrix.Row = 1
ElseIf KeyAscii = 13 And FGMatrix.Row <> N Then
FGMatrix.Row = FGMatrix.Row + 1
End If
End If
Polozhenie.Caption = CStr(FGMatrix.Row) + "x" + CStr(FGMatrix.Col)
Soderzhanie.Text = FGMatrix.Text
End Sub
Private Sub FGMatrix2_KeyPress(KeyAscii As Integer)
If FGMatrix2.Col <> N + 1 Then
If KeyAscii >= 48 And KeyAscii <= 57 Or KeyAscii = 45 Or KeyAscii = 46 Or KeyAscii = 44 Then
If KeyAscii = 46 Then KeyAscii = 44
FGMatrix2.Text = FGMatrix2.Text + Chr(KeyAscii)
ElseIf KeyAscii = 8 And Len(FGMatrix2.Text) > 0 Then
FGMatrix2.Text = Mid(FGMatrix2.Text, 1, Len(FGMatrix2.Text) - 1)
ElseIf KeyAscii = 13 And FGMatrix2.Row = N Then
FGMatrix2.Row = 1
ElseIf KeyAscii = 13 And FGMatrix2.Row <> N Then
FGMatrix2.Row = FGMatrix2.Row + 1
End If
End If
Polozhenie2.Caption = CStr(FGMatrix2.Row) + "x" + CStr(FGMatrix2.Col)
Soderzhanie2.Text = FGMatrix2.Text
End Sub

'размер матрицы
Private Sub UpDown1_Change()
N = CInt(Razmer.Text)
TabCreate
End Sub
'выбор ячейки
Private Sub FGMatrix_SelChange()
Polozhenie.Caption = CStr(FGMatrix.Row) + "x" + CStr(FGMatrix.Col)
Soderzhanie.Text = FGMatrix.Text
End Sub
Private Sub FGMatrix2_SelChange()
Polozhenie2.Caption = CStr(FGMatrix2.Row) + "x" + CStr(FGMatrix2.Col)
Soderzhanie2.Text = FGMatrix2.Text
End Sub
Private Sub Soderzhanie_KeyPress(KeyAscii As Integer)
If FGMatrix.Col <> (N) And FGMatrix.Col <> 0 And FGMatrix.Row <> 0 Then
If KeyAscii >= 48 And KeyAscii <= 58 Or KeyAscii = 45 Or KeyAscii = 46 Or KeyAscii = 44 Or KeyAscii = 8 Then
If KeyAscii = 46 Then KeyAscii = 44
Else
KeyAscii = 0
End If
End If
End Sub
Private Sub Soderzhanie_Change()
If FGMatrix.Col <> N And FGMatrix.Col <> 0 And FGMatrix.Row <> 0 Then
FGMatrix.Text = Soderzhanie.Text
End If
End Sub
Private Sub Soderzhanie2_KeyPress(KeyAscii As Integer)
If FGMatrix2.Col <> (N) And FGMatrix2.Col <> 0 And FGMatrix2.Row <> 0 Then
If KeyAscii >= 48 And KeyAscii <= 58 Or KeyAscii = 45 Or KeyAscii = 46 Or KeyAscii = 44 Or KeyAscii = 8 Then
If KeyAscii = 46 Then KeyAscii = 44
Else
KeyAscii = 0
End If
End If
End Sub
Private Sub Soderzhanie2_Change()
If FGMatrix2.Col <> N And FGMatrix2.Col <> 0 And FGMatrix2.Row <> 0 Then
FGMatrix2.Text = Soderzhanie2.Text
End If
End Sub

Private Sub Matrix_Load()
N = 1
TabCreate
End Sub
Программа не присваивает значения табличек FGMatrix, FGmatrix2, FGMatrix3 матрицам Matrix,Matrix2,Matrix3
Вот форма:


Помогите дописать чтобы значение определителя выводилось в Textbox(Text1), а результат суммы, умножения и транспонирования в 3ью табличку FGMatrix3

У меня есть умножение, транспонирование и сложение только на си:
умножение:
C++:
// умножение двух матриц
double umnozhenie()
{

Matrix3=new double*[N];	 
for (int i=0; i<N; i++)
{					
Matrix3[i]=new double[N];
for (int j=0; j<N; j++)
{
Matrix3[i][j]=0;
for(int k=0;k<N;k++)
Matrix3[i][j] +=Matrix[i][k]*Matrix2[k][j];
}
}


return 0;
}
Сложение:
C++:
// сложение двух матриц
double slozhenie()
{

Matrix3=new double*[N];
for (int i=0; i<N; i++)
{
Matrix3[i]=new double[N];
for (int j=0; j<N; j++)
{
Matrix3[i][j] = Matrix[i][j] + Matrix2[i][j];
cout<<Matrix3[i][j]<<"\t";
}
cout<<endl;
}

return 0;
}
Транспонирование:
C++:
//транспонирование
double transpon()
{
Matrix3=new double*[N];
for (int i=0; i<N; i++)
{
Matrix3[i]=new double[N];
for (int j=0; j<N; j++)
{
Matrix3[i][j] = Matrix[j][i];
cout<<Matrix3[i][j]<<"\t";
}
cout<<endl;
}

return 0;
}
 
A

androE51

Гость
#2
Парни помогите что означает: 3Public N_correct As Boolean
 

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#3
описание глобальное переменной N_correct типа Boolean (принимает значения True или False)
Подробнее?
3 - хз, если не опечатка, то скорее всего, просто номер строки =)
Public - служебное слово для описания глобальной переменной (используется также для ф-ции, процедуры...)
N_correct - идентификатор (имя переменной)
As - служебное слово для описания типа переменной
Boolean - имя типа