Воскресенье, 2025-02-02

Professor VB - примеры на VB.net и C#
Меню сайта
Вход на сайт
Категории раздела
Уроки VB.net [25]
VB.net и математика [13]
Random VB [4]
VB.net - разное [7]
VB.net - Примеры программ [2]
Главная » Статьи » VB.net » Уроки VB.net

VB.net - Урок 5 - Массивы

VB.net - Урок 5 - Массивы 



(создание, сортировка пузырьком, перемешивание, поиск)  

  При работе с массивами программисты довольно часто сталкиваются с некоторыми проблемами. Например, приходится создавать свои алгоритмы поиска и сортировки элементов.
  С выходом новой платформы Microsoft .NET существенно увеличилась функциональность массивов. 


Правила объявления массивов.

Единственное существенное изменение - теперь нумерация элементов массива по умолчанию начинается с нуля. 

Dim a (11) As Date ' Одномерный массив, содержащий 12 элементов
Dim b (9, 11) As Object ' Двухмерный массив размером 10*12 элементов
Dim c () As Integer ' Динамический массив

Dim a () As Integer = {1, 2, 3, 4, 5} ' Объявление с инициализацией

Dim b(,) As String = {{"аа", "аб"}, {"ба", "бб"}} ' Объявление с инициализацией многомерного массива

 

Создаем массив и заполняем его случайными значениями

( 1 строка на рисунке)


'textBox - txtRez

    Private Sub cmdOk_Click(sender As Object, e As EventArgs) Handles cmdOk.Click

        Dim mass(25)
        Dim max = mass.Length - 1
'размер массива -1
        Dim r As New Random    'переменная как новое случайное число

        ' --- создаем массив

        'очистка текстПоля
        txtRez.Text = ""
        'заполняем массив случайными числами и выводим в текст
        For i = 0 To 24
            mass(i) = r.Next(1, (max))  
            txtRez.Text += Str(mass(i)) 
        Next



Самый распространенный способ сортировки - метод пузырька.
В простонародие метод пузырька так же называют «Пузырьковой сортировкой».  Ну, суть сортировки методом пузырька вытекает из названия. Мы находим минимальный элемент (пузырек) в массиве и выставляем его первым элементом нашего массива (поднимаем на поверхность). Далее находим следующий минимальный элемент и так же его выставляем вслед за первым элементом. И так мы будет действовать до самого конца.

 

Его мы рассмотрим в ниже

сортировка по возрастанию
( 2 строка на рисунке)


        ' --- 1 to max ( продолжаем код)

        Dim u As Integer
        txtRez.Text += vbCrLf

        '' сортировка пузырьком
        For i = 0 To max - 1
            For j = 0 To max - 2
                If mass(j) > mass(j + 1) Then
                    u = mass(j)
                    mass(j) = mass(j + 1)
                    mass(j + 1) = u
                End If
            Next j
        Next i

        'вывод массива
        For i = 0 To max - 1
            txtRez.Text += Str(mass(i))
        Next i



сортировка по убыванию

( 3 строка на рисунке)


        ' --- max to 1 (продолжаем код)
        txtRez.Text += vbCrLf

        '' сортировка пузырьком
        For i = 0 To max - 1
            For j = 0 To max - 2
                If mass(j) < mass(j + 1) Then
' меняем знак и сортируем по убыванию
                    u = mass(j)
                    mass(j) = mass(j + 1)
                    mass(j + 1) = u
                End If
            Next j
        Next i

        'вывод массива
        For i = 0 To max - 1
            txtRez.Text += Str(mass(i))
        Next i


Перемешивание массива

( 4 строка на рисунке)

  Кроме сортировки массива, иногда бывает, необходимость перемешать значения массива. В отличии от заполнения массива случайными значениями - перемешивание использует только те значения, которые были в массиве изначально (причем только 1 раз).
Код ниже 


        ' --- random - перемешивание массива  (продолжаем код)
        Dim element1, element2, x, y     'для перемешивания массива
        txtRez.Text += vbCrLf
     
  'перемешивание 
        Randomize()
        For i = 0 To 10000
            x = Int(Rnd() * max)          
'Определили случайный элемент массива с номером х
            y = Int(Rnd() * max)            'Определили случайный элемент массива с номером y
            element1 = mass(x)           'Запомнили значение случайного х-элемента массива
            element2 = mass(y)           'Запомнили значение случайного y-элемента массива
            mass(y) = element1           'Присвоили случайному x элементу значение y элемента
            mass(x) = element2           'Присвоили случайному y элементу значение x элемента
        Next
        For i = 0 To max - 1
            txtRez.Text += Str(mass(i))
        Next


    End Sub 

