Лекция № 9. With инструкциясы
1. With инструкциясы
2. 1-мисал. Векторду борборлоштуруу
3. 2-мисал. Матрицанын эң чоң элементи
With инструкциясы
With инструкциясы инструкция иреттелиши үчүн объектти көрсөтүү мүмкүнчүлүгүн берет. With инструкциясы процедуралардын аткарылуусун тездетет жана объекттин ысымын кайталап берүүсүнүн алдын алат.
With Button1
.Text = “Эсептөө”
.Tag = “От”
.Visible = False
End With
With инструкциясын колдонуусуз бул программаны төмөнкү жол менен жазуу керек болот:
Button1.Text = “Эсептөө”
Button1.Tag = “От”
Button1.Visible = False
Программанын эффектүүлүгүн жогорулатуу үчүн With кийирилген инструкцияларын түзүүгө болот.
1-мисал. Векторду борборлоштуруу
Эки вектор берилген a(1), a(2), … , a(k) жана b(1), b(2), … , b(l). Эгер а векторунун элементтеринин орточо мааниси b векторунун элементтеринин орточо маанисинен кичине болсо, анда а векторун борборлоштуруу жана чыгаруу. Болбосо b векторун борборлоштуруу жана чыгаруу керек. Ар бир борборлоштурулган массивдин элементи, башкы массивдин тиешелүү элементинин маанисинин жана анын элементтеринин орточо маанисин айырмасы катары болот.
Подпрограммалар тизмеси:
х векторун кийирүү. Подпрограмманы колдонобуз:
Sub InputVector(ByRef x() As Single, Optional _ ByVal ArrayName As String = "элемент")
Экинчи аргумент сөзсүз түрдөгү эмес. Бул кийирилүүчү массивдин ысымы болгон, тексттик жолчо. Бул аргумент массивди кийирүүнү, InputBox функция терезесинде кийирилүүчү массивдин атын көрсөтүү аркылуу, түшүнүктүү кылат.
Эгер экинчи аргументти, подпрограммага кайрылууда алып койсок, анда массивдин атынын ордуна «элемент»: (элемент(5) = ?) жолчосу чыгарылат.
x вектору үчүн анын элементтеринин орточо маанисин эсептөө. Функцияны колдонобуз.
Function Орточо(ByVal x() As Single) As Single
X векторун борборлоштуруу. Подпрограмманы колдонобуз:
Sub ВектордуБорборлоштуруу(ByRef x()As Single)
X векторун чыгаруу. Подпрограмманы колдонобуз:
Sub OutputVector(ByRef x() As Single, _ ByVal y As TextBox)
Экинчи аргумент, чыгаруу аткарылуучу, тексттик терезе үчүн керек.
Проекттин интерфейси:
Формада Button1 баскычын жана TextBox1 тексттик талаасын жайгаштырабыз. Төмөнкү таблицада берилгендей касиеттердин маанилерин беребиз.
Объекттердин касиеттеринин таблицасы:
| Касиеттин аты | Касиеттин мааниси |
| Button1 баскычы |
| Name (объект аты) | btnБаштоо |
| Text (баскычтагы текстти берет) | Вычислить |
| Font (баскычтагы шрифттин параметрлерин берет) | Microsoft Sans Serif; 12pt |
| Anchor | Bottom, Left, Right (төмөнкү, сол, оң) |
| TextBox1 тексттик талаасы |
| Name (объекттин аты) | txtЖурнал |
| MultiLine (тексттик талаада бир нече жолчону жайгаштырууга мүмкүнчүлүк берет) | True |
| Text (тексттик талаада текстти берет) | Бош |
| ScrollBars (жылдыруунун вертикалдуу сызыгын берет) | Both (экоо тең) |
| Font (тексттик талаада шрифттин параметрлерин берет) | Microsoft Sans Serif; 12pt |
| Anchor (байланыштырат) | Top, Bottom, Left, Right (жогорку, төмөнкү, сол, оң) |
| ReadOnly (аткарууда тексттик талааны редактирлөө мүмкүнчүлүгүн бербейт) | True |
Объекттердин аталыштарын өзгөртүү сунуштарды аткарууда ыңгайлуу, объекттин аты кыска жана анын классын жана дайындалышын көрсөтүп турат. Буга объекттин аталышын эки бөлүктөн түзүү аркылуу жетилет. Ысымынын биринчи бөлүгү, ал таандык болгон классты билдирет. Ал эми экинчиси анын дайындалышын билдирет. Объект үчүн класс бул өзгөрүлмө үчүн тип болгондой сыяктуу эле.
Программанын коду
Листинг 1. btnБаштоо_Click окуялуу подпрограмманын коду
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnБаштоо.Click
Dim k, l As Integer
Dim a(), b() As Single
txtЖурнал.Clear()
k = InputBox("k=?")
l = InputBox("l=?")
txtЖурнал.AppendText("k= " & k & vbTab & " l= " & l & vbCrLf)
ReDim a(k), b(l)
InputVector(a, "a")
txtЖурнал.AppendText("Вектор а" & vbCrLf)
OutputVector(a, txtЖурнал)
InputVector(b, "b")
txtЖурнал.AppendText("Вектор b" & vbCrLf)
OutputVector(b, txtЖурнал)
Dim ОрточоА, ОрточоВ As Single
ОрточоА = Орточо(a)
ОрточоВ = Орточо(b)
If ОрточоА Then
ВектордуБорборлоштуруу(a)
txtЖурнал.AppendText("Борборлоштурулган вектор а" & vbCrLf)
OutputVector(a, txtЖурнал)
Else
ВектордуБорборлоштуруу(b)
txtЖурнал.AppendText("Борборлоштурулган вектор b" & vbCrLf)
OutputVector(b, txtЖурнал)
End If
End Sub
Листинг 2 Орточо функциясынын коду
Private Function Орточо(ByVal x() As _ Single) As Single
Dim sum As Single, i As Integer
For i = 1 To x.GetUpperBound(0)
sum = sum + x(i)
Next
Орточо = sum / x.GetUpperBound(0)
End Function
Бул функция, диапозону [1, максималдуу маани] ге таандык индекстүү вектордун бардык элементтеринин орточо арифметикалык маанисин эсептөө үчүн арналган. Мында x(0) вектордун элементинин мааниси эске алынбайт.
GetUpperBound(0) методу x векторунун индексинин максималдуу маанисин кайтарат. Бул методдун аргументи массивдин өлчөмдүүлүгүн берет. Көп өлчөмдүү масиивдердин өлчөмдөрү нолдон баштап номерленет.
Листинг 3 ВектордуБорборлоштуруу подпрограммасынын коду
Private Sub ВектордуБорборлоштуруу(ByRef _ x() As Single)
Dim i As Integer, sx As Single
sx = Орточо(x)
For I = 1 To x.GetUpperBound(0)
x(i) = x(i) – sx
Next
End Sub
Бул подрограммада x векторунун x(0)дон башка бардык элементтери борборлоштурулат.
Листинг 4 InputVectorподпрограммасынын коду
Private Sub InputVector(ByRef x() As Single, Optional ByVal ArrayName As String =_ "элемент")
Dim i As Integer
For i = 1 To x.GetUpperBound(0)
x(i) = InputBox(ArrayName & "(" & i & ") = ?")
Next
End Sub
Бул подпрограмма x массивинин x(0)дон башка бардык элементтеринин кийирилүүсүн камсыздайт.
Листинг 5 OutputVector подпрограммасынын коду
Private Sub OutputVector(ByVal x() As_Single, ByVal y As TextBox)
Dim i As Integer
For i = 1 To x.GetUpperBound(0)
y.AppendText(x(i) & vbTab)
Next
y.AppendText(vbCrLf)
End Sub
Бул подпрограмма x массивинин x(0) элементинен башка бардык элементтеринин чыгарылуусун камсыздайт.
2-мисал. Матрицанын эң чон элементи
кa жолчолуу жана la мамычалуу а матрицисы, ошондой эле кb жолчолуу жана lb мамычалуу b матрицасы берилген.
Бул матрицалардын максималдуу сандагы элементтеринен эң чоң маанисин табуу. Максималдуу элементи эң чоң болгон матрицаны чыгаруу.
Маселелердин тизмеси
x матрицасын кийирүү. Подпрограмманы колдонобуз:
Sub InputMatrix(ByRef x(,) As Single, Optional _ ByVal ArrayName As String = "элемент")
Бул подпрограмманын эки аргументи бар. Биринчи аргументи – кийирүүгө таандык, матрицанын ысымы. Экинчи сөзсүз эмес аргумент – кийирилүү матрицанын ысымы болгон, жолчо. Бул аргумент InputBox функция терезесинде, кайсы матрицанын элементи кийирилүүгө таандык экендигин билдирип турат.
x матрицасынын максималдуу элементин аныктоо. Функцияны колдонобуз:
Function МаксМатр(ByVal x(,) As Single) As Single
x матрицасын чыгаруу. Төмөнкү подпрограмманы колдонобуз:
Sub OutputMatrix(ByRef x(,) As Single, _ ByVal y As TextBox)
Бул подпрограмманын эки аргументи бар. Биринчи аргумент – чыгарууга таандык болгон, матрицанын аты. Экинчи аргумент - матрицанын чыгарылуусу аткарыла турган тексттик талаанын ысымы.
x матрицасынын жолчолорунун саны imax жана мамычаларынын саны аргументтеринин тизмесини аркылуу МаксМатр функциясына берилбейт. Бул өзгөрмөлөрдүн МаксМатр функциясынын алгоритминде колдонулган мааниси GetUpperBound массив ыкмасынын жардамында эсептелет. Алгоритмдин негизи болуп матрицасынын бардык элементтеринин кыска циклда айландыруу жана МаксX өзгөрмөсүнүн жардамында, эгер ал мурун каралган элементтеринин маанисинин баарынан чоң болгон, кезектеги каралуучу x(i,j) элементин эстеп калуу.
Кодду иштеп чыгуу
Листинг 7. Проекттин коду
Public Class Form1
Private Sub btnБаштоо_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnБаштоо.Click
Dim ka, la, kb, lb, kc, lc As Integer
Dim a(,), b(,), c(,) As Single
txtЖурнал.Clear()
ka = InputBox("ka=?")
la = InputBox("la=?")
kb = InputBox("kb=?")
lb = InputBox("lb=?")
kc = InputBox("kc=?")
lc = InputBox("lc=?")
txtЖурнал.AppendText("ka= " & ka & vbTab & " la= " & la & vbCrLf)
txtЖурнал.AppendText("kb= " & ka & vbTab & " lb= " & la & vbCrLf)
txtЖурнал.AppendText("kc= " & ka & vbTab & " lc= " & la & vbCrLf)
ReDim a(ka, la), b(kb, lb), c(kc, lc)
InputMatrix(a, "a")
txtЖурнал.AppendText("Матрица а" & vbCrLf)
OutputMatrix(a, txtЖурнал)
InputMatrix(b, "b")
txtЖурнал.AppendText("Матрица b" & vbCrLf)
OutputMatrix(b, txtЖурнал)
InputMatrix(c, "c")
txtЖурнал.AppendText("Матрица c" & vbCrLf)
OutputMatrix(c, txtЖурнал)
Dim МаксА, МаксВ, МаксС As Single
МаксА = МаксМатр(a)
МаксВ = МаксМатр(b)
МаксС = МаксМатр(c)
Dim МаксАВС As Single
МаксАВС = МаксА
If МаксВ МаксАВС Then МаксАВС = МаксВ
If МаксС МаксАВС Then МаксАВС = МаксС
txtЖурнал.AppendText("Эң чоң элементи барабар" & vbTab & МаксАВС &_ vbCrLf)
If МаксАВС = МаксА Then txtЖурнал.AppendText("Эң чоң элемент камтыйт_ матрица a" & vbCrLf)
OutputMatrix(a, txtЖурнал)
ElseIf МаксАВС = МаксВ Then
txtЖурнал.AppendText(" Эң чоң элемент камтыйт матрица b" & vbCrLf)
OutputMatrix(b, txtЖурнал)
ElseIf МаксАВС = МаксС Then
txtЖурнал.AppendText(" Эң чоң элемент камтыйт матрица c" & vbCrLf)
OutputMatrix(c, txtЖурнал)
Eпd If
End Sub
Private Function МаксМатр(ByVal x(,) As Single) As Single
Dim i, j As Integer, МаксХ As Single
МаксХ = x(1, 1)
For i = 1 To x.GetUpperBound(0)
For j = 1 To x.GetUpperBound(1)
If x(i, j) МаксХ Then МаксХ = x(i, j)
Next
Next
МаксМатр = МаксХ
End Function
Private Sub InputMatrix(ByRef x(,) As Single, Optional ByVal ArrayName As String = "элемент")
Dim i, j As Integer
For i = 1 To x.GetUpperBound(0)
For j = 1 To x.GetUpperBound(1)
x(i, j) = InputBox(ArrayName & "(" & i & "," & j & ") = ?")
Next
Next
End Sub
Private Sub OutputMatrix(ByVal x(,) As Single, ByVal y As TextBox)
Dim i, j As Integer
For i = 1 To x.GetUpperBound(0)
For j = 1 To x.GetUpperBound(1)
y.AppendText(x(i, j) & vbTab)
Next
y.AppendText(vbCrLf)
Next
End Sub
End Class