VB_NET
.pdf4. Структуровані типи даних |
91 |
Дуже часто доводиться знаходити в одновимірному масиві індекс елемента, який збігається із заданим значенням (задача пошуку). Розрізняють задачі пошуку першого і/або останнього входження елемента, а також пошук усіх входжень елемента в масив. У мові VB.NET для реалізації пошуку найкраще скористатися методом IndexOf для об’єкта Array (див. табл. 4.2).
Приклад 4.21. Пошук в одновимірному масиві індексу першого входження елемента, який дорівнює x.
Module Module1 Sub main()
Dim a(), x As Single Dim n, i, k As Integer
Do : n = InputBox("Введіть n>0 і n<=20")
Loop Until n > 0 And n <= 20
ReDim a(n - 1) For i = 0 To n - 1
a(i) = InputBox("Введіть елемент масиву!") Console.Write(a(i) & " ") ' масив
Next i : Console.WriteLine()
x = InputBox("Введіть число", "Введення") i = 0 : k = -1
Do While i < n And k = -1 k = a.IndexOf(a, x) i = i + 1
Loop
If k <> –1 Then
MsgBox(" 1-e входження " & x & " з " & k & " індексом")
Else
MsgBox(" Не знайдено!")
End If
End Sub
End Module
Приклад 4.22. Пошук в одновимірному масиві індексу останнього входження елемента, який дорівнює x. Основний фрагмент програми
i = n - 1 : k = -1
Do While i >= 0 And k = -1
k = a.IndexOf(a, x, i) : i = i - 1
Loop
92 |
Програмування мовою Visual Basic.NET |
4.3.Матричні задачі
Устандартній матричній задачі може бути потрібно:
•отримати нову матрицю за певним правилом;
•знайти деяку величину, використовуючи елементи зазначеної матриці;
•перетворити матрицю певним чином;
•визначити, чи володіє матриця певною властивістю;
•виконати над матрицею (матрицями) певну операцію.
При реалізації матричних задач використовують вкладені цикли, які налічують всередині себе один або декілька інших циклів.
Приклад 4.23. Дано натуральне число n. a[i, j]i, j=1,..., n , для якої виконуються умови:
|
(i + j)2 , |
якщо i < |
|
|
якщо i = |
a[i, j] = 2, |
||
|
2i +5 j, |
якщо i > |
|
||
|
|
|
Отримати дійсну матрицю
j; j; j.
Індекс i позначає рядок квадратної матриці, а j – стовпець. Рівні індекси (i=j) мають елементи головної діагоналі. Умова i<j вказує на те, що елементи розташовані над головною діагоналлю, а i>j – елементи розташовані під головною діагоналлю.
Module Module1
Public Sub main()
Dim a(,) As Integer Dim i, j, n As Byte
Do : n = InputBox("Введіть n>0 і n<=20")
Loop Until n > 0 And n <= 20
ReDim a(n – 1, n – 1) For i = 0 To n – 1
a(i, i) = 2
Next i
For i = 0 To n - 2
For j = i + 1 To n – 1
a(i, j) = (i + j + 2) ^ 2
Next j Next i
For i = 1 To n – 1
4. Структуровані типи даних |
93 |
For j = 0 To i - 1
a(i, j) = 2 * (i + 1)+ 5 * (j + 1)
Next j
Next i
For i = 0 To n – 1
For j = 0 To n - 1
Console.Write(a(i, j) & " ")
Next j
Console.WriteLine()
Next i
Console.ReadLine()
End Sub
End Module
Приклад 4.24. Дано натуральне число n. Визначити, скільки додатних елементів містить матриця a[i, j]i, j=1,..., n , у якої a[i, j] = sin(i + j).
Шукане число можна знайти і без оголошення масиву, використовуючи тільки формулу, що задає вигляд елементів масиву.
Module Module1
Public Sub main()
Dim i, j, k, n As Byte
Do : n = InputBox("Введіть n>0 і n<=20")
Loop Until n > 0 And n <= 20 k =0
For i = 0 To n – 1 For j = 0 To n – 1
If sin(i + j + 2) > 0 Then k += 1
Next j Next i
MsgBox("k=" & k)
End Sub End Module
Приклад 4.25. Дано натуральне число n. Визначити суму тих елементів матриці a[i, j]i, j=1,..., n , які розташовано на головній діагоналі або над
нею, що перевищують усі елементи, розташовані під головною діагоналлю.
94 |
Програмування мовою Visual Basic.NET |
Серед елементів матриці, розташованих під головною діагоналлю, знайдемо найбільший елемент. Тоді елементи, які розташовані на головній діагоналі або над нею і є більшими за знайдений найбільший елемент, будуть задовольняти умові задачі.
Module Module1 Sub main()
Dim a(,), max, s As Single Dim i, j, n As Byte
Do : n = InputBox("Введіть n>0 і n<=20")
Loop Until n > 0 And n <= 20
ReDim a(n - 1, n - 1) For i = 0 To n - 1
For j = 0 To n - 1
a(i, j) = Rnd() * 10 Console.Write(a(i, j) & " ")
Next j Console.WriteLine()
Next i
max = a(1, 0)
For i = 2 To n - 1 ' визначення максимума
For j = 0 To i - 1
If a(i, j) > max Then max = a(i, j)
Next j Next i
s = 0
For i = 0 To n - 1 For j = i To n - 1
If a(i, j) > max Then s = s + a(i, j)
Next j Next i
MsgBox("s=" & s)
End Sub
End Module
Приклад 4.26. Дано натуральне число n і деяка квадратна матриця a[i, j]i, j=1,..., n . Перетворити цю матрицю так, щоб перший рядок помінявся місцями з останнім, другий – з передостаннім і т.д.
Module Module1
Sub main()
4. Структуровані типи даних |
95 |
Dim a(,), x As Integer Dim i, j, n As Byte
Do : n = InputBox("Введіть n>0 і n<=20")
Loop Until n > 0 And n <= 20
ReDim a(n - 1, n - 1) For i = 0 To n - 1
For j = 0 To n - 1 a(i, j) = i + j
Console.Write(a(i, j) & " ")
Next j Console.WriteLine()
Next i Console.WriteLine()
For i = 0 To (n - 1) \ 2
For j = 0 To n - 1
x = a(i, j) : a(i, j) = a(n - i - 1, j) a(n - i - 1, j) = x
Next j Next i
For i = 0 To n - 1 For j = 0 To n - 1
Console.Write(a(i, j) & " ")
Next j Console.WriteLine()
Next i Console.ReadLine()
End Sub End Module
Приклад 4.27. Написати фрагменти програм, які реалізують основні операції над матрицями: 1) додавання (віднімання) двох матриць; 2) множення матриці на скаляр; 3) множення двох матриць; 4) транспонування квадратної матриці.
1) Матриці, які беруть участь в операціях додавання (віднімання), повинні мати однакові розміри, адже ці операції виконуються поелементно.
For i = 0 To m – 1 For j = 0 To n – 1
c(i, j) = a(i, j) + b(i, j)
Next j Next i
96 |
Програмування мовою Visual Basic.NET |
Для визначення різниці матриць достатньо змінити “+” на “–”. 2) Множення матриці на скаляр також виконується поелементно:
For i = 0 To m – 1 For j = 0 To n – 1
c(i, j) = a(i, j) * р
Next j Next i
3) Матриці, які беруть участь в операції множення мають такі розміри:
m |
n |
n |
k |
m |
k |
|
A × |
|
B = |
|
C . Тоді будь-який елемент c (i =1...m; j =1...k) |
|
|
|
|
|
ij |
n
визначають за формулою cij = ∑ail blj :
l =1
For i = 0 To m – 1 For j = 0 To k – 1 s = 0
For l = 0 To n – 1
s = s + a(i, l) * b(l, j)
Next l c(i, j) = s
Next j Next i
4) Транспонування квадратної матриці полягає у заміні рядків матриці відповідними стовпцями, і навпаки (тобто елементи dij і d ji мають помі-
нятися місцями). Під час транспонування головна діагональ матриці залишається без змін, а обмін здійснюємо тільки для елементів, розташованих над цією діагоналлю (елементи під діагоналлю поміняються автоматично внаслідок симетрії).
For i = 0 To n - 2
For j = i+1 To n – 1
s = d(i, j)
d(i, j) = d(j, i)
d(j, i) = s
Next j
Next i
4. Структуровані типи даних |
97 |
4.4. Структури
Поруч з масивами, як сукупністю однотипних елементів, існує ще один структурований тип даних – структура, яка складається з декількох різнотипних елементів (або полів). Структури в літературі можна ще називати так:
•тип, визначений користувачем;
•власний тип даних;
•запис.
Синтаксис опису структури:
[Private | Public | Protected] Structure назва [Dim | Private | Public | Friend] Елемент1 As Тип
…
[Dim | Private | Public | Friend] [Елемент2 As Тип
End Sructure
Зауваження. Усередині структури можна використовувати масиви, а також попередньо описані структури.
Визначення структури можливе на рівні проекту або модуля у секції (General–Declarations). Визначивши структуру, можна використовувати її для оголошення змінних цього типу. Доступ до елементів змінної типу структури здійснюють шляхом позначення крапки після назви змінної.
Приклад 4.28. Уведення власного типу та його використання.
Module Module1
Structure Client Dim Name As String
Dim Adress As String
Dim Phone As Integer
End Structure Sub main()
Dim MyCl As Client MyCl.Name = "Перебендя Іван"
MyCl.Adress = "вул. С.Бандери, 7/45" MyCl.Phone = 789439
MsgBox(MyCl.Name & " " & MyCl.Adress & " " & MyCl.Phone)
End Sub
End Module
98 |
Програмування мовою Visual Basic.NET |
4.5. Перерахування
Перерахування (enumerations) – зручний спосіб роботи із взаємозв’язаними константами, що дає змогу асоціювати їхні значення із зрозумілими назвами. Синтаксис:
[{Public | Protected | Friend | Protected Friend | Private }] [ Shadows ]
Enum name [ As type] MemberName_l [ = Expression_l ] MemberName_2 [ = Expression_2 ]
…
MemberName_n [ = Expression_n ]
End Enum
•name – назва перерахування;
•MemberName – назва константи. За домовленістю значення першої константи дорівнює 0, другої 1 і т.д. Через параметр Expression константам можна призначати довільні значення.
Визначення перерахування можливе на рівні проекту або модуля у секції (General–Declarations). Визначивши перерахування, можна використовувати його для оголошення змінних цього типу. Доступ до констант змінної-перерахування здійснюють шляхом позначення крапки після назви змінної.
Приклад 4.29. Уведення перерахування та його використання.
Module Module1
Enum SecurityLevel
Normal = 0 : MinSecurity = -1 : MaxSecurity = 1
End Enum Sub main()
Dim n As SecurityLevel
n = SecurityLevel.MaxSecurity
If n = SecurityLevel.MinSecurity Then
MsgBox("Мінімальний")
ElseIf n = SecurityLevel.MaxSecurity Then
MsgBox("Максимальний")
Else : MsgBox("Нормальний")
End If End Sub
End Module
4. Структуровані типи даних |
99 |
Запитання для самоперевірки
1.Що таке масив?
2.Яка різниця між статичним і динамічним масивом?
3.Як описують одновимірний масив?
4.Як описують багатовимірний масив?
5.Опишіть основні методи класу Array?
6.Напишіть фрагмент програми множення матриць.
7.Напишіть фрагмент програми транспонування матриці.
8.Що таке структура? Як описують структуру?
9.Що таке перерахування?
Завдання для програмування
Завдання 4.1. Дано натуральне число n і дійсні числа а1, а2,..., аn. Скласти програми розв’язання таких задач (у задачах 1-5 передбачити опрацювання ситуації відсутності від’ємних елементів):
1.Знайти добуток елементів масиву, розташованих після останнього ві- д’ємного числа.
2.Знайти середнє арифметичне елементів масиву, розташованих після останнього від’ємного числа.
3.Замінити всі елементи, розташованих перед першим від’ємним числом, на число 2.
4.Замінити всі елементи, розташованих після останнього від’ємного числа, на число 10.
5.Знайти середнє арифметичне елементів масиву, розташованих між першим та останнім від’ємним числом.
6.Замінити всі від’ємні числа на їхні квадрати і впорядкувати після цього масив за незростанням.
7.Замінити всі від’ємні числа на їхні модулі і впорядкувати після цього масив за незростанням.
8.Знайти добуток елементів масиву, розташованих після останнього входження найменшого числа.
9.Знайти суму елементів масиву, розташованих перед останнім вхо дженням найменшого числа.
10.Знайти середнє арифметичне елементів масиву, розташованих після останнього входження найбільшого числа.
100 |
Програмування мовою Visual Basic.NET |
11.Знайти добуток елементів масиву, розташованих перед останнім входженням найбільшого числа.
12.Знайти середнє арифметичне елементів масиву, розташованих між останніми входженнями найбільшого та найменшого числа.
13.Знайти суму елементів масиву, розташованих між першими входженнями найбільшого та найменшого чисел.
14.Замінити всі додатні числа на їхні квадрати і впорядкувати після цього масив за незростанням.
15.Замінити всі нульові числа на число 3 і впорядкувати після цього масив за незростанням.
Завдання 4.2. Дано цілочисельну прямокутну матриця. Скласти програми розв’язання наступних задач:
1.Визначити кількість рядків, які не містять нулів.
2.Визначити кількість стовпців, які не містять нулів.
3.Визначити кількість стовпців, які містять хоча б один нуль.
4.Визначити кількість рядків, які містять хоча б один нуль.
5.Визначити добуток елементів у кожному рядку, що не містить нуля.
6.Визначити добуток елементів у кожному стовпці, що не містить нуля.
7.Визначити суму елементів у кожному рядку, що не містить від’ємних чисел.
8.Визначити суму елементів у кожному стовпці, що не містить від’ємних чисел.
9.Визначити середнє арифметичне елементів у кожному рядку, який містить хоча б один нуль.
10.Визначити середнє арифметичне елементів у кожному стовпці, який містить хоча б один нуль.
11.Визначити суму елементів у кожному рядку, який містить хоча б одне від’ємне число.
12.Визначити суму елементів у кожному стовпці, який містить хоча б одне від’ємне число.
13.Визначити номер першого з рядків, що не містить від’ємних чисел.
14.Визначити номер останнього з рядків, що не містить від’ємних чисел.
15.Визначити номер останнього зі стовпців, що не містить нуля.