Автор Тема: VBA: Определить количество инверсий в последовательности.  (Прочитано 947 раз)

Оффлайн Администратор

  • Administrator
  • Сообщений: 1547
Задание

Дана последовательность из 20 целых чисел. Определить количество инверсий в этой последовательности (т.е. таких пар элементов, в которых большее число находится слева от меньшего: xi>xj, i<j).

Решение

Пример работает с программой "Excel". Запишите на активный лист, в диапазон A1:A20 двадцать целых чисел. Макрос будет брать эти числа.

Макрос:
Sub Main()
   
    ' Создание в оперативной памяти компьютера области - массива "arr".
        ' Массив можно мысленно представить как обычную таблицу, состоящую из строк и столбцов.
        ' В данной задаче массив представляет собой таблицу, состоящую из одной строки и двадцати столбцов.
        ' В данной задаче массив - это последовательность двадцати чисел.
        ' Массивы нужны, чтобы в них что-нибудь записывать.
        ' Long означает, что в массиве могут быть только целые числа (бывают ещё дробные числа).
    Dim arr() As Long
    ' Создание в оперативной памяти компьютера области - переменной "lngCount".
        ' Переменную можно сравнить с обычным файлом, но переменная находится
        ' в оперативной памяти компьютера, а файл - на жёстком диске компьютера.
        ' Переменные нужны, чтобы в них что-нибудь записывать.
    Dim lngCount As Long, i As Long
   
   
    '1. Создание двадцать элементов (другими словами - ячеек) в массиве "arr".
    ' "1 To" означает, что порядковый номер первого элемента будет 1.
        ' Если это не указывать, то по умолчанию будет 0, что неудобно.
    ReDim arr(1 To 20)
   
    '2. Запись в массив целых чисел из активного эксель-листа, из столбца A.
    ' For ... To ... Step ... Next - называется "цикл". Цикл используется
        ' чтобы делать одну команду несколько раз.
    ' UBound(arr) - это порядковый номер последнего элемента массива.
        ' То есть можно сказать, что это кол-во элементов в массиве.
    For i = 1 To UBound(arr) Step 1
        arr(i) = Cells(i, "A").Value
    Next i
   
    '3. Задание: Определить количество инверсий в этой последовательности.
    ' Макрос двигается по всем элементам массива, кроме последнего.
    For i = 1 To UBound(arr) - 1 Step 1
        ' If ... Then ... End If - используется, чтобы выбирать, какое сделать действие.
        ' Если текущий элемент массива больше элемента, который находится справа.
        If arr(i) > arr(i + 1) Then
            ' Подсчёт инверсий. В переменную "lngCount" записывается число, которое уже
                ' есть в переменной "lngCount" плюс ещё прибавляется число 1.
            lngCount = lngCount + 1
        End If
    Next i
   
    '4. Вывод результата на монитор.
    ' MsgBox выводит на монитор сообщение.
    ' Символ "&" используется, чтобы соединить фрагменты текста в один фрагмент.
    MsgBox "В последовательности кол-во инверсий: " & lngCount
   
End Sub