Конец кода


 

 

   Кроме этих вариантов инициализации массивов, есть еще несколько способов:
Ввод значений вручную через  InputBox  

(для проверки введенных данных - отсортируем массив)

   

 


        'ввод вручную 

        txtRez.Text = ""
        Dim _in As String = InputBox("Введите последовательность целых чисел, разделенных ',':", "Сортировка 'пузырьком'")
        Dim _vals As List(Of Integer) = New List(Of Integer)

        'Формирование списка целых чисел по входной строке
        'и ловим исключения

        Try
            For Each _val As String In _in.Split(",")
                _vals.Add(System.Convert.ToInt32(_val))
            Next
        Catch ex As Exception
            MsgBox(ex.Message, Microsoft.VisualBasic.MsgBoxStyle.Critical, "Ошибка")
            Return
        End Try

        Dim _changed As Boolean = True
        Dim _sorted As Integer = 0

        While _changed
            _changed = False

            'сортировка
            For i As Integer = 0 To _vals.Count - 2 - _sorted Step 1
                If _vals(i) > _vals(i + 1) Then
                    Dim _val As Integer
                    _val = _vals(i + 1)
                    _vals(i + 1) = _vals(i)
                    _vals(i) = _val
                    _changed = True
                End If
            Next
            _sorted = _sorted + 1
        End While

        'Формирование выходной строки
        Dim _out As String = String.Empty
        For Each _val As Integer In _vals
            If (_out.Length > 0) Then
                _out = _out + ","
            End If
            _out = _out + _val.ToString
        Next
        'vbCrLf и Environment.NewLine - одно и тоже - переход на новую строку
        txtRez.Text += "Сортировка 'пузырьком'" + vbCrLf + "Отсортированная последовательность:" + Environment.NewLine + _out


 

- ввод массива из текстового поля

(каждое значение на новой строке)

 


      txtM.Text = ""
 
      'создаем переменную как новый лист с числами размера int
        Dim _vals As List(Of Integer) = New List(Of Integer)

        'каждая строка в txt преобразуется в int и добавляется в лист
        For Each _val As String In txt1.Lines
            _vals.Add(System.Convert.ToInt32(_val))
        Next

        'переменные
        Dim _changed As Boolean = True
        Dim _sorted As Integer = 0

        While _changed
            _changed = False

            'сортировка
            For i As Integer = 0 To _vals.Count - 2 - _sorted Step 1
                If _vals(i) > _vals(i + 1) Then
                    Dim _val As Integer
                    _val = _vals(i + 1)
                    _vals(i + 1) = _vals(i)
                    _vals(i) = _val
                    _changed = True
                End If
            Next
            _sorted = _sorted + 1
        End While

        'Формирование выходной строки
        Dim _out As String = String.Empty
        For Each _val As Integer In _vals
            If (_out.Length > 0) Then
                _out = _out + ","
            End If

            _out = _out + _val.ToString
        Next

        txtM.Text += "Сортировка 'пузырьком'" + vbCrLf + "Отсортированная последовательность:" _
                     + Environment.NewLine + _out


Поиск элементов

   Класс Array предлагает два метода поиска элементов: простой и двоичный. 
Для простого поиска используются методы IndexOf и LastIndexOf. IndexOf ищет первое вхождение указанного объекта, а LastIndexOf - последнее

Public Shared Function
IndexOf(ByVal array As System.Array, ByVal value As Object) As Integer

Public Shared Function
IndexOf(ByVal array As System.Array, ByVal value As Object,
        ByVal startIndex As Integer) As Integer

Public Shared Function
IndexOf(ByVal array As System.Array, ByVal value As Object,
        ByVal startIndex As Integer, ByVal count As Integer) As Integer

  Первый вариант служит для поиска первого появления искомого элемента в целом массиве, второй - для поиска элементов в части массива, начиная с указанного индекса и до конца, третий - для поиска элемента в части массива, который начинается с указанного индекса и содержит в себе указанное число элементов.
  При использовании IndexOf и LastIndexOf программа в цикле проверяет все элементы массива и сравнивает их с искомым объектом. 
  Метод возвращает индекс найденного элемента, если поиск увенчался успехом или -1, если ничего не найдено. Все сказанное относится и к методу LastIndexOf. Для наглядности приведу примеры использования функций поиска:


Dim a() As String = {"a", "b", "c", "a", "b", "c"}
Console.WriteLine(System.Array.IndexOf(a, "b"))
Console.WriteLine(System.Array.IndexOf(a, "b", 2))
Console.WriteLine(System.Array.LastIndexOf(a, "b", 3, 3))

  Двоичный поиск работает несколько иначе. Он значительно быстрее простого поиска, но может работать только с отсортированными массивами (о сортировке массивов речь пойдет позже). 
  Чтобы найти объект в массиве, BinarySearch сравнивает его с элементом, расположенным в середине массива. Если искомый объект оказывается меньше, значит он находится в первой половине массива, и во второй половине можно его не искать. А если искомый объект больше, то он располагается во второй половине массива. Далее процесс повторяется для той половины массива, в которой находится объект.

  Если объект найден, то метод BinarySearch вернет индекс элемента массива. А если искомый объект не найден, то метод вернёт отрицательное число. Если дополнить его до -1 (изменить знак и вычесть 1), то получится индекс первого из тех элементов массива, которые больше искомого объекта. Если все элементы массива меньше искомого, то получится индекс большего из них. Ниже приведен пример использования метода BinarySearch:

Dim a() As String = {"a", "b", "c", "e", "f"} 
Dim ind As Integer 
ind = System.Array.BinarySearch(a, "d") 
If ind >= 0 Then 
    Console.WriteLine("Элемент найден: " & ind.ToString) 
Else 
    Console.WriteLine("Найдено ближайшее соответствие: " & (-ind - 1).ToString) 
End If


  Другая полезная возможность, которую предоставляет класс System.Array - сортировка массива. Она производится с помощью метода Sort. Он также перегружен. Самый простой вариант его применения выглядит так:

Array.Sort(массив, начЭлем, конЭлем)

Public Shared Sub Sort(ByVal array As System.Array)
Он сортирует весь массив. Если вы хотите отсортировать только часть массива, то к параметру array следует добавить индекс начального элемента и длину области, которую вы хотите отсортировать. Sort, в отличие от методов рассмотренных ранее, ничего не возвращает. Ниже приведен пример сортировки части массива.
Dim a() As String = {"c", "r", "z", "b", "d", "a"} 
System.Array.Sort(a, 2, 4)


  У метода Sort есть ещё одна интересная разновидность, позволяющая сортировать элементы одного массива в соответствии со значениями элементов другого массива.


Public Shared Sub Sort(ByVal keys As System.Array, ByVal items As System.Array)


  В первом параметре задаётся массив ключей. На основе элементов этого массива будет отсортирован массив, передаваемый во втором параметре. Допустим, у нас имеется массив со словами (words) и массив, в котором для каждого слова указана частота его употребления в тексте (freq). Используя первую форму метода Sort можно отсортировать слова по алфавиту. А с помощью последней рассмотренной формы метода мы можем отсортировать слова по частоте их использования. Для этого нужно первым параметром указать массив freq, а вторым - words.


System.Array.Sort (freq, words)


Такая сортировка имеет смысл, если длины массивов равны. 

 

Смотреть видео

 

END

 



Категория: Уроки VB.net | Добавил: ProfessorVB (2015-11-20)
Просмотров: 3959 | Теги: пузырек, массив, Vb.net, перемешивание, поиск, Уроки, Сортировка | Рейтинг: 3.7/3
Всего комментариев: 0
avatar
Облако тегов
Поиск
Друзья сайта
  • www.youtube.com

  • vk.com/professorvb

  • Партнерка AIR

  • Партнерка VSP Group
  • Поделись с друзьям
    Теги
    Видео Switch массивы уравнения геометрия continue forEach while Обработка событий задать цвет C# math Vb.net xml количество элементов xml поиск значений математика видеоуроки Soft системы Google pirat Proxy tor НОД нок добавление записи в xml поиск Уроки генератор hello world время деструкторы конструкторы дроби калькулятор десятичные дроби решебник сокращение дробей си шарп мнемоника тренажер random количество дней между датами professorvb дата Урок mindgames алгебра многомерные слова словарь Пароль cos SIN база timer рандом Цикл Break DO for RGB условия массив элементов xml редактирование xml создание вирус MenuStrip AntiCenz fri-gate запрещенные сайты база данных Open RichTextBox XML удалить из xml save TopMost анекдот создать XML Классы Тест OpenFileDialog английский развитие иностранные слова DateTimePicker календарь массив перемешивание массива Анаграммы Рифмоплет Сравнение дробей Меморина скорочтение Использование ребусы комплексные числа программа генератор имен
    Copyright ProfessorVB © 2